From aaef0de2246add76ca031a2d84f09a8b246d8a74 Mon Sep 17 00:00:00 2001 From: Arnaud Bienner Date: Wed, 16 May 2012 01:30:18 +0200 Subject: [PATCH] Sort GS playlist by name. Fixes issue 2398. --- src/internet/groovesharkservice.cpp | 44 ++++++++++++++++++++--------- src/internet/groovesharkservice.h | 9 +++++- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/src/internet/groovesharkservice.cpp b/src/internet/groovesharkservice.cpp index c329ce3d4..d704e0045 100644 --- a/src/internet/groovesharkservice.cpp +++ b/src/internet/groovesharkservice.cpp @@ -648,14 +648,11 @@ void GroovesharkService::UserPlaylistsRetrieved() { reply->deleteLater(); QVariantMap result = ExtractResult(reply); - QVariantList playlists = result["playlists"].toList(); - - foreach (const QVariant& playlist_variant, playlists) { - // Get playlist info - QVariantMap playlist = playlist_variant.toMap(); - int playlist_id = playlist["PlaylistID"].toInt(); - QString playlist_name = playlist["PlaylistName"].toString(); + QList playlists = ExtractPlaylistInfo(result); + foreach(const PlaylistInfo& playlist_info, playlists) { + int playlist_id = playlist_info.id_; + const QString& playlist_name = playlist_info.name_; QStandardItem* playlist_item = CreatePlaylistItem(playlist_name, playlist_id); // Insert this new item just below the favorites list @@ -811,14 +808,13 @@ void GroovesharkService::RetrieveSubscribedPlaylists() { void GroovesharkService::SubscribedPlaylistsRetrieved(QNetworkReply* reply) { 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(); + QList playlists = ExtractPlaylistInfo(result); + + foreach(const PlaylistInfo& playlist_info, playlists) { + int playlist_id = playlist_info.id_; + const QString& playlist_name = playlist_info.name_; QStandardItem* playlist_item = CreatePlaylistItem(playlist_name, playlist_id); // Refine some playlist properties that should be different for subscribed @@ -1605,3 +1601,23 @@ int GroovesharkService::ExtractSongId(const QUrl& url) { } return 0; } + +QList GroovesharkService::ExtractPlaylistInfo(const QVariantMap& result) { + QVariantList playlists_qvariant = result["playlists"].toList(); + + QList playlists; + + // Get playlists info + foreach (const QVariant& playlist_qvariant, playlists_qvariant) { + QVariantMap playlist = playlist_qvariant.toMap(); + int playlist_id = playlist["PlaylistID"].toInt(); + QString playlist_name = playlist["PlaylistName"].toString(); + + playlists << PlaylistInfo(playlist_id, playlist_name); + } + + // Sort playlists by name + qSort(playlists.begin(), playlists.end(), qGreater()); + + return playlists; +} diff --git a/src/internet/groovesharkservice.h b/src/internet/groovesharkservice.h index 5794c5201..ad4a570f9 100644 --- a/src/internet/groovesharkservice.h +++ b/src/internet/groovesharkservice.h @@ -134,9 +134,13 @@ class GroovesharkService : public InternetService { protected: struct PlaylistInfo { PlaylistInfo() {} - PlaylistInfo(int id, QString name, QStandardItem* item) + PlaylistInfo(int id, QString name, QStandardItem* item = NULL) : id_(id), name_(name), item_(item) {} + bool operator< (const PlaylistInfo other) const { + return name_.compare(other.name_, Qt::CaseInsensitive) < 0; + } + int id_; QString name_; QStandardItem* item_; @@ -222,6 +226,9 @@ class GroovesharkService : public InternetService { QList ExtractSongsIds(const QVariantMap& result); QList ExtractSongsIds(const QList& urls); int ExtractSongId(const QUrl& url); // Returns 0 if url is not a Grooveshark url + // Convenient function for extracting basic playlist info (only 'id' and + // 'name': QStandardItem still need to be created), and sort them by name + QList ExtractPlaylistInfo(const QVariantMap& result); void ResetSessionId();