Support copying files to MTP devices

This commit is contained in:
David Sansome 2010-08-14 16:39:45 +00:00
parent 3f5e188045
commit 9fda03aa60
42 changed files with 228 additions and 283 deletions

View File

@ -525,9 +525,11 @@ if(LIBMTP_FOUND)
set(HAVE_LIBMTP ON)
include_directories(${LIBMTP_INCLUDE_DIRS})
list(APPEND SOURCES devices/mtpconnection.cpp)
list(APPEND SOURCES devices/mtpdevice.cpp)
list(APPEND SOURCES devices/mtploader.cpp)
list(APPEND SOURCES devices/mtpconnection.h)
list(APPEND HEADERS devices/mtpdevice.h)
list(APPEND HEADERS devices/mtploader.h)
endif(LIBMTP_FOUND)

View File

@ -508,6 +508,45 @@ void Song::InitFromLastFM(const lastfm::Track& track) {
default: d->filetype_ = Type_Unknown; break;
}
}
void Song::ToMTP(LIBMTP_track_t* track) const {
track->item_id = 0;
track->parent_id = 0;
track->storage_id = 0;
track->title = strdup(d->title_.toUtf8().constData());
track->artist = strdup(d->artist_.toUtf8().constData());
track->album = strdup(d->album_.toUtf8().constData());
track->composer = strdup(d->composer_.toUtf8().constData());
track->genre = strdup(d->genre_.toUtf8().constData());
track->title = strdup(d->title_.toUtf8().constData());
track->date = NULL;
track->tracknumber = d->track_;
track->duration = d->length_ * 1000;
track->samplerate = d->samplerate_;
track->nochannels = 0;
track->wavecodec = 0;
track->bitrate = d->bitrate_;
track->bitratetype = 0;
track->rating = 0;
track->usecount = 0;
track->filesize = d->filesize_;
track->modificationdate = d->mtime_;
switch (d->filetype_) {
case Type_Asf: track->filetype = LIBMTP_FILETYPE_ASF; break;
case Type_Mp4: track->filetype = LIBMTP_FILETYPE_MP4; break;
case Type_Mpeg: track->filetype = LIBMTP_FILETYPE_MP3; break;
case Type_Flac:
case Type_OggFlac: track->filetype = LIBMTP_FILETYPE_FLAC; break;
case Type_OggSpeex:
case Type_OggVorbis: track->filetype = LIBMTP_FILETYPE_OGG; break;
case Type_Wav: track->filetype = LIBMTP_FILETYPE_WAV; break;
default: track->filetype = LIBMTP_FILETYPE_UNDEF_AUDIO; break;
}
}
#endif
void Song::MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle &bundle) {

View File

@ -116,6 +116,7 @@ class Song {
#ifdef HAVE_LIBMTP
void InitFromMTP(const LIBMTP_track_t* track);
void ToMTP(LIBMTP_track_t* track) const;
#endif
static QString Decode(const TagLib::String& tag, const QTextCodec* codec);

View File

@ -0,0 +1,69 @@
/* 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 <http://www.gnu.org/licenses/>.
*/
#include "mtpconnection.h"
#include <QRegExp>
#include <QtDebug>
MtpConnection::MtpConnection(const QString& hostname)
: device_(NULL)
{
// Parse the URL
QRegExp host_re("^usb-(\\d+)-(\\d+)$");
if (host_re.indexIn(hostname) == -1) {
qWarning() << "Invalid MTP device:" << hostname;
return;
}
const unsigned int bus_location = host_re.cap(1).toInt();
const unsigned int device_num = host_re.cap(2).toInt();
// Get a list of devices from libmtp and figure out which one is ours
int count = 0;
LIBMTP_raw_device_t* raw_devices = NULL;
LIBMTP_error_number_t err = LIBMTP_Detect_Raw_Devices(&raw_devices, &count);
if (err != LIBMTP_ERROR_NONE) {
qWarning() << "MTP error:" << err;
return;
}
LIBMTP_raw_device_t* raw_device = NULL;
for (int i=0 ; i<count ; ++i) {
if (raw_devices[i].bus_location == bus_location &&
raw_devices[i].devnum == device_num) {
raw_device = &raw_devices[i];
break;
}
}
if (!raw_device) {
qWarning() << "MTP device not found";
free(raw_devices);
return;
}
// Connect to the device
device_ = LIBMTP_Open_Raw_Device(raw_device);
free(raw_devices);
}
MtpConnection::~MtpConnection() {
if (device_)
LIBMTP_Release_Device(device_);
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
#ifndef MTPCONNECTION_H
#define MTPCONNECTION_H
#include <QString>
#include <libmtp.h>
class MtpConnection {
public:
MtpConnection(const QString& hostname);
~MtpConnection();
bool is_valid() const { return device_; }
LIBMTP_mtpdevice_t* device() const { return device_; }
private:
Q_DISABLE_COPY(MtpConnection);
LIBMTP_mtpdevice_t* device_;
};
#endif // MTPCONNECTION_H

View File

@ -15,6 +15,7 @@
*/
#include "devicemanager.h"
#include "mtpconnection.h"
#include "mtpdevice.h"
#include "mtploader.h"
#include "library/librarybackend.h"
@ -22,6 +23,8 @@
#include <libmtp.h>
#include <QFile>
bool MtpDevice::sInitialisedLibMTP = false;
MtpDevice::MtpDevice(const QUrl& url, DeviceLister* lister,
@ -37,6 +40,9 @@ MtpDevice::MtpDevice(const QUrl& url, DeviceLister* lister,
}
}
MtpDevice::~MtpDevice() {
}
void MtpDevice::Init() {
InitBackendDirectory("/", first_time_, false);
model_->Init();
@ -53,20 +59,69 @@ void MtpDevice::Init() {
}
void MtpDevice::LoadFinished() {
QMutexLocker l(&db_mutex_);
db_wait_cond_.wakeAll();
loader_->deleteLater();
loader_ = NULL;
}
void MtpDevice::StartCopy() {
// Ensure only one "organise files" can be active at any one time
db_busy_.lock();
// Connect to the device
connection_.reset(new MtpConnection(url_.host()));
}
bool MtpDevice::CopyToStorage(
const QString& source, const QString& destination, const Song& metadata,
bool overwrite, bool remove_original)
const QString& source, const QString&, const Song& metadata,
bool, bool remove_original)
{
return false;
// Convert metadata
LIBMTP_track_t track;
metadata.ToMTP(&track);
// Send the file
int ret = LIBMTP_Send_Track_From_File(
connection_->device(), source.toUtf8().constData(), &track, NULL, NULL);
if (ret != 0)
return false;
// Add it to our LibraryModel
Song metadata_on_device;
metadata_on_device.InitFromMTP(&track);
metadata_on_device.set_directory_id(1);
songs_to_add_ << metadata_on_device;
// Remove the original if requested
if (remove_original) {
if (!QFile::remove(source))
return false;
}
return true;
}
void MtpDevice::FinishCopy(bool success) {
if (success) {
if (!songs_to_add_.isEmpty())
backend_->AddOrUpdateSongs(songs_to_add_);
}
songs_to_add_.clear();
songs_to_remove_.clear();
connection_.reset();
db_busy_.unlock();
}
void MtpDevice::StartDelete() {
}
bool MtpDevice::DeleteFromStorage(const Song& metadata) {
return false;
}
void MtpDevice::FinishDelete(bool success) {
}

View File

@ -22,6 +22,9 @@
#include <QMutex>
#include <QWaitCondition>
#include <boost/scoped_ptr.hpp>
class MtpConnection;
class MtpLoader;
class MtpDevice : public ConnectedDevice {
@ -31,14 +34,20 @@ public:
Q_INVOKABLE MtpDevice(const QUrl& url, DeviceLister* lister,
const QString& unique_id, DeviceManager* manager,
int database_id, bool first_time);
~MtpDevice();
static QStringList url_schemes() { return QStringList() << "mtp" << "gphoto2"; }
void Init();
void StartCopy();
bool CopyToStorage(const QString& source, const QString& destination,
const Song& metadata, bool overwrite, bool remove_original);
void FinishCopy(bool success);
void StartDelete();
bool DeleteFromStorage(const Song& metadata);
void FinishDelete(bool success);
private slots:
void LoadFinished();
@ -49,8 +58,11 @@ private:
QThread* loader_thread_;
MtpLoader* loader_;
QWaitCondition db_wait_cond_;
QMutex db_mutex_;
QMutex db_busy_;
SongList songs_to_add_;
SongList songs_to_remove_;
boost::scoped_ptr<MtpConnection> connection_;
};
#endif // MTPDEVICE_H

View File

@ -15,6 +15,7 @@
*/
#include "connecteddevice.h"
#include "mtpconnection.h"
#include "mtploader.h"
#include "core/song.h"
#include "core/taskmanager.h"
@ -49,48 +50,15 @@ void MtpLoader::LoadDatabase() {
}
bool MtpLoader::TryLoad() {
// Parse the URL
QRegExp host_re("^usb-(\\d+)-(\\d+)$");
if (host_re.indexIn(hostname_) == -1) {
emit Error(tr("Invalid MTP device: %1").arg(hostname_));
return false;
}
const unsigned int bus_location = host_re.cap(1).toInt();
const unsigned int device_num = host_re.cap(2).toInt();
// Get a list of devices from libmtp and figure out which one is ours
int count = 0;
LIBMTP_raw_device_t* raw_devices = NULL;
LIBMTP_error_number_t err = LIBMTP_Detect_Raw_Devices(&raw_devices, &count);
if (err != LIBMTP_ERROR_NONE) {
MtpConnection dev(hostname_);
if (!dev.is_valid()) {
emit Error(tr("Error connecting MTP device"));
qWarning() << "MTP error:" << err;
return false;
}
LIBMTP_raw_device_t* raw_device = NULL;
for (int i=0 ; i<count ; ++i) {
if (raw_devices[i].bus_location == bus_location &&
raw_devices[i].devnum == device_num) {
raw_device = &raw_devices[i];
break;
}
}
if (!raw_device) {
emit Error(tr("MTP device not found"));
free(raw_devices);
return false;
}
// Connect to the device
LIBMTP_mtpdevice_t* device = LIBMTP_Open_Raw_Device(raw_device);
// Load the list of songs on the device
SongList songs;
LIBMTP_track_t* tracks = LIBMTP_Get_Tracklisting_With_Callback(device, NULL, NULL);
LIBMTP_track_t* tracks = LIBMTP_Get_Tracklisting_With_Callback(dev.device(), NULL, NULL);
while (tracks) {
LIBMTP_track_t* track = tracks;
@ -109,6 +77,5 @@ bool MtpLoader::TryLoad() {
// Add the songs we've just loaded
backend_->AddOrUpdateSongs(songs);
free(raw_devices);
return true;
}

View File

@ -845,10 +845,6 @@ msgstr ""
msgid "Invalid API key"
msgstr ""
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "صيغة غير متاحة"
@ -988,9 +984,6 @@ msgstr ""
msgid "MPC"
msgstr ""
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -846,10 +846,6 @@ msgstr "Интернет"
msgid "Invalid API key"
msgstr ""
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr ""
@ -989,9 +985,6 @@ msgstr "MP4"
msgid "MPC"
msgstr ""
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -864,10 +864,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Clau de l'API no vàlida"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Format invàlid"
@ -1009,9 +1005,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -850,10 +850,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Neplatný klíč API"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Neplatný formát"
@ -993,9 +989,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -851,10 +851,6 @@ msgstr ""
msgid "Invalid API key"
msgstr "Ugyldig API-nøgle"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Ugyldig format"
@ -994,9 +990,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -864,10 +864,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Ungültiger API-Schlüssel"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Ungültiges Format"
@ -1009,9 +1005,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -866,10 +866,6 @@ msgstr "Διαδίκτυο"
msgid "Invalid API key"
msgstr "Εσφαλμένο κλειδί API"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Εσφαλμένη διαμόρφωση"
@ -1009,9 +1005,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -849,10 +849,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Invalid API key"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Invalid format"
@ -992,9 +988,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -847,10 +847,6 @@ msgstr ""
msgid "Invalid API key"
msgstr "Invalid API key"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Invalid format"
@ -990,9 +986,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -867,10 +867,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Clave API inválida"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Formato inválido"
@ -1012,9 +1008,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -847,10 +847,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr ""
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr ""
@ -990,9 +986,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -856,10 +856,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "API key invalide"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Format invalide"
@ -1003,9 +999,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -846,10 +846,6 @@ msgstr ""
msgid "Invalid API key"
msgstr "Chave non válida da API"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Formato inválido"
@ -990,9 +986,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -859,10 +859,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Érvénytelen API kulcs"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Érvénytelen formátum"
@ -1003,9 +999,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -871,10 +871,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Chiave API non valida"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Formato non valido"
@ -1016,9 +1012,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -847,10 +847,6 @@ msgstr ""
msgid "Invalid API key"
msgstr ""
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr ""
@ -990,9 +986,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -846,10 +846,6 @@ msgstr ""
msgid "Invalid API key"
msgstr ""
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr ""
@ -989,9 +985,6 @@ msgstr ""
msgid "MPC"
msgstr ""
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -849,10 +849,6 @@ msgstr "Internett"
msgid "Invalid API key"
msgstr "Ugyldig API-nøkkel"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Ugyldig format"
@ -992,9 +988,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -862,10 +862,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Ongeldige API-sleutel"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Ongeldig formaat"
@ -1006,9 +1002,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -845,10 +845,6 @@ msgstr "Sus Internet"
msgid "Invalid API key"
msgstr "Clau API pas valabla"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Format incorrècte"
@ -988,9 +984,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -853,10 +853,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Zły klucz API"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Błędny format"
@ -998,9 +994,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -860,10 +860,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Chave API inválida"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Formato inválido"
@ -1004,9 +1000,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -853,10 +853,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Chave API inválida"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Formato inválido"
@ -998,9 +994,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -846,10 +846,6 @@ msgstr ""
msgid "Invalid API key"
msgstr "Cheie API invalidă"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Format invalid"
@ -989,9 +985,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -857,10 +857,6 @@ msgstr "Интернет"
msgid "Invalid API key"
msgstr "Неправильный ключ API"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Неверный формат"
@ -1001,9 +997,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -860,10 +860,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Nefiunkčný API kľúč"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Nefunkčný formát"
@ -1003,9 +999,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -859,10 +859,6 @@ msgstr "Splet"
msgid "Invalid API key"
msgstr "Neveljaven API ključ"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Neveljavna vrsta"
@ -1002,9 +998,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -850,10 +850,6 @@ msgstr "Интернет"
msgid "Invalid API key"
msgstr "Неисправан АПИ кључ"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Неисправан формат"
@ -994,9 +990,6 @@ msgstr "MП4"
msgid "MPC"
msgstr "МПЦ"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Магнатјун"

View File

@ -855,10 +855,6 @@ msgstr "Internet"
msgid "Invalid API key"
msgstr "Felaktig API-nyckel"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Ogiltigt format"
@ -998,9 +994,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -848,10 +848,6 @@ msgstr "İnternet"
msgid "Invalid API key"
msgstr "Geçersiz API anahtarı"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Geçersiz biçim"
@ -993,9 +989,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -836,10 +836,6 @@ msgstr ""
msgid "Invalid API key"
msgstr ""
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr ""
@ -979,9 +975,6 @@ msgstr ""
msgid "MPC"
msgstr ""
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -859,10 +859,6 @@ msgstr "Інтернет"
msgid "Invalid API key"
msgstr "Неправильний ключ API"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "Не чинний формат"
@ -1002,9 +998,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"

View File

@ -845,10 +845,6 @@ msgstr ""
msgid "Invalid API key"
msgstr ""
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr ""
@ -988,9 +984,6 @@ msgstr ""
msgid "MPC"
msgstr ""
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr ""

View File

@ -851,10 +851,6 @@ msgstr "網際網路"
msgid "Invalid API key"
msgstr "無效的 API key"
#, qt-format
msgid "Invalid MTP device: %1"
msgstr ""
msgid "Invalid format"
msgstr "無效的格式"
@ -994,9 +990,6 @@ msgstr "MP4"
msgid "MPC"
msgstr "MPC"
msgid "MTP device not found"
msgstr ""
msgid "Magnatune"
msgstr "Magnatune"