def _get_combate_schedule(self, schedule): globosat_schedule_url = "http://api.simulcast.globosat.tv/combate/?page=%s" headers = { "User-Agent": "GlobosatPlay/142 CFNetwork/811.4.18 Darwin/16.5.0", "Authorization": "Token 59150c4cc6a00f467bf225cf3bf8f44617e27037", "Accept-Encoding": "gzip, deflate" } page = 1 response = client.request(globosat_schedule_url % page, headers=headers) results = response['results'] while response['next'] is not None: page += 1 response = client.request(globosat_schedule_url % page, headers=headers) results += response['results'] for result in results: beginsAt = util.strptime_workaround( result['day'], '%d/%m/%Y %H:%M') + util.get_utc_delta() schedule.append({ "name": result['channel']['title'], "title": result['title'], "description": result['subtitle'], "begins_at": beginsAt.isoformat(), "ends_at": beginsAt + datetime.timedelta(minutes=result['duration']), "id": result['id_midia_live_play'], "program_id": None, "live_poster": None, "thumbnail": result['channel']['url_snapshot'], "thumbnail_hd": result['channel']['url_snapshot'], "fanart": result['thumb_cms'], "color": result['channel']['color'] }) return schedule
def __get_full_day_schedule(today, affiliate='RJ'): url = "https://api.globoplay.com.br/v1/epg/%s/praca/%s?api_key=%s" % (today, affiliate, GLOBOPLAY_APIKEY) headers = {'Accept-Encoding': 'gzip'} slots = client.request(url, headers=headers)['gradeProgramacao']['slots'] result = [] for index, slot in enumerate(slots): cast = None castandrole = None if 'elenco' in slot: try: cast_raw = slot['elenco'].split('||') cast = [c.strip() for c in cast_raw[0].split(',')] if cast_raw is not None and len(cast_raw) > 0 else None if cast_raw is not None and len(cast_raw) > 1 and cast_raw[1].strip().startswith('Elenco de dublagem:'): castandrole_raw = cast_raw[1].strip().split('Elenco de dublagem:') if len(castandrole_raw) > 1: #Dubladores e seus personagens castandrole_raw = castandrole_raw[1].split('Outras Vozes:') castandrole = [(c.strip().split(':')[1].strip(), c.strip().split(':')[0].strip()) for c in castandrole_raw[0].split('/')] if len(castandrole_raw) > 1: #Outros dubladores sem papel definido castandrole = [(c.strip(), 'Outros') for c in castandrole_raw[1].split('/')] except Exception as ex: control.log("ERROR POPULATING CAST: %s" % repr(ex)) pass program_datetime_utc = util.strptime_workaround(slot['data_exibicao_e_horario']) + datetime.timedelta(hours=3) program_datetime = program_datetime_utc + util.get_utc_delta() # program_local_date_string = datetime.datetime.strftime(program_datetime, '%d/%m/%Y %H:%M') title = slot['nome_programa'] if 'nome_programa' in slot else None if slot["tipo"] == "confronto": showtitle = slot['confronto']['titulo_confronto'] + ' - ' + slot['confronto']['participantes'][0]['nome'] + ' X ' + slot['confronto']['participantes'][1]['nome'] else: showtitle = slot['nome'] if 'nome' in slot else None next_start = slots[index+1]['data_exibicao_e_horario'] if index+1 < len(slots) else None next_start = (util.strptime_workaround(next_start) + datetime.timedelta(hours=3) + util.get_utc_delta()) if next_start else datetime.datetime.now() item = { "tagline": slot['chamada'] if 'chamada' in slot else slot['nome'], "closed_caption": slot['closed_caption'], "facebook": slot['facebook'], "twitter": slot['twitter'], "hd": slot['hd'], "id": slot['id'], "id_programa": slot['id_programa'], "id_webmedia": slot['id_webmedia'], "fanart": 'https://s02.video.glbimg.com/x720/%s.jpg' % get_globo_live_id(), "thumb": slot['imagem'], "logo": slot['logo'], "clearlogo": slot['logo'], "poster": slot['poster'] if 'poster' in slot else 'None', "subtitle": slot['nome'], "title": title, "plot": slot['resumo'] if 'resumo' in slot else None, #program_local_date_string + ' - ' + (slot['resumo'] if 'resumo' in slot else showtitle.replace(' - ', '\n') if showtitle and len(showtitle) > 0 else slot['nome_programa']), "plotoutline": datetime.datetime.strftime(program_datetime, '%H:%M') + ' - ' + datetime.datetime.strftime(next_start, '%H:%M'), "mediatype": 'episode' if showtitle and len(showtitle) > 0 else 'video', "genre": slot['tipo_programa'], "datetimeutc": program_datetime_utc, "dateadded": datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'), # 'StartTime': datetime.datetime.strftime(program_datetime, '%H:%M:%S'), # 'EndTime': datetime.datetime.strftime(next_start, '%H:%M:%S'), 'duration': util.get_total_seconds(next_start - program_datetime) } if showtitle and len(showtitle) > 0: item.update({ 'tvshowtitle': showtitle }) if slot['tipo'] == 'filme': item.update({ "originaltitle": slot['titulo_original'] if 'titulo_original' in slot else None, 'genre': slot['genero'] if 'genero' in slot else None, 'year': slot['ano'] if 'ano' in slot else None, 'director': slot['direcao'] if 'direcao' in slot else None }) if cast: item.update({ 'cast': cast }) if castandrole: item.update({ 'castandrole': castandrole, }) result.append(item) return result
def get_videos(page=1): page_size = 24 variables = '{{"id":"7e679166-caa2-457c-a5f3-56ff7ca79a69","page":{page},"perPage":{pagesize}}}' query = '''query getOffer($id: ID!, $page: Int, $perPage: Int) { genericOffer(id: $id) { ... on Offer { id contentType items: paginatedItems(page: $page, perPage: $perPage) { page nextPage perPage hasNextPage resources { ...VideoFragment ...TitleFragment __typename } __typename } __typename } __typename } } fragment VideoFragment on Video { id availableFor headline kind duration formattedDuration thumb liveThumbnail preview originalContent exhibitedAt title { titleId headline slug __typename } channel { id name slug __typename } __typename } fragment TitleFragment on Title { titleId headline slug poster { web __typename } channel { id name slug __typename } __typename }''' # url = 'https://products-jarvis.globo.com/graphql?operationName=getOffer&variables={var}&extensions=%7B%22persistedQuery%22%3A%7B%22version%22%3A1%2C%22sha256Hash%22%3A%22ed91671dc38a0f931c33239fd7b299d9035ea25177c212eb05fd512ab69ee134%22%7D%7D' url = 'https://products-jarvis.globo.com/graphql?query={query}&variables={var}' headers = { 'x-tenant-id': 'sexy-hot', 'x-platform-id': 'web', 'x-device-id': 'desktop', 'x-client-version': '0.4.3', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', 'accept-encoding': 'gzip' } result = client.request(url.format( query=urllib.quote_plus(query), var=urllib.quote_plus(variables.format(page=page, pagesize=page_size))), headers=headers) videos = [] for video in result['data']['genericOffer']['items']['resources']: date = util.strptime(video['exhibitedAt'], '%Y-%m-%dT%H:%M:%SZ') + util.get_utc_delta() videos.append({ 'id_sexyhot': video['id'], 'mediatype': 'movie' if video['kind'] == 'film' else 'episode' if video['kind'] in ['serie', 'episode'] else 'video', 'overlay': 6, 'duration': int(video['duration']) / 1000, 'title': video['headline'], 'plot': '', 'thumb': video['thumb'], 'poster': video['thumb'], 'fanart': os.path.join(artPath, 'fanart_sexyhot.png'), 'dateadded': datetime.datetime.strftime(date, '%Y-%m-%d %H:%M:%S') }) next_page = result['data']['genericOffer']['items']['nextPage'] if result[ 'data']['genericOffer']['items']['hasNextPage'] else None return videos, next_page
def __get_simulcast_data(result): utc_timezone = control.get_current_brasilia_utc_offset() live_text = ' (' + control.lang(32004) + ')' if result['live'] else '' program_date = util.strptime_workaround(result['day'], '%d/%m/%Y %H:%M') + datetime.timedelta(hours=-utc_timezone) + util.get_utc_delta() if not result['day'] is None else datetime.datetime.now() # program_local_date_string = datetime.datetime.strftime(program_date, '%d/%m/%Y %H:%M') # duration_str = (' - ' + str(result['duration'] or 0) + ' minutos') if (result['duration'] or 0) > 0 else '' name = "[B]" + result['channel']['title'] + "[/B]" + ('[I] - ' + (result['title'] or '') + '[/I]' if result['title'] else '') + live_text return { 'slug': result['channel']['title'].lower(), 'studio': result['channel']['title'], 'name': name, 'title': result['subtitle'], 'tvshowtitle': result['title'] if result['title'] else None, 'sorttitle': result['channel']['title'], 'logo': None, 'color': result['channel']['color'], 'fanart': result['thumb_cms'], 'thumb': result['channel']['url_snapshot'] + '?v=' + str(int(time.time())), 'live': result['live'], 'playable': 'true', 'plot': result['subtitle'] or '' if not control.isFTV else ' ', #(result['title'] or '') + ' - ' + (result['subtitle'] or ''), #program_local_date_string + duration_str + '\n' + (result['title'] or '') + '\n' + (result['subtitle'] or ''), 'plotoutline': datetime.datetime.strftime(program_date, '%H:%M') + ' - ' + (datetime.datetime.strftime(program_date + datetime.timedelta(minutes=(result['duration'] or 0)), '%H:%M') if (result['duration'] or 0) > 0 else 'N/A'), # 'programTitle': result['subtitle'], 'id': result['id_midia_live_play'], 'channel_id': result['channel']['id_globo_videos'], 'duration': int(result['duration'] or 0) * 60, # 'tagline': result['subtitle'], # 'date': datetime.datetime.strftime(program_date, '%d.%m.%Y'), # 'aired': datetime.datetime.strftime(program_date, '%Y-%m-%d'), 'dateadded': datetime.datetime.strftime(program_date, '%Y-%m-%d %H:%M:%S'), # 'StartTime': datetime.datetime.strftime(program_date, '%H:%M:%S'), # 'EndTime': datetime.datetime.strftime(program_date + datetime.timedelta(minutes=(result['duration'] or 0)), '%H:%M:%S'), 'brplayprovider': 'globosat' }
def __get_universal_epg(): utc_timezone = control.get_current_brasilia_utc_offset() utc_now = datetime.datetime.today().utcnow() now = utc_now + datetime.timedelta(hours=utc_timezone) epg_url = 'http://ancine.grade.globosat.tv/programada/01253766000140_UniversalChannel%s.csv' % datetime.datetime.strftime(now, '%Y%m%d') # '20180205' epg_csv = cache.get(client.request, 2, epg_url) epg_data = csv.reader(epg_csv.splitlines(), delimiter='\\', quotechar='"') for program in list(epg_data): p_date = program[0] p_start = program[1] p_end = program[2] original_title = program[3] director = program[4] title = program[5] tvshow = program[6] episode = program[7] country = program[8] year = program[9] rating = program[10] plot = program[11] start_time = util.strptime_workaround(p_date + ' ' + p_start, '%Y%m%d %H:%M') - datetime.timedelta(hours=(utc_timezone)) end_time = util.strptime_workaround(p_date + ' ' + p_end, '%Y%m%d %H:%M') - datetime.timedelta(hours=(utc_timezone)) start_hour = p_start.split(':')[0] end_hour = p_end.split(':')[0] if int(end_hour) < int(start_hour): end_time = end_time + datetime.timedelta(days=1) if end_time > utc_now > start_time: studio = 'Universal Channel' return { 'original_title': original_title, 'director': director, 'title': title, 'tvshowtitle': tvshow, 'episode': episode, 'country': country, 'year': year, 'rating': rating, 'plot': plot, 'duration': util.get_total_seconds(end_time - start_time), "dateadded": datetime.datetime.strftime(start_time + util.get_utc_delta(), '%Y-%m-%d %H:%M:%S'), "plotoutline": datetime.datetime.strftime(start_time + util.get_utc_delta(), '%H:%M') + ' - ' + datetime.datetime.strftime(end_time + util.get_utc_delta(), '%H:%M'), } return { 'original_title': None, 'director': None, 'title': None, 'tvshowtitle': None, 'episode': None, 'country': None, 'year': None, 'rating': None, 'plot': None, 'duration': None, "dateadded": None }
def get_premiere_live_24h_channels(): live = [] headers = {'Authorization': GLOBOSAT_API_AUTHORIZATION, 'Accept-Encoding': 'gzip'} live_channels = client.request(PREMIERE_24H_SIMULCAST, headers=headers) studio = 'Premiere Clubes' # control.log("-- PREMIERE CLUBES SIMULCAST: %s" % repr(live_channels)) utc_timezone = control.get_current_brasilia_utc_offset() for channel_data in live_channels: program_date = util.strptime_workaround(channel_data['starts_at'][0:19]) + datetime.timedelta(hours=-utc_timezone) + util.get_utc_delta() if channel_data and 'starts_at' in channel_data and channel_data['starts_at'] is not None else None live_text = ' (' + control.lang(32004) + ')' if channel_data['live'] else '' studio = channel_data['channel']['title'] title = '[B]' + studio + '[/B]' + ('[I] - ' + channel_data['name'] + '[/I]' if channel_data['name'] else '') + live_text live_channel = { 'slug': 'premiere-fc', 'name': title, 'studio': studio, 'title': channel_data['description'], 'tvshowtitle': channel_data['name'], 'sorttitle': studio, 'logo': PREMIERE_LOGO, 'clearlogo': PREMIERE_LOGO, 'fanart': channel_data['image_url'], 'thumb': channel_data['snapshot_url'] + '?v=' + str(int(time.time())), 'playable': 'true', 'plot': channel_data['description'], 'id': int(channel_data['media_globovideos_id']), 'channel_id': int(channel_data['channel']['globovideos_id']), 'duration': int(channel_data['duration'] or 0) / 1000, 'isFolder': 'false', 'live': channel_data['live'], 'livefeed': 'true', 'brplayprovider': 'globosat' } if program_date is not None: live_channel.update({'dateadded': datetime.datetime.strftime(program_date, '%Y-%m-%d %H:%M:%S')}) live.append(live_channel) return live
def get_channel_epg_now(channel): url = 'https://apim.oi.net.br/app/oiplay/ummex/v1/epg/{channel}/beforenowandnext?beforeCount=0&nextCount=0&includeCurrentProgram=true'.format( channel=channel) response = client.request(url) now = response['schedules'][0] program = now['program'] title = program['seriesTitle'] series = u" (S" + str(program['seasonNumber']) + u':E' + str( program['episodeNumber'] ) + u")" if program['programType'] == 'Series' else u'' episode_title = program['title'] + series if 'title' in program and program[ 'title'] != title else '' studio = response['title'] thumb = None fanart = None if 'programImages' in program and len(program['programImages']) > 0: thumb = next(image['url'] for image in program['programImages'] if image['type'] == 'Thumbnail') fanart = next(image['url'] for image in program['programImages'] if image['type'] == 'Backdrop') or thumb thumb = thumb or fanart logo = response['positiveLogoUrl'] cast = [c['name'] for c in program['castMembers']] date = util.strptime(now['startTimeUtc'], '%Y-%m-%dT%H:%M:%SZ') + util.get_utc_delta() return { 'slug': response['callLetter'], 'name': u"[B]" + studio + u"[/B][I] - " + title + (u': ' + episode_title if episode_title else u'') + u"[/I]", 'studio': studio, 'title': episode_title, 'tvshowtitle': title, 'sorttitle': studio, 'thumb': thumb, 'logo': logo, 'clearlogo': logo, 'clearart': logo, 'banner': None, 'color': None, 'fanart': fanart, 'id': response['prgSvcId'], 'channel_id': response['prgSvcId'], 'brplayprovider': 'oiplay', 'playable': 'true', 'livefeed': 'true', 'dateadded': datetime.datetime.strftime(date, '%Y-%m-%d %H:%M:%S'), 'plot': program['synopsis'], 'duration': now['durationSeconds'], 'adult': program['isAdult'], 'cast': cast, 'director': program['directors'], 'genre': program['genres'], 'rating': program['rating'], 'year': program['releaseYear'], 'episode': program['episodeNumber'] if program['episodeNumber'] else None, 'season': program['seasonNumber'] if program['seasonNumber'] else None, "mediatype": 'episode' if program['episodeNumber'] else 'video' }
def get_channel_epg_now(channel): url = 'https://apim.oi.net.br/app/oiplay/ummex/v1/epg/{channel}/beforenowandnext?beforeCount=0&nextCount=0&includeCurrentProgram=true'.format( channel=channel) response = requests.get(url).json() now = response['schedules'][0] program = now['program'] title = program['seriesTitle'] series = u" (S" + str(program['seasonNumber']) + u':E' + str( program['episodeNumber'] ) + u")" if program['programType'] == 'Series' else u'' episode_title = program['title'] + series if 'title' in program and program[ 'title'] != title else '' studio = response['title'] thumb = None fanart = None if 'programImages' in program and len(program['programImages']) > 0: thumb = next((image['url'] for image in program['programImages'] if image['type'] == 'Thumbnail'), None) fanart = next((image['url'] for image in program['programImages'] if image['type'] == 'Backdrop'), thumb) or thumb thumb = thumb or fanart logo = response['positiveLogoUrl'] cast = [c['name'] for c in program['castMembers']] date = util.strptime(now['startTimeUtc'], '%Y-%m-%dT%H:%M:%SZ') + util.get_utc_delta() program_name = title + (u': ' + episode_title if episode_title else u'') stop_time = date + datetime.timedelta( seconds=int(now.get('durationSeconds', 0))) program_time_desc = datetime.datetime.strftime( date, '%H:%M') + ' - ' + datetime.datetime.strftime( stop_time, '%H:%M') tags = [program_time_desc] description = '%s | %s' % (program_time_desc, program['synopsis']) return { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'id': response['prgSvcId'], 'IsPlayable': True, 'livefeed': True, 'label': u"[B]" + studio + u"[/B][I] - " + program_name + u"[/I]", 'title': u"[B]" + studio + u"[/B][I] - " + program_name + u"[/I]", 'studio': 'Oi Play', # 'title': episode_title, 'tvshowtitle': title, 'sorttitle': program_name, 'channel_id': response['prgSvcId'], 'dateadded': datetime.datetime.strftime(date, '%Y-%m-%d %H:%M:%S'), 'plot': description, 'tag': tags, 'duration': now['durationSeconds'], 'adult': program['isAdult'], 'cast': cast, 'director': program['directors'], 'genre': program['genres'], 'rating': program['rating'], 'year': program['releaseYear'], 'episode': program['episodeNumber'] if program['episodeNumber'] else None, 'season': program['seasonNumber'] if program['seasonNumber'] else None, 'art': { 'icon': logo, 'thumb': thumb, 'tvshow.poster': thumb, 'clearlogo': logo, 'fanart': fanart } }
def get_mais_canais(): query = 'query%20getBroadcastList%20%7B%0A%20%20%20%20%20%20broadcasts%20%7B%0A%20%20%20%20%20%20%20%20...broadcastFragment%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20fragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20%20%20%20%20mediaId%0A%20%20%20%20%20%20transmissionId%0A%20%20%20%20%20%20logo%0A%20%20%20%20%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20%20%20%20%20withoutDVRMediaId%0A%20%20%20%20%20%20promotionalMediaId%0A%20%20%20%20%20%20salesPageCallToAction%0A%20%20%20%20%20%20promotionalText%0A%20%20%20%20%20%20geofencing%0A%20%20%20%20%20%20geoblocked%0A%20%20%20%20%20%20ignoreAdvertisements%0A%20%20%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20color%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%20%20%20%20payTvServiceId%0A%20%20%20%20%20%20%20%20payTvUsersMessage%0A%20%20%20%20%20%20%20%20payTvExternalLink%0A%20%20%20%20%20%20%20%20payTvExternalLinkLabel%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20tags%0A%20%20%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20%20%20title%7B%0A%20%20%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%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20landscape%0A%20%20%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20%20%20type%0A%20%20%20%20%20%20%20%20%20%20format%0A%20%20%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20media%20%7B%0A%20%20%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20subscriptionService%20%7B%0A%20%20%20%20%20%20%20%20%20%20faq%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20url%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20salesPage%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20identifier%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D' variables = '{}' response = request_query(query, variables, force_refresh=True) or {} for broadcast in response.get('data', {}).get('broadcasts', []) or []: channel = broadcast.get('channel', {}) or {} if channel.get('id') == '196': continue media_id = str(broadcast.get('mediaId', 0)) epg = next((epg for epg in broadcast.get('epgCurrentSlots', [])), {}) control.log('EPG: %s' % epg) logo = channel.get('logo') channel_name = (broadcast.get('media', {}) or {}).get('headline', '').replace('Agora no ', '').replace( 'Agora na ', '').strip() #channel.get('name', '') 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') thumb = THUMBS.get(str(broadcast.get('transmissionId'))) thumb = (SNAPSHOT_URL.format(transmission=thumb) + '?=' + str(int(time.time()))) if thumb else fanart 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 []) yield { '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', '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': thumb, 'fanart': fanart, 'tvshow.poster': poster } }
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_globoplay_broadcasts(media_id, latitude, longitude): variables = urllib.quote_plus( '{{"mediaId":"{media_id}","coordinates":{"lat":"{lat}", "long": "{long}"}}}' .format(media_id=media_id, lat=latitude, long=longitude)) query = 'query%20Epg%28%24mediaId%3A%20ID%21%2C%20%24coordinates%3A%20CoordinatesData%29%20%7B%0A%20%20broadcast%28mediaId%3A%20%24mediaId%2C%20coordinates%3A%20%24coordinates%29%20%7B%0A%20%20%20%20...broadcastFragment%0A%20%20%7D%0A%7D%0Afragment%20broadcastFragment%20on%20Broadcast%20%7B%0A%20%20%20%20%20%20mediaId%0A%20%20%20%20%20%20transmissionId%0A%20%20%20%20%20%20logo%0A%20%20%20%20%20%20imageOnAir%28scale%3A%20X1080%29%0A%20%20%20%20%20%20withoutDVRMediaId%0A%20%20%20%20%20%20promotionalMediaId%0A%20%20%20%20%20%20salesPageCallToAction%0A%20%20%20%20%20%20promotionalText%0A%20%20%20%20%20%20geofencing%0A%20%20%20%20%20%20geoblocked%0A%20%20%20%20%20%20ignoreAdvertisements%0A%20%20%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20%20%20id%0A%20%20%20%20%20%20%20%20color%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%20%20%20%20payTvServiceId%0A%20%20%20%20%20%20%20%20payTvUsersMessage%0A%20%20%20%20%20%20%20%20payTvExternalLink%0A%20%20%20%20%20%20%20%20payTvExternalLinkLabel%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20affiliateSignal%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20dtvChannel%0A%20%20%20%20%20%20dtvHDID%0A%20%20%20%20%20%20dtvID%0A%20%20%20%20%7D%0A%20%20%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20%20%20description%0A%20%20%20%20%20%20%20%20tags%0A%20%20%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20%20%20title%7B%0A%20%20%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%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20landscape%0A%20%20%20%20%20%20%20%20%20%20%20%20portrait%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20releaseYear%0A%20%20%20%20%20%20%20%20%20%20type%0A%20%20%20%20%20%20%20%20%20%20format%0A%20%20%20%20%20%20%20%20%20%20countries%0A%20%20%20%20%20%20%20%20%20%20directors%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20cast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20genres%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20name%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20media%20%7B%0A%20%20%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20thumb%28size%3A%20720%29%0A%20%20%20%20%20%20%20%20availableFor%0A%20%20%20%20%20%20%20%20title%20%7B%0A%20%20%20%20%20%20%20%20%20%20slug%0A%20%20%20%20%20%20%20%20%20%20headline%0A%20%20%20%20%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20subscriptionService%20%7B%0A%20%20%20%20%20%20%20%20%20%20faq%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20url%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20salesPage%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20identifier%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20default%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D' response = request_query(query, variables) broadcasts = (response.get('data', {}) or {}).get('broadcasts', []) or [] utc_now = int(control.to_timestamp(datetime.datetime.utcnow())) result = [] for broadcast in broadcasts: media_id = str(broadcast.get('mediaId', 0)) 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') # broadcast.get('media', {}).get('headline', '') fanart = broadcast.get('imageOnAir') channel_id = channel.get('id', 0) service_id = broadcast.get('media', {}).get('serviceId', 0) 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') if not description or len(description) < 3: description = '%s | %s' % (title, plotoutline) if title else plotoutline 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, 'duration': duration, "dateadded": datetime.datetime.strftime(program_datetime, '%Y-%m-%d %H:%M:%S'), 'sorttitle': title, 'studio': 'Globoplay', '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
def get_live_channels(): headers = { 'Authorization': get_authorization(), 'Origin': 'https://www.sbt.com.br', 'Accept-Encoding': 'gzip, deflate, br' } br_timezone = pytz.timezone('America/Sao_Paulo') now = datetime.datetime.now(tz=br_timezone) if control.setting('sbt_ignore_dst') == 'true': now = now - br_timezone.localize(datetime.datetime.utcnow()).dst() url = 'https://content.sbt.com.br/api/programschedule?livegrade={date}&operation=le&orderby=startdate&limit=1'.format( date=now.strftime('%Y-%m-%dT%H:%M:%S')) control.log('GET %s' % url) programs = (requests.get(url, headers=headers, verify=False).json() or {}).get('results', []) control.log(programs) program = next(iter(programs), {}) or {} try: start_time = util.strptime_workaround(program.get('startdate'), '%Y-%m-%dT%H:%M:%S') start_time = br_timezone.localize(start_time) start_time = start_time.astimezone(pytz.UTC) start_time = start_time + util.get_utc_delta() except: control.log(traceback.format_exc(), control.LOGERROR) start_time = datetime.datetime.now() plot = program.get('description') plot = '%s - | %s' % (datetime.datetime.strftime(start_time, '%H:%M'), plot) program_name = program.get('title') channel_name = 'SBT' label = u"[B]%s[/B][I] - %s[/I]" % (channel_name, program_name) thumb = program.get('thumbnail') tags = [] yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'IsPlayable': True, 'livefeed': True, 'studio': channel_name, 'label': label, 'title': label, 'genre': program.get('gender'), # 'title': program.get('metadata', program.get('name', '')), 'tvshowtitle': program_name, 'sorttitle': program_name, 'tag': tags, 'plot': plot, 'duration': int(0), 'dateadded': datetime.datetime.strftime(start_time, '%Y-%m-%d %H:%M:%S'), 'mediatype': 'episode', 'art': { 'icon': SBT_LOGO, 'clearlogo': SBT_LOGO, 'fanart': thumb, 'thumb': thumb, 'tvshow.poster': thumb, } }