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