def root(self): if control.is_globosat_available() or control.is_globoplay_available( ) or control.is_oiplay_available() or control.is_tntplay_available(): self.add_directory_item(32001, 'liveChannels', 'live.png', 'live.png') if control.is_globosat_available( ) or control.is_globoplay_available(): self.add_directory_item(32002, 'vodChannels', 'ondemand.png', 'ondemand.png') else: self.add_directory_item(32005, 'settings', 'tools.png', 'tools.png') if control.is_globosat_available(): self.add_directory_item(32080, 'featured', 'featured.png', 'featured.png') self.add_directory_item(32090, 'favorites', 'favorites.png', 'favorites.png') self.add_directory_item(32095, 'watchlater', 'userlists.png', 'userlists.png') self.add_directory_item(32096, 'watchhistory', 'years.png', 'years.png') if control.is_globosat_available() or control.is_globoplay_available(): self.add_directory_item(32010, 'searchMenu', 'search.png', 'search.png') # control.addSortMethod(int(sys.argv[1]), control.SORT_METHOD_LABEL_IGNORE_FOLDERS) control.content(syshandle, 'files') self.end_directory()
def get_channels(self): live = [] threads = [] if control.is_globoplay_available(): threads.append(workers.Thread(self.append_result, globoplay.Indexer().get_live_channels, live)) if control.is_globosat_available(): threads.append(workers.Thread(self.append_result, globosat.Indexer().get_live, live)) if control.show_adult_content: threads.append(workers.Thread(self.append_result, sexyhotplay.Indexer().get_live_channels, live)) if control.is_oiplay_available(): threads.append(workers.Thread(self.append_result, oiplay.get_live_channels, live)) if control.is_tntplay_available(): threads.append(workers.Thread(self.append_result, tntplay.get_live_channels, live)) if control.is_nowonline_available(): threads.append(workers.Thread(self.append_result, netnow.get_live_channels, live)) [i.start() for i in threads] [i.join() for i in threads] live = sorted(live, key=lambda k: k['sorttitle']) # live = sorted(live, key=lambda k: '1' if 'isFolder' in k and k['isFolder'] == 'true' else '0') live = sorted(live, key=lambda k: k['dateadded'] if 'dateadded' in k else None, reverse=True) # shuffle(live) self.channel_directory(live) return live
def get_channels(): live = [] threads = [] if control.is_globoplay_available(): threads.append(workers.Thread(globoplay.get_live_channels)) if control.is_globosat_available(): threads.append(workers.Thread(globosat.get_live_channels)) if control.show_adult_content: threads.append(workers.Thread(sexyhotplay.get_broadcast)) if control.is_oiplay_available(): threads.append(workers.Thread(oiplay.get_live_channels)) if control.is_tntplay_available(): threads.append(workers.Thread(tntplay.get_live_channels)) if control.is_nowonline_available(): threads.append(workers.Thread(netnow.get_live_channels)) if control.is_sbt_available(): threads.append(workers.Thread(sbt.get_live_channels)) if control.is_pluto_available(): threads.append(workers.Thread(pluto.get_live_channels)) [i.start() for i in threads] [i.join() for i in threads] [live.extend(i.get_result()) for i in threads if i.get_result()] control.log(live) for channel in live: channel.update({ 'sort': [ control.SORT_METHOD_DATEADDED, (control.SORT_METHOD_LABEL_IGNORE_FOLDERS, '%U'), (control.SORT_METHOD_VIDEO_SORT_TITLE, '%U'), (control.SORT_METHOD_STUDIO, '%L') ], 'overlay': 4, 'playcount': 0, 'content': 'tvshows', # 'content': 'tvshows', # content: files, songs, artists, albums, movies, tvshows, episodes, musicvideos 'mediatype': 'episode', # 'mediatype': "video", "movie", "tvshow", "season", "episode" or "musicvideo" }) properties = channel.get('properties', {}) if not properties: channel['properties'] = properties properties.update({'ResumeTime': 0.0}) return live
def get_channels(self): live = [] threads = [] if control.is_globoplay_available(): threads.append( workers.Thread(self.append_result, globoplay.Indexer().get_live_channels, live)) if control.is_globosat_available(): threads.append( workers.Thread(self.append_result, globosat.Indexer().get_live, live)) threads.append( workers.Thread(self.append_result, futuraplay.get_live_channels, live)) [i.start() for i in threads] [i.join() for i in threads] # live.append({ # 'slug': 'bandnews', # 'name': 'Bandnews', # 'title': 'Bandnews', # 'sorttitle': 'Bandnews', # 'logo': os.path.join(control.artPath(), 'logo_bandnews.png'), # # 'clearlogo': os.path.join(control.artPath(), 'logo_bandnews.png'), # 'color': None, # 'fanart': os.path.join(control.artPath(), 'fanart_bandnews.jpg'), # 'thumb': None, # 'playable': 'true', # 'plot': None, # 'id': -1, # 'channel_id': -1, # 'duration': None, # 'url': 'http://evcv.mm.uol.com.br:1935/band/bandnews/playlist.m3u8' # }) # control.addSortMethod(int(sys.argv[1]), control.SORT_METHOD_LABEL_IGNORE_FOLDERS) live = sorted(live, key=lambda k: k['sorttitle']) live = sorted(live, key=lambda k: '1' if 'isFolder' in k and k['isFolder'] == 'true' else '0') live = sorted(live, key=lambda k: k['dateadded'] if 'dateadded' in k else None, reverse=True) # shuffle(live) self.channel_directory(live) return live
def __get_vod_channels(self): channels = [] if control.is_globosat_available(): channels += globosat.Indexer().get_vod() if control.is_globoplay_available(): channels += globoplay.Indexer().get_vod() channels = sorted(channels, key=lambda k: k['name']) return channels
def root(): if control.is_live_available(): handler = live.__name__ method = 'get_channels' yield add_directory_item(handler, method, 32001, 'live.png') if control.is_vod_available(): handler = vod.__name__ method = 'get_vod_channels_directory' yield add_directory_item(handler, method, 32002, 'ondemand.png') if not control.is_live_available() and not control.is_vod_available(): handler = __name__ method = 'open_settings' yield add_directory_item(handler, method, 32005, 'tools.png') if control.is_globosat_available() or control.is_globoplay_available( ) or control.is_telecine_available() or control.is_oiplay_available( ) or control.is_nowonline_available() or control.is_tntplay_available(): handler = __name__ method = 'search' yield add_directory_item(handler, method, 32010, 'search.png')
def root(self): self.addDirectoryItem(32001, 'liveChannels', 'live.png', 'DefaultLive.png') self.addDirectoryItem(32002, 'vodChannels', 'ondemand.png', 'DefaultOnDemand.png') if control.is_globosat_available(): self.addDirectoryItem(32080, 'featured', 'featured.png', 'DefaultMovies.png') self.addDirectoryItem(32090, 'favorites', 'favorites.png', 'DefaultMovies.png') self.addDirectoryItem(32095, 'watchlater', 'userlists.png', 'DefaultMovies.png') self.addDirectoryItem(32096, 'watchhistory', 'years.png', 'DefaultMovies.png') self.addDirectoryItem(32010, 'searchMenu', 'search.png', 'DefaultMovies.png') # control.addSortMethod(int(sys.argv[1]), control.SORT_METHOD_LABEL_IGNORE_FOLDERS) control.content(syshandle, 'files') self.endDirectory()
def get_vod_channels_directory(): channels = [] if control.is_globosat_available(): channels.extend(globosat.get_authorized_channels()) if control.show_adult_content: channels.extend(sexyhot.get_channels()) if control.is_globoplay_available(): channels.extend(globoplay.get_globoplay_channels()) if control.is_tntplay_available(): channels.extend(tnt_vod.get_channels()) if control.is_nowonline_available(): channels.extend(netnow.get_channels()) if control.is_telecine_available(): channels.extend(telecine.get_channels()) if control.is_oiplay_available(): channels.extend(oiplay.get_channels()) if control.is_pluto_available(): channels.extend(pluto.get_channels()) if not control.show_adult_content: channels = [ channel for channel in channels if not channel.get("adult", False) ] for channel in channels: channel.update({'sort': control.SORT_METHOD_LABEL}) yield channel
def search(self, q, page=1): results = [] threads = [] if control.is_globoplay_available(): threads.append( workers.Thread(self.add_search_results, globoplay.Indexer().search, results, q, page)) if control.is_globosat_available(): threads.append( workers.Thread(self.add_search_results, globosat.Indexer().search, results, q, page)) [i.start() for i in threads] [i.join() for i in threads] sysaddon = sys.argv[0] syshandle = int(sys.argv[1]) refreshMenu = control.lang(32072).encode('utf-8') results = sorted(results, key=lambda k: k['brplayprovider'] if 'brplayprovider' in k else '') for result in results: label = result['label'] meta = { 'id': result['id'], 'title': result['title'], 'plot': result['plot'], 'duration': result['duration'], 'thumb': result['thumb'], 'fanart': result['fanart'], 'mediatype': 'episode' } meta.update({'mediatype': 'video'}) meta.update({'overlay': 6}) meta.update({'title': label}) meta.update({'live': False}) if 'tvshowtitle' in result: meta.update({'tvshowtitle': result['tvshowtitle']}) sysmeta = urllib.quote_plus(json.dumps(meta)) provider = result[ 'brplayprovider'] if 'brplayprovider' in result else 'globoplay' url = '%s?action=playvod&provider=%s&id_globo_videos=%s&meta=%s' % ( sysaddon, provider, result['id'], sysmeta) item = control.item(label=label) fanart = meta['fanart'] if 'fanart' in meta else GLOBO_FANART clearlogo = meta['clearlogo'] if 'clearlogo' in meta else None art = { 'thumb': result['thumb'], 'fanart': fanart, 'clearlogo': clearlogo } item.setProperty('Fanart_Image', fanart) if 'duration' in meta: duration = float(meta['duration']) if 'duration' in meta else 0 duration = duration * 1000.0 item.setProperty('totaltime', str(duration)) item.setArt(art) item.setProperty('IsPlayable', "true") item.setInfo(type='video', infoLabels=meta) cm = [(refreshMenu, 'RunPlugin(%s?action=refresh)' % sysaddon)] item.addContextMenuItems(cm) # item.setMimeType("application/vnd.apple.mpegurl") control.addItem(handle=syshandle, url=url, listitem=item, isFolder=False) # if next_page: # label = 'Next Page (%s/%s)' % (nextpage, total_pages) # 34004 = "More Videos" label = control.lang(34004).encode('utf-8') meta = {} meta.update({'mediatype': 'video'}) meta.update({'overlay': 6}) meta.update({'title': label}) url = '%s?action=search&q=%s&provider=%s&page=%s' % ( sysaddon, q, 'globoplay', int(page) + 1) item = control.item(label=label) art = {'icon': NEXT_ICON, 'thumb': NEXT_ICON} # item.setProperty('Fanart_Image', GLOBO_FANART) item.setArt(art) item.setProperty('IsPlayable', "false") item.setInfo(type='video', infoLabels=meta) control.addItem(handle=syshandle, url=url, listitem=item, isFolder=True) control.content(syshandle, 'episodes') control.directory(syshandle, cacheToDisc=True)
def search(query, page=1): if not query: yield control.run_plugin_url() return print('[BRplay] - search: %s | %s' % (query, page)) threads = [] if control.is_globoplay_available(): threads.append( workers.Thread(convert_to_list, globoplay.search, query, page)) if control.is_globosat_available(): threads.append( workers.Thread(convert_to_list, globosat.search, query, page)) if control.is_telecine_available(): threads.append( workers.Thread(convert_to_list, telecine.search, query, page)) if control.is_oiplay_available(): threads.append( workers.Thread(convert_to_list, oiplay.search, query, page)) if control.is_nowonline_available(): threads.append( workers.Thread(convert_to_list, netnow.search, query, page)) if control.is_tntplay_available(): threads.append( workers.Thread(convert_to_list, tnt_vod.search, query, page)) [i.start() for i in threads] [i.join() for i in threads] random.shuffle(threads) all_results = (thread.get_result() for thread in threads) control.log(all_results) combined = list(roundrobin(*all_results)) # combined = chain(*all_results) has_next_page = False if not combined: control.okDialog(line1=control.lang(34141).encode('utf-8'), heading=control.lang(32010).encode('utf-8')) yield control.run_plugin_url() return rank = 1 for result in combined: if result.get('page'): has_next_page = True continue result.update({ 'sort': [(control.SORT_METHOD_UNSORTED, '%U'), control.SORT_METHOD_STUDIO], # 'sort': [(control.SORT_METHOD_TRACKNUM, '%U'), control.SORT_METHOD_STUDIO, (control.SORT_METHOD_LABEL_IGNORE_FOLDERS, '%U')], 'tracknumber': rank, 'sorttitle': '%04d' % (rank, ), 'content': 'episodes', 'mediatype': 'video' }) rank += 1 yield result if has_next_page: yield { 'handler': __name__, 'method': 'search', 'query': query, 'page': page + 1, 'label': '%s (%s)' % (control.lang(34136).encode('utf-8'), page + 1), 'art': { 'poster': control.addonNext(), 'fanart': control.addonFanart() }, 'properties': { 'SpecialSort': 'bottom' } }
def get_globo_americas(): is_globosat_available = control.is_globosat_available() headers = { "Accept-Encoding": "gzip", "User-Agent": "Globo Play/0 (iPhone)", "x-tenant-id": "globo-play-us", 'x-platform-id': 'web', 'x-device-id': 'desktop', 'x-client-version': '0.4.3' } now = datetime.datetime.utcnow() + datetime.timedelta( hours=control.get_current_brasilia_utc_offset()) date = now.strftime('%Y-%m-%d') variables = urllib.quote_plus('{{"date":"{}"}}'.format(date)) query = 'query%20getEpgBroadcastList%28%24date%3A%20Date%21%29%20%7B%0A%20%20broadcasts%20%7B%0A%20%20%20%20...broadcastFragment%0A%20%20%7D%0A%7D%0Afragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20mediaId%0A%20%20media%20%7B%0A%20%20%20%20serviceId%0A%20%20%20%20headline%0A%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20availableFor%0A%20%20%20%20title%20%7B%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20headline%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20transmissionId%0A%20%20geofencing%0A%20%20geoblocked%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20color%0A%20%20%20%20name%0A%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%7D%0A%20%20epgByDate%28date%3A%20%24date%29%20%7B%0A%20%20%20%20entries%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20description%0A%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20tags%0A%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20alternativeTime%0A%20%20%20%20%20%20title%7B%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20originProgramId%0A%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20directorsNames%0A%20%20%20%20%20%20%20%20castNames%0A%20%20%20%20%20%20%20%20genresNames%0A%20%20%20%20%20%20%20%20authorsNames%0A%20%20%20%20%20%20%20%20screenwritersNames%0A%20%20%20%20%20%20%20%20artDirectorsNames%0A%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20landscape%28scale%3A%20X1080%29%0A%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20poster%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20logo%20%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' url = 'https://jarvis.globo.com/graphql?query={query}&variables={variables}'.format( query=query, variables=variables) control.log('GLOBOPLAY US - GET %s' % url) response = cache.get(requests.get, 24, url, headers=headers, table='globoplay').json() control.log(response) broadcasts = response['data']['broadcasts'] utc_now = int(control.to_timestamp(datetime.datetime.utcnow())) # thumb_usa = 'https://live-thumbs.video.globo.com/glbeua/snapshot/' + str(int(time.time())) result = [] for broadcast in broadcasts: media_id = str(broadcast.get('mediaId', 0)) if is_globosat_available and media_id != str( GLOBO_US_LIVE_SUBSCRIBER_MEDIA_ID): continue epg = next((epg for epg in broadcast['epgByDate']['entries'] if int(epg['startTime']) <= utc_now < int(epg['endTime'])), {}) control.log('EPG: %s' % epg) channel = broadcast.get('channel', {}) or {} logo = channel.get('logo') channel_name = channel.get('name', '').replace( 'TV Globo', 'Globo') + ' USA' # broadcast.get('media', {}).get('headline', '') fanart = broadcast.get('imageOnAir') channel_id = channel.get('id', 0) service_id = broadcast.get('media', {}).get('serviceId', 0) # channel_slug = '%s-americas' % channel.get('name', '').lower().replace(' ', '') duration = epg.get('durationInMinutes', 0) * 60 title_obj = epg.get('title', {}) or {} title = epg.get('name', '') description = title_obj.get('description') or epg.get( 'description', '') fanart = (title_obj.get('cover', {}) or {}).get('landscape', fanart) or fanart poster = (title_obj.get('poster', {}) or {}).get('web') label = '[B]' + channel_name + '[/B]' + ('[I] - ' + title + '[/I]' if title else '') program_datetime = datetime.datetime.utcfromtimestamp( epg.get('startTime', 0)) + util.get_utc_delta() next_start = datetime.datetime.utcfromtimestamp(epg.get( 'endTime', 0)) + util.get_utc_delta() plotoutline = datetime.datetime.strftime( program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime( next_start, '%H:%M') description = '%s | %s' % (plotoutline, description) tags = [plotoutline] if epg.get('liveBroadcast', False): tags.append(control.lang(32004)) tags.extend(epg.get('tags', []) or []) result.append({ 'handler': PLAYER_HANDLER, 'method': 'play_stream', 'IsPlayable': True, 'id': media_id, 'channel_id': channel_id, 'service_id': service_id, 'live': epg.get('liveBroadcast', False) or False, 'livefeed': True, 'label': label, 'title': label, # 'title': title, 'tvshowtitle': title, 'plot': description, # 'plotoutline': plotoutline, # "tagline": plotoutline, 'tag': tags, 'duration': duration, "dateadded": datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'), 'sorttitle': title, 'studio': 'Globoplay Americas', 'year': title_obj.get('releaseYear'), 'country': title_obj.get('countries', []) or [], 'genre': title_obj.get('genresNames', []) or [], 'cast': title_obj.get('castNames', []) or [], 'director': title_obj.get('directorsNames', []) or [], 'writer': title_obj.get('screenwritersNames', []) or [], 'credits': title_obj.get('artDirectorsNames', []) or [], 'mpaa': epg.get('contentRating'), "art": { 'icon': logo, 'clearlogo': logo, 'thumb': fanart, 'fanart': fanart, 'tvshow.poster': poster } }) return result
def get_globo_americas(): GLOBO_AMERICAS_ID = 7832875 is_globosat_available = control.is_globosat_available() headers = { "Accept-Encoding": "gzip", "User-Agent": "Globo Play/0 (iPhone)", "x-tenant-id": "globo-play-us" } now = datetime.datetime.now() date = now.strftime('%Y-%m-%d') variables = urllib.quote_plus('{{"date":"{}"}}'.format(date)) query = 'query%20getEpgBroadcastList%28%24date%3A%20Date%21%29%20%7B%0A%20%20broadcasts%20%7B%0A%20%20%20%20...broadcastFragment%0A%20%20%7D%0A%7D%0Afragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20mediaId%0A%20%20media%20%7B%0A%20%20%20%20serviceId%0A%20%20%20%20headline%0A%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20availableFor%0A%20%20%20%20title%20%7B%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20headline%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20transmissionId%0A%20%20geofencing%0A%20%20geoblocked%0A%20%20channel%20%7B%0A%20%20%20%20id%0A%20%20%20%20color%0A%20%20%20%20name%0A%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%7D%0A%20%20epgByDate%28date%3A%20%24date%29%20%7B%0A%20%20%20%20entries%20%7B%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20description%0A%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20tags%0A%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20alternativeTime%0A%20%20%20%20%20%20title%7B%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20poster%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20landscape%0A%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20logo%20%7B%0A%20%20%20%20%20%20%20%20%20%20web%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20type%0A%20%20%20%20%20%20%20%20format%0A%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' url = 'https://jarvis.globo.com/graphql?query={query}&variables={variables}'.format( query=query, variables=variables) response = client.request(url, headers=headers) broadcasts = response['data']['broadcasts'] items = [] utc_now = control.to_timestamp(datetime.datetime.now()) for broadcast in broadcasts: media_id = str(broadcast.get('mediaId', 0)) if is_globosat_available and media_id != str(GLOBO_AMERICAS_ID): continue epg = next((epg for epg in broadcast['epgByDate']['entries'] if epg['startTime'] <= utc_now < epg['endTime']), {}) channel = broadcast.get('channel', {}) or {} logo = channel.get('logo', None) channel_name = broadcast.get('media', {}).get('headline', '') fanart = broadcast.get('imageOnAir', None) channel_id = channel.get('id', 0) service_id = broadcast.get('media', {}).get('serviceId', 0) channel_slug = '%s-americas' % channel.get('name', '').lower().replace( ' ', '') duration = epg.get('durationInMinutes', 0) * 60 title_obj = epg.get('title', {}) or {} title = epg.get('name', '') description = title_obj.get('description', None) or epg.get( 'description', '') fanart = title_obj.get('cover', {}).get('landscape', fanart) or fanart year = title_obj.get('releaseYear', None) country = [ c.get('name') for c in title_obj.get('countries', []) or [] if 'name' in c and c['name'] ] genres = [ c.get('name') for c in title_obj.get('genres', []) or [] if 'name' in c and c['name'] ] cast = [ c.get('name') for c in title_obj.get('cast', []) or [] if 'name' in c and c['name'] ] director = [ c.get('name') for c in title_obj.get('directors', []) or [] if 'name' in c and c['name'] ] rating = epg.get('contentRating', '') name = ('[B]' if not control.isFTV else '') + channel_name + ( '[/B]' if not control.isFTV else '') + ('[I] - ' + title + '[/I]' if title else '') program_datetime = datetime.datetime.utcfromtimestamp( epg.get('startTime', 0)) + util.get_utc_delta() next_start = datetime.datetime.utcfromtimestamp(epg.get( 'endTime', 0)) + util.get_utc_delta() plotoutline = datetime.datetime.strftime( program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime( next_start, '%H:%M') if not description or len(description) < 3: description = '%s | %s' % (title, plotoutline) if title else plotoutline item = { 'name': name, 'title': title, 'tvshowtitle': title, 'plot': description, 'plotoutline': plotoutline, "tagline": description, 'duration': duration, "dateadded": datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'), 'brplayprovider': 'globoplay', 'logo': logo, 'clearlogo': logo, 'thumb': fanart, 'poster': None, 'fanart': fanart, 'slug': channel_slug, 'sorttitle': channel_name, 'studio': channel_name, 'playable': 'true', 'id': media_id, 'channel_id': channel_id, 'service_id': service_id, 'live': epg.get('liveBroadcast', False) or False, 'year': year, 'country': country, 'genre': genres, 'cast': cast, 'director': director, 'mpaa': rating, 'livefeed': 'false', # force vod player for us channels "mediatype": 'video' # "video", "movie", "tvshow", "season", "episode" or "musicvideo" } items.append(item) return items