-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathcue.h
More file actions
156 lines (120 loc) · 4.87 KB
/
cue.h
File metadata and controls
156 lines (120 loc) · 4.87 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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* BEGIN_COMMON_COPYRIGHT_HEADER
* (c)LGPL2+
*
* Flacon - audio File Encoder
* https://github.com/flacon/flacon
*
* Copyright: 2012-2015
* Alexander Sokoloff <[email protected]>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* END_COMMON_COPYRIGHT_HEADER */
#ifndef CUE_H
#define CUE_H
#include <QString>
#include <QList>
#include <QMap>
#include "types.h"
#include "textcodec.h"
#include "tags.h"
class CueData;
class InputAudioFile;
class Cue
{
public:
class Track
{
friend class Cue;
public:
CueIndex cueIndex00() const { return mCueIndex00; }
CueIndex cueIndex01() const { return mCueIndex01; }
QByteArray tag(TrackTags::TagId tagId) const { return mTags.value(tagId); }
int trackNumTag() const { return mTrackNumTag; }
QByteArray artistTag() const { return performerTag(); }
QByteArray commentTag() const { return tag(TrackTags::TagId::Comment); }
QByteArray dateTag() const { return tag(TrackTags::TagId::Date); }
QByteArray genreTag() const { return tag(TrackTags::TagId::Genre); }
QByteArray fileTag() const { return mFileTag; }
QByteArray flagsTag() const { return tag(TrackTags::TagId::Flags); }
QByteArray isrcTag() const { return tag(TrackTags::TagId::Isrc); }
QByteArray performerTag() const { return tag(TrackTags::TagId::Performer); }
QByteArray songWriterTag() const { return tag(TrackTags::TagId::SongWriter); }
QByteArray titleTag() const { return tag(TrackTags::TagId::Title); }
Tags::Track decode(const TextCodec &textCodec) const;
private:
CueIndex mCueIndex00;
CueIndex mCueIndex01;
int mTrackNumTag = 0;
QMap<TrackTags::TagId, QByteArray> mTags;
QByteArray mFileTag;
};
static constexpr const char *const EMBEDED_PREFIX = "embedded://";
public:
Cue() = default;
Cue(const Cue &other) = default;
explicit Cue(const QString &fileName) noexcept(false);
Cue &operator=(const Cue &other) = default;
QString filePath() const { return mFilePath; }
TagsId tagsId() const { return mTagsId; }
QByteArray tag(AlbumTags::TagId tagId) const { return mTags.value(tagId); }
DiscNum discCountTag() const { return mDiscCountTag; }
DiscNum discNumTag() const { return mDiscNumTag; }
QByteArray albumTag() const { return tag(AlbumTags::TagId::Album); }
QByteArray catalogTag() const { return tag(AlbumTags::TagId::Catalog); }
QByteArray cdTextfileTag() const { return tag(AlbumTags::TagId::CdTextfile); }
QByteArray discIdTag() const { return tag(AlbumTags::TagId::DiscId); }
QByteArray albumPerformer() const { return tag(AlbumTags::TagId::AlbumPerformer); }
QList<Track> tracks() const { return mTracks; }
bool isEmpty() const { return mTracks.isEmpty(); }
TextCodec detectTextCodec() const;
TextCodec::BomCodec bom() const { return mBom; }
QStringList fileTags() const { return mFileTags; }
bool isMutiplyAudio() const { return mMutiplyAudio; }
bool isEmbedded() const { return mFilePath.startsWith(EMBEDED_PREFIX); }
Tags decode(const TextCodec &textCodec) const;
protected:
QString mFilePath;
TagsId mTagsId;
QList<Track> mTracks;
QStringList mFileTags;
bool mMutiplyAudio = false;
TextCodec::BomCodec mBom = TextCodec::BomCodec::Unknown;
protected:
void read(const CueData &data);
QByteArray getAlbumPerformer(const CueData &data);
void splitTitleTag(const CueData &data);
void splitTitle(Track *track, char separator);
void validate();
public:
private:
DiscNum mDiscCountTag = 0;
DiscNum mDiscNumTag = 0;
QMap<AlbumTags::TagId, QByteArray> mTags;
};
class EmbeddedCue : public Cue
{
public:
EmbeddedCue() = default;
EmbeddedCue(const EmbeddedCue &other) = default;
EmbeddedCue &operator=(const EmbeddedCue &other) = default;
explicit EmbeddedCue(const InputAudioFile &audioFile) noexcept(false);
};
class CueError : public FlaconError
{
public:
explicit CueError(const QString &msg) :
FlaconError(msg) { }
virtual ~CueError();
};
#endif // CUE_H