def __map_tvshows(self, tvshows, oneoffs, use_favorites=False, cache_file=None): """Construct a list of TV show and Oneoff TitleItems and filtered by favorites""" items = [] if use_favorites: favorite_programs = self._favorites.programs() # Create list of oneoff programs from oneoff episodes oneoff_programs = [url_to_program(episode.get('programUrl')) for episode in oneoffs] for tvshow in tvshows: program = url_to_program(tvshow.get('programUrl')) if use_favorites and program not in favorite_programs: continue if program in oneoff_programs: # Add the oneoff listitem(s), yes, we can't guarantee there's only one per program so attempt to list all for index in [n for n, o in enumerate(oneoff_programs) if o == program]: items.append(self.episode_to_listitem(oneoffs[index], program, cache_file, titletype='oneoff')[0]) else: # Add the tvshow listitem items.append(self.tvshow_to_listitem(tvshow, program, cache_file)) return items
def manage(self): """Allow the user to unselect favorites to be removed from the listing""" from utils import url_to_program self.refresh(ttl=0) if not self._data: ok_dialog(heading=localize(30418), message=localize(30419)) # No favorites found return def by_title(item): """Sort by title""" return item.get('value').get('title') items = [ dict(program=url_to_program(value.get('value').get('programUrl')), title=unquote(value.get('value').get('title')), enabled=value.get('value').get('isFavorite')) for value in list(sorted(list(self._data.values()), key=by_title)) ] titles = [item['title'] for item in items] preselect = [ idx for idx in range(0, len(items) - 1) if items[idx]['enabled'] ] selected = multiselect( localize(30420), options=titles, preselect=preselect) # Please select/unselect to follow/unfollow if selected is not None: for idx in set(preselect).difference(set(selected)): self.unfollow(program=items[idx]['program'], title=items[idx]['title']) for idx in set(selected).difference(set(preselect)): self.follow(program=items[idx]['program'], title=items[idx]['title'])
def __map_episodes(self, episodes, titletype=None, season=None, use_favorites=False, cache_file=None): """Construct a list of TV show episodes TitleItems based on Search API query and filtered by favorites""" episode_items = [] sort = 'episode' ascending = True content = 'episodes' if use_favorites: favorite_programs = self._favorites.programs() for episode in episodes: # VRT API workaround: seasonTitle facet behaves as a partial match regex, # so we have to filter out the episodes from seasons that don't exactly match. if season and season != 'allseasons' and episode.get('seasonTitle') != season: continue program = url_to_program(episode.get('programUrl')) if use_favorites and program not in favorite_programs: continue # Support search highlights highlight = episode.get('highlight') if highlight: for key in highlight: episode[key] = html_to_kodilabel(highlight.get(key)[0]) list_item, sort, ascending = self.episode_to_listitem(episode, program, cache_file, titletype) episode_items.append(list_item) return episode_items, sort, ascending, content
def programs(self): """Return all favorite programs""" from utils import url_to_program return [ url_to_program(value.get('value').get('programUrl')) for value in list(self._data.values()) if value.get('value').get('isFavorite') ]
def get_episode_items(self, date, channel): """Show episodes for a given date and channel""" now = datetime.now(dateutil.tz.tzlocal()) epg = self.parse(date, now) epg_url = epg.strftime(self.VRT_TVGUIDE) self._favorites.refresh(ttl=ttl('indirect')) self._resumepoints.refresh(ttl=ttl('indirect')) cache_file = 'schedule.{date}.json'.format(date=date) if date in ('today', 'yesterday', 'tomorrow'): schedule = get_cached_url_json(url=epg_url, cache=cache_file, ttl=ttl('indirect'), fail={}) else: schedule = get_url_json(url=epg_url, fail={}) entry = find_entry(CHANNELS, 'name', channel) if entry: episodes = schedule.get(entry.get('id'), []) else: episodes = [] episode_items = [] for episode in episodes: program = url_to_program(episode.get('url', '')) if episode.get('url'): video_url = add_https_proto(episode.get('url')) path = url_for('play_url', video_url=video_url) context_menu, favorite_marker, watchlater_marker = self._metadata.get_context_menu( episode, program, cache_file) label = self._metadata.get_label( episode) + favorite_marker + watchlater_marker is_playable = True else: label = '[COLOR={greyedout}]%s[/COLOR]' % self._metadata.get_label( episode) path = url_for('noop') context_menu, _, _ = self._metadata.get_context_menu( episode, program, cache_file) is_playable = False info_labels = self._metadata.get_info_labels(episode, date=date, channel=entry) # FIXME: Due to a bug in Kodi, ListItem.Title is used when Sort methods are used, not ListItem.Label info_labels['title'] = colour(label) episode_items.append( TitleItem( label=colour(label), path=path, art_dict=self._metadata.get_art(episode), info_dict=info_labels, context_menu=context_menu, is_playable=is_playable, )) return episode_items
def get_episode_items(self, date, channel): """Show episodes for a given date and channel""" now = datetime.now(dateutil.tz.tzlocal()) epg = self.parse(date, now) epg_url = epg.strftime(self.VRT_TVGUIDE) self._favorites.refresh(ttl=ttl('indirect')) self._resumepoints.refresh(ttl=ttl('indirect')) cache_file = 'schedule.{date}.json'.format(date=date) if date in ('today', 'yesterday', 'tomorrow'): schedule = get_cached_url_json(url=epg_url, cache=cache_file, ttl=ttl('indirect'), fail={}) else: schedule = get_url_json(url=epg_url, fail={}) entry = find_entry(CHANNELS, 'name', channel) if entry: episodes = schedule.get(entry.get('id'), []) else: episodes = [] episode_items = [] for episode in episodes: program = url_to_program(episode.get('url', '')) context_menu, favorite_marker, watchlater_marker = self._metadata.get_context_menu( episode, program, cache_file) label = self._metadata.get_label(episode) path = self.get_episode_path(episode, channel) # Playable item if '/play/' in path: is_playable = True label += favorite_marker + watchlater_marker # Non-actionable item else: is_playable = False label = '[COLOR={greyedout}]%s[/COLOR]' % label # Now playing start_date = dateutil.parser.parse(episode.get('startTime')) end_date = dateutil.parser.parse(episode.get('endTime')) if start_date <= now <= end_date: if is_playable: label = '[COLOR={highlighted}]%s[/COLOR] %s' % ( label, localize(30301)) else: label += localize(30301) info_labels = self._metadata.get_info_labels(episode, date=date, channel=entry) # FIXME: Due to a bug in Kodi, ListItem.Title is used when Sort methods are used, not ListItem.Label info_labels['title'] = colour(label) episode_items.append( TitleItem( label=colour(label), path=path, art_dict=self._metadata.get_art(episode), info_dict=info_labels, context_menu=context_menu, is_playable=is_playable, )) return episode_items