void setTextFrame(ID3v2::Tag *tag, const char *id, const String &text) { ID3v2::TextIdentificationFrame *f = new ID3v2::TextIdentificationFrame(id, String::UTF16); f->setText(text); tag->removeFrames(id); tag->addFrame(f); }
void testUpdateGenre24() { ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("TCON" // Frame ID "\x00\x00\x00\x0D" // Frame size "\x00\x00" // Frame flags "\0" // Encoding "14\0Eurodisco", 23); // Text ID3v2::TextIdentificationFrame *frame = static_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, TagLib::uint(4))); CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), frame->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("14"), frame->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(String("R&B Eurodisco"), tag.genre()); }
void testUpdateGenre23_1() { // "Refinement" is the same as the ID3v1 genre - duplicate ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("TCON" // Frame ID "\x00\x00\x00\x10" // Frame size "\x00\x00" // Frame flags "\x00" // Encoding "(22)Death Metal", 26); // Text ID3v2::TextIdentificationFrame *frame = static_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, TagLib::uint(3))); CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), frame->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("Death Metal"), frame->fieldList()[0]); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(String("Death Metal"), tag.genre()); }
void testUpdateGenre23_2() { // "Refinement" is different from the ID3v1 genre ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("TCON" // Frame ID "\x00\x00\x00\x13" // Frame size "\x00\x00" // Frame flags "\x00" // Encoding "(4)Eurodisco", 23); // Text ID3v2::TextIdentificationFrame *frame = static_cast<TagLib::ID3v2::TextIdentificationFrame*>(factory->createFrame(data, TagLib::uint(3))); CPPUNIT_ASSERT_EQUAL(TagLib::uint(2), frame->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("4"), frame->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("Eurodisco"), frame->fieldList()[1]); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(String("Disco Eurodisco"), tag.genre()); }
void ID3v2::Tag::downgradeFrames(FrameList *frames, FrameList *newFrames) const { d->Invalidate(); const char *unsupportedFrames[] = { "ASPI", "EQU2", "RVA2", "SEEK", "SIGN", "TDRL", "TDTG", "TMOO", "TPRO", "TSOA", "TSOT", "TSST", "TSOP", 0 }; ID3v2::TextIdentificationFrame *frameTDOR = 0; ID3v2::TextIdentificationFrame *frameTDRC = 0; ID3v2::TextIdentificationFrame *frameTIPL = 0; ID3v2::TextIdentificationFrame *frameTMCL = 0; for(FrameList::Iterator it = d->frameList.begin(); it != d->frameList.end(); it++) { ID3v2::Frame *frame = *it; ByteVector frameID = frame->header()->frameID(); for(int i = 0; unsupportedFrames[i]; i++) { if(frameID == unsupportedFrames[i]) { debug("A frame that is not supported in ID3v2.3 \'" + String(frameID) + "\' has been discarded"); frame = 0; break; } } if(frame && frameID == "TDOR") { frameTDOR = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); frame = 0; } if(frame && frameID == "TDRC") { frameTDRC = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); frame = 0; } if(frame && frameID == "TIPL") { frameTIPL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); frame = 0; } if(frame && frameID == "TMCL") { frameTMCL = dynamic_cast<ID3v2::TextIdentificationFrame *>(frame); frame = 0; } if(frame) { frames->append(frame); } } if(frameTDOR) { String content = frameTDOR->toString(); if(content.size() >= 4) { ID3v2::TextIdentificationFrame *frameTORY = new ID3v2::TextIdentificationFrame("TORY", String::Latin1); frameTORY->setText(content.substr(0, 4)); frames->append(frameTORY); newFrames->append(frameTORY); } } if(frameTDRC) { String content = frameTDRC->toString(); if(content.size() >= 4) { ID3v2::TextIdentificationFrame *frameTYER = new ID3v2::TextIdentificationFrame("TYER", String::Latin1); frameTYER->setText(content.substr(0, 4)); frames->append(frameTYER); newFrames->append(frameTYER); if(content.size() >= 10 && content[4] == '-' && content[7] == '-') { ID3v2::TextIdentificationFrame *frameTDAT = new ID3v2::TextIdentificationFrame("TDAT", String::Latin1); frameTDAT->setText(content.substr(8, 2) + content.substr(5, 2)); frames->append(frameTDAT); newFrames->append(frameTDAT); if(content.size() >= 16 && content[10] == 'T' && content[13] == ':') { ID3v2::TextIdentificationFrame *frameTIME = new ID3v2::TextIdentificationFrame("TIME", String::Latin1); frameTIME->setText(content.substr(11, 2) + content.substr(14, 2)); frames->append(frameTIME); newFrames->append(frameTIME); } } } } if(frameTIPL || frameTMCL) { ID3v2::TextIdentificationFrame *frameIPLS = new ID3v2::TextIdentificationFrame("IPLS", String::Latin1); StringList people; if(frameTMCL) { StringList v24People = frameTMCL->fieldList(); for(uint i = 0; i + 1 < v24People.size(); i += 2) { people.append(v24People[i]); people.append(v24People[i+1]); } } if(frameTIPL) { StringList v24People = frameTIPL->fieldList(); for(uint i = 0; i + 1 < v24People.size(); i += 2) { people.append(v24People[i]); people.append(v24People[i+1]); } } frameIPLS->setText(people); frames->append(frameIPLS); newFrames->append(frameIPLS); } }
void testDowngradeTo23() { ScopedFileCopy copy("xing", ".mp3"); string newname = copy.fileName(); ID3v2::TextIdentificationFrame *tf; MPEG::File foo(newname.c_str()); tf = new ID3v2::TextIdentificationFrame("TDOR", String::Latin1); tf->setText("2011-03-16"); foo.ID3v2Tag()->addFrame(tf); tf = new ID3v2::TextIdentificationFrame("TDRC", String::Latin1); tf->setText("2012-04-17T12:01"); foo.ID3v2Tag()->addFrame(tf); tf = new ID3v2::TextIdentificationFrame("TMCL", String::Latin1); tf->setText(StringList().append("Guitar").append("Artist 1").append("Drums").append("Artist 2")); foo.ID3v2Tag()->addFrame(tf); tf = new ID3v2::TextIdentificationFrame("TIPL", String::Latin1); tf->setText(StringList().append("Producer").append("Artist 3").append("Mastering").append("Artist 4")); foo.ID3v2Tag()->addFrame(tf); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDRL", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TDTG", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TMOO", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TPRO", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOA", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOT", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSST", String::Latin1)); foo.ID3v2Tag()->addFrame(new ID3v2::TextIdentificationFrame("TSOP", String::Latin1)); foo.save(MPEG::File::AllTags, true, 3); MPEG::File bar(newname.c_str()); tf = static_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDOR").front()); CPPUNIT_ASSERT(tf); CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), tf->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("2011"), tf->fieldList().front()); tf = static_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TDRC").front()); CPPUNIT_ASSERT(tf); CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), tf->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("2012"), tf->fieldList().front()); tf = dynamic_cast<ID3v2::TextIdentificationFrame *>(bar.ID3v2Tag()->frameList("TIPL").front()); CPPUNIT_ASSERT(tf); CPPUNIT_ASSERT_EQUAL(TagLib::uint(8), tf->fieldList().size()); CPPUNIT_ASSERT_EQUAL(String("Guitar"), tf->fieldList()[0]); CPPUNIT_ASSERT_EQUAL(String("Artist 1"), tf->fieldList()[1]); CPPUNIT_ASSERT_EQUAL(String("Drums"), tf->fieldList()[2]); CPPUNIT_ASSERT_EQUAL(String("Artist 2"), tf->fieldList()[3]); CPPUNIT_ASSERT_EQUAL(String("Producer"), tf->fieldList()[4]); CPPUNIT_ASSERT_EQUAL(String("Artist 3"), tf->fieldList()[5]); CPPUNIT_ASSERT_EQUAL(String("Mastering"), tf->fieldList()[6]); CPPUNIT_ASSERT_EQUAL(String("Artist 4"), tf->fieldList()[7]); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDRL")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TDTG")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TMOO")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TPRO")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOA")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOT")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSST")); CPPUNIT_ASSERT(!bar.ID3v2Tag()->frameListMap().contains("TSOP")); }