diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-11-06 20:27:42 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-11-06 20:27:42 +0000 |
| commit | f25ee4376455f09aa3f321a0379fdf344c5df96d (patch) | |
| tree | 77fa67ebe1ebdc08f238aa94b3b4707c3f0bcda7 /src/plugins | |
| parent | ef748ebbbe538328b5ecc4ec2882614fcad2c753 (diff) | |
| download | qmmp-f25ee4376455f09aa3f321a0379fdf344c5df96d.tar.gz qmmp-f25ee4376455f09aa3f321a0379fdf344c5df96d.tar.bz2 qmmp-f25ee4376455f09aa3f321a0379fdf344c5df96d.zip | |
library: prepare for directory scanner implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9554 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/General/library/library.cpp | 96 | ||||
| -rw-r--r-- | src/plugins/General/library/library.h | 13 | ||||
| -rw-r--r-- | src/plugins/General/library/library.pro | 2 |
3 files changed, 108 insertions, 3 deletions
diff --git a/src/plugins/General/library/library.cpp b/src/plugins/General/library/library.cpp index 711b2e702..3f24d1a85 100644 --- a/src/plugins/General/library/library.cpp +++ b/src/plugins/General/library/library.cpp @@ -29,7 +29,10 @@ #include <QJsonDocument> #include <QJsonObject> #include <QHash> +#include <QtConcurrent> #include <qmmpui/uihelper.h> +#include <qmmpui/playlisttrack.h> +#include <qmmp/metadatamanager.h> #include <qmmp/soundcore.h> //#include "historywindow.h" #include "library.h" @@ -80,6 +83,13 @@ void Library::showLibraryWindow() m_historyWindow->activateWindow();*/ } +void Library::startDirectoryScanning() +{ + m_filters = MetaDataManager::instance()->nameFilters(); + QStringList dirs = { "/home/user" }; + m_future = QtConcurrent::run(this, &Library::scanDirectories, dirs); +} + bool Library::createTables() { QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME); @@ -110,7 +120,7 @@ void Library::addTrack(TrackInfo *track, const QString &filePath) query.prepare("INSERT INTO track_library VALUES(" "NULL, :timestamp, " ":title, :artist, :albumartist, :album TEXT, :comment, :genre, :composer, " - ":year, :track, :discnumer INTEGER, :duration, " + ":year, :track, :discnumber INTEGER, :duration, " ":audioinfo, :url, :filepath)"); query.bindValue(":timestamp", QFileInfo(filePath).lastModified()); @@ -136,7 +146,7 @@ QByteArray Library::serializeAudioInfo(const QMap<Qmmp::TrackProperty, QString> QMap<Qmmp::TrackProperty, QString>::const_iterator it = properties.cbegin(); while(it != properties.cend()) { - QString value = properties[it.key()]; + QString value = properties[it.key()]; switch(it.key()) { @@ -170,3 +180,85 @@ QByteArray Library::serializeAudioInfo(const QMap<Qmmp::TrackProperty, QString> return QJsonDocument(obj).toJson(QJsonDocument::Compact); } + +bool Library::scanDirectories(const QStringList &paths) +{ + m_stopped = false; + + for(const QString &path : qAsConst(paths)) + { + addDirectory(path); + if(m_stopped) + return false; + } + + return true; +} + +void Library::addDirectory(const QString &s) +{ + QList<PlayListTrack *> tracks; + QStringList ignoredPaths; + QDir dir(s); + dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); + dir.setSorting(QDir::Name); + QFileInfoList l = dir.entryInfoList(m_filters); + + for(const QFileInfo &info : qAsConst(l)) + { + //if(checkRestrictFilters(info) && checkExcludeFilters(info)) + { + QStringList paths; + tracks.append(processFile(info.absoluteFilePath (), &ignoredPaths)); + ignoredPaths.append(paths); + } + + if (m_stopped) + { + qDeleteAll(tracks); + tracks.clear(); + return; + } + + /*if(tracks.count() > 30) //do not send more than 30 tracks at once + { + removeIgnoredTracks(&tracks, ignoredPaths); + emit newTracksToInsert(before, tracks); + tracks.clear(); + ignoredPaths.clear(); + }*/ + } + + /*if(!tracks.isEmpty()) + { + removeIgnoredTracks(&tracks, ignoredPaths); + emit newTracksToInsert(before, tracks); + ignoredPaths.clear(); + }*/ + + dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); + dir.setSorting(QDir::Name); + l.clear(); + l = dir.entryInfoList(); + + for (int i = 0; i < l.size(); ++i) + { + QFileInfo fileInfo = l.at(i); + addDirectory(fileInfo.absoluteFilePath()); + if (m_stopped) + return; + } +} + +QList<PlayListTrack *> Library::processFile(const QString &path, QStringList *ignoredPaths) +{ + QList<PlayListTrack *> tracks; + const QList<TrackInfo *> infoList = MetaDataManager::instance()->createPlayList(path, TrackInfo::AllParts, ignoredPaths); + + for(TrackInfo *info : qAsConst(infoList)) + { + tracks.append(new PlayListTrack(info)); + } + qDeleteAll(infoList); + return tracks; +} diff --git a/src/plugins/General/library/library.h b/src/plugins/General/library/library.h index b4baff608..ddd5e6f7e 100644 --- a/src/plugins/General/library/library.h +++ b/src/plugins/General/library/library.h @@ -24,10 +24,13 @@ #include <QObject> #include <QElapsedTimer> #include <QPointer> +#include <QFuture> +#include <QStringList> #include <qmmp/trackinfo.h> #include <qmmp/qmmp.h> class SoundCore; +class PlayListTrack; //class HistoryWindow; class Library : public QObject @@ -40,10 +43,20 @@ public: private slots: void showLibraryWindow(); +private slots: + void startDirectoryScanning(); + private: bool createTables(); void addTrack(TrackInfo *track, const QString &filePath); QByteArray serializeAudioInfo(const QMap<Qmmp::TrackProperty, QString> &properties); + bool scanDirectories(const QStringList &paths); + void addDirectory(const QString &s); + QList<PlayListTrack *> processFile(const QString &path, QStringList *ignoredPaths); + + QFuture<bool> m_future; + QStringList m_filters; + bool m_stopped = false; }; diff --git a/src/plugins/General/library/library.pro b/src/plugins/General/library/library.pro index 5b2848ce2..4cfcc18fe 100644 --- a/src/plugins/General/library/library.pro +++ b/src/plugins/General/library/library.pro @@ -2,7 +2,7 @@ include(../../plugins.pri) TARGET = $$PLUGINS_PREFIX/General/library -QT += sql +QT += sql concurrent HEADERS += libraryfactory.h \ library.h |
