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 102
|
#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);
}
|