Fix vorbis comment and add support for Opus (#463)

* fix multiple values for vorbis comment

* add vorbis comment support for opus
This commit is contained in:
tibequadorian
2021-04-08 22:56:14 +02:00
committed by GitHub
parent 689771c2f7
commit 231c0970c9

View File

@@ -29,6 +29,7 @@
#include <flacfile.h> #include <flacfile.h>
#include <mpegfile.h> #include <mpegfile.h>
#include <vorbisfile.h> #include <vorbisfile.h>
#include <opusfile.h>
#include <tag.h> #include <tag.h>
#include <textidentificationframe.h> #include <textidentificationframe.h>
#include <commentsframe.h> #include <commentsframe.h>
@@ -174,7 +175,7 @@ void writeXiphComments(const MPD::MutableSong &s, TagLib::Ogg::XiphComment *tag)
{ {
auto writeXiph = [&](const TagLib::String &type, const TagLib::StringList &list) { auto writeXiph = [&](const TagLib::String &type, const TagLib::StringList &list) {
for (auto it = list.begin(); it != list.end(); ++it) for (auto it = list.begin(); it != list.end(); ++it)
tag->addField(type, *it); tag->addField(type, *it, it == list.begin());
}; };
// remove field previously used as album artist // remove field previously used as album artist
tag->removeFields("ALBUM ARTIST"); tag->removeFields("ALBUM ARTIST");
@@ -229,15 +230,21 @@ bool extendedSetSupported(const TagLib::File *f)
{ {
return dynamic_cast<const TagLib::MPEG::File *>(f) return dynamic_cast<const TagLib::MPEG::File *>(f)
|| dynamic_cast<const TagLib::Ogg::Vorbis::File *>(f) || dynamic_cast<const TagLib::Ogg::Vorbis::File *>(f)
|| dynamic_cast<const TagLib::Ogg::Opus::File *>(f)
|| dynamic_cast<const TagLib::FLAC::File *>(f); || dynamic_cast<const TagLib::FLAC::File *>(f);
} }
ReplayGainInfo readReplayGain(TagLib::File *f) ReplayGainInfo readReplayGain(TagLib::File *f)
{ {
ReplayGainInfo result; ReplayGainInfo result;
if (auto ogg_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f)) if (auto vorbis_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f))
{ {
if (auto xiph = ogg_file->tag()) if (auto xiph = vorbis_file->tag())
result = getReplayGain(xiph);
}
else if (auto opus_file = dynamic_cast<TagLib::Ogg::Opus::File *>(f))
{
if (auto xiph = opus_file->tag())
result = getReplayGain(xiph); result = getReplayGain(xiph);
} }
else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f)) else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f))
@@ -264,9 +271,14 @@ void read(mpd_song *s)
else if (auto id3v1 = mpeg_file->ID3v1Tag()) else if (auto id3v1 = mpeg_file->ID3v1Tag())
readID3v1Tags(s, id3v1); readID3v1Tags(s, id3v1);
} }
else if (auto ogg_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f.file())) else if (auto vorbis_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f.file()))
{ {
if (auto xiph = ogg_file->tag()) if (auto xiph = vorbis_file->tag())
readXiphComments(s, xiph);
}
else if (auto opus_file = dynamic_cast<TagLib::Ogg::Opus::File *>(f.file()))
{
if (auto xiph = opus_file->tag())
readXiphComments(s, xiph); readXiphComments(s, xiph);
} }
else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f.file())) else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f.file()))
@@ -299,9 +311,13 @@ bool write(MPD::MutableSong &s)
// do not call generic save() as it will duplicate tags // do not call generic save() as it will duplicate tags
saved = true; saved = true;
} }
else if (auto ogg_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f.file())) else if (auto vorbis_file = dynamic_cast<TagLib::Ogg::Vorbis::File *>(f.file()))
{ {
writeXiphComments(s, ogg_file->tag()); writeXiphComments(s, vorbis_file->tag());
}
else if (auto opus_file = dynamic_cast<TagLib::Ogg::Opus::File *>(f.file()))
{
writeXiphComments(s, opus_file->tag());
} }
else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f.file())) else if (auto flac_file = dynamic_cast<TagLib::FLAC::File *>(f.file()))
{ {