diff --git a/src/musicbrainz/musicbrainzclient.cpp b/src/musicbrainz/musicbrainzclient.cpp index 5600e6d88..9f62d9174 100644 --- a/src/musicbrainz/musicbrainzclient.cpp +++ b/src/musicbrainz/musicbrainzclient.cpp @@ -142,9 +142,7 @@ void MusicBrainzClient::DiscIdRequestFinished(const QString& discid, } } - ResultList unique_ret = UniqueResults(ret); - qSort(unique_ret); - emit Finished(artist, album, unique_ret); + emit Finished(artist, album, UniqueResults(ret, SortResults)); } void MusicBrainzClient::RequestFinished(QNetworkReply* reply, int id, int request_number) { @@ -185,7 +183,7 @@ void MusicBrainzClient::RequestFinished(QNetworkReply* reply, int id, int reques for (const PendingResults& result_list : result_list_list) { ret << result_list.results_; } - emit Finished(id, UniqueResults(ret)); + emit Finished(id, UniqueResults(ret, KeepOriginalOrder)); } } @@ -347,7 +345,23 @@ MusicBrainzClient::Release MusicBrainzClient::ParseRelease( return ret; } -MusicBrainzClient::ResultList MusicBrainzClient::UniqueResults(const ResultList& results) { - ResultList ret = QSet<Result>::fromList(results).toList(); +MusicBrainzClient::ResultList MusicBrainzClient::UniqueResults( + const ResultList& results, UniqueResultsSortOption opt) { + + ResultList ret; + if (opt == SortResults) { + ret = QSet<Result>::fromList(results).toList(); + qSort(ret); + } else { // KeepOriginalOrder + // Qt doesn't provide a ordered set (QSet "stores values in an unspecified + // order" according to Qt documentation). + // We might use std::set instead, but it's probably faster to use ResultList + // directly to avoid converting from one structure to another. + for (const Result& res : results) { + if (!ret.contains(res)) { + ret << res; + } + } + } return ret; } diff --git a/src/musicbrainz/musicbrainzclient.h b/src/musicbrainz/musicbrainzclient.h index fd283fe92..017cdce2a 100644 --- a/src/musicbrainz/musicbrainzclient.h +++ b/src/musicbrainz/musicbrainzclient.h @@ -103,6 +103,12 @@ signals: void DiscIdRequestFinished(const QString& discid, QNetworkReply* reply); private: + // Used as parameter for UniqueResults + enum UniqueResultsSortOption { + SortResults = 0, + KeepOriginalOrder + }; + struct Release { Release() : track_(0), year_(0) {} @@ -137,7 +143,9 @@ signals: static ResultList ParseTrack(QXmlStreamReader* reader); static void ParseArtist(QXmlStreamReader* reader, QString* artist); static Release ParseRelease(QXmlStreamReader* reader); - static ResultList UniqueResults(const ResultList& results); + static ResultList UniqueResults(const ResultList& results, + UniqueResultsSortOption opt = SortResults); + private: static const char* kTrackUrl;