diff options
author | Max Kellermann <max@duempel.org> | 2009-10-13 18:53:33 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-10-13 18:53:33 +0200 |
commit | a93ffdd1bed1885740f0a28bc649a9db9a7969e4 (patch) | |
tree | 855c12d75f8bc7df21ff7438594de9ae1657ac13 | |
parent | 319149254d220861c76922be1f2fa8d00722da92 (diff) | |
download | mpd-a93ffdd1bed1885740f0a28bc649a9db9a7969e4.tar.gz mpd-a93ffdd1bed1885740f0a28bc649a9db9a7969e4.tar.xz mpd-a93ffdd1bed1885740f0a28bc649a9db9a7969e4.zip |
command: "load" supports remote playlists (m3u, xspf, lastfm://)
This patch integrates the playlist plugin API to the MPD core. We'll
be able to do much more in the future with that API, that's just the
beginning.
Diffstat (limited to '')
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | src/command.c | 5 | ||||
-rw-r--r-- | src/playlist_queue.c | 94 | ||||
-rw-r--r-- | src/playlist_queue.h | 48 |
5 files changed, 150 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index 03f0da990..c9bc70595 100644 --- a/Makefile.am +++ b/Makefile.am @@ -138,6 +138,7 @@ mpd_headers = \ src/playlist_state.h \ src/playlist_plugin.h \ src/playlist_list.h \ + src/playlist_queue.h \ src/playlist/m3u_playlist_plugin.h \ src/playlist/xspf_playlist_plugin.h \ src/playlist/lastfm_playlist_plugin.h \ @@ -260,6 +261,7 @@ src_mpd_SOURCES = \ src/playlist_print.c \ src/playlist_save.c \ src/playlist_state.c \ + src/playlist_queue.c \ src/queue.c \ src/queue_print.c \ src/queue_save.c \ @@ -7,6 +7,7 @@ ver 0.16 (20??/??/??) - range support for "delete" - "previous" really plays the previous song - "addid" with negative position is deprecated + - "load" supports remote playlists (m3u, xspf, lastfm://) * input: - lastfm: use metadata * tags: diff --git a/src/command.c b/src/command.c index 1829f360a..9a34093b6 100644 --- a/src/command.c +++ b/src/command.c @@ -22,6 +22,7 @@ #include "playlist.h" #include "playlist_print.h" #include "playlist_save.h" +#include "playlist_queue.h" #include "queue_print.h" #include "ls.h" #include "uri.h" @@ -707,6 +708,10 @@ handle_load(struct client *client, G_GNUC_UNUSED int argc, char *argv[]) { enum playlist_result result; + result = playlist_open_into_queue(argv[1], &g_playlist); + if (result != PLAYLIST_RESULT_NO_SUCH_LIST) + return result; + result = playlist_load_spl(&g_playlist, argv[1]); return print_playlist_result(client, result); } diff --git a/src/playlist_queue.c b/src/playlist_queue.c new file mode 100644 index 000000000..f31eb9f42 --- /dev/null +++ b/src/playlist_queue.c @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2003-2009 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "playlist_queue.h" +#include "playlist_list.h" +#include "playlist_plugin.h" +#include "song.h" +#include "uri.h" +#include "ls.h" +#include "input_stream.h" + +/** + * Determins if it's allowed to add this song to the playlist. For + * safety reasons, we disallow local files. + */ +static inline bool +accept_song(const struct song *song) +{ + return !song_is_file(song) && uri_has_scheme(song->uri) && + uri_supported_scheme(song->uri); +} + +enum playlist_result +playlist_load_into_queue(struct playlist_provider *source, + struct playlist *dest) +{ + enum playlist_result result; + struct song *song; + + while ((song = playlist_plugin_read(source)) != NULL) { + if (!accept_song(song)) { + song_free(song); + continue; + } + + result = playlist_append_song(dest, song, NULL); + if (result != PLAYLIST_RESULT_SUCCESS) { + song_free(song); + return result; + } + } + + return PLAYLIST_RESULT_SUCCESS; +} + +enum playlist_result +playlist_open_into_queue(const char *uri, struct playlist *dest) +{ + struct playlist_provider *playlist; + bool stream = false; + struct input_stream is; + enum playlist_result result; + + if (!uri_has_scheme(uri)) + /* don't allow local playlist files for now */ + return PLAYLIST_RESULT_NO_SUCH_LIST; + + playlist = playlist_list_open_uri(uri); + if (playlist == NULL) { + stream = input_stream_open(&is, uri); + if (!stream) + return PLAYLIST_RESULT_NO_SUCH_LIST; + + playlist = playlist_list_open_stream(&is, uri); + if (playlist == NULL) { + input_stream_close(&is); + return PLAYLIST_RESULT_NO_SUCH_LIST; + } + } + + result = playlist_load_into_queue(playlist, dest); + playlist_plugin_close(playlist); + + if (stream) + input_stream_close(&is); + + return result; +} diff --git a/src/playlist_queue.h b/src/playlist_queue.h new file mode 100644 index 000000000..b571cd63a --- /dev/null +++ b/src/playlist_queue.h @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2003-2009 The Music Player Daemon Project + * http://www.musicpd.org + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +/*! \file + * \brief Glue between playlist plugin and the play queue + */ + +#ifndef MPD_PLAYLIST_QUEUE_H +#define MPD_PLAYLIST_QUEUE_H + +#include "playlist.h" + +struct playlist_provider; +struct playlist; + +/** + * Loads the contents of a playlist and append it to the specified + * play queue. + */ +enum playlist_result +playlist_load_into_queue(struct playlist_provider *source, + struct playlist *dest); + +/** + * Opens a playlist with a playlist plugin and append to the specified + * play queue. + */ +enum playlist_result +playlist_open_into_queue(const char *uri, struct playlist *dest); + +#endif + |