aboutsummaryrefslogtreecommitdiff
path: root/src/qmmpui/playlistmodel.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-02-08 18:54:35 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2021-02-08 18:54:35 +0000
commit86f6a3667a69b63fbc475b9f47360a9ce7c017cc (patch)
tree33a7b52c904e39eb64b419ba308d1ec8b2bcbf6f /src/qmmpui/playlistmodel.cpp
parent15629f11ad6e82bcb10cd5a71d0e09684caa7965 (diff)
downloadqmmp-86f6a3667a69b63fbc475b9f47360a9ce7c017cc.tar.gz
qmmp-86f6a3667a69b63fbc475b9f47360a9ce7c017cc.tar.bz2
qmmp-86f6a3667a69b63fbc475b9f47360a9ce7c017cc.zip
optimization
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@9704 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/qmmpui/playlistmodel.cpp')
-rw-r--r--src/qmmpui/playlistmodel.cpp48
1 files changed, 45 insertions, 3 deletions
diff --git a/src/qmmpui/playlistmodel.cpp b/src/qmmpui/playlistmodel.cpp
index 794cf8a2e..2f8cf0cbd 100644
--- a/src/qmmpui/playlistmodel.cpp
+++ b/src/qmmpui/playlistmodel.cpp
@@ -17,7 +17,6 @@
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
-#include <QWidget>
#include <QTextStream>
#include <algorithm>
#include <time.h>
@@ -999,9 +998,48 @@ void PlayListModel::updateMetaData(const QStringList &paths)
QList<PlayListTrack *> tracksToRemove;
QList<PlayListTrack *> tracksToAdd;
+ QHash<QString, TrackInfo *> cache; //cache for tracks
+ QSet<QString> multiTrackFiles; //files with multiple tracks
+
for(const QString &path : qAsConst(paths))
{
- QList<TrackInfo *> list = MetaDataManager::instance()->createPlayList(path);
+ bool missing = false; //track is missing
+
+ //update cache
+ if(!cache.contains(path))
+ {
+ //is it track of local file?
+ if(path.contains("://") && path.contains("#") && !cache.contains(path))
+ {
+ QString filePath = path;
+ filePath.remove(QRegularExpression("#\\d+$"));
+ filePath.remove(QRegularExpression("^\\D+://"));
+ if(multiTrackFiles.contains(filePath)) //looks like local file has been already scanned, but has not this track
+ {
+ missing = true;
+ }
+ else if(QFileInfo(filePath).isFile())
+ {
+ const QList<TrackInfo *> list = MetaDataManager::instance()->createPlayList(filePath);
+ for(TrackInfo *info : qAsConst(list))
+ cache.insert(info->path(), info);
+
+ multiTrackFiles << path;
+ }
+ }
+ else if(QFileInfo(path).isFile()) //is it local file?
+ {
+ const QList<TrackInfo *> list = MetaDataManager::instance()->createPlayList(path);
+ for(TrackInfo *info : qAsConst(list))
+ cache.insert(info->path(), info);
+ }
+ }
+
+ QList<TrackInfo *> list;
+ if(cache.contains(path)) //using TrackInfo object from cache
+ list << cache.value(path);
+ else if(!missing)
+ list << MetaDataManager::instance()->createPlayList(path);
for(int i = 0; i < m_container->count(); ++i)
{
@@ -1027,9 +1065,13 @@ void PlayListModel::updateMetaData(const QStringList &paths)
}
}
- qDeleteAll(list);
+ if(!cache.contains(path))
+ qDeleteAll(list);
}
+ qDeleteAll(cache.values());
+ cache.clear();
+
if(!tracksToRemove.isEmpty())
removeTracks(tracksToRemove);
if(!tracksToAdd.isEmpty())