Fix issue #88 by changing the behavior of setProperties().

For file types that support multiple tag standards (for example, FLAC
files can have ID3v1, ID3v2, and Vorbis comments) setProperties is now
called for all existing tags instead of only for the most recommended
one.
This fixes the problem that under some circumstances it was not possible
to delete a value using setProperties() because upon save() the call to
Tag::duplicate recovered that value from the ID3v1 tag.
This commit is contained in:
Michael Helmling 2012-12-10 20:56:16 +01:00
parent d5cf6d72e2
commit c0ca5c97d5
6 changed files with 41 additions and 41 deletions

View File

@ -131,12 +131,12 @@ void APE::File::removeUnsupportedProperties(const StringList &properties)
PropertyMap APE::File::setProperties(const PropertyMap &properties)
{
if(d->hasAPE)
return d->tag.access<APE::Tag>(ApeAPEIndex, false)->setProperties(properties);
else if(d->hasID3v1)
return d->tag.access<ID3v1::Tag>(ApeID3v1Index, false)->setProperties(properties);
else
return d->tag.access<APE::Tag>(ApeAPEIndex, true)->setProperties(properties);
PropertyMap result;
if(d->hasID3v1)
result = d->tag.access<ID3v1::Tag>(ApeID3v1Index, false)->setProperties(properties);
if(d->hasAPE || !d->hasID3v1)
result = d->tag.access<APE::Tag>(ApeAPEIndex, true)->setProperties(properties);
return result;
}
APE::Properties *APE::File::audioProperties() const

View File

@ -168,14 +168,14 @@ void FLAC::File::removeUnsupportedProperties(const StringList &unsupported)
PropertyMap FLAC::File::setProperties(const PropertyMap &properties)
{
if(d->hasXiphComment)
return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, false)->setProperties(properties);
else if(d->hasID3v2)
return d->tag.access<ID3v2::Tag>(FlacID3v2Index, false)->setProperties(properties);
else if(d->hasID3v1)
return d->tag.access<ID3v1::Tag>(FlacID3v1Index, false)->setProperties(properties);
else
return d->tag.access<Ogg::XiphComment>(FlacXiphIndex, true)->setProperties(properties);
PropertyMap result;
if(d->hasID3v1)
result = d->tag.access<ID3v1::Tag>(FlacID3v1Index, false)->setProperties(properties);
if(d->hasID3v2)
result = d->tag.access<ID3v2::Tag>(FlacID3v2Index, false)->setProperties(properties);
if(d->hasXiphComment || !(d->hasID3v1 || d->hasID3v2))
result = d->tag.access<Ogg::XiphComment>(FlacXiphIndex, true)->setProperties(properties);
return result;
}
FLAC::Properties *FLAC::File::audioProperties() const

View File

@ -135,15 +135,14 @@ void MPC::File::removeUnsupportedProperties(const StringList &properties)
PropertyMap MPC::File::setProperties(const PropertyMap &properties)
{
if(d->hasAPE)
return d->tag.access<APE::Tag>(MPCAPEIndex, false)->setProperties(properties);
else if(d->hasID3v1)
return d->tag.access<ID3v1::Tag>(MPCID3v1Index, false)->setProperties(properties);
else
return d->tag.access<APE::Tag>(APE, true)->setProperties(properties);
PropertyMap result;
if(d->hasID3v1)
result = d->tag.access<ID3v1::Tag>(MPCID3v1Index, false)->setProperties(properties);
if(d->hasAPE || !d->hasID3v1)
result = d->tag.access<APE::Tag>(MPCAPEIndex, true)->setProperties(properties);
return result;
}
MPC::Properties *MPC::File::audioProperties() const
{
return d->properties;

View File

@ -156,16 +156,17 @@ void MPEG::File::removeUnsupportedProperties(const StringList &properties)
else if(d->hasID3v1)
d->tag.access<ID3v1::Tag>(ID3v1Index, false)->removeUnsupportedProperties(properties);
}
PropertyMap MPEG::File::setProperties(const PropertyMap &properties)
{
if(d->hasID3v2)
return d->tag.access<ID3v2::Tag>(ID3v2Index, false)->setProperties(properties);
else if(d->hasAPE)
return d->tag.access<APE::Tag>(APEIndex, false)->setProperties(properties);
else if(d->hasID3v1)
return d->tag.access<ID3v1::Tag>(ID3v1Index, false)->setProperties(properties);
else
return d->tag.access<ID3v2::Tag>(ID3v2Index, true)->setProperties(properties);
PropertyMap result;
if(d->hasID3v1)
result = d->tag.access<ID3v1::Tag>(ID3v1Index, false)->setProperties(properties);
if(d->hasAPE)
result = d->tag.access<APE::Tag>(APEIndex, false)->setProperties(properties);
if(d->hasID3v2 || !(d->hasID3v1 || d->hasAPE))
result = d->tag.access<ID3v2::Tag>(ID3v2Index, true)->setProperties(properties);
return result;
}
MPEG::Properties *MPEG::File::audioProperties() const

View File

@ -141,12 +141,12 @@ PropertyMap TrueAudio::File::properties() const
PropertyMap TrueAudio::File::setProperties(const PropertyMap &properties)
{
if(d->hasID3v2)
return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, false)->setProperties(properties);
else if(d->hasID3v1)
return d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, false)->setProperties(properties);
else
return d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, true)->setProperties(properties);
PropertyMap result;
if(d->hasID3v1)
result = d->tag.access<ID3v1::Tag>(TrueAudioID3v1Index, false)->setProperties(properties);
if(d->hasID3v2 || !d->hasID3v1)
result =d->tag.access<ID3v2::Tag>(TrueAudioID3v2Index, true)->setProperties(properties);
return result;
}
TrueAudio::Properties *TrueAudio::File::audioProperties() const

View File

@ -119,12 +119,12 @@ PropertyMap WavPack::File::properties() const
PropertyMap WavPack::File::setProperties(const PropertyMap &properties)
{
if(d->hasAPE)
return d->tag.access<APE::Tag>(WavAPEIndex, false)->setProperties(properties);
else if(d->hasID3v1)
return d->tag.access<ID3v1::Tag>(WavID3v1Index, false)->setProperties(properties);
else
return d->tag.access<APE::Tag>(APE, true)->setProperties(properties);
PropertyMap result;
if(d->hasID3v1)
result = d->tag.access<ID3v1::Tag>(WavID3v1Index, false)->setProperties(properties);
if(d->hasAPE || !d->hasID3v1)
result = d->tag.access<APE::Tag>(WavAPEIndex, true)->setProperties(properties);
return result;
}
WavPack::Properties *WavPack::File::audioProperties() const