diff --git a/src/tags.cpp b/src/tags.cpp index 4e084775..38d86c1d 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -70,7 +70,16 @@ 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); + { + if (auto textFrame = dynamic_cast(*it)) + { + auto values = textFrame->fieldList(); + for (auto value = values.begin(); value != values.end(); ++value, ++idx) + (s.*f)(value->to8Bit(true), idx); + } + else + (s.*f)((*it)->toString().to8Bit(true), idx); + } }; auto &frames = tag->frameListMap(); readFrame(frames["TIT2"], &MPD::MutableSong::setTitle); @@ -90,7 +99,7 @@ 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) + for (auto it = list.begin(); it != list.end(); ++it, ++idx) (s.*f)(it->to8Bit(true), idx); }; auto &fields = tag->fieldListMap(); @@ -133,9 +142,12 @@ void writeID3v2Tags(const MPD::MutableSong &s, TagLib::ID3v2::Tag *tag) { auto writeID3v2 = [&](const TagLib::ByteVector &type, const TagLib::StringList &list) { tag->removeFrames(type); - auto frame = new TagLib::ID3v2::TextIdentificationFrame(type, TagLib::String::UTF8); - frame->setText(list); - tag->addFrame(frame); + if (!list.isEmpty()) + { + auto frame = new TagLib::ID3v2::TextIdentificationFrame(type, TagLib::String::UTF8); + frame->setText(list); + tag->addFrame(frame); + } }; writeID3v2("TIT2", tagList(s, &MPD::Song::getTitle)); writeID3v2("TPE1", tagList(s, &MPD::Song::getArtist));