bool CFileOperationJob::DoWork() { FileOperationList ops; double totalTime = 0.0; if (m_displayProgress && GetProgressDialog() == NULL) { CGUIDialogExtendedProgressBar* dialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); SetProgressBar(dialog->GetHandle(GetActionString(m_action))); } bool success = DoProcess(m_action, m_items, m_strDestFile, ops, totalTime); unsigned int size = ops.size(); double opWeight = 100.0 / totalTime; double current = 0.0; for (unsigned int i = 0; i < size && success; i++) success &= ops[i].ExecuteOperation(this, current, opWeight); MarkFinished(); return success; }
void CEpgContainer::ShowProgressDialog(bool bUpdating /* = true */) { if (!m_progressHandle) { CGUIDialogExtendedProgressBar *progressDialog = (CGUIDialogExtendedProgressBar *)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); if (progressDialog) m_progressHandle = progressDialog->GetHandle(bUpdating ? g_localizeStrings.Get(19004) : g_localizeStrings.Get(19250)); } }
void CPVRManager::ShowProgressDialog(const CStdString &strText, int iProgress) { if (!m_progressHandle) { CGUIDialogExtendedProgressBar *loadingProgressDialog = (CGUIDialogExtendedProgressBar *)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); m_progressHandle = loadingProgressDialog->GetHandle(g_localizeStrings.Get(19235)); // PVR manager is starting up } m_progressHandle->SetPercentage((float)iProgress); m_progressHandle->SetText(strText); }
void CGUIWindowPVRBase::ShowProgressDialog(const std::string &strText, int iProgress) { if (!m_progressHandle) { CGUIDialogExtendedProgressBar *loadingProgressDialog = dynamic_cast<CGUIDialogExtendedProgressBar *>(g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS)); if (!loadingProgressDialog) { CLog::Log(LOGERROR, "CGUIWindowPVRBase - %s - unable to get WINDOW_DIALOG_EXT_PROGRESS!", __FUNCTION__); return; } m_progressHandle = loadingProgressDialog->GetHandle(g_localizeStrings.Get(19235)); // PVR manager is starting up } m_progressHandle->SetPercentage(static_cast<float>(iProgress)); m_progressHandle->SetText(strText); }
void DialogProgressBG::create(const String& heading, const String& message) throw (WindowException) { DelayedCallGuard dcguard(languageHook); CGUIDialogExtendedProgressBar* pDialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); if (pDialog == NULL) throw WindowException("Error: Window is NULL, this is not possible :-)"); CGUIDialogProgressBarHandle* pHandle = pDialog->GetHandle(heading); dlg = pDialog; handle = pHandle; pHandle->SetTitle(heading); if (!message.empty()) pHandle->SetText(message); }
void CMusicInfoScanner::Process() { ANNOUNCEMENT::CAnnouncementManager::Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanStarted"); try { unsigned int tick = XbmcThreads::SystemClockMillis(); m_musicDatabase.Open(); if (m_showDialog && !g_guiSettings.GetBool("musiclibrary.backgroundupdate")) { CGUIDialogExtendedProgressBar* dialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); m_handle = dialog->GetHandle(g_localizeStrings.Get(314)); } m_bCanInterrupt = true; if (m_scanType == 0) // load info from files { CLog::Log(LOGDEBUG, "%s - Starting scan", __FUNCTION__); if (m_handle) m_handle->SetTitle(g_localizeStrings.Get(505)); // Reset progress vars m_currentItem=0; m_itemCount=-1; // Create the thread to count all files to be scanned SetPriority( GetMinPriority() ); CThread fileCountReader(this, "CMusicInfoScanner"); if (m_handle) fileCountReader.Create(); // Database operations should not be canceled // using Interupt() while scanning as it could // result in unexpected behaviour. m_bCanInterrupt = false; m_needsCleanup = false; bool commit = false; bool cancelled = false; while (!cancelled && m_pathsToScan.size()) { /* * A copy of the directory path is used because the path supplied is * immediately removed from the m_pathsToScan set in DoScan(). If the * reference points to the entry in the set a null reference error * occurs. */ CStdString directory = *m_pathsToScan.begin(); if (!DoScan(directory)) cancelled = true; commit = !cancelled; } if (commit) { g_infoManager.ResetLibraryBools(); if (m_needsCleanup) { if (m_handle) { m_handle->SetTitle(g_localizeStrings.Get(700)); m_handle->SetText(""); } m_musicDatabase.CleanupOrphanedItems(); if (m_handle) m_handle->SetTitle(g_localizeStrings.Get(331)); m_musicDatabase.Compress(false); } } fileCountReader.StopThread(); m_musicDatabase.EmptyCache(); m_musicDatabase.Close(); CLog::Log(LOGDEBUG, "%s - Finished scan", __FUNCTION__); tick = XbmcThreads::SystemClockMillis() - tick; CLog::Log(LOGNOTICE, "My Music: Scanning for music info using worker thread, operation took %s", StringUtils::SecondsToTimeString(tick / 1000).c_str()); } bool bCanceled; if (m_scanType == 1) // load album info { int iCurrentItem = 1; for (set<CAlbum>::iterator it=m_albumsToScan.begin();it != m_albumsToScan.end();++it) { if (m_handle) { m_handle->SetText(StringUtils::Join(it->artist, g_advancedSettings.m_musicItemSeparator)+" - "+it->strAlbum); m_handle->SetPercentage(iCurrentItem++/(float)m_albumsToScan.size()); } CMusicAlbumInfo albumInfo; DownloadAlbumInfo(it->genre[0],StringUtils::Join(it->artist, g_advancedSettings.m_musicItemSeparator),it->strAlbum, bCanceled, albumInfo); // genre field holds path - see fetchalbuminfo() if (m_bStop || bCanceled) break; } } if (m_scanType == 2) // load artist info { int iCurrentItem=1; for (set<CArtist>::iterator it=m_artistsToScan.begin();it != m_artistsToScan.end();++it) { if (m_handle) { m_handle->SetText(it->strArtist); m_handle->SetPercentage(iCurrentItem++/(float)m_artistsToScan.size()*100); } DownloadArtistInfo(it->genre[0],it->strArtist,bCanceled); // genre field holds path - see fetchartistinfo() if (m_bStop || bCanceled) break; } } } catch (...) { CLog::Log(LOGERROR, "MusicInfoScanner: Exception while scanning."); } m_bRunning = false; ANNOUNCEMENT::CAnnouncementManager::Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanFinished"); // we need to clear the musicdb cache and update any active lists CUtil::DeleteMusicDatabaseDirectoryCache(); CGUIMessage msg(GUI_MSG_SCAN_FINISHED, 0, 0, 0); g_windowManager.SendThreadMessage(msg); if (m_handle) m_handle->MarkFinished(); m_handle = NULL; }
void CEdenVideoArtUpdater::Process() { // grab all movies... CVideoDatabase db; if (!db.Open()) return; CFileItemList items; CGUIDialogExtendedProgressBar* dialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); CGUIDialogProgressBarHandle *handle = dialog->GetHandle(g_localizeStrings.Get(314)); handle->SetTitle(g_localizeStrings.Get(12349)); // movies db.GetMoviesByWhere("videodb://movies/titles/", CDatabase::Filter(), items); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); string cachedThumb = GetCachedVideoThumb(*item); string cachedFanart = GetCachedFanart(*item); item->SetPath(item->GetVideoInfoTag()->m_strFileNameAndPath); item->GetVideoInfoTag()->m_fanart.Unpack(); item->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(item.get(), true, item->GetVideoInfoTag()->m_basePath != item->GetPath(), "thumb"); std::string type; if (CacheTexture(art, cachedThumb, item->GetLabel(), type)) artwork.insert(make_pair(type, art)); art = CVideoInfoScanner::GetFanart(item.get(), true); if (CacheTexture(art, cachedFanart, item->GetLabel())) artwork.insert(make_pair("fanart", art)); if (artwork.empty()) artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } items.Clear(); // music videos db.GetMusicVideosNav("videodb://musicvideos/titles/", items, false); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); string cachedThumb = GetCachedVideoThumb(*item); string cachedFanart = GetCachedFanart(*item); item->SetPath(item->GetVideoInfoTag()->m_strFileNameAndPath); item->GetVideoInfoTag()->m_fanart.Unpack(); item->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(item.get(), true, item->GetVideoInfoTag()->m_basePath != item->GetPath(), "thumb"); std::string type; if (CacheTexture(art, cachedThumb, item->GetLabel(), type)) artwork.insert(make_pair(type, art)); art = CVideoInfoScanner::GetFanart(item.get(), true); if (CacheTexture(art, cachedFanart, item->GetLabel())) artwork.insert(make_pair("fanart", art)); if (artwork.empty()) artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } items.Clear(); // tvshows // count the number of episodes db.GetTvShowsNav("videodb://tvshows/titles/", items); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); string cachedThumb = GetCachedVideoThumb(*item); string cachedFanart = GetCachedFanart(*item); item->SetPath(item->GetVideoInfoTag()->m_strPath); item->GetVideoInfoTag()->m_fanart.Unpack(); item->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(item.get(), true, false, "thumb"); std::string type; if (CacheTexture(art, cachedThumb, item->GetLabel(), type)) artwork.insert(make_pair(type, art)); art = CVideoInfoScanner::GetFanart(item.get(), true); if (CacheTexture(art, cachedFanart, item->GetLabel())) artwork.insert(make_pair("fanart", art)); if (artwork.empty()) artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } // now season art... map<int, map<string, string> > seasons; vector<string> artTypes; artTypes.push_back("thumb"); CVideoInfoScanner::GetSeasonThumbs(*item->GetVideoInfoTag(), seasons, artTypes, true); for (map<int, map<string, string> >::const_iterator j = seasons.begin(); j != seasons.end(); ++j) { if (j->second.empty()) continue; int idSeason = db.AddSeason(item->GetVideoInfoTag()->m_iDbId, j->first); map<string, string> seasonArt; if (idSeason > -1 && !db.GetArtForItem(idSeason, MediaTypeSeason, seasonArt)) { std::string cachedSeason = GetCachedSeasonThumb(j->first, item->GetVideoInfoTag()->m_strPath); std::string type; std::string originalUrl = j->second.begin()->second; if (CacheTexture(originalUrl, cachedSeason, "", type)) db.SetArtForItem(idSeason, MediaTypeSeason, type, originalUrl); } } // now episodes... CFileItemList items2; db.GetEpisodesByWhere("videodb://tvshows/titles/-1/-1/", db.PrepareSQL("episode_view.idShow=%d", item->GetVideoInfoTag()->m_iDbId), items2); for (int j = 0; j < items2.Size(); j++) { handle->SetProgress(j, items2.Size()); CFileItemPtr episode = items2[j]; string cachedThumb = GetCachedEpisodeThumb(*episode); if (!CFile::Exists(cachedThumb)) cachedThumb = GetCachedVideoThumb(*episode); episode->SetPath(episode->GetVideoInfoTag()->m_strFileNameAndPath); episode->GetVideoInfoTag()->m_strPictureURL.Parse(); map<string, string> artwork; if (!db.GetArtForItem(episode->GetVideoInfoTag()->m_iDbId, episode->GetVideoInfoTag()->m_type, artwork) || (artwork.size() == 1 && artwork.find("thumb") != artwork.end())) { CStdString art = CVideoInfoScanner::GetImage(episode.get(), true, episode->GetVideoInfoTag()->m_basePath != episode->GetPath(), "thumb"); if (CacheTexture(art, cachedThumb, episode->GetLabel())) artwork.insert(make_pair("thumb", art)); else artwork.insert(make_pair("thumb", "")); db.SetArtForItem(episode->GetVideoInfoTag()->m_iDbId, episode->GetVideoInfoTag()->m_type, artwork); } } } items.Clear(); // now sets db.GetSetsNav("videodb://movies/sets/", items, VIDEODB_CONTENT_MOVIES); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork)) { // grab the first movie from this set CFileItemList items2; db.GetMoviesNav("videodb://movies/titles/", items2, -1, -1, -1, -1, -1, -1, item->GetVideoInfoTag()->m_iDbId); if (items2.Size() > 1) { if (db.GetArtForItem(items2[0]->GetVideoInfoTag()->m_iDbId, items2[0]->GetVideoInfoTag()->m_type, artwork)) db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } } items.Clear(); // now actors if (CSettings::Get().GetBool("videolibrary.actorthumbs")) { db.GetActorsNav("videodb://movies/titles/", items, VIDEODB_CONTENT_MOVIES); db.GetActorsNav("videodb://tvshows/titles/", items, VIDEODB_CONTENT_TVSHOWS); db.GetActorsNav("videodb://tvshows/titles/", items, VIDEODB_CONTENT_EPISODES); db.GetActorsNav("videodb://musicvideos/titles/", items, VIDEODB_CONTENT_MUSICVIDEOS); for (int i = 0; i < items.Size(); i++) { CFileItemPtr item = items[i]; handle->SetProgress(i, items.Size()); handle->SetText(StringUtils::Format(g_localizeStrings.Get(12350).c_str(), item->GetLabel().c_str())); map<string, string> artwork; if (!db.GetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork)) { item->GetVideoInfoTag()->m_strPictureURL.Parse(); string cachedThumb = GetCachedActorThumb(*item); string art = CScraperUrl::GetThumbURL(item->GetVideoInfoTag()->m_strPictureURL.GetFirstThumb()); if (CacheTexture(art, cachedThumb, item->GetLabel())) artwork.insert(make_pair("thumb", art)); else artwork.insert(make_pair("thumb", "")); db.SetArtForItem(item->GetVideoInfoTag()->m_iDbId, item->GetVideoInfoTag()->m_type, artwork); } } } handle->MarkFinished(); ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::VideoLibrary, "xbmc", "OnScanFinished"); items.Clear(); }
bool CPVRClients::AutoconfigureClients(void) { bool bReturn(false); std::vector<PVR_CLIENT> autoConfigAddons; PVR_CLIENT addon; VECADDONS map; CAddonMgr::GetInstance().GetInstalledAddons(map, ADDON_PVRDLL); /** get the auto-configurable add-ons */ for (VECADDONS::iterator it = map.begin(); it != map.end(); ++it) { if (CAddonMgr::GetInstance().IsAddonDisabled((*it)->ID())) { addon = std::dynamic_pointer_cast<CPVRClient>(*it); if (addon->CanAutoconfigure()) autoConfigAddons.push_back(addon); } } /** no configurable add-ons found */ if (autoConfigAddons.empty()) return bReturn; /** display a progress bar while trying to auto-configure add-ons */ CGUIDialogExtendedProgressBar *loadingProgressDialog = (CGUIDialogExtendedProgressBar *)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); CGUIDialogProgressBarHandle* progressHandle = loadingProgressDialog->GetHandle(g_localizeStrings.Get(19688)); // Scanning for PVR services progressHandle->SetPercentage(0); progressHandle->SetText(g_localizeStrings.Get(19688)); //Scanning for PVR services /** start zeroconf and wait a second to get some responses */ CZeroconfBrowser::GetInstance()->Start(); for (std::vector<PVR_CLIENT>::iterator it = autoConfigAddons.begin(); !bReturn && it != autoConfigAddons.end(); ++it) (*it)->AutoconfigureRegisterType(); unsigned iIterations(0); float percentage(0.0f); float percentageStep(100.0f / PVR_CLIENT_AVAHI_SCAN_ITERATIONS); progressHandle->SetPercentage(percentage); /** while no add-ons were configured within 20 iterations */ while (!bReturn && iIterations++ < PVR_CLIENT_AVAHI_SCAN_ITERATIONS) { /** check each disabled add-on */ for (std::vector<PVR_CLIENT>::iterator it = autoConfigAddons.begin(); !bReturn && it != autoConfigAddons.end(); ++it) { if (addon->Autoconfigure()) { progressHandle->SetPercentage(100.0f); progressHandle->MarkFinished(); /** enable the add-on */ CAddonMgr::GetInstance().EnableAddon((*it)->ID()); CSingleLock lock(m_critSection); m_addons.push_back(*it); bReturn = true; } } /** wait a while and try again */ if (!bReturn) { percentage += percentageStep; progressHandle->SetPercentage(percentage); Sleep(PVR_CLIENT_AVAHI_SLEEP_TIME_MS); } } progressHandle->SetPercentage(100.0f); progressHandle->MarkFinished(); return bReturn; }
void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) { std::string iconPath = CSettings::GetInstance().GetString(CSettings::SETTING_PVRMENU_ICONPATH); if (iconPath.empty()) return; CPVRDatabase *database = GetPVRDatabase(); if (!database) return; /* fetch files in icon path for fast lookup */ CFileItemList fileItemList; XFILE::CDirectory::GetDirectory(iconPath, fileItemList, ".jpg|.png|.tbn"); if (fileItemList.IsEmpty()) return; CGUIDialogExtendedProgressBar* dlgProgress = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); CGUIDialogProgressBarHandle* dlgProgressHandle = dlgProgress ? dlgProgress->GetHandle(g_localizeStrings.Get(19287)) : NULL; CSingleLock lock(m_critSection); /* create a map for fast lookup of normalized file base name */ std::map<std::string, std::string> fileItemMap; const VECFILEITEMS &items = fileItemList.GetList(); for(VECFILEITEMS::const_iterator it = items.begin(); it != items.end(); ++it) { std::string baseName = URIUtils::GetFileName((*it)->GetPath()); URIUtils::RemoveExtension(baseName); StringUtils::ToLower(baseName); fileItemMap.insert(std::make_pair(baseName, (*it)->GetPath())); } int channelIndex = 0; CPVRChannelPtr channel; for(PVR_CHANNEL_GROUP_MEMBERS::const_iterator it = m_members.begin(); it != m_members.end(); ++it) { channel = it->second.channel; /* update progress dialog */ if (dlgProgressHandle) { dlgProgressHandle->SetProgress(channelIndex++, m_members.size()); dlgProgressHandle->SetText(channel->ChannelName()); } /* skip if an icon is already set and exists */ if (channel->IsIconExists()) continue; /* reset icon before searching for a new one */ channel->SetIconPath(""); std::string strChannelUid = StringUtils::Format("%08d", channel->UniqueID()); std::string strLegalClientChannelName = CUtil::MakeLegalFileName(channel->ClientChannelName()); StringUtils::ToLower(strLegalClientChannelName); std::string strLegalChannelName = CUtil::MakeLegalFileName(channel->ChannelName()); StringUtils::ToLower(strLegalChannelName); std::map<std::string, std::string>::iterator itItem; if ((itItem = fileItemMap.find(strLegalClientChannelName)) != fileItemMap.end() || (itItem = fileItemMap.find(strLegalChannelName)) != fileItemMap.end() || (itItem = fileItemMap.find(strChannelUid)) != fileItemMap.end()) { channel->SetIconPath(itItem->second, g_advancedSettings.m_bPVRAutoScanIconsUserSet); } if (bUpdateDb) channel->Persist(); /* TODO: start channel icon scraper here if nothing was found */ } if (dlgProgressHandle) dlgProgressHandle->MarkFinished(); }
void CMusicInfoScanner::Process() { ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanStarted"); try { if (m_bClean) { CleanDatabase(false); m_bRunning = false; return; } unsigned int tick = XbmcThreads::SystemClockMillis(); m_musicDatabase.Open(); if (m_showDialog && !CSettings::Get().GetBool("musiclibrary.backgroundupdate")) { CGUIDialogExtendedProgressBar* dialog = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); if (dialog) m_handle = dialog->GetHandle(g_localizeStrings.Get(314)); } m_bClean = g_advancedSettings.m_bMusicLibraryCleanOnUpdate; m_bCanInterrupt = true; if (m_scanType == 0) // load info from files { CLog::Log(LOGDEBUG, "%s - Starting scan", __FUNCTION__); if (m_handle) m_handle->SetTitle(g_localizeStrings.Get(505)); // Reset progress vars m_currentItem=0; m_itemCount=-1; // Create the thread to count all files to be scanned SetPriority( GetMinPriority() ); if (m_handle) m_fileCountReader.Create(); // Database operations should not be canceled // using Interupt() while scanning as it could // result in unexpected behaviour. m_bCanInterrupt = false; m_needsCleanup = false; bool commit = true; for (std::set<std::string>::const_iterator it = m_pathsToScan.begin(); it != m_pathsToScan.end(); it++) { if (!CDirectory::Exists(*it) && !m_bClean) { /* * Note that this will skip scanning (if m_bClean is disabled) if the directory really * doesn't exist. Since the music scanner is fed with a list of existing paths from the DB * and cleans out all songs under that path as its first step before re-adding files, if * the entire source is offline we totally empty the music database in one go. */ CLog::Log(LOGWARNING, "%s directory '%s' does not exist - skipping scan.", __FUNCTION__, it->c_str()); m_seenPaths.insert(*it); continue; } else if (!DoScan(*it)) { commit = false; break; } } if (commit) { g_infoManager.ResetLibraryBools(); if (m_needsCleanup) { if (m_handle) { m_handle->SetTitle(g_localizeStrings.Get(700)); m_handle->SetText(""); } m_musicDatabase.CleanupOrphanedItems(); if (m_handle) m_handle->SetTitle(g_localizeStrings.Get(331)); m_musicDatabase.Compress(false); } } m_fileCountReader.StopThread(); m_musicDatabase.EmptyCache(); tick = XbmcThreads::SystemClockMillis() - tick; CLog::Log(LOGNOTICE, "My Music: Scanning for music info using worker thread, operation took %s", StringUtils::SecondsToTimeString(tick / 1000).c_str()); } if (m_scanType == 1) // load album info { for (std::set<std::string>::const_iterator it = m_pathsToScan.begin(); it != m_pathsToScan.end(); ++it) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(*it, params); if (m_musicDatabase.HasAlbumBeenScraped(params.GetAlbumId())) // should this be here? continue; CAlbum album; m_musicDatabase.GetAlbum(params.GetAlbumId(), album); if (m_handle) { float percentage = (float) std::distance(it, m_pathsToScan.end()) / m_pathsToScan.size(); m_handle->SetText(StringUtils::Join(album.artist, g_advancedSettings.m_musicItemSeparator) + " - " + album.strAlbum); m_handle->SetPercentage(percentage); } // find album info ADDON::ScraperPtr scraper; if (!m_musicDatabase.GetScraperForPath(*it, scraper, ADDON::ADDON_SCRAPER_ALBUMS)) continue; UpdateDatabaseAlbumInfo(album, scraper, false); if (m_bStop) break; } } if (m_scanType == 2) // load artist info { for (std::set<std::string>::const_iterator it = m_pathsToScan.begin(); it != m_pathsToScan.end(); ++it) { CQueryParams params; CDirectoryNode::GetDatabaseInfo(*it, params); if (m_musicDatabase.HasArtistBeenScraped(params.GetArtistId())) // should this be here? continue; CArtist artist; m_musicDatabase.GetArtist(params.GetArtistId(), artist); m_musicDatabase.GetArtistPath(params.GetArtistId(), artist.strPath); if (m_handle) { float percentage = (float) (std::distance(m_pathsToScan.begin(), it) / m_pathsToScan.size()) * 100; m_handle->SetText(artist.strArtist); m_handle->SetPercentage(percentage); } // find album info ADDON::ScraperPtr scraper; if (!m_musicDatabase.GetScraperForPath(*it, scraper, ADDON::ADDON_SCRAPER_ARTISTS) || !scraper) continue; UpdateDatabaseArtistInfo(artist, scraper, false); if (m_bStop) break; } } } catch (...) { CLog::Log(LOGERROR, "MusicInfoScanner: Exception while scanning."); } m_musicDatabase.Close(); CLog::Log(LOGDEBUG, "%s - Finished scan", __FUNCTION__); m_bRunning = false; ANNOUNCEMENT::CAnnouncementManager::Get().Announce(ANNOUNCEMENT::AudioLibrary, "xbmc", "OnScanFinished"); // we need to clear the musicdb cache and update any active lists CUtil::DeleteMusicDatabaseDirectoryCache(); CGUIMessage msg(GUI_MSG_SCAN_FINISHED, 0, 0, 0); g_windowManager.SendThreadMessage(msg); if (m_handle) m_handle->MarkFinished(); m_handle = NULL; }
bool CCDDARipJob::DoWork() { CLog::Log(LOGINFO, "Start ripping track %s to %s", m_input.c_str(), m_output.c_str()); // if we are ripping to a samba share, rip it to hd first and then copy it it the share CFileItem file(m_output, false); if (file.IsRemote()) m_output = SetupTempFile(); if (m_output.empty()) { CLog::Log(LOGERROR, "CCDDARipper: Error opening file"); return false; } // init ripper CFile reader; CEncoder* encoder = nullptr; if (!reader.Open(m_input,READ_CACHED) || !(encoder=SetupEncoder(reader))) { CLog::Log(LOGERROR, "Error: CCDDARipper::Init failed"); return false; } // setup the progress dialog CGUIDialogExtendedProgressBar* pDlgProgress = CServiceBroker::GetGUI()->GetWindowManager().GetWindow<CGUIDialogExtendedProgressBar>(WINDOW_DIALOG_EXT_PROGRESS); CGUIDialogProgressBarHandle* handle = pDlgProgress->GetHandle(g_localizeStrings.Get(605)); int iTrack = atoi(m_input.substr(13, m_input.size() - 13 - 5).c_str()); std::string strLine0 = StringUtils::Format("%02i. %s - %s", iTrack, m_tag.GetArtistString().c_str(), m_tag.GetTitle().c_str()); handle->SetText(strLine0); // start ripping int percent=0; int oldpercent=0; bool cancelled(false); int result; while (!cancelled && (result=RipChunk(reader, encoder, percent)) == 0) { cancelled = ShouldCancel(percent,100); if (percent > oldpercent) { oldpercent = percent; handle->SetPercentage(static_cast<float>(percent)); } } // close encoder ripper encoder->CloseEncode(); delete encoder; reader.Close(); if (file.IsRemote() && !cancelled && result == 2) { // copy the ripped track to the share if (!CFile::Copy(m_output, file.GetPath())) { CLog::Log(LOGERROR, "CDDARipper: Error copying file from %s to %s", m_output.c_str(), file.GetPath().c_str()); CFile::Delete(m_output); return false; } // delete cached file CFile::Delete(m_output); } if (cancelled) { CLog::Log(LOGWARNING, "User Cancelled CDDA Rip"); CFile::Delete(m_output); } else if (result == 1) CLog::Log(LOGERROR, "CDDARipper: Error ripping %s", m_input.c_str()); else if (result < 0) CLog::Log(LOGERROR, "CDDARipper: Error encoding %s", m_input.c_str()); else { CLog::Log(LOGINFO, "Finished ripping %s", m_input.c_str()); if (m_eject) { CLog::Log(LOGINFO, "Ejecting CD"); g_mediaManager.EjectTray(); } } handle->MarkFinished(); return !cancelled && result == 2; }
bool CEpgContainer::UpdateEPG(bool bShowProgress /* = false */) { CSingleLock lock(m_critSection); unsigned int iEpgCount = size(); lock.Leave(); long iStartTime = CTimeUtils::GetTimeMS(); bool bUpdateSuccess = true; CGUIDialogExtendedProgressBar *progress = NULL; if (!m_bDatabaseLoaded) CLog::Log(LOGNOTICE, "EpgContainer - %s - loading EPG entries for %i tables from the database", __FUNCTION__, iEpgCount); else CLog::Log(LOGNOTICE, "EpgContainer - %s - starting EPG update for %i tables (update time = %d)", __FUNCTION__, iEpgCount, m_iUpdateTime); /* set start and end time */ time_t start; time_t end; CDateTime::GetCurrentDateTime().GetAsTime(start); // NOTE: XBMC stores the EPG times as local time end = start; start -= g_advancedSettings.m_iEpgLingerTime * 60; end += m_iDisplayTime; /* open the database */ if (!m_database.Open()) { CLog::Log(LOGERROR, "EpgContainer - %s - could not open the database", __FUNCTION__); return false; } /* show the progress bar */ if (bShowProgress) { progress = (CGUIDialogExtendedProgressBar *)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS); progress->Show(); progress->SetHeader(g_localizeStrings.Get(19004)); } int iUpdatedTables = 0; /* load or update all EPG tables */ for (unsigned int iEpgPtr = 0; iEpgPtr < iEpgCount; iEpgPtr++) { /* interrupt the update on exit or when livetv is playing */ if (m_bStop || (CPVRManager::Get()->IsStarted() && CPVRManager::GetClients()->IsPlaying())) { CLog::Log(LOGNOTICE, "EpgContainer - %s - EPG load/update interrupted", __FUNCTION__); bUpdateSuccess = false; break; } CEpg *epg = GetByIndex(iEpgPtr); if (!epg) continue; if (m_bDatabaseLoaded) at(iEpgPtr)->Cleanup(); bool bCurrent = m_bDatabaseLoaded || m_bIgnoreDbForClient ? at(iEpgPtr)->Update(start, end, m_iUpdateTime) : at(iEpgPtr)->Load() && bUpdateSuccess; /* try to update the table from clients if nothing was loaded from the db */ if (!m_bDatabaseLoaded && !m_bIgnoreDbForClient && !bCurrent) bCurrent = at(iEpgPtr)->Update(start, end, m_iUpdateTime); if (!bCurrent && m_bDatabaseLoaded) CLog::Log(LOGERROR, "EpgContainer - %s - failed to update table '%s'", __FUNCTION__, at(iEpgPtr)->Name().c_str()); bUpdateSuccess = bCurrent && bUpdateSuccess; if (bCurrent) ++iUpdatedTables; if (bShowProgress) { /* update the progress bar */ progress->SetProgress(iEpgPtr, iEpgCount); progress->SetTitle(at(iEpgPtr)->Name()); progress->UpdateState(); } if (m_bDatabaseLoaded) Sleep(50); /* give other threads a chance to get a lock on tables */ } CDateTime::GetCurrentDateTime().GetAsTime(m_iLastEpgUpdate); /* update the last scan time if we did a full update */ if (bUpdateSuccess && m_bDatabaseLoaded && !m_bIgnoreDbForClient) m_database.PersistLastEpgScanTime(0); m_database.Close(); if (bShowProgress) progress->Close(); long lUpdateTime = CTimeUtils::GetTimeMS() - iStartTime; CLog::Log(LOGINFO, "EpgContainer - %s - finished %s %d EPG tables after %li.%li seconds", __FUNCTION__, m_bDatabaseLoaded ? "updating" : "loading", iEpgCount, lUpdateTime / 1000, lUpdateTime % 1000); /* only try to load the database once */ m_bDatabaseLoaded = true; /* notify observers */ if (iUpdatedTables > 0) { SetChanged(); NotifyObservers("epg", false); } return bUpdateSuccess; }