-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathplaylistmanager.cpp
More file actions
118 lines (109 loc) · 3.67 KB
/
Copy pathplaylistmanager.cpp
File metadata and controls
118 lines (109 loc) · 3.67 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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "playlistmanager.h"
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QDebug>
#include <QRegularExpression>
#include <taglib/fileref.h>
#include <taglib/tag.h>
#include <taglib/mpegfile.h>
#include <taglib/id3v2tag.h>
#include <taglib/attachedpictureframe.h>
PlaylistManager::PlaylistManager(QObject *parent) : QObject(parent) {}
QString PlaylistManager::basePath()
{
QString home = QDir::homePath();
QString path = home + "/zmp_playlists";
QDir dir;
if (!dir.exists(path))
dir.mkpath(path);
return path;
}
QStringList PlaylistManager::supportedExtensions() const
{
return {".mp3", ".wav", ".flac", ".aac", ".aiff"};
}
QImage PlaylistManager::extractCoverFromFile(const QString &filePath) const
{
QImage cover;
if (!filePath.endsWith(".mp3", Qt::CaseInsensitive))
return cover; // только MP3
TagLib::FileName fn(filePath.toUtf8().data());
TagLib::MPEG::File file(fn);
if (file.isOpen() && file.ID3v2Tag()) {
auto frameList = file.ID3v2Tag()->frameList("APIC");
if (!frameList.isEmpty()) {
auto *picFrame = dynamic_cast<TagLib::ID3v2::AttachedPictureFrame*>(frameList.front());
if (picFrame && picFrame->picture().size() > 0) {
cover.loadFromData((const uchar*)picFrame->picture().data(),
(int)picFrame->picture().size());
}
}
}
return cover;
}
QList<PlaylistInfo> PlaylistManager::getAllPlaylists() const
{
QList<PlaylistInfo> playlists;
QDir baseDir(basePath());
if (!baseDir.exists())
return playlists;
QStringList subDirs = baseDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const QString &dirName : subDirs) {
PlaylistInfo info;
info.name = dirName;
info.folderPath = baseDir.absolutePath() + "/" + dirName;
QDir playlistDir(info.folderPath);
QStringList entries = playlistDir.entryList(QDir::Files);
for (const QString &file : entries) {
QFileInfo fi(file);
QString ext = fi.suffix().toLower().prepend('.');
if (supportedExtensions().contains(ext)) {
info.tracks.append(playlistDir.absolutePath() + "/" + file);
}
}
if (!info.tracks.isEmpty()) {
info.cover = extractCoverFromFile(info.tracks.first());
}
playlists.append(info);
}
return playlists;
}
bool PlaylistManager::createPlaylist(const QString &name, const QStringList &filePaths)
{
if (name.isEmpty()) return false;
QRegularExpression validRegex("^[a-zA-Z0-9_\\-()]+$");
if (!validRegex.match(name).hasMatch()) {
qWarning() << "Invalid playlist name:" << name;
return false;
}
QString playlistDir = basePath() + "/" + name;
QDir dir;
if (dir.exists(playlistDir)) {
qWarning() << "Playlist already exists:" << name;
return false;
}
if (!dir.mkpath(playlistDir)) {
qWarning() << "Failed to create directory:" << playlistDir;
return false;
}
for (const QString &srcPath : filePaths) {
QFileInfo srcInfo(srcPath);
QString ext = srcInfo.suffix().toLower().prepend('.');
if (supportedExtensions().contains(ext)) {
QString destPath = playlistDir + "/" + srcInfo.fileName();
if (!QFile::copy(srcPath, destPath)) {
qWarning() << "Failed to copy:" << srcPath;
}
}
}
return true;
}
bool PlaylistManager::deletePlaylist(const QString &name)
{
QString playlistDir = basePath() + "/" + name;
QDir dir(playlistDir);
if (!dir.exists()) return false;
dir.removeRecursively();
return true;
}