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 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(); }