clementine/clementine-1.3.1-remove-echonest-2.patch
Andrey Bondrov e11e723da7 Add upstream patches to fix artist info page (drop dead echonest support etc)
Don't build vk.com support as external players are no longer supported by vk.com
2017-08-09 15:07:13 +10:00

743 lines
24 KiB
Diff

From a8a0f2e4fdd3d4b2fd23b8628a3abc27c290d01d Mon Sep 17 00:00:00 2001
From: John Maguire <john.maguire@gmail.com>
Date: Mon, 27 Jun 2016 14:45:40 +0100
Subject: [PATCH] Remove echonest and update songkick concert fetcher.
#5416
---
CMakeLists.txt | 3 -
src/CMakeLists.txt | 8 ---
src/main.cpp | 10 +--
src/songinfo/artistinfoview.cpp | 11 ---
src/songinfo/echonestbiographies.cpp | 123 --------------------------------
src/songinfo/echonestbiographies.h | 48 -------------
src/songinfo/echonestsimilarartists.cpp | 76 --------------------
src/songinfo/echonestsimilarartists.h | 38 ----------
src/songinfo/echonesttags.cpp | 80 ---------------------
src/songinfo/echonesttags.h | 43 -----------
src/songinfo/songkickconcerts.cpp | 84 +++++++++-------------
src/songinfo/songkickconcerts.h | 3 -
12 files changed, 36 insertions(+), 491 deletions(-)
delete mode 100644 src/songinfo/echonestbiographies.cpp
delete mode 100644 src/songinfo/echonestbiographies.h
delete mode 100644 src/songinfo/echonestsimilarartists.cpp
delete mode 100644 src/songinfo/echonestsimilarartists.h
delete mode 100644 src/songinfo/echonesttags.cpp
delete mode 100644 src/songinfo/echonesttags.h
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6f21ce11a..6d8a0903a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -364,9 +364,6 @@ else (USE_SYSTEM_QXT)
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)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 8cb0706fa..99d1a3155 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -35,7 +35,6 @@ include_directories(${LIBPROJECTM_INCLUDE_DIRS})
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})
@@ -301,7 +300,6 @@ set(SOURCES
songinfo/artistinfoview.cpp
songinfo/collapsibleinfoheader.cpp
songinfo/collapsibleinfopane.cpp
- songinfo/echonestbiographies.cpp
songinfo/songinfobase.cpp
songinfo/songinfofetcher.cpp
songinfo/songinfoprovider.cpp
@@ -593,7 +591,6 @@ set(HEADERS
songinfo/artistinfoview.h
songinfo/collapsibleinfoheader.h
songinfo/collapsibleinfopane.h
- songinfo/echonestbiographies.h
songinfo/songinfobase.h
songinfo/songinfofetcher.h
songinfo/songinfoprovider.h
@@ -830,16 +827,12 @@ optional_source(HAVE_LIBLASTFM
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
@@ -1254,7 +1247,6 @@ target_link_libraries(clementine_lib
${TAGLIB_LIBRARIES}
${MYGPOQT_LIBRARIES}
${CHROMAPRINT_LIBRARIES}
- ${ECHONEST_LIBRARIES}
${GOBJECT_LIBRARIES}
${GLIB_LIBRARIES}
${GIO_LIBRARIES}
diff --git a/src/main.cpp b/src/main.cpp
index e40e52e7e..0964a2031 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -73,8 +73,6 @@
#include <glib.h>
#include <gst/gst.h>
-#include <echonest/Config.h>
-
#ifdef Q_OS_DARWIN
#include <sys/resource.h>
#include <sys/sysctl.h>
@@ -398,8 +396,8 @@ int main(int argc, char* argv[]) {
// 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();
@@ -437,10 +435,6 @@ int main(int argc, char* argv[]) {
Application app;
app.set_language_name(language);
- Echonest::Config::instance()->setAPIKey("DFLFLJBUF4EGTXHIG");
- Echonest::Config::instance()->setNetworkAccessManager(
- new NetworkAccessManager);
-
// Network proxy
QNetworkProxyFactory::setApplicationProxyFactory(
NetworkProxyFactory::Instance());
diff --git a/src/songinfo/artistinfoview.cpp b/src/songinfo/artistinfoview.cpp
index e1fc5a18c..3ee92784d 100644
--- a/src/songinfo/artistinfoview.cpp
+++ b/src/songinfo/artistinfoview.cpp
@@ -17,25 +17,14 @@
#include "artistinfoview.h"
-#include "songinfo/echonestbiographies.h"
#include "songinfo/songinfofetcher.h"
#include "songinfo/songkickconcerts.h"
#include "songinfo/spotifyimages.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 SongkickConcerts);
fetcher_->AddProvider(new SpotifyImages);
-#ifdef HAVE_LIBLASTFM
- fetcher_->AddProvider(new EchoNestSimilarArtists);
- fetcher_->AddProvider(new EchoNestTags);
-#endif
}
ArtistInfoView::~ArtistInfoView() {}
diff --git a/src/songinfo/echonestbiographies.cpp b/src/songinfo/echonestbiographies.cpp
deleted file mode 100644
index cd345e48e..000000000
--- a/src/songinfo/echonestbiographies.cpp
+++ /dev/null
@@ -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_);
-}
diff --git a/src/songinfo/echonestbiographies.h b/src/songinfo/echonestbiographies.h
deleted file mode 100644
index 2429bce58..000000000
--- a/src/songinfo/echonestbiographies.h
+++ /dev/null
@@ -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
diff --git a/src/songinfo/echonestsimilarartists.cpp b/src/songinfo/echonestsimilarartists.cpp
deleted file mode 100644
index af62ff2c1..000000000
--- a/src/songinfo/echonestsimilarartists.cpp
+++ /dev/null
@@ -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);
-}
diff --git a/src/songinfo/echonestsimilarartists.h b/src/songinfo/echonestsimilarartists.h
deleted file mode 100644
index f78fa544f..000000000
--- a/src/songinfo/echonestsimilarartists.h
+++ /dev/null
@@ -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
diff --git a/src/songinfo/echonesttags.cpp b/src/songinfo/echonesttags.cpp
deleted file mode 100644
index 232ec5191..000000000
--- a/src/songinfo/echonesttags.cpp
+++ /dev/null
@@ -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_);
-}
diff --git a/src/songinfo/echonesttags.h b/src/songinfo/echonesttags.h
deleted file mode 100644
index 5776f3e00..000000000
--- a/src/songinfo/echonesttags.h
+++ /dev/null
@@ -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
diff --git a/src/songinfo/songkickconcerts.cpp b/src/songinfo/songkickconcerts.cpp
index 4bb218fea..043ddb4bc 100644
--- a/src/songinfo/songkickconcerts.cpp
+++ b/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;
- }
+ QJson::Parser parser;
+ QVariantMap json = parser.parse(reply).toMap();
- QStringList split = songkick_id.split(':');
- if (split.count() != 3) {
- qLog(Error) << "Weird songkick id";
- emit Finished(id);
- return;
- }
+ QVariantMap results_page = json["resultsPage"].toMap();
+ QVariantMap results = results_page["results"].toMap();
+ QVariantList artists = results["artist"].toList();
- FetchSongkickCalendar(split[2], id);
- } catch (Echonest::ParseError& e) {
- qLog(Error) << "Error parsing echonest reply:" << e.errorType() << e.what();
+ 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,
diff --git a/src/songinfo/songkickconcerts.h b/src/songinfo/songkickconcerts.h
index 606909f26..66cd484a5 100644
--- a/src/songinfo/songkickconcerts.h
+++ b/src/songinfo/songkickconcerts.h
@@ -44,9 +44,6 @@ class SongkickConcerts : public SongInfoProvider {
NetworkAccessManager network_;
Geolocator::LatLng latlng_;
-
- static const char* kSongkickArtistBucket;
- static const char* kSongkickArtistCalendarUrl;
};
#endif