diff options
Diffstat (limited to 'media-sound')
-rw-r--r-- | media-sound/clementine/clementine-1.3.1-r5.ebuild (renamed from media-sound/clementine/clementine-1.3.1-r4.ebuild) | 4 | ||||
-rw-r--r-- | media-sound/clementine/files/clementine-1.3.1-chromaprint14.patch (renamed from media-sound/clementine/files/clementine-chromaprint14.patch) | 0 | ||||
-rw-r--r-- | media-sound/clementine/files/clementine-1.3.1-libechonest_removal.patch | 701 |
3 files changed, 703 insertions, 2 deletions
diff --git a/media-sound/clementine/clementine-1.3.1-r4.ebuild b/media-sound/clementine/clementine-1.3.1-r5.ebuild index a61c2fe0a12..4d23bb0c413 100644 --- a/media-sound/clementine/clementine-1.3.1-r4.ebuild +++ b/media-sound/clementine/clementine-1.3.1-r5.ebuild @@ -41,7 +41,6 @@ COMMON_DEPEND=" >=media-libs/chromaprint-0.6 media-libs/gstreamer:1.0 media-libs/gst-plugins-base:1.0 - media-libs/libechonest:=[qt4(+)] >=media-libs/libmygpo-qt-1.0.9[qt4(+)] >=media-libs/taglib-1.8[mp4(+)] sys-libs/zlib @@ -95,7 +94,8 @@ S="${WORKDIR}/${MY_P^}" PATCHES=( "${FILESDIR}"/${PN}-1.3-fix-tokenizer.patch "${FILESDIR}"/${P}-fix-desktop-file.patch - "${FILESDIR}"/${PN}-chromaprint14.patch #603662 + "${FILESDIR}"/${P}-chromaprint14.patch #603662 + "${FILESDIR}"/${P}-libechonest_removal.patch ) src_prepare() { diff --git a/media-sound/clementine/files/clementine-chromaprint14.patch b/media-sound/clementine/files/clementine-1.3.1-chromaprint14.patch index bfdc49265aa..bfdc49265aa 100644 --- a/media-sound/clementine/files/clementine-chromaprint14.patch +++ b/media-sound/clementine/files/clementine-1.3.1-chromaprint14.patch diff --git a/media-sound/clementine/files/clementine-1.3.1-libechonest_removal.patch b/media-sound/clementine/files/clementine-1.3.1-libechonest_removal.patch new file mode 100644 index 00000000000..63eb096d84d --- /dev/null +++ b/media-sound/clementine/files/clementine-1.3.1-libechonest_removal.patch @@ -0,0 +1,701 @@ +Remove depend upon media-libs/libechonest and its support from clementine due to echonest service +was shutdown and this functionality is useless now and results in nothing but a slight security +and privacy risk. +See Gentoo bug #573712. +Based upon patch extracted from upstream git; original patch info: +commit a8a0f2e4fdd3d4b2fd23b8628a3abc27c290d01d +Author: John Maguire <john.maguire@gmail.com> +Date: Mon Jun 27 14:45:40 2016 +0100 + + Remove echonest and update songkick concert fetcher. +--- Clementine-1.3.1/CMakeLists.txt ++++ Clementine-1.3.1/CMakeLists.txt +@@ -365,9 +365,6 @@ + endif (NOT APPLE) + endif (USE_SYSTEM_QXT) + +-find_path(ECHONEST_INCLUDE_DIRS echonest/echonest_export.h) +-find_library(ECHONEST_LIBRARIES echonest) +- + # Use system gmock if it's available + # We need to look for both gmock and gtest + find_path(GMOCK_INCLUDE_DIRS gmock/gmock.h) +--- Clementine-1.3.1/src/CMakeLists.txt ++++ Clementine-1.3.1/src/CMakeLists.txt +@@ -35,7 +35,6 @@ + include_directories(${QTSINGLEAPPLICATION_INCLUDE_DIRS}) + include_directories(${QTIOCOMPRESSOR_INCLUDE_DIRS}) + include_directories(${QXT_INCLUDE_DIRS}) +-include_directories(${ECHONEST_INCLUDE_DIRS}) + include_directories(${SHA2_INCLUDE_DIRS}) + include_directories(${CHROMAPRINT_INCLUDE_DIRS}) + include_directories(${MYGPOQT_INCLUDE_DIRS}) +@@ -297,8 +296,6 @@ + songinfo/artistinfoview.cpp + songinfo/collapsibleinfoheader.cpp + songinfo/collapsibleinfopane.cpp +- songinfo/echonestbiographies.cpp +- songinfo/echonestimages.cpp + songinfo/songinfobase.cpp + songinfo/songinfofetcher.cpp + songinfo/songinfoprovider.cpp +@@ -586,8 +583,6 @@ + songinfo/artistinfoview.h + songinfo/collapsibleinfoheader.h + songinfo/collapsibleinfopane.h +- songinfo/echonestbiographies.h +- songinfo/echonestimages.h + songinfo/songinfobase.h + songinfo/songinfofetcher.h + songinfo/songinfoprovider.h +@@ -822,16 +817,12 @@ + internet/lastfm/lastfmcompat.cpp + internet/lastfm/lastfmservice.cpp + internet/lastfm/lastfmsettingspage.cpp +- songinfo/echonestsimilarartists.cpp +- songinfo/echonesttags.cpp + songinfo/lastfmtrackinfoprovider.cpp + songinfo/tagwidget.cpp + HEADERS + covers/lastfmcoverprovider.h + internet/lastfm/lastfmservice.h + internet/lastfm/lastfmsettingspage.h +- songinfo/echonestsimilarartists.h +- songinfo/echonesttags.h + songinfo/lastfmtrackinfoprovider.h + songinfo/tagwidget.h + UI +@@ -1241,7 +1232,6 @@ + ${TAGLIB_LIBRARIES} + ${MYGPOQT_LIBRARIES} + ${CHROMAPRINT_LIBRARIES} +- ${ECHONEST_LIBRARIES} + ${GOBJECT_LIBRARIES} + ${GLIB_LIBRARIES} + ${GIO_LIBRARIES} +--- Clementine-1.3.1/src/main.cpp ++++ Clementine-1.3.1/src/main.cpp +@@ -76,8 +76,6 @@ + #include <glib.h> + #include <gst/gst.h> + +-#include <echonest/Config.h> +- + #ifdef Q_OS_DARWIN + #include <sys/resource.h> + #include <sys/sysctl.h> +@@ -401,8 +399,8 @@ + // Add root CA cert for SoundCloud, whose certificate is missing on OS X. + QSslSocket::addDefaultCaCertificates( + QSslCertificate::fromPath(":/soundcloud-ca.pem", QSsl::Pem)); +- QSslSocket::addDefaultCaCertificates( +- QSslCertificate::fromPath(":/Equifax_Secure_Certificate_Authority.pem", QSsl::Pem)); ++ QSslSocket::addDefaultCaCertificates(QSslCertificate::fromPath( ++ ":/Equifax_Secure_Certificate_Authority.pem", QSsl::Pem)); + + // Has the user forced a different language? + QString override_language = options.language(); +@@ -440,10 +438,6 @@ + Application app; + app.set_language_name(language); + +- Echonest::Config::instance()->setAPIKey("DFLFLJBUF4EGTXHIG"); +- Echonest::Config::instance()->setNetworkAccessManager( +- new NetworkAccessManager); +- + // Network proxy + QNetworkProxyFactory::setApplicationProxyFactory( + NetworkProxyFactory::Instance()); +--- Clementine-1.3.1/src/songinfo/artistinfoview.cpp ++++ Clementine-1.3.1/src/songinfo/artistinfoview.cpp +@@ -16,25 +16,12 @@ + */ + + #include "artistinfoview.h" +-#include "echonestbiographies.h" +-#include "echonestimages.h" + #include "songinfofetcher.h" + #include "songkickconcerts.h" + #include "widgets/prettyimageview.h" + +-#ifdef HAVE_LIBLASTFM +-#include "echonestsimilarartists.h" +-#include "echonesttags.h" +-#endif +- + ArtistInfoView::ArtistInfoView(QWidget* parent) : SongInfoBase(parent) { +- fetcher_->AddProvider(new EchoNestBiographies); +- fetcher_->AddProvider(new EchoNestImages); + fetcher_->AddProvider(new SongkickConcerts); +-#ifdef HAVE_LIBLASTFM +- fetcher_->AddProvider(new EchoNestSimilarArtists); +- fetcher_->AddProvider(new EchoNestTags); +-#endif + } + + ArtistInfoView::~ArtistInfoView() {} +--- Clementine-1.3.1/src/songinfo/echonestbiographies.cpp ++++ Clementine-1.3.1/src/songinfo/echonestbiographies.cpp +@@ -1,123 +0,0 @@ +-/* This file is part of Clementine. +- Copyright 2010, David Sansome <me@davidsansome.com> +- +- Clementine is free software: you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation, either version 3 of the License, or +- (at your option) any later version. +- +- Clementine is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with Clementine. If not, see <http://www.gnu.org/licenses/>. +-*/ +- +-#include "echonestbiographies.h" +- +-#include <memory> +- +-#include <echonest/Artist.h> +- +-#include "songinfotextview.h" +-#include "core/logging.h" +-#include "ui/iconloader.h" +- +-struct EchoNestBiographies::Request { +- Request(int id) : id_(id), artist_(new Echonest::Artist) {} +- +- int id_; +- std::unique_ptr<Echonest::Artist> artist_; +-}; +- +-EchoNestBiographies::EchoNestBiographies() { +- site_relevance_["wikipedia"] = 100; +- site_relevance_["lastfm"] = 60; +- site_relevance_["amazon"] = 30; +- +- site_icons_["amazon"] = IconLoader::Load("amazon", IconLoader::Provider); +- site_icons_["aol"] = IconLoader::Load("aol", IconLoader::Provider); +- site_icons_["cdbaby"] = IconLoader::Load("cdbaby", IconLoader::Provider); +- site_icons_["lastfm"] = IconLoader::Load("as", IconLoader::Lastfm); +- site_icons_["mog"] = IconLoader::Load("mog", IconLoader::Provider); +- site_icons_["mtvmusic"] = IconLoader::Load("mtvmusic", IconLoader::Provider); +- site_icons_["myspace"] = IconLoader::Load("myspace", IconLoader::Provider); +- site_icons_["wikipedia"] = IconLoader::Load("wikipedia", IconLoader::Provider); +-} +- +-void EchoNestBiographies::FetchInfo(int id, const Song& metadata) { +- std::shared_ptr<Request> request(new Request(id)); +- request->artist_->setName(metadata.artist()); +- +- QNetworkReply* reply = request->artist_->fetchBiographies(); +- connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); +- requests_[reply] = request; +-} +- +-void EchoNestBiographies::RequestFinished() { +- QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender()); +- if (!reply || !requests_.contains(reply)) return; +- reply->deleteLater(); +- +- RequestPtr request = requests_.take(reply); +- +- try { +- request->artist_->parseProfile(reply); +- } +- catch (Echonest::ParseError e) { +- qLog(Warning) << "Error parsing echonest reply:" << e.errorType() +- << e.what(); +- } +- +- QSet<QString> already_seen; +- +- for (const Echonest::Biography& bio : request->artist_->biographies()) { +- QString canonical_site = bio.site().toLower(); +- canonical_site.replace(QRegExp("[^a-z]"), ""); +- +- if (already_seen.contains(canonical_site)) continue; +- already_seen.insert(canonical_site); +- +- CollapsibleInfoPane::Data data; +- data.id_ = "echonest/bio/" + bio.site(); +- data.title_ = tr("Biography from %1").arg(bio.site()); +- data.type_ = CollapsibleInfoPane::Data::Type_Biography; +- +- if (site_relevance_.contains(canonical_site)) +- data.relevance_ = site_relevance_[canonical_site]; +- if (site_icons_.contains(canonical_site)) +- data.icon_ = site_icons_[canonical_site]; +- +- SongInfoTextView* editor = new SongInfoTextView; +- QString text; +- // Add a link to the bio webpage at the top if we have one +- if (!bio.url().isEmpty()) { +- QString bio_url = bio.url().toEncoded(); +- if (bio.site() == "facebook") { +- bio_url.replace("graph.facebook.com", "www.facebook.com"); +- } +- text += "<p><a href=\"" + bio_url + "\">" + +- tr("Open in your browser") + "</a></p>"; +- } +- +- text += bio.text(); +- if (bio.site() == "last.fm") { +- // Echonest lost formatting and it seems there is currently no plans on +- // Echonest side for changing this. +- // But with last.fm, we can guess newlines: " " corresponds to a newline +- // (this seems to be because on last.fm' website, extra blank is inserted +- // before <br /> tag, and this blank is kept). +- // This is tricky, but this make the display nicer for last.fm +- // biographies. +- text.replace(" ", "<p>"); +- } +- editor->SetHtml(text); +- data.contents_ = editor; +- +- emit InfoReady(request->id_, data); +- } +- +- emit Finished(request->id_); +-} +--- Clementine-1.3.1/src/songinfo/echonestbiographies.h ++++ Clementine-1.3.1/src/songinfo/echonestbiographies.h +@@ -1,48 +0,0 @@ +-/* This file is part of Clementine. +- Copyright 2010, David Sansome <me@davidsansome.com> +- +- Clementine is free software: you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation, either version 3 of the License, or +- (at your option) any later version. +- +- Clementine is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with Clementine. If not, see <http://www.gnu.org/licenses/>. +-*/ +- +-#ifndef ECHONESTBIOGRAPHIES_H +-#define ECHONESTBIOGRAPHIES_H +- +-#include <memory> +- +-#include "songinfoprovider.h" +- +-class QNetworkReply; +- +-class EchoNestBiographies : public SongInfoProvider { +- Q_OBJECT +- +- public: +- EchoNestBiographies(); +- +- void FetchInfo(int id, const Song& metadata); +- +- private slots: +- void RequestFinished(); +- +- private: +- QMap<QString, int> site_relevance_; +- QMap<QString, QIcon> site_icons_; +- +- struct Request; +- typedef std::shared_ptr<Request> RequestPtr; +- +- QMap<QNetworkReply*, RequestPtr> requests_; +-}; +- +-#endif // ECHONESTBIOGRAPHIES_H +--- Clementine-1.3.1/src/songinfo/echonestsimilarartists.cpp ++++ Clementine-1.3.1/src/songinfo/echonestsimilarartists.cpp +@@ -1,76 +0,0 @@ +-/* This file is part of Clementine. +- Copyright 2010, David Sansome <me@davidsansome.com> +- +- Clementine is free software: you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation, either version 3 of the License, or +- (at your option) any later version. +- +- Clementine is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with Clementine. If not, see <http://www.gnu.org/licenses/>. +-*/ +- +-#include "echonestsimilarartists.h" +-#include "tagwidget.h" +-#include "core/logging.h" +-#include "ui/iconloader.h" +- +-#include <echonest/Artist.h> +- +-Q_DECLARE_METATYPE(QVector<QString>); +- +-void EchoNestSimilarArtists::FetchInfo(int id, const Song& metadata) { +- using Echonest::Artist; +- +- Artist::SearchParams params; +- params << Artist::SearchParamEntry(Artist::Name, metadata.artist()); +- params << Artist::SearchParamEntry(Artist::MinHotttnesss, 0.5); +- +- QNetworkReply* reply = Echonest::Artist::fetchSimilar(params); +- connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); +- requests_[reply] = id; +-} +- +-void EchoNestSimilarArtists::RequestFinished() { +- QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender()); +- if (!reply || !requests_.contains(reply)) return; +- reply->deleteLater(); +- +- int id = requests_.take(reply); +- +- Echonest::Artists artists; +- try { +- artists = Echonest::Artist::parseSimilar(reply); +- } +- catch (Echonest::ParseError e) { +- qLog(Warning) << "Error parsing echonest reply:" << e.errorType() +- << e.what(); +- } +- +- if (!artists.isEmpty()) { +- CollapsibleInfoPane::Data data; +- data.id_ = "echonest/similarartists"; +- data.title_ = tr("Similar artists"); +- data.type_ = CollapsibleInfoPane::Data::Type_Similar; +- data.icon_ = IconLoader::Load("echonest", IconLoader::Provider); +- +- TagWidget* widget = new TagWidget(TagWidget::Type_Artists); +- data.contents_ = widget; +- +- widget->SetIcon(IconLoader::Load("x-clementine-artist", IconLoader::Base)); +- +- for (const Echonest::Artist& artist : artists) { +- widget->AddTag(artist.name()); +- if (widget->count() >= 10) break; +- } +- +- emit InfoReady(id, data); +- } +- +- emit Finished(id); +-} +--- Clementine-1.3.1/src/songinfo/echonestsimilarartists.h ++++ Clementine-1.3.1/src/songinfo/echonestsimilarartists.h +@@ -1,38 +0,0 @@ +-/* This file is part of Clementine. +- Copyright 2010, David Sansome <me@davidsansome.com> +- +- Clementine is free software: you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation, either version 3 of the License, or +- (at your option) any later version. +- +- Clementine is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with Clementine. If not, see <http://www.gnu.org/licenses/>. +-*/ +- +-#ifndef ECHONESTSIMILARARTISTS_H +-#define ECHONESTSIMILARARTISTS_H +- +-#include "songinfoprovider.h" +- +-class QNetworkReply; +- +-class EchoNestSimilarArtists : public SongInfoProvider { +- Q_OBJECT +- +- public: +- void FetchInfo(int id, const Song& metadata); +- +- private slots: +- void RequestFinished(); +- +- private: +- QMap<QNetworkReply*, int> requests_; +-}; +- +-#endif // ECHONESTSIMILARARTISTS_H +--- Clementine-1.3.1/src/songinfo/echonesttags.cpp ++++ Clementine-1.3.1/src/songinfo/echonesttags.cpp +@@ -1,80 +0,0 @@ +-/* This file is part of Clementine. +- Copyright 2010, David Sansome <me@davidsansome.com> +- +- Clementine is free software: you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation, either version 3 of the License, or +- (at your option) any later version. +- +- Clementine is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with Clementine. If not, see <http://www.gnu.org/licenses/>. +-*/ +- +-#include "echonesttags.h" +- +-#include <memory> +- +-#include <echonest/Artist.h> +- +-#include "tagwidget.h" +-#include "core/logging.h" +-#include "ui/iconloader.h" +- +-struct EchoNestTags::Request { +- Request(int id) : id_(id), artist_(new Echonest::Artist) {} +- +- int id_; +- std::unique_ptr<Echonest::Artist> artist_; +-}; +- +-void EchoNestTags::FetchInfo(int id, const Song& metadata) { +- std::shared_ptr<Request> request(new Request(id)); +- request->artist_->setName(metadata.artist()); +- +- QNetworkReply* reply = request->artist_->fetchTerms(); +- connect(reply, SIGNAL(finished()), SLOT(RequestFinished())); +- requests_[reply] = request; +-} +- +-void EchoNestTags::RequestFinished() { +- QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender()); +- if (!reply || !requests_.contains(reply)) return; +- reply->deleteLater(); +- +- RequestPtr request = requests_.take(reply); +- +- try { +- request->artist_->parseProfile(reply); +- } +- catch (Echonest::ParseError e) { +- qLog(Warning) << "Error parsing echonest reply:" << e.errorType() +- << e.what(); +- } +- +- if (!request->artist_->terms().isEmpty()) { +- CollapsibleInfoPane::Data data; +- data.id_ = "echonest/artisttags"; +- data.title_ = tr("Artist tags"); +- data.type_ = CollapsibleInfoPane::Data::Type_Tags; +- data.icon_ = IconLoader::Load("icon_tag", IconLoader::Lastfm); +- +- TagWidget* widget = new TagWidget(TagWidget::Type_Tags); +- data.contents_ = widget; +- +- widget->SetIcon(data.icon_); +- +- for (const Echonest::Term& term : request->artist_->terms()) { +- widget->AddTag(term.name()); +- if (widget->count() >= 10) break; +- } +- +- emit InfoReady(request->id_, data); +- } +- +- emit Finished(request->id_); +-} +--- Clementine-1.3.1/src/songinfo/echonesttags.h ++++ Clementine-1.3.1/src/songinfo/echonesttags.h +@@ -1,43 +0,0 @@ +-/* This file is part of Clementine. +- Copyright 2010, David Sansome <me@davidsansome.com> +- +- Clementine is free software: you can redistribute it and/or modify +- it under the terms of the GNU General Public License as published by +- the Free Software Foundation, either version 3 of the License, or +- (at your option) any later version. +- +- Clementine is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- GNU General Public License for more details. +- +- You should have received a copy of the GNU General Public License +- along with Clementine. If not, see <http://www.gnu.org/licenses/>. +-*/ +- +-#ifndef ECHONESTTAGS_H +-#define ECHONESTTAGS_H +- +-#include <memory> +- +-#include "songinfoprovider.h" +- +-class QNetworkReply; +- +-class EchoNestTags : public SongInfoProvider { +- Q_OBJECT +- +- public: +- void FetchInfo(int id, const Song& metadata); +- +- private slots: +- void RequestFinished(); +- +- private: +- struct Request; +- typedef std::shared_ptr<Request> RequestPtr; +- +- QMap<QNetworkReply*, RequestPtr> requests_; +-}; +- +-#endif // ECHONESTTAGS_H +--- Clementine-1.3.1/src/songinfo/songkickconcerts.cpp ++++ Clementine-1.3.1/src/songinfo/songkickconcerts.cpp +@@ -21,9 +21,6 @@ + #include <QVBoxLayout> + #include <QXmlStreamWriter> + +-#include <echonest/Artist.h> +-#include <echonest/TypeInformation.h> +- + #include <qjson/parser.h> + + #include "core/closure.h" +@@ -31,77 +28,64 @@ + #include "songkickconcertwidget.h" + #include "ui/iconloader.h" + +-const char* SongkickConcerts::kSongkickArtistBucket = "songkick"; +-const char* SongkickConcerts::kSongkickArtistCalendarUrl = +- "https://api.songkick.com/api/3.0/artists/%1/calendar.json?" +- "per_page=5&" +- "apikey=8rgKfy1WU6IlJFfN"; ++namespace { ++const char* kSongkickArtistCalendarUrl = ++ "https://api.songkick.com/api/3.0/artists/%1/calendar.json"; ++const char* kSongkickArtistSearchUrl = ++ "https://api.songkick.com/api/3.0/search/artists.json"; ++const char* kSongkickApiKey = "8rgKfy1WU6IlJFfN"; ++} // namespace + + SongkickConcerts::SongkickConcerts() { + Geolocator* geolocator = new Geolocator; + geolocator->Geolocate(); + connect(geolocator, SIGNAL(Finished(Geolocator::LatLng)), + SLOT(GeolocateFinished(Geolocator::LatLng))); +- NewClosure(geolocator, SIGNAL(Finished(Geolocator::LatLng)), geolocator, +- SLOT(deleteLater())); ++ connect(geolocator, SIGNAL(Finished(Geolocator::LatLng)), geolocator, ++ SLOT(deleteLater())); + } + + void SongkickConcerts::FetchInfo(int id, const Song& metadata) { +- Echonest::Artist::SearchParams params; +- params.push_back( +- qMakePair(Echonest::Artist::Name, QVariant(metadata.artist()))); +- qLog(Debug) << "Params:" << params; +- QNetworkReply* reply = Echonest::Artist::search( +- params, +- Echonest::ArtistInformation(Echonest::ArtistInformation::NoInformation, +- QStringList() << kSongkickArtistBucket)); +- qLog(Debug) << reply->request().url(); ++ if (metadata.artist().isEmpty()) { ++ emit Finished(id); ++ return; ++ } ++ ++ QUrl url(kSongkickArtistSearchUrl); ++ url.addQueryItem("apikey", kSongkickApiKey); ++ url.addQueryItem("query", metadata.artist()); ++ ++ QNetworkRequest request(url); ++ QNetworkReply* reply = network_.get(request); + NewClosure(reply, SIGNAL(finished()), this, + SLOT(ArtistSearchFinished(QNetworkReply*, int)), reply, id); + } + + void SongkickConcerts::ArtistSearchFinished(QNetworkReply* reply, int id) { + reply->deleteLater(); +- try { +- Echonest::Artists artists = Echonest::Artist::parseSearch(reply); +- if (artists.isEmpty()) { +- qLog(Debug) << "Failed to find artist in echonest"; +- emit Finished(id); +- return; +- } +- +- const Echonest::Artist& artist = artists[0]; +- const Echonest::ForeignIds& foreign_ids = artist.foreignIds(); +- QString songkick_id; +- for (const Echonest::ForeignId& id : foreign_ids) { +- if (id.catalog == "songkick") { +- songkick_id = id.foreign_id; +- break; +- } +- } +- +- if (songkick_id.isEmpty()) { +- qLog(Debug) << "Failed to fetch songkick foreign id for artist"; +- emit Finished(id); +- return; +- } +- +- QStringList split = songkick_id.split(':'); +- if (split.count() != 3) { +- qLog(Error) << "Weird songkick id"; +- emit Finished(id); +- return; +- } +- +- FetchSongkickCalendar(split[2], id); +- } catch (Echonest::ParseError& e) { +- qLog(Error) << "Error parsing echonest reply:" << e.errorType() << e.what(); ++ ++ QJson::Parser parser; ++ QVariantMap json = parser.parse(reply).toMap(); ++ ++ QVariantMap results_page = json["resultsPage"].toMap(); ++ QVariantMap results = results_page["results"].toMap(); ++ QVariantList artists = results["artist"].toList(); ++ ++ if (artists.isEmpty()) { + emit Finished(id); ++ return; + } ++ ++ QVariantMap artist = artists.first().toMap(); ++ QString artist_id = artist["id"].toString(); ++ ++ FetchSongkickCalendar(artist_id, id); + } + + void SongkickConcerts::FetchSongkickCalendar(const QString& artist_id, int id) { + QUrl url(QString(kSongkickArtistCalendarUrl).arg(artist_id)); ++ url.addQueryItem("per_page", "5"); ++ url.addQueryItem("apikey", kSongkickApiKey); + qLog(Debug) << url; + QNetworkReply* reply = network_.get(QNetworkRequest(url)); + NewClosure(reply, SIGNAL(finished()), this, +--- Clementine-1.3.1/src/songinfo/songkickconcerts.h ++++ Clementine-1.3.1/src/songinfo/songkickconcerts.h +@@ -44,9 +44,6 @@ + + NetworkAccessManager network_; + Geolocator::LatLng latlng_; +- +- static const char* kSongkickArtistBucket; +- static const char* kSongkickArtistCalendarUrl; + }; + + #endif |