def show_mainmenu(): """ Show the main menu """ listing = [ TitleItem( title=kodiutils.localize(30001), # A-Z path=kodiutils.url_for('show_catalog'), art_dict=dict( icon='DefaultMovieTitle.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30002), )), TitleItem( title=kodiutils.localize(30007), # TV Channels path=kodiutils.url_for('show_channels'), art_dict=dict( icon='DefaultAddonPVRClient.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30008), )), TitleItem( title=kodiutils.localize(30009), # Search path=kodiutils.url_for('show_search'), art_dict=dict( icon='DefaultAddonsSearch.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30010), )) ] kodiutils.show_listing(listing, sort=['unsorted'])
def generate_titleitem(cls, item): """ Generate a TitleItem. :param Union[Channel] item: The item to convert to a TitleItem. :rtype: TitleItem """ # # Program # if isinstance(item, Program): return TitleItem( title=item.title, path=kodiutils.url_for('play_asset', asset_id=item.uid), art_dict={ 'cover': item.cover, 'icon': item.preview, 'thumb': item.preview, 'fanart': item.preview, }, info_dict={ 'tvshowtitle': item.title, 'plot': item.description, 'season': item.season, 'episode': item.episode, 'mediatype': 'episode', }, is_playable=True, ) # # Channel # if isinstance(item, Channel): return TitleItem( title=item.title, path=kodiutils.url_for('play_asset', asset_id=item.uid) + '?.pvr', art_dict={ 'cover': item.icon, 'icon': item.icon, 'thumb': item.icon, # 'fanart': item.preview, # Preview doesn't seem to work on most channels }, info_dict={ 'title': item.title, 'plot': cls._format_channel_plot(item), 'playcount': 0, 'mediatype': 'video', }, prop_dict={ 'inputstream.adaptive.manifest_update_parameter': 'full', }, is_playable=True, ) raise Exception('Unknown type: %s' % item)
def show_channel_menu(key): """ Shows a TV channel :type key: str """ channel = CHANNELS[key] # Lookup the high resolution logo based on the channel name fanart = '{path}/resources/logos/{logo}'.format(path=kodiutils.addon_path(), logo=channel.get('background')) listing = [ TitleItem( title=kodiutils.localize(30053, channel=channel.get('name')), # TV Guide for {channel} path=kodiutils.url_for('show_tvguide_channel', channel=key), art_dict={ 'icon': 'DefaultAddonTvInfo.png', 'fanart': fanart, }, info_dict={ 'plot': kodiutils.localize(30054, channel=channel.get('name')), # Browse the TV Guide for {channel} } ), TitleItem( title=kodiutils.localize(30055, channel=channel.get('name')), # Catalog for {channel} path=kodiutils.url_for('show_catalog_channel', channel=key), art_dict={ 'icon': 'DefaultMovieTitle.png', 'fanart': fanart, }, info_dict={ 'plot': kodiutils.localize(30056, channel=channel.get('name')), # Browse the Catalog for {channel} } ) ] # Add YouTube channels if kodiutils.get_cond_visibility('System.HasAddon(plugin.video.youtube)') != 0: for youtube in channel.get('youtube', []): listing.append( TitleItem( title=kodiutils.localize(30206, label=youtube.get('label')), # Watch {label} on YouTube path=youtube.get('path'), info_dict={ 'plot': kodiutils.localize(30206, label=youtube.get('label')), # Watch {label} on YouTube } ) ) kodiutils.show_listing(listing, 30007, sort=['unsorted'])
def show_channel_guide(self, channel_id): """ Shows the dates in the tv guide. :param str channel_id: The channel for which we want to show an EPG. """ listing = [] for day in self._get_dates('%A %d %B %Y'): if day.get('highlight'): title = '[B]{title}[/B]'.format(title=day.get('title')) else: title = day.get('title') listing.append( TitleItem( title=title, path=kodiutils.url_for('show_channel_guide_detail', channel_id=channel_id, date=day.get('key')), art_dict=dict( icon='DefaultYear.png', thumb='DefaultYear.png', ), info_dict=dict( plot=None, date=day.get('date'), ), )) kodiutils.show_listing(listing, 30013, content='files')
def show_channel(self, channel): """ Shows the dates in the tv guide :type channel: str """ listing = [] for day in self.get_dates('%A %d %B %Y'): if day.get('highlight'): title = '[B]{title}[/B]'.format(title=day.get('title')) else: title = day.get('title') listing.append( TitleItem(title=title, path=kodiutils.url_for('show_channel_tvguide_detail', channel=channel, date=day.get('key')), art_dict={ 'icon': 'DefaultYear.png', 'thumb': 'DefaultYear.png', }, info_dict={ 'plot': None, 'date': day.get('date'), })) kodiutils.show_listing(listing, 30013, content='files', sort=['date'])
def show_recommendations(self, storefront): """ Show the recommendations. :type storefront: str """ results = self._api.get_storefront(storefront) show_unavailable = kodiutils.get_setting_bool( 'interface_show_unavailable') listing = [] for item in results: if isinstance(item, Category): listing.append( TitleItem( title=item.title, path=kodiutils.url_for('show_recommendations_category', storefront=storefront, category=item.category_id), info_dict=dict(plot='[B]{category}[/B]'.format( category=item.title), ), )) else: if show_unavailable or item.available: listing.append(Menu.generate_titleitem(item)) if storefront == STOREFRONT_SERIES: label = 30005 # Series elif storefront == STOREFRONT_MOVIES: label = 30003 # Movies else: label = 30015 # Recommendations kodiutils.show_listing(listing, label, content='files')
def generate_titleitem_series(cls, item): """ Generate a TitleItem. :param resources.lib.solocoo.util.Program item: The Program to convert to a TitleItem. :returns: A generated TitleItem for a Series. :rtype: TitleItem """ return TitleItem( title=item.title, path=kodiutils.url_for('show_channel_replay_series', series_id=item.series_id), art_dict={ 'cover': item.cover, 'icon': item.preview, 'thumb': item.preview, 'fanart': item.preview, }, info_dict={ 'mpaa': item.age, 'tvshowtitle': item.title, 'title': item.title, 'plot': None, }, )
def show_recommendations(self): """ Shows the recommendations """ # "Meest bekeken" has a specific API endpoint, the other categories are scraped from the website. listing = [ TitleItem(title='Meest bekeken', path=kodiutils.url_for('show_recommendations_category', category='meest-bekeken'), info_dict={ 'title': 'Meest bekeken', }) ] recommendations = self._api.get_recommendation_categories() for category in recommendations: listing.append( TitleItem(title=category.title, path=kodiutils.url_for( 'show_recommendations_category', category=category.uuid), info_dict={ 'title': category.title, })) kodiutils.show_listing(listing, 30005, content='tvshows')
def show_categories(self): """ Shows the categories """ categories = self._api.get_categories() listing = [] for category in categories: listing.append( TitleItem(title=category.title, path=kodiutils.url_for('show_category', category=category.uuid), info_dict={ 'title': category.title, })) kodiutils.show_listing(listing, 30003, sort=['title'])
def show_catalog(self): """ Show the catalog. """ categories = self._api.get_categories() listing = [] for cat in categories: listing.append(TitleItem( title=cat.title, path=kodiutils.url_for('show_catalog_category', category=cat.category_id), info_dict=dict( plot='[B]{category}[/B]'.format(category=cat.title), ), )) # Sort categories by default like in Streamz. kodiutils.show_listing(listing, 30003, content='files')
def show_mainmenu(): """ Show the main menu """ listing = [ TitleItem( title=kodiutils.localize(30001), # A-Z path=kodiutils.url_for('show_catalog'), art_dict=dict( icon='DefaultMovieTitle.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30002), )), TitleItem( title=kodiutils.localize(30007), # TV Channels path=kodiutils.url_for('show_channels'), art_dict=dict( icon='DefaultAddonPVRClient.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30008), )), TitleItem( title=kodiutils.localize(30003), # Catalog path=kodiutils.url_for('show_categories'), art_dict=dict( icon='DefaultGenre.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30004), )), TitleItem( title=kodiutils.localize(30005), # Recommendations path=kodiutils.url_for('show_recommendations'), art_dict=dict( icon='DefaultFavourites.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30006), )), TitleItem( title=kodiutils.localize(30011), # My List path=kodiutils.url_for('show_mylist'), art_dict=dict( icon='DefaultPlaylist.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30012), )), TitleItem( title=kodiutils.localize(30009), # Search path=kodiutils.url_for('show_search'), art_dict=dict( icon='DefaultAddonsSearch.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30010), )) ] kodiutils.show_listing(listing, sort=['unsorted'])
def show_recommendations(self, storefront): """ Show the recommendations. :type storefront: str """ recommendations = self._api.get_recommendations(storefront) listing = [] for cat in recommendations: listing.append(TitleItem( title=cat.title, path=kodiutils.url_for('show_recommendations_category', storefront=storefront, category=cat.category_id), info_dict=dict( plot='[B]{category}[/B]'.format(category=cat.title), ), )) # Sort categories by default like in Streamz. kodiutils.show_listing(listing, 30015, content='files')
def select_profile(self, key=None): """ Show your profiles. :type key: str """ profiles = self._auth.get_profiles() # Show warning when you have no profiles if not profiles: # Your account has no profiles defined. Please login on www.streamz.be/streamz and create a profile. kodiutils.ok_dialog(message=kodiutils.localize(30703)) kodiutils.end_of_directory() return # Select the first profile when you only have one if len(profiles) == 1: key = profiles[0].key # Save the selected profile if key: profile = [x for x in profiles if x.key == key][0] _LOGGER.debug('Setting profile to %s', profile) kodiutils.set_setting('profile', '%s:%s' % (profile.key, profile.product)) kodiutils.set_setting('profile_name', profile.name) kodiutils.redirect(kodiutils.url_for('show_main_menu')) return # Show profile selection when you have multiple profiles listing = [ TitleItem( title=self._get_profile_name(p), path=kodiutils.url_for('select_profile', key=p.key), art_dict=dict(icon='DefaultUser.png'), info_dict=dict(plot=p.name, ), ) for p in profiles ] kodiutils.show_listing(listing, sort=['unsorted'], category=30057) # Select Profile
def show_channels(): """ Shows TV channels """ listing = [] for i, key in enumerate(CHANNELS): # pylint: disable=unused-variable channel = CHANNELS[key] # Lookup the high resolution logo based on the channel name icon = '{path}/resources/logos/{logo}'.format(path=kodiutils.addon_path(), logo=channel.get('logo')) fanart = '{path}/resources/logos/{logo}'.format(path=kodiutils.addon_path(), logo=channel.get('background')) context_menu = [ ( kodiutils.localize(30053, channel=channel.get('name')), # TV Guide for {channel} 'Container.Update(%s)' % kodiutils.url_for('show_tvguide_channel', channel=channel.get('epg')) ) ] listing.append( TitleItem( title=channel.get('name'), path=kodiutils.url_for('show_channel_menu', channel=key), art_dict={ 'icon': icon, 'thumb': icon, 'fanart': fanart, }, info_dict={ 'plot': None, 'playcount': 0, 'mediatype': 'video', 'studio': channel.get('studio_icon'), }, stream_dict=STREAM_DICT, context_menu=context_menu ), ) kodiutils.show_listing(listing, 30007)
def generate_titleitem_channel(cls, item): """ Generate a TitleItem for a Channel. :param resources.lib.solocoo.util.Channel item: The Channel to convert to a TitleItem. :returns: A generated TitleItem for a Channel. :rtype: TitleItem """ if item.epg_now: title = item.title + '[COLOR gray] | {title} ({start} - {end})[/COLOR]'.format( title=item.epg_now.title, start=item.epg_now.start.strftime('%H:%M'), end=item.epg_now.end.strftime('%H:%M')) else: title = item.title return TitleItem( title=title, path=kodiutils.url_for('play_asset', asset_id=item.uid) + '?.pvr', art_dict={ 'cover': item.icon, 'icon': item.icon, 'thumb': item.icon, # 'fanart': item.preview, # Preview doesn't seem to work on most channels }, info_dict={ 'title': item.title, 'plot': cls._format_channel_plot(item), 'playcount': 0, 'mediatype': 'video', }, prop_dict={ 'inputstream.adaptive.manifest_update_parameter': 'full', }, is_playable=True, )
def show_program(self, program_id): """ Show a program from the catalog :type program_id: str """ try: program = self._api.get_program( program_id, extract_clips=True, cache=CACHE_PREVENT ) # Use CACHE_PREVENT since we want fresh data except UnavailableException: kodiutils.ok_dialog(message=kodiutils.localize( 30717)) # This program is not available in the catalogue. kodiutils.end_of_directory() return if not program.episodes and not program.clips: kodiutils.ok_dialog(message=kodiutils.localize( 30717)) # This program is not available in the catalogue. kodiutils.end_of_directory() return # Go directly to the season when we have only one season and no clips if not program.clips and len(program.seasons) == 1: self.show_program_season(program_id, list(program.seasons.values())[0].uuid) return listing = [] # Add an '* All seasons' entry when configured in Kodi if program.seasons and kodiutils.get_global_setting( 'videolibrary.showallitems') is True: listing.append( TitleItem( title='* %s' % kodiutils.localize(30204), # * All seasons path=kodiutils.url_for('show_catalog_program_season', program=program_id, season='-1'), art_dict={ 'fanart': program.fanart, 'poster': program.poster, 'landscape': program.thumb, }, info_dict={ 'tvshowtitle': program.title, 'title': kodiutils.localize(30204), # All seasons 'plot': program.description, 'set': program.title, })) # Add the seasons for season in list(program.seasons.values()): listing.append( TitleItem( title=season. title, # kodiutils.localize(30205, season=season.number), # Season {season} path=kodiutils.url_for('show_catalog_program_season', program=program_id, season=season.uuid), art_dict={ 'fanart': program.fanart, 'poster': program.poster, 'landscape': program.thumb, }, info_dict={ 'tvshowtitle': program.title, 'title': kodiutils.localize( 30205, season=season.number), # Season {season} 'plot': season.description or program.description, 'set': program.title, })) # Add Clips if program.clips: listing.append( TitleItem( title=kodiutils.localize( 30059, program=program.title), # Clips for {program} path=kodiutils.url_for('show_catalog_program_clips', program=program_id), art_dict={ 'fanart': program.fanart, 'poster': program.poster, 'landscape': program.thumb, }, info_dict={ 'tvshowtitle': program.title, 'title': kodiutils.localize( 30059, program=program.title), # Clips for {program} 'plot': kodiutils.localize(30060, program=program.title ), # Watch short clips of {program} 'set': program.title, })) # Sort by label. Some programs return seasons unordered. kodiutils.show_listing(listing, 30003, content='tvshows')
def show_mainmenu(self): """ Show the main menu. """ listing = [] account = self._auth.login() if account.product == 'STREAMZ': listing.append( TitleItem( title=kodiutils.localize(30015), # Recommendations path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_MAIN), art_dict=dict( icon='DefaultFavourites.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30016), ), )) listing.append( TitleItem( title=kodiutils.localize(30003), # Movies path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_MOVIES), art_dict=dict( icon='DefaultMovies.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30004), ), )) listing.append( TitleItem( title=kodiutils.localize(30005), # Series path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_SERIES), art_dict=dict( icon='DefaultTVShows.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30006), ), )) listing.append( TitleItem( title=kodiutils.localize(30021), # Kids path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_KIDS), art_dict=dict( icon='DefaultFavourites.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30022), ), )) elif account.product == 'STREAMZ_KIDS': listing.append( TitleItem( title=kodiutils.localize(30015), # Recommendations path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_MAIN_KIDS), art_dict=dict( icon='DefaultFavourites.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30016), ), )) if kodiutils.get_setting_bool('interface_show_az'): listing.append( TitleItem( title=kodiutils.localize(30001), # A-Z path=kodiutils.url_for('show_catalog_all'), art_dict=dict( icon='DefaultMovieTitle.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30002), ), )) # listing.append(TitleItem( # title=kodiutils.localize(30003), # Catalogue # path=kodiutils.url_for('show_catalog'), # art_dict=dict( # icon='DefaultGenre.png', # fanart=kodiutils.get_addon_info('fanart'), # ), # info_dict=dict( # plot=kodiutils.localize(30004), # ), # )) if kodiutils.get_setting_bool('interface_show_mylist'): listing.append( TitleItem( title=kodiutils.localize(30017), # My List path=kodiutils.url_for('show_mylist'), art_dict=dict( icon='DefaultPlaylist.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30018), ), )) # if kodiutils.get_setting_as_bool('interface_show_continuewatching') and kodiutils.has_credentials(): # listing.append(TitleItem( # title=kodiutils.localize(30019), # Continue watching # path=kodiutils.url_for('show_continuewatching'), # art_dict=dict( # icon='DefaultInProgressShows.png', # fanart=kodiutils.get_addon_info('fanart'), # ), # info_dict=dict( # plot=kodiutils.localize(30020), # ), # )) listing.append( TitleItem( title=kodiutils.localize(30009), # Search path=kodiutils.url_for('show_search'), art_dict=dict( icon='DefaultAddonsSearch.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict(plot=kodiutils.localize(30010), ), )) kodiutils.show_listing(listing, sort=['unsorted'])
def generate_titleitem(item): """ Generate a TitleItem based on a Program or Episode. :type item: Union[Program, Episode] :rtype TitleItem """ info_dict = { 'title': item.title, 'plot': item.description, 'aired': item.aired.strftime('%Y-%m-%d') if item.aired else None, } prop_dict = {} # # Program # if isinstance(item, Program): info_dict.update({ 'mediatype': None, 'season': len(item.seasons) if item.seasons else None, }) art_dict = { 'poster': item.poster, 'landscape': item.thumb, 'thumb': item.thumb, 'fanart': item.fanart, } visible = True if isinstance(item.episodes, list) and not item.episodes: # We know that we don't have episodes title = '[COLOR gray]' + item.title + '[/COLOR]' visible = kodiutils.get_setting_bool( 'interface_show_unavailable') else: # We have episodes, or we don't know it title = item.title context_menu = [] if item.uuid: if item.my_list: context_menu.append(( kodiutils.localize(30101), # Remove from My List 'Container.Update(%s)' % kodiutils.url_for('mylist_del', uuid=item.uuid))) else: context_menu.append(( kodiutils.localize(30100), # Add to My List 'Container.Update(%s)' % kodiutils.url_for('mylist_add', uuid=item.uuid))) context_menu.append(( kodiutils.localize(30102), # Go to Program 'Container.Update(%s)' % kodiutils.url_for('show_catalog_program', program=item.path))) return TitleItem(title=title, path=kodiutils.url_for('show_catalog_program', program=item.path), context_menu=context_menu, art_dict=art_dict, info_dict=info_dict, visible=visible) # # Episode # if isinstance(item, Episode): info_dict.update({ 'mediatype': 'episode', 'tvshowtitle': item.program_title, 'duration': item.duration, 'season': item.season, 'episode': item.number, }) art_dict = { 'landscape': item.thumb, 'thumb': item.thumb, 'fanart': item.thumb, } stream_dict = STREAM_DICT.copy() stream_dict.update({ 'duration': item.duration, }) if item.uuid: # We have an UUID and can play this item directly path = kodiutils.url_for('play_catalog', uuid=item.uuid) else: # We don't have an UUID, and first need to fetch the video information from the page path = kodiutils.url_for('play_from_page', page=quote(item.path, safe='')) return TitleItem(title=info_dict['title'], path=path, art_dict=art_dict, info_dict=info_dict, stream_dict=stream_dict, prop_dict=prop_dict, is_playable=True) raise Exception('Unknown video_type')
def generate_titleitem(item): """ Generate a TitleItem based on a Program or Episode. :type item: Union[Program, Episode] :rtype TitleItem """ art_dict = { 'thumb': item.cover, 'cover': item.cover, } info_dict = { 'title': item.title, 'plot': item.description, 'studio': CHANNELS.get(item.channel, {}).get('studio_icon'), 'aired': item.aired.strftime('%Y-%m-%d') if item.aired else None, } prop_dict = {} # # Program # if isinstance(item, Program): art_dict.update({ 'fanart': item.background, }) info_dict.update({ 'mediatype': None, 'season': len(item.seasons) if item.seasons else None, }) if isinstance(item.episodes, list) and not item.episodes: # We know that we don't have episodes title = '[COLOR gray]' + item.title + '[/COLOR]' else: # We have episodes, or we don't know it title = item.title return TitleItem(title=title, path=kodiutils.url_for('show_catalog_program', channel=item.channel, program=item.path), art_dict=art_dict, info_dict=info_dict) # # Episode # if isinstance(item, Episode): art_dict.update({ 'fanart': item.cover, }) info_dict.update({ 'mediatype': 'episode', 'tvshowtitle': item.program_title, 'duration': item.duration, 'season': item.season, 'episode': item.number, }) stream_dict = STREAM_DICT.copy() stream_dict.update({ 'duration': item.duration, }) return TitleItem(title=info_dict['title'], path=kodiutils.url_for('play', uuid=item.uuid), art_dict=art_dict, info_dict=info_dict, stream_dict=stream_dict, prop_dict=prop_dict, is_playable=True) raise Exception('Unknown video_type')
def show_program(self, program): """ Show a program from the catalog. :type program: str """ try: program_obj = self._api.get_program( program, cache=CACHE_PREVENT ) # Use CACHE_PREVENT since we want fresh data except UnavailableException: kodiutils.ok_dialog( message=kodiutils.localize(30712) ) # The video is unavailable and can't be played right now. kodiutils.end_of_directory() return # Go directly to the season when we have only one season if len(program_obj.seasons) == 1: self.show_program_season( program, list(program_obj.seasons.values())[0].number) return # studio = CHANNELS.get(program_obj.channel, {}).get('studio_icon') listing = [] # Add an '* All seasons' entry when configured in Kodi if kodiutils.get_global_setting('videolibrary.showallitems') is True: listing.append( TitleItem( title='* %s' % kodiutils.localize(30204), # * All seasons path=kodiutils.url_for('show_catalog_program_season', program=program, season=-1), art_dict=dict( poster=program_obj.poster, thumb=program_obj.thumb, landscape=program_obj.thumb, fanart=program_obj.fanart, ), info_dict=dict( mediatype='season', tvshowtitle=program_obj.name, title=kodiutils.localize(30204), # All seasons tagline=program_obj.description, set=program_obj.name, # studio=studio, mpaa=', '.join(program_obj.legal) if hasattr(program_obj, 'legal') and program_obj.legal else kodiutils.localize(30216), # All ages ), )) # Add the seasons for season in list(program_obj.seasons.values()): listing.append( TitleItem( title=kodiutils.localize( 30205, season=season.number), # Season {season} path=kodiutils.url_for('show_catalog_program_season', program=program, season=season.number), art_dict=dict( poster=program_obj.poster, thumb=program_obj.thumb, landscape=program_obj.thumb, fanart=program_obj.fanart, ), info_dict=dict( mediatype='season', tvshowtitle=program_obj.name, title=kodiutils.localize( 30205, season=season.number), # Season {season} tagline=program_obj.description, set=program_obj.name, # studio=studio, mpaa=', '.join(program_obj.legal) if hasattr(program_obj, 'legal') and program_obj.legal else kodiutils.localize(30216), # All ages ), )) # Sort by label. Some programs return seasons unordered. kodiutils.show_listing(listing, program_obj.name, content='tvshows', sort=['label'])
def generate_titleitem(item): """ Generate a TitleItem based on a Program or Episode. :type item: Union[Program, Episode] :rtype TitleItem """ art_dict = { 'thumb': item.cover, 'cover': item.cover, } info_dict = { 'title': item.title, 'plot': item.description, 'studio': CHANNELS.get(item.channel, {}).get('studio_icon'), 'aired': item.aired.strftime('%Y-%m-%d') if item.aired else None, } prop_dict = {} # # Program # if isinstance(item, Program): art_dict.update({ 'fanart': item.background, }) info_dict.update({ 'mediatype': None, 'season': len(item.seasons) if item.seasons else None, }) return TitleItem(title=item.title, path=kodiutils.url_for('show_catalog_program', channel=item.channel, program=item.path), art_dict=art_dict, info_dict=info_dict) # # Episode # if isinstance(item, Episode): art_dict.update({ 'fanart': item.cover, }) info_dict.update({ 'mediatype': 'episode', 'tvshowtitle': item.program_title, 'duration': item.duration, 'season': item.season, 'episode': item.number, 'aired': item.aired.strftime('%Y-%m-%d'), }) stream_dict = { 'codec': 'h264', 'duration': item.duration, 'height': 576, 'width': 720, } return TitleItem(title=info_dict['title'], path=kodiutils.url_for('play', channel=item.channel, uuid=item.uuid), art_dict=art_dict, info_dict=info_dict, stream_dict=stream_dict, prop_dict=prop_dict, is_playable=True) raise Exception('Unknown video_type')
def show_detail(self, channel=None, date=None): """ Shows the programs of a specific date in the tv guide :type channel: str :type date: str """ try: programs = self._epg.get_epg(channel=channel, date=date) except UnavailableException as ex: kodiutils.notification(message=str(ex)) kodiutils.end_of_directory() return listing = [] for program in programs: if program.program_url: context_menu = [( kodiutils.localize(30102), # Go to Program 'Container.Update(%s)' % kodiutils.url_for('show_catalog_program', channel=channel, program=program.program_url))] else: context_menu = None title = '{time} - {title}'.format( time=program.start.strftime('%H:%M'), title=program.program_title) if program.airing: title = '[B]{title}[/B]'.format(title=title) if program.video_url: path = kodiutils.url_for('play_from_page', channel=channel, page=quote(program.video_url, safe='')) else: path = kodiutils.url_for('play_catalog', uuid='') title = '[COLOR gray]' + title + '[/COLOR]' stream_dict = STREAM_DICT.copy() stream_dict.update({ 'duration': program.duration, }) info_dict = { 'title': title, 'plot': program.description, 'studio': program.channel, 'duration': program.duration, 'tvshowtitle': program.program_title, 'season': program.season, 'episode': program.number, 'mediatype': 'episode', } listing.append( TitleItem(title=title, path=path, art_dict={ 'thumb': program.thumb, }, info_dict=info_dict, stream_dict=stream_dict, context_menu=context_menu, is_playable=True)) kodiutils.show_listing(listing, 30013, content='episodes', sort=['unsorted'])
def show_channel(self, channel_id): """ Shows TV channel details. :param str channel_id: The channel we want to display. """ channel = self._channel_api.get_asset(channel_id.split(':')[0]) # Verify PIN if channel.pin and kodiutils.get_setting_int( 'interface_adult') != SETTINGS_ADULT_ALLOW: pin = kodiutils.get_numeric_input( kodiutils.localize(30204)) # Enter PIN if not pin: # Cancelled kodiutils.end_of_directory() return if not self._channel_api.verify_pin(pin): kodiutils.ok_dialog(message=kodiutils.localize( 30205)) # The PIN you have entered is invalid! kodiutils.end_of_directory() return listing = [] # Play live live_titleitem = Menu.generate_titleitem_channel(channel) live_titleitem.info_dict['title'] = kodiutils.localize( 30051, channel=channel.title) # Watch live [B]{channel}[/B] listing.append(live_titleitem) # Restart currently airing program if channel.epg_now and channel.epg_now.restart: restart_titleitem = Menu.generate_titleitem_program( channel.epg_now) restart_titleitem.info_dict['title'] = kodiutils.localize( 30052, program=channel.epg_now.title) # Restart [B]{program}[/B] restart_titleitem.art_dict['thumb'] = 'DefaultInProgressShows.png' listing.append(restart_titleitem) # TV Guide listing.append( TitleItem( title=kodiutils.localize( 30053, channel=channel.title), # TV Guide for {channel} path=kodiutils.url_for('show_channel_guide', channel_id=channel_id), art_dict=dict(icon='DefaultAddonTvInfo.png', ), info_dict=dict( plot=kodiutils.localize( 30054, channel=channel.title ), # Browse the TV Guide for {channel} ), )) if channel.replay: listing.append( TitleItem( title=kodiutils.localize( 30055, channel=channel.title), # Catalog for {channel} path=kodiutils.url_for('show_channel_replay', channel_id=channel_id), art_dict=dict(icon='DefaultMovieTitle.png', ), info_dict=dict( plot=kodiutils.localize( 30056, channel=channel.title ), # Browse the Catalog for {channel} ), )) kodiutils.show_listing(listing, 30007)
def generate_titleitem(cls, item, progress=False): """ Generate a TitleItem based on a Movie, Program or Episode. :type item: Union[Movie, Program, Episode] :type progress: bool :rtype TitleItem """ art_dict = { 'poster': item.poster, 'landscape': item.thumb, 'thumb': item.thumb, 'fanart': item.fanart, } info_dict = { 'title': item.name, 'plot': cls.format_plot(item), # 'studio': CHANNELS.get(item.channel, {}).get('studio_icon'), 'mpaa': ', '.join(item.legal) if hasattr(item, 'legal') and item.legal else kodiutils.localize(30216), # All ages } prop_dict = {} # # Movie # if isinstance(item, Movie): if item.my_list: context_menu = [( kodiutils.localize(30101), # Remove from My List 'Container.Update(%s)' % kodiutils.url_for('mylist_del', video_type=CONTENT_TYPE_MOVIE, content_id=item.movie_id) )] else: context_menu = [( kodiutils.localize(30100), # Add to My List 'Container.Update(%s)' % kodiutils.url_for('mylist_add', video_type=CONTENT_TYPE_MOVIE, content_id=item.movie_id) )] info_dict.update({ 'mediatype': 'movie', 'duration': item.duration, 'year': item.year, 'aired': item.aired, }) stream_dict = { 'codec': 'h264', 'duration': item.duration, 'height': 1080, 'width': 1920, } if item.available: title = item.name else: title = item.name + ' [COLOR=red](S+)[/COLOR]' info_dict.update({ 'title': title, }) return TitleItem( title=title, path=kodiutils.url_for('play', category='movies', item=item.movie_id), art_dict=art_dict, info_dict=info_dict, stream_dict=stream_dict, prop_dict=prop_dict, context_menu=context_menu, is_playable=True, ) # # Program # if isinstance(item, Program): if item.my_list: context_menu = [( kodiutils.localize(30101), # Remove from My List 'Container.Update(%s)' % kodiutils.url_for('mylist_del', video_type=CONTENT_TYPE_PROGRAM, content_id=item.program_id) )] else: context_menu = [( kodiutils.localize(30100), # Add to My List 'Container.Update(%s)' % kodiutils.url_for('mylist_add', video_type=CONTENT_TYPE_PROGRAM, content_id=item.program_id) )] info_dict.update({ 'mediatype': 'tvshow', 'season': len(item.seasons), }) return TitleItem( title=item.name, path=kodiutils.url_for('show_catalog_program', program=item.program_id), art_dict=art_dict, info_dict=info_dict, prop_dict=prop_dict, context_menu=context_menu, ) # # Episode # if isinstance(item, Episode): context_menu = [] if item.program_id: context_menu = [( kodiutils.localize(30102), # Go to Program 'Container.Update(%s)' % kodiutils.url_for('show_catalog_program', program=item.program_id) )] info_dict.update({ 'mediatype': 'episode', 'tvshowtitle': item.program_name, 'duration': item.duration, 'season': item.season, 'episode': item.number, 'set': item.program_name, 'aired': item.aired, }) if progress and item.watched: info_dict.update({ 'playcount': 1, }) stream_dict = { 'codec': 'h264', 'duration': item.duration, 'height': 1080, 'width': 1920, } # Add progress info if progress and not item.watched and item.progress: prop_dict.update({ 'ResumeTime': item.progress, 'TotalTime': item.progress + 1, }) return TitleItem( title=info_dict['title'], path=kodiutils.url_for('play', category='episodes', item=item.episode_id), art_dict=art_dict, info_dict=info_dict, stream_dict=stream_dict, prop_dict=prop_dict, context_menu=context_menu, is_playable=True, ) raise Exception('Unknown video_type')
def generate_titleitem_program(cls, item, timeline=False): """ Generate a TitleItem. :param resources.lib.solocoo.util.Program item: The Program to convert to a TitleItem. :param boolean timeline: Indicates that this TitleItem will be used in a timeline. :returns: A generated TitleItem for a Program. :rtype: TitleItem """ title = item.title if item.season and item.episode: title += ' (S%02dE%02d)' % (int(item.season), int(item.episode)) elif item.episode: title += ' (E%02d)' % int(item.episode) # Prepend a time when used in an EPG view if timeline: title = '{time} - {title}'.format( time=item.start.strftime('%H:%M'), title=title, ) # Gray out unavailable programs if not item.replay or item.available is False: title = '[COLOR gray]' + title + '[/COLOR]' return TitleItem( title=title, path=kodiutils.url_for('play_asset', asset_id=item.uid), art_dict={ 'cover': item.cover, 'icon': item.preview or item.cover, 'thumb': item.preview or item.cover, 'fanart': item.preview or item.cover, }, info_dict={ 'tvshowtitle': item.title, 'title': title, 'plot': cls._format_program_plot(item), 'season': item.season, 'episode': item.episode, 'mpaa': item.age, 'mediatype': 'episode', 'aired': item.start.strftime('%Y-%m-%d'), 'date': item.start.strftime('%d.%m.%Y'), 'duration': item.duration, 'cast': [(credit.person, credit.character) for credit in item.credit if credit.role == Credit.ROLE_ACTOR] + [ credit.person for credit in item.credit if credit.role in [Credit.ROLE_PRESENTER, Credit.ROLE_GUEST] ], 'director': [ credit.person for credit in item.credit if credit.role in [Credit.ROLE_DIRECTOR, Credit.ROLE_PRODUCER] ], # 'credits': [credit.person for credit in item.credit if credit.role in [Credit.ROLE_COMPOSER]], }, prop_dict={ 'inputstream.adaptive.play_timeshift_buffer': 'true', # Play from the beginning 'inputstream.adaptive.manifest_update_parameter': 'full', }, is_playable=True, )
def generate_titleitem(item): """ Generate a TitleItem based on a Program or Episode. :type item: Union[Program, Episode] :rtype TitleItem """ art_dict = { 'thumb': item.cover, 'cover': item.cover, 'fanart': item.background or item.cover, } info_dict = { 'title': item.title, 'plot': item.description, 'studio': CHANNELS.get(item.channel, {}).get('studio_icon'), 'aired': item.aired.strftime('%Y-%m-%d') if item.aired else None, } prop_dict = {} # # Program # if isinstance(item, Program): info_dict.update({ 'mediatype': None, 'season': len(item.seasons) if item.seasons else None, }) if isinstance(item.episodes, list) and not item.episodes: # We know that we don't have episodes title = '[COLOR gray]' + item.title + '[/COLOR]' else: # We have episodes, or we don't know it title = item.title return TitleItem(title=title, path=kodiutils.url_for('show_catalog_program', channel=item.channel, program=item.path), art_dict=art_dict, info_dict=info_dict) # # Episode # if isinstance(item, Episode): info_dict.update({ 'mediatype': 'episode', 'tvshowtitle': item.program_title, 'duration': item.duration, 'season': item.season, 'episode': item.number, }) stream_dict = STREAM_DICT.copy() stream_dict.update({ 'duration': item.duration, }) if item.path: try: # Python 3 from urllib.parse import quote except ImportError: # Python 2 from urllib import quote # We don't have an UUID, and first need to fetch the video information from the page path = kodiutils.url_for('play_from_page', channel=item.channel, page=quote(item.path, safe='')) else: # We have an UUID and can play this item directly # This is not preferred since we will lack metadata path = kodiutils.url_for('play_catalog', uuid=item.uuid) return TitleItem(title=info_dict['title'], path=path, art_dict=art_dict, info_dict=info_dict, stream_dict=stream_dict, prop_dict=prop_dict, is_playable=True) raise Exception('Unknown video_type')
def show_mainmenu(self): """ Show the main menu. """ listing = [] account = self._auth.get_tokens() if account.product == PRODUCT_STREAMZ: listing.append(TitleItem( title=kodiutils.localize(30015), # Recommendations path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_MAIN), art_dict=dict( icon='DefaultFavourites.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30016), ), )) listing.append(TitleItem( title=kodiutils.localize(30003), # Movies path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_MOVIES), art_dict=dict( icon='DefaultMovies.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30004), ), )) listing.append(TitleItem( title=kodiutils.localize(30005), # Series path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_SERIES), art_dict=dict( icon='DefaultTVShows.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30006), ), )) listing.append(TitleItem( title=kodiutils.localize(30021), # Kids path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_KIDS), art_dict=dict( icon='DefaultFavourites.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30022), ), )) elif account.product == PRODUCT_STREAMZ_KIDS: listing.append(TitleItem( title=kodiutils.localize(30015), # Recommendations path=kodiutils.url_for('show_recommendations', storefront=STOREFRONT_MAIN_KIDS), art_dict=dict( icon='DefaultFavourites.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30016), ), )) if kodiutils.get_setting_bool('interface_show_mylist'): listing.append(TitleItem( title=kodiutils.localize(30017), # My List path=kodiutils.url_for('show_mylist'), art_dict=dict( icon='DefaultPlaylist.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30018), ), )) if kodiutils.get_setting_bool('interface_show_continuewatching'): listing.append(TitleItem( title=kodiutils.localize(30019), # Continue watching path=kodiutils.url_for('show_continuewatching'), art_dict=dict( icon='DefaultInProgressShows.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30020), ), )) listing.append(TitleItem( title=kodiutils.localize(30009), # Search path=kodiutils.url_for('show_search'), art_dict=dict( icon='DefaultAddonsSearch.png', fanart=kodiutils.get_addon_info('fanart'), ), info_dict=dict( plot=kodiutils.localize(30010), ), )) kodiutils.show_listing(listing, sort=['unsorted'])
def show_program(self, channel, program_id): """ Show a program from the catalog :type channel: str :type program_id: str """ try: program = self._api.get_program( channel, program_id, cache=CACHE_PREVENT ) # Use CACHE_PREVENT since we want fresh data except UnavailableException: kodiutils.ok_dialog(message=kodiutils.localize( 30717)) # This program is not available in the catalogue. kodiutils.end_of_directory() return if not program.episodes: kodiutils.ok_dialog(message=kodiutils.localize( 30717)) # This program is not available in the catalogue. kodiutils.end_of_directory() return # Go directly to the season when we have only one season if len(program.seasons) == 1: self.show_program_season(channel, program_id, list(program.seasons.values())[0].uuid) return studio = CHANNELS.get(program.channel, {}).get('studio_icon') listing = [] # Add an '* All seasons' entry when configured in Kodi if kodiutils.get_global_setting('videolibrary.showallitems') is True: listing.append( TitleItem( title='* %s' % kodiutils.localize(30204), # * All seasons path=kodiutils.url_for('show_catalog_program_season', channel=channel, program=program_id, season='-1'), art_dict={ 'fanart': program.background, }, info_dict={ 'tvshowtitle': program.title, 'title': kodiutils.localize(30204), # All seasons 'plot': program.description, 'set': program.title, 'studio': studio, })) # Add the seasons for season in list(program.seasons.values()): listing.append( TitleItem( title=season. title, # kodiutils.localize(30205, season=season.number), # Season {season} path=kodiutils.url_for('show_catalog_program_season', channel=channel, program=program_id, season=season.uuid), art_dict={ 'fanart': program.background, }, info_dict={ 'tvshowtitle': program.title, 'title': kodiutils.localize( 30205, season=season.number), # Season {season} 'plot': season.description, 'set': program.title, 'studio': studio, })) # Sort by label. Some programs return seasons unordered. kodiutils.show_listing(listing, 30003, content='tvshows')