tag editor: improve tag reading abilities
This commit is contained in:
@@ -83,6 +83,11 @@ void LowerAllLetters(MPD::MutableSong &s);
|
|||||||
|
|
||||||
TagLib::StringList tagList(const MPD::MutableSong &s, MPD::Song::GetFunction f);
|
TagLib::StringList tagList(const MPD::MutableSong &s, MPD::Song::GetFunction f);
|
||||||
|
|
||||||
|
void readCommonTags(MPD::MutableSong &s, TagLib::Tag *tag);
|
||||||
|
void readID3v1Tags(MPD::MutableSong &s, TagLib::ID3v1::Tag *tag);
|
||||||
|
void readID3v2Tags(MPD::MutableSong &s, TagLib::ID3v2::Tag *tag);
|
||||||
|
void readXiphComments(MPD::MutableSong &s, TagLib::Ogg::XiphComment *tag);
|
||||||
|
|
||||||
void clearID3v1Tags(TagLib::ID3v1::Tag *tag);
|
void clearID3v1Tags(TagLib::ID3v1::Tag *tag);
|
||||||
void writeCommonTags(const MPD::MutableSong &s, TagLib::Tag *tag);
|
void writeCommonTags(const MPD::MutableSong &s, TagLib::Tag *tag);
|
||||||
void writeID3v2Tags(const MPD::MutableSong &s, TagLib::ID3v2::Tag *tag);
|
void writeID3v2Tags(const MPD::MutableSong &s, TagLib::ID3v2::Tag *tag);
|
||||||
@@ -1013,23 +1018,27 @@ void TagEditor::ReadTags(MPD::MutableSong &s)
|
|||||||
if (f.isNull())
|
if (f.isNull())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TagLib::MPEG::File *mpegf = dynamic_cast<TagLib::MPEG::File *>(f.file());
|
|
||||||
s.setDuration(f.audioProperties()->length());
|
s.setDuration(f.audioProperties()->length());
|
||||||
|
|
||||||
s.setArtist(f.tag()->artist().to8Bit(1));
|
if (auto mpeg_file = dynamic_cast<TagLib::MPEG::File *>(f.file()))
|
||||||
s.setTitle(f.tag()->title().to8Bit(1));
|
|
||||||
s.setAlbum(f.tag()->album().to8Bit(1));
|
|
||||||
s.setTrack(intTo<std::string>::apply(f.tag()->track()));
|
|
||||||
s.setDate(intTo<std::string>::apply(f.tag()->year()));
|
|
||||||
s.setGenre(f.tag()->genre().to8Bit(1));
|
|
||||||
if (mpegf)
|
|
||||||
{
|
{
|
||||||
s.setAlbumArtist(!mpegf->ID3v2Tag()->frameListMap()["TPE2"].isEmpty() ? mpegf->ID3v2Tag()->frameListMap()["TPE2"].front()->toString().to8Bit(1) : "");
|
if (auto id3v1 = mpeg_file->ID3v1Tag())
|
||||||
s.setComposer(!mpegf->ID3v2Tag()->frameListMap()["TCOM"].isEmpty() ? mpegf->ID3v2Tag()->frameListMap()["TCOM"].front()->toString().to8Bit(1) : "");
|
readID3v1Tags(s, id3v1);
|
||||||
s.setPerformer(!mpegf->ID3v2Tag()->frameListMap()["TOPE"].isEmpty() ? mpegf->ID3v2Tag()->frameListMap()["TOPE"].front()->toString().to8Bit(1) : "");
|
if (auto id3v2 = mpeg_file->ID3v2Tag())
|
||||||
s.setDisc(!mpegf->ID3v2Tag()->frameListMap()["TPOS"].isEmpty() ? mpegf->ID3v2Tag()->frameListMap()["TPOS"].front()->toString().to8Bit(1) : "");
|
readID3v2Tags(s, id3v2);
|
||||||
}
|
}
|
||||||
s.setComment(f.tag()->comment().to8Bit(1));
|
else if (auto ogg_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f.file()))
|
||||||
|
{
|
||||||
|
if (auto xiph = ogg_file->tag())
|
||||||
|
readXiphComments(s, xiph);
|
||||||
|
}
|
||||||
|
else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f.file()))
|
||||||
|
{
|
||||||
|
if (auto xiph = flac_file->xiphComment())
|
||||||
|
readXiphComments(s, xiph);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
readCommonTags(s, f.tag());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TagEditor::WriteTags(MPD::MutableSong &s)
|
bool TagEditor::WriteTags(MPD::MutableSong &s)
|
||||||
@@ -1145,6 +1154,64 @@ TagLib::StringList tagList(const MPD::MutableSong &s, MPD::Song::GetFunction f)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void readCommonTags(MPD::MutableSong &s, TagLib::Tag *tag)
|
||||||
|
{
|
||||||
|
s.setTitle(tag->title().to8Bit(true));
|
||||||
|
s.setArtist(tag->artist().to8Bit(true));
|
||||||
|
s.setAlbum(tag->album().to8Bit(true));
|
||||||
|
s.setDate(intTo<std::string>::apply(tag->year()));
|
||||||
|
s.setTrack(intTo<std::string>::apply(tag->track()));
|
||||||
|
s.setGenre(tag->genre().to8Bit(true));
|
||||||
|
s.setComment(tag->comment().to8Bit(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
void readID3v1Tags(MPD::MutableSong &s, TagLib::ID3v1::Tag *tag)
|
||||||
|
{
|
||||||
|
readCommonTags(s, tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readID3v2Tags(MPD::MutableSong &s, TagLib::ID3v2::Tag *tag)
|
||||||
|
{
|
||||||
|
auto readFrame = [&s](const TagLib::ID3v2::FrameList &list, MPD::MutableSong::SetFunction f) {
|
||||||
|
unsigned idx = 0;
|
||||||
|
for (auto it = list.begin(); it != list.end(); ++it, ++idx)
|
||||||
|
(s.*f)((*it)->toString().to8Bit(true), idx);
|
||||||
|
};
|
||||||
|
auto &frames = tag->frameListMap();
|
||||||
|
readFrame(frames["TIT2"], &MPD::MutableSong::setTitle);
|
||||||
|
readFrame(frames["TPE1"], &MPD::MutableSong::setArtist);
|
||||||
|
readFrame(frames["TPE2"], &MPD::MutableSong::setAlbumArtist);
|
||||||
|
readFrame(frames["TALB"], &MPD::MutableSong::setAlbum);
|
||||||
|
readFrame(frames["TDRC"], &MPD::MutableSong::setDate);
|
||||||
|
readFrame(frames["TRCK"], &MPD::MutableSong::setTrack);
|
||||||
|
readFrame(frames["TCON"], &MPD::MutableSong::setGenre);
|
||||||
|
readFrame(frames["TCOM"], &MPD::MutableSong::setComposer);
|
||||||
|
readFrame(frames["TPE3"], &MPD::MutableSong::setPerformer);
|
||||||
|
readFrame(frames["TPOS"], &MPD::MutableSong::setDisc);
|
||||||
|
readFrame(frames["COMM"], &MPD::MutableSong::setComment);
|
||||||
|
}
|
||||||
|
|
||||||
|
void readXiphComments(MPD::MutableSong &s, TagLib::Ogg::XiphComment *tag)
|
||||||
|
{
|
||||||
|
auto readField = [&s](const TagLib::StringList &list, MPD::MutableSong::SetFunction f) {
|
||||||
|
unsigned idx = 0;
|
||||||
|
for (auto it = list.begin(); it != list.end(); ++it)
|
||||||
|
(s.*f)(it->to8Bit(true), idx);
|
||||||
|
};
|
||||||
|
auto &fields = tag->fieldListMap();
|
||||||
|
readField(fields["TITLE"], &MPD::MutableSong::setTitle);
|
||||||
|
readField(fields["ARTIST"], &MPD::MutableSong::setArtist);
|
||||||
|
readField(fields["ALBUMARTIST"], &MPD::MutableSong::setAlbumArtist);
|
||||||
|
readField(fields["ALBUM"], &MPD::MutableSong::setAlbum);
|
||||||
|
readField(fields["DATE"], &MPD::MutableSong::setDate);
|
||||||
|
readField(fields["TRACKNUMBER"], &MPD::MutableSong::setTrack);
|
||||||
|
readField(fields["GENRE"], &MPD::MutableSong::setGenre);
|
||||||
|
readField(fields["COMPOSER"], &MPD::MutableSong::setComposer);
|
||||||
|
readField(fields["PERFORMER"], &MPD::MutableSong::setPerformer);
|
||||||
|
readField(fields["DISCNUMBER"], &MPD::MutableSong::setDisc);
|
||||||
|
readField(fields["COMMENT"], &MPD::MutableSong::setComment);
|
||||||
|
}
|
||||||
|
|
||||||
void clearID3v1Tags(TagLib::ID3v1::Tag *tag)
|
void clearID3v1Tags(TagLib::ID3v1::Tag *tag)
|
||||||
{
|
{
|
||||||
tag->setTitle(TagLib::String::null);
|
tag->setTitle(TagLib::String::null);
|
||||||
@@ -1197,14 +1264,14 @@ void writeXiphComments(const MPD::MutableSong &s, TagLib::Ogg::XiphComment *tag)
|
|||||||
};
|
};
|
||||||
writeXiph("TITLE", tagList(s, &MPD::Song::getTitle));
|
writeXiph("TITLE", tagList(s, &MPD::Song::getTitle));
|
||||||
writeXiph("ARTIST", tagList(s, &MPD::Song::getArtist));
|
writeXiph("ARTIST", tagList(s, &MPD::Song::getArtist));
|
||||||
writeXiph("ALBUM ARTIST", tagList(s, &MPD::Song::getAlbumArtist));
|
writeXiph("ALBUMARTIST", tagList(s, &MPD::Song::getAlbumArtist));
|
||||||
writeXiph("ALBUM", tagList(s, &MPD::Song::getAlbum));
|
writeXiph("ALBUM", tagList(s, &MPD::Song::getAlbum));
|
||||||
writeXiph("DATE", tagList(s, &MPD::Song::getDate));
|
writeXiph("DATE", tagList(s, &MPD::Song::getDate));
|
||||||
writeXiph("TRACKNUMBER", tagList(s, &MPD::Song::getTrack));
|
writeXiph("TRACKNUMBER", tagList(s, &MPD::Song::getTrack));
|
||||||
writeXiph("GENRE", tagList(s, &MPD::Song::getGenre));
|
writeXiph("GENRE", tagList(s, &MPD::Song::getGenre));
|
||||||
writeXiph("COMPOSER", tagList(s, &MPD::Song::getComposer));
|
writeXiph("COMPOSER", tagList(s, &MPD::Song::getComposer));
|
||||||
writeXiph("PERFORMER", tagList(s, &MPD::Song::getPerformer));
|
writeXiph("PERFORMER", tagList(s, &MPD::Song::getPerformer));
|
||||||
writeXiph("DISC", tagList(s, &MPD::Song::getDisc));
|
writeXiph("DISCNUMBER", tagList(s, &MPD::Song::getDisc));
|
||||||
writeXiph("COMMENT", tagList(s, &MPD::Song::getComment));
|
writeXiph("COMMENT", tagList(s, &MPD::Song::getComment));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user