aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-05-10 11:00:10 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-05-10 11:00:10 +0000
commitf0ad2a375ca704ae5c986b5cf027cf4150a751e3 (patch)
treeb8ac33c64faee877f64ffac974d27c692ebb74e1 /src
parentda06389b9c16c122fb676406ba122f91dcc6bbfb (diff)
downloadqmmp-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')
-rw-r--r--src/plugins/General/library/library.cpp87
-rw-r--r--src/plugins/General/library/library.h4
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