def _parse_program_data(data):
        """ Parse the Program JSON.
        :type data: dict
        :rtype Program
        """
        # Create Program info
        program = Program(
            uuid=data.get('id'),
            path=data.get('link').lstrip('/'),
            channel=data.get('pageInfo').get('brand'),
            title=data.get('title'),
            description=html_to_kodi(data.get('description')),
            aired=datetime.fromtimestamp(
                data.get('pageInfo', {}).get('publishDate', 0.0)),
            poster=data.get('images').get('poster'),
            thumb=data.get('images').get('teaser'),
            fanart=data.get('images').get('teaser'),
        )

        # Create Season info
        program.seasons = {
            key: Season(
                uuid=playlist.get('id'),
                path=playlist.get('link').lstrip('/'),
                channel=playlist.get('pageInfo').get('brand'),
                title=playlist.get('title'),
                description=html_to_kodi(playlist.get('description')),
                number=playlist.get('episodes')[0].get(
                    'seasonNumber'),  # You did not see this
            )
            for key, playlist in enumerate(data.get('playlists', []))
            if playlist.get('episodes')
        }

        # Create Episodes info
        program.episodes = [
            ContentApi._parse_episode_data(episode, playlist.get('id'))
            for playlist in data.get('playlists', [])
            for episode in playlist.get('episodes')
        ]

        return program
    def _parse_episode_data(data, season_uuid=None):
        """ Parse the Episode JSON.
        :type data: dict
        :type season_uuid: str
        :rtype Episode
        """

        if data.get('episodeNumber'):
            episode_number = data.get('episodeNumber')
        else:
            # The episodeNumber can be absent
            match = re.compile(r'\d+$').search(data.get('title'))
            if match:
                episode_number = match.group(0)
            else:
                episode_number = None

        episode = Episode(
            uuid=data.get('videoUuid'),
            nodeid=data.get('pageInfo', {}).get('nodeId'),
            path=data.get('link').lstrip('/'),
            channel=data.get('pageInfo', {}).get('site'),
            program_title=data.get('program', {}).get('title')
            if data.get('program') else data.get('title'),
            title=data.get('title'),
            description=html_to_kodi(data.get('description')),
            thumb=data.get('image'),
            duration=data.get('duration'),
            season=data.get('seasonNumber'),
            season_uuid=season_uuid,
            number=episode_number,
            aired=datetime.fromtimestamp(data.get('createdDate')),
            expiry=datetime.fromtimestamp(data.get('unpublishDate'))
            if data.get('unpublishDate') else None,
            rating=data.get('parentalRating'),
            stream=data.get('path'),
        )
        return episode
    def _extract_videos(html):
        """ Extract videos from HTML code
        :type html: str
        :rtype list[Episode]
        """
        # Item regexes
        regex_item = re.compile(
            r'<a[^>]+?href="(?P<path>[^"]+)"[^>]+?>.*?</a>', re.DOTALL)

        regex_episode_program = re.compile(
            r'<h3 class="episode-teaser__subtitle">([^<]*)</h3>')
        regex_episode_title = re.compile(
            r'<(?:div|h3) class="(?:poster|card|image|episode)-teaser__title">(?:<span>)?([^<]*)(?:</span>)?</(?:div|h3)>'
        )
        regex_episode_duration = re.compile(r'data-duration="([^"]*)"')
        regex_episode_video_id = re.compile(r'data-video-id="([^"]*)"')
        regex_episode_image = re.compile(r'data-background-image="([^"]*)"')
        regex_episode_badge = re.compile(
            r'<div class="(?:poster|card|image|episode)-teaser__badge badge">([^<]*)</div>'
        )

        # Extract items
        episodes = []
        for item in regex_item.finditer(html):
            item_html = item.group(0)
            path = item.group('path')

            # Extract title
            try:
                title = unescape(
                    regex_episode_title.search(item_html).group(1))
            except AttributeError:
                continue

            # This is not a video
            if not path.startswith('/video'):
                continue

            try:
                episode_program = regex_episode_program.search(
                    item_html).group(1)
            except AttributeError:
                _LOGGER.warning('Found no episode_program for %s', title)
                episode_program = None

            try:
                episode_duration = int(
                    regex_episode_duration.search(item_html).group(1))
            except AttributeError:
                _LOGGER.warning('Found no episode_duration for %s', title)
                episode_duration = None

            try:
                episode_video_id = regex_episode_video_id.search(
                    item_html).group(1)
            except AttributeError:
                _LOGGER.warning('Found no episode_video_id for %s', title)
                episode_video_id = None

            try:
                episode_image = unescape(
                    regex_episode_image.search(item_html).group(1))
            except AttributeError:
                _LOGGER.warning('Found no episode_image for %s', title)
                episode_image = None

            try:
                episode_badge = unescape(
                    regex_episode_badge.search(item_html).group(1))
            except AttributeError:
                episode_badge = None

            description = title
            if episode_badge:
                description += "\n\n[B]%s[/B]" % episode_badge

            # Episode
            episodes.append(
                Episode(
                    path=path.lstrip('/'),
                    channel='',  # TODO
                    title=title,
                    description=html_to_kodi(description),
                    duration=episode_duration,
                    uuid=episode_video_id,
                    thumb=episode_image,
                    program_title=episode_program,
                ))

        return episodes