mirror of
https://github.com/clementine-player/Clementine
synced 2025-01-27 09:41:32 +01:00
Support copying files to MTP devices
This commit is contained in:
parent
3f5e188045
commit
9fda03aa60
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
69
src/devices/mtpconnection.cpp
Normal file
69
src/devices/mtpconnection.cpp
Normal 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_);
|
||||
}
|
38
src/devices/mtpconnection.h
Normal file
38
src/devices/mtpconnection.h
Normal 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
|
@ -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) {
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 "Магнатјун"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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 ""
|
||||
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user