aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-11-08 21:13:30 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2020-11-08 21:13:30 +0000
commit535b1b660d33481d6fd11152d9dec211fcc295f0 (patch)
treeb9a3f6935a8fed52f06e0f41ad8eb25078c36a8c /src
parent6db7523f677147667d7cd3833c34520f412fb456 (diff)
downloadqmmp-535b1b660d33481d6fd11152d9dec211fcc295f0.tar.gz
qmmp-535b1b660d33481d6fd11152d9dec211fcc295f0.tar.bz2
qmmp-535b1b660d33481d6fd11152d9dec211fcc295f0.zip
library: main thread implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9561 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
-rw-r--r--src/plugins/General/library/library.cpp87
-rw-r--r--src/plugins/General/library/library.h4
2 files changed, 63 insertions, 28 deletions
diff --git a/src/plugins/General/library/library.cpp b/src/plugins/General/library/library.cpp
index 0964e14b5..cd0641cd9 100644
--- a/src/plugins/General/library/library.cpp
+++ b/src/plugins/General/library/library.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2017-2020 by Ilya Kotov *
+ * Copyright (C) 2020 by Ilya Kotov *
* forkotov02@ya.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -31,7 +31,6 @@
#include <QHash>
#include <QtConcurrent>
#include <qmmpui/uihelper.h>
-#include <qmmpui/playlisttrack.h>
#include <qmmp/metadatamanager.h>
#include <qmmp/soundcore.h>
//#include "historywindow.h"
@@ -68,6 +67,12 @@ Library::Library(QObject *parent) : QObject(parent)
Library::~Library()
{
+ if(m_future.isRunning())
+ {
+ m_stopped = true;
+ m_future.waitForFinished();
+ }
+
if(QSqlDatabase::contains(CONNECTION_NAME))
{
QSqlDatabase::database(CONNECTION_NAME).close();
@@ -197,8 +202,10 @@ bool Library::scanDirectories(const QStringList &paths)
void Library::addDirectory(const QString &s)
{
- QList<PlayListTrack *> tracks;
+ QList<TrackInfo *> tracks;
+ QHash<const TrackInfo *, QString> filePathHash;
QStringList ignoredPaths;
+
QDir dir(s);
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Name);
@@ -206,11 +213,18 @@ void Library::addDirectory(const QString &s)
for(const QFileInfo &info : qAsConst(l))
{
- //if(checkRestrictFilters(info) && checkExcludeFilters(info))
+ if(!checkFile(info))
{
QStringList paths;
- tracks.append(processFile(info.absoluteFilePath (), &ignoredPaths));
- ignoredPaths.append(paths);
+ const QList<TrackInfo *> pl = MetaDataManager::instance()->createPlayList(info.absoluteFilePath(), TrackInfo::AllParts, &paths);
+
+ //save local file path
+ for(const TrackInfo *t : qAsConst(pl))
+ filePathHash.insert(t, info.absoluteFilePath());
+
+ tracks << pl;
+ ignoredPaths << paths;
+
}
if (m_stopped)
@@ -219,23 +233,17 @@ void Library::addDirectory(const QString &s)
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();
- }*/
+ removeIgnoredTracks(&tracks, ignoredPaths);
+
+ for(TrackInfo *info : qAsConst(tracks))
+ addTrack(info, filePathHash.value(info));
+ qDeleteAll(tracks);
+ tracks.clear();
+
+ //filter directories
dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
dir.setSorting(QDir::Name);
l.clear();
@@ -250,15 +258,40 @@ void Library::addDirectory(const QString &s)
}
}
-QList<PlayListTrack *> Library::processFile(const QString &path, QStringList *ignoredPaths)
+bool Library::checkFile(const QFileInfo &info)
+{
+ QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME);
+
+ QSqlQuery query(db);
+ query.prepare("SELECT Timestamp FROM track_library WHERE FilePath=:filepath");
+ query.bindValue(":filepath", info.absoluteFilePath());
+ if(!query.exec())
+ {
+ qWarning("Library: exec error: %s", qPrintable(query.lastError().text()));
+ return false;
+ }
+ if(!query.next())
+ return false;
+
+ return info.lastModified() == query.value("Timestamp").toDateTime();
+}
+
+void Library::removeIgnoredTracks(QList<TrackInfo *> *tracks, const QStringList &ignoredPaths)
{
- QList<PlayListTrack *> tracks;
- const QList<TrackInfo *> infoList = MetaDataManager::instance()->createPlayList(path, TrackInfo::AllParts, ignoredPaths);
+ if(ignoredPaths.isEmpty())
+ return;
- for(const TrackInfo *info : qAsConst(infoList))
+ QList<TrackInfo *>::iterator it = tracks->begin();
+ while(it != tracks->end())
{
- tracks.append(new PlayListTrack(info));
+ if(ignoredPaths.contains((*it)->path()))
+ {
+ delete (*it);
+ it = tracks->erase(it);
+ }
+ else
+ {
+ ++it;
+ }
}
- qDeleteAll(infoList);
- return tracks;
}
diff --git a/src/plugins/General/library/library.h b/src/plugins/General/library/library.h
index ddd5e6f7e..18f9dfb9f 100644
--- a/src/plugins/General/library/library.h
+++ b/src/plugins/General/library/library.h
@@ -29,6 +29,7 @@
#include <qmmp/trackinfo.h>
#include <qmmp/qmmp.h>
+class QFileInfo;
class SoundCore;
class PlayListTrack;
//class HistoryWindow;
@@ -52,7 +53,8 @@ private:
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);
+ bool checkFile(const QFileInfo &info);
+ void removeIgnoredTracks(QList<TrackInfo *> *tracks, const QStringList &ignoredPaths);
QFuture<bool> m_future;
QStringList m_filters;