aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/General')
-rw-r--r--src/plugins/General/library/library.cpp96
-rw-r--r--src/plugins/General/library/library.h13
-rw-r--r--src/plugins/General/library/library.pro2
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