aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-10-13 18:53:33 +0200
committerMax Kellermann <max@duempel.org>2009-10-13 18:53:33 +0200
commita93ffdd1bed1885740f0a28bc649a9db9a7969e4 (patch)
tree855c12d75f8bc7df21ff7438594de9ae1657ac13 /src
parent319149254d220861c76922be1f2fa8d00722da92 (diff)
downloadmpd-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 'src')
-rw-r--r--src/command.c5
-rw-r--r--src/playlist_queue.c94
-rw-r--r--src/playlist_queue.h48
3 files changed, 147 insertions, 0 deletions
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
+