From 69d3d89b0fe33f604582b8bf1f14467694597e07 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sat, 27 Nov 2010 17:52:08 +0000 Subject: [PATCH] Have a different list of smart playlists for Jamendo and the normal Library. Only add default Jamendo smart playlists once. --- src/library/library.cpp | 60 ++++++++++++++- src/library/librarybackend.cpp | 19 +++-- src/library/librarymodel.cpp | 110 ++++++--------------------- src/library/librarymodel.h | 8 +- src/radio/jamendodynamicplaylist.cpp | 20 ++++- src/radio/jamendodynamicplaylist.h | 6 +- src/radio/jamendoservice.cpp | 26 +++++-- src/translations/ar.po | 9 +++ src/translations/bg.po | 9 +++ src/translations/ca.po | 9 +++ src/translations/cs.po | 9 +++ src/translations/cy.po | 9 +++ src/translations/da.po | 9 +++ src/translations/de.po | 9 +++ src/translations/el.po | 9 +++ src/translations/en_CA.po | 9 +++ src/translations/en_GB.po | 9 +++ src/translations/eo.po | 9 +++ src/translations/es.po | 9 +++ src/translations/et.po | 9 +++ src/translations/fi.po | 9 +++ src/translations/fr.po | 9 +++ src/translations/gl.po | 9 +++ src/translations/hu.po | 9 +++ src/translations/it.po | 9 +++ src/translations/ja.po | 9 +++ src/translations/kk.po | 9 +++ src/translations/lt.po | 9 +++ src/translations/nb.po | 9 +++ src/translations/nl.po | 9 +++ src/translations/oc.po | 9 +++ src/translations/pl.po | 9 +++ src/translations/pt.po | 9 +++ src/translations/pt_BR.po | 9 +++ src/translations/ro.po | 9 +++ src/translations/ru.po | 9 +++ src/translations/sk.po | 9 +++ src/translations/sl.po | 9 +++ src/translations/sr.po | 9 +++ src/translations/sv.po | 9 +++ src/translations/tr.po | 9 +++ src/translations/translations.pot | 9 +++ src/translations/uk.po | 9 +++ src/translations/zh_CN.po | 9 +++ src/translations/zh_TW.po | 9 +++ 45 files changed, 483 insertions(+), 108 deletions(-) diff --git a/src/library/library.cpp b/src/library/library.cpp index f3fe25468..64855016c 100644 --- a/src/library/library.cpp +++ b/src/library/library.cpp @@ -15,16 +15,34 @@ along with Clementine. If not, see . */ -#include "core/database.h" #include "library.h" #include "librarymodel.h" #include "librarybackend.h" +#include "core/database.h" +#include "smartplaylists/generator.h" +#include "smartplaylists/querygenerator.h" +#include "smartplaylists/search.h" const char* Library::kSongsTable = "songs"; const char* Library::kDirsTable = "directories"; const char* Library::kSubdirsTable = "subdirectories"; const char* Library::kFtsTable = "songs_fts"; +using smart_playlists::Generator; +using smart_playlists::GeneratorPtr; +using smart_playlists::QueryGenerator; +using smart_playlists::Search; +using smart_playlists::SearchTerm; + +static GeneratorPtr NewQuery( + const QString& name, const smart_playlists::Search& search, bool dynamic = false) { + boost::shared_ptr gen(new QueryGenerator); + gen->Load(search); + gen->set_name(name); + gen->set_dynamic(dynamic); + return boost::static_pointer_cast(gen); +} + Library::Library(BackgroundThread* db_thread, TaskManager* task_manager, QObject *parent) : QObject(parent), @@ -41,6 +59,46 @@ Library::Library(BackgroundThread* db_thread, TaskManager* task_manage model_ = new LibraryModel(backend_, this); model_->set_show_smart_playlists(true); + model_->set_default_smart_playlists(LibraryModel::DefaultGenerators() + << (LibraryModel::GeneratorList() + << NewQuery(tr("50 random tracks"), Search( + Search::Type_All, Search::TermList(), + Search::Sort_Random, SearchTerm::Field_Title, 50)) + << NewQuery(tr("Ever played"), Search( + Search::Type_And, Search::TermList() + << SearchTerm(SearchTerm::Field_PlayCount, SearchTerm::Op_GreaterThan, 0), + Search::Sort_Random, SearchTerm::Field_Title)) + << NewQuery(tr("Never played"), Search( + Search::Type_And, Search::TermList() + << SearchTerm(SearchTerm::Field_PlayCount, SearchTerm::Op_Equals, 0), + Search::Sort_Random, SearchTerm::Field_Title)) + << NewQuery(tr("Last played"), Search( + Search::Type_All, Search::TermList(), + Search::Sort_FieldDesc, SearchTerm::Field_LastPlayed)) + << NewQuery(tr("Most played"), Search( + Search::Type_All, Search::TermList(), + Search::Sort_FieldDesc, SearchTerm::Field_PlayCount)) + << NewQuery(tr("Favourite tracks"), Search( + Search::Type_All, Search::TermList(), + Search::Sort_FieldDesc, SearchTerm::Field_Score)) + << NewQuery(tr("Newest tracks"), Search( + Search::Type_All, Search::TermList(), + Search::Sort_FieldDesc, SearchTerm::Field_DateCreated)) + ) << (LibraryModel::GeneratorList() + << NewQuery(tr("All tracks"), Search( + Search::Type_All, Search::TermList(), + Search::Sort_FieldAsc, SearchTerm::Field_Artist, -1)) + << NewQuery(tr("Least favourite tracks"), Search( + Search::Type_Or, Search::TermList() + << SearchTerm(SearchTerm::Field_Rating, SearchTerm::Op_LessThan, 0.6) + << SearchTerm(SearchTerm::Field_SkipCount, SearchTerm::Op_GreaterThan, 4), + Search::Sort_FieldDesc, SearchTerm::Field_SkipCount)) + ) << (LibraryModel::GeneratorList() + << NewQuery(tr("Dynamic random mix"), Search( + Search::Type_All, Search::TermList(), + Search::Sort_Random, SearchTerm::Field_Title), true) + ) + ); } void Library::set_watcher_factory(BackgroundThreadFactory* factory) { diff --git a/src/library/librarybackend.cpp b/src/library/librarybackend.cpp index 7c9d26f4e..4a4b30620 100644 --- a/src/library/librarybackend.cpp +++ b/src/library/librarybackend.cpp @@ -509,20 +509,23 @@ SongList LibraryBackend::GetSongsByForeignId( QString in = ids.join(","); - QSqlQuery q(QString("SELECT %2.ROWID, " + Song::kColumnSpec + - " FROM %1, %2" - " WHERE %1.ROWID = %2.ROWID AND %2.%3 IN (%4)") + QSqlQuery q(QString("SELECT %2.ROWID, " + Song::kColumnSpec + ", %2.%3" + " FROM %2, %1" + " WHERE %2.%3 IN (%4) AND %1.ROWID = %2.ROWID") .arg(songs_table_, table, column, in), db); q.exec(); if (db_->CheckErrors(q.lastError())) return SongList(); - SongList ret; + QVector ret(ids.count()); while (q.next()) { - Song song; - song.InitFromQuery(q); - ret << song; + const QString foreign_id = q.value(Song::kColumns.count() + 1).toString(); + const int index = ids.indexOf(foreign_id); + if (index == -1) + continue; + + ret[index].InitFromQuery(q); } - return ret; + return ret.toList(); } Song LibraryBackend::GetSongById(int id, QSqlDatabase& db) { diff --git a/src/library/librarymodel.cpp b/src/library/librarymodel.cpp index d7c7dff14..b98f29a43 100644 --- a/src/library/librarymodel.cpp +++ b/src/library/librarymodel.cpp @@ -41,7 +41,6 @@ using smart_playlists::QueryGenerator; const char* LibraryModel::kSmartPlaylistsMimeType = "application/x-clementine-smart-playlist-generator"; const char* LibraryModel::kSmartPlaylistsSettingsGroup = "SerialisedSmartPlaylists"; -const char* LibraryModel::kSmartPlaylistsArray = "smart"; const int LibraryModel::kSmartPlaylistsVersion = 3; LibraryModel::LibraryModel(LibraryBackend* backend, QObject* parent) @@ -890,82 +889,33 @@ void LibraryModel::CreateSmartPlaylists() { QSettings s; s.beginGroup(kSmartPlaylistsSettingsGroup); - const int version = s.value("version", 0).toInt(); + int version = s.value(backend_->songs_table() + "_version", 0).toInt(); - using smart_playlists::Search; - using smart_playlists::SearchTerm; + // How many defaults do we have to write? + int unwritten_defaults = 0; + for (int i=version; i < default_smart_playlists_.count() ; ++i) { + unwritten_defaults += default_smart_playlists_[i].count(); + } - if (version == 0) { - // No smart playlists existed in the settings, so create some defaults - - s.beginWriteArray(kSmartPlaylistsArray); - - int i = 0; - SaveDefaultGenerator(&s, i++, tr("50 random tracks"), Search( - Search::Type_All, Search::TermList(), - Search::Sort_Random, SearchTerm::Field_Title, 50)); - SaveDefaultGenerator(&s, i++, tr("Ever played"), Search( - Search::Type_And, Search::TermList() - << SearchTerm(SearchTerm::Field_PlayCount, SearchTerm::Op_GreaterThan, 0), - Search::Sort_Random, SearchTerm::Field_Title)); - SaveDefaultGenerator(&s, i++, tr("Never played"), Search( - Search::Type_And, Search::TermList() - << SearchTerm(SearchTerm::Field_PlayCount, SearchTerm::Op_Equals, 0), - Search::Sort_Random, SearchTerm::Field_Title)); - SaveDefaultGenerator(&s, i++, tr("Last played"), Search( - Search::Type_All, Search::TermList(), - Search::Sort_FieldDesc, SearchTerm::Field_LastPlayed)); - SaveDefaultGenerator(&s, i++, tr("Most played"), Search( - Search::Type_All, Search::TermList(), - Search::Sort_FieldDesc, SearchTerm::Field_PlayCount)); - SaveDefaultGenerator(&s, i++, tr("Favourite tracks"), Search( - Search::Type_All, Search::TermList(), - Search::Sort_FieldDesc, SearchTerm::Field_Score)); - SaveDefaultGenerator(&s, i++, tr("Newest tracks"), Search( - Search::Type_All, Search::TermList(), - Search::Sort_FieldDesc, SearchTerm::Field_DateCreated)); + // Save the defaults if there are any unwritten ones + if (unwritten_defaults) { + // How many items are stored already? + int playlist_index = s.beginReadArray(backend_->songs_table()); + s.endArray(); + // Append the new ones + s.beginWriteArray(backend_->songs_table(), playlist_index + unwritten_defaults); + for (; version < default_smart_playlists_.count() ; ++version) { + foreach (smart_playlists::GeneratorPtr gen, default_smart_playlists_[version]) { + SaveGenerator(&s, playlist_index++, gen); + } + } s.endArray(); } - if (version <= 1) { - // Some additional smart playlists + s.setValue(backend_->songs_table() + "_version", version); - const int count = s.beginReadArray(kSmartPlaylistsArray); - s.endArray(); - s.beginWriteArray(kSmartPlaylistsArray); - - int i = count; - SaveDefaultGenerator(&s, i++, tr("All tracks"), Search( - Search::Type_All, Search::TermList(), - Search::Sort_FieldAsc, SearchTerm::Field_Artist, -1)); - SaveDefaultGenerator(&s, i++, tr("Least favourite tracks"), Search( - Search::Type_Or, Search::TermList() - << SearchTerm(SearchTerm::Field_Rating, SearchTerm::Op_LessThan, 0.6) - << SearchTerm(SearchTerm::Field_SkipCount, SearchTerm::Op_GreaterThan, 4), - Search::Sort_FieldDesc, SearchTerm::Field_SkipCount)); - - s.endArray(); - } - - if (version <= 2) { - // Dynamic playlists - - const int count = s.beginReadArray(kSmartPlaylistsArray); - s.endArray(); - s.beginWriteArray(kSmartPlaylistsArray); - - int i = count; - SaveDefaultGenerator(&s, i++, tr("Dynamic random mix"), Search( - Search::Type_All, Search::TermList(), - Search::Sort_Random, SearchTerm::Field_Title), true); - - s.endArray(); - } - - s.setValue("version", kSmartPlaylistsVersion); - - const int count = s.beginReadArray(kSmartPlaylistsArray); + const int count = s.beginReadArray(backend_->songs_table()); for (int i=0 ; iInsertNotify(smart_playlist_node_); } -void LibraryModel::SaveDefaultGenerator(QSettings* s, int i, const QString& name, - const smart_playlists::Search& search, - bool dynamic) const { - boost::shared_ptr gen(new QueryGenerator); - gen->Load(search); - gen->set_name(name); - gen->set_dynamic(dynamic); - SaveGenerator(s, i, boost::static_pointer_cast(gen)); -} - void LibraryModel::AddGenerator(GeneratorPtr gen) { QSettings s; s.beginGroup(kSmartPlaylistsSettingsGroup); // Count the existing items - const int count = s.beginReadArray(kSmartPlaylistsArray); + const int count = s.beginReadArray(backend_->songs_table()); s.endArray(); // Add this one to the end - s.beginWriteArray(kSmartPlaylistsArray, count + 1); + s.beginWriteArray(backend_->songs_table(), count + 1); SaveGenerator(&s, count, gen); // Add it to the model @@ -1025,10 +965,10 @@ void LibraryModel::UpdateGenerator(const QModelIndex& index, GeneratorPtr gen) { s.beginGroup(kSmartPlaylistsSettingsGroup); // Count the existing items - const int count = s.beginReadArray(kSmartPlaylistsArray); + const int count = s.beginReadArray(backend_->songs_table()); s.endArray(); - s.beginWriteArray(kSmartPlaylistsArray, count); + s.beginWriteArray(backend_->songs_table(), count); SaveGenerator(&s, index.row(), gen); // Update the text of the item @@ -1050,7 +990,7 @@ void LibraryModel::DeleteGenerator(const QModelIndex& index) { s.beginGroup(kSmartPlaylistsSettingsGroup); // Rewrite all the items to the settings - s.beginWriteArray(kSmartPlaylistsArray, smart_playlist_node_->children.count()); + s.beginWriteArray(backend_->songs_table(), smart_playlist_node_->children.count()); int i = 0; foreach (LibraryItem* item, smart_playlist_node_->children) { s.setArrayIndex(i++); diff --git a/src/library/librarymodel.h b/src/library/librarymodel.h index 1acde3971..b0b320863 100644 --- a/src/library/librarymodel.h +++ b/src/library/librarymodel.h @@ -97,8 +97,12 @@ class LibraryModel : public SimpleTreeModel { LibraryBackend* backend() const { return backend_; } LibraryDirectoryModel* directory_model() const { return dir_model_; } + typedef QList GeneratorList; + typedef QList DefaultGenerators; + // Call before Init() void set_show_smart_playlists(bool show_smart_playlists) { show_smart_playlists_ = show_smart_playlists; } + void set_default_smart_playlists(const DefaultGenerators& defaults) { default_smart_playlists_ = defaults; } // Get information about the library void GetChildSongs(LibraryItem* item, QList* urls, SongList* songs, @@ -165,9 +169,6 @@ class LibraryModel : public SimpleTreeModel { // Smart playlists are shown in another top-level node void CreateSmartPlaylists(); - void SaveDefaultGenerator(QSettings* s, int i, const QString& name, - const smart_playlists::Search& search, - bool dynamic = false) const; void SaveGenerator(QSettings* s, int i, smart_playlists::GeneratorPtr generator) const; void ItemFromSmartPlaylist(const QSettings& s, bool notify) const; @@ -197,6 +198,7 @@ class LibraryModel : public SimpleTreeModel { LibraryBackend* backend_; LibraryDirectoryModel* dir_model_; bool show_smart_playlists_; + DefaultGenerators default_smart_playlists_; QueryOptions query_options_; Grouping group_by_; diff --git a/src/radio/jamendodynamicplaylist.cpp b/src/radio/jamendodynamicplaylist.cpp index 2333f1fd0..da0e9ef8a 100644 --- a/src/radio/jamendodynamicplaylist.cpp +++ b/src/radio/jamendodynamicplaylist.cpp @@ -17,7 +17,14 @@ JamendoDynamicPlaylist::JamendoDynamicPlaylist() order_direction_(Order_Descending), current_page_(0), current_index_(0) { +} +JamendoDynamicPlaylist::JamendoDynamicPlaylist(const QString& name, OrderBy order_by) + : order_by_(order_by), + order_direction_(Order_Descending), + current_page_(0), + current_index_(0) { + set_name(name); } void JamendoDynamicPlaylist::Load(const QByteArray& data) { @@ -43,8 +50,10 @@ PlaylistItemList JamendoDynamicPlaylist::Generate() { } PlaylistItemList JamendoDynamicPlaylist::GenerateMore(int count) { + int tries = 0; + PlaylistItemList items; - while (items.size() < count) { + while (items.size() < count && tries++ < kApiRetryLimit) { // Add items from current list. if (current_index_ < current_items_.size()) { PlaylistItemList more_items = current_items_.mid(current_index_, count); @@ -79,12 +88,15 @@ void JamendoDynamicPlaylist::Fetch() { url.addQueryItem("pn", QString::number(current_page_++)); url.addQueryItem("n", QString::number(kPageSize)); url.addQueryItem("order", OrderSpec(order_by_, order_direction_)); - qDebug() << url; // Have to make a new NetworkAccessManager here because we're in a different // thread. NetworkAccessManager network; - QNetworkReply* reply = network.get(QNetworkRequest(url)); + QNetworkRequest req(url); + req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, + QNetworkRequest::AlwaysNetwork); + + QNetworkReply* reply = network.get(req); // Blocking wait for reply. { @@ -95,10 +107,12 @@ void JamendoDynamicPlaylist::Fetch() { // The reply will contain one track ID per line QStringList lines = QString::fromAscii(reply->readAll()).split('\n'); + delete reply; // Get the songs from the database SongList songs = backend_->GetSongsByForeignId( lines, JamendoService::kTrackIdsTable, JamendoService::kTrackIdsColumn); + if (songs.empty()) { qWarning() << "No songs returned from Jamendo:" << url.toString(); diff --git a/src/radio/jamendodynamicplaylist.h b/src/radio/jamendodynamicplaylist.h index 164f49790..9a7bd0136 100644 --- a/src/radio/jamendodynamicplaylist.h +++ b/src/radio/jamendodynamicplaylist.h @@ -9,8 +9,6 @@ class JamendoDynamicPlaylist : public smart_playlists::Generator { friend QDataStream& operator >>(QDataStream& s, JamendoDynamicPlaylist& p); public: - JamendoDynamicPlaylist(); - // These values are persisted - only add to the end enum OrderBy { OrderBy_Rating = 0, @@ -25,6 +23,9 @@ public: Order_Descending = 1, }; + JamendoDynamicPlaylist(); + JamendoDynamicPlaylist(const QString& name, OrderBy order_by); + QString type() const { return "Jamendo"; } void Load(const QByteArray& data); @@ -49,6 +50,7 @@ private: int current_index_; static const int kPageSize = 100; + static const int kApiRetryLimit = 5; static const char* kUrl; }; diff --git a/src/radio/jamendoservice.cpp b/src/radio/jamendoservice.cpp index 003099b51..068cf2055 100644 --- a/src/radio/jamendoservice.cpp +++ b/src/radio/jamendoservice.cpp @@ -35,6 +35,7 @@ #include "library/libraryfilterwidget.h" #include "library/librarymodel.h" #include "radio/radiomodel.h" +#include "radio/jamendodynamicplaylist.h" #include "radio/jamendoplaylistitem.h" #include "smartplaylists/generator.h" #include "ui/iconloader.h" @@ -62,6 +63,9 @@ const char* JamendoService::kSettingsGroup = "Jamendo"; const int JamendoService::kBatchSize = 10000; const int JamendoService::kApproxDatabaseSize = 300000; +using smart_playlists::Generator; +using smart_playlists::GeneratorPtr; + JamendoService::JamendoService(RadioModel* parent) : RadioService(kServiceName, parent), network_(new NetworkAccessManager(this)), @@ -82,6 +86,18 @@ JamendoService::JamendoService(RadioModel* parent) library_model_ = new LibraryModel(library_backend_, this); library_model_->set_show_smart_playlists(true); + library_model_->set_default_smart_playlists(LibraryModel::DefaultGenerators() + << (LibraryModel::GeneratorList() + << GeneratorPtr(new JamendoDynamicPlaylist(tr("Jamendo Top Tracks of the Month"), + JamendoDynamicPlaylist::OrderBy_RatingMonth)) + << GeneratorPtr(new JamendoDynamicPlaylist(tr("Jamendo Top Tracks of the Week"), + JamendoDynamicPlaylist::OrderBy_RatingWeek)) + << GeneratorPtr(new JamendoDynamicPlaylist(tr("Jamendo Top Tracks"), + JamendoDynamicPlaylist::OrderBy_Rating)) + << GeneratorPtr(new JamendoDynamicPlaylist(tr("Jamendo Most Listened Tracks"), + JamendoDynamicPlaylist::OrderBy_Listened)) + ) + ); library_sort_model_->setSourceModel(library_model_); library_sort_model_->setSortRole(LibraryModel::Role_SortText); @@ -102,10 +118,6 @@ void JamendoService::LazyPopulate(RadioItem* item) { switch (item->type) { case RadioItem::Type_Service: { library_model_->Init(); - smart_playlists::GeneratorPtr generator = - smart_playlists::Generator::Create("Jamendo"); - generator->set_name(tr("Jamendo Top Tracks of the Month")); - library_model_->AddGenerator(generator); model()->merged_model()->AddSubModel( model()->index(root_->row, 0, model()->ItemToIndex(item->parent)), library_sort_model_); @@ -227,12 +239,14 @@ void JamendoService::InsertTrackIds(const TrackIdList& ids) const { ScopedTransaction t(&db); - QSqlQuery insert(QString("INSERT INTO jamendo.%1 (%2) VALUES (:id)") + QSqlQuery insert(QString("INSERT INTO %1 (%2) VALUES (:id)") .arg(kTrackIdsTable, kTrackIdsColumn), db); foreach (int id, ids) { insert.bindValue(":id", id); - insert.exec(); + if (!insert.exec()) { + qWarning() << "Query failed" << insert.lastQuery(); + } } t.Commit(); diff --git a/src/translations/ar.po b/src/translations/ar.po index c332601ed..295f76103 100644 --- a/src/translations/ar.po +++ b/src/translations/ar.po @@ -1096,9 +1096,18 @@ msgstr "خدمة غير متاحة" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/bg.po b/src/translations/bg.po index 7afa3a193..d9658e0df 100644 --- a/src/translations/bg.po +++ b/src/translations/bg.po @@ -1100,9 +1100,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/ca.po b/src/translations/ca.po index c2f1748ef..8950d538c 100644 --- a/src/translations/ca.po +++ b/src/translations/ca.po @@ -1121,9 +1121,18 @@ msgstr "Servei invàlid" msgid "Invalid session key" msgstr "Sessió no vàlida" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Salta a la pista que s'esta reproduint" diff --git a/src/translations/cs.po b/src/translations/cs.po index e9bb6d40d..4836458a1 100644 --- a/src/translations/cs.po +++ b/src/translations/cs.po @@ -1100,9 +1100,18 @@ msgstr "Neplatná služba" msgid "Invalid session key" msgstr "Neplatný klíč relace" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/cy.po b/src/translations/cy.po index 0594caeab..6abe9385d 100644 --- a/src/translations/cy.po +++ b/src/translations/cy.po @@ -1096,9 +1096,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/da.po b/src/translations/da.po index 2dc55880c..2de3a2330 100644 --- a/src/translations/da.po +++ b/src/translations/da.po @@ -1101,9 +1101,18 @@ msgstr "Ugyldig tjeneste" msgid "Invalid session key" msgstr "Ugyldig sessionsnøgle" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/de.po b/src/translations/de.po index c3b0d484c..1b285a0a7 100644 --- a/src/translations/de.po +++ b/src/translations/de.po @@ -1124,9 +1124,18 @@ msgstr "Ungültiger Dienst" msgid "Invalid session key" msgstr "Ungültiger Sitzungsschlüssel" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Zum aktuellen Stück springen" diff --git a/src/translations/el.po b/src/translations/el.po index 7646ce136..3c21728f0 100644 --- a/src/translations/el.po +++ b/src/translations/el.po @@ -1135,9 +1135,18 @@ msgstr "Εσφαλμένη υπηρεσία" msgid "Invalid session key" msgstr "Εσφαλμένο κλειδί συνεδρίας" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Μετάβαση στο τρέχον κομμάτι που παίζει" diff --git a/src/translations/en_CA.po b/src/translations/en_CA.po index 986f1a747..d0fc79f57 100644 --- a/src/translations/en_CA.po +++ b/src/translations/en_CA.po @@ -1100,9 +1100,18 @@ msgstr "Invalid service" msgid "Invalid session key" msgstr "Invalid session key" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Jump to the currently playing track" diff --git a/src/translations/en_GB.po b/src/translations/en_GB.po index 171ef8a45..556a69582 100644 --- a/src/translations/en_GB.po +++ b/src/translations/en_GB.po @@ -1098,9 +1098,18 @@ msgstr "Invalid service" msgid "Invalid session key" msgstr "Invalid session key" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/eo.po b/src/translations/eo.po index d25b989a3..322e0f6ba 100644 --- a/src/translations/eo.po +++ b/src/translations/eo.po @@ -1096,9 +1096,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/es.po b/src/translations/es.po index 940c5d760..c7e2f2d3b 100644 --- a/src/translations/es.po +++ b/src/translations/es.po @@ -1133,9 +1133,18 @@ msgstr "Servicio inválido" msgid "Invalid session key" msgstr "Clave de sesión inválida" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Ir a la pista actualmente reproduciéndose" diff --git a/src/translations/et.po b/src/translations/et.po index 9fd9507b2..832e110d9 100644 --- a/src/translations/et.po +++ b/src/translations/et.po @@ -1098,9 +1098,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/fi.po b/src/translations/fi.po index 39e3bc973..bf506c199 100644 --- a/src/translations/fi.po +++ b/src/translations/fi.po @@ -1097,9 +1097,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/fr.po b/src/translations/fr.po index 9657ce1c9..c5dac5ccd 100644 --- a/src/translations/fr.po +++ b/src/translations/fr.po @@ -1130,9 +1130,18 @@ msgstr "Service invalide" msgid "Invalid session key" msgstr "Clé de session invalide" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Aller à la piste jouée actuellement" diff --git a/src/translations/gl.po b/src/translations/gl.po index 6c41c2c0b..dc01556e3 100644 --- a/src/translations/gl.po +++ b/src/translations/gl.po @@ -1101,9 +1101,18 @@ msgstr "Servizo Inválido" msgid "Invalid session key" msgstr "Chave de sesón non válida" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/hu.po b/src/translations/hu.po index cc940506f..82ee940c0 100644 --- a/src/translations/hu.po +++ b/src/translations/hu.po @@ -1127,9 +1127,18 @@ msgstr "Érvénytelen szolgáltatás" msgid "Invalid session key" msgstr "Érvénytelen munkafolyamat kulcs" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Ugrás a most lejátszott számra" diff --git a/src/translations/it.po b/src/translations/it.po index a30803cb3..1a4a528a1 100644 --- a/src/translations/it.po +++ b/src/translations/it.po @@ -1134,9 +1134,18 @@ msgstr "Servizio non valido" msgid "Invalid session key" msgstr "Chiave di sessione non valida" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Salta alla traccia in riproduzione" diff --git a/src/translations/ja.po b/src/translations/ja.po index c92a4065c..df605bb5a 100644 --- a/src/translations/ja.po +++ b/src/translations/ja.po @@ -1121,9 +1121,18 @@ msgstr "不正なサービスです" msgid "Invalid session key" msgstr "不正なセッション キーです" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "現在再生中のトラックへジャンプする" diff --git a/src/translations/kk.po b/src/translations/kk.po index 1de97800a..f50cbad1b 100644 --- a/src/translations/kk.po +++ b/src/translations/kk.po @@ -1098,9 +1098,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/lt.po b/src/translations/lt.po index 47c1d6f56..95199f4e7 100644 --- a/src/translations/lt.po +++ b/src/translations/lt.po @@ -1096,9 +1096,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/nb.po b/src/translations/nb.po index 8c7f00dcf..eb58118c7 100644 --- a/src/translations/nb.po +++ b/src/translations/nb.po @@ -1110,9 +1110,18 @@ msgstr "Ukjent tjeneste" msgid "Invalid session key" msgstr "Ugyldig sesjonsnøkkel" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/nl.po b/src/translations/nl.po index cf512872a..0a2770f3f 100644 --- a/src/translations/nl.po +++ b/src/translations/nl.po @@ -1124,9 +1124,18 @@ msgstr "Ongeldige service" msgid "Invalid session key" msgstr "Ongeldige sessiesleutel" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Spring naar de nu spelende track" diff --git a/src/translations/oc.po b/src/translations/oc.po index 3ffe5a1f2..e9ede7825 100644 --- a/src/translations/oc.po +++ b/src/translations/oc.po @@ -1096,9 +1096,18 @@ msgstr "" msgid "Invalid session key" msgstr "Clau de sesilha invalida" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/pl.po b/src/translations/pl.po index 81b7ffaf6..529e20f7c 100644 --- a/src/translations/pl.po +++ b/src/translations/pl.po @@ -1121,9 +1121,18 @@ msgstr "Błędna usługa" msgid "Invalid session key" msgstr "Zły klucz sesji" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Przeskocz do teraz odtwarzanej ścieżki" diff --git a/src/translations/pt.po b/src/translations/pt.po index cfd134c7a..860234631 100644 --- a/src/translations/pt.po +++ b/src/translations/pt.po @@ -1130,9 +1130,18 @@ msgstr "Serviço inválido" msgid "Invalid session key" msgstr "Chave de sessão inválida" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Ir para a faixa de reprodução atual" diff --git a/src/translations/pt_BR.po b/src/translations/pt_BR.po index ee2f4668a..866badd8d 100644 --- a/src/translations/pt_BR.po +++ b/src/translations/pt_BR.po @@ -1110,9 +1110,18 @@ msgstr "Serviço inválido" msgid "Invalid session key" msgstr "chave de sessão inválida" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Pular para a faixa em execução" diff --git a/src/translations/ro.po b/src/translations/ro.po index 750a001ef..42b07f075 100644 --- a/src/translations/ro.po +++ b/src/translations/ro.po @@ -1097,9 +1097,18 @@ msgstr "Serviciu invalid" msgid "Invalid session key" msgstr "Cheie de sesiune invalidă" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/ru.po b/src/translations/ru.po index 3970de5c1..66edef435 100644 --- a/src/translations/ru.po +++ b/src/translations/ru.po @@ -1117,9 +1117,18 @@ msgstr "Неправильная служба" msgid "Invalid session key" msgstr "Неправильный ключ сессии" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Перейти к текущей композиции" diff --git a/src/translations/sk.po b/src/translations/sk.po index 49b8cdb36..eb7ca2f03 100644 --- a/src/translations/sk.po +++ b/src/translations/sk.po @@ -1121,9 +1121,18 @@ msgstr "Nefunkčná služba" msgid "Invalid session key" msgstr "nefunkčný kľúč sedenia" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Skočiť na práve prehrávanú skladbu" diff --git a/src/translations/sl.po b/src/translations/sl.po index 3c70bf12c..7e4079b8e 100644 --- a/src/translations/sl.po +++ b/src/translations/sl.po @@ -1123,9 +1123,18 @@ msgstr "Neveljavna storitev" msgid "Invalid session key" msgstr "Neveljavni ključ seje" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Skoči na trenutno predvajano skladbo" diff --git a/src/translations/sr.po b/src/translations/sr.po index 800ae2566..bfe0681ee 100644 --- a/src/translations/sr.po +++ b/src/translations/sr.po @@ -1100,9 +1100,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Скочи на нумеру која се тренутно пушта" diff --git a/src/translations/sv.po b/src/translations/sv.po index 9c677f463..d6792f7dd 100644 --- a/src/translations/sv.po +++ b/src/translations/sv.po @@ -1122,9 +1122,18 @@ msgstr "Ogiltig tjänst" msgid "Invalid session key" msgstr "Felaktig sessionsnyckel" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Hoppa till spåret som spelas för närvarande" diff --git a/src/translations/tr.po b/src/translations/tr.po index e1987286f..805780ce3 100644 --- a/src/translations/tr.po +++ b/src/translations/tr.po @@ -1118,9 +1118,18 @@ msgstr "Geçersiz servis" msgid "Invalid session key" msgstr "Geçersiz oturum anahtarı" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Şu anda çalınan parçaya atla" diff --git a/src/translations/translations.pot b/src/translations/translations.pot index 7601fc0c0..044c1e458 100644 --- a/src/translations/translations.pot +++ b/src/translations/translations.pot @@ -1086,9 +1086,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/uk.po b/src/translations/uk.po index 2e21aa3b5..bee106b4d 100644 --- a/src/translations/uk.po +++ b/src/translations/uk.po @@ -1122,9 +1122,18 @@ msgstr "Нечинна служба" msgid "Invalid session key" msgstr "Неправильний ключ сеансу" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "Перейти до відтворюваної доріжки" diff --git a/src/translations/zh_CN.po b/src/translations/zh_CN.po index eac633375..d33c72003 100644 --- a/src/translations/zh_CN.po +++ b/src/translations/zh_CN.po @@ -1098,9 +1098,18 @@ msgstr "" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "" diff --git a/src/translations/zh_TW.po b/src/translations/zh_TW.po index 0f8ca83d6..380bfcc47 100644 --- a/src/translations/zh_TW.po +++ b/src/translations/zh_TW.po @@ -1101,9 +1101,18 @@ msgstr "無效的服務" msgid "Invalid session key" msgstr "" +msgid "Jamendo Most Listened Tracks" +msgstr "" + +msgid "Jamendo Top Tracks" +msgstr "" + msgid "Jamendo Top Tracks of the Month" msgstr "" +msgid "Jamendo Top Tracks of the Week" +msgstr "" + msgid "Jump to the currently playing track" msgstr "跳轉到目前播放的歌曲"