diff options
author | Dominik Holland <dominik.holland@pelagicore.com> | 2019-04-18 10:40:32 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@pelagicore.com> | 2019-05-08 13:25:16 +0000 |
commit | c5bc28dfcf81469680046387c8b3914e50c11496 (patch) | |
tree | 8f18008a3c54d7d4983965a40ce8428c57e1a0be | |
parent | a04a9fb88a5dbaac7ae81dfa4c4b3b0590a53fb2 (diff) |
Improve the USB-simulation of the media-simulator backend
All found USB devices are now passed to the indexer at start or when
a new USB device is found.
The indexer now also makes sure to delete all tracks from the USB device
from all database tables, incl. the playqueue.
The indexer informs the player about every index it removed and the player
can inform the UI about the new playqueue content.
Change-Id: I235084b5781ae70c9b44c42c386ef20c35f8ec84
Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
8 files changed, 72 insertions, 13 deletions
diff --git a/src/plugins/ivimedia/doc/src/backends.qdoc b/src/plugins/ivimedia/doc/src/backends.qdoc index 411a997..36efa01 100644 --- a/src/plugins/ivimedia/doc/src/backends.qdoc +++ b/src/plugins/ivimedia/doc/src/backends.qdoc @@ -84,7 +84,7 @@ For the SearchAndBrowseModel the following contenTypes are supported: \endlist The backend uses QtMultimedia to offer real media playback on various platforms. -The indexer will automatically start to index all \c mp3 files in the media folder. +The indexer will automatically start to index all \c .mp3 files in the media folder. For the SearchAndBrowseModel the following contenTypes are supported: \list @@ -104,6 +104,16 @@ the following navigation paths: \note On systems where \c taglib is disabled, indexing of files doesn't work and because of that the media database can't be created. +The MediaDiscoveryModel provides a simulation of USB thumb drives and can be configured using the the +\c QTIVIMEDIA_SIMULATOR_DEVICEFOLDER environment variable, which needs to be set to an absolute path. +Every sub-folder within that path is recognized as a new USB thumb drive. + +Using the SearchAndBrowseModel on the discovered media devices, the \c file contentType can be used to +navigate through the device's folder structure. + +Every new device discovered is automatically indexed and all \c .mp3 files can be retrieved using the +the SearchAndBrowseModel connected to the media player's service object to browse the library. + \section1 Configuration This backend uses environment variables for its configuration. By default it will write its database diff --git a/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.cpp b/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.cpp index 9c5723d..0ba607e 100644 --- a/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.cpp +++ b/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.cpp @@ -45,6 +45,7 @@ #include "usbdevice.h" #include <QDir> +#include <QTimer> #include <QtDebug> MediaDiscoveryBackend::MediaDiscoveryBackend(QObject *parent) @@ -57,6 +58,12 @@ MediaDiscoveryBackend::MediaDiscoveryBackend(QObject *parent) else m_deviceFolder = customDeviceFolder; + const QDir deviceFolder(m_deviceFolder); + const QStringList folders = deviceFolder.entryList(QDir::Dirs | QDir::NoDotAndDotDot); + for (const QString &folder : folders) { + qCDebug(media) << "Adding USB Device for: " << folder; + m_deviceMap.insert(folder, new USBDevice(deviceFolder.absoluteFilePath(folder))); + } } void MediaDiscoveryBackend::initialize() @@ -66,16 +73,15 @@ void MediaDiscoveryBackend::initialize() connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &MediaDiscoveryBackend::onDirectoryChanged); #endif - QDir deviceFolder(m_deviceFolder); - const QStringList folders = deviceFolder.entryList(QDir::Dirs | QDir::NoDotAndDotDot); - for (const QString &folder : folders) { - qCDebug(media) << "Adding USB Device for: " << folder; - m_deviceMap.insert(folder, new USBDevice(deviceFolder.absoluteFilePath(folder))); - } emit availableDevices(m_deviceMap.values()); emit initializationDone(); } +QMap<QString, QIviServiceObject*> MediaDiscoveryBackend::deviceMap() const +{ + return m_deviceMap; +} + void MediaDiscoveryBackend::onDirectoryChanged(const QString &path) { Q_UNUSED(path) @@ -104,6 +110,9 @@ void MediaDiscoveryBackend::onDirectoryChanged(const QString &path) USBDevice *device = new USBDevice(deviceFolder.absoluteFilePath(folder)); m_deviceMap.insert(folder, device); emit deviceAdded(device); - emit mediaDirectoryAdded(deviceFolder.absoluteFilePath(folder)); + const QString absFolder = deviceFolder.absoluteFilePath(folder); + // If we point the simulation to a real mount location, give the mount some time to actually make + // the files accessible + QTimer::singleShot(2000, this, [this, absFolder](){emit mediaDirectoryAdded(absFolder);}); } } diff --git a/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.h b/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.h index b3072de..1bc32f3 100644 --- a/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.h +++ b/src/plugins/ivimedia/media_simulator/mediadiscoverybackend.h @@ -57,6 +57,8 @@ public: void initialize() override; + QMap<QString, QIviServiceObject*> deviceMap() const; + private slots: void onDirectoryChanged(const QString &path); diff --git a/src/plugins/ivimedia/media_simulator/mediaindexerbackend.cpp b/src/plugins/ivimedia/media_simulator/mediaindexerbackend.cpp index 678a114..acc0679 100644 --- a/src/plugins/ivimedia/media_simulator/mediaindexerbackend.cpp +++ b/src/plugins/ivimedia/media_simulator/mediaindexerbackend.cpp @@ -142,14 +142,32 @@ bool MediaIndexerBackend::scanWorker(const QString &mediaDir, bool removeData) qCInfo(media) << "Removing content: " << mediaDir; QSqlQuery query(m_db); - bool ret = query.exec(QStringLiteral("DELETE from track WHERE file LIKE '%1%'").arg(mediaDir)); + bool ret = query.exec(QStringLiteral("SELECT queue.qindex FROM track JOIN queue ON queue.track_index=track.id WHERE file LIKE '%1%'").arg(mediaDir)); + if (ret) { + while (query.next()) + emit removeFromQueue(query.value(0).toInt()); + } else { + setState(QIviMediaIndexerControl::Error); + sqlError(this, query.lastQuery(), query.lastError().text()); + return false; + } + + ret = query.exec(QStringLiteral("DELETE from queue WHERE track_index IN (SELECT id FROM track WHERE file LIKE '%1%')").arg(mediaDir)); + if (!ret) { + setState(QIviMediaIndexerControl::Error); + sqlError(this, query.lastQuery(), query.lastError().text()); + return false; + } + ret = query.exec(QStringLiteral("DELETE from track WHERE file LIKE '%1%'").arg(mediaDir)); if (!ret) { setState(QIviMediaIndexerControl::Error); sqlError(this, query.lastQuery(), query.lastError().text()); return false; } + m_db.commit(); + return true; } diff --git a/src/plugins/ivimedia/media_simulator/mediaindexerbackend.h b/src/plugins/ivimedia/media_simulator/mediaindexerbackend.h index 2b0ea33..1f07b64 100644 --- a/src/plugins/ivimedia/media_simulator/mediaindexerbackend.h +++ b/src/plugins/ivimedia/media_simulator/mediaindexerbackend.h @@ -64,6 +64,7 @@ public: signals: void indexingDone(); + void removeFromQueue(int index); public slots: void addMediaFolder(const QString &path); diff --git a/src/plugins/ivimedia/media_simulator/mediaplugin.cpp b/src/plugins/ivimedia/media_simulator/mediaplugin.cpp index 1fb7969..68e9c8f 100644 --- a/src/plugins/ivimedia/media_simulator/mediaplugin.cpp +++ b/src/plugins/ivimedia/media_simulator/mediaplugin.cpp @@ -46,6 +46,7 @@ #include "mediaplayerbackend.h" #include "mediaplugin.h" #include "searchandbrowsebackend.h" +#include "usbdevice.h" #include "database_helper.h" #include <QtIviCore/QIviSearchAndBrowseModel> @@ -67,10 +68,21 @@ MediaPlugin::MediaPlugin(QObject *parent) m_browse = new SearchAndBrowseBackend(createDatabaseConnection(QStringLiteral("model"), dbFile), this); m_indexer = new MediaIndexerBackend(createDatabaseConnection(QStringLiteral("indexer"), dbFile), this); - connect(m_discovery, &MediaDiscoveryBackend::mediaDirectoryAdded, - m_indexer, &MediaIndexerBackend::addMediaFolder); - connect(m_discovery, &MediaDiscoveryBackend::mediaDirectoryRemoved, - m_indexer, &MediaIndexerBackend::removeMediaFolder); + auto deviceMap = m_discovery->deviceMap(); + for (auto it = deviceMap.cbegin(); it != deviceMap.cend(); it++) { + USBDevice *device = qobject_cast<USBDevice*>(it.value()); + if (!device) + continue; + m_indexer->addMediaFolder(device->folder()); + } + + QObject::connect(m_indexer, &MediaIndexerBackend::removeFromQueue, + m_player, &MediaPlayerBackend::remove); + QObject::connect(m_discovery, &MediaDiscoveryBackend::mediaDirectoryAdded, + m_indexer, &MediaIndexerBackend::addMediaFolder); + QObject::connect(m_discovery, &MediaDiscoveryBackend::mediaDirectoryRemoved, + m_indexer, &MediaIndexerBackend::removeMediaFolder); + } QStringList MediaPlugin::interfaces() const diff --git a/src/plugins/ivimedia/media_simulator/usbdevice.cpp b/src/plugins/ivimedia/media_simulator/usbdevice.cpp index 773b4ad..17b45f0 100644 --- a/src/plugins/ivimedia/media_simulator/usbdevice.cpp +++ b/src/plugins/ivimedia/media_simulator/usbdevice.cpp @@ -65,6 +65,11 @@ void USBDevice::eject() qCWarning(media) << "Ejecting a USB Device is not supported in the simulation"; } +QString USBDevice::folder() const +{ + return m_folder; +} + QStringList USBDevice::interfaces() const { QStringList list; diff --git a/src/plugins/ivimedia/media_simulator/usbdevice.h b/src/plugins/ivimedia/media_simulator/usbdevice.h index 410fc77..2498c39 100644 --- a/src/plugins/ivimedia/media_simulator/usbdevice.h +++ b/src/plugins/ivimedia/media_simulator/usbdevice.h @@ -56,6 +56,8 @@ public: QString name() const override; void eject() override; + QString folder() const; + QStringList interfaces() const override; QIviFeatureInterface *interfaceInstance(const QString &interface) const override; |