diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-11-08 21:13:30 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2020-11-08 21:13:30 +0000 |
| commit | 535b1b660d33481d6fd11152d9dec211fcc295f0 (patch) | |
| tree | b9a3f6935a8fed52f06e0f41ad8eb25078c36a8c /src | |
| parent | 6db7523f677147667d7cd3833c34520f412fb456 (diff) | |
| download | qmmp-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.cpp | 87 | ||||
| -rw-r--r-- | src/plugins/General/library/library.h | 4 |
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; |
