Improve error handling while transferring the iTunes database to/from the iPod

This commit is contained in:
David Sansome 2010-08-09 19:24:17 +00:00
parent f078edf0db
commit e65c710b5f
40 changed files with 432 additions and 73 deletions

View File

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

View File

@ -50,7 +50,7 @@ protected:
void FinaliseDatabase();
private slots:
void CopyFinished();
void CopyFinished(bool success);
private:
void RemoveRecursive(const QString& path);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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