From 16b2ac547c2d17f7398a7a3d9257c6c073e7646c Mon Sep 17 00:00:00 2001 From: Arnaud Bienner Date: Sat, 6 Dec 2014 17:54:13 +0100 Subject: [PATCH] Sort music brainz releases according to status --- src/musicbrainz/musicbrainzclient.cpp | 3 +++ src/musicbrainz/musicbrainzclient.h | 32 ++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/musicbrainz/musicbrainzclient.cpp b/src/musicbrainz/musicbrainzclient.cpp index 149cd9b79..576af44d8 100644 --- a/src/musicbrainz/musicbrainzclient.cpp +++ b/src/musicbrainz/musicbrainzclient.cpp @@ -295,6 +295,7 @@ MusicBrainzClient::ResultList MusicBrainzClient::ParseTrack( if (releases.isEmpty()) { ret << result; } else { + qStableSort(releases); for (const Release& release : releases) { ret << release.CopyAndMergeInto(result); } @@ -336,6 +337,8 @@ MusicBrainzClient::Release MusicBrainzClient::ParseRelease( QStringRef name = reader->name(); if (name == "title") { ret.album_ = reader->readElementText(); + } else if (name == "status") { + ret.SetStatusFromString(reader->readElementText()); } else if (name == "date") { QRegExp regex(kDateRegex); if (regex.indexIn(reader->readElementText()) == 0) { diff --git a/src/musicbrainz/musicbrainzclient.h b/src/musicbrainz/musicbrainzclient.h index 0bb20de8b..6627d8ae4 100644 --- a/src/musicbrainz/musicbrainzclient.h +++ b/src/musicbrainz/musicbrainzclient.h @@ -110,7 +110,16 @@ signals: }; struct Release { - Release() : track_(0), year_(0) {} + + enum Status { + Status_Unknown = 0, + Status_PseudoRelease, + Status_Bootleg, + Status_Promotional, + Status_Official + }; + + Release() : track_(0), year_(0), status_(Status_Unknown) {} Result CopyAndMergeInto(const Result& orig) const { Result ret(orig); @@ -120,9 +129,30 @@ signals: return ret; } + void SetStatusFromString(const QString& s) { + if (s.compare("Official", Qt::CaseInsensitive) == 0) { + status_ = Status_Official; + } else if (s.compare("Promotion", Qt::CaseInsensitive) == 0) { + status_ = Status_Promotional; + } else if (s.compare("Bootleg", Qt::CaseInsensitive) == 0) { + status_ = Status_Bootleg; + } else if (s.compare("Pseudo-release", Qt::CaseInsensitive) == 0) { + status_ = Status_PseudoRelease; + } else { + status_ = Status_Unknown; + } + } + + bool operator<(const Release& other) const { + // Compare status so that "best" status (e.g. Official) will be first + // when sorting a list of releases. + return status_ > other.status_; + } + QString album_; int track_; int year_; + Status status_; }; struct PendingResults {