Cache SubsonicService in SubsonicDynamicPlaylist

This commit is contained in:
Sophie Tauchert 2020-04-10 23:09:00 +02:00 committed by John Maguire
parent 69801a9e2a
commit 38a5d183c2
2 changed files with 22 additions and 25 deletions

View File

@ -40,13 +40,16 @@ const int SubsonicDynamicPlaylist::kDefaultSongCount = 20;
const int SubsonicDynamicPlaylist::kDefaultOffset = 0; const int SubsonicDynamicPlaylist::kDefaultOffset = 0;
SubsonicDynamicPlaylist::SubsonicDynamicPlaylist() SubsonicDynamicPlaylist::SubsonicDynamicPlaylist()
: type_(QueryType_Album), stat_(QueryStat_Newest), offset_(kDefaultOffset) {} : type_(QueryType_Album), stat_(QueryStat_Newest), offset_(kDefaultOffset) {
service_ = InternetModel::Service<SubsonicService>();
}
SubsonicDynamicPlaylist::SubsonicDynamicPlaylist(const QString& name, SubsonicDynamicPlaylist::SubsonicDynamicPlaylist(const QString& name,
QueryType type, QueryType type,
QueryStat stat) QueryStat stat)
: type_(type), stat_(stat), offset_(kDefaultOffset) { : type_(type), stat_(stat), offset_(kDefaultOffset) {
set_name(name); set_name(name);
service_ = InternetModel::Service<SubsonicService>();
} }
void SubsonicDynamicPlaylist::Load(const QByteArray& data) { void SubsonicDynamicPlaylist::Load(const QByteArray& data) {
@ -93,9 +96,7 @@ PlaylistItemList SubsonicDynamicPlaylist::Generate() {
} }
PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreSongs(int count) { PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreSongs(int count) {
SubsonicService* service = InternetModel::Service<SubsonicService>(); QUrl url = service_->BuildRequestUrl("getRandomSongs");
QUrl url = service->BuildRequestUrl("getRandomSongs");
QNetworkAccessManager network; QNetworkAccessManager network;
if (count > kMaxCount) count = kMaxCount; if (count > kMaxCount) count = kMaxCount;
@ -106,7 +107,7 @@ PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreSongs(int count) {
PlaylistItemList items; PlaylistItemList items;
QNetworkReply* reply = Send(network, url, service->usesslv3_); QNetworkReply* reply = Send(network, url, service_->usesslv3_);
WaitForSignal(reply, SIGNAL(finished())); WaitForSignal(reply, SIGNAL(finished()));
reply->deleteLater(); reply->deleteLater();
@ -146,10 +147,10 @@ PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreSongs(int count) {
continue; continue;
} }
Song song = ReadSong(service, reader); Song song = ReadSong(reader);
items << std::shared_ptr<PlaylistItem>( items << std::shared_ptr<PlaylistItem>(
new InternetPlaylistItem(service, song)); new InternetPlaylistItem(service_, song));
reader.skipCurrentElement(); reader.skipCurrentElement();
} }
@ -157,9 +158,7 @@ PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreSongs(int count) {
} }
PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreAlbums(int count) { PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreAlbums(int count) {
SubsonicService* service = InternetModel::Service<SubsonicService>(); QUrl url = service_->BuildRequestUrl("getAlbumList");
QUrl url = service->BuildRequestUrl("getAlbumList");
QNetworkAccessManager network; QNetworkAccessManager network;
if (count > kMaxCount) count = kMaxCount; if (count > kMaxCount) count = kMaxCount;
@ -172,7 +171,7 @@ PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreAlbums(int count) {
PlaylistItemList items; PlaylistItemList items;
QNetworkReply* reply = Send(network, url, service->usesslv3_); QNetworkReply* reply = Send(network, url, service_->usesslv3_);
WaitForSignal(reply, SIGNAL(finished())); WaitForSignal(reply, SIGNAL(finished()));
reply->deleteLater(); reply->deleteLater();
@ -214,22 +213,21 @@ PlaylistItemList SubsonicDynamicPlaylist::GenerateMoreAlbums(int count) {
qLog(Debug) << "Getting album: " qLog(Debug) << "Getting album: "
<< reader.attributes().value("album").toString(); << reader.attributes().value("album").toString();
GetAlbum(service, items, reader.attributes().value("id").toString(), GetAlbum(items, reader.attributes().value("id").toString(), network,
network, service->usesslv3_); service_->usesslv3_);
reader.skipCurrentElement(); reader.skipCurrentElement();
} }
offset_ += count; offset_ += count;
return items; return items;
} }
void SubsonicDynamicPlaylist::GetAlbum(SubsonicService* service, void SubsonicDynamicPlaylist::GetAlbum(PlaylistItemList& list, QString id,
PlaylistItemList& list, QString id,
QNetworkAccessManager& network, QNetworkAccessManager& network,
const bool usesslv3) { const bool usesslv3) {
QUrl url = service->BuildRequestUrl("getAlbum"); QUrl url = service_->BuildRequestUrl("getAlbum");
QUrlQuery url_query(url.query()); QUrlQuery url_query(url.query());
url_query.addQueryItem("id", id); url_query.addQueryItem("id", id);
if (service->IsAmpache()) { if (service_->IsAmpache()) {
url_query.addQueryItem("ampache", "1"); url_query.addQueryItem("ampache", "1");
} }
url.setQuery(url_query); url.setQuery(url_query);
@ -273,18 +271,17 @@ void SubsonicDynamicPlaylist::GetAlbum(SubsonicService* service,
continue; continue;
} }
Song song = ReadSong(service, reader); Song song = ReadSong(reader);
song.set_albumartist(album_artist); song.set_albumartist(album_artist);
list << std::shared_ptr<PlaylistItem>( list << std::shared_ptr<PlaylistItem>(
new InternetPlaylistItem(service, song)); new InternetPlaylistItem(service_, song));
reader.skipCurrentElement(); reader.skipCurrentElement();
} }
} }
Song SubsonicDynamicPlaylist::ReadSong(SubsonicService* service, Song SubsonicDynamicPlaylist::ReadSong(QXmlStreamReader &reader) {
QXmlStreamReader &reader) {
Song song; Song song;
QString id = reader.attributes().value("id").toString(); QString id = reader.attributes().value("id").toString();
song.set_title(reader.attributes().value("title").toString()); song.set_title(reader.attributes().value("title").toString());
@ -302,7 +299,7 @@ Song SubsonicDynamicPlaylist::ReadSong(SubsonicService* service,
QUrlQuery song_query(url.query()); QUrlQuery song_query(url.query());
song_query.addQueryItem("id", id); song_query.addQueryItem("id", id);
url.setQuery(song_query); url.setQuery(song_query);
QUrl cover_url = service->BuildRequestUrl("getCoverArt"); QUrl cover_url = service_->BuildRequestUrl("getCoverArt");
QUrlQuery cover_url_query(cover_url.query()); QUrlQuery cover_url_query(cover_url.query());
cover_url_query.addQueryItem("id", id); cover_url_query.addQueryItem("id", id);
cover_url.setQuery(cover_url_query); cover_url.setQuery(cover_url_query);

View File

@ -62,7 +62,7 @@ class SubsonicDynamicPlaylist : public smart_playlists::Generator {
PlaylistItemList GenerateMoreAlbums(int count); PlaylistItemList GenerateMoreAlbums(int count);
PlaylistItemList GenerateMoreSongs(int count); PlaylistItemList GenerateMoreSongs(int count);
Song ReadSong(SubsonicService* service, QXmlStreamReader& reader); Song ReadSong(QXmlStreamReader& reader);
static const int kMaxCount; static const int kMaxCount;
static const int kDefaultAlbumCount; static const int kDefaultAlbumCount;
@ -70,8 +70,8 @@ class SubsonicDynamicPlaylist : public smart_playlists::Generator {
static const int kDefaultOffset; static const int kDefaultOffset;
private: private:
void GetAlbum(SubsonicService* service, PlaylistItemList& list, QString id, void GetAlbum(PlaylistItemList& list, QString id, QNetworkAccessManager& network,
QNetworkAccessManager& network, const bool usesslv3); const bool usesslv3);
// need our own one since we run in a different thread from service // need our own one since we run in a different thread from service
QNetworkReply* Send(QNetworkAccessManager& network, const QUrl& url, QNetworkReply* Send(QNetworkAccessManager& network, const QUrl& url,
const bool usesslv3); const bool usesslv3);