本文整理汇总了C++中CMusicInfoTag::GetArtist方法的典型用法代码示例。如果您正苦于以下问题:C++ CMusicInfoTag::GetArtist方法的具体用法?C++ CMusicInfoTag::GetArtist怎么用?C++ CMusicInfoTag::GetArtist使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CMusicInfoTag
的用法示例。
在下文中一共展示了CMusicInfoTag::GetArtist方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Ban
bool CLastFmManager::Ban(const CMusicInfoTag& musicinfotag)
{
if (!IsRadioEnabled())
{
CLog::Log(LOGERROR, "LastFmManager Ban, radio is not active");
return false;
}
if (CallXmlRpc("banTrack", musicinfotag.GetArtist(), musicinfotag.GetTitle()))
{
//we banned this track so skip to the next track
g_application.getApplicationMessenger().ExecBuiltIn("playercontrol(next)");
m_CurrentSong.IsBanned = true;
return true;
}
return false;
}
示例2: Love
bool CLastFmManager::Love(const CMusicInfoTag& musicinfotag)
{
if (!IsLastFmEnabled())
{
CLog::Log(LOGERROR, "LastFmManager Love, lastfm is not enabled.");
return false;
}
CStdString strTitle = musicinfotag.GetTitle();
CStdString strArtist = StringUtils::Join(musicinfotag.GetArtist(), g_advancedSettings.m_musicItemSeparator);
CStdString strFilePath;
if (m_CurrentSong.CurrentSong && !m_CurrentSong.CurrentSong->IsLastFM())
{
//path to update the rating for
strFilePath = m_CurrentSong.CurrentSong->GetPath();
}
if (CallXmlRpc("loveTrack",strArtist, strTitle))
{
m_CurrentSong.IsLoved = true;
//update the rating to 5, we loved it.
CMusicInfoTag newTag(musicinfotag);
newTag.SetRating('5');
CApplicationMessenger::Get().SetCurrentSongTag(newTag);
//try updating the rating in the database if it's a local file.
CMusicDatabase musicdatabase;
if (musicdatabase.Open())
{
CSong song;
//update if the song exists in our database and there is no rating yet.
if (musicdatabase.GetSongByFileName(strFilePath, song) && song.rating == '0')
{
musicdatabase.SetSongRating(strFilePath, '5');
}
musicdatabase.Close();
}
return true;
}
return false;
}
示例3: OnInfo
void CGUIWindowMusicBase::OnInfo(CFileItem *pItem, bool bShowInfo)
{
if ((pItem->IsMusicDb() && !pItem->HasMusicInfoTag()) || pItem->IsParentFolder() ||
URIUtils::IsSpecial(pItem->GetPath()) || pItem->GetPath().Left(14).Equals("musicsearch://"))
return; // nothing to do
if (!pItem->m_bIsFolder)
{ // song lookup
ShowSongInfo(pItem);
return;
}
CStdString strPath = pItem->GetPath();
// Try to find an album to lookup from the current item
CAlbum album;
CArtist artist;
bool foundAlbum = false;
album.idAlbum = -1;
// we have a folder
if (pItem->IsMusicDb())
{
CQueryParams params;
CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params);
if (params.GetAlbumId() == -1)
{ // artist lookup
artist.idArtist = params.GetArtistId();
artist.strArtist = StringUtils::Join(pItem->GetMusicInfoTag()->GetArtist(), g_advancedSettings.m_musicItemSeparator);
}
else
{ // album lookup
album.idAlbum = params.GetAlbumId();
album.strAlbum = pItem->GetMusicInfoTag()->GetAlbum();
album.artist = pItem->GetMusicInfoTag()->GetArtist();
// we're going to need it's path as well (we assume that there's only one) - this is for
// assigning thumbs to folders, and obtaining the local folder.jpg
m_musicdatabase.GetAlbumPath(album.idAlbum, strPath);
}
}
else
{ // from filemode, so find the albums in the folder
CFileItemList items;
GetDirectory(strPath, items);
// show dialog box indicating we're searching the album name
if (m_dlgProgress && bShowInfo)
{
m_dlgProgress->SetHeading(185);
m_dlgProgress->SetLine(0, 501);
m_dlgProgress->SetLine(1, "");
m_dlgProgress->SetLine(2, "");
m_dlgProgress->StartModal();
m_dlgProgress->Progress();
if (m_dlgProgress->IsCanceled())
return;
}
// check the first song we find in the folder, and grab it's album info
for (int i = 0; i < items.Size() && !foundAlbum; i++)
{
CFileItemPtr pItem = items[i];
pItem->LoadMusicTag();
if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded() &&
!pItem->GetMusicInfoTag()->GetAlbum().IsEmpty())
{
// great, have a song - use it.
CSong song(*pItem->GetMusicInfoTag());
// this function won't be needed if/when the tag has idSong information
if (!m_musicdatabase.GetAlbumFromSong(song, album))
{ // album isn't in the database - construct it from the tag info we have
CMusicInfoTag *tag = pItem->GetMusicInfoTag();
album.strAlbum = tag->GetAlbum();
album.artist = tag->GetAlbumArtist().empty() ? tag->GetArtist() : tag->GetAlbumArtist();
album.idAlbum = -1; // the -1 indicates it's not in the database
}
foundAlbum = true;
}
}
if (!foundAlbum)
{
CLog::Log(LOGINFO, "%s called on a folder containing no songs with tag info - nothing can be done", __FUNCTION__);
if (m_dlgProgress && bShowInfo)
m_dlgProgress->Close();
return;
}
if (m_dlgProgress && bShowInfo)
m_dlgProgress->Close();
}
if (album.idAlbum == -1 && foundAlbum == false)
ShowArtistInfo(artist, pItem->GetPath(), false, bShowInfo);
else
ShowAlbumInfo(album, strPath, false, bShowInfo);
}
示例4: ParseTag
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/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((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;
}
示例5: AddSong
int CScrobbler::AddSong(const CMusicInfoTag& tag)
{
if ((!g_guiSettings.GetBool("lastfm.enable") && !g_guiSettings.GetBool("lastfm.recordtoprofile")) || !g_guiSettings.GetBool("network.enableinternet"))
return 0;
if (tag.GetDuration() <= MINLENGTH || tag.GetDuration() > MAXLENGTH) // made <= to minlength to stop iTMS previews being submitted in iTunes
return 0;
if (!tag.Loaded() || tag.GetArtist().IsEmpty() || tag.GetTitle().IsEmpty())
return 0;
if(m_bSubmitInProgress)
{
StatusUpdate(S_NOT_SUBMITTING,"Previous submission still in progress");
return 0;
}
char ti[20];
struct tm *today = gmtime(&m_SongStartTime);
strftime(ti, sizeof(ti), "%Y-%m-%d %H:%M:%S", today);
CStdString a, b, t;
// our tags are stored as UTF-8, so no conversion needed
a = tag.GetArtist();
b = tag.GetAlbum();
t = tag.GetTitle();
CStdString i=ti;
CStdString m=tag.GetMusicBrainzTrackID();
CUtil::URLEncode(a);
CUtil::URLEncode(b);
CUtil::URLEncode(t);
CUtil::URLEncode(i);
CUtil::URLEncode(m);
CStdString strSubmitStr;
strSubmitStr.Format("a[%i]=%s&t[%i]=%s&b[%i]=%s&m[%i]=%s&l[%i]=%i&i[%i]=%s&", m_iSongNum, a.c_str(), m_iSongNum, t.c_str(), m_iSongNum, b.c_str(), m_iSongNum, m.c_str(), m_iSongNum, tag.GetDuration(), m_iSongNum, i.c_str());
if(m_strPostString.find(ti) != m_strPostString.npos)
{
// we have already tried to add a song at this time stamp
// I have no idea how this could happen but apparently it does so
// we stop it now
StatusUpdate(S_NOT_SUBMITTING,strSubmitStr);
StatusUpdate(S_NOT_SUBMITTING,m_strPostString);
StatusUpdate(S_NOT_SUBMITTING,"Submission error, duplicate subbmission time found");
return 3;
}
m_strPostString += strSubmitStr;
m_iSongNum++;
SaveCache(m_strPostString.c_str(), m_iSongNum);
time_t now;
time (&now);
if ((m_Interval + m_LastConnect) < now)
{
DoSubmit();
return 1;
}
else
{
CStdString strMsg;
strMsg.Format("Not submitting, caching for %i more seconds. Cache is %i entries.", (int)(m_Interval + m_LastConnect - now), m_iSongNum);
StatusUpdate(S_NOT_SUBMITTING,strMsg);
return 2;
}
}
示例6: ParseAtom
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;
}
示例7: SetTagValueBinary
void CMusicInfoTagLoaderWMA::SetTagValueBinary(const CStdString& strFrameName, const unsigned char* pValue, CMusicInfoTag& tag)
{
if (strFrameName == "WM/Picture")
{
WM_PICTURE picture;
int iPicOffset = 0;
// Picture types: http://msdn.microsoft.com/library/en-us/wmform/htm/wm_picture.asp
picture.bPictureType = (BYTE)pValue[iPicOffset];
iPicOffset += 1;
picture.dwDataLen = (DWORD)pValue[iPicOffset] + (pValue[iPicOffset + 1] * 0x100) + (pValue[iPicOffset + 2] * 0x10000);
iPicOffset += 4;
CStdStringW wString;
CStdString16 utf16String = (uint16_t*)(pValue+iPicOffset);
g_charsetConverter.utf16LEtoW(utf16String, wString);
g_charsetConverter.wToUTF8(wString, picture.pwszMIMEType);
iPicOffset += (wString.length() * 2);
iPicOffset += 2;
utf16String = (uint16_t*)(pValue+iPicOffset);
g_charsetConverter.utf16LEtoW(utf16String, picture.pwszDescription);
iPicOffset += (picture.pwszDescription.length() * 2);
iPicOffset += 2;
picture.pbData = (BYTE *)(pValue + iPicOffset);
// many wma's don't have the bPictureType specified. For now, just take
// Cover Front (3) or Other (0) as the cover.
if (picture.bPictureType == 3 || picture.bPictureType == 0) // Cover Front
{
CStdString strExtension(picture.pwszMIMEType);
// 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 = CUtil::GetCachedAlbumThumb(tag.GetAlbum(), tag.GetAlbumArtist().IsEmpty() ? tag.GetArtist() : tag.GetAlbumArtist());
else
strCoverArt = CUtil::GetCachedMusicThumb(tag.GetURL());
if (!CUtil::ThumbExists(strCoverArt))
{
int nPos = strExtension.Find('/');
if (nPos > -1)
strExtension.Delete(0, nPos + 1);
if (picture.pbData != NULL && picture.dwDataLen > 0)
{
if (CPicture::CreateThumbnailFromMemory(picture.pbData, picture.dwDataLen, strExtension, strCoverArt))
{
CUtil::ThumbCacheAdd(strCoverArt, true);
}
else
{
CUtil::ThumbCacheAdd(strCoverArt, false);
CLog::Log(LOGERROR, "Tag loader wma: "
"Unable to create album art for %s "
"(extension=%s, size=%u)",
tag.GetURL().c_str(), strExtension.c_str(),
picture.dwDataLen);
}
}
}
}
}
}
示例8: SetTagValueString
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;
//}
}
示例9: Load
//.........这里部分代码省略.........
{
char* szTitle = reg.GetReplaceString("\\1");
char* szArtist = reg.GetReplaceString("\\2");
char* szMins = NULL;
char* szSecs = NULL;
CRegExp reg2;
reg2.RegComp("(.*) \\(([0-9]*):([0-9]*)\\)");
if (reg2.RegFind(szTitle) > -1)
{
szMins = reg2.GetReplaceString("\\2");
szSecs = reg2.GetReplaceString("\\3");
char* szTemp = reg2.GetReplaceString("\\1");
free(szTitle);
szTitle = szTemp;
}
tag.SetLoaded(true);
tag.SetURL(strFileToLoad);
tag.SetTrackNumber(iTrack);
if (szMins && szSecs)
tag.SetDuration(atoi(szMins)*60+atoi(szSecs));
tag.SetTitle(szTitle);
tag.SetArtist(szArtist);
if( szTitle )
free(szTitle);
if( szArtist )
free(szArtist);
if( szMins )
free(szMins);
if( szSecs )
free(szSecs);
}
}
sprintf(temp,"%s\\%s",g_settings.GetDatabaseFolder().c_str(),"sidlist.csv"); // changeme?
std::ifstream f2(temp);
if( !f2.good() ) {
CLog::Log(LOGINFO,"MusicInfoTagLoaderSid::Load(..) unable to locate sidlist.csv");
tag.SetLoaded(false);
return( false );
}
while( !f2.eof() ) {
f2.getline(temp,8191);
CStdString strTemp(temp);
strTemp.MakeLower();
unsigned int iFind = strTemp.find(strHVSCpath);
if (iFind == string::npos)
continue;
char temp2[1024];
char temp3[1024];
strncpy(temp3,temp+iFind,strlen(strHVSCpath));
temp3[strlen(strHVSCpath)] = '\0';
sprintf(temp2,"\"%s\",\"[^\"]*\",\"[^\"]*\",\"([^\"]*)\",\"([^\"]*)\",\"([0-9]*)[^\"]*\",\"[0-9]*\",\"[0-9]*\",\"",temp3);
for (int i=0;i<iTrack-1;++i)
strcat(temp2,"[0-9]*:[0-9]* ");
strcat(temp2,"([0-9]*):([0-9]*)");
if( !reg.RegComp(temp2) )
{
CLog::Log(LOGINFO,"MusicInfoTagLoaderSid::Load(..): failed to compile regular expression");
tag.SetLoaded(false);
return( false );
}
if( reg.RegFind(temp) >= 0 ) {
char* szTitle = reg.GetReplaceString("\\1");
char* szArtist = reg.GetReplaceString("\\2");
char* szYear = reg.GetReplaceString("\\3");
char* szMins = reg.GetReplaceString("\\4");
char* szSecs = reg.GetReplaceString("\\5");
tag.SetLoaded(true);
tag.SetTrackNumber(iTrack);
if (tag.GetDuration() == 0)
tag.SetDuration(atoi(szMins)*60+atoi(szSecs));
if (tag.GetTitle() == "")
tag.SetTitle(szTitle);
if (tag.GetArtist() == "")
tag.SetArtist(szArtist);
SYSTEMTIME dateTime;
dateTime.wYear = atoi(szYear);
tag.SetReleaseDate(dateTime);
if( szTitle )
free(szTitle);
if( szArtist )
free(szArtist);
if( szYear )
free(szYear);
if( szMins )
free(szMins);
if( szSecs )
free(szSecs);
f2.close();
return( true );
}
}
f2.close();
tag.SetLoaded(false);
return( false );
}
示例10: Load
//.........这里部分代码省略.........
else if (strExtension == "mpc")
file = mpcFile = new MPC::File(stream);
else if (strExtension == "mp3" || strExtension == "aac")
file = mpegFile = new MPEG::File(stream, ID3v2::FrameFactory::instance());
else if (strExtension == "s3m")
file = s3mFile = new S3M::File(stream);
else if (strExtension == "tta")
file = ttaFile = new TrueAudio::File(stream, ID3v2::FrameFactory::instance());
else if (strExtension == "wv")
file = wvFile = new WavPack::File(stream);
else if (strExtension == "xm")
file = xmFile = new XM::File(stream);
else if (strExtension == "ogg")
file = oggVorbisFile = new Ogg::Vorbis::File(stream);
else if (strExtension == "oga") // Leave this madness until last - oga container can have Vorbis or FLAC
{
file = oggFlacFile = new Ogg::FLAC::File(stream);
if (!file || !file->isValid())
{
delete file;
file = oggVorbisFile = new Ogg::Vorbis::File(stream);
}
}
if (!file || !file->isOpen())
{
delete file;
delete stream;
CLog::Log(LOGDEBUG, "file could not be opened for tag reading");
return false;
}
APE::Tag *ape = NULL;
ASF::Tag *asf = NULL;
MP4::Tag *mp4 = NULL;
ID3v2::Tag *id3v2 = NULL;
Ogg::XiphComment *xiph = NULL;
Tag *generic = NULL;
if (apeFile)
ape = apeFile->APETag(false);
else if (asfFile)
asf = asfFile->tag();
else if (flacFile)
{
xiph = flacFile->xiphComment(false);
id3v2 = flacFile->ID3v2Tag(false);
}
else if (mp4File)
mp4 = mp4File->tag();
else if (mpegFile)
{
id3v2 = mpegFile->ID3v2Tag(false);
ape = mpegFile->APETag(false);
}
else if (oggFlacFile)
xiph = dynamic_cast<Ogg::XiphComment *>(oggFlacFile->tag());
else if (oggVorbisFile)
xiph = dynamic_cast<Ogg::XiphComment *>(oggVorbisFile->tag());
else if (ttaFile)
id3v2 = ttaFile->ID3v2Tag(false);
else if (wvFile)
ape = wvFile->APETag(false);
else // This is a catch all to get generic information for other files types (s3m, xm, it, mod, etc)
generic = file->tag();
if (file->audioProperties())
tag.SetDuration(file->audioProperties()->length());
if (ape && !g_advancedSettings.m_prioritiseAPEv2tags)
ParseAPETag(ape, art, tag);
if (asf)
ParseASF(asf, art, tag);
else if (id3v2)
ParseID3v2Tag(id3v2, art, tag);
else if (generic)
ParseGenericTag(generic, art, tag);
else if (mp4)
ParseMP4Tag(mp4, art, tag);
else if (xiph)
ParseXiphComment(xiph, art, tag);
// art for flac files is outside the tag
if (flacFile)
SetFlacArt(flacFile, art, tag);
// Add APE tags over the top of ID3 tags if we want to prioritize them
if (ape && g_advancedSettings.m_prioritiseAPEv2tags)
ParseAPETag(ape, art, tag);
if (!tag.GetTitle().IsEmpty() || !tag.GetArtist().empty() || !tag.GetAlbum().IsEmpty())
tag.SetLoaded();
tag.SetURL(strFileName);
delete file;
delete stream;
return true;
}
示例11: OnInfo
void CGUIWindowMusicBase::OnInfo(CFileItem *pItem, bool bShowInfo)
{
if (pItem->m_bIsFolder && pItem->IsParentFolder())
return;
if (pItem->IsVideoDb())
{
OnContextButton(m_viewControl.GetSelectedItem(), CONTEXT_BUTTON_INFO); // nasty but it is the same item i promise :)
return;
}
CStdString strPath = pItem->m_strPath;
// Try to find an album to lookup from the current item
CAlbum album;
CArtist artist;
bool foundAlbum = false;
album.idAlbum = -1;
if (pItem->IsMusicDb())
{
CQueryParams params;
CDirectoryNode::GetDatabaseInfo(pItem->m_strPath, params);
if (params.GetAlbumId() == -1)
{
artist.idArtist = params.GetArtistId();
artist.strArtist = pItem->GetMusicInfoTag()->GetArtist();
}
else
{
// show dialog box indicating we're searching the album name
if (m_dlgProgress && bShowInfo)
{
m_dlgProgress->SetHeading(185);
m_dlgProgress->SetLine(0, 501);
m_dlgProgress->SetLine(1, "");
m_dlgProgress->SetLine(2, "");
m_dlgProgress->StartModal();
m_dlgProgress->Progress();
if (m_dlgProgress->IsCanceled())
return;
}
album.idAlbum = params.GetAlbumId();
album.strAlbum = pItem->GetMusicInfoTag()->GetAlbum();
album.strArtist = pItem->GetMusicInfoTag()->GetArtist();
// we're going to need it's path as well (we assume that there's only one) - this is for
// assigning thumbs to folders, and obtaining the local folder.jpg
m_musicdatabase.GetAlbumPath(album.idAlbum, strPath);
}
}
else
{ // lookup is done on a folder - find the albums in the folder
CFileItemList items;
GetDirectory(strPath, items);
// check the first song we find in the folder, and grab it's album info
for (int i = 0; i < items.Size() && !foundAlbum; i++)
{
CFileItem* pItem = items[i];
pItem->LoadMusicTag();
if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded() &&
!pItem->GetMusicInfoTag()->GetAlbum().IsEmpty())
{
// great, have a song - use it.
CSong song(*pItem->GetMusicInfoTag());
// this function won't be needed if/when the tag has idSong information
if (!m_musicdatabase.GetAlbumFromSong(song, album))
{ // album isn't in the database - construct it from the tag info we have
CMusicInfoTag *tag = pItem->GetMusicInfoTag();
album.strAlbum = tag->GetAlbum();
album.strArtist = tag->GetAlbumArtist().IsEmpty() ? tag->GetArtist() : tag->GetAlbumArtist();
album.idAlbum = -1; // the -1 indicates it's not in the database
}
foundAlbum = true;
}
}
if (!foundAlbum)
{
CLog::Log(LOGINFO, "%s called on a folder containing no songs with tag info - nothing can be done", __FUNCTION__);
if (m_dlgProgress && bShowInfo) m_dlgProgress->Close();
}
}
if (m_dlgProgress && bShowInfo) m_dlgProgress->Close();
if (album.idAlbum == -1 && foundAlbum == false)
ShowArtistInfo(artist, pItem->m_strPath, false, bShowInfo);
else
ShowAlbumInfo(album, strPath, false, bShowInfo);
}
示例12: OnInfo
void CGUIWindowMusicBase::OnInfo(CFileItem *pItem, bool bShowInfo)
{
// Boxee
if (bShowInfo)
{
g_application.CurrentFileItem() = *pItem;
if (pItem->IsLastFM() || pItem->IsRSS() || pItem->IsPlugin() || pItem->IsShoutCast())
{
CGUIDialogBoxeeAppCtx *pContext = (CGUIDialogBoxeeAppCtx*)g_windowManager.GetWindow(WINDOW_DIALOG_BOXEE_APP_CTX);
pContext->SetItem(*pItem);
pContext->DoModal();
}
else
{
if (pItem->HasMusicInfoTag() && !pItem->GetPropertyBOOL("IsArtist"))
{
CGUIDialogBoxeeMusicCtx *pContext = (CGUIDialogBoxeeMusicCtx*)g_windowManager.GetWindow(WINDOW_DIALOG_BOXEE_MUSIC_CTX);
pContext->SetItem(*pItem);
pContext->OnMoreInfo();
}
else
{
CGUIWindowMusicInfo* pDlgInfo = (CGUIWindowMusicInfo*)g_windowManager.GetWindow(WINDOW_MUSIC_INFO);
if (pDlgInfo)
{
*(pDlgInfo->GetCurrentListItem()) = *pItem;
pDlgInfo->DoModal();
}
}
}
return;
}
// end boxee section
if (pItem->m_bIsFolder && pItem->IsParentFolder())
return;
if (!pItem->m_bIsFolder)
{ // song lookup
ShowSongInfo(pItem);
return;
}
CStdString strPath = pItem->m_strPath;
// Try to find an album to lookup from the current item
CAlbum album;
CArtist artist;
bool foundAlbum = false;
album.idAlbum = -1;
// we have a folder
if (pItem->IsMusicDb())
{
CQueryParams params;
CDirectoryNode::GetDatabaseInfo(pItem->m_strPath, params);
if (params.GetAlbumId() == -1)
{ // artist lookup
artist.idArtist = params.GetArtistId();
artist.strArtist = pItem->GetMusicInfoTag()->GetArtist();
}
else
{ // album lookup
album.idAlbum = params.GetAlbumId();
album.strAlbum = pItem->GetMusicInfoTag()->GetAlbum();
album.strArtist = pItem->GetMusicInfoTag()->GetArtist();
// we're going to need it's path as well (we assume that there's only one) - this is for
// assigning thumbs to folders, and obtaining the local folder.jpg
m_musicdatabase.GetAlbumPath(album.idAlbum, strPath);
}
}
else
{ // from filemode, so find the albums in the folder
CFileItemList items;
GetDirectory(strPath, items);
// show dialog box indicating we're searching the album name
if (m_dlgProgress && bShowInfo)
{
m_dlgProgress->SetHeading(185);
m_dlgProgress->SetLine(0, 501);
m_dlgProgress->SetLine(1, "");
m_dlgProgress->SetLine(2, "");
m_dlgProgress->StartModal();
m_dlgProgress->Progress();
if (m_dlgProgress->IsCanceled())
return;
}
// check the first song we find in the folder, and grab it's album info
for (int i = 0; i < items.Size() && !foundAlbum; i++)
{
CFileItemPtr pItem = items[i];
pItem->LoadMusicTag();
if (pItem->HasMusicInfoTag() && pItem->GetMusicInfoTag()->Loaded() &&
!pItem->GetMusicInfoTag()->GetAlbum().IsEmpty())
{
// great, have a song - use it.
CSong song(*pItem->GetMusicInfoTag());
//.........这里部分代码省略.........