bool CGUIDialogBoxeeShare::GetDefaultMusicShareText(CStdString& defaultMusicShareText) { CMusicInfoTag* musicInfoTag = m_item.GetMusicInfoTag(); if (!musicInfoTag || musicInfoTag->GetAlbum().IsEmpty() || musicInfoTag->GetArtist().IsEmpty()) { return false; } defaultMusicShareText += musicInfoTag->GetAlbum(); defaultMusicShareText += " by "; defaultMusicShareText += musicInfoTag->GetArtist(); return true; }
CSong::CSong(CMusicInfoTag& tag) { SYSTEMTIME stTime; tag.GetReleaseDate(stTime); strTitle = tag.GetTitle(); genre = tag.GetGenre(); strFileName = tag.GetURL(); artist = tag.GetArtist(); strAlbum = tag.GetAlbum(); albumArtist = tag.GetAlbumArtist(); strMusicBrainzTrackID = tag.GetMusicBrainzTrackID(); strMusicBrainzArtistID = tag.GetMusicBrainzArtistID(); strMusicBrainzAlbumID = tag.GetMusicBrainzAlbumID(); strMusicBrainzAlbumArtistID = tag.GetMusicBrainzAlbumArtistID(); strMusicBrainzTRMID = tag.GetMusicBrainzTRMID(); strComment = tag.GetComment(); rating = tag.GetRating(); iYear = stTime.wYear; iTrack = tag.GetTrackAndDiskNumber(); iDuration = tag.GetDuration(); bCompilation = tag.GetCompilation(); embeddedArt = tag.GetCoverArtInfo(); strThumb = ""; iStartOffset = 0; iEndOffset = 0; idSong = -1; iTimesPlayed = 0; iKaraokeNumber = 0; iKaraokeDelay = 0; //! Karaoke song lyrics-music delay in 1/10 seconds. iAlbumId = -1; }
CSong::CSong(CMusicInfoTag& tag) { SYSTEMTIME stTime; tag.GetReleaseDate(stTime); strTitle = tag.GetTitle(); strGenre = tag.GetGenre(); strFileName = tag.GetURL(); strArtist = tag.GetArtist(); strAlbum = tag.GetAlbum(); strAlbumArtist = tag.GetAlbumArtist(); strComment = tag.GetComment(); strLabel = tag.GetLabel(); // Laureon: Added getLabel strISRC = tag.GetISRC(); // Laureon: Added getISRC iVisible = 1; // Laureon: Added: Song Visibility rating = tag.GetRating(); iYear = stTime.wYear; iTrack = tag.GetTrackAndDiskNumber(); iDuration = tag.GetDuration(); strThumb = ""; iStartOffset = 0; iEndOffset = 0; idSong = -1; iTimesPlayed = 0; iKaraokeNumber = 0; iKaraokeDelay = 0; //! Karaoke song lyrics-music delay in 1/10 seconds. iArtistId = -1; iAlbumId = -1; }
TYPED_TEST(TestTagParser, ParsesBasicTag) { // Create a basic tag TypeParam *tg = &this->value_; CMusicInfoTag tag; EXPECT_TRUE(CTagLoaderTagLib::ParseTag<TypeParam>(tg, NULL, tag)); EXPECT_EQ(1985, tag.GetYear()); EXPECT_EQ(2, tag.GetTrackNumber()); EXPECT_EQ(1u, tag.GetArtist().size()); if (tag.GetArtist().size() > 0) EXPECT_EQ("artist", tag.GetArtist().front()); EXPECT_EQ("album", tag.GetAlbum()); EXPECT_EQ("comment", tag.GetComment()); EXPECT_EQ(1u, tag.GetGenre().size()); if (tag.GetGenre().size() > 0) EXPECT_EQ("Jazz", tag.GetGenre().front()); EXPECT_EQ("title", tag.GetTitle()); }
TYPED_TEST(TestTagParser, FooProperties) { TypeParam *tg = &this->value_; CMusicInfoTag tag; PropertyMap props; int tagcount = end(tags) - tags; for(int i = 0; i < tagcount; i++) { props.insert(tags[i], String("foo")); } tg->setProperties(props); EXPECT_TRUE(CTagLoaderTagLib::ParseTag<TypeParam>(tg, NULL, tag)); EXPECT_EQ(0, tag.GetYear()); EXPECT_EQ(0, tag.GetTrackNumber()); EXPECT_EQ(1u, tag.GetArtist().size()); if (tag.GetArtist().size() > 0) EXPECT_EQ("foo", tag.GetArtist().front()); EXPECT_EQ("foo", tag.GetAlbum()); EXPECT_EQ("foo", tag.GetComment()); if (tag.GetGenre().size() > 0) EXPECT_EQ("foo", tag.GetGenre().front()); EXPECT_EQ("foo", tag.GetTitle()); }
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); }
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; } }
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; }
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); } } } } } }
bool CTagLoaderTagLib::Load(const string& strFileName, CMusicInfoTag& tag, EmbeddedArt *art /* = NULL */) { CStdString strExtension; URIUtils::GetExtension(strFileName, strExtension); strExtension.ToLower(); strExtension.TrimLeft('.'); if (strExtension.IsEmpty()) return false; TagLibVFSStream* stream = new TagLibVFSStream(strFileName, true); if (!stream) { CLog::Log(LOGERROR, "could not create TagLib VFS stream for: %s", strFileName.c_str()); return false; } TagLib::File* file = NULL; TagLib::APE::File* apeFile = NULL; TagLib::ASF::File* asfFile = NULL; TagLib::FLAC::File* flacFile = NULL; TagLib::IT::File* itFile = NULL; TagLib::Mod::File* modFile = NULL; TagLib::MP4::File* mp4File = NULL; TagLib::MPC::File* mpcFile = NULL; TagLib::MPEG::File* mpegFile = NULL; TagLib::Ogg::Vorbis::File* oggVorbisFile = NULL; TagLib::Ogg::FLAC::File* oggFlacFile = NULL; TagLib::S3M::File* s3mFile = NULL; TagLib::TrueAudio::File* ttaFile = NULL; TagLib::WavPack::File* wvFile = NULL; TagLib::XM::File* xmFile = NULL; if (strExtension == "ape") file = apeFile = new APE::File(stream); else if (strExtension == "asf" || strExtension == "wmv" || strExtension == "wma") file = asfFile = new ASF::File(stream); else if (strExtension == "flac") file = flacFile = new FLAC::File(stream, ID3v2::FrameFactory::instance()); else if (strExtension == "it") file = itFile = new IT::File(stream); else if (strExtension == "mod" || strExtension == "module" || strExtension == "nst" || strExtension == "wow") file = modFile = new Mod::File(stream); else if (strExtension == "mp4" || strExtension == "m4a" || strExtension == "m4r" || strExtension == "m4b" || strExtension == "m4p" || strExtension == "3g2") file = mp4File = new MP4::File(stream); 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; }
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); }
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()); // 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(); return; } 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); }