diff --git a/CMakeLists.txt b/CMakeLists.txt index f97cb94c0..b1722ab96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -53,6 +53,7 @@ else(WIN32) pkg_check_modules(GLIB glib-2.0) pkg_check_modules(LIBXML libxml-2.0) pkg_check_modules(GOBJECT gobject-2.0) + pkg_check_modules(LIBGPOD libgpod-1.0) endif(WIN32) find_library(LASTFM_LIBRARIES lastfm) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 466f2a666..2ad6ac816 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -453,6 +453,15 @@ if(NOT APPLE AND NOT WIN32) list(APPEND HEADERS devices/devicekitlister.h) endif(NOT APPLE AND NOT WIN32) +# Libgpod device backend +if(LIBGPOD_FOUND) + set(HAVE_LIBGPOD ON) + include_directories(${LIBGPOD_INCLUDE_DIRS}) + + list(APPEND SOURCES devices/gpoddevice.cpp devices/gpodloader.cpp) + list(APPEND HEADERS devices/gpoddevice.h devices/gpodloader.h) +endif(LIBGPOD_FOUND) + # Mac specific startup stuff if(APPLE) list(APPEND SOURCES core/mac_startup.mm) @@ -465,6 +474,10 @@ list(APPEND OTHER_SOURCES core/macglobalshortcutbackend.mm devices/devicekitlister.h devices/devicekitlister.cpp + devices/gpoddevice.cpp + devices/gpoddevice.h + devices/gpodloader.cpp + devices/gpodloader.h ui/macsystemtrayicon.h ui/macsystemtrayicon.mm widgets/osd_mac.mm @@ -516,6 +529,10 @@ if(ENABLE_VISUALISATIONS) target_link_libraries(clementine_lib projectM) endif(ENABLE_VISUALISATIONS) +if(HAVE_LIBGPOD) + target_link_libraries(clementine_lib ${LIBGPOD_LIBRARIES}) +endif(HAVE_LIBGPOD) + if (APPLE) target_link_libraries(clementine_lib ${GROWL} diff --git a/src/config.h.in b/src/config.h.in index a209b665a..99d534021 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -38,4 +38,6 @@ #cmakedefine HAVE_STATIC_SQLITE +#cmakedefine HAVE_LIBGPOD + #endif // CONFIG_H_IN diff --git a/src/core/song.cpp b/src/core/song.cpp index de22eed11..0e31be675 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -529,6 +529,37 @@ void Song::InitFromLastFM(const lastfm::Track& track) { d->length_ = track.duration(); } +#ifdef HAVE_LIBGPOD + void Song::InitFromItdb(Itdb_Track* track) { + d->valid_ = true; + + d->title_ = QString::fromUtf8(track->title); + d->album_ = QString::fromUtf8(track->album); + d->artist_ = QString::fromUtf8(track->artist); + d->albumartist_ = QString::fromUtf8(track->albumartist); + d->composer_ = QString::fromUtf8(track->composer); + d->track_ = track->track_nr; + d->disc_ = track->cd_nr; + d->bpm_ = track->BPM; + d->year_ = track->year; + d->genre_ = QString::fromUtf8(track->genre); + d->comment_ = QString::fromUtf8(track->comment); + d->compilation_ = track->compilation; + d->length_ = track->tracklen / 1000; + d->bitrate_ = track->bitrate; + d->samplerate_ = track->samplerate; + d->mtime_ = track->time_modified; + d->ctime_ = track->time_added; + d->filesize_ = track->size; + d->filetype_ = track->type2 ? Type_Mpeg : Type_Mp4; + + itdb_filename_ipod2fs(track->ipod_path); + + d->filename_ = QString::fromLocal8Bit(track->ipod_path); + d->basefilename_ = QFileInfo(d->filename_).fileName(); + } +#endif + void Song::MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle &bundle) { d->valid_ = true; diff --git a/src/core/song.h b/src/core/song.h index 9748b0c3b..a1b333fbf 100644 --- a/src/core/song.h +++ b/src/core/song.h @@ -26,11 +26,16 @@ #include #include +#include "config.h" #include "engines/engine_fwd.h" #include #include "nsUniversalDetector.h" +#ifdef HAVE_LIBGPOD +# include +#endif + namespace lastfm { class Track; } @@ -118,8 +123,13 @@ class Song { void InitFromFile(const QString& filename, int directory_id); void InitFromQuery(const QSqlQuery& query, int col = 0); void InitFromLastFM(const lastfm::Track& track); + void MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle& bundle); +#ifdef HAVE_LIBGPOD + void InitFromItdb(Itdb_Track* track); +#endif + static QString Decode(const TagLib::String& tag, const QTextCodec* codec); // Save diff --git a/src/devices/connecteddevice.cpp b/src/devices/connecteddevice.cpp index 9f94b5406..eb245328c 100644 --- a/src/devices/connecteddevice.cpp +++ b/src/devices/connecteddevice.cpp @@ -51,3 +51,26 @@ ConnectedDevice::ConnectedDevice(DeviceLister* lister, const QString& unique_id, ConnectedDevice::~ConnectedDevice() { backend_->deleteLater(); } + +void ConnectedDevice::InitBackendDirectory(const QString& mount_point, bool first_time) { + if (first_time) + backend_->AddDirectory(mount_point); + else { + // This is a bit of a hack. The device might not be mounted at the same + // path each time, so if it's different we have to munge all the paths in + // the database to fix it. This can be done entirely in sqlite so it's + // relatively fast... + + // Get the directory it was mounted at last time. Devices only have one + // directory (the root). + Directory dir = backend_->GetAllDirectories()[0]; + if (dir.path != mount_point) { + // The directory is different, commence the munging. + qDebug() << "Changing path from" << dir.path << "to" << mount_point; + backend_->ChangeDirPath(dir.id, mount_point); + } + + // Load the directory properly now + backend_->LoadDirectoriesAsync(); + } +} diff --git a/src/devices/connecteddevice.h b/src/devices/connecteddevice.h index ce7fe3393..aa8db0ac9 100644 --- a/src/devices/connecteddevice.h +++ b/src/devices/connecteddevice.h @@ -39,6 +39,10 @@ public: signals: void TaskStarted(int id); + void Error(const QString& message); + +protected: + void InitBackendDirectory(const QString& mount_point, bool first_time); protected: DeviceLister* lister_; diff --git a/src/devices/devicekitlister.cpp b/src/devices/devicekitlister.cpp index f0cb34756..f3a9708ac 100644 --- a/src/devices/devicekitlister.cpp +++ b/src/devices/devicekitlister.cpp @@ -14,11 +14,16 @@ along with Clementine. If not, see . */ +#include "config.h" #include "devicekitlister.h" #include "filesystemdevice.h" #include "dbus/udisks.h" #include "dbus/udisksdevice.h" +#ifdef HAVE_LIBGPOD +# include "gpoddevice.h" +#endif + #include DeviceKitLister::DeviceKitLister() @@ -66,6 +71,13 @@ void DeviceKitLister::Init() { device_data[data.unique_id()] = data; } + DeviceData ipod; + ipod.device_mount_paths << QDir::homePath() + "/.gvfs/iPod touch"; + ipod.device_presentation_name = "iPod Touch"; + ipod.suitable = true; + ipod.drive_serial = "ipod"; + device_data[ipod.unique_id()] = ipod; + // Update the internal cache { QMutexLocker l(&mutex_); @@ -227,7 +239,20 @@ QString DeviceKitLister::FindUniqueIdByPath(const QDBusObjectPath &path) const { boost::shared_ptr DeviceKitLister::Connect( const QString &unique_id, DeviceManager* manager, int database_id, bool first_time) { - return boost::shared_ptr(new FilesystemDevice( - LockAndGetDeviceInfo(unique_id, &DeviceData::device_mount_paths)[0], - this, unique_id, manager, database_id, first_time)); + QString mount_point = LockAndGetDeviceInfo( + unique_id, &DeviceData::device_mount_paths)[0]; + + boost::shared_ptr ret; + +#ifdef HAVE_LIBGPOD + if (QFile::exists(mount_point + "/iTunes_Control")) { + ret.reset(new GPodDevice( + mount_point, this, unique_id, manager, database_id, first_time)); + return ret; + } +#endif + + ret.reset(new FilesystemDevice( + mount_point, this, unique_id, manager, database_id, first_time)); + return ret; } diff --git a/src/devices/devicemanager.cpp b/src/devices/devicemanager.cpp index 71e2ee1d6..00feb11c3 100644 --- a/src/devices/devicemanager.cpp +++ b/src/devices/devicemanager.cpp @@ -14,6 +14,7 @@ along with Clementine. If not, see . */ +#include "config.h" #include "connecteddevice.h" #include "devicedatabasebackend.h" #include "devicemanager.h" @@ -273,6 +274,7 @@ boost::shared_ptr DeviceManager::Connect(int row) { info.device_ = info.lister_->Connect( info.unique_id_, this, info.database_id_, first_time); connect(info.device_.get(), SIGNAL(TaskStarted(int)), SLOT(DeviceTaskStarted(int))); + connect(info.device_.get(), SIGNAL(Error(QString)), SIGNAL(Error(QString))); return info.device_; } diff --git a/src/devices/devicemanager.h b/src/devices/devicemanager.h index 842260159..f14fe1a75 100644 --- a/src/devices/devicemanager.h +++ b/src/devices/devicemanager.h @@ -81,6 +81,7 @@ public: signals: void DeviceDisconnected(int row); + void Error(const QString& message); private slots: void PhysicalDeviceAdded(const QString& id); diff --git a/src/devices/filesystemdevice.cpp b/src/devices/filesystemdevice.cpp index d93c07f4f..d57923029 100644 --- a/src/devices/filesystemdevice.cpp +++ b/src/devices/filesystemdevice.cpp @@ -57,26 +57,7 @@ FilesystemDevice::FilesystemDevice( backend_, SLOT(UpdateCompilations())); connect(watcher, SIGNAL(ScanStarted(int)), SIGNAL(TaskStarted(int))); - if (first_time) - backend_->AddDirectory(mount_point); - else { - // This is a bit of a hack. The device might not be mounted at the same - // path each time, so if it's different we have to munge all the paths in - // the database to fix it. This can be done entirely in sqlite so it's - // relatively fast... - - // Get the directory it was mounted at last time. Devices only have one - // directory (the root). - Directory dir = backend_->GetAllDirectories()[0]; - if (dir.path != mount_point) { - // The directory is different, commence the munging. - qDebug() << "Changing path from" << dir.path << "to" << mount_point; - backend_->ChangeDirPath(dir.id, mount_point); - } - - // Load the directory properly now, this signals the watcher as well. - backend_->LoadDirectoriesAsync(); - } + InitBackendDirectory(mount_point, first_time); model_->Init(); } diff --git a/src/devices/gpoddevice.cpp b/src/devices/gpoddevice.cpp new file mode 100644 index 000000000..f598d6928 --- /dev/null +++ b/src/devices/gpoddevice.cpp @@ -0,0 +1,48 @@ +/* This file is part of Clementine. + + Clementine is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Clementine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Clementine. If not, see . +*/ + +#include "devicemanager.h" +#include "gpoddevice.h" +#include "gpodloader.h" +#include "library/librarymodel.h" + +#include + +#include + +GPodDevice::GPodDevice( + const QString& mount_point, DeviceLister* lister, const QString& unique_id, + DeviceManager* manager, int database_id, bool first_time) + : ConnectedDevice(lister, unique_id, manager, database_id), + loader_thread_(new QThread(this)), + loader_(new GPodLoader(mount_point, manager->task_manager(), backend_)) +{ + InitBackendDirectory(mount_point, first_time); + model_->Init(); + + loader_->moveToThread(loader_thread_); + + connect(loader_, SIGNAL(Error(QString)), SIGNAL(Error(QString))); + connect(loader_, SIGNAL(TaskStarted(int)), SIGNAL(TaskStarted(int))); + connect(loader_thread_, SIGNAL(started()), loader_, SLOT(LoadDatabase())); + loader_thread_->start(); + // TODO: loader cleanup +} + +GPodDevice::~GPodDevice() { + +} + diff --git a/src/devices/gpoddevice.h b/src/devices/gpoddevice.h new file mode 100644 index 000000000..c9f1dc365 --- /dev/null +++ b/src/devices/gpoddevice.h @@ -0,0 +1,38 @@ +/* This file is part of Clementine. + + Clementine is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Clementine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Clementine. If not, see . +*/ + +#ifndef GPODDEVICE_H +#define GPODDEVICE_H + +#include "connecteddevice.h" + +class GPodLoader; + +class GPodDevice : public ConnectedDevice { + Q_OBJECT + +public: + GPodDevice(const QString& mount_point, DeviceLister* lister, + const QString& unique_id, DeviceManager* manager, + int database_id, bool first_time); + ~GPodDevice(); + +private: + QThread* loader_thread_; + GPodLoader* loader_; +}; + +#endif // GPODDEVICE_H diff --git a/src/devices/gpodloader.cpp b/src/devices/gpodloader.cpp new file mode 100644 index 000000000..c11c5e5de --- /dev/null +++ b/src/devices/gpodloader.cpp @@ -0,0 +1,73 @@ +/* This file is part of Clementine. + + Clementine is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Clementine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Clementine. If not, see . +*/ + +#include "gpodloader.h" +#include "core/song.h" +#include "core/taskmanager.h" +#include "library/librarybackend.h" + +#include + +#include + +GPodLoader::GPodLoader(const QString& mount_point, TaskManager* task_manager, + LibraryBackend* backend, QObject *parent) + : QObject(parent), + mount_point_(mount_point), + task_manager_(task_manager), + backend_(backend) +{ +} + +void GPodLoader::LoadDatabase() { + int task_id = task_manager_->StartTask(tr("Loading iPod database")); + emit TaskStarted(task_id); + + // Load the iTunes database + GError* error = NULL; + Itdb_iTunesDB* db = itdb_parse(mount_point_.toLocal8Bit(), &error); + + // Check for errors + if (!db) { + qDebug() << "GPodLoader error:" << error->message; + emit Error(QString::fromUtf8(error->message)); + g_error_free(error); + task_manager_->SetTaskFinished(task_id); + return; + } + + // Convert all the tracks from libgpod structs into Song classes + SongList songs; + for (GList* tracks = db->tracks ; tracks != NULL ; tracks = tracks->next) { + Itdb_Track* track = static_cast(tracks->data); + + Song song; + song.InitFromItdb(track); + song.set_directory_id(1); + song.set_filename(mount_point_ + song.filename()); + songs << song; + } + + // Need to remove all the existing songs in the database first + backend_->DeleteSongs(backend_->FindSongsInDirectory(1)); + + // Add the songs we've just loaded + backend_->AddOrUpdateSongs(songs); + + // Cleanup + itdb_free(db); + task_manager_->SetTaskFinished(task_id); +} diff --git a/src/devices/gpodloader.h b/src/devices/gpodloader.h new file mode 100644 index 000000000..08f066eea --- /dev/null +++ b/src/devices/gpodloader.h @@ -0,0 +1,47 @@ +/* This file is part of Clementine. + + Clementine is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Clementine is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Clementine. If not, see . +*/ + +#ifndef GPODLOADER_H +#define GPODLOADER_H + +#include + +#include + +class LibraryBackend; +class TaskManager; + +class GPodLoader : public QObject { + Q_OBJECT + +public: + GPodLoader(const QString& mount_point, TaskManager* task_manager, + LibraryBackend* backend, QObject* parent = 0); + +public slots: + void LoadDatabase(); + +signals: + void Error(const QString& message); + void TaskStarted(int task_id); + +private: + QString mount_point_; + TaskManager* task_manager_; + LibraryBackend* backend_; +}; + +#endif // GPODLOADER_H diff --git a/src/translations/ar.po b/src/translations/ar.po index fbb9588db..f78730244 100644 --- a/src/translations/ar.po +++ b/src/translations/ar.po @@ -886,6 +886,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "" diff --git a/src/translations/cs.po b/src/translations/cs.po index e4fd7f76c..526309477 100644 --- a/src/translations/cs.po +++ b/src/translations/cs.po @@ -890,6 +890,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Načítám rádio Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Načítám kanál" diff --git a/src/translations/da.po b/src/translations/da.po index 876800ae2..5b24987ad 100644 --- a/src/translations/da.po +++ b/src/translations/da.po @@ -891,6 +891,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Indlæser Last.fm-radio" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Indlæser stream" diff --git a/src/translations/de.po b/src/translations/de.po index 5d8030300..a83d268a5 100644 --- a/src/translations/de.po +++ b/src/translations/de.po @@ -893,6 +893,9 @@ msgstr "Wiedergabeliste laden..." msgid "Loading Last.fm radio" msgstr "Last.fm Radio wird geladen" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Lade Stream" diff --git a/src/translations/el.po b/src/translations/el.po index 8b7e2b697..781003e4c 100644 --- a/src/translations/el.po +++ b/src/translations/el.po @@ -899,6 +899,9 @@ msgstr "Φόρτωση λίστας αναπαραγωγής..." msgid "Loading Last.fm radio" msgstr "Φόρτωμα Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Φόρτωμα ροής (stream)" diff --git a/src/translations/en_CA.po b/src/translations/en_CA.po index c579bbb2f..6a1a78905 100644 --- a/src/translations/en_CA.po +++ b/src/translations/en_CA.po @@ -890,6 +890,9 @@ msgstr "Load playlist..." msgid "Loading Last.fm radio" msgstr "Loading Last.fm radio" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Loading stream" diff --git a/src/translations/en_GB.po b/src/translations/en_GB.po index 212cc3c64..b20f09c79 100644 --- a/src/translations/en_GB.po +++ b/src/translations/en_GB.po @@ -888,6 +888,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Loading Last.fm radio" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Loading stream" diff --git a/src/translations/es.po b/src/translations/es.po index 432bb36c5..c6a82324a 100644 --- a/src/translations/es.po +++ b/src/translations/es.po @@ -897,6 +897,9 @@ msgstr "Cargar lista de reproducción" msgid "Loading Last.fm radio" msgstr "Cargando radio de Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Cargando flujo" diff --git a/src/translations/fi.po b/src/translations/fi.po index c3aff6f87..13cc5e8b5 100644 --- a/src/translations/fi.po +++ b/src/translations/fi.po @@ -887,6 +887,9 @@ msgstr "Lataa soittolista..." msgid "Loading Last.fm radio" msgstr "" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "" diff --git a/src/translations/fr.po b/src/translations/fr.po index e968546dd..15911fc77 100644 --- a/src/translations/fr.po +++ b/src/translations/fr.po @@ -894,6 +894,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Chargement de la radio Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Chargement du flux" diff --git a/src/translations/gl.po b/src/translations/gl.po index 59704d7d9..48cfc5043 100644 --- a/src/translations/gl.po +++ b/src/translations/gl.po @@ -888,6 +888,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Carregando a rádio da Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "A carregar a stream" diff --git a/src/translations/it.po b/src/translations/it.po index c97a3dd59..ebb7ac1fa 100644 --- a/src/translations/it.po +++ b/src/translations/it.po @@ -895,6 +895,9 @@ msgstr "Carica la scaletta..." msgid "Loading Last.fm radio" msgstr "Caricamento radio Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Caricamento flusso" diff --git a/src/translations/kk.po b/src/translations/kk.po index 0ca6e817c..033a6b915 100644 --- a/src/translations/kk.po +++ b/src/translations/kk.po @@ -888,6 +888,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "" diff --git a/src/translations/nb.po b/src/translations/nb.po index 0a58fdb29..fda233f71 100644 --- a/src/translations/nb.po +++ b/src/translations/nb.po @@ -889,6 +889,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Laster inn Last.fm radio" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Lader lydstrøm" diff --git a/src/translations/oc.po b/src/translations/oc.po index ff53008eb..cceb139ff 100644 --- a/src/translations/oc.po +++ b/src/translations/oc.po @@ -886,6 +886,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Cargament de la ràdio Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Cargament del flux" diff --git a/src/translations/pl.po b/src/translations/pl.po index c032a69ff..2b5103786 100644 --- a/src/translations/pl.po +++ b/src/translations/pl.po @@ -888,6 +888,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Ładowanie radia Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Ładowanie strumienia" diff --git a/src/translations/pt.po b/src/translations/pt.po index b5754c992..ef4db01da 100644 --- a/src/translations/pt.po +++ b/src/translations/pt.po @@ -896,6 +896,9 @@ msgstr "Carregar lista..." msgid "Loading Last.fm radio" msgstr "Carregando a rádio Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "A carregar emissão" diff --git a/src/translations/pt_BR.po b/src/translations/pt_BR.po index ad374c10f..b43c90f27 100644 --- a/src/translations/pt_BR.po +++ b/src/translations/pt_BR.po @@ -896,6 +896,9 @@ msgstr "Carregar lista de reprodução..." msgid "Loading Last.fm radio" msgstr "Carregando rádio Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Carregando transmissão" diff --git a/src/translations/ro.po b/src/translations/ro.po index 51fc40b5b..f7316a90c 100644 --- a/src/translations/ro.po +++ b/src/translations/ro.po @@ -887,6 +887,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "Se încarcă radio Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Se încarcă fluxul" diff --git a/src/translations/ru.po b/src/translations/ru.po index 0ce1e4db1..fea923d4e 100644 --- a/src/translations/ru.po +++ b/src/translations/ru.po @@ -890,6 +890,9 @@ msgstr "Загрузить список воспроизведения..." msgid "Loading Last.fm radio" msgstr "Загрузка радио Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Загрузка потока" diff --git a/src/translations/sk.po b/src/translations/sk.po index b62309310..8db8f50ee 100644 --- a/src/translations/sk.po +++ b/src/translations/sk.po @@ -896,6 +896,9 @@ msgstr "Načítať playlist..." msgid "Loading Last.fm radio" msgstr "Načítava sa Last.fm rádio" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Načítava sa stream" diff --git a/src/translations/sv.po b/src/translations/sv.po index c67358069..cf2ece5f4 100644 --- a/src/translations/sv.po +++ b/src/translations/sv.po @@ -891,6 +891,9 @@ msgstr "Läs in spellista..." msgid "Loading Last.fm radio" msgstr "Laddar Last.fm radio" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Laddar ström" diff --git a/src/translations/tr.po b/src/translations/tr.po index 089c86856..3add27092 100644 --- a/src/translations/tr.po +++ b/src/translations/tr.po @@ -886,6 +886,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "" diff --git a/src/translations/translations.pot b/src/translations/translations.pot index c826d0297..15c81df26 100644 --- a/src/translations/translations.pot +++ b/src/translations/translations.pot @@ -877,6 +877,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "" diff --git a/src/translations/uk.po b/src/translations/uk.po index 2ad1a3526..e79bd8687 100644 --- a/src/translations/uk.po +++ b/src/translations/uk.po @@ -895,6 +895,9 @@ msgstr "Завантажити список відтворення..." msgid "Loading Last.fm radio" msgstr "Завантаження радіо Last.fm" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "Завнтаження потоку" diff --git a/src/translations/zh_CN.po b/src/translations/zh_CN.po index a56840969..af318bab2 100644 --- a/src/translations/zh_CN.po +++ b/src/translations/zh_CN.po @@ -886,6 +886,9 @@ msgstr "" msgid "Loading Last.fm radio" msgstr "" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "" diff --git a/src/translations/zh_TW.po b/src/translations/zh_TW.po index 9549d661f..b24a11e32 100644 --- a/src/translations/zh_TW.po +++ b/src/translations/zh_TW.po @@ -886,6 +886,9 @@ msgstr "載入播放清單..." msgid "Loading Last.fm radio" msgstr "" +msgid "Loading iPod database" +msgstr "" + msgid "Loading stream" msgstr "" diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 7bd3351f7..1b42e3871 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -356,6 +356,9 @@ MainWindow::MainWindow(NetworkAccessManager* network, Engine::Type engine, QWidg connect(task_manager_, SIGNAL(PauseLibraryWatchers()), library_, SLOT(PauseWatcher())); connect(task_manager_, SIGNAL(ResumeLibraryWatchers()), library_, SLOT(ResumeWatcher())); + // Devices connections + connect(devices_, SIGNAL(Error(QString)), error_dialog_.get(), SLOT(ShowMessage(QString))); + // Library filter widget QAction* library_config_action = new QAction( IconLoader::Load("configure"), tr("Configure library..."), this);