For spotify playlists or tracks. Uses a spt uri, so with mpc you can
add playlists with

  mpc load spt://spotify:user:simon.kagstrom:playlist:3SUwkOe5VbVHysZcidEZtH
---
 src/playlist/despotify_playlist_plugin.c |  216 ++++++++++++++++++++++++++++++
 src/playlist/despotify_playlist_plugin.h |   25 ++++
 src/playlist_list.c                      |    4 +
 3 files changed, 245 insertions(+), 0 deletions(-)
 create mode 100644 src/playlist/despotify_playlist_plugin.c
 create mode 100644 src/playlist/despotify_playlist_plugin.h

diff --git a/src/playlist/despotify_playlist_plugin.c 
b/src/playlist/despotify_playlist_plugin.c
new file mode 100644
index 0000000..0646de9
--- /dev/null
+++ b/src/playlist/despotify_playlist_plugin.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2011 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 "config.h"
+#include "playlist/despotify_playlist_plugin.h"
+#include "playlist_plugin.h"
+#include "playlist_list.h"
+#include "conf.h"
+#include "uri.h"
+#include "tag.h"
+#include "song.h"
+#include "input_stream.h"
+#include "glib_compat.h"
+#include "despotify_utils.h"
+
+#include <glib.h>
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <despotify.h>
+
+struct despotify_playlist {
+       struct playlist_provider base;
+
+       struct despotify_session *session;
+       GSList *list;
+};
+
+static void
+add_song(struct despotify_playlist *ctx, struct ds_track *track)
+{
+       const char *dsp_scheme = despotify_playlist_plugin.schemes[0];
+       struct song *song;
+       char uri[128];
+       char *ds_uri;
+
+       /* Create a spt://... URI for MPD */
+       g_snprintf(uri, sizeof(uri), "%s://", dsp_scheme);
+       ds_uri = uri + strlen(dsp_scheme) + 3;
+
+       if (despotify_track_to_uri(track, ds_uri) != ds_uri) {
+               /* Should never really fail, but let's be sure */
+               g_debug("Can't add track %s\n", track->title);
+               return;
+       }
+
+       song = song_remote_new(uri);
+       song->tag = mpd_despotify_tag_from_track(track);
+
+       ctx->list = g_slist_prepend(ctx->list, song);
+}
+
+static bool
+parse_track(struct despotify_playlist *ctx,
+               struct ds_link *link)
+{
+       struct ds_track *track;
+
+       track = despotify_link_get_track(ctx->session, link);
+       if (!track)
+               return false;
+       add_song(ctx, track);
+
+       return true;
+}
+
+static bool
+parse_playlist(struct despotify_playlist *ctx,
+               struct ds_link *link)
+{
+       struct ds_playlist *playlist;
+       struct ds_track *track;
+
+       playlist = despotify_link_get_playlist(ctx->session, link);
+       if (!playlist)
+               return false;
+
+       for (track = playlist->tracks; track; track = track->next)
+               add_song(ctx, track);
+
+       return true;
+}
+
+static bool
+despotify_playlist_init(G_GNUC_UNUSED const struct config_param *param)
+{
+       return mpd_despotify_get_session() != NULL;
+}
+
+static void
+despotify_playlist_finish(void)
+{
+}
+
+
+static struct playlist_provider *
+despotify_playlist_open_uri(const char *url)
+{
+       struct despotify_playlist *ctx;
+       struct despotify_session *session;
+       struct ds_link *link;
+       bool parse_result;
+
+       session = mpd_despotify_get_session();
+       if (!session)
+               goto clean_none;
+
+       /* Get link without spt:// */
+       link = despotify_link_from_uri(url + 
strlen(despotify_playlist_plugin.schemes[0]) + 3);
+       if (!link) {
+               g_debug("Can't find %s\n", url);
+               goto clean_none;
+       }
+
+       ctx = g_new(struct despotify_playlist, 1);
+
+       ctx->list = NULL;
+       ctx->session = session;
+       playlist_provider_init(&ctx->base, &despotify_playlist_plugin);
+
+       switch (link->type)
+       {
+       case LINK_TYPE_TRACK:
+               parse_result = parse_track(ctx, link);
+               break;
+       case LINK_TYPE_PLAYLIST:
+               parse_result = parse_playlist(ctx, link);
+               break;
+       default:
+               parse_result = false;
+               break;
+       }
+       despotify_free_link(link);
+       if (!parse_result)
+               goto clean_playlist;
+
+       ctx->list = g_slist_reverse(ctx->list);
+
+       return &ctx->base;
+
+clean_playlist:
+       g_slist_free(ctx->list);
+clean_none:
+
+       return NULL;
+}
+
+static void
+track_free_callback(gpointer data, G_GNUC_UNUSED gpointer user_data)
+{
+       struct song *song = (struct song *)data;
+
+       song_free(song);
+}
+
+static void
+despotify_playlist_close(struct playlist_provider *_playlist)
+{
+       struct despotify_playlist *ctx = (struct despotify_playlist *)_playlist;
+
+       g_slist_foreach(ctx->list, track_free_callback, NULL);
+       g_slist_free(ctx->list);
+
+       g_free(ctx);
+}
+
+
+static struct song *
+despotify_playlist_read(struct playlist_provider *_playlist)
+{
+       struct despotify_playlist *ctx = (struct despotify_playlist *)_playlist;
+       struct song *out;
+
+       if (!ctx->list)
+               return NULL;
+
+       /* Remove the current track */
+       out = ctx->list->data;
+       ctx->list = g_slist_remove(ctx->list, out);
+
+       return out;
+}
+
+
+static const char *const despotify_schemes[] = {
+               "spt",
+               NULL
+};
+
+const struct playlist_plugin despotify_playlist_plugin = {
+               .name = "despotify",
+
+               .init = despotify_playlist_init,
+               .finish = despotify_playlist_finish,
+               .open_uri = despotify_playlist_open_uri,
+               .read = despotify_playlist_read,
+               .close = despotify_playlist_close,
+
+               .schemes = despotify_schemes,
+};
diff --git a/src/playlist/despotify_playlist_plugin.h 
b/src/playlist/despotify_playlist_plugin.h
new file mode 100644
index 0000000..f8ee20d
--- /dev/null
+++ b/src/playlist/despotify_playlist_plugin.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2011 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.
+ */
+
+#ifndef MPD_PLAYLIST_DESPOTIFY_PLAYLIST_PLUGIN_H
+#define MPD_PLAYLIST_DESPOTIFY_PLAYLIST_PLUGIN_H
+
+extern const struct playlist_plugin despotify_playlist_plugin;
+
+#endif
diff --git a/src/playlist_list.c b/src/playlist_list.c
index 0a77aa8..04c3fa2 100644
--- a/src/playlist_list.c
+++ b/src/playlist_list.c
@@ -24,6 +24,7 @@
 #include "playlist/m3u_playlist_plugin.h"
 #include "playlist/xspf_playlist_plugin.h"
 #include "playlist/lastfm_playlist_plugin.h"
+#include "playlist/despotify_playlist_plugin.h"
 #include "playlist/pls_playlist_plugin.h"
 #include "playlist/asx_playlist_plugin.h"
 #include "playlist/rss_playlist_plugin.h"
@@ -47,6 +48,9 @@ static const struct playlist_plugin *const playlist_plugins[] 
= {
        &pls_playlist_plugin,
        &asx_playlist_plugin,
        &rss_playlist_plugin,
+#ifdef ENABLE_DESPOTIFY
+       &despotify_playlist_plugin,
+#endif
 #ifdef ENABLE_LASTFM
        &lastfm_playlist_plugin,
 #endif
-- 
1.7.1


------------------------------------------------------------------------------
Enable your software for Intel(R) Active Management Technology to meet the
growing manageability and security demands of your customers. Businesses
are taking advantage of Intel(R) vPro (TM) technology - will your software 
be a part of the solution? Download the Intel(R) Manageability Checker 
today! http://p.sf.net/sfu/intel-dev2devmar
_______________________________________________
Musicpd-dev-team mailing list
Musicpd-dev-team@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/musicpd-dev-team

Reply via email to