void CTagLoaderTagLib::SetAlbumArtist(CMusicInfoTag &tag, const std::vector<std::string> &values) { if (values.size() == 1) tag.SetAlbumArtist(values[0]); else tag.SetAlbumArtist(values); }
void CTagLoaderTagLib::SetAlbumArtist(CMusicInfoTag &tag, const std::vector<std::string> &values) { if (values.size() == 1) tag.SetAlbumArtist(values[0]); else // Fill both artist vector and artist desc from tag value. // Note desc may not be empty as it could have been set by previous parsing of ID3v2 before APE tag.SetAlbumArtist(values, true); }
bool CEncoderLame::Close() { // may return one more mp3 frames int iBytes = m_dll.lame_encode_flush(m_pGlobalFlags, m_buffer, sizeof(m_buffer)); if (iBytes < 0) { CLog::Log(LOGERROR, "Internal Lame error: %i", iBytes); return false; } WriteStream(m_buffer, iBytes); FlushStream(); FileClose(); // open again, but now the old way, lame only accepts FILE pointers FILE* file = fopen_utf8(m_strFile.c_str(), "rb+"); if (!file) { CLog::Log(LOGERROR, "Error: Cannot open file for writing tags: %s", m_strFile.c_str()); return false; } m_dll.lame_mp3_tags_fid(m_pGlobalFlags, file); /* add VBR tags to mp3 file */ fclose(file); m_dll.lame_close(m_pGlobalFlags); // unload the lame dll m_dll.Unload(); // Store a id3 tag in the ripped file CID3Tag id3tag; CMusicInfoTag tag; tag.SetAlbum(m_strAlbum); tag.SetAlbumArtist(m_strAlbumArtist); tag.SetArtist(m_strArtist); tag.SetGenre(m_strGenre); tag.SetTitle(m_strTitle); tag.SetTrackNumber(atoi(m_strTrack.c_str())); SYSTEMTIME time; time.wYear=atoi(m_strYear.c_str()); tag.SetReleaseDate(time); id3tag.SetMusicInfoTag(tag); id3tag.Write(m_strFile); return true; }
bool CMusicInfoTagLoaderApe::Load(const CStdString& strFileName, CMusicInfoTag& tag, EmbeddedArt *art) { try { // retrieve the APE Tag info from strFileName // and put it in tag tag.SetURL(strFileName); DVDPlayerCodec codec; if (codec.Init(strFileName, 4096)) { tag.SetDuration((int)(codec.m_TotalTime/1000)); codec.DeInit(); } CAPEv2Tag myTag; if (myTag.ReadTag((char*)strFileName.c_str())) // true to check ID3 tag as well { tag.SetTitle(myTag.GetTitle()); tag.SetAlbum(myTag.GetAlbum()); tag.SetArtist(myTag.GetArtist()); tag.SetAlbumArtist(myTag.GetAlbumArtist()); tag.SetGenre(myTag.GetGenre()); tag.SetTrackNumber(myTag.GetTrackNum()); tag.SetPartOfSet(myTag.GetDiscNum()); tag.SetComment(myTag.GetComment()); tag.SetLyrics(myTag.GetLyrics()); tag.SetMusicBrainzAlbumArtistID(myTag.GetMusicBrainzAlbumArtistID()); tag.SetMusicBrainzAlbumID(myTag.GetMusicBrainzAlbumID()); tag.SetMusicBrainzArtistID(myTag.GetMusicBrainzArtistID()); tag.SetMusicBrainzTrackID(myTag.GetMusicBrainzTrackID()); tag.SetMusicBrainzTRMID(myTag.GetMusicBrainzTRMID()); SYSTEMTIME dateTime; ZeroMemory(&dateTime, sizeof(SYSTEMTIME)); dateTime.wYear = atoi(myTag.GetYear()); tag.SetRating(myTag.GetRating()); tag.SetReleaseDate(dateTime); tag.SetLoaded(); return true; } } catch (...) { CLog::Log(LOGERROR, "Tag loader ape: exception in file %s", strFileName.c_str()); } tag.SetLoaded(false); return false; }
bool CMusicInfoTagLoaderMP4::Load(const CStdString& strFileName, CMusicInfoTag& tag, EmbeddedArt *art) { try { // Initially we say that we've not loaded any tag information tag.SetLoaded(false); // Attempt to open the file.. if ( !m_file.Open( strFileName ) ) { CLog::Log(LOGDEBUG, "Tag loader mp4: failed to open file %s", strFileName.c_str() ); return false; } // We've opened it, so associate the tag with the filename. tag.SetURL(strFileName); // Now go parse our atom data m_isCompilation = false; ParseAtom( 0, m_file.GetLength(), tag, art ); if (m_isCompilation) { // iTunes compilation flag is set - this could be a various artists file if (tag.GetAlbumArtist().empty()) tag.SetAlbumArtist(g_localizeStrings.Get(340)); // Various Artists } // Close the file.. m_file.Close(); // Return to caller return true; } catch (...) { CLog::Log(LOGERROR, "Tag loader mp4: exception in file %s", strFileName.c_str()); } // Something must have gone wrong for us to get here, so let's report our failure to the boss.. tag.SetLoaded(false); return false; }
int CPVRChannels::GetChannels(CFileItemList* results, int iGroupID /* = -1 */, bool bHidden /* = false */) { int iAmount = 0; SortByChannelNumber(); for (unsigned int ptr = 0; ptr < size(); ptr++) { CPVRChannel *channel = at(ptr); if (channel->IsHidden() != bHidden) continue; if (iGroupID != -1 && channel->GroupID() != iGroupID) continue; CFileItemPtr channelFile(new CFileItem(*channel)); if (channel->IsRadio()) { CMusicInfoTag* musictag = channelFile->GetMusicInfoTag(); if (musictag) { const CPVREpgInfoTag *epgNow = channel->GetEPGNow(); musictag->SetURL(channel->Path()); musictag->SetTitle(epgNow->Title()); musictag->SetArtist(channel->ChannelName()); musictag->SetAlbumArtist(channel->ChannelName()); musictag->SetGenre(epgNow->Genre()); musictag->SetDuration(epgNow->GetDuration()); musictag->SetLoaded(true); musictag->SetComment(""); musictag->SetLyrics(""); } } results->Add(channelFile); iAmount++; } return iAmount; }
bool CMusicInfoTagLoaderApe::Load(const CStdString& strFileName, CMusicInfoTag& tag) { try { // retrieve the APE Tag info from strFileName // and put it in tag tag.SetURL(strFileName); CAPEv2Tag myTag; if (myTag.ReadTag((char*)strFileName.c_str())) // true to check ID3 tag as well { tag.SetTitle(myTag.GetTitle()); tag.SetAlbum(myTag.GetAlbum()); tag.SetArtist(myTag.GetArtist()); tag.SetAlbumArtist(myTag.GetAlbumArtist()); tag.SetGenre(myTag.GetGenre()); tag.SetTrackNumber(myTag.GetTrackNum()); tag.SetPartOfSet(myTag.GetDiscNum()); tag.SetComment(myTag.GetComment()); tag.SetLyrics(myTag.GetLyrics()); SYSTEMTIME dateTime; ZeroMemory(&dateTime, sizeof(SYSTEMTIME)); dateTime.wYear = atoi(myTag.GetYear()); tag.SetRating(myTag.GetRating()); tag.SetReleaseDate(dateTime); tag.SetLoaded(); return true; } } catch (...) { CLog::Log(LOGERROR, "Tag loader ape: exception in file %s", strFileName.c_str()); } tag.SetLoaded(false); return false; }
bool CPVRManager::UpdateItem(CFileItem& item) { /* Don't update if a recording is played */ if (item.IsPVRRecording()) return false; if (!item.IsPVRChannel()) { CLog::Log(LOGERROR, "CPVRManager - %s - no channel tag provided", __FUNCTION__); return false; } CSingleLock lock(m_critSection); if (!m_currentFile || *m_currentFile->GetPVRChannelInfoTag() == *item.GetPVRChannelInfoTag()) return false; g_application.CurrentFileItem() = *m_currentFile; g_infoManager.SetCurrentItem(*m_currentFile); CPVRChannel* channelTag = item.GetPVRChannelInfoTag(); CEpgInfoTag epgTagNow; bool bHasTagNow = channelTag->GetEPGNow(epgTagNow); if (channelTag->IsRadio()) { CMusicInfoTag* musictag = item.GetMusicInfoTag(); if (musictag) { musictag->SetTitle(bHasTagNow ? epgTagNow.Title() : g_localizeStrings.Get(19055)); if (bHasTagNow) musictag->SetGenre(epgTagNow.Genre()); musictag->SetDuration(bHasTagNow ? epgTagNow.GetDuration() : 3600); musictag->SetURL(channelTag->Path()); musictag->SetArtist(channelTag->ChannelName()); musictag->SetAlbumArtist(channelTag->ChannelName()); musictag->SetLoaded(true); musictag->SetComment(StringUtils::EmptyString); musictag->SetLyrics(StringUtils::EmptyString); } } else { CVideoInfoTag *videotag = item.GetVideoInfoTag(); if (videotag) { videotag->m_strTitle = bHasTagNow ? epgTagNow.Title() : g_localizeStrings.Get(19055); if (bHasTagNow) videotag->m_genre = epgTagNow.Genre(); videotag->m_strPath = channelTag->Path(); videotag->m_strFileNameAndPath = channelTag->Path(); videotag->m_strPlot = bHasTagNow ? epgTagNow.Plot() : StringUtils::EmptyString; videotag->m_strPlotOutline = bHasTagNow ? epgTagNow.PlotOutline() : StringUtils::EmptyString; videotag->m_iEpisode = bHasTagNow ? epgTagNow.EpisodeNum() : 0; } } CPVRChannel* tagPrev = item.GetPVRChannelInfoTag(); if (tagPrev && tagPrev->ChannelNumber() != m_LastChannel) { m_LastChannel = tagPrev->ChannelNumber(); m_LastChannelChanged = XbmcThreads::SystemClockMillis(); } if (XbmcThreads::SystemClockMillis() - m_LastChannelChanged >= (unsigned int) g_guiSettings.GetInt("pvrplayback.channelentrytimeout") && m_LastChannel != m_PreviousChannel[m_PreviousChannelIndex]) m_PreviousChannel[m_PreviousChannelIndex ^= 1] = m_LastChannel; else m_LastChannelChanged = XbmcThreads::SystemClockMillis(); return false; }
void CMusicInfoTagLoaderMP4::ParseTag( unsigned int metaKey, const char* pMetaData, int metaSize, CMusicInfoTag& tag) { switch ( metaKey ) { case g_TitleAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; // we use utf8 internally tag.SetLoaded( true ); tag.SetTitle( dataWorkspace.get() ); break; } case g_ArtistAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetArtist( dataWorkspace.get() ); break; } case g_AlbumAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetAlbum( dataWorkspace.get() ); break; } case g_AlbumArtistAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetAlbumArtist( dataWorkspace.get() ); break; } case g_DayAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; SYSTEMTIME dateTime; dateTime.wYear = atoi( dataWorkspace.get() ); tag.SetReleaseDate( dateTime ); break; } case g_GenreAtomName: { // When a genre number is specified, we need to translate to a string for display.. // Note that AAC/iTunes genre numbers are the same as ID3 numbers, but are offset by 1. const char* pGenre = ID3_V1GENRE2DESCRIPTION( (unsigned char)pMetaData[ 1 ] - 1 ); if ( pGenre ) { tag.SetGenre( pGenre ); } break; } case g_CompilationAtomName: { if (metaSize == 1) m_isCompilation = *pMetaData == 1; break; } case g_CommentAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetComment( dataWorkspace.get() ); break; } case g_LyricsAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetLyrics( dataWorkspace.get() ); break; } case g_CustomGenreAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetGenre( dataWorkspace.get() ); break; } case g_TrackNumberAtomName: { tag.SetTrackNumber( pMetaData[ 3 ] ); break; } case g_DiscNumberAtomName: { tag.SetPartOfSet( pMetaData[ 3 ] ); break; } case g_CoverArtAtomName: { // This cover-art handling is pretty much what was in the old MP4 tag processing code.. // note that according to http://atomicparsley.sourceforge.net/mpeg-4files.html the type // of image (PNG=14 or JPG=13) is contained in pMetadata[-5] but we currently don't use this. m_thumbSize = metaSize; delete[] m_thumbData; m_thumbData = new BYTE[m_thumbSize]; if (m_thumbData) memcpy(m_thumbData, pMetaData, metaSize); break; } default: break; } }
bool CMusicInfoTagLoaderMP4::Load(const CStdString& strFileName, CMusicInfoTag& tag) { try { // Initially we say that we've not loaded any tag information tag.SetLoaded(false); // Attempt to open the file.. if ( !m_file.Open( strFileName ) ) { CLog::Log(LOGDEBUG, "Tag loader mp4: failed to open file %s", strFileName.c_str() ); return false; } // We've opened it, so associate the tag with the filename. tag.SetURL(strFileName); // Now go parse our atom data m_thumbSize = false; m_thumbData = NULL; m_isCompilation = false; ParseAtom( 0, m_file.GetLength(), tag ); if (m_thumbData) { // cache the thumb // if we don't have an album tag, cache with the full file path so that // other non-tagged files don't get this album image CStdString strCoverArt; if (!tag.GetAlbum().IsEmpty() && (!tag.GetAlbumArtist().IsEmpty() || !tag.GetArtist().IsEmpty())) strCoverArt = CThumbnailCache::GetAlbumThumb(&tag); else strCoverArt = CThumbnailCache::GetMusicThumb(tag.GetURL()); if (!CUtil::ThumbExists(strCoverArt)) { if (CPicture::CreateThumbnailFromMemory( m_thumbData, m_thumbSize, "", strCoverArt ) ) { CUtil::ThumbCacheAdd( strCoverArt, true ); } else { CLog::Log(LOGDEBUG, "%s unable to cache thumb as %s", __FUNCTION__, strCoverArt.c_str()); CUtil::ThumbCacheAdd( strCoverArt, false ); } } delete[] m_thumbData; } if (m_isCompilation) { // iTunes compilation flag is set - this could be a various artists file if (tag.GetAlbumArtist().IsEmpty()) tag.SetAlbumArtist(g_localizeStrings.Get(340)); // Various Artists } // Close the file.. m_file.Close(); // Return to caller return true; } catch (...) { CLog::Log(LOGERROR, "Tag loader mp4: exception in file %s", strFileName.c_str()); } // Something must have gone wrong for us to get here, so let's report our failure to the boss.. tag.SetLoaded(false); return false; }
bool CPVRManager::UpdateItem(CFileItem& item) { /* Don't update if a recording is played */ if (item.IsPVRRecording()) return false; if (!item.IsPVRChannel()) { CLog::Log(LOGERROR, "CPVRManager - %s - no channel tag provided", __FUNCTION__); return false; } CSingleLock lock(m_critSection); if (!m_currentFile || *m_currentFile->GetPVRChannelInfoTag() == *item.GetPVRChannelInfoTag()) return false; g_application.CurrentFileItem() = *m_currentFile; g_infoManager.SetCurrentItem(*m_currentFile); CPVRChannel* channelTag = item.GetPVRChannelInfoTag(); CEpgInfoTag epgTagNow; bool bHasTagNow = channelTag->GetEPGNow(epgTagNow); if (channelTag->IsRadio()) { CMusicInfoTag* musictag = item.GetMusicInfoTag(); if (musictag) { musictag->SetTitle(bHasTagNow ? epgTagNow.Title() : g_guiSettings.GetBool("epg.hidenoinfoavailable") ? StringUtils::EmptyString : g_localizeStrings.Get(19055)); // no information available if (bHasTagNow) musictag->SetGenre(epgTagNow.Genre()); musictag->SetDuration(bHasTagNow ? epgTagNow.GetDuration() : 3600); musictag->SetURL(channelTag->Path()); musictag->SetArtist(channelTag->ChannelName()); musictag->SetAlbumArtist(channelTag->ChannelName()); musictag->SetLoaded(true); musictag->SetComment(StringUtils::EmptyString); musictag->SetLyrics(StringUtils::EmptyString); } } else { CVideoInfoTag *videotag = item.GetVideoInfoTag(); if (videotag) { videotag->m_strTitle = bHasTagNow ? epgTagNow.Title() : g_guiSettings.GetBool("epg.hidenoinfoavailable") ? StringUtils::EmptyString : g_localizeStrings.Get(19055); // no information available if (bHasTagNow) videotag->m_genre = epgTagNow.Genre(); videotag->m_strPath = channelTag->Path(); videotag->m_strFileNameAndPath = channelTag->Path(); videotag->m_strPlot = bHasTagNow ? epgTagNow.Plot() : StringUtils::EmptyString; videotag->m_strPlotOutline = bHasTagNow ? epgTagNow.PlotOutline() : StringUtils::EmptyString; videotag->m_iEpisode = bHasTagNow ? epgTagNow.EpisodeNum() : 0; } } return false; }
bool CMusicInfoTagLoaderCDDA::Load(const std::string& strFileName, CMusicInfoTag& tag, EmbeddedArt *art) { #ifdef HAS_DVD_DRIVE try { tag.SetURL(strFileName); bool bResult = false; // Get information for the inserted disc CCdInfo* pCdInfo = g_mediaManager.GetCdInfo(); if (pCdInfo == NULL) return bResult; // Prepare cddb Xcddb cddb; cddb.setCacheDir(CProfilesManager::GetInstance().GetCDDBFolder()); int iTrack = atoi(strFileName.substr(13, strFileName.size() - 13 - 5).c_str()); // duration is always available tag.SetDuration( ( pCdInfo->GetTrackInformation(iTrack).nMins * 60 ) + pCdInfo->GetTrackInformation(iTrack).nSecs ); // Only load cached cddb info in this tag loader, the internet database query is made in CCDDADirectory if (pCdInfo->HasCDDBInfo() && cddb.isCDCached(pCdInfo)) { // get cddb information if (cddb.queryCDinfo(pCdInfo)) { // Fill the fileitems music tag with cddb information, if available std::string strTitle = cddb.getTrackTitle(iTrack); if (!strTitle.empty()) { // Tracknumber tag.SetTrackNumber(iTrack); // Title tag.SetTitle(strTitle); // Artist: Use track artist or disc artist std::string strArtist = cddb.getTrackArtist(iTrack); if (strArtist.empty()) cddb.getDiskArtist(strArtist); tag.SetArtist(strArtist); // Album std::string strAlbum; cddb.getDiskTitle( strAlbum ); tag.SetAlbum(strAlbum); // Album Artist std::string strAlbumArtist; cddb.getDiskArtist(strAlbumArtist); tag.SetAlbumArtist(strAlbumArtist); // Year SYSTEMTIME dateTime; dateTime.wYear = atoi(cddb.getYear().c_str()); tag.SetReleaseDate( dateTime ); // Genre tag.SetGenre( cddb.getGenre() ); tag.SetLoaded(true); bResult = true; } } } else { // No cddb info, maybe we have CD-Text trackinfo ti = pCdInfo->GetTrackInformation(iTrack); // Fill the fileitems music tag with CD-Text information, if available std::string strTitle = ti.cdtext[CDTEXT_TITLE]; if (!strTitle.empty()) { // Tracknumber tag.SetTrackNumber(iTrack); // Title tag.SetTitle(strTitle); // Get info for track zero, as we may have and need CD-Text Album info xbmc_cdtext_t discCDText = pCdInfo->GetDiscCDTextInformation(); // Artist: Use track artist or disc artist std::string strArtist = ti.cdtext[CDTEXT_PERFORMER]; if (strArtist.empty()) strArtist = discCDText[CDTEXT_PERFORMER]; tag.SetArtist(strArtist); // Album std::string strAlbum; strAlbum = discCDText[CDTEXT_TITLE]; tag.SetAlbum(strAlbum); // Genre: use track or disc genre std::string strGenre = ti.cdtext[CDTEXT_GENRE]; if (strGenre.empty()) strGenre = discCDText[CDTEXT_GENRE]; tag.SetGenre( strGenre ); tag.SetLoaded(true); bResult = true; } } return bResult; } catch (...) { CLog::Log(LOGERROR, "Tag loader CDDB: exception in file %s", strFileName.c_str()); } #endif tag.SetLoaded(false); return false; }
void CMusicInfoTagLoaderWMA::SetTagValueString(const CStdString& strFrameName, const CStdString& strValue, CMusicInfoTag& tag) { if (strFrameName == "WM/AlbumTitle") { tag.SetAlbum(strValue); } else if (strFrameName == "WM/AlbumArtist") { if (tag.GetAlbumArtist().IsEmpty()) tag.SetAlbumArtist(strValue); } else if (strFrameName == "Author") { // Multiple artists are stored in multiple "Author" tags we have get them // separatly and merge them to our system if (tag.GetArtist().IsEmpty()) tag.SetArtist(strValue); else tag.SetArtist(tag.GetArtist() + g_advancedSettings.m_musicItemSeparator + strValue); } else if (strFrameName == "WM/TrackNumber") { if (tag.GetTrackNumber() <= 0) tag.SetTrackNumber(atoi(strValue.c_str())); } else if (strFrameName == "WM/PartOfSet") { tag.SetPartOfSet(atoi(strValue.c_str())); } //else if (strFrameName=="WM/Track") // Old Tracknumber, should not be used anymore else if (strFrameName == "WM/Year") { SYSTEMTIME dateTime; dateTime.wYear = atoi(strValue.c_str()); tag.SetReleaseDate(dateTime); } else if (strFrameName == "WM/Genre") { // Multiple genres are stared in multiple "WM/Genre" tags we have to get them // separatly and merge them to our system if (tag.GetGenre().IsEmpty()) tag.SetGenre(strValue); else tag.SetGenre(tag.GetGenre() + g_advancedSettings.m_musicItemSeparator + strValue); } else if (strFrameName == "WM/Lyrics") { tag.SetLyrics(strValue); } //else if (strFrameName=="WM/DRM") //{ // // File is DRM protected // pwszValue; //} //else if (strFrameName=="WM/Codec") //{ // pwszValue; //} //else if (strFrameName=="WM/BeatsPerMinute") //{ // pwszValue; //} //else if (strFrameName=="WM/Mood") //{ // pwszValue; //} //else if (strFrameName=="WM/RadioStationName") //{ // pwszValue; //} //else if (strFrameName=="WM/RadioStationOwner") //{ // pwszValue; //} }
bool CPVRManager::UpdateItem(CFileItem& item) { /* Don't update if a recording is played */ if (item.IsPVRRecording()) return false; if (!item.IsPVRChannel()) { CLog::Log(LOGERROR, "CPVRManager - %s - no channel tag provided", __FUNCTION__); return false; } CSingleLock lock(m_critSection); if (!m_currentFile || *m_currentFile->GetPVRChannelInfoTag() == *item.GetPVRChannelInfoTag()) return false; g_application.SetCurrentFileItem(*m_currentFile); CFileItemPtr itemptr(new CFileItem(*m_currentFile)); g_infoManager.SetCurrentItem(itemptr); CPVRChannelPtr channelTag(item.GetPVRChannelInfoTag()); CEpgInfoTagPtr epgTagNow(channelTag->GetEPGNow()); if (channelTag->IsRadio()) { CMusicInfoTag* musictag = item.GetMusicInfoTag(); if (musictag) { musictag->SetTitle(epgTagNow ? epgTagNow->Title() : CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? "" : g_localizeStrings.Get(19055)); // no information available if (epgTagNow) musictag->SetGenre(epgTagNow->Genre()); musictag->SetDuration(epgTagNow ? epgTagNow->GetDuration() : 3600); musictag->SetURL(channelTag->Path()); musictag->SetArtist(channelTag->ChannelName()); musictag->SetAlbumArtist(channelTag->ChannelName()); musictag->SetLoaded(true); musictag->SetComment(""); musictag->SetLyrics(""); } } else { CVideoInfoTag *videotag = item.GetVideoInfoTag(); if (videotag) { videotag->m_strTitle = epgTagNow ? epgTagNow->Title() : CSettings::GetInstance().GetBool(CSettings::SETTING_EPG_HIDENOINFOAVAILABLE) ? "" : g_localizeStrings.Get(19055); // no information available if (epgTagNow) videotag->m_genre = epgTagNow->Genre(); videotag->m_strPath = channelTag->Path(); videotag->m_strFileNameAndPath = channelTag->Path(); videotag->m_strPlot = epgTagNow ? epgTagNow->Plot() : ""; videotag->m_strPlotOutline = epgTagNow ? epgTagNow->PlotOutline() : ""; videotag->m_iEpisode = epgTagNow ? epgTagNow->EpisodeNumber() : 0; } } return false; }
void CMusicInfoTagLoaderMP4::ParseTag( unsigned int metaKey, const char* pMetaData, int metaSize, CMusicInfoTag& tag, EmbeddedArt *art) { switch ( metaKey ) { case g_TitleAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; // we use utf8 internally tag.SetLoaded( true ); tag.SetTitle( dataWorkspace.get() ); break; } case g_ArtistAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetArtist( dataWorkspace.get() ); break; } case g_AlbumAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetAlbum( dataWorkspace.get() ); break; } case g_AlbumArtistAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetAlbumArtist( dataWorkspace.get() ); break; } case g_DayAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; SYSTEMTIME dateTime; dateTime.wYear = atoi( dataWorkspace.get() ); tag.SetReleaseDate( dateTime ); break; } case g_GenreAtomName: { // When a genre number is specified, we need to translate to a string for display.. // Note that AAC/iTunes genre numbers are the same as ID3 numbers, but are offset by 1. const char* pGenre = ID3_V1GENRE2DESCRIPTION( (unsigned char)pMetaData[ 1 ] - 1 ); if ( pGenre ) { tag.SetGenre( pGenre ); } break; } case g_CompilationAtomName: { if (metaSize == 1) tag.SetCompilation(*pMetaData == 1); break; } case g_CommentAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetComment( dataWorkspace.get() ); break; } case g_LyricsAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetLyrics( dataWorkspace.get() ); break; } case g_CustomGenreAtomName: { // We need to zero-terminate the string, which needs workspace.. auto_aptr<char> dataWorkspace( new char[ metaSize + 1 ] ); memcpy( dataWorkspace.get(), pMetaData, metaSize ); dataWorkspace[ metaSize ] = '\0'; tag.SetGenre( dataWorkspace.get() ); break; } case g_TrackNumberAtomName: { tag.SetTrackNumber( (unsigned char)pMetaData[ 3 ] ); break; } case g_DiscNumberAtomName: { tag.SetPartOfSet( (unsigned char)pMetaData[ 3 ] ); break; } case g_CoverArtAtomName: { // This cover-art handling is pretty much what was in the old MP4 tag processing code.. // note that according to http://atomicparsley.sourceforge.net/mpeg-4files.html the type // of image (PNG=14 or JPG=13) is contained in pMetadata[-5] std::string mimeType; if (pMetaData[-5] == 13) mimeType = "image/jpeg"; else if (pMetaData[-5] == 14) mimeType = "image/png"; else CLog::Log(LOGDEBUG, "Unknown art mimetype %d", pMetaData[-5]); tag.SetCoverArtInfo(metaSize, mimeType); if (art) art->set((const uint8_t*)pMetaData, metaSize, mimeType); break; } default: break; } }