on xenial help sign in
fix album artwork containing / in the name. Fixes: https://bugs.launchpad.net/bugs/1237829.
024b6c7Michael Zanetti
plugins/Unity/iconutils.cpp+10−10
@@ -17,11 +17,13 @@
17 * Michal Hruby <michal.hruby@canonical.com>
17 * Michal Hruby <michal.hruby@canonical.com>
18 */
18 */
19
19
20−#include <QStringList>
20+#include "iconutils.h"
21−#include <QUrl>
22
21
23#include <gio/gio.h>
22#include <gio/gio.h>
23+
24−#include "iconutils.h"
24+#include <QStringList>
25+#include <QUrl>
26+#include <QUrlQuery>
25
27
26#define BASE_THEME_ICON_URI "image://theme/"
28#define BASE_THEME_ICON_URI "image://theme/"
27#define BASE_THUMBNAILER_URI "image://thumbnailer/"
29#define BASE_THUMBNAILER_URI "image://thumbnailer/"
@@ -104,13 +106,11 @@ QString uriToThumbnailerProviderString(QString const &uri, QString const &mimety
104 if (contentHash.contains("content")) { // nested content in Home?
106 if (contentHash.contains("content")) { // nested content in Home?
105 contentHash = contentHash["content"].toHash();
107 contentHash = contentHash["content"].toHash();
106 }
108 }
107− if (contentHash.contains("album") &&
109+ if (contentHash.contains("album") && contentHash.contains("artist")) {
108− contentHash.contains("artist")) {
110+ QUrlQuery query;
109− const QString album = contentHash["album"].toString();
111+ query.addQueryItem(QStringLiteral("artist"), contentHash["artist"].toString());
110− const QString artist = contentHash["artist"].toString();
112+ query.addQueryItem(QStringLiteral("album"), contentHash["album"].toString());
111− thumbnailerUri.append(QUrl::toPercentEncoding(artist));
112− thumbnailerUri.append("/");
113+ thumbnailerUri.append(query.toString());
113− thumbnailerUri.append(QUrl::toPercentEncoding(album));
114 }
114 }
115 }
115 }
116 } else {
116 } else {
plugins/Utils/albumartprovider.cpp+10−7
@@ -32,6 +32,7 @@
32#include <QByteArray>
32#include <QByteArray>
33#include <QImage>
33#include <QImage>
34#include <QUrl>
34#include <QUrl>
35+#include <QUrlQuery>
35
36
36using namespace std;
37using namespace std;
37
38
@@ -65,6 +66,9 @@ AlbumArtProvider::~AlbumArtProvider()
65std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
66std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
66 QString artist = QString::fromStdString(ai.artist);
67 QString artist = QString::fromStdString(ai.artist);
67 QString album = QString::fromStdString(ai.album);
68 QString album = QString::fromStdString(ai.album);
69+ // audioscrobbler wants it without any / (as it would break the URL)
70+ artist.remove('/');
71+ album.remove('/');
68
72
69 /// @todo: this is the old API which will probably get axed at some point in the future
73 /// @todo: this is the old API which will probably get axed at some point in the future
70 /// The new 2.0 API requires an API key, but supports JSON output, etc, so switching
74 /// 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
200QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
204QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
201 Q_UNUSED(requestedSize)
205 Q_UNUSED(requestedSize)
202
206
203− const QStringList parts = id.split("/");
207+ QUrlQuery query(id);
204− if (parts.size() != 2) {
208+ if (!query.hasQueryItem(QStringLiteral("artist")) || !query.hasQueryItem(QStringLiteral("album"))) {
205 qWarning() << "Invalid albumart uri:" << id;
209 qWarning() << "Invalid albumart uri:" << id;
206 return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
210 return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
207 }
211 }
208− const std::string artist = QUrl::fromPercentEncoding(parts[0].toUtf8()).toStdString();
212+ const QString artist = query.queryItemValue(QStringLiteral("artist"), QUrl::FullyEncoded);
209− const std::string album = QUrl::fromPercentEncoding(parts[1].toUtf8()).toStdString();
213+ const QString album = query.queryItemValue(QStringLiteral("album"), QUrl::FullyEncoded);
210
214
211 std::string tgt_path;
215 std::string tgt_path;
212 try {
216 try {
213− tgt_path = get_image(artist, album);
217+ tgt_path = get_image(artist.toStdString(), album.toStdString());
214 if(!tgt_path.empty()) {
218 if(!tgt_path.empty()) {
215− QString tgt(tgt_path.c_str());
216 QImage image;
219 QImage image;
217− image.load(tgt);
220+ image.load(QString::fromStdString(tgt_path));
218 // FIXME: Rescale to requested size preserving aspect.
221 // FIXME: Rescale to requested size preserving aspect.
219 *realSize = image.size();
222 *realSize = image.size();
220 return image;
223 return image;
tests/plugins/Unity/resultstest.cpp+3−3
@@ -143,7 +143,7 @@ void ResultsTest::testSpecialIcons_data()
143 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
143 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
144 g_variant_builder_add(&builder, "{sv}", "content", g_variant_builder_end(&inner_builder));
144 g_variant_builder_add(&builder, "{sv}", "content", g_variant_builder_end(&inner_builder));
145
145
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";
147
147
148 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_VARDICT);
148 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_VARDICT);
149 g_variant_builder_add(&inner_builder, "{sv}", "artist", g_variant_new_string("U2"));
149 g_variant_builder_add(&inner_builder, "{sv}", "artist", g_variant_new_string("U2"));
@@ -153,7 +153,7 @@ void ResultsTest::testSpecialIcons_data()
153 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
153 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
154 g_variant_builder_add(&builder, "{sv}", "content", inner);
154 g_variant_builder_add(&builder, "{sv}", "content", inner);
155
155
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";
157
157
158 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_VARDICT);
158 g_variant_builder_init(&inner_builder, G_VARIANT_TYPE_VARDICT);
159 g_variant_builder_add(&inner_builder, "{sv}", "artist", g_variant_new_string("U2"));
159 g_variant_builder_add(&inner_builder, "{sv}", "artist", g_variant_new_string("U2"));
@@ -166,7 +166,7 @@ void ResultsTest::testSpecialIcons_data()
166 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
166 g_variant_builder_init(&builder, G_VARIANT_TYPE_VARDICT);
167 g_variant_builder_add(&builder, "{sv}", "content", g_variant_builder_end(&inner_builder));
167 g_variant_builder_add(&builder, "{sv}", "content", g_variant_builder_end(&inner_builder));
168
168
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";
170}
170}
171
171
172void ResultsTest::testSpecialIcons()
172void ResultsTest::testSpecialIcons()