Rebuild TRDC from v2.3 fields

This fixes an issue that was reported to me via email with the recording
date being thrown away from v2.3 tags.
This commit is contained in:
Scott Wheeler 2014-09-25 22:19:09 +02:00
parent 87040570c0
commit b85a0d0710
4 changed files with 34 additions and 2 deletions

View File

@ -278,6 +278,28 @@ Frame *FrameFactory::createFrame(const ByteVector &origData, const Header *tagHe
return new UnknownFrame(data, header);
}
void FrameFactory::rebuildAggregateFrames(Tag *tag) const
{
if(tag->header()->majorVersion() < 4 &&
tag->frameList("TDRC").size() == 1 &&
tag->frameList("TDAT").size() == 1)
{
TextIdentificationFrame *trdc =
static_cast<TextIdentificationFrame *>(tag->frameList("TDRC").front());
UnknownFrame *tdat =
static_cast<UnknownFrame *>(tag->frameList("TDAT").front());
if(trdc->fieldList().size() == 1 &&
trdc->fieldList().front().size() == 4 &&
tdat->data().size() >= 5)
{
String date(tdat->data().mid(1), String::Type(tdat->data()[0]));
if(date.length() == 4)
trdc->setText(trdc->toString() + '-' + date.substr(2, 2) + '-' + date.substr(0, 2));
}
}
}
String::Type FrameFactory::defaultTextEncoding() const
{
return d->defaultEncoding;

View File

@ -72,6 +72,14 @@ namespace TagLib {
*/
virtual Frame *createFrame(const ByteVector &data, const Header *tagHeader) const;
/*!
* After a tag has been read, this tries to rebuild some of them
* information, most notably the recording date, from frames that
* have been deprecated and can't be upgraded directly.
*/
// BIC: Make virtual
void rebuildAggregateFrames(Tag *tag) const;
/*!
* Returns the default text encoding for text frames. If setTextEncoding()
* has not been explicitly called this will only be used for new text

View File

@ -704,7 +704,7 @@ void ID3v2::Tag::parse(const ByteVector &origData)
}
d->paddingSize = static_cast<int>(frameDataLength - frameDataPosition);
return;
break;
}
Frame *frame = d->factory->createFrame(data.mid(frameDataPosition),
@ -723,6 +723,8 @@ void ID3v2::Tag::parse(const ByteVector &origData)
frameDataPosition += frame->size() + Frame::headerSize(d->header.majorVersion());
addFrame(frame);
}
d->factory->rebuildAggregateFrames(this);
}
void ID3v2::Tag::setTextFrame(const ByteVector &id, const String &value)

View File

@ -698,7 +698,7 @@ public:
tf = static_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDRC").front());
CPPUNIT_ASSERT(tf);
CPPUNIT_ASSERT_EQUAL(size_t(1), tf->fieldList().size());
CPPUNIT_ASSERT_EQUAL(String("2012"), tf->fieldList().front());
CPPUNIT_ASSERT_EQUAL(String("2012-04-17"), tf->fieldList().front());
tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TIPL").front());
CPPUNIT_ASSERT(tf);
CPPUNIT_ASSERT_EQUAL(size_t(8), tf->fieldList().size());