bool CTagLoaderTagLib::ParseAPETag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag& tag) { if (!ape) return false; const APE::ItemListMap itemListMap = ape->itemListMap(); for (APE::ItemListMap::ConstIterator it = itemListMap.begin(); it != itemListMap.end(); ++it) { if (it->first == "ARTIST") SetArtist(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "ALBUM ARTIST") SetAlbumArtist(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "ALBUM") tag.SetAlbum(it->second.toString().to8Bit(true)); else if (it->first == "TITLE") tag.SetTitle(it->second.toString().to8Bit(true)); else if (it->first == "TRACKNUMBER") tag.SetTrackNumber(it->second.toString().toInt()); else if (it->first == "DISCNUMBER") tag.SetPartOfSet(it->second.toString().toInt()); else if (it->first == "YEAR") tag.SetYear(it->second.toString().toInt()); else if (it->first == "GENRE") SetGenre(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "COMMENT") tag.SetComment(it->second.toString().to8Bit(true)); else if (it->first == "ENCODEDBY") {} else if (it->first == "COMPILATION") tag.SetCompilation(it->second.toString().toInt() == 1); else if (it->first == "LYRICS") tag.SetLyrics(it->second.toString().to8Bit(true)); else if (it->first == "REPLAYGAIN_TRACK_GAIN") tag.SetReplayGainTrackGain((int)(atof(it->second.toString().toCString(true)) * 100 + 0.5)); else if (it->first == "REPLAYGAIN_ALBUM_GAIN") tag.SetReplayGainAlbumGain((int)(atof(it->second.toString().toCString(true)) * 100 + 0.5)); else if (it->first == "REPLAYGAIN_TRACK_PEAK") tag.SetReplayGainTrackPeak((float)atof(it->second.toString().toCString(true))); else if (it->first == "REPLAYGAIN_ALBUM_PEAK") tag.SetReplayGainAlbumPeak((float)atof(it->second.toString().toCString(true))); else if (it->first == "MUSICBRAINZ_ARTISTID") tag.SetMusicBrainzArtistID(it->second.toString().to8Bit(true)); else if (it->first == "MUSICBRAINZ_ALBUMARTISTID") tag.SetMusicBrainzAlbumArtistID(it->second.toString().to8Bit(true)); else if (it->first == "MUSICBRAINZ_ALBUMID") tag.SetMusicBrainzAlbumID(it->second.toString().to8Bit(true)); else if (it->first == "MUSICBRAINZ_TRACKID") tag.SetMusicBrainzTrackID(it->second.toString().to8Bit(true)); else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX) CLog::Log(LOGDEBUG, "unrecognized APE tag: %s", it->first.toCString(true)); } return true; }
/** * Read meta information from APE tags * @param tag: the APE tag * @param p_demux_meta: the demuxer meta * @param p_meta: the meta */ static void ReadMetaFromAPE( APE::Tag* tag, demux_meta_t* p_demux_meta, vlc_meta_t* p_meta ) { APE::ItemListMap fields ( tag->itemListMap() ); APE::ItemListMap::Iterator iter; iter = fields.find("COVER ART (FRONT)"); if( iter != fields.end() && !iter->second.isEmpty() && iter->second.type() == APE::Item::Binary) { input_attachment_t *p_attachment; const ByteVector picture = iter->second.binaryData(); const char *p_data = picture.data(); unsigned i_data = picture.size(); /* Null terminated filename followed by the image data */ size_t desc_len = strnlen(p_data, i_data); if( desc_len < i_data && IsUTF8( p_data ) ) { const char *psz_name = p_data; const char *psz_mime = vlc_mime_Ext2Mime( psz_name ); p_data += desc_len + 1; /* '\0' */ i_data -= desc_len + 1; msg_Dbg( p_demux_meta, "Found embedded art: %s (%s) is %u bytes", psz_name, psz_mime, i_data ); p_attachment = vlc_input_attachment_New( psz_name, psz_mime, psz_name, p_data, i_data ); if( p_attachment ) { TAB_APPEND_CAST( (input_attachment_t**), p_demux_meta->i_attachments, p_demux_meta->attachments, p_attachment ); char *psz_url; if( asprintf( &psz_url, "attachment://%s", p_attachment->psz_name ) != -1 ) { vlc_meta_SetArtURL( p_meta, psz_url ); free( psz_url ); } } } fields.erase(iter); }
bool CTagLoaderTagLib::ParseTag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag& tag) { if (!ape) return false; ReplayGain replayGainInfo; const APE::ItemListMap itemListMap = ape->itemListMap(); for (APE::ItemListMap::ConstIterator it = itemListMap.begin(); it != itemListMap.end(); ++it) { if (it->first == "ARTIST") SetArtist(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "ARTISTS") SetArtistHints(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "ALBUMARTIST" || it->first == "ALBUM ARTIST") SetAlbumArtist(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "ALBUMARTISTS" || it->first == "ALBUM ARTISTS") SetAlbumArtistHints(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "ALBUM") tag.SetAlbum(it->second.toString().to8Bit(true)); else if (it->first == "TITLE") tag.SetTitle(it->second.toString().to8Bit(true)); else if (it->first == "TRACKNUMBER" || it->first == "TRACK") tag.SetTrackNumber(it->second.toString().toInt()); else if (it->first == "DISCNUMBER" || it->first == "DISC") tag.SetDiscNumber(it->second.toString().toInt()); else if (it->first == "YEAR") tag.SetYear(it->second.toString().toInt()); else if (it->first == "GENRE") SetGenre(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "MOOD") tag.SetMood(it->second.toString().to8Bit(true)); else if (it->first == "COMMENT") tag.SetComment(it->second.toString().to8Bit(true)); else if (it->first == "CUESHEET") tag.SetCueSheet(it->second.toString().to8Bit(true)); else if (it->first == "ENCODEDBY") {} else if (it->first == "COMPOSER") AddArtistRole(tag, "Composer", StringListToVectorString(it->second.toStringList())); else if (it->first == "CONDUCTOR") AddArtistRole(tag, "Conductor", StringListToVectorString(it->second.toStringList())); else if ((it->first == "BAND") || (it->first == "ENSEMBLE")) AddArtistRole(tag, "Orchestra", StringListToVectorString(it->second.toStringList())); else if (it->first == "LYRICIST") AddArtistRole(tag, "Lyricist", StringListToVectorString(it->second.toStringList())); else if (it->first == "MIXARTIST") AddArtistRole(tag, "Remixer", StringListToVectorString(it->second.toStringList())); else if (it->first == "ARRANGER") AddArtistRole(tag, "Arranger", StringListToVectorString(it->second.toStringList())); else if (it->first == "ENGINEER") AddArtistRole(tag, "Engineer", StringListToVectorString(it->second.toStringList())); else if (it->first == "PRODUCER") AddArtistRole(tag, "Producer", StringListToVectorString(it->second.toStringList())); else if (it->first == "DJMIXER") AddArtistRole(tag, "DJMixer", StringListToVectorString(it->second.toStringList())); else if (it->first == "MIXER") AddArtistRole(tag, "Mixer", StringListToVectorString(it->second.toStringList())); else if (it->first == "PERFORMER") // Picard uses PERFORMER tag as musician credits list formatted "name (instrument)" AddArtistInstrument(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "LABEL") {} // Publisher. Known unsupported, supress warnings else if (it->first == "COMPILATION") tag.SetCompilation(it->second.toString().toInt() == 1); else if (it->first == "LYRICS") tag.SetLyrics(it->second.toString().to8Bit(true)); else if (it->first == "REPLAYGAIN_TRACK_GAIN") replayGainInfo.ParseGain(ReplayGain::TRACK, it->second.toString().toCString(true)); else if (it->first == "REPLAYGAIN_ALBUM_GAIN") replayGainInfo.ParseGain(ReplayGain::ALBUM, it->second.toString().toCString(true)); else if (it->first == "REPLAYGAIN_TRACK_PEAK") replayGainInfo.ParsePeak(ReplayGain::TRACK, it->second.toString().toCString(true)); else if (it->first == "REPLAYGAIN_ALBUM_PEAK") replayGainInfo.ParsePeak(ReplayGain::ALBUM, it->second.toString().toCString(true)); else if (it->first == "MUSICBRAINZ_ARTISTID") tag.SetMusicBrainzArtistID(SplitMBID(StringListToVectorString(it->second.toStringList()))); else if (it->first == "MUSICBRAINZ_ALBUMARTISTID") tag.SetMusicBrainzAlbumArtistID(SplitMBID(StringListToVectorString(it->second.toStringList()))); else if (it->first == "MUSICBRAINZ_ALBUMARTIST") SetAlbumArtist(tag, StringListToVectorString(it->second.toStringList())); else if (it->first == "MUSICBRAINZ_ALBUMID") tag.SetMusicBrainzAlbumID(it->second.toString().to8Bit(true)); else if (it->first == "MUSICBRAINZ_TRACKID") tag.SetMusicBrainzTrackID(it->second.toString().to8Bit(true)); else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX) CLog::Log(LOGDEBUG, "unrecognized APE tag: %s", it->first.toCString(true)); } tag.SetReplayGain(replayGainInfo); return true; }