From f859fcf82ac9f29b7aeb399f13a9cab2610c64f6 Mon Sep 17 00:00:00 2001 From: Michael Helmling Date: Sun, 26 Feb 2012 18:07:02 +0100 Subject: [PATCH] Add support for Unknown TXXX frames. --- taglib/mpeg/id3v2/id3v2frame.cpp | 21 +++++++++------ taglib/mpeg/id3v2/id3v2tag.cpp | 44 +++++++++++++++++++------------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/taglib/mpeg/id3v2/id3v2frame.cpp b/taglib/mpeg/id3v2/id3v2frame.cpp index 7a7c0da1..ed023123 100644 --- a/taglib/mpeg/id3v2/id3v2frame.cpp +++ b/taglib/mpeg/id3v2/id3v2frame.cpp @@ -431,9 +431,16 @@ PropertyMap Frame::asProperties() const { const ByteVector &id = frameID(); // workaround until this function is virtual - if(id == "TXXX") - return dynamic_cast< const UserTextIdentificationFrame* >(this)->asProperties(); - else if(id[0] == 'T') + if(id == "TXXX") { + const UserTextIdentificationFrame *txxxFrame = dynamic_cast< const UserTextIdentificationFrame* >(this); + if(txxxFrame != NULL) + return txxxFrame->asProperties(); + else { + PropertyMap m; + m.unsupportedData().append("UNKNOWN"); + return m; + } + } else if(id[0] == 'T') return dynamic_cast< const TextIdentificationFrame* >(this)->asProperties(); else if(id == "WXXX") return dynamic_cast< const UserUrlLinkFrame* >(this)->asProperties(); @@ -443,11 +450,9 @@ PropertyMap Frame::asProperties() const return dynamic_cast< const CommentsFrame* >(this)->asProperties(); else if(id == "USLT") return dynamic_cast< const UnsynchronizedLyricsFrame* >(this)->asProperties(); - else { - PropertyMap m; - m.unsupportedData().append(id); - return m; - } + PropertyMap m; + m.unsupportedData().append(id); + return m; } void Frame::splitProperties(const PropertyMap &original, PropertyMap &singleFrameProperties, diff --git a/taglib/mpeg/id3v2/id3v2tag.cpp b/taglib/mpeg/id3v2/id3v2tag.cpp index 4731ba55..49c0c517 100644 --- a/taglib/mpeg/id3v2/id3v2tag.cpp +++ b/taglib/mpeg/id3v2/id3v2tag.cpp @@ -350,24 +350,32 @@ void ID3v2::Tag::removeUnsupportedProperties(const StringList &properties) // by the PropertyMap interface. Three special cases exist: TXXX, WXXX, and COMM // frames may also be unsupported if their description() is not a valid key. for(StringList::ConstIterator it = properties.begin(); it != properties.end(); ++it){ - ByteVector id = it->substr(0,4).data(String::Latin1); - if(id == "TXXX") { - String description = it->substr(5); - Frame *frame = UserTextIdentificationFrame::find(this, description); - if(frame) - removeFrame(frame); - } else if(id == "WXXX") { - String description = it->substr(5); - Frame *frame = UserUrlLinkFrame::find(this, description); - if(frame) - removeFrame(frame); - } else if(id == "COMM") { - String description = it->substr(5); - Frame *frame = CommentsFrame::findByDescription(this, description); - if(frame) - removeFrame(frame); - } else - removeFrames(id); // there should be only one frame with "id" + if(*it == "UNKNOWN") { + // delete all unknown frames + FrameList l = frameList(); + for(FrameList::ConstIterator fit = l.begin(); fit != l.end(); fit++) + if (dynamic_cast(*fit) != NULL) + removeFrame(*fit); + } else { + ByteVector id = it->substr(0,4).data(String::Latin1); + if(id == "TXXX") { + String description = it->substr(5); + Frame *frame = UserTextIdentificationFrame::find(this, description); + if(frame) + removeFrame(frame); + } else if(id == "WXXX") { + String description = it->substr(5); + Frame *frame = UserUrlLinkFrame::find(this, description); + if(frame) + removeFrame(frame); + } else if(id == "COMM") { + String description = it->substr(5); + Frame *frame = CommentsFrame::findByDescription(this, description); + if(frame) + removeFrame(frame); + } else + removeFrames(id); // there should be only one frame with "id" + } } } -- 2.40.0