diff options
author | Arno <arno@disconnect.de> | 2017-07-07 17:18:07 +0200 |
---|---|---|
committer | Arno <arno@disconnect.de> | 2017-07-07 17:18:07 +0200 |
commit | c692d78080dc503e795345e6c48a753da10ae153 (patch) | |
tree | 038bd532d5239beeb50b07b04e902e97b43ebabd | |
parent | 61d7332826007600367985b953f2dac2453ea765 (diff) | |
download | BeetPlayer-c692d78080dc503e795345e6c48a753da10ae153.tar.gz BeetPlayer-c692d78080dc503e795345e6c48a753da10ae153.tar.bz2 BeetPlayer-c692d78080dc503e795345e6c48a753da10ae153.zip |
Improve MusicBrainz search
Don't display crap when we don't have a match. Show alternative artists
instead, or nothing...
-rw-r--r-- | playerwidget.cpp | 41 | ||||
-rw-r--r-- | webdownloader.cpp | 19 | ||||
-rw-r--r-- | webdownloader.h | 2 |
3 files changed, 46 insertions, 16 deletions
diff --git a/playerwidget.cpp b/playerwidget.cpp index 54c2cca..0810487 100644 --- a/playerwidget.cpp +++ b/playerwidget.cpp @@ -1265,22 +1265,35 @@ void PlayerWidget::searchMusicbrainzLeft(){ void PlayerWidget::webDlDone(){ - QString text(tr("<b>Musicbrainz:</b><table style=\"margin-bottom: 20px\">")); QString aId = mWebDownloader->artistId(); - text.append(QString(tr("<tr><td style=\"padding-left: 30px\">Artist</td><td style=\"padding-left: 30px\"><a href=\"https://musicbrainz.org/artist/%1\">%2</a></td></tr>")).arg(aId).arg(mWebDownloader->artist())); - foreach(QString alId, mWebDownloader->data()){ - text.append(QString("<tr><td style=\"padding-left: 30px\">Album</td><td style=\"padding-left: 30px\"><a href=\"https://musicbrainz.org/release-group/%1\">%2</a></td></tr>").arg(alId).arg(mWebDownloader->album())); - } - text.append("</table>"); - const QMap<QString, QString> other = mWebDownloader->otherData(); - text.append(QString(tr("<b>All Albums (%1):</b><ul>")).arg(QString::number(other.count()))); - QStringList albums = other.values(); - std::sort(albums.begin(), albums.end()); - foreach(QString a, albums){ - QString id = other.key(a); - text.append(QString("<li><a href=\"https://musicbrainz.org/release-group/%1\">%2</a></li>").arg(id).arg(a)); + QString text; + if(!aId.isEmpty()){ + text.append(QString(tr("<b>Musicbrainz:</b><table style=\"margin-bottom: 20px\">"))); + text.append(QString(tr("<tr><td style=\"padding-left: 30px\">Artist</td><td style=\"padding-left: 30px\"><a href=\"https://musicbrainz.org/artist/%1\">%2</a></td></tr>")).arg(aId).arg(mWebDownloader->artist())); + foreach(QString alId, mWebDownloader->data()){ + text.append(QString("<tr><td style=\"padding-left: 30px\">Album</td><td style=\"padding-left: 30px\"><a href=\"https://musicbrainz.org/release-group/%1\">%2</a></td></tr>").arg(alId).arg(mWebDownloader->album())); + } + text.append("</table>"); + const QMap<QString, QString> other = mWebDownloader->otherData(); + text.append(QString(tr("<b>All Albums (%1):</b><ul>")).arg(QString::number(other.count()))); + QStringList albums = other.values(); + std::sort(albums.begin(), albums.end()); + foreach(QString a, albums){ + QString id = other.key(a); + text.append(QString("<li><a href=\"https://musicbrainz.org/release-group/%1\">%2</a></li>").arg(id).arg(a)); + } + text.append("</ul>"); + }else{ + text.append(QString(tr("<b>Musicbrainz: No match!</b><br/>"))); + const QMap<QString, QString> alt = mWebDownloader->alternateArtists(); + if(!alt.isEmpty()){ + text.append(QString(tr("<b>Guesses:</b><ul>"))); + for(QMap<QString, QString>::const_iterator it = alt.constBegin(); it != alt.constEnd(); ++it){ + text.append(QString("<li><a href=\"https://musicbrainz.org/artist/%1\">%2</a></li>").arg(it.key()).arg(it.value())); + } + text.append("</ul>"); + } } - text.append("</ul>"); mLeftTE->setText(text); } diff --git a/webdownloader.cpp b/webdownloader.cpp index 897ce80..78941fb 100644 --- a/webdownloader.cpp +++ b/webdownloader.cpp @@ -26,6 +26,8 @@ void WebDownloader::fetchData(QString artist, QString album){ void WebDownloader::dlFinished(QNetworkReply *reply){ mData.clear(); mOtherData.clear(); + mArtistId.clear(); + mAlternateArtists.clear(); QByteArray res = reply->readAll(); QJsonDocument jDoc = QJsonDocument::fromJson(res); QJsonObject docObj = jDoc.object(); @@ -44,16 +46,29 @@ void WebDownloader::dlFinished(QNetworkReply *reply){ mArtistId = aId; std::for_each(relArr.constBegin(), relArr.constEnd(), [this, aId](auto c){ QString id = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("id").toString(); + QString linkId = c.toObject().value("release-group").toObject().value("id").toString(); + QString title = c.toObject().value("title").toString().toLower(); if(id == aId){ QString primary = c.toObject().value("release-group").toObject().value("primary-type").toString().toLower(); QString status = c.toObject().value("status").toString().toLower(); if(primary == "album" && status == "official"){ - QString linkId = c.toObject().value("release-group").toObject().value("id").toString(); - QString title = c.toObject().value("title").toString().toLower(); mOtherData.insert(linkId, title); } } }); + }else{ + std::for_each(relArr.constBegin(), relArr.constEnd(), [this](auto c){ + QString disamb = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("disambiguation").toString(); + QString name = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("name").toString(); + QString linkId = c.toObject().value("artist-credit").toArray().at(0).toObject().value("artist").toObject().value("id").toString(); + QString t; + if(!disamb.isEmpty()){ + t = QString("%1 (%2)").arg(name).arg(disamb); + }else{ + t = name; + } + mAlternateArtists.insert(linkId, t); + }); } reply->deleteLater(); emit done(); diff --git a/webdownloader.h b/webdownloader.h index 6fec7f4..f07ed52 100644 --- a/webdownloader.h +++ b/webdownloader.h @@ -15,6 +15,7 @@ class WebDownloader : public QObject { const QString artistId() const { return mArtistId; } const QStringList data() const { return mData; } const QMap<QString, QString> otherData() const { return mOtherData; } + const QMap<QString, QString> alternateArtists() const { return mAlternateArtists; } signals: void done(); @@ -29,6 +30,7 @@ class WebDownloader : public QObject { QString mArtistId; QStringList mData; QMap<QString, QString> mOtherData; + QMap<QString, QString> mAlternateArtists; }; |