From b364d3fa8465b516f5d210d322d83134962543ff Mon Sep 17 00:00:00 2001 From: Arnaud Bienner Date: Thu, 1 Dec 2011 23:46:27 +0100 Subject: [PATCH] Create GS playlists items when retrieving playlists instead of creating them when retrieving playlists' songs --- src/internet/groovesharkservice.cpp | 56 ++++++++++++----------------- src/internet/groovesharkservice.h | 6 ++-- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/src/internet/groovesharkservice.cpp b/src/internet/groovesharkservice.cpp index 99835eac8..5dcab3560 100644 --- a/src/internet/groovesharkservice.cpp +++ b/src/internet/groovesharkservice.cpp @@ -619,8 +619,15 @@ void GroovesharkService::UserPlaylistsRetrieved() { int playlist_id = playlist["PlaylistID"].toInt(); QString playlist_name = playlist["PlaylistName"].toString(); + QStandardItem* playlist_item = + CreatePlaylistItem(playlist_name, playlist_id); + // Insert this new item just below the favorites list + root_->insertRow(favorites_->row() + 1, playlist_item); + // Keep in mind this playlist + playlists_.insert(playlist_id, + PlaylistInfo(playlist_id, playlist_name, playlist_item)); // Request playlist's songs - RefreshPlaylist(playlist_id, playlist_name); + RefreshPlaylist(playlist_id); } if (playlists.isEmpty()) { @@ -636,23 +643,12 @@ void GroovesharkService::PlaylistSongsRetrieved() { reply->deleteLater(); // Find corresponding playlist info - PlaylistInfo playlist_info = pending_retrieve_playlists_.take(reply); - // Get the playlist item (in case of refresh) or create a new one - QStandardItem* item = NULL; - PlaylistType playlist_type = UserPlaylist; - if (playlists_.contains(playlist_info.id_)) { - item = playlists_[playlist_info.id_].item_; - } else if (subscribed_playlists_.contains(playlist_info.id_)) { - item = subscribed_playlists_[playlist_info.id_].item_; - playlist_type = SubscribedPlaylist; - } - bool item_already_exists = false; - if (item) { - item_already_exists = true; - item->removeRows(0, item->rowCount()); - } else { - item = CreatePlaylistItem(playlist_info.name_, playlist_info.id_); + int playlist_id = pending_retrieve_playlists_.take(reply); + PlaylistInfo& playlist_info = playlists_[playlist_id]; + if (subscribed_playlists_.contains(playlist_id)) { + playlist_info = subscribed_playlists_[playlist_id]; } + playlist_info.item_->removeRows(0, playlist_info.item_->rowCount()); QVariantMap result = ExtractResult(reply); SongList songs = ExtractSongs(result); @@ -665,21 +661,11 @@ void GroovesharkService::PlaylistSongsRetrieved() { child->setData(playlist_info.id_, Role_UserPlaylistId); child->setData(true, InternetModel::Role_CanBeModified); - item->appendRow(child); - } - if (!item_already_exists) { - // Insert this new item just below the favorites list - root_->insertRow(favorites_->row() + 1, item); + playlist_info.item_->appendRow(child); } // Keep in mind this playlist playlist_info.songs_ids_ = ExtractSongsIds(result); - playlist_info.item_ = item; - if (playlist_type == SubscribedPlaylist) { - subscribed_playlists_.insert(playlist_info.id_, playlist_info); - } else { - playlists_.insert(playlist_info.id_, playlist_info); - } if (pending_retrieve_playlists_.isEmpty()) { model()->task_manager()->SetTaskFinished(task_playlists_id_); @@ -805,7 +791,7 @@ void GroovesharkService::SubscribedPlaylistsRetrieved(QNetworkReply* reply) { root_->insertRow(subscribed_playlists_divider_->row() + 1, playlist_item); // Request playlist's songs - RefreshPlaylist(playlist_id, playlist_name); + RefreshPlaylist(playlist_id); } } @@ -1089,6 +1075,10 @@ void GroovesharkService::AddCurrentSongToPlaylist(QAction* action) { } void GroovesharkService::SetPlaylistSongs(int playlist_id, const QList& songs_ids) { + // If we are still retrieving playlists songs, don't update playlist: don't + // take the risk to erase all (not yet retrieved) playlist's songs. + if (!pending_retrieve_playlists_.isEmpty()) + return; int task_id = model()->task_manager()->StartTask(tr("Update Grooveshark playlist")); @@ -1120,17 +1110,17 @@ void GroovesharkService::PlaylistSongsSet(QNetworkReply* reply, int playlist_id, return; } - RefreshPlaylist(playlist_id, playlists_[playlist_id].name_); + RefreshPlaylist(playlist_id); } -void GroovesharkService::RefreshPlaylist(int playlist_id, const QString& playlist_name) { +void GroovesharkService::RefreshPlaylist(int playlist_id) { QList parameters; parameters << Param("playlistID", playlist_id); QNetworkReply* reply = CreateRequest("getPlaylistSongs", parameters); 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)); + pending_retrieve_playlists_.insert(reply, playlist_id); } void GroovesharkService::CreateNewPlaylist() { @@ -1160,7 +1150,7 @@ void GroovesharkService::NewPlaylistCreated(QNetworkReply* reply, const QString& int playlist_id = result["playlistID"].toInt(); QStandardItem* new_playlist_item = CreatePlaylistItem(name, playlist_id); - PlaylistInfo playlist_info(playlist_id, name); + PlaylistInfo playlist_info(playlist_id, name, new_playlist_item); playlist_info.item_ = new_playlist_item; // Insert the newly created playlist just above the subscribed playlists root_->insertRow(subscribed_playlists_divider_->row(), new_playlist_item); diff --git a/src/internet/groovesharkservice.h b/src/internet/groovesharkservice.h index f22fd7983..1c697553c 100644 --- a/src/internet/groovesharkservice.h +++ b/src/internet/groovesharkservice.h @@ -88,7 +88,7 @@ class GroovesharkService : public InternetService { void SetPlaylistSongs(int playlist_id, const QList& songs_ids); void RemoveFromPlaylist(int playlist_id, int song_id); // Refresh playlist_id playlist , or create it if it doesn't exist - void RefreshPlaylist(int playlist_id, const QString& playlist_name); + void RefreshPlaylist(int playlist_id); void DeletePlaylist(int playlist_id); void RenamePlaylist(int playlist_id); void AddUserFavoriteSong(int song_id); @@ -129,7 +129,7 @@ class GroovesharkService : public InternetService { struct PlaylistInfo { PlaylistInfo() {} - PlaylistInfo(int id, QString name, QStandardItem* item = NULL) + PlaylistInfo(int id, QString name, QStandardItem* item) : id_(id), name_(name), item_(item) {} int id_; @@ -221,7 +221,7 @@ class GroovesharkService : public InternetService { int next_pending_search_id_; QMap pending_searches_; - QMap pending_retrieve_playlists_; + QMap pending_retrieve_playlists_; QMap playlists_; QMap subscribed_playlists_;