mirror of
https://github.com/clementine-player/Clementine
synced 2025-02-02 20:36:44 +01:00
Improve error handling while transferring the iTunes database to/from the iPod
This commit is contained in:
parent
f078edf0db
commit
e65c710b5f
@ -47,15 +47,20 @@ void AfcDevice::Init() {
|
||||
transfer_->moveToThread(loader_thread_);
|
||||
|
||||
connect(transfer_, SIGNAL(TaskStarted(int)), SIGNAL(TaskStarted(int)));
|
||||
connect(transfer_, SIGNAL(CopyFinished()), SLOT(CopyFinished()));
|
||||
connect(transfer_, SIGNAL(CopyFinished(bool)), SLOT(CopyFinished(bool)));
|
||||
connect(loader_thread_, SIGNAL(started()), transfer_, SLOT(CopyFromDevice()));
|
||||
loader_thread_->start();
|
||||
}
|
||||
|
||||
void AfcDevice::CopyFinished() {
|
||||
void AfcDevice::CopyFinished(bool success) {
|
||||
transfer_->deleteLater();
|
||||
transfer_ = NULL;
|
||||
|
||||
if (!success) {
|
||||
emit Error(tr("An error occurred copying the iTunes database from the device"));
|
||||
return;
|
||||
}
|
||||
|
||||
// Now load the songs from the local database
|
||||
loader_ = new GPodLoader(local_path_, manager_->task_manager(), backend_);
|
||||
loader_->set_music_path_prefix("afc://" + url_.host());
|
||||
@ -137,8 +142,13 @@ void AfcDevice::FinaliseDatabase() {
|
||||
AfcTransfer transfer(url_.host(), local_path_, NULL);
|
||||
|
||||
itdb_start_sync(db_);
|
||||
transfer.CopyToDevice();
|
||||
bool success = transfer.CopyToDevice();
|
||||
itdb_stop_sync(db_);
|
||||
|
||||
if (!success) {
|
||||
emit Error(tr("An error occurred copying the iTunes database onto the device"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
bool AfcDevice::DeleteFromStorage(const Song &metadata) {
|
||||
|
@ -50,7 +50,7 @@ protected:
|
||||
void FinaliseDatabase();
|
||||
|
||||
private slots:
|
||||
void CopyFinished();
|
||||
void CopyFinished(bool success);
|
||||
|
||||
private:
|
||||
void RemoveRecursive(const QString& path);
|
||||
|
@ -3,16 +3,10 @@
|
||||
|
||||
#include <libimobiledevice/afc.h>
|
||||
|
||||
AfcFile::AfcFile(afc_client_t client, const QString& path, QObject* parent)
|
||||
: QIODevice(parent),
|
||||
client_(client),
|
||||
path_(path)
|
||||
{
|
||||
}
|
||||
|
||||
AfcFile::AfcFile(iMobileDeviceConnection* connection, const QString& path, QObject* parent)
|
||||
: QIODevice(parent),
|
||||
client_(connection->afc()),
|
||||
connection_(connection),
|
||||
handle_(0),
|
||||
path_(path)
|
||||
{
|
||||
}
|
||||
@ -38,7 +32,7 @@ bool AfcFile::open(QIODevice::OpenMode mode) {
|
||||
afc_mode = AFC_FOPEN_RW;
|
||||
}
|
||||
afc_error_t err = afc_file_open(
|
||||
client_, path_.toUtf8().constData(), afc_mode, &handle_);
|
||||
connection_->afc(), path_.toUtf8().constData(), afc_mode, &handle_);
|
||||
if (err != AFC_E_SUCCESS) {
|
||||
return false;
|
||||
}
|
||||
@ -47,12 +41,18 @@ bool AfcFile::open(QIODevice::OpenMode mode) {
|
||||
}
|
||||
|
||||
void AfcFile::close() {
|
||||
afc_file_close(client_, handle_);
|
||||
if (handle_) {
|
||||
if (afc_file_close(connection_->afc(), handle_) != AFC_E_SUCCESS) {
|
||||
// Warn the connection not to free its lockdownd, as doing so will cause
|
||||
// a load of "Broken pipe" errors.
|
||||
connection_->MarkBroken();
|
||||
}
|
||||
}
|
||||
QIODevice::close();
|
||||
}
|
||||
|
||||
bool AfcFile::seek(qint64 pos) {
|
||||
afc_error_t err = afc_file_seek(client_, handle_, pos, SEEK_SET);
|
||||
afc_error_t err = afc_file_seek(connection_->afc(), handle_, pos, SEEK_SET);
|
||||
if (err != AFC_E_SUCCESS) {
|
||||
return false;
|
||||
}
|
||||
@ -62,7 +62,7 @@ bool AfcFile::seek(qint64 pos) {
|
||||
|
||||
qint64 AfcFile::readData(char* data, qint64 max_size) {
|
||||
uint32_t bytes_read = 0;
|
||||
afc_error_t err = afc_file_read(client_, handle_, data, max_size, &bytes_read);
|
||||
afc_error_t err = afc_file_read(connection_->afc(), handle_, data, max_size, &bytes_read);
|
||||
if (err != AFC_E_SUCCESS) {
|
||||
return -1;
|
||||
}
|
||||
@ -71,9 +71,13 @@ qint64 AfcFile::readData(char* data, qint64 max_size) {
|
||||
|
||||
qint64 AfcFile::writeData(const char* data, qint64 max_size) {
|
||||
uint32_t bytes_written = 0;
|
||||
afc_error_t err = afc_file_write(client_, handle_, data, max_size, &bytes_written);
|
||||
afc_error_t err = afc_file_write(connection_->afc(), handle_, data, max_size, &bytes_written);
|
||||
if (err != AFC_E_SUCCESS) {
|
||||
return -1;
|
||||
}
|
||||
return bytes_written;
|
||||
}
|
||||
|
||||
qint64 AfcFile::size() const {
|
||||
return connection_->GetFileInfo(path_, "st_size").toLongLong();
|
||||
}
|
||||
|
@ -13,7 +13,6 @@ class AfcFile : public QIODevice {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AfcFile(afc_client_t client, const QString& path, QObject* parent = 0);
|
||||
AfcFile(iMobileDeviceConnection* connection, const QString& path, QObject* parent = 0);
|
||||
~AfcFile();
|
||||
|
||||
@ -21,13 +20,14 @@ public:
|
||||
void close();
|
||||
bool open(OpenMode mode);
|
||||
bool seek(qint64 pos);
|
||||
qint64 size() const;
|
||||
|
||||
private:
|
||||
// QIODevice
|
||||
qint64 readData(char* data, qint64 max_size);
|
||||
qint64 writeData(const char* data, qint64 max_size);
|
||||
|
||||
afc_client_t client_;
|
||||
iMobileDeviceConnection* connection_;
|
||||
uint64_t handle_;
|
||||
|
||||
QString path_;
|
||||
|
@ -22,6 +22,8 @@
|
||||
#include <QDir>
|
||||
#include <QtDebug>
|
||||
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
|
||||
AfcTransfer::AfcTransfer(const QString& uuid, const QString& local_destination,
|
||||
TaskManager* task_manager, QObject* parent)
|
||||
: QObject(parent),
|
||||
@ -30,6 +32,10 @@ AfcTransfer::AfcTransfer(const QString& uuid, const QString& local_destination,
|
||||
local_destination_(local_destination)
|
||||
{
|
||||
original_thread_ = thread();
|
||||
|
||||
important_directories_ << "/iTunes_Control/Artwork";
|
||||
important_directories_ << "/iTunes_Control/Device";
|
||||
important_directories_ << "/iTunes_Control/iTunes";
|
||||
}
|
||||
|
||||
void AfcTransfer::CopyFromDevice() {
|
||||
@ -42,28 +48,62 @@ void AfcTransfer::CopyFromDevice() {
|
||||
// Connect to the device
|
||||
iMobileDeviceConnection c(uuid_);
|
||||
|
||||
CopyDirFromDevice(&c, "/iTunes_Control/Artwork");
|
||||
CopyDirFromDevice(&c, "/iTunes_Control/Device");
|
||||
CopyDirFromDevice(&c, "/iTunes_Control/iTunes");
|
||||
// Copy directories. If one fails we stop.
|
||||
bool success = true;
|
||||
foreach (const QString& dir, important_directories_) {
|
||||
if (!CopyDirFromDevice(&c, dir)) {
|
||||
success = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (task_manager_) {
|
||||
moveToThread(original_thread_);
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
emit CopyFinished();
|
||||
emit CopyFinished(success);
|
||||
}
|
||||
}
|
||||
|
||||
void AfcTransfer::CopyDirFromDevice(iMobileDeviceConnection* c, const QString& path) {
|
||||
bool AfcTransfer::CopyToDevice() {
|
||||
// Connect to the device
|
||||
iMobileDeviceConnection c(uuid_);
|
||||
|
||||
foreach (const QString& dir, important_directories_)
|
||||
if (!CopyDirToDevice(&c, dir))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AfcTransfer::CopyDirFromDevice(iMobileDeviceConnection* c, const QString& path) {
|
||||
foreach (const QString& filename, c->ReadDirectory(path, QDir::Files | QDir::NoDotAndDotDot)) {
|
||||
CopyFileFromDevice(c, path + "/" + filename);
|
||||
if (!CopyFileFromDevice(c, path + "/" + filename))
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (const QString& dir, c->ReadDirectory(path, QDir::Dirs | QDir::NoDotAndDotDot)) {
|
||||
CopyDirFromDevice(c, path + "/" + dir);
|
||||
if (!CopyDirFromDevice(c, path + "/" + dir))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void AfcTransfer::CopyFileFromDevice(iMobileDeviceConnection *c, const QString &path) {
|
||||
bool AfcTransfer::CopyDirToDevice(iMobileDeviceConnection* c, const QString& path) {
|
||||
QDir dir(local_destination_ + path);
|
||||
|
||||
foreach (const QString& filename, dir.entryList(QDir::Files | QDir::NoDotAndDotDot)) {
|
||||
if (!CopyFileToDevice(c, path + "/" + filename))
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach (const QString& dir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
|
||||
if (!CopyDirToDevice(c, path + "/" + dir))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool AfcTransfer::CopyFileFromDevice(iMobileDeviceConnection *c, const QString &path) {
|
||||
QString local_filename = local_destination_ + path;
|
||||
QString local_dir = local_filename.section('/', 0, -2);
|
||||
|
||||
@ -73,42 +113,52 @@ void AfcTransfer::CopyFileFromDevice(iMobileDeviceConnection *c, const QString &
|
||||
QFile dest(local_filename);
|
||||
AfcFile source(c, path);
|
||||
|
||||
dest.open(QIODevice::WriteOnly);
|
||||
source.open(QIODevice::ReadOnly);
|
||||
|
||||
dest.write(source.readAll());
|
||||
return Copy(&source, &dest);
|
||||
}
|
||||
|
||||
void AfcTransfer::CopyToDevice() {
|
||||
// Connect to the device
|
||||
iMobileDeviceConnection c(uuid_);
|
||||
|
||||
CopyDirToDevice(&c, "/iTunes_Control/Artwork");
|
||||
CopyDirToDevice(&c, "/iTunes_Control/Device");
|
||||
CopyDirToDevice(&c, "/iTunes_Control/iTunes");
|
||||
}
|
||||
|
||||
void AfcTransfer::CopyDirToDevice(iMobileDeviceConnection* c, const QString& path) {
|
||||
QDir dir(local_destination_ + path);
|
||||
|
||||
foreach (const QString& filename, dir.entryList(QDir::Files | QDir::NoDotAndDotDot)) {
|
||||
CopyFileToDevice(c, path + "/" + filename);
|
||||
}
|
||||
|
||||
foreach (const QString& dir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) {
|
||||
CopyDirToDevice(c, path + "/" + dir);
|
||||
}
|
||||
}
|
||||
|
||||
void AfcTransfer::CopyFileToDevice(iMobileDeviceConnection *c, const QString &path) {
|
||||
QString local_filename = local_destination_ + path;
|
||||
qDebug() << "Copying file" << path;
|
||||
|
||||
QFile source(local_filename);
|
||||
bool AfcTransfer::CopyFileToDevice(iMobileDeviceConnection *c, const QString &path) {
|
||||
QFile source(local_destination_ + path);
|
||||
AfcFile dest(c, path);
|
||||
|
||||
dest.open(QIODevice::WriteOnly);
|
||||
source.open(QIODevice::ReadOnly);
|
||||
|
||||
dest.write(source.readAll());
|
||||
return Copy(&source, &dest);
|
||||
}
|
||||
|
||||
bool AfcTransfer::Copy(QIODevice* source, QIODevice* destination) {
|
||||
if (!source->open(QIODevice::ReadOnly))
|
||||
return false;
|
||||
|
||||
if (!destination->open(QIODevice::WriteOnly))
|
||||
return false;
|
||||
|
||||
const qint64 bytes = source->size();
|
||||
char* data = new char[bytes];
|
||||
qint64 pos = 0;
|
||||
|
||||
forever {
|
||||
const qint64 bytes_read = source->read(data + pos, bytes - pos);
|
||||
if (bytes_read == -1) {
|
||||
delete[] data;
|
||||
return false;
|
||||
}
|
||||
|
||||
pos += bytes_read;
|
||||
if (bytes_read == 0 || pos == bytes)
|
||||
break;
|
||||
}
|
||||
|
||||
pos = 0;
|
||||
forever {
|
||||
const qint64 bytes_written = destination->write(data + pos, bytes - pos);
|
||||
if (bytes_written == -1) {
|
||||
delete[] data;
|
||||
return false;
|
||||
}
|
||||
|
||||
pos += bytes_written;
|
||||
if (bytes_written == 0 || pos == bytes)
|
||||
break;
|
||||
}
|
||||
|
||||
delete[] data;
|
||||
return true;
|
||||
}
|
||||
|
@ -18,10 +18,13 @@
|
||||
#define AFCTRANSFER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QStringList>
|
||||
|
||||
class iMobileDeviceConnection;
|
||||
class TaskManager;
|
||||
|
||||
class QIODevice;
|
||||
|
||||
class AfcTransfer : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
@ -29,19 +32,22 @@ public:
|
||||
AfcTransfer(const QString& uuid, const QString& local_destination,
|
||||
TaskManager* task_manager, QObject* parent = 0);
|
||||
|
||||
bool CopyToDevice();
|
||||
|
||||
public slots:
|
||||
void CopyFromDevice();
|
||||
void CopyToDevice();
|
||||
|
||||
signals:
|
||||
void TaskStarted(int task_id);
|
||||
void CopyFinished();
|
||||
void CopyFinished(bool success);
|
||||
|
||||
private:
|
||||
void CopyDirFromDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
void CopyFileFromDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
void CopyDirToDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
void CopyFileToDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
bool CopyDirFromDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
bool CopyDirToDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
bool CopyFileFromDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
bool CopyFileToDevice(iMobileDeviceConnection* c, const QString& path);
|
||||
|
||||
static bool Copy(QIODevice* source, QIODevice* destination);
|
||||
|
||||
private:
|
||||
QThread* original_thread_;
|
||||
@ -49,6 +55,8 @@ private:
|
||||
TaskManager* task_manager_;
|
||||
QString uuid_;
|
||||
QString local_destination_;
|
||||
|
||||
QStringList important_directories_;
|
||||
};
|
||||
|
||||
#endif // AFCTRANSFER_H
|
||||
|
@ -44,9 +44,14 @@ void GPodLoader::LoadDatabase() {
|
||||
|
||||
// Check for errors
|
||||
if (!db) {
|
||||
qDebug() << "GPodLoader error:" << error->message;
|
||||
emit Error(QString::fromUtf8(error->message));
|
||||
g_error_free(error);
|
||||
if (error) {
|
||||
qDebug() << "GPodLoader error:" << error->message;
|
||||
emit Error(QString::fromUtf8(error->message));
|
||||
g_error_free(error);
|
||||
} else {
|
||||
emit Error(tr("An error occurred loading the iTunes database"));
|
||||
}
|
||||
|
||||
task_manager_->SetTaskFinished(task_id);
|
||||
return;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ using boost::scoped_ptr;
|
||||
#include <QtDebug>
|
||||
|
||||
iMobileDeviceConnection::iMobileDeviceConnection(const QString& uuid)
|
||||
: device_(NULL), lockdown_(NULL), afc_(NULL), afc_port_(0) {
|
||||
: device_(NULL), lockdown_(NULL), afc_(NULL), afc_port_(0), broken_(false) {
|
||||
idevice_error_t err = idevice_new(&device_, uuid.toUtf8().constData());
|
||||
if (err != IDEVICE_E_SUCCESS) {
|
||||
qWarning() << "idevice error:" << err;
|
||||
@ -58,7 +58,7 @@ iMobileDeviceConnection::~iMobileDeviceConnection() {
|
||||
if (afc_) {
|
||||
afc_client_free(afc_);
|
||||
}
|
||||
if (lockdown_) {
|
||||
if (lockdown_ && !broken_) {
|
||||
lockdownd_client_free(lockdown_);
|
||||
}
|
||||
if (device_) {
|
||||
|
@ -43,15 +43,18 @@ public:
|
||||
|
||||
QString GetUnusedFilename(Itdb_iTunesDB* itdb, const Song& metadata);
|
||||
|
||||
void MarkBroken() { broken_ = true; }
|
||||
|
||||
private:
|
||||
Q_DISABLE_COPY(iMobileDeviceConnection);
|
||||
|
||||
|
||||
idevice_t device_;
|
||||
lockdownd_client_t lockdown_;
|
||||
afc_client_t afc_;
|
||||
|
||||
uint16_t afc_port_;
|
||||
|
||||
bool broken_;
|
||||
};
|
||||
|
||||
#endif // IMOBILEDEVICECONNECTION_H
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -210,6 +210,15 @@ msgstr "Vždy skryj hlavní okno"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Vždy zobraz hlavní okno"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -210,6 +210,15 @@ msgstr "Skjul altid hovedvinduet"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Vis altid hovedvinduet"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Der er sket en ukendt last.fm fejl: %1"
|
||||
|
@ -214,6 +214,15 @@ msgstr "Clementine immer verstecken"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Clementine anzeigen"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Unbekannter Last.fm Fehler: %1"
|
||||
|
@ -216,6 +216,15 @@ msgstr "Να κρύβεις πάντα το κύριο παράθυρο"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Να εμφανίζεις πάντα το κύριο παράθυρο"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Προέκυψε ένα άγνωστο σφάλμα στο last.fm: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr "Always hide the main window"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Always show the main window"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "An unknown Last.fm error occurred: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr "Always hide the main window"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Always show the main window"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -216,6 +216,15 @@ msgstr "Siempre ocultar la ventana principal"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Siempre mostrar la ventana principal"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Un error desconocido de last.fm ha ocurrido: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Tuntematon last.fm-virhe: %1"
|
||||
|
@ -210,6 +210,15 @@ msgstr "Toujours cacher la fenêtre principale"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Toujours afficher la fenêtre principale"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Une erreur inconnue de last.fm est survenue : %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -216,6 +216,15 @@ msgstr "Nascondi sempre la finestra principale"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Mostra sempre la finestra principale"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Si è verificato un errore di last.fm: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -209,6 +209,15 @@ msgstr "Alltid gjem hovedvinduet"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Alltid vis hovedvinduet"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -213,6 +213,15 @@ msgstr "Hoofdscherm altijd verbergen"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Hoofdscherm altijd weergeven"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Er is een onbekende last.fm fout opgetreden: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -210,6 +210,15 @@ msgstr "Zawsze ukrywaj główne okno"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Zawsze wyświetlaj główne okno"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Wystąpił nieznany błąd last.fm: %1"
|
||||
|
@ -213,6 +213,15 @@ msgstr "Ocultar sempre a janela principal"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Mostrar sempre a janela principal"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Ocorreu um erro last.fm desconhecido: %1"
|
||||
|
@ -212,6 +212,15 @@ msgstr "Sempre esconder a janela principal"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Sempre exibir a janela principal"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Ocorreu um erro desconhecido no Last.fm %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr "Ascunde întotdeauna fereastra principală"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Arată întotdeauna fereastra principală"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -212,6 +212,15 @@ msgstr "Всегда скрывать главное окно"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Всегда показывать главное окно"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Неизвестная ошибка last.fm: %1"
|
||||
|
@ -214,6 +214,15 @@ msgstr "Vždy skryť hlavné okno"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Vždy zobrazovať hlavné okno"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Vyskytla sa neznáma last.fm chyba: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr "Увек сакриј главни прозор"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Увек прикажи главни прозор"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Непозната ЛастФМ грешка: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr "Dölj alltid huvudfönstret"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Visa alltid huvudfönstret"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Ett okänt last.fm fel inträffade: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr "Ana pencereyi her zaman gizle"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Ana pencereyi her zaman göster"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Bilinmeyen bir last.fm hatası meydana geldi: %1"
|
||||
|
@ -199,6 +199,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -213,6 +213,15 @@ msgstr "Завжди приховувати головне вікно"
|
||||
msgid "Always show the main window"
|
||||
msgstr "Завжди показувати головне вікно"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "Виникла невідома помилка last.fm: %1"
|
||||
|
@ -209,6 +209,15 @@ msgstr ""
|
||||
msgid "Always show the main window"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr ""
|
||||
|
@ -213,6 +213,15 @@ msgstr "總是隱藏主要視窗"
|
||||
msgid "Always show the main window"
|
||||
msgstr "總是顯示主要視窗"
|
||||
|
||||
msgid "An error occurred copying the iTunes database from the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred copying the iTunes database onto the device"
|
||||
msgstr ""
|
||||
|
||||
msgid "An error occurred loading the iTunes database"
|
||||
msgstr ""
|
||||
|
||||
#, qt-format
|
||||
msgid "An unknown last.fm error occurred: %1"
|
||||
msgstr "一個未知的last.fm錯誤出現: %1"
|
||||
|
Loading…
x
Reference in New Issue
Block a user