1
0
mirror of https://github.com/clementine-player/Clementine synced 2025-02-07 06:35:15 +01:00

Load subsonic library recursively

This commit is contained in:
Alan Briolat 2013-01-11 23:14:15 +00:00
parent 349231793f
commit 49d27b0bfe
2 changed files with 30 additions and 6 deletions

View File

@ -25,6 +25,8 @@ const char* SubsonicService::kApiClientName = "Clementine";
const char* SubsonicService::kSongsTable = "subsonic_songs"; const char* SubsonicService::kSongsTable = "subsonic_songs";
const char* SubsonicService::kFtsTable = "subsonic_songs_fts"; const char* SubsonicService::kFtsTable = "subsonic_songs_fts";
const int SubsonicService::kChunkSize = 1000;
SubsonicService::SubsonicService(Application* app, InternetModel *parent) SubsonicService::SubsonicService(Application* app, InternetModel *parent)
: InternetService(kServiceName, app, parent, parent), : InternetService(kServiceName, app, parent, parent),
network_(new QNetworkAccessManager(this)), network_(new QNetworkAccessManager(this)),
@ -126,6 +128,7 @@ void SubsonicService::GetIndexes()
void SubsonicService::GetMusicDirectory(const QString &id) void SubsonicService::GetMusicDirectory(const QString &id)
{ {
++directory_count_;
QUrl url = BuildRequestUrl("getMusicDirectory"); QUrl url = BuildRequestUrl("getMusicDirectory");
url.addQueryItem("id", id); url.addQueryItem("id", id);
Send(url, SLOT(onGetMusicDirectoryFinished())); Send(url, SLOT(onGetMusicDirectoryFinished()));
@ -171,14 +174,16 @@ void SubsonicService::ReadIndex(QXmlStreamReader *reader)
void SubsonicService::ReadArtist(QXmlStreamReader *reader) void SubsonicService::ReadArtist(QXmlStreamReader *reader)
{ {
Q_ASSERT(reader->name() == "artist"); Q_ASSERT(reader->name() == "artist");
// TODO: recurse into directory QString id = reader->attributes().value("id").toString();
GetMusicDirectory(id);
reader->skipCurrentElement(); reader->skipCurrentElement();
} }
void SubsonicService::ReadAlbum(QXmlStreamReader *reader) void SubsonicService::ReadAlbum(QXmlStreamReader *reader)
{ {
Q_ASSERT(reader->name() == "child"); Q_ASSERT(reader->name() == "child");
// TODO: recurse into directory QString id = reader->attributes().value("id").toString();
GetMusicDirectory(id);
reader->skipCurrentElement(); reader->skipCurrentElement();
} }
@ -286,10 +291,13 @@ void SubsonicService::onGetIndexesFinished()
return; return;
} }
directory_count_ = 0;
processed_directory_count_ = 0;
new_songs_ = SongList();
reader.readNextStartElement(); reader.readNextStartElement();
Q_ASSERT(reader.name() == "indexes"); Q_ASSERT(reader.name() == "indexes");
// TODO: start loading library data // TODO: start loading library data
SongList songs;
while (reader.readNextStartElement()) while (reader.readNextStartElement())
{ {
if (reader.name() == "index") if (reader.name() == "index")
@ -298,7 +306,7 @@ void SubsonicService::onGetIndexesFinished()
} }
else if (reader.name() == "child" && reader.attributes().value("isVideo") == "false") else if (reader.name() == "child" && reader.attributes().value("isVideo") == "false")
{ {
songs << ReadTrack(&reader); new_songs_ << ReadTrack(&reader);
} }
else else
{ {
@ -306,7 +314,10 @@ void SubsonicService::onGetIndexesFinished()
} }
} }
library_backend_->AddOrUpdateSongs(songs); if (new_songs_.size() >= kChunkSize || directory_count_ == processed_directory_count_) {
library_backend_->AddOrUpdateSongs(new_songs_);
new_songs_ = SongList();
}
} }
void SubsonicService::onGetMusicDirectoryFinished() void SubsonicService::onGetMusicDirectoryFinished()
@ -316,6 +327,8 @@ void SubsonicService::onGetMusicDirectoryFinished()
reply->deleteLater(); reply->deleteLater();
QXmlStreamReader reader(reply); QXmlStreamReader reader(reply);
++processed_directory_count_;
reader.readNextStartElement(); reader.readNextStartElement();
Q_ASSERT(reader.name() == "subsonic-response"); Q_ASSERT(reader.name() == "subsonic-response");
if (reader.attributes().value("status") != "ok") if (reader.attributes().value("status") != "ok")
@ -335,11 +348,16 @@ void SubsonicService::onGetMusicDirectoryFinished()
} }
else if (reader.attributes().value("isVideo") == "false") else if (reader.attributes().value("isVideo") == "false")
{ {
ReadTrack(&reader); new_songs_ << ReadTrack(&reader);
} }
else else
{ {
reader.skipCurrentElement(); reader.skipCurrentElement();
} }
} }
if (new_songs_.size() >= kChunkSize || directory_count_ == processed_directory_count_) {
library_backend_->AddOrUpdateSongs(new_songs_);
new_songs_ = SongList();
}
} }

View File

@ -77,6 +77,8 @@ class SubsonicService : public InternetService
static const char* kSongsTable; static const char* kSongsTable;
static const char* kFtsTable; static const char* kFtsTable;
static const int kChunkSize;
signals: signals:
void LoginStateChanged(SubsonicService::LoginState newstate); void LoginStateChanged(SubsonicService::LoginState newstate);
@ -107,6 +109,10 @@ class SubsonicService : public InternetService
LoginState login_state_; LoginState login_state_;
int directory_count_;
int processed_directory_count_;
SongList new_songs_;
private slots: private slots:
void onLoginStateChanged(SubsonicService::LoginState newstate); void onLoginStateChanged(SubsonicService::LoginState newstate);
void onPingFinished(); void onPingFinished();