diff options
author | Max Kellermann <max@duempel.org> | 2010-06-25 22:43:35 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2010-06-25 22:43:52 +0200 |
commit | c27fc26ecd7312d6a1678990838d4c457986e161 (patch) | |
tree | 913abd7359294267e03801d6faab46ec94d1a19b /src | |
parent | fba13bd5d218f0fd73d2f4017302aef9d075b35c (diff) | |
download | mpd-c27fc26ecd7312d6a1678990838d4c457986e161.tar.gz mpd-c27fc26ecd7312d6a1678990838d4c457986e161.tar.xz mpd-c27fc26ecd7312d6a1678990838d4c457986e161.zip |
playlist_list: probe plugin without MIME attributes
If the MIME type of a stream contains a semicolon, remove it and the
text after it to probe for a playlist plugin.
Diffstat (limited to '')
-rw-r--r-- | src/playlist_list.c | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/playlist_list.c b/src/playlist_list.c index 35c04d533..9c40e6dfe 100644 --- a/src/playlist_list.c +++ b/src/playlist_list.c @@ -190,12 +190,12 @@ playlist_list_open_uri(const char *uri) } static struct playlist_provider * -playlist_list_open_stream_mime(struct input_stream *is) +playlist_list_open_stream_mime2(struct input_stream *is, const char *mime) { struct playlist_provider *playlist; assert(is != NULL); - assert(is->mime != NULL); + assert(mime != NULL); for (unsigned i = 0; playlist_plugins[i] != NULL; ++i) { const struct playlist_plugin *plugin = playlist_plugins[i]; @@ -203,7 +203,7 @@ playlist_list_open_stream_mime(struct input_stream *is) if (playlist_plugins_enabled[i] && plugin->open_stream != NULL && plugin->mime_types != NULL && - string_array_contains(plugin->mime_types, is->mime)) { + string_array_contains(plugin->mime_types, mime)) { /* rewind the stream, so each plugin gets a fresh start */ input_stream_seek(is, 0, SEEK_SET, NULL); @@ -218,6 +218,26 @@ playlist_list_open_stream_mime(struct input_stream *is) } static struct playlist_provider * +playlist_list_open_stream_mime(struct input_stream *is) +{ + assert(is->mime != NULL); + + const char *semicolon = strchr(is->mime, ';'); + if (semicolon == NULL) + return playlist_list_open_stream_mime2(is, is->mime); + + if (semicolon == is->mime) + return NULL; + + /* probe only the portion before the semicolon*/ + char *mime = g_strndup(is->mime, semicolon - is->mime); + struct playlist_provider *playlist = + playlist_list_open_stream_mime2(is, mime); + g_free(mime); + return playlist; +} + +static struct playlist_provider * playlist_list_open_stream_suffix(struct input_stream *is, const char *suffix) { struct playlist_provider *playlist; |