-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathkaraokefile.h
142 lines (120 loc) · 4.1 KB
/
karaokefile.h
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#ifndef KARAOKEFILE_H
#define KARAOKEFILE_H
#include <QString>
#include <vector>
#include <QObject>
#include <QDirIterator>
#include <QSharedPointer>
#include <QVariant>
struct NamingPattern {
QString name{"SongID - Artist - Title"};
QString sep{" - "};
int songIdPos{0};
int artistPos{1};
int titlePos{2};
[[maybe_unused]] static NamingPattern PatternSAT() {
return NamingPattern{"SongID - Artist - Title", " - ", 0, 1, 2};
}
[[maybe_unused]] static NamingPattern PatternSTA() {
return NamingPattern{"SongID - Title - Artist", " - ", 0, 2, 1};
}
[[maybe_unused]] static NamingPattern PatternATS() {
return NamingPattern{"Artist - Title - SongID", " - ", 2, 0, 1};
}
[[maybe_unused]] static NamingPattern PatternTAS() {
return NamingPattern{"Title - Artist - SongID", " - ", 2, 1, 0};
}
[[maybe_unused]] static NamingPattern PatternAT() {
return NamingPattern{"Artist - Title", " - ", -1, 0, 1};
}
[[maybe_unused]] static NamingPattern PatternTA() {
return NamingPattern{"Title - Artist", " - ", -1, 1, 0};
}
};
class KaraokeFile : public QObject {
Q_OBJECT
private:
enum class ProcessingMode {
AudioGZip,
AudioG,
VideoFile
};
QString m_artist;
QString m_title;
QString m_atCombo;
QString m_songid;
QString m_path;
uint64_t m_duration{0};
uint32_t m_crc32{0};
uint m_audioBitrate{0};
bool m_fileScanned{false};
NamingPattern m_namingPattern;
static std::vector<std::string> supportedAFileExtensions() { return {".mp3", ".ogg", ".wav", ".flac", ".m4a"}; }
void scanFile();
void scanZipFile();
void scanCdgFile();
void scanVideoFile();
ProcessingMode m_procMode{ProcessingMode::AudioGZip};
static uint64_t getDurationFromCdgSize(uint64_t size) {
return ((size / 96) / 75) * 1000;
}
void applyNamingPattern();
public:
enum class ErrorCode{
OK,
BadZip,
MissingCdg,
MissingAudio,
ZeroByteCdg,
ZeroByteAudio,
ZeroByte
};
static std::vector<std::string> supportedKFileExtensions() { return {"cdg", "zip", "mp4", "mkv", "avi", "ogv"}; }
[[nodiscard]] std::string getErrCodeStr() const;
[[nodiscard]] ErrorCode getErrorCode() const {return m_errorCode;}
explicit KaraokeFile(QString path, NamingPattern pattern, QObject *parent = nullptr);
[[nodiscard]] QString artist() const;
[[nodiscard]] QString title() const { return m_title; }
[[nodiscard]] QString atCombo() const { return m_atCombo; }
[[nodiscard]] QString songid() const { return m_songid; }
[[nodiscard]] QString path() const { return m_path; }
uint32_t crc();
uint64_t duration();
uint getBitrate();
ErrorCode m_errorCode{ErrorCode::OK};
QString findAudioFileForCdg();
[[nodiscard]] static QString findAudioFileForCdg(const QString& cdgFilePath);
void setNamingPattern(const NamingPattern &pattern);
};
namespace KLM {
typedef QVector<QSharedPointer<KaraokeFile>> KaraokeFileList;
static KaraokeFileList getKaraokeFiles(const QString &path, NamingPattern &pattern) {
KaraokeFileList kFiles;
QDirIterator it(path, QDirIterator::Subdirectories);
while (it.hasNext()) {
it.next();
auto ext = it.fileInfo().completeSuffix().toLower();
for (const auto &sExt : KaraokeFile::supportedKFileExtensions())
if (ext == sExt.c_str()) {
kFiles.push_back(QSharedPointer<KaraokeFile>(new KaraokeFile(it.filePath(), pattern)));
}
}
return kFiles;
}
}
class KaraokePath : public QObject {
Q_OBJECT
QString m_path;
NamingPattern m_pattern;
KLM::KaraokeFileList m_files;
public:
explicit KaraokePath(QString path, NamingPattern pattern, QObject *parent = nullptr);
KLM::KaraokeFileList& files(const bool forceRefresh = false);
const QString &path() const;
const NamingPattern &pattern() const;
void setPattern(const NamingPattern &newPattern);
};
namespace KLM {
typedef QVector<QSharedPointer<KaraokePath>> KaraokePathList;
}
#endif // KARAOKEFILE_H