void testSavePicture() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::Picture picture; picture.setMimeType("image/jpeg"); picture.setType(ASF::Picture::FrontCover); picture.setDescription("description"); picture.setPicture("data"); f.tag()->setAttribute("WM/Picture", picture); f.save(); } { ASF::File f(newname.c_str()); ASF::AttributeList values2 = f.tag()->attribute("WM/Picture"); CPPUNIT_ASSERT_EQUAL((size_t)1, values2.size()); ASF::Attribute attr2 = values2.front(); ASF::Picture picture2 = attr2.toPicture(); CPPUNIT_ASSERT(picture2.isValid()); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture2.mimeType()); CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture2.type()); CPPUNIT_ASSERT_EQUAL(String("description"), picture2.description()); CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture2.picture()); } }
void testSaveMultiplePictures() { ScopedFileCopy copy("silence-1", ".wma"); string newname = copy.fileName(); { ASF::File f(newname.c_str()); ASF::AttributeList values; ASF::Picture picture; picture.setMimeType("image/jpeg"); picture.setType(ASF::Picture::FrontCover); picture.setDescription("description"); picture.setPicture("data"); values.append(ASF::Attribute(picture)); ASF::Picture picture2; picture2.setMimeType("image/png"); picture2.setType(ASF::Picture::BackCover); picture2.setDescription("back cover"); picture2.setPicture("PNG data"); values.append(ASF::Attribute(picture2)); f.tag()->setAttribute("WM/Picture", values); f.save(); } { ASF::File f(newname.c_str()); ASF::AttributeList values2 = f.tag()->attribute("WM/Picture"); CPPUNIT_ASSERT_EQUAL((size_t)2, values2.size()); ASF::Picture picture3 = values2[1].toPicture(); CPPUNIT_ASSERT(picture3.isValid()); CPPUNIT_ASSERT_EQUAL(String("image/jpeg"), picture3.mimeType()); CPPUNIT_ASSERT_EQUAL(ASF::Picture::FrontCover, picture3.type()); CPPUNIT_ASSERT_EQUAL(String("description"), picture3.description()); CPPUNIT_ASSERT_EQUAL(ByteVector("data"), picture3.picture()); ASF::Picture picture4 = values2[0].toPicture(); CPPUNIT_ASSERT(picture4.isValid()); CPPUNIT_ASSERT_EQUAL(String("image/png"), picture4.mimeType()); CPPUNIT_ASSERT_EQUAL(ASF::Picture::BackCover, picture4.type()); CPPUNIT_ASSERT_EQUAL(String("back cover"), picture4.description()); CPPUNIT_ASSERT_EQUAL(ByteVector("PNG data"), picture4.picture()); } }
bool CTagLoaderTagLib::ParseASF(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag& tag) { if (!asf) return false; tag.SetTitle(asf->title().to8Bit(true)); const ASF::AttributeListMap& attributeListMap = asf->attributeListMap(); for (ASF::AttributeListMap::ConstIterator it = attributeListMap.begin(); it != attributeListMap.end(); ++it) { if (it->first == "Author") SetArtist(tag, GetASFStringList(it->second)); else if (it->first == "WM/AlbumArtist") SetAlbumArtist(tag, GetASFStringList(it->second)); else if (it->first == "WM/AlbumTitle") tag.SetAlbum(it->second.front().toString().to8Bit(true)); else if (it->first == "WM/TrackNumber" || it->first == "WM/Track") { if (it->second.front().type() == ASF::Attribute::DWordType) tag.SetTrackNumber(it->second.front().toUInt()); else tag.SetTrackNumber(atoi(it->second.front().toString().toCString(true))); } else if (it->first == "WM/PartOfSet") tag.SetPartOfSet(atoi(it->second.front().toString().toCString(true))); else if (it->first == "WM/Genre") SetGenre(tag, GetASFStringList(it->second)); else if (it->first == "WM/AlbumArtistSortOrder") {} // Known unsupported, supress warnings else if (it->first == "WM/ArtistSortOrder") {} // Known unsupported, supress warnings else if (it->first == "WM/Script") {} // Known unsupported, supress warnings else if (it->first == "WM/Year") tag.SetYear(atoi(it->second.front().toString().toCString(true))); else if (it->first == "MusicBrainz/Artist Id") tag.SetMusicBrainzArtistID(GetASFStringList(it->second)); else if (it->first == "MusicBrainz/Album Id") tag.SetMusicBrainzAlbumID(it->second.front().toString().to8Bit(true)); else if (it->first == "MusicBrainz/Album Artist") SetAlbumArtist(tag, GetASFStringList(it->second)); else if (it->first == "MusicBrainz/Album Artist Id") tag.SetMusicBrainzAlbumArtistID(GetASFStringList(it->second)); else if (it->first == "MusicBrainz/Track Id") tag.SetMusicBrainzTrackID(it->second.front().toString().to8Bit(true)); else if (it->first == "MusicBrainz/Album Status") {} else if (it->first == "MusicBrainz/Album Type") {} else if (it->first == "MusicIP/PUID") {} else if (it->first == "replaygain_track_gain") tag.SetReplayGainTrackGain((int)(atof(it->second.front().toString().toCString(true)) * 100 + 0.5)); else if (it->first == "replaygain_album_gain") tag.SetReplayGainAlbumGain((int)(atof(it->second.front().toString().toCString(true)) * 100 + 0.5)); else if (it->first == "replaygain_track_peak") tag.SetReplayGainTrackPeak((float)atof(it->second.front().toString().toCString(true))); else if (it->first == "replaygain_album_peak") tag.SetReplayGainAlbumPeak((float)atof(it->second.front().toString().toCString(true))); else if (it->first == "WM/Picture") { // picture ASF::Picture pic = it->second.front().toPicture(); tag.SetCoverArtInfo(pic.picture().size(), pic.mimeType().toCString()); if (art) art->set((const uint8_t *)pic.picture().data(), pic.picture().size(), pic.mimeType().toCString()); } else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX) CLog::Log(LOGDEBUG, "unrecognized ASF tag name: %s", it->first.toCString(true)); } // artist may be specified in the ContentDescription block rather than using the 'Author' attribute. if (tag.GetArtist().empty()) tag.SetArtist(asf->artist().toCString(true)); tag.SetLoaded(true); return true; }
bool CTagLoaderTagLib::ParseTag(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag& tag) { if (!asf) return false; ReplayGain replayGainInfo; tag.SetTitle(asf->title().to8Bit(true)); const ASF::AttributeListMap& attributeListMap = asf->attributeListMap(); for (ASF::AttributeListMap::ConstIterator it = attributeListMap.begin(); it != attributeListMap.end(); ++it) { if (it->first == "Author") SetArtist(tag, GetASFStringList(it->second)); else if (it->first == "WM/AlbumArtist") SetAlbumArtist(tag, GetASFStringList(it->second)); else if (it->first == "WM/AlbumTitle") tag.SetAlbum(it->second.front().toString().to8Bit(true)); else if (it->first == "WM/TrackNumber" || it->first == "WM/Track") { if (it->second.front().type() == ASF::Attribute::DWordType) tag.SetTrackNumber(it->second.front().toUInt()); else tag.SetTrackNumber(atoi(it->second.front().toString().toCString(true))); } else if (it->first == "WM/PartOfSet") tag.SetDiscNumber(atoi(it->second.front().toString().toCString(true))); else if (it->first == "WM/Genre") SetGenre(tag, GetASFStringList(it->second)); else if (it->first == "WM/Mood") tag.SetMood(it->second.front().toString().to8Bit(true)); else if (it->first == "WM/Composer") AddArtistRole(tag, "Composer", GetASFStringList(it->second)); else if (it->first == "WM/Conductor") AddArtistRole(tag, "Conductor", GetASFStringList(it->second)); //No ASF/WMA tag from Taglib for "ensemble" else if (it->first == "WM/Writer") AddArtistRole(tag, "Lyricist", GetASFStringList(it->second)); else if (it->first == "WM/ModifiedBy") AddArtistRole(tag, "Remixer", GetASFStringList(it->second)); else if (it->first == "WM/Engineer") AddArtistRole(tag, "Engineer", GetASFStringList(it->second)); else if (it->first == "WM/Producer") AddArtistRole(tag, "Producer", GetASFStringList(it->second)); else if (it->first == "WM/DJMixer") AddArtistRole(tag, "DJMixer", GetASFStringList(it->second)); else if (it->first == "WM/Mixer") AddArtistRole(tag, "mixer", GetASFStringList(it->second)); else if (it->first == "WM/Publisher") {} // Known unsupported, supress warnings else if (it->first == "WM/AlbumArtistSortOrder") {} // Known unsupported, supress warnings else if (it->first == "WM/ArtistSortOrder") {} // Known unsupported, supress warnings else if (it->first == "WM/Script") {} // Known unsupported, supress warnings else if (it->first == "WM/Year") tag.SetYear(atoi(it->second.front().toString().toCString(true))); else if (it->first == "MusicBrainz/Artist Id") tag.SetMusicBrainzArtistID(SplitMBID(GetASFStringList(it->second))); else if (it->first == "MusicBrainz/Album Id") tag.SetMusicBrainzAlbumID(it->second.front().toString().to8Bit(true)); else if (it->first == "MusicBrainz/Album Artist") SetAlbumArtist(tag, GetASFStringList(it->second)); else if (it->first == "MusicBrainz/Album Artist Id") tag.SetMusicBrainzAlbumArtistID(SplitMBID(GetASFStringList(it->second))); else if (it->first == "MusicBrainz/Track Id") tag.SetMusicBrainzTrackID(it->second.front().toString().to8Bit(true)); else if (it->first == "MusicBrainz/Album Status") {} else if (it->first == "MusicBrainz/Album Type") {} else if (it->first == "MusicIP/PUID") {} else if (it->first == "replaygain_track_gain") replayGainInfo.ParseGain(ReplayGain::TRACK, it->second.front().toString().toCString(true)); else if (it->first == "replaygain_album_gain") replayGainInfo.ParseGain(ReplayGain::ALBUM, it->second.front().toString().toCString(true)); else if (it->first == "replaygain_track_peak") replayGainInfo.ParsePeak(ReplayGain::TRACK, it->second.front().toString().toCString(true)); else if (it->first == "replaygain_album_peak") replayGainInfo.ParsePeak(ReplayGain::ALBUM, it->second.front().toString().toCString(true)); else if (it->first == "WM/Picture") { // picture ASF::Picture pic = it->second.front().toPicture(); tag.SetCoverArtInfo(pic.picture().size(), pic.mimeType().toCString()); if (art) art->set(reinterpret_cast<const uint8_t *>(pic.picture().data()), pic.picture().size(), pic.mimeType().toCString()); } else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX) CLog::Log(LOGDEBUG, "unrecognized ASF tag name: %s", it->first.toCString(true)); } // artist may be specified in the ContentDescription block rather than using the 'Author' attribute. if (tag.GetArtist().empty()) tag.SetArtist(asf->artist().toCString(true)); if (asf->comment() != String::null) tag.SetComment(asf->comment().toCString(true)); tag.SetReplayGain(replayGainInfo); tag.SetLoaded(true); return true; }