From 8e6608a29f3cfe5488b1ddb38b2f9ac93e5e5614 Mon Sep 17 00:00:00 2001 From: Arnaud Bienner Date: Sat, 24 Sep 2011 12:06:31 +0200 Subject: [PATCH] Adding GrooveShark playlists --- src/internet/groovesharkservice.cpp | 105 +++++++++++++++++++++++----- src/internet/groovesharkservice.h | 22 +++++- 2 files changed, 108 insertions(+), 19 deletions(-) diff --git a/src/internet/groovesharkservice.cpp b/src/internet/groovesharkservice.cpp index 17705749b..58c70f5e3 100644 --- a/src/internet/groovesharkservice.cpp +++ b/src/internet/groovesharkservice.cpp @@ -146,24 +146,7 @@ void GrooveSharkService::SearchSongsFinished() { reply->deleteLater(); QVariantMap result = ExtractResult(reply); - QVariantList result_songs = result["songs"].toList(); - SongList songs; - for (int i=0; iClear(); pending_search_playlist_->InsertSongs(songs); } @@ -336,6 +319,7 @@ void GrooveSharkService::EnsureItemsCreated() { search_->setData(InternetModel::PlayBehaviour_DoubleClickAction, InternetModel::Role_PlayBehaviour); root_->appendRow(search_); + RetrieveUserPlaylists(); } } @@ -347,6 +331,70 @@ void GrooveSharkService::EnsureConnected() { } } +void GrooveSharkService::RetrieveUserPlaylists() { + QNetworkReply *reply; + + reply = CreateRequest("getUserPlaylists", QList(), true); + + connect(reply, SIGNAL(finished()), SLOT(UserPlaylistsRetrieved())); +} + +void GrooveSharkService::UserPlaylistsRetrieved() { + QNetworkReply* reply = qobject_cast(sender()); + if (!reply) + return; + + reply->deleteLater(); + + QVariantMap result = ExtractResult(reply); + QVariantList playlists = result["playlists"].toList(); + QVariantList::iterator it; + for (it = playlists.begin(); it != playlists.end(); ++it) { + // Get playlist info + QVariantMap playlist = (*it).toMap(); + int playlist_id = playlist["PlaylistID"].toInt(); + QString playlist_name = playlist["PlaylistName"].toString(); + + // Request playlist's songs + QNetworkReply *reply; + QList parameters; + parameters << Param("playlistID", playlist_id); + reply = CreateRequest("getPlaylistSongs", parameters, true); + connect(reply, SIGNAL(finished()), SLOT(PlaylistSongsRetrieved())); + + // Keep in mind correspondance between reply object and playlist + pending_retrieve_playlists_.insert(reply, PlaylistInfo(playlist_id, playlist_name)); + } +} + +void GrooveSharkService::PlaylistSongsRetrieved() { + QNetworkReply* reply = qobject_cast(sender()); + if (!reply) + return; + + reply->deleteLater(); + + // Find corresponding playlist info + PlaylistInfo playlist_info = pending_retrieve_playlists_.take(reply); + // Create playlist item + QStandardItem* item = new QStandardItem(playlist_info.name_); + item->setData(Type_UserPlaylist, InternetModel::Role_Type); + item->setData(true, InternetModel::Role_CanLazyLoad); + + QVariantMap result = ExtractResult(reply); + SongList songs = ExtractSongs(result); + foreach (const Song& song, songs) { + QStandardItem* child = new QStandardItem(song.PrettyTitleWithArtist()); + child->setData(Type_Track, InternetModel::Role_Type); + child->setData(QVariant::fromValue(song), InternetModel::Role_SongMetadata); + child->setData(InternetModel::PlayBehaviour_SingleItem, InternetModel::Role_PlayBehaviour); + child->setData(song.url(), InternetModel::Role_Url); + + item->appendRow(child); + } + root_->appendRow(item); +} + void GrooveSharkService::OpenSearchTab() { model()->player()->playlists()->New(tr("Search GrooveShark"), SongList(), GrooveSharkSearchPlaylistType::kName); @@ -408,3 +456,24 @@ QVariantMap GrooveSharkService::ExtractResult(QNetworkReply* reply) { qLog(Debug) << result; return result["result"].toMap(); } + +SongList GrooveSharkService::ExtractSongs(const QVariantMap& result) { + QVariantList result_songs = result["songs"].toList(); + SongList songs; + for (int i=0; i pending_retrieve_playlists_; + QStandardItem* root_; QStandardItem* search_;