From f0ad2a375ca704ae5c986b5cf027cf4150a751e3 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Mon, 10 May 2021 11:00:10 +0000 Subject: 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 --- src/plugins/General/library/library.cpp | 87 ++++++++++++++++++++++++++++++--- src/plugins/General/library/library.h | 4 ++ 2 files changed, 85 insertions(+), 6 deletions(-) (limited to 'src/plugins') 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 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 *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 #include #include +#include #include #include #include @@ -61,11 +62,14 @@ private: void removeMissingFiles(const QStringList &paths); bool checkFile(const QFileInfo &info); void removeIgnoredTracks(QList *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 *m_libraryWidget; QAction *m_showAction; + QSet m_ignoredFiles; }; #endif // LIBRARY_H -- cgit v1.2.3-13-gbd6f