bool CPVRChannelGroupInternal::RemoveFromGroup(const CPVRChannelPtr &channel) { if (!IsGroupMember(channel)) return false; /* check if this channel is currently playing if we are hiding it */ CPVRChannelPtr currentChannel(CServiceBroker::GetPVRManager().GetPlayingChannel()); if (currentChannel && currentChannel == channel) { HELPERS::ShowOKDialogText(CVariant{19098}, CVariant{19102}); return false; } CSingleLock lock(m_critSection); /* switch the hidden flag */ if (!channel->IsHidden()) { channel->SetHidden(true); ++m_iHiddenChannels; } else { channel->SetHidden(false); if (m_iHiddenChannels > 0) --m_iHiddenChannels; } /* renumber this list */ SortAndRenumber(); /* and persist */ return channel->Persist() && Persist(); }
CDateTime CPVRChannelGroup::GetEPGDate(EpgDateType epgDateType) const { CDateTime date; CEpgPtr epg; CPVRChannelPtr channel; CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_MEMBERS::const_iterator it = m_members.begin(); it != m_members.end(); ++it) { channel = it->second.channel; if (!channel->IsHidden() && (epg = channel->GetEPG())) { CDateTime epgDate; switch (epgDateType) { case EPG_FIRST_DATE: epgDate = epg->GetFirstDate(); if (epgDate.IsValid() && (!date.IsValid() || epgDate < date)) date = epgDate; break; case EPG_LAST_DATE: epgDate = epg->GetLastDate(); if (epgDate.IsValid() && (!date.IsValid() || epgDate > date)) date = epgDate; break; } } } return date; }
int CPVRChannelGroup::GetEPGNowOrNext(CFileItemList &results, bool bGetNext) const { int iInitialSize = results.Size(); CEpgInfoTagPtr epgNext; CPVRChannelPtr channel; CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); it != m_sortedMembers.end(); ++it) { channel = (*it).channel; CEpgPtr epg = channel->GetEPG(); if (epg && !channel->IsHidden()) { epgNext = bGetNext ? epg->GetTagNext() : epg->GetTagNow(); if (epgNext) { CFileItemPtr entry(new CFileItem(epgNext)); entry->SetLabel2(epgNext->StartAsLocalTime().GetAsLocalizedTime("", false)); entry->SetPath(channel->Path()); entry->SetArt("thumb", channel->IconPath()); results.Add(entry); } } } return results.Size() - iInitialSize; }
int CPVRChannelGroup::GetEPGAll(CFileItemList &results, bool bIncludeChannelsWithoutEPG /* = false */) const { int iInitialSize = results.Size(); CEpgInfoTagPtr epgTag; CPVRChannelPtr channel; CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); it != m_sortedMembers.end(); ++it) { channel = (*it).channel; if (!channel->IsHidden()) { int iAdded = 0; CEpgPtr epg = channel->GetEPG(); if (epg) { // XXX channel pointers aren't set in some occasions. this works around the issue, but is not very nice epg->SetChannel(channel); iAdded = epg->Get(results); } if (bIncludeChannelsWithoutEPG && iAdded == 0) { // Add dummy EPG tag associated with this channel epgTag = CEpgInfoTag::CreateDefaultTag(); epgTag->SetPVRChannel(channel); results.Add(CFileItemPtr(new CFileItem(epgTag))); } } } return results.Size() - iInitialSize; }
bool CPVRChannelGroupInternal::AddToGroup(CPVRChannel &channel, int iChannelNumber /* = 0 */) { CSingleLock lock(m_critSection); bool bReturn(false); /* get the actual channel since this is called from a fileitemlist copy */ CPVRChannelPtr realChannel = GetByChannelID(channel.ChannelID()); if (!realChannel) return bReturn; /* switch the hidden flag */ if (realChannel->IsHidden()) { realChannel->SetHidden(false); m_iHiddenChannels--; SortAndRenumber(); } /* move this channel and persist */ bReturn = (iChannelNumber > 0l) ? MoveChannel(realChannel->ChannelNumber(), iChannelNumber, true) : MoveChannel(realChannel->ChannelNumber(), m_members.size() - m_iHiddenChannels, true); if (m_bLoaded) realChannel->Persist(); return bReturn; }
/*! * @brief Copy over channel info from xbmcChannel to addonClient. * @param xbmcChannel The channel on XBMC's side. * @param addonChannel The channel on the addon's side. */ void CPVRClient::WriteClientChannelInfo(const CPVRChannelPtr &xbmcChannel, PVR_CHANNEL &addonChannel) { assert(xbmcChannel.get()); memset(&addonChannel, 0, sizeof(addonChannel)); addonChannel.iUniqueId = xbmcChannel->UniqueID(); addonChannel.iChannelNumber = xbmcChannel->ClientChannelNumber(); addonChannel.iSubChannelNumber = xbmcChannel->ClientSubChannelNumber(); strncpy(addonChannel.strChannelName, xbmcChannel->ClientChannelName().c_str(), sizeof(addonChannel.strChannelName) - 1); strncpy(addonChannel.strIconPath, xbmcChannel->IconPath().c_str(), sizeof(addonChannel.strIconPath) - 1); addonChannel.iEncryptionSystem = xbmcChannel->EncryptionSystem(); addonChannel.bIsRadio = xbmcChannel->IsRadio(); addonChannel.bIsHidden = xbmcChannel->IsHidden(); strncpy(addonChannel.strInputFormat, xbmcChannel->InputFormat().c_str(), sizeof(addonChannel.strInputFormat) - 1); strncpy(addonChannel.strStreamURL, xbmcChannel->StreamURL().c_str(), sizeof(addonChannel.strStreamURL) - 1); }
bool CEpg::UpdateFromScraper(time_t start, time_t end) { bool bGrabSuccess = false; if (ScraperName() == "client") { CPVRChannelPtr channel = Channel(); if (!channel) { CLog::Log(LOGWARNING, "EPG - %s - channel not found, can't update", __FUNCTION__); } else if (!channel->EPGEnabled()) { #if EPG_DEBUGGING CLog::Log(LOGDEBUG, "EPG - %s - EPG updating disabled in the channel configuration", __FUNCTION__); #endif bGrabSuccess = true; } else if (channel->IsHidden()) { #if EPG_DEBUGGING CLog::Log(LOGDEBUG, "EPG - %s - channel '%s' on client '%i' is hidden", __FUNCTION__, channel->ChannelName().c_str(), channel->ClientID()); #endif bGrabSuccess = true; } else if (!g_PVRClients->SupportsEPG(channel->ClientID())) { CLog::Log(LOGDEBUG, "EPG - %s - the backend for channel '%s' on client '%i' does not support EPGs", __FUNCTION__, channel->ChannelName().c_str(), channel->ClientID()); } else { CLog::Log(LOGDEBUG, "EPG - %s - updating EPG for channel '%s' from client '%i'", __FUNCTION__, channel->ChannelName().c_str(), channel->ClientID()); bGrabSuccess = (g_PVRClients->GetEPGForChannel(channel, this, start, end) == PVR_ERROR_NO_ERROR); } } else if (m_strScraperName.empty()) /* no grabber defined */ CLog::Log(LOGWARNING, "EPG - %s - no EPG scraper defined for table '%s'", __FUNCTION__, m_strName.c_str()); else { CLog::Log(LOGINFO, "EPG - %s - updating EPG table '%s' with scraper '%s'", __FUNCTION__, m_strName.c_str(), m_strScraperName.c_str()); CLog::Log(LOGWARNING, "loading the EPG via scraper has not been implemented yet"); // TODO: Add Support for Web EPG Scrapers here } return bGrabSuccess; }
int CPVRChannelGroupInternal::GetMembers(CFileItemList &results, bool bGroupMembers /* = true */) const { int iOrigSize = results.Size(); CSingleLock lock(m_critSection); for (unsigned int iChannelPtr = 0; iChannelPtr < m_members.size(); iChannelPtr++) { CPVRChannelPtr channel = m_members.at(iChannelPtr).channel; if (!channel) continue; if (bGroupMembers != channel->IsHidden()) { CFileItemPtr pFileItem(new CFileItem(*channel)); results.Add(pFileItem); } } return results.Size() - iOrigSize; }
int CPVRChannelGroup::GetEPGAll(CFileItemList &results) const { int iInitialSize = results.Size(); CEpg* epg; CPVRChannelPtr channel; CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); it != m_sortedMembers.end(); ++it) { channel = (*it).channel; if (!channel->IsHidden() && (epg = channel->GetEPG()) != NULL) { // XXX channel pointers aren't set in some occasions. this works around the issue, but is not very nice epg->SetChannel(channel); epg->Get(results); } } return results.Size() - iInitialSize; }
std::vector<std::shared_ptr<CPVREpgInfoTag>> CPVRChannelGroup::GetEPGAll(bool bIncludeChannelsWithoutEPG /* = false */) const { std::vector<std::shared_ptr<CPVREpgInfoTag>> tags; CPVREpgInfoTagPtr epgTag; CPVRChannelPtr channel; CSingleLock lock(m_critSection); for (PVR_CHANNEL_GROUP_SORTED_MEMBERS::const_iterator it = m_sortedMembers.begin(); it != m_sortedMembers.end(); ++it) { channel = (*it).channel; if (!channel->IsHidden()) { bool bEmpty = false; CPVREpgPtr epg = channel->GetEPG(); if (epg) { const std::vector<std::shared_ptr<CPVREpgInfoTag>> epgTags = epg->GetTags(); bEmpty = epgTags.empty(); if (!bEmpty) tags.insert(tags.end(), epgTags.begin(), epgTags.end()); } if (bIncludeChannelsWithoutEPG && bEmpty) { // Add dummy EPG tag associated with this channel if (epg) epgTag = std::make_shared<CPVREpgInfoTag>(epg->GetChannelData(), epg->EpgID()); else epgTag = std::make_shared<CPVREpgInfoTag>(std::make_shared<CPVREpgChannelData>(*channel), -1); tags.emplace_back(epgTag); } } } return tags; }
bool CPVRChannelGroupInternal::RemoveFromGroup(const CPVRChannel &channel) { CSingleLock lock(m_critSection); /* check if this channel is currently playing if we are hiding it */ CPVRChannelPtr currentChannel; if (g_PVRManager.GetCurrentChannel(currentChannel) && *currentChannel == channel) { CGUIDialogOK::ShowAndGetInput(19098,19101,0,19102); return false; } /* get the actual channel since this is called from a fileitemlist copy */ CPVRChannelPtr realChannel = GetByChannelID(channel.ChannelID()); if (!realChannel) return false; /* switch the hidden flag */ if (!realChannel->IsHidden()) { realChannel->SetHidden(true); ++m_iHiddenChannels; } else { realChannel->SetHidden(false); --m_iHiddenChannels; } /* renumber this list */ SortAndRenumber(); /* and persist */ return realChannel->Persist() && Persist(); }
bool CPVRChannelGroupInternal::RemoveFromGroup(const CPVRChannelPtr &channel) { CSingleLock lock(m_critSection); assert(channel.get()); if (!IsGroupMember(channel)) return false; /* check if this channel is currently playing if we are hiding it */ CPVRChannelPtr currentChannel(g_PVRManager.GetCurrentChannel()); if (currentChannel && currentChannel == channel) { CGUIDialogOK::ShowAndGetInput(CVariant{19098}, CVariant{19102}); return false; } /* switch the hidden flag */ if (!channel->IsHidden()) { channel->SetHidden(true); ++m_iHiddenChannels; } else { channel->SetHidden(false); if (m_iHiddenChannels > 0) --m_iHiddenChannels; } /* renumber this list */ SortAndRenumber(); /* and persist */ return channel->Persist() && Persist(); }
bool CPVRChannelGroupInternal::IsGroupMember(const CPVRChannelPtr &channel) const { return !channel->IsHidden(); }
void CGUIDialogPVRChannelManager::Update() { // lock our display, as this window is rendered from the player thread g_graphicsContext.Lock(); m_viewControl.SetCurrentView(CONTROL_LIST_CHANNELS); // empty the lists ready for population Clear(); CPVRChannelGroupPtr channels = g_PVRChannelGroups->GetGroupAll(m_bIsRadio); // No channels available, nothing to do. if(!channels) return; std::vector<PVRChannelGroupMember> groupMembers(channels->GetMembers()); CFileItemPtr channelFile; for (std::vector<PVRChannelGroupMember>::const_iterator it = groupMembers.begin(); it != groupMembers.end(); ++it) { channelFile = CFileItemPtr(new CFileItem((*it).channel)); if (!channelFile || !channelFile->HasPVRChannelInfoTag()) continue; const CPVRChannelPtr channel(channelFile->GetPVRChannelInfoTag()); channelFile->SetProperty("ActiveChannel", !channel->IsHidden()); channelFile->SetProperty("Name", channel->ChannelName()); channelFile->SetProperty("UseEPG", channel->EPGEnabled()); channelFile->SetProperty("Icon", channel->IconPath()); channelFile->SetProperty("EPGSource", (int)0); channelFile->SetProperty("ParentalLocked", channel->IsLocked()); channelFile->SetProperty("Number", StringUtils::Format("%i", channel->ChannelNumber())); std::string clientName; g_PVRClients->GetClientName(channel->ClientID(), clientName); channelFile->SetProperty("ClientName", clientName); channelFile->SetProperty("SupportsSettings", g_PVRClients->SupportsChannelSettings(channel->ClientID())); m_channelItems->Add(channelFile); } { std::vector< std::pair<std::string, int> > labels; labels.push_back(std::make_pair(g_localizeStrings.Get(19210), 0)); /// TODO: Add Labels for EPG scrapers here SET_CONTROL_LABELS(SPIN_EPGSOURCE_SELECTION, 0, &labels); } m_clientsWithSettingsList = g_PVRClients->GetClientsSupportingChannelSettings(m_bIsRadio); if (!m_clientsWithSettingsList.empty()) m_bAllowNewChannel = true; if (m_bAllowNewChannel) SET_CONTROL_VISIBLE(BUTTON_NEW_CHANNEL); else SET_CONTROL_HIDDEN(BUTTON_NEW_CHANNEL); Renumber(); m_viewControl.SetItems(*m_channelItems); m_viewControl.SetSelectedItem(m_iSelected); g_graphicsContext.Unlock(); }