-
-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathloadfilelisttask.cpp
More file actions
102 lines (94 loc) · 2.39 KB
/
Copy pathloadfilelisttask.cpp
File metadata and controls
102 lines (94 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <QDir>
#include <QFile>
#include <QDesktopServices>
#include <QSet>
#include <QDebug>
#include "utils.h"
#include "loadfilelisttask.h"
LoadFileListTask::LoadFileListTask(const QStringList &directories)
: m_directories(removeDuplicateDirectories(directories))
{
}
QStringList LoadFileListTask::removeDuplicateDirectories(const QStringList &directories)
{
int directoryCount = directories.size();
QList<QString> sortedDirectories;
for (int i = 0; i < directoryCount; i++) {
sortedDirectories.append(QDir(directories.at(i)).canonicalPath() + QDir::separator());
}
qSort(sortedDirectories);
QStringList result;
result.append(sortedDirectories.first());
for (int j = 0, i = 1; i < directoryCount; i++) {
QString path = sortedDirectories.at(i);
if (!path.startsWith(result.at(j))) {
result.append(path);
j++;
}
}
return result;
}
void LoadFileListTask::processFile(const QString &path)
{
static QSet<QString> allowedExtensions = QSet<QString>()
<< "MP3"
<< "MP4"
<< "M4A"
<< "FLAC"
<< "OGG"
<< "OGA"
<< "APE"
<< "OGGFLAC"
<< "TTA"
<< "WV"
<< "MPC"
<< "WMA";
if (allowedExtensions.contains(extractExtension(path))) {
if (!m_cache.contains(path)) {
m_cache.insert(path);
m_files.append(path);
}
}
}
void LoadFileListTask::processDirectory(const QString &path)
{
emit currentPathChanged(path);
QFileInfoList fileInfoList = QDir(path).entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot);
for (int j = 0; j < fileInfoList.size(); j++) {
QFileInfo fileInfo = fileInfoList.at(j);
if (fileInfo.isDir()) {
processDirectory(fileInfo.filePath());
}
else {
processFile(fileInfo.filePath());
}
}
}
static QSet<QString> readCacheFile()
{
QString fileName = cacheFileName();
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly)) {
qWarning() << "Couldn't open cache file" << fileName << "for reading";
return QSet<QString>();
}
QTextStream stream(&file);
stream.setCodec("UTF-8");
QSet<QString> result;
while (true) {
QString fileName = stream.readLine();
if (fileName.isEmpty()) {
break;
}
result.insert(fileName);
}
return result;
}
void LoadFileListTask::run()
{
m_cache = readCacheFile();
foreach (QString path, m_directories) {
processDirectory(path);
}
emit finished(m_files);
}