Merge pull request #5319 from clementine-player/revert-5270-master
Revert "Adding support for subsonic cover art download"
This commit is contained in:
commit
d3285372e0
@ -35,15 +35,13 @@
|
|||||||
#include "core/utilities.h"
|
#include "core/utilities.h"
|
||||||
#include "internet/core/internetmodel.h"
|
#include "internet/core/internetmodel.h"
|
||||||
#include "internet/spotify/spotifyservice.h"
|
#include "internet/spotify/spotifyservice.h"
|
||||||
#include "internet/subsonic/subsonicservice.h"
|
|
||||||
|
|
||||||
AlbumCoverLoader::AlbumCoverLoader(QObject* parent)
|
AlbumCoverLoader::AlbumCoverLoader(QObject* parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
stop_requested_(false),
|
stop_requested_(false),
|
||||||
next_id_(1),
|
next_id_(1),
|
||||||
network_(new NetworkAccessManager(this)),
|
network_(new NetworkAccessManager(this)),
|
||||||
connected_spotify_(false),
|
connected_spotify_(false) {}
|
||||||
connected_subsonic_(false) {}
|
|
||||||
|
|
||||||
QString AlbumCoverLoader::ImageCacheDir() {
|
QString AlbumCoverLoader::ImageCacheDir() {
|
||||||
return Utilities::GetConfigPath(Utilities::Path_AlbumCovers);
|
return Utilities::GetConfigPath(Utilities::Path_AlbumCovers);
|
||||||
@ -198,26 +196,6 @@ AlbumCoverLoader::TryLoadResult AlbumCoverLoader::TryLoadImage(
|
|||||||
QMetaObject::invokeMethod(spotify, "LoadImage", Qt::QueuedConnection,
|
QMetaObject::invokeMethod(spotify, "LoadImage", Qt::QueuedConnection,
|
||||||
Q_ARG(QString, id));
|
Q_ARG(QString, id));
|
||||||
return TryLoadResult(true, false, QImage());
|
return TryLoadResult(true, false, QImage());
|
||||||
} else if (filename.toLower().startsWith("subsonic://image/")) {
|
|
||||||
// HACK: we should add generic image URL handlers
|
|
||||||
SubsonicService* subsonic = InternetModel::Service<SubsonicService>();
|
|
||||||
|
|
||||||
if (!connected_subsonic_) {
|
|
||||||
connect(subsonic, SIGNAL(ImageLoaded(QString, QImage)),
|
|
||||||
SLOT(SubsonicImageLoaded(QString, QImage)));
|
|
||||||
connected_subsonic_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString id = QUrl(filename).path();
|
|
||||||
if (id.startsWith('/')) {
|
|
||||||
id.remove(0, 1);
|
|
||||||
}
|
|
||||||
remote_subsonic_tasks_.insert(id, task);
|
|
||||||
|
|
||||||
// Need to schedule this in the subsonic service's thread
|
|
||||||
QMetaObject::invokeMethod(subsonic, "LoadImage", Qt::QueuedConnection,
|
|
||||||
Q_ARG(QString, id));
|
|
||||||
return TryLoadResult(true, false, QImage());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QImage image(filename);
|
QImage image(filename);
|
||||||
@ -236,16 +214,6 @@ void AlbumCoverLoader::SpotifyImageLoaded(const QString& id,
|
|||||||
emit ImageLoaded(task.id, scaled, image);
|
emit ImageLoaded(task.id, scaled, image);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AlbumCoverLoader::SubsonicImageLoaded(const QString& id,
|
|
||||||
const QImage& image) {
|
|
||||||
if (!remote_subsonic_tasks_.contains(id)) return;
|
|
||||||
|
|
||||||
Task task = remote_subsonic_tasks_.take(id);
|
|
||||||
QImage scaled = ScaleAndPad(task.options, image);
|
|
||||||
emit ImageLoaded(task.id, scaled);
|
|
||||||
emit ImageLoaded(task.id, scaled, image);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AlbumCoverLoader::RemoteFetchFinished(QNetworkReply* reply) {
|
void AlbumCoverLoader::RemoteFetchFinished(QNetworkReply* reply) {
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
|
|
||||||
|
@ -67,7 +67,6 @@ class AlbumCoverLoader : public QObject {
|
|||||||
void ProcessTasks();
|
void ProcessTasks();
|
||||||
void RemoteFetchFinished(QNetworkReply* reply);
|
void RemoteFetchFinished(QNetworkReply* reply);
|
||||||
void SpotifyImageLoaded(const QString& url, const QImage& image);
|
void SpotifyImageLoaded(const QString& url, const QImage& image);
|
||||||
void SubsonicImageLoaded(const QString& url, const QImage& image);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
enum State { State_TryingManual, State_TryingAuto, };
|
enum State { State_TryingManual, State_TryingAuto, };
|
||||||
@ -105,13 +104,11 @@ class AlbumCoverLoader : public QObject {
|
|||||||
QQueue<Task> tasks_;
|
QQueue<Task> tasks_;
|
||||||
QMap<QNetworkReply*, Task> remote_tasks_;
|
QMap<QNetworkReply*, Task> remote_tasks_;
|
||||||
QMap<QString, Task> remote_spotify_tasks_;
|
QMap<QString, Task> remote_spotify_tasks_;
|
||||||
QMap<QString, Task> remote_subsonic_tasks_;
|
|
||||||
quint64 next_id_;
|
quint64 next_id_;
|
||||||
|
|
||||||
NetworkAccessManager* network_;
|
NetworkAccessManager* network_;
|
||||||
|
|
||||||
bool connected_spotify_;
|
bool connected_spotify_;
|
||||||
bool connected_subsonic_;
|
|
||||||
|
|
||||||
static const int kMaxRedirects = 3;
|
static const int kMaxRedirects = 3;
|
||||||
};
|
};
|
||||||
|
@ -59,7 +59,6 @@ const char* SubsonicService::kSongsTable = "subsonic_songs";
|
|||||||
const char* SubsonicService::kFtsTable = "subsonic_songs_fts";
|
const char* SubsonicService::kFtsTable = "subsonic_songs_fts";
|
||||||
|
|
||||||
const int SubsonicService::kMaxRedirects = 10;
|
const int SubsonicService::kMaxRedirects = 10;
|
||||||
const int SubsonicService::kCoverArtSize = 1024;
|
|
||||||
|
|
||||||
SubsonicService::SubsonicService(Application* app, InternetModel* parent)
|
SubsonicService::SubsonicService(Application* app, InternetModel* parent)
|
||||||
: InternetService(kServiceName, app, parent, parent),
|
: InternetService(kServiceName, app, parent, parent),
|
||||||
@ -491,7 +490,7 @@ void SubsonicLibraryScanner::OnGetAlbumListFinished(QNetworkReply* reply,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SubsonicLibraryScanner::OnGetAlbumFinished(QNetworkReply* reply, QString albumid) {
|
void SubsonicLibraryScanner::OnGetAlbumFinished(QNetworkReply* reply) {
|
||||||
reply->deleteLater();
|
reply->deleteLater();
|
||||||
pending_requests_.remove(reply);
|
pending_requests_.remove(reply);
|
||||||
|
|
||||||
@ -535,7 +534,6 @@ void SubsonicLibraryScanner::OnGetAlbumFinished(QNetworkReply* reply, QString al
|
|||||||
song.set_bitrate(reader.attributes().value("bitRate").toString().toInt());
|
song.set_bitrate(reader.attributes().value("bitRate").toString().toInt());
|
||||||
song.set_year(reader.attributes().value("year").toString().toInt());
|
song.set_year(reader.attributes().value("year").toString().toInt());
|
||||||
song.set_genre(reader.attributes().value("genre").toString());
|
song.set_genre(reader.attributes().value("genre").toString());
|
||||||
song.set_art_automatic(QString("subsonic://image/%1").arg(albumid));
|
|
||||||
qint64 length = reader.attributes().value("duration").toString().toInt();
|
qint64 length = reader.attributes().value("duration").toString().toInt();
|
||||||
length *= kNsecPerSec;
|
length *= kNsecPerSec;
|
||||||
song.set_length_nanosec(length);
|
song.set_length_nanosec(length);
|
||||||
@ -568,15 +566,6 @@ void SubsonicLibraryScanner::OnGetAlbumFinished(QNetworkReply* reply, QString al
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SubsonicLibraryScanner::OnGetAlbumCoverFinished(QNetworkReply* reply, QString albumid) {
|
|
||||||
reply->deleteLater();
|
|
||||||
pending_requests_.remove(reply);
|
|
||||||
|
|
||||||
QByteArray image = reply->readAll();
|
|
||||||
|
|
||||||
service_->EmitImageLoaded(albumid, QImage::fromData(image));
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubsonicLibraryScanner::GetAlbumList(int offset) {
|
void SubsonicLibraryScanner::GetAlbumList(int offset) {
|
||||||
QUrl url = service_->BuildRequestUrl("getAlbumList2");
|
QUrl url = service_->BuildRequestUrl("getAlbumList2");
|
||||||
url.addQueryItem("type", "alphabeticalByName");
|
url.addQueryItem("type", "alphabeticalByName");
|
||||||
@ -587,24 +576,6 @@ void SubsonicLibraryScanner::GetAlbumList(int offset) {
|
|||||||
SLOT(OnGetAlbumListFinished(QNetworkReply*, int)), reply, offset);
|
SLOT(OnGetAlbumListFinished(QNetworkReply*, int)), reply, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SubsonicLibraryScanner::GetAlbumCover(const QString& id) {
|
|
||||||
QUrl url = service_->BuildRequestUrl("getCoverArt");
|
|
||||||
url.addQueryItem("id", id);
|
|
||||||
url.addQueryItem("size", QString::number(kCoverArtSize));
|
|
||||||
QNetworkReply* reply = service_->Send(url);
|
|
||||||
NewClosure(reply, SIGNAL(finished()), this,
|
|
||||||
SLOT(OnGetAlbumCoverFinished(QNetworkReply*,QString)), reply, id);
|
|
||||||
pending_requests_.insert(reply);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubsonicService::LoadImage(const QString& id) {
|
|
||||||
scanner_->GetAlbumCover(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubsonicService::EmitImageLoaded(const QString& id, const QImage& image) {
|
|
||||||
emit ImageLoaded(id, image);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SubsonicLibraryScanner::GetAlbum(const QString& id) {
|
void SubsonicLibraryScanner::GetAlbum(const QString& id) {
|
||||||
QUrl url = service_->BuildRequestUrl("getAlbum");
|
QUrl url = service_->BuildRequestUrl("getAlbum");
|
||||||
url.addQueryItem("id", id);
|
url.addQueryItem("id", id);
|
||||||
@ -613,7 +584,7 @@ void SubsonicLibraryScanner::GetAlbum(const QString& id) {
|
|||||||
}
|
}
|
||||||
QNetworkReply* reply = service_->Send(url);
|
QNetworkReply* reply = service_->Send(url);
|
||||||
NewClosure(reply, SIGNAL(finished()), this,
|
NewClosure(reply, SIGNAL(finished()), this,
|
||||||
SLOT(OnGetAlbumFinished(QNetworkReply*, QString)), reply, id);
|
SLOT(OnGetAlbumFinished(QNetworkReply*)), reply);
|
||||||
pending_requests_.insert(reply);
|
pending_requests_.insert(reply);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,9 +101,6 @@ class SubsonicService : public InternetService {
|
|||||||
|
|
||||||
LoginState login_state() const { return login_state_; }
|
LoginState login_state() const { return login_state_; }
|
||||||
|
|
||||||
Q_INVOKABLE void LoadImage(const QString& id);
|
|
||||||
void EmitImageLoaded(const QString& id, const QImage& image);
|
|
||||||
|
|
||||||
// Subsonic API methods
|
// Subsonic API methods
|
||||||
void Ping();
|
void Ping();
|
||||||
|
|
||||||
@ -128,7 +125,6 @@ class SubsonicService : public InternetService {
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void LoginStateChanged(SubsonicService::LoginState newstate);
|
void LoginStateChanged(SubsonicService::LoginState newstate);
|
||||||
void ImageLoaded(const QString& id, const QImage& image);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void EnsureMenuCreated();
|
void EnsureMenuCreated();
|
||||||
@ -186,8 +182,6 @@ class SubsonicLibraryScanner : public QObject {
|
|||||||
static const int kAlbumChunkSize;
|
static const int kAlbumChunkSize;
|
||||||
static const int kConcurrentRequests;
|
static const int kConcurrentRequests;
|
||||||
|
|
||||||
void GetAlbumCover(const QString& id);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void ScanFinished();
|
void ScanFinished();
|
||||||
|
|
||||||
@ -195,8 +189,7 @@ signals:
|
|||||||
// Step 1: use getAlbumList2 type=alphabeticalByName to list all albums
|
// Step 1: use getAlbumList2 type=alphabeticalByName to list all albums
|
||||||
void OnGetAlbumListFinished(QNetworkReply* reply, int offset);
|
void OnGetAlbumListFinished(QNetworkReply* reply, int offset);
|
||||||
// Step 2: use getAlbum id=? to list all songs for each album
|
// Step 2: use getAlbum id=? to list all songs for each album
|
||||||
void OnGetAlbumFinished(QNetworkReply* reply, QString albumid);
|
void OnGetAlbumFinished(QNetworkReply* reply);
|
||||||
void OnGetAlbumCoverFinished(QNetworkReply* reply, QString albumid);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void GetAlbumList(int offset);
|
void GetAlbumList(int offset);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user