Have a different list of smart playlists for Jamendo and the normal Library. Only add default Jamendo smart playlists once.

This commit is contained in:
David Sansome 2010-11-27 17:52:08 +00:00
parent b85ddbb380
commit 69d3d89b0f
45 changed files with 483 additions and 108 deletions

View File

@ -15,16 +15,34 @@
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#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<QueryGenerator> gen(new QueryGenerator);
gen->Load(search);
gen->set_name(name);
gen->set_dynamic(dynamic);
return boost::static_pointer_cast<Generator>(gen);
}
Library::Library(BackgroundThread<Database>* db_thread, TaskManager* task_manager,
QObject *parent)
: QObject(parent),
@ -41,6 +59,46 @@ Library::Library(BackgroundThread<Database>* 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<LibraryWatcher>* factory) {

View File

@ -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<Song> 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) {

View File

@ -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 ; i<count ; ++i) {
s.setArrayIndex(i);
ItemFromSmartPlaylist(s, false);
@ -985,26 +935,16 @@ void LibraryModel::ItemFromSmartPlaylist(const QSettings& s, bool notify) const
item->InsertNotify(smart_playlist_node_);
}
void LibraryModel::SaveDefaultGenerator(QSettings* s, int i, const QString& name,
const smart_playlists::Search& search,
bool dynamic) const {
boost::shared_ptr<QueryGenerator> gen(new QueryGenerator);
gen->Load(search);
gen->set_name(name);
gen->set_dynamic(dynamic);
SaveGenerator(s, i, boost::static_pointer_cast<Generator>(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++);

View File

@ -97,8 +97,12 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
LibraryBackend* backend() const { return backend_; }
LibraryDirectoryModel* directory_model() const { return dir_model_; }
typedef QList<smart_playlists::GeneratorPtr> GeneratorList;
typedef QList<GeneratorList> 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<QUrl>* urls, SongList* songs,
@ -165,9 +169,6 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
// 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<LibraryItem> {
LibraryBackend* backend_;
LibraryDirectoryModel* dir_model_;
bool show_smart_playlists_;
DefaultGenerators default_smart_playlists_;
QueryOptions query_options_;
Grouping group_by_;

View File

@ -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();

View File

@ -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;
};

View File

@ -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();

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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"

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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"

View File

@ -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 "Μετάβαση στο τρέχον κομμάτι που παίζει"

View File

@ -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"

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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"

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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"

View File

@ -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 ""

View File

@ -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"

View File

@ -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"

View File

@ -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 "現在再生中のトラックへジャンプする"

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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"

View File

@ -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 ""

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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 "Перейти к текущей композиции"

View File

@ -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"

View File

@ -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"

View File

@ -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 "Скочи на нумеру која се тренутно пушта"

View File

@ -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"

View File

@ -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"

View File

@ -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 ""

View File

@ -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 "Перейти до відтворюваної доріжки"

View File

@ -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 ""

View File

@ -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 "跳轉到目前播放的歌曲"