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 = [statichelper.url_to_program(episode.get('programUrl')) for episode in oneoffs] for tvshow in tvshows: program = statichelper.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 __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 = statichelper.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] = statichelper.convert_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 test_url_to_program(self): long_url = 'https://www.vrt.be/vrtnu/a-z/buck/1/buck-s1a32/' program = 'buck' self.assertEqual(program, statichelper.url_to_program(long_url)) medium_url = '//www.vrt.be/vrtnu/a-z/buck/1/buck-s1a32/' program = 'buck' self.assertEqual(program, statichelper.url_to_program(medium_url)) short_url = '/vrtnu/a-z/buck/1/buck-s1a32/' program = 'buck' self.assertEqual(program, statichelper.url_to_program(short_url)) short_url = '/vrtnu/a-z/buck.relevant/' program = 'buck' self.assertEqual(program, statichelper.url_to_program(short_url))
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=60 * 60) cache_file = 'schedule.%s.json' % date if date in ('today', 'yesterday', 'tomorrow'): # Try the cache if it is fresh schedule = get_cache(cache_file, ttl=60 * 60) if not schedule: from json import load log(2, 'URL get: {url}', url=epg_url) schedule = load(urlopen(epg_url)) update_cache(cache_file, schedule) else: from json import load log(2, 'URL get: {url}', url=epg_url) schedule = load(urlopen(epg_url)) entry = find_entry(CHANNELS, 'name', channel) if entry: episodes = schedule.get(entry.get('id'), []) else: episodes = [] episode_items = [] for episode in episodes: label = self._metadata.get_label(episode) context_menu = [] path = None if episode.get('url'): from statichelper import add_https_method, url_to_program video_url = add_https_method(episode.get('url')) path = url_for('play_url', video_url=video_url) program = url_to_program(episode.get('url')) context_menu, favorite_marker, watchlater_marker = self._metadata.get_context_menu(episode, program, cache_file) label += favorite_marker + watchlater_marker info_labels = self._metadata.get_info_labels(episode, date=date, channel=entry) info_labels['title'] = label episode_items.append(TitleItem( title=label, path=path, art_dict=self._metadata.get_art(episode), info_dict=info_labels, is_playable=True, context_menu=context_menu, )) return episode_items
def manage(self): ''' Allow the user to unselect favorites to be removed from the listing ''' from statichelper import url_to_program self.refresh(ttl=0) if not self._favorites: 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._favorites.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 programs(self): ''' Return all favorite programs ''' from statichelper import url_to_program return [url_to_program(value.get('value').get('programUrl')) for value in list(self._favorites.values()) if value.get('value').get('isFavorite')]