bool CGUIWindowMusicBase::ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo /* = true */) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params); ADDON::ScraperPtr scraper; if (!m_musicdatabase.GetScraper(params.GetAlbumId(), CONTENT_ALBUMS, scraper)) return false; CAlbum album; if (!m_musicdatabase.GetAlbum(params.GetAlbumId(), album)) return false; m_musicdatabase.GetAlbumPath(params.GetAlbumId(), album.strPath); bool refresh = false; while (1) { // Check if the entry should be refreshed (Only happens if a user pressed refresh) if (refresh) { if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) { //! @todo should display a dialog saying no permissions if (m_dlgProgress) m_dlgProgress->Close(); return false; } if (g_application.IsMusicScanning()) { HELPERS::ShowOKDialogText(CVariant{189}, CVariant{14057}); if (m_dlgProgress) m_dlgProgress->Close(); return false; } // show dialog box indicating we're searching the album if (m_dlgProgress && bShowInfo) { m_dlgProgress->SetHeading(CVariant{185}); m_dlgProgress->SetLine(0, CVariant{pItem->GetMusicInfoTag()->GetAlbum()}); m_dlgProgress->SetLine(1, CVariant{pItem->GetMusicInfoTag()->GetAlbumArtistString()}); m_dlgProgress->SetLine(2, CVariant{""}); m_dlgProgress->Open(); } CMusicInfoScanner scanner; if (scanner.UpdateAlbumInfo(album, scraper, bShowInfo, m_dlgProgress) != INFO_ADDED) { HELPERS::ShowOKDialogText(CVariant{185}, CVariant{500}); if (m_dlgProgress) m_dlgProgress->Close(); return false; } } if (m_dlgProgress) m_dlgProgress->Close(); CGUIDialogMusicInfo *pDlgAlbumInfo = g_windowManager.GetWindow<CGUIDialogMusicInfo>(WINDOW_DIALOG_MUSIC_INFO); if (pDlgAlbumInfo) { pDlgAlbumInfo->SetAlbum(album, album.strPath); pDlgAlbumInfo->Open(); if (pDlgAlbumInfo->NeedRefresh()) { m_musicdatabase.ClearAlbumLastScrapedTime(params.GetAlbumId()); refresh = true; continue; } else if (pDlgAlbumInfo->HasUpdatedThumb()) UpdateThumb(album, album.strPath); else if (pDlgAlbumInfo->NeedsUpdate()) Refresh(true); // update our file list } break; } if (m_dlgProgress) m_dlgProgress->Close(); return true; }
// Refresh album/artist information including art types list bool DoWork() override { CGUIDialogMusicInfo *dialog = CServiceBroker::GetGUI()->GetWindowManager(). GetWindow<CGUIDialogMusicInfo>(WINDOW_DIALOG_MUSIC_INFO); if (!dialog) return false; if (dialog->IsCancelled()) return false; CFileItemPtr m_item = dialog->GetCurrentListItem(); CMusicInfoTag& tag = *m_item->GetMusicInfoTag(); CArtist& m_artist = dialog->GetArtist(); CAlbum& m_album = dialog->GetAlbum(); CGUIDialogProgress* dlgProgress = GetProgressDialog(); CMusicDatabase database; database.Open(); if (tag.GetType() == MediaTypeArtist) { ADDON::ScraperPtr scraper; if (!database.GetScraper(m_artist.idArtist, CONTENT_ARTISTS, scraper)) return false; if (dlgProgress->IsCanceled()) return false; database.ClearArtistLastScrapedTime(m_artist.idArtist); if (dlgProgress->IsCanceled()) return false; CMusicInfoScanner scanner; if (scanner.UpdateArtistInfo(m_artist, scraper, true, dlgProgress) != CInfoScanner::INFO_ADDED) return false; else // Tell info dialog, so can show message dialog->SetScrapedInfo(true); if (dlgProgress->IsCanceled()) return false; //That changed DB and m_artist, now update dialog item with new info and art tag.SetArtist(m_artist); CMusicDatabase::SetPropertiesFromArtist(*m_item, m_artist); // Fetch artist discography as scraped from online sources, but always // include all the albums in the music library dialog->SetDiscography(database); } else { // tag.GetType == MediaTypeAlbum ADDON::ScraperPtr scraper; if (!database.GetScraper(m_album.idAlbum, CONTENT_ALBUMS, scraper)) return false; if (dlgProgress->IsCanceled()) return false; database.ClearAlbumLastScrapedTime(m_album.idAlbum); if (dlgProgress->IsCanceled()) return false; CMusicInfoScanner scanner; if (scanner.UpdateAlbumInfo(m_album, scraper, true, GetProgressDialog()) != CInfoScanner::INFO_ADDED) return false; else // Tell info dialog, so can show message dialog->SetScrapedInfo(true); if (dlgProgress->IsCanceled()) return false; //That changed DB and m_album, now update dialog item with new info and art // Album songs are unchanged by refresh (even with Musicbrainz sync?) tag.SetAlbum(m_album); CMusicDatabase::SetPropertiesFromAlbum(*m_item, m_album); // Set the list of songs and related art dialog->SetSongs(m_album.songs); } database.Close(); if (dlgProgress->IsCanceled()) return false; /* Load current art (to CGUIListItem.m_art) For albums this includes related artist(s) art and artist fanart set as fallback album fanart. Clear item art first to ensure fresh not cached/partial art */ m_item->ClearArt(); CMusicThumbLoader loader; loader.LoadItem(m_item.get()); if (dlgProgress->IsCanceled()) return false; // Fill vector of possible art types with current art, when it exists, // for display on the art type selection dialog CFileItemList artlist; MUSIC_UTILS::FillArtTypesList(*m_item, artlist); dialog->SetArtTypeList(artlist); if (dialog->IsCancelled()) return false; // Tell waiting MusicDialog that job is complete MarkFinished(); return true; }