diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-05-10 11:00:10 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2021-05-10 11:00:10 +0000 |
| commit | f0ad2a375ca704ae5c986b5cf027cf4150a751e3 (patch) | |
| tree | b8ac33c64faee877f64ffac974d27c692ebb74e1 /src/plugins | |
| parent | da06389b9c16c122fb676406ba122f91dcc6bbfb (diff) | |
| download | qmmp-f0ad2a375ca704ae5c986b5cf027cf4150a751e3.tar.gz qmmp-f0ad2a375ca704ae5c986b5cf027cf4150a751e3.tar.bz2 qmmp-f0ad2a375ca704ae5c986b5cf027cf4150a751e3.zip | |
library: added table for ignored files
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@10004 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins')
| -rw-r--r-- | src/plugins/General/library/library.cpp | 87 | ||||
| -rw-r--r-- | src/plugins/General/library/library.h | 4 |
2 files changed, 85 insertions, 6 deletions
diff --git a/src/plugins/General/library/library.cpp b/src/plugins/General/library/library.cpp index 83ff8c0ed..4319cf649 100644 --- a/src/plugins/General/library/library.cpp +++ b/src/plugins/General/library/library.cpp @@ -135,6 +135,7 @@ void Library::startDirectoryScanning() if(isRunning()) return; + MetaDataManager::instance()->prepareForAnotherThread(); m_filters = MetaDataManager::instance()->nameFilters(); start(QThread::IdlePriority); if(!m_libraryWidget->isNull()) @@ -161,7 +162,15 @@ bool Library::createTables() "AudioInfo BLOB, URL TEXT, FilePath TEXT, SearchString TEXT)"); if(!ok) + { qWarning("Library: unable to create table, error: %s", qPrintable(query.lastError().text())); + return false; + } + + ok = query.exec("CREATE TABLE IF NOT EXISTS ignored_files(ID INTEGER PRIMARY KEY AUTOINCREMENT, FilePath TEXT UNIQUE)"); + + if(!ok) + qWarning("Library: unable to create ignored file list, error: %s", qPrintable(query.lastError().text())); return ok; } @@ -254,6 +263,8 @@ bool Library::scanDirectories(const QStringList &paths) db.setDatabaseName(Qmmp::configDir() + "/" + "library.sqlite"); db.open(); + readIgnoredFiles(); + QSqlQuery query(db); query.exec("PRAGMA journal_mode = WAL"); query.exec("PRAGMA synchronous = NORMAL"); @@ -289,7 +300,7 @@ void Library::addDirectory(const QString &s) for(const QFileInfo &info : qAsConst(l)) { - if(!checkFile(info)) + if(!checkFile(info) && !m_ignoredFiles.contains(info.filePath())) { QStringList paths; const QList<TrackInfo *> pl = MetaDataManager::instance()->createPlayList(info.absoluteFilePath(), TrackInfo::AllParts, &paths); @@ -313,22 +324,23 @@ void Library::addDirectory(const QString &s) removeIgnoredTracks(&tracks, ignoredPaths); - for(TrackInfo *info : qAsConst(tracks)) + for(TrackInfo *info : qAsConst(tracks)) addTrack(info, filePathHash.value(info)); qDeleteAll(tracks); tracks.clear(); + updateIgnoredFiles(ignoredPaths); + //filter directories dir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); dir.setSorting(QDir::Name); l.clear(); l = dir.entryInfoList(); - for (int i = 0; i < l.size(); ++i) + for(const QFileInfo &i : qAsConst(l)) { - QFileInfo fileInfo = l.at(i); - addDirectory(fileInfo.absoluteFilePath()); + addDirectory(i.absoluteFilePath()); if (m_stopped) return; } @@ -349,7 +361,7 @@ void Library::removeMissingFiles(const QStringList &paths) QString previousPath; - while (query.next()) + while(query.next()) { QString path = query.value(0).toString(); if(previousPath == path) @@ -371,6 +383,31 @@ void Library::removeMissingFiles(const QStringList &paths) } } } + + if(!query.exec("SELECT FilePath FROM ignored_files")) + { + qWarning("Library: exec error: %s", qPrintable(query.lastError().text())); + return; + } + + while(query.next()) + { + QString path = query.value(0).toString(); + + if(!QFile::exists(path) || //remove missing or disabled file paths + !std::any_of(paths.cbegin(), paths.cend(), [path](const QString &p){ return path.startsWith(p); } )) + { + qDebug("Library: removing '%s' from ignored files", qPrintable(path)); + QSqlQuery rmQuery(db); + rmQuery.prepare("DELETE FROM ignored_files WHERE FilePath = :filepath"); + rmQuery.bindValue(":filepath", path); + if(!rmQuery.exec()) + { + qWarning("Library: exec error: %s", qPrintable(query.lastError().text())); + return; + } + } + } } bool Library::checkFile(const QFileInfo &info) @@ -412,3 +449,41 @@ void Library::removeIgnoredTracks(QList<TrackInfo *> *tracks, const QStringList } } } + +void Library::updateIgnoredFiles(const QStringList &paths) +{ + QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME); + if(!db.isOpen()) + return; + + for(const QString &path : qAsConst(paths)) + { + QSqlQuery query(db); + query.prepare("INSERT OR REPLACE INTO ignored_files VALUES((SELECT ID FROM track_library WHERE FilePath = :filepath), :filepath)"); + query.bindValue(":filepath", path); + if(!query.exec()) + { + qWarning("Library: exec error: %s", qPrintable(query.lastError().text())); + break; + } + } +} + +void Library::readIgnoredFiles() +{ + m_ignoredFiles.clear(); + + QSqlDatabase db = QSqlDatabase::database(CONNECTION_NAME); + if(!db.isOpen()) + return; + + QSqlQuery query(db); + if(!query.exec("SELECT FilePath FROM ignored_files")) + { + qWarning("Library: exec error: %s", qPrintable(query.lastError().text())); + return; + } + + while(query.next()) + m_ignoredFiles.insert(query.value(0).toString()); +} diff --git a/src/plugins/General/library/library.h b/src/plugins/General/library/library.h index 766488908..bed47af3b 100644 --- a/src/plugins/General/library/library.h +++ b/src/plugins/General/library/library.h @@ -26,6 +26,7 @@ #include <QPointer> #include <QStringList> #include <QThread> +#include <QSet> #include <atomic> #include <qmmp/trackinfo.h> #include <qmmp/qmmp.h> @@ -61,11 +62,14 @@ private: void removeMissingFiles(const QStringList &paths); bool checkFile(const QFileInfo &info); void removeIgnoredTracks(QList<TrackInfo *> *tracks, const QStringList &ignoredPaths); + void updateIgnoredFiles(const QStringList &paths); + void readIgnoredFiles(); QStringList m_filters, m_dirs; std::atomic_bool m_stopped = ATOMIC_VAR_INIT(false); QPointer<LibraryWidget> *m_libraryWidget; QAction *m_showAction; + QSet<QString> m_ignoredFiles; }; #endif // LIBRARY_H |
