bool updateTags(char *path, Metadata *meta) { MPEG::File file(path); if (!file.isValid() || file.readOnly()) { return false; } ID3v2::Tag *tag = file.ID3v2Tag(true); if (!tag) { return false; } if (meta->hasArtist) { setTextFrame(tag, "TPE1", meta->artist); } if (meta->hasAlbum) { setTextFrame(tag, "TALB", meta->album); } if (meta->hasAlbumArtist) { setTextFrame(tag, "TPE2", meta->albumartist); } if (meta->hasTitle) { setTextFrame(tag, "TIT2", meta->title); } if (meta->hasTrackNumber) { String text = String::number(meta->trackNumber); if (meta->hasTrackCount) { text += "/" + String::number(meta->trackCount); } setTextFrame(tag, "TRCK", text); } if (meta->hasGenre) { setTextFrame(tag, "TCON", meta->genre); } if (meta->hasPublisher) { setTextFrame(tag, "TPUB", meta->publisher); } if (meta->hasYear) { setTextFrame(tag, "TDRC", String::number(meta->year)); } if (meta->hasImage) { ID3v2::AttachedPictureFrame *f = new ID3v2::AttachedPictureFrame(); f->setType(ID3v2::AttachedPictureFrame::Other); f->setPicture(meta->image); f->setMimeType(detectImageMimeType(meta->image)); tag->removeFrames("APIC"); tag->addFrame(f); } return file.save(MPEG::File::ID3v1 | MPEG::File::ID3v2, false, 3); }
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 testDontRender22() { ID3v2::FrameFactory *factory = ID3v2::FrameFactory::instance(); ByteVector data = ByteVector("FOO" "\x00\x00\x08" "\x00" "JPG" "\x01" "d\x00" "\x00", 18); ID3v2::AttachedPictureFrame *frame = static_cast<TagLib::ID3v2::AttachedPictureFrame*>(factory->createFrame(data, TagLib::uint(2))); CPPUNIT_ASSERT(frame); ID3v2::Tag tag; tag.addFrame(frame); CPPUNIT_ASSERT_EQUAL(TagLib::uint(1034), tag.render().size()); }