void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */) { std::string iconPath = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_PVRMENU_ICONPATH); if (iconPath.empty()) return; /* fetch files in icon path for fast lookup */ CFileItemList fileItemList; XFILE::CDirectory::GetDirectory(iconPath, fileItemList, ".jpg|.png|.tbn", XFILE::DIR_FLAG_DEFAULTS); if (fileItemList.IsEmpty()) return; CSingleLock lock(m_critSection); /* create a map for fast lookup of normalized file base name */ std::map<std::string, std::string> fileItemMap; for (const auto& item : fileItemList) { std::string baseName = URIUtils::GetFileName(item->GetPath()); URIUtils::RemoveExtension(baseName); StringUtils::ToLower(baseName); fileItemMap.insert(std::make_pair(baseName, item->GetPath())); } CPVRGUIProgressHandler* progressHandler = new CPVRGUIProgressHandler(g_localizeStrings.Get(19286)); // Searching for channel icons 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 */ progressHandler->UpdateProgress(channel->ChannelName(), channelIndex++, m_members.size()); /* 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, CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_bPVRAutoScanIconsUserSet); } if (bUpdateDb) channel->Persist(); //! @todo start channel icon scraper here if nothing was found } progressHandler->DestroyProgress(); }
void CPVRManager::Process(void) { m_addons->Continue(); m_database->Open(); /* load the pvr data from the db and clients if it's not already loaded */ XbmcThreads::EndTime progressTimeout(30000); // 30 secs CPVRGUIProgressHandler* progressHandler = new CPVRGUIProgressHandler(g_localizeStrings.Get(19235)); // PVR manager is starting up while (!LoadComponents(progressHandler) && IsInitialising()) { CLog::Log(LOGWARNING, "PVR Manager failed to load data, retrying"); Sleep(1000); if (progressHandler && progressTimeout.IsTimePast()) { progressHandler->DestroyProgress(); progressHandler = nullptr; // no delete, instance is deleting itself } } if (progressHandler) { progressHandler->DestroyProgress(); progressHandler = nullptr; // no delete, instance is deleting itself } if (!IsInitialising()) { CLog::Log(LOGNOTICE, "PVR Manager: Start aborted"); return; } m_guiInfo->Start(); m_epgContainer.Start(true); m_pendingUpdates.Start(); SetState(ManagerStateStarted); CLog::Log(LOGNOTICE, "PVR Manager: Started"); /* main loop */ CLog::LogFC(LOGDEBUG, LOGPVR, "PVR Manager entering main loop"); bool bRestart(false); while (IsStarted() && m_addons->HasCreatedClients() && !bRestart) { /* first startup */ if (m_bFirstStart) { { CSingleLock lock(m_critSection); m_bFirstStart = false; } /* start job to search for missing channel icons */ TriggerSearchMissingChannelIcons(); /* try to play channel on startup */ TriggerPlayChannelOnStartup(); } /* execute the next pending jobs if there are any */ try { m_pendingUpdates.ExecutePendingJobs(); } catch (...) { CLog::LogF(LOGERROR, "An error occured while trying to execute the last PVR update job, trying to recover"); bRestart = true; } if (IsStarted() && !bRestart) m_pendingUpdates.WaitForJobs(1000); } CLog::LogFC(LOGDEBUG, LOGPVR, "PVR Manager leaving main loop"); }
void CPVRGUIChannelIconUpdater::SearchAndUpdateMissingChannelIcons() const { const std::string iconPath = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_PVRMENU_ICONPATH); if (iconPath.empty()) return; // fetch files in icon path for fast lookup CFileItemList fileItemList; XFILE::CDirectory::GetDirectory(iconPath, fileItemList, ".jpg|.png|.tbn", XFILE::DIR_FLAG_DEFAULTS); if (fileItemList.IsEmpty()) return; CLog::Log(LOGINFO, "Starting PVR channel icon search"); // create a map for fast lookup of normalized file base name std::map<std::string, std::string> fileItemMap; for (const auto& item : fileItemList) { std::string baseName = URIUtils::GetFileName(item->GetPath()); URIUtils::RemoveExtension(baseName); StringUtils::ToLower(baseName); fileItemMap.insert({baseName, item->GetPath()}); } CPVRGUIProgressHandler* progressHandler = new CPVRGUIProgressHandler(g_localizeStrings.Get(19286)); // Searching for channel icons for (const auto& group : m_groups) { const std::vector<PVRChannelGroupMember> members = group->GetMembers(); int channelIndex = 0; for (const auto& member : members) { progressHandler->UpdateProgress(member.channel->ChannelName(), channelIndex++, members.size()); // skip if an icon is already set and exists if (XFILE::CFile::Exists(member.channel->IconPath())) continue; // reset icon before searching for a new one member.channel->SetIconPath(""); const std::string strChannelUid = StringUtils::Format("%08d", member.channel->UniqueID()); std::string strLegalClientChannelName = CUtil::MakeLegalFileName(member.channel->ClientChannelName()); StringUtils::ToLower(strLegalClientChannelName); std::string strLegalChannelName = CUtil::MakeLegalFileName(member.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()) { member.channel->SetIconPath(itItem->second, CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_bPVRAutoScanIconsUserSet); } if (m_bUpdateDb) member.channel->Persist(); } } progressHandler->DestroyProgress(); }