33
#define DISPATCH_TAGLIB_FILE(type, file) \
34
#define TAGLIB_STRING_TO_QSTRING(a) QString::fromStdWString((a).toWString())
36
#define DISPATCH_TAGLIB_FILE(tr, type, file) \
35
38
type *tmp = dynamic_cast<type *>(file); \
37
return extractMBIDFromFile(tmp); \
40
extractMetaFromFile(tr, tmp); \
41
QString extractMBIDFromXiphComment(TagLib::Ogg::XiphComment *tag)
45
void extractMetaFromXiphComment(TagReader *tr, TagLib::Ogg::XiphComment *tag)
43
47
const char *key = "MUSICBRAINZ_TRACKID";
44
48
if (tag->fieldListMap().contains(key)) {
45
return QString::fromUtf8(tag->fieldListMap()[key].front().toCString(true));
49
tr->m_mbid = TAGLIB_STRING_TO_QSTRING(tag->fieldListMap()[key].front());
52
if (tag->fieldListMap().contains(key)) {
53
tr->m_albumArtist = TAGLIB_STRING_TO_QSTRING(tag->fieldListMap()[key].front());
56
if (tag->fieldListMap().contains(key)) {
57
tr->m_discNo = tag->fieldListMap()[key].front().toInt();
60
if (tag->fieldListMap().contains(key)) {
61
tr->m_puid = TAGLIB_STRING_TO_QSTRING(tag->fieldListMap()[key].front());
50
QString extractMBIDFromAPETag(TagLib::APE::Tag *tag)
65
void extractMetaFromAPETag(TagReader *tr, TagLib::APE::Tag *tag)
52
67
const char *key = "MUSICBRAINZ_TRACKID";
53
68
if (tag->itemListMap().contains(key)) {
54
return QString::fromUtf8(tag->itemListMap()[key].toString().toCString(true));
59
QString extractMBIDFromFile(TagLib::Ogg::Vorbis::File *file)
61
return extractMBIDFromXiphComment(file->tag());
64
QString extractMBIDFromFile(TagLib::Ogg::FLAC::File *file)
66
return extractMBIDFromXiphComment(file->tag());
69
QString extractMBIDFromFile(TagLib::Ogg::Speex::File *file)
71
return extractMBIDFromXiphComment(file->tag());
74
QString extractMBIDFromFile(TagLib::FLAC::File *file)
76
return extractMBIDFromXiphComment(file->xiphComment());
79
QString extractMBIDFromFile(TagLib::MPC::File *file)
81
return extractMBIDFromAPETag(file->APETag());
84
QString extractMBIDFromFile(TagLib::WavPack::File *file)
86
return extractMBIDFromAPETag(file->APETag());
69
tr->m_mbid = TAGLIB_STRING_TO_QSTRING(tag->itemListMap()[key].toString());
71
key = "ALBUM ARTIST"; // Foobar
72
if (tag->itemListMap().contains(key)) {
73
tr->m_albumArtist = TAGLIB_STRING_TO_QSTRING(tag->itemListMap()[key].toString());
75
key = "ALBUMARTIST"; // Picard
76
if (tag->itemListMap().contains(key)) {
77
tr->m_albumArtist = TAGLIB_STRING_TO_QSTRING(tag->itemListMap()[key].toString());
80
if (tag->itemListMap().contains(key)) {
81
tr->m_discNo = tag->itemListMap()[key].toString().toInt();
84
if (tag->itemListMap().contains(key)) {
85
tr->m_puid = TAGLIB_STRING_TO_QSTRING(tag->itemListMap()[key].toString());
89
void extractMetaFromFile(TagReader *tr, TagLib::Ogg::Vorbis::File *file)
91
extractMetaFromXiphComment(tr, file->tag());
94
void extractMetaFromFile(TagReader *tr, TagLib::Ogg::FLAC::File *file)
96
extractMetaFromXiphComment(tr, file->tag());
99
void extractMetaFromFile(TagReader *tr, TagLib::Ogg::Speex::File *file)
101
extractMetaFromXiphComment(tr, file->tag());
104
void extractMetaFromFile(TagReader *tr, TagLib::FLAC::File *file)
106
extractMetaFromXiphComment(tr, file->xiphComment());
109
void extractMetaFromFile(TagReader *tr, TagLib::MPC::File *file)
111
extractMetaFromAPETag(tr, file->APETag());
114
void extractMetaFromFile(TagReader *tr, TagLib::WavPack::File *file)
116
extractMetaFromAPETag(tr, file->APETag());
89
119
#ifdef TAGLIB_WITH_ASF
90
QString extractMBIDFromFile(TagLib::ASF::File *file)
120
void extractMetaFromFile(TagReader *tr, TagLib::ASF::File *file)
92
122
const char *key = "MusicBrainz/Track Id";
93
123
TagLib::ASF::Tag *tag = file->tag();
94
124
if (tag->attributeListMap().contains(key)) {
95
return QString::fromUtf8(tag->attributeListMap()[key].front().toString().toCString(true));
125
tr->m_mbid = TAGLIB_STRING_TO_QSTRING(tag->attributeListMap()[key].front().toString());
127
key = "WM/AlbumArtist";
128
if (tag->attributeListMap().contains(key)) {
129
tr->m_albumArtist = TAGLIB_STRING_TO_QSTRING(tag->attributeListMap()[key].front().toString());
131
key = "WM/PartOfSet";
132
if (tag->attributeListMap().contains(key)) {
133
tr->m_discNo = tag->attributeListMap()[key].front().toString().toInt();
135
key = "MusicIP/PUID";
136
if (tag->attributeListMap().contains(key)) {
137
tr->m_puid = TAGLIB_STRING_TO_QSTRING(tag->attributeListMap()[key].front().toString());
101
142
#ifdef TAGLIB_WITH_MP4
102
QString extractMBIDFromFile(TagLib::MP4::File *file)
143
void extractMetaFromFile(TagReader *tr, TagLib::MP4::File *file)
104
145
const char *key = "----:com.apple.iTunes:MusicBrainz Track Id";
105
146
TagLib::MP4::Tag *tag = file->tag();
106
147
if (tag->itemListMap().contains(key)) {
107
return QString::fromUtf8(tag->itemListMap()[key].toStringList().toString().toCString(true));
148
tr->m_mbid = TAGLIB_STRING_TO_QSTRING(tag->itemListMap()[key].toStringList().toString());
151
if (tag->itemListMap().contains(key)) {
152
tr->m_albumArtist = TAGLIB_STRING_TO_QSTRING(tag->itemListMap()[key].toStringList().toString());
155
if (tag->itemListMap().contains(key)) {
156
tr->m_discNo = tag->itemListMap()[key].toIntPair().first;
158
key = "----:com.apple.iTunes:MusicIP PUID";
159
if (tag->itemListMap().contains(key)) {
160
tr->m_puid = TAGLIB_STRING_TO_QSTRING(tag->itemListMap()[key].toStringList().toString());
113
QString extractMBIDFromFile(TagLib::MPEG::File *file)
165
void extractMetaFromFile(TagReader *tr, TagLib::MPEG::File *file)
115
167
TagLib::ID3v2::Tag *tag = file->ID3v2Tag();
116
168
TagLib::ID3v2::FrameList ufid = tag->frameListMap()["UFID"];
119
171
TagLib::ID3v2::UniqueFileIdentifierFrame *frame = dynamic_cast<TagLib::ID3v2::UniqueFileIdentifierFrame *>(*i);
120
172
if (frame && frame->owner() == "http://musicbrainz.org") {
121
173
TagLib::ByteVector id = frame->identifier();
122
return QString::fromAscii(id.data(), id.size());
174
tr->m_mbid = QString::fromAscii(id.data(), id.size());
178
TagLib::ID3v2::FrameList tpe2 = tag->frameListMap()["TPE2"];
179
if (!tpe2.isEmpty()) {
180
tr->m_albumArtist = TAGLIB_STRING_TO_QSTRING(tpe2.front()->toString());
182
TagLib::ID3v2::FrameList tpos = tag->frameListMap()["TPOS"];
183
if (!tpos.isEmpty()) {
184
tr->m_discNo = tpos.front()->toString().toInt();
186
TagLib::ID3v2::UserTextIdentificationFrame *puidFrame = TagLib::ID3v2::UserTextIdentificationFrame::find(tag, "MusicIP PUID");
188
TagLib::StringList texts = puidFrame->fieldList();
189
if (texts.size() > 1) {
190
tr->m_puid = TAGLIB_STRING_TO_QSTRING(texts[1]);
129
QString extractMusicBrainzTrackID(TagLib::File *file)
195
void extractMeta(TagReader *tr, TagLib::File *file)
131
DISPATCH_TAGLIB_FILE(TagLib::FLAC::File, file);
132
DISPATCH_TAGLIB_FILE(TagLib::Ogg::Vorbis::File, file);
133
DISPATCH_TAGLIB_FILE(TagLib::Ogg::FLAC::File, file);
134
DISPATCH_TAGLIB_FILE(TagLib::Ogg::Speex::File, file);
135
DISPATCH_TAGLIB_FILE(TagLib::MPC::File, file);
136
DISPATCH_TAGLIB_FILE(TagLib::WavPack::File, file);
197
DISPATCH_TAGLIB_FILE(tr, TagLib::FLAC::File, file);
198
DISPATCH_TAGLIB_FILE(tr, TagLib::Ogg::Vorbis::File, file);
199
DISPATCH_TAGLIB_FILE(tr, TagLib::Ogg::FLAC::File, file);
200
DISPATCH_TAGLIB_FILE(tr, TagLib::Ogg::Speex::File, file);
201
DISPATCH_TAGLIB_FILE(tr, TagLib::MPC::File, file);
202
DISPATCH_TAGLIB_FILE(tr, TagLib::WavPack::File, file);
137
203
#ifdef TAGLIB_WITH_ASF
138
DISPATCH_TAGLIB_FILE(TagLib::ASF::File, file);
204
DISPATCH_TAGLIB_FILE(tr, TagLib::ASF::File, file);
140
206
#ifdef TAGLIB_WITH_MP4
141
DISPATCH_TAGLIB_FILE(TagLib::MP4::File, file);
207
DISPATCH_TAGLIB_FILE(tr, TagLib::MP4::File, file);
143
DISPATCH_TAGLIB_FILE(TagLib::MPEG::File, file);
209
DISPATCH_TAGLIB_FILE(tr, TagLib::MPEG::File, file);
147
212
bool TagReader::read()