Esempio n. 1
0
    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'])
Esempio n. 6
0
    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')
Esempio n. 7
0
    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,
            },
        )
Esempio n. 8
0
    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')
Esempio n. 9
0
    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'])
Esempio n. 10
0
    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')
Esempio n. 11
0
    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'])
Esempio n. 12
0
    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
Esempio n. 14
0
    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)
Esempio n. 15
0
    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,
        )
Esempio n. 16
0
    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')
Esempio n. 17
0
    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'])
Esempio n. 18
0
    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')
Esempio n. 19
0
    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')
Esempio n. 20
0
    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'])
Esempio n. 21
0
    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)
Esempio n. 24
0
    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')
Esempio n. 25
0
    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,
        )
Esempio n. 26
0
    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')
Esempio n. 27
0
    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'])
Esempio n. 28
0
    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')