bool CGUIWindowMusicBase::FindArtistInfo(const CStdString& strArtist, CMusicArtistInfo& artist, const SScraperInfo& info, ALLOW_SELECTION allowSelection) { // quietly return if Internet lookups are disabled if (!g_guiSettings.GetBool("network.enableinternet")) return false; // show dialog box indicating we're searching the album if (m_dlgProgress && allowSelection != SELECTION_AUTO) { m_dlgProgress->SetHeading(21889); m_dlgProgress->SetLine(0, strArtist); m_dlgProgress->SetLine(1, ""); m_dlgProgress->SetLine(2, ""); m_dlgProgress->StartModal(); } CMusicInfoScanner scanner; CStdString strPath; long idArtist = m_musicdatabase.GetArtistByName(strArtist); strPath.Format("musicdb://2/%u/",idArtist); if (!scanner.DownloadArtistInfo(strPath,strArtist,m_dlgProgress)) { // no albums found CGUIDialogOK::ShowAndGetInput(21889, 0, 20198, 0); return false; } m_musicdatabase.GetArtistInfo(idArtist,artist.GetArtist()); artist.SetLoaded(true); return true; }
bool CGUIWindowMusicBase::FindAlbumInfo(const CStdString& strAlbum, const CStdString& strArtist, CMusicAlbumInfo& album, const SScraperInfo& info, ALLOW_SELECTION allowSelection) { // quietly return if Internet lookups are disabled if (!g_guiSettings.GetBool("network.enableinternet")) return false; // show dialog box indicating we're searching the album if (m_dlgProgress && allowSelection != SELECTION_AUTO) { m_dlgProgress->SetHeading(185); m_dlgProgress->SetLine(0, strAlbum); m_dlgProgress->SetLine(1, strArtist); m_dlgProgress->SetLine(2, ""); m_dlgProgress->StartModal(); } CMusicInfoScanner scanner; CStdString strPath; CStdString strTempAlbum(strAlbum); CStdString strTempArtist(strArtist); long idAlbum = m_musicdatabase.GetAlbumByName(strAlbum,strArtist); strPath.Format("musicdb://3/%d/",idAlbum); bool bCanceled(false); bool needsRefresh(true); do { if (!scanner.DownloadAlbumInfo(strPath,strTempArtist,strTempAlbum,bCanceled,album,m_dlgProgress)) { if (m_dlgProgress && allowSelection != SELECTION_AUTO) { if (!CGUIDialogKeyboard::ShowAndGetInput(strTempAlbum, g_localizeStrings.Get(16011), false)) return false; if (!CGUIDialogKeyboard::ShowAndGetInput(strTempArtist, g_localizeStrings.Get(16025), false)) return false; } else needsRefresh = false; } else needsRefresh = false; } while (needsRefresh || bCanceled); // Read the album information from the database if we are dealing with a DB album. if (idAlbum != -1) m_musicdatabase.GetAlbumInfo(idAlbum,album.GetAlbum(),&album.GetAlbum().songs); album.SetLoaded(true); return true; }
bool CGUIWindowMusicBase::FindArtistInfo(const CStdString& strArtist, CMusicArtistInfo& artist, ALLOW_SELECTION allowSelection) { // show dialog box indicating we're searching the album if (m_dlgProgress && allowSelection != SELECTION_AUTO) { m_dlgProgress->SetHeading(21889); m_dlgProgress->SetLine(0, strArtist); m_dlgProgress->SetLine(1, ""); m_dlgProgress->SetLine(2, ""); m_dlgProgress->StartModal(); } CMusicInfoScanner scanner; CStdString strPath; CStdString strTempArtist(strArtist); long idArtist = m_musicdatabase.GetArtistByName(strArtist); strPath.Format("musicdb://2/%u/",idArtist); bool bCanceled(false); bool needsRefresh(true); do { if (!scanner.DownloadArtistInfo(strPath,strTempArtist,bCanceled,m_dlgProgress)) { if (bCanceled) return false; if (m_dlgProgress && allowSelection != SELECTION_AUTO) { if (!CGUIKeyboardFactory::ShowAndGetInput(strTempArtist, g_localizeStrings.Get(16025), false)) return false; } else needsRefresh = false; } else needsRefresh = false; } while (needsRefresh || bCanceled); if (!m_musicdatabase.GetArtistInfo(idArtist,artist.GetArtist())) return false; artist.SetLoaded(); return true; }
bool CMusicThumbLoader::FillLibraryArt(CFileItem &item) { CMusicInfoTag &tag = *item.GetMusicInfoTag(); if (tag.GetDatabaseId() > -1 && !tag.GetType().empty()) { m_database->Open(); map<string, string> artwork; if (m_database->GetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork)) item.SetArt(artwork); else if (tag.GetType() == "song") { // no art for the song, try the album if (m_database->GetArtForItem(tag.GetAlbumId(), "album", artwork)) item.SetArt(artwork); } else if (tag.GetType() == "artist") { { // Need the artist thumb/fanart which isn't grabbed during normal directory fetches CArtist artist; m_database->GetArtistInfo(tag.GetDatabaseId(), artist, false); CMusicInfoScanner scanner; artwork = scanner.GetArtistArtwork(tag.GetDatabaseId(), &artist); item.SetArt(artwork); } // add to the database for next time around map<string, string> artwork = item.GetArt(); if (!artwork.empty()) { m_database->SetArtForItem(tag.GetDatabaseId(), tag.GetType(), artwork); for (map<string, string>::iterator i = artwork.begin(); i != artwork.end(); ++i) CTextureCache::Get().BackgroundCacheImage(i->second); } else // nothing found - set an empty thumb so that next time around we don't hit here again m_database->SetArtForItem(tag.GetDatabaseId(), tag.GetType(), "thumb", ""); } if (tag.GetType() == "song" || tag.GetType() == "album") { // fanart from the artist item.SetProperty("fanart_image", m_database->GetArtistArtForItem(tag.GetDatabaseId(), tag.GetType(), "fanart")); } m_database->Close(); } return !item.GetArt().empty(); }
bool CGUIWindowMusicBase::ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo /* = true */) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params); ADDON::ScraperPtr scraper; if (!m_musicdatabase.GetScraperForPath(pItem->GetPath(), scraper, ADDON::ADDON_SCRAPER_ALBUMS)) return false; CAlbum album; if (!m_musicdatabase.GetAlbum(params.GetAlbumId(), album)) return false; m_musicdatabase.GetAlbumPath(params.GetAlbumId(), album.strPath); while (1) { if (!m_musicdatabase.HasAlbumBeenScraped(params.GetAlbumId())) { 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()) { CGUIDialogOK::ShowAndGetInput(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{StringUtils::Join(pItem->GetMusicInfoTag()->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator)}); m_dlgProgress->SetLine(2, CVariant{""}); m_dlgProgress->Open(); } CMusicInfoScanner scanner; if (scanner.UpdateDatabaseAlbumInfo(album, scraper, bShowInfo, m_dlgProgress) != INFO_ADDED) { CGUIDialogOK::ShowAndGetInput(CVariant{185}, CVariant{500}); if (m_dlgProgress) m_dlgProgress->Close(); return false; } } if (m_dlgProgress) m_dlgProgress->Close(); CGUIDialogMusicInfo *pDlgAlbumInfo = (CGUIDialogMusicInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_MUSIC_INFO); if (pDlgAlbumInfo) { pDlgAlbumInfo->SetAlbum(album, album.strPath); pDlgAlbumInfo->Open(); if (pDlgAlbumInfo->NeedRefresh()) { m_musicdatabase.ClearAlbumLastScrapedTime(params.GetAlbumId()); continue; } else if (pDlgAlbumInfo->HasUpdatedThumb()) { UpdateThumb(album, album.strPath); } } break; } if (m_dlgProgress) m_dlgProgress->Close(); return true; }
void CGUIWindowMusicBase::ShowArtistInfo(const CFileItem *pItem, bool bShowInfo /* = true */) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params); ADDON::ScraperPtr scraper; if (!m_musicdatabase.GetScraperForPath(pItem->GetPath(), scraper, ADDON::ADDON_SCRAPER_ARTISTS)) return; CArtist artist; if (!m_musicdatabase.GetArtist(params.GetArtistId(), artist)) return; m_musicdatabase.GetArtistPath(params.GetArtistId(), artist.strPath); while (1) { // Check if we have the information in the database first if (!m_musicdatabase.HasArtistBeenScraped(params.GetArtistId())) { if (!CProfilesManager::GetInstance().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) break; // should display a dialog saying no permissions if (g_application.IsMusicScanning()) { CGUIDialogOK::ShowAndGetInput(CVariant{189}, CVariant{14057}); break; } // show dialog box indicating we're searching the album if (m_dlgProgress && bShowInfo) { m_dlgProgress->SetHeading(CVariant{21889}); m_dlgProgress->SetLine(0, CVariant{pItem->GetMusicInfoTag()->GetArtist()}); m_dlgProgress->SetLine(1, CVariant{""}); m_dlgProgress->SetLine(2, CVariant{""}); m_dlgProgress->Open(); } CMusicInfoScanner scanner; if (scanner.UpdateDatabaseArtistInfo(artist, scraper, bShowInfo, m_dlgProgress) != INFO_ADDED) { CGUIDialogOK::ShowAndGetInput(CVariant{21889}, CVariant{20199}); break; } } if (m_dlgProgress) m_dlgProgress->Close(); CGUIDialogMusicInfo *pDlgArtistInfo = (CGUIDialogMusicInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_MUSIC_INFO); if (pDlgArtistInfo) { pDlgArtistInfo->SetArtist(artist, artist.strPath); pDlgArtistInfo->Open(); if (pDlgArtistInfo->NeedRefresh()) { m_musicdatabase.ClearArtistLastScrapedTime(params.GetArtistId()); continue; } else if (pDlgArtistInfo->HasUpdatedThumb()) { Update(m_vecItems->GetPath()); } } break; } if (m_dlgProgress) m_dlgProgress->Close(); }
bool CGUIWindowMusicBase::ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo /* = true */) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params); ADDON::ScraperPtr scraper; if (!m_musicdatabase.GetScraperForPath(pItem->GetPath(), scraper, ADDON::ADDON_SCRAPER_ALBUMS)) return false; CAlbum album; if (!m_musicdatabase.GetAlbum(params.GetAlbumId(), album)) return false; album.bScrapedMBID = m_musicdatabase.HasScrapedAlbumMBID(album.idAlbum); 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()) { CGUIDialogOK::ShowAndGetInput(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.UpdateDatabaseAlbumInfo(album, scraper, bShowInfo, m_dlgProgress) != INFO_ADDED) { CGUIDialogOK::ShowAndGetInput(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; }
bool CGUIWindowMusicBase::ShowAlbumInfo(const CFileItem *pItem, bool bShowInfo /* = true */) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params); CMusicAlbumInfo albumInfo; while (1) { if (!m_musicdatabase.HasAlbumInfo(params.GetAlbumId()) || !m_musicdatabase.GetAlbumInfo(params.GetAlbumId(), albumInfo.GetAlbum(), &albumInfo.GetAlbum().songs)) { if (!CProfilesManager::Get().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()) { CGUIDialogOK::ShowAndGetInput(189, 14057, 0, 0); if (m_dlgProgress) m_dlgProgress->Close(); return false; } // show dialog box indicating we're searching the album if (m_dlgProgress && bShowInfo) { m_dlgProgress->SetHeading(185); m_dlgProgress->SetLine(0, pItem->GetMusicInfoTag()->GetAlbum()); m_dlgProgress->SetLine(1, StringUtils::Join(pItem->GetMusicInfoTag()->GetAlbumArtist(), g_advancedSettings.m_musicItemSeparator)); m_dlgProgress->SetLine(2, ""); m_dlgProgress->StartModal(); } CMusicInfoScanner scanner; if (scanner.UpdateDatabaseAlbumInfo(pItem->GetPath(), albumInfo, bShowInfo) != INFO_ADDED || !albumInfo.Loaded()) { CGUIDialogOK::ShowAndGetInput(185, 0, 500, 0); if (m_dlgProgress) m_dlgProgress->Close(); return false; } } if (m_dlgProgress) m_dlgProgress->Close(); CGUIDialogMusicInfo *pDlgAlbumInfo = (CGUIDialogMusicInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_MUSIC_INFO); if (pDlgAlbumInfo) { CStdString strPath; m_musicdatabase.GetAlbumPath(params.GetAlbumId(), strPath); pDlgAlbumInfo->SetAlbum(albumInfo.GetAlbum(), strPath); pDlgAlbumInfo->DoModal(); if (pDlgAlbumInfo->NeedRefresh()) { m_musicdatabase.DeleteAlbumInfo(params.GetAlbumId()); continue; } else if (pDlgAlbumInfo->HasUpdatedThumb()) { UpdateThumb(albumInfo.GetAlbum(), strPath); } } break; } if (m_dlgProgress) m_dlgProgress->Close(); return true; }
void CGUIWindowMusicBase::ShowArtistInfo(const CFileItem *pItem, bool bShowInfo /* = true */) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params); CMusicArtistInfo artistInfo; while (1) { // Check if we have the information in the database first if (!m_musicdatabase.HasArtistInfo(params.GetArtistId()) || !m_musicdatabase.GetArtistInfo(params.GetArtistId(), artistInfo.GetArtist())) { if (!CProfilesManager::Get().GetCurrentProfile().canWriteDatabases() && !g_passwordManager.bMasterUser) break; // should display a dialog saying no permissions if (g_application.IsMusicScanning()) { CGUIDialogOK::ShowAndGetInput(189, 14057, 0, 0); break; } // show dialog box indicating we're searching the album if (m_dlgProgress && bShowInfo) { m_dlgProgress->SetHeading(21889); m_dlgProgress->SetLine(0, pItem->GetMusicInfoTag()->GetArtist()); m_dlgProgress->SetLine(1, ""); m_dlgProgress->SetLine(2, ""); m_dlgProgress->StartModal(); } CMusicInfoScanner scanner; if (scanner.UpdateDatabaseArtistInfo(pItem->GetPath(), artistInfo, bShowInfo) != INFO_ADDED || !artistInfo.Loaded()) { CGUIDialogOK::ShowAndGetInput(21889, 0, 20199, 0); break; } } if (m_dlgProgress) m_dlgProgress->Close(); CGUIDialogMusicInfo *pDlgArtistInfo = (CGUIDialogMusicInfo*)g_windowManager.GetWindow(WINDOW_DIALOG_MUSIC_INFO); if (pDlgArtistInfo) { CStdString strPath; m_musicdatabase.GetArtistPath(params.GetArtistId(), strPath); pDlgArtistInfo->SetArtist(artistInfo.GetArtist(), strPath); pDlgArtistInfo->DoModal(); if (pDlgArtistInfo->NeedRefresh()) { m_musicdatabase.DeleteArtistInfo(params.GetArtistId()); continue; } else if (pDlgArtistInfo->HasUpdatedThumb()) { Update(m_vecItems->GetPath()); } } break; } if (m_dlgProgress) m_dlgProgress->Close(); }
void CGUIWindowMusicBase::ShowArtistInfo(const CFileItem *pItem, bool bShowInfo /* = true */) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(pItem->GetPath(), params); ADDON::ScraperPtr scraper; if (!m_musicdatabase.GetScraper(params.GetArtistId(), CONTENT_ARTISTS, scraper)) return; CArtist artist; if (!m_musicdatabase.GetArtist(params.GetArtistId(), artist)) return; // Get the *name* of the folder for this artist within the Artist Info folder (may not exist). // If there is no Artist Info folder specififed in settings this will be blank bool artistpathfound = m_musicdatabase.GetArtistPath(artist, artist.strPath); // Set up path for *item folder when browsing for art, by default this is in the Artist Info Folder std::string artistItemPath = artist.strPath; if (!artistpathfound || !CDirectory::Exists(artist.strPath)) // Fall back local to music files (historic location for those album artists with a unique folder) // although there may not be such a unique folder for the arist if (!m_musicdatabase.GetOldArtistPath(artist.idArtist, artistItemPath)) // Fall back further to browse the Artist Info Folder itself artistItemPath = CServiceBroker::GetSettings().GetString(CSettings::SETTING_MUSICLIBRARY_ARTISTSFOLDER); 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) break; // should display a dialog saying no permissions if (g_application.IsMusicScanning()) { HELPERS::ShowOKDialogText(CVariant{189}, CVariant{14057}); break; } // show dialog box indicating we're searching the album if (m_dlgProgress && bShowInfo) { m_dlgProgress->SetHeading(CVariant{21889}); m_dlgProgress->SetLine(0, CVariant{pItem->GetMusicInfoTag()->GetArtist()}); m_dlgProgress->SetLine(1, CVariant{""}); m_dlgProgress->SetLine(2, CVariant{""}); m_dlgProgress->Open(); } CMusicInfoScanner scanner; if (scanner.UpdateArtistInfo(artist, scraper, bShowInfo, m_dlgProgress) != INFO_ADDED) { HELPERS::ShowOKDialogText(CVariant{21889}, CVariant{20199}); break; } } if (m_dlgProgress) m_dlgProgress->Close(); CGUIDialogMusicInfo *pDlgArtistInfo = g_windowManager.GetWindow<CGUIDialogMusicInfo>(WINDOW_DIALOG_MUSIC_INFO); if (pDlgArtistInfo) { pDlgArtistInfo->SetArtist(artist, artistItemPath); pDlgArtistInfo->Open(); if (pDlgArtistInfo->NeedRefresh()) { m_musicdatabase.ClearArtistLastScrapedTime(params.GetArtistId()); refresh = true; continue; } else if (pDlgArtistInfo->HasUpdatedThumb()) { Update(m_vecItems->GetPath()); } } break; } if (m_dlgProgress) m_dlgProgress->Close(); }
// 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; }