aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@pelagicore.com>2019-04-18 10:40:32 +0200
committerDominik Holland <dominik.holland@pelagicore.com>2019-05-08 13:25:16 +0000
commitc5bc28dfcf81469680046387c8b3914e50c11496 (patch)
tree8f18008a3c54d7d4983965a40ce8428c57e1a0be
parenta04a9fb88a5dbaac7ae81dfa4c4b3b0590a53fb2 (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>
-rw-r--r--src/plugins/ivimedia/doc/src/backends.qdoc12
-rw-r--r--src/plugins/ivimedia/media_simulator/mediadiscoverybackend.cpp23
-rw-r--r--src/plugins/ivimedia/media_simulator/mediadiscoverybackend.h2
-rw-r--r--src/plugins/ivimedia/media_simulator/mediaindexerbackend.cpp20
-rw-r--r--src/plugins/ivimedia/media_simulator/mediaindexerbackend.h1
-rw-r--r--src/plugins/ivimedia/media_simulator/mediaplugin.cpp20
-rw-r--r--src/plugins/ivimedia/media_simulator/usbdevice.cpp5
-rw-r--r--src/plugins/ivimedia/media_simulator/usbdevice.h2
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;