mirror of
https://github.com/taglib/taglib.git
synced 2025-06-04 01:28:21 -04:00
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:
parent
87040570c0
commit
b85a0d0710
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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());
|
||||
|
Loading…
x
Reference in New Issue
Block a user