From 535b1b660d33481d6fd11152d9dec211fcc295f0 Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Sun, 8 Nov 2020 21:13:30 +0000 Subject: library: main thread implementation git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9561 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/General/library/library.cpp | 87 +++++++++++++++++++++++---------- 1 file changed, 60 insertions(+), 27 deletions(-) (limited to 'src/plugins/General/library/library.cpp') 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 #include #include -#include #include #include //#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 tracks; + QList tracks; + QHash 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 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 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 *tracks, const QStringList &ignoredPaths) { - QList tracks; - const QList infoList = MetaDataManager::instance()->createPlayList(path, TrackInfo::AllParts, ignoredPaths); + if(ignoredPaths.isEmpty()) + return; - for(const TrackInfo *info : qAsConst(infoList)) + QList::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; } -- cgit v1.2.3-13-gbd6f