on xenial help sign in
fix album artwork containing / in the name. Fixes: https://bugs.launchpad.net/bugs/1237829.

Approved by PS Jenkins bot, Albert Astals Cid.

commit024b6c71ce4bb39a0303052cc7ff3a82ed690c2d authorMichael Zanetti <michael.zanetti@canonical.com> dateTue 19 Nov 2013, 11:41 (13 years ago) parente0ae96bc772526
3 files changed+23−20
plugins/Unity/iconutils.cpp+10−10 plugins/Utils/albumartprovider.cpp+10−7 tests/plugins/Unity/resultstest.cpp+3−3
plugins/Unity/iconutils.cpp+10−10
@@ -17,11 +17,13 @@
1717 * Michal Hruby <michal.hruby@canonical.com>
1818 */
1919
20−#include <QStringList>
21−#include <QUrl>
20+#include "iconutils.h"
2221
2322#include <gio/gio.h>
24−#include "iconutils.h"
23+
24+#include <QStringList>
25+#include <QUrl>
26+#include <QUrlQuery>
2527
2628#define BASE_THEME_ICON_URI "image://theme/"
2729#define BASE_THUMBNAILER_URI "image://thumbnailer/"
@@ -104,13 +106,11 @@ QString uriToThumbnailerProviderString(QString const &uri, QString const &mimety
104106 if (contentHash.contains("content")) { // nested content in Home?
105107 contentHash = contentHash["content"].toHash();
106108 }
107− if (contentHash.contains("album") &&
108− contentHash.contains("artist")) {
109− const QString album = contentHash["album"].toString();
110− const QString artist = contentHash["artist"].toString();
111− thumbnailerUri.append(QUrl::toPercentEncoding(artist));
112− thumbnailerUri.append("/");
113− thumbnailerUri.append(QUrl::toPercentEncoding(album));
109+ if (contentHash.contains("album") && contentHash.contains("artist")) {
110+ QUrlQuery query;
111+ query.addQueryItem(QStringLiteral("artist"), contentHash["artist"].toString());
112+ query.addQueryItem(QStringLiteral("album"), contentHash["album"].toString());
113+ thumbnailerUri.append(query.toString());
114114 }
115115 }
116116 } else {
plugins/Utils/albumartprovider.cpp+10−7
@@ -32,6 +32,7 @@
3232#include <QByteArray>
3333#include <QImage>
3434#include <QUrl>
35+#include <QUrlQuery>
3536
3637using namespace std;
3738
@@ -65,6 +66,9 @@ AlbumArtProvider::~AlbumArtProvider()
6566std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
6667 QString artist = QString::fromStdString(ai.artist);
6768 QString album = QString::fromStdString(ai.album);
69+ // audioscrobbler wants it without any / (as it would break the URL)
70+ artist.remove('/');
71+ album.remove('/');
6872
6973 /// @todo: this is the old API which will probably get axed at some point in the future
7074 /// The new 2.0 API requires an API key, but supports JSON output, etc, so switching
@@ -200,21 +204,20 @@ std::string AlbumArtProvider::get_image(const std::string &artist, const std::st
200204QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
201205 Q_UNUSED(requestedSize)
202206
203− const QStringList parts = id.split("/");
204− if (parts.size() != 2) {
207+ QUrlQuery query(id);
208+ if (!query.hasQueryItem(QStringLiteral("artist")) || !query.hasQueryItem(QStringLiteral("album"))) {
205209 qWarning() << "Invalid albumart uri:" << id;
206210 return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
207211 }
208− const std::string artist = QUrl::fromPercentEncoding(parts[0].toUtf8()).toStdString();
209− const std::string album = QUrl::fromPercentEncoding(parts[1].toUtf8()).toStdString();
212+ const QString artist = query.queryItemValue(QStringLiteral("artist"), QUrl::FullyEncoded);
213+ const QString album = query.queryItemValue(QStringLiteral("album"), QUrl::FullyEncoded);
210214
211215 std::string tgt_path;
212216 try {
213− tgt_path = get_image(artist, album);
217+ tgt_path = get_image(artist.toStdString(), album.toStdString());
214218 if(!tgt_path.empty()) {
215− QString tgt(tgt_path.c_str());
216219 QImage image;
217− image.load(tgt);
220+ image.load(QString::fromStdString(tgt_path));
218221 // FIXME: Rescale to requested size preserving aspect.
219222 *realSize = image.size();
220223 return image;
tests/plugins/Unity/resultstest.cpp+3−3
@@ -143,7 +143,7 @@ void ResultsTest::testSpecialIcons_data()
143143 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
144144 g_variant_builder_add(&builder, "{sv}", "content", g_variant_builder_end(&inner_builder));
145145
146− QTest::newRow("simple") << "file:///foo.mp3" << GVariantWrapper(g_variant_builder_end(&builder)) << "image://albumart/U2/War";
146+ QTest::newRow("simple") << "file:///foo.mp3" << GVariantWrapper(g_variant_builder_end(&builder)) << "image://albumart/artist=U2&album=War";
147147
148148 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_VARDICT);
149149 g_variant_builder_add(&inner_builder, "{sv}", "artist", g_variant_new_string("U2"));
@@ -153,7 +153,7 @@ void ResultsTest::testSpecialIcons_data()
153153 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
154154 g_variant_builder_add(&builder, "{sv}", "content", inner);
155155
156− QTest::newRow("with-slash") << "file:///foo.mp3" << GVariantWrapper(g_variant_builder_end(&builder)) << "image://albumart/U2/War%2FJoshua%20tree";
156+ QTest::newRow("with-slash") << "file:///foo.mp3" << GVariantWrapper(g_variant_builder_end(&builder)) << "image://albumart/artist=U2&album=War/Joshua tree";
157157
158158 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_VARDICT);
159159 g_variant_builder_add(&inner_builder, "{sv}", "artist", g_variant_new_string("U2"));
@@ -166,7 +166,7 @@ void ResultsTest::testSpecialIcons_data()
166166 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
167167 g_variant_builder_add(&builder, "{sv}", "content", g_variant_builder_end(&inner_builder));
168168
169− QTest::newRow("nested") << "file:///foo.mp3" << GVariantWrapper(g_variant_builder_end(&builder)) << "image://albumart/U2/War";
169+ QTest::newRow("nested") << "file:///foo.mp3" << GVariantWrapper(g_variant_builder_end(&builder)) << "image://albumart/artist=U2&album=War";
170170}
171171
172172void ResultsTest::testSpecialIcons()