def __get_affiliate_live_channels(affiliate): liveglobo = get_globo_live_id() code, latitude, longitude = control.get_coordinates(affiliate) if code is None and latitude is not None: result = get_affiliate_by_coordinates(latitude, longitude) code = result['code'] if result and 'code' in result else None if code is None: return None live_program = __get_live_program(code) if not live_program: return None geo_position = 'lat=%s&long=%s' % (latitude, longitude) program_description = get_program_description(live_program['program_id_epg'], live_program['program_id'], code) control.log("globo live (%s) program_description: %s" % (code, repr(program_description))) item = { 'plot': None, 'duration': None, 'affiliate': geo_position, 'brplayprovider': 'globoplay', 'affiliate_code': code, 'logo': None } item.update(program_description) item.pop('datetimeutc', None) title = program_description['title'] if 'title' in program_description else live_program['title'] subtitle = program_description['subtitle'] if 'subtitle' in program_description else live_program['title'] safe_tvshowtitle = program_description['tvshowtitle'] if 'tvshowtitle' in program_description and program_description['tvshowtitle'] else '' safe_subtitle = program_description['subtitle'] if 'subtitle' in program_description and program_description['subtitle'] and not safe_tvshowtitle.startswith(program_description['subtitle']) else '' subtitle_txt = (" / " if safe_tvshowtitle and safe_subtitle else '') + safe_subtitle tvshowtitle = " (" + safe_tvshowtitle + subtitle_txt + ")" if safe_tvshowtitle or subtitle_txt else '' item.update({ 'slug': 'globo', 'name': ('[B]' if not control.isFTV else '') + 'Globo ' + re.sub(r'\d+','',code) + ('[/B]' if not control.isFTV else '') + '[I] - ' + title + (tvshowtitle if not control.isFTV else '') + '[/I]', 'title': title, #subtitle, # 'Globo ' + re.sub(r'\d+','',code) + '[I] - ' + program_description['title'] + '[/I]', 'sorttitle': 'Globo ' + re.sub(r'\d+','',code), 'clearlogo': GLOBO_LOGO, # 'tagline': program_description['title'], 'studio': 'Rede Globo - ' + affiliate, # 'logo': GLOBO_LOGO, 'playable': 'true', 'id': liveglobo, 'channel_id': 196, 'live': True, 'livefeed': 'true' }) if control.isFTV: item.update({'tvshowtitle': title}) if 'fanart' not in item or not item['fanart']: item.update({'fanart': GLOBO_FANART}) # if 'poster' not in item or not item['poster']: # item.update({'poster': live_program['poster']}) if 'thumb' not in item or not item['thumb']: item.update({'thumb': live_program['poster']}) return item
def __get_globosat_simulcast(simulcast_results): geolocation = control.setting('globosat_geofence') if geolocation == '0': affiliate = None elif geolocation == '1': affiliate = 'Sao Paulo' elif geolocation == '2': affiliate = 'Brasilia' elif geolocation == '3': affiliate = 'Belo Horizonte' elif geolocation == '4': affiliate = 'Recife' elif geolocation == '5': affiliate = 'Salvador' elif geolocation == '6': affiliate = 'Fortaleza' elif geolocation == '7': affiliate = 'Aracaju' elif geolocation == '8': affiliate = 'Maceio' elif geolocation == '9': affiliate = 'Cuiaba' elif geolocation == '10': affiliate = 'Porto Alegre' elif geolocation == '11': affiliate = 'Florianopolis' elif geolocation == '12': affiliate = 'Curitiba' elif geolocation == '13': affiliate = 'Vitoria' elif geolocation == '14': affiliate = 'Goiania' elif geolocation == '15': affiliate = 'Campo Grande' elif geolocation == '16': affiliate = 'Manaus' elif geolocation == '17': affiliate = 'Belem' elif geolocation == '18': affiliate = 'Macapa' elif geolocation == '19': affiliate = 'Palmas' elif geolocation == '20': affiliate = 'Rio Branco' elif geolocation == '21': affiliate = 'Teresina' elif geolocation == '22': affiliate = 'Sao Luis' elif geolocation == '23': affiliate = 'Joao Pessoa' elif geolocation == '24': affiliate = 'Natal' else: affiliate = 'Rio de Janeiro' if affiliate: code, latitude, longitude = control.get_coordinates(affiliate) url = GLOBOSAT_SIMULCAST_URL + '?latitude=%s&longitude=%s' % (latitude, longitude) else: url = GLOBOSAT_SIMULCAST_URL headers = {'Authorization': GLOBOSAT_API_AUTHORIZATION, 'Accept-Encoding': 'gzip'} channel_info = client.request(url, headers=headers) simulcast_results += channel_info['results']
def get_live_channels(): today_str = datetime.datetime.utcnow().strftime('%Y-%m-%d') query = 'query%20getAllBroadcasts%28%24logoScale%3A%20BroadcastChannelTrimmedLogoScales%20%3D%20X56%29%20%7B%0A%20%20broadcasts%20%7B%0A%20%20%20%20mediaId%0A%20%20%20%20mutedMediaId%0A%20%20%20%20promotionalMediaId%0A%20%20%20%20promotionalText%0A%20%20%20%20geofencing%0A%20%20%20%20geoblocked%0A%20%20%20%20channel%20%7B%0A%20%20%20%20%20%20id%0A%20%20%20%20%20%20color%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20text%3A%20name%0A%20%20%20%20%20%20logo%28format%3A%20PNG%29%0A%20%20%20%20%20%20trimmedLogo%28scale%3A%20%24logoScale%29%0A%20%20%20%20%20%20slug%0A%20%20%20%20%20%20requireUserTeam%0A%20%20%20%20%7D%0A%20%20%20%20epgCurrentSlots%20%7B%0A%20%20%20%20%20%20composite%0A%20%20%20%20%20%20name%0A%20%20%20%20%20%20titleId%0A%20%20%20%20%20%20metadata%0A%20%20%20%20%20%20description%0A%20%20%20%20%20%20tags%0A%20%20%20%20%20%20startTime%0A%20%20%20%20%20%20endTime%0A%20%20%20%20%20%20liveBroadcast%0A%20%20%20%20%20%20durationInMinutes%0A%20%20%20%20%20%20contentRating%0A%20%20%20%20%20%20contentRatingCriteria%0A%0A%20%20%20%20%20%20title%20%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%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%7D%0A%20%20%20%20%20%20%20%20poster%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%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%7D%0A%20%20%20%20%7D%0A%20%20%20%20media%20%7B%0A%20%20%20%20%20%20serviceId%0A%20%20%20%20%20%20availableFor%0A%20%20%20%20%7D%0A%20%20%7D%0A%7D' variables = '{{"date":"{date}"}}'.format(date=today_str) response = request_query(query, variables, use_cache=False) authorized_services = [] if control.setting('globosat_ignore_channel_authorization') != 'true': service_ids = [ broadcast['media']['serviceId'] for broadcast in response['data']['broadcasts'] ] authorized_services = get_authorized_services(service_ids) for broadcast in response['data']['broadcasts']: if 'epgCurrentSlots' not in broadcast or not broadcast[ 'epgCurrentSlots']: continue service_id = broadcast['media']['serviceId'] if control.setting( 'globosat_ignore_channel_authorization') != 'true' and ( service_id not in authorized_services or not auth_helper.is_available_for( broadcast.get('media', {}).get('availableFor'))): continue geofencing = broadcast.get('geofencing', False) media_id = broadcast.get('mediaId') if geofencing: affiliate = get_globosat_affiliate() if affiliate: code, latitude, longitude = control.get_coordinates(affiliate) broadcast = get_epg_with_coordinates(media_id, latitude, longitude) program = next(iter(broadcast.get('epgCurrentSlots')), {}) or {} live_text = u' (' + control.lang( 32004) + u')' if program['liveBroadcast'] else u'' program_detail = u': ' + program['metadata'] if program[ 'metadata'] else u'' program_name = program['name'] + program_detail if program[ 'metadata'] and not program['metadata'].startswith( program['name']) else program['metadata'] if program[ 'metadata'] else program['name'] channel_name = broadcast['channel']['name'] label = u"[B]%s[/B][I] - %s[/I]%s" % (channel_name, program_name, live_text) fanart = FANART_URL.format(media_id=broadcast['mediaId']) # thumb = SNAPSHOT_URL.format(transmission=THUMBS[str(broadcast['channel']['id'])]) + '/?v=' + str(int(time.time())) if str(broadcast['channel']['id']) in THUMBS else THUMB_URL.format(media_id=broadcast['mediaId']) thumb = THUMB_URL.format(media_id=broadcast['mediaId']) program_date = datetime.datetime.utcfromtimestamp(program['startTime']) end_time = datetime.datetime.utcfromtimestamp(program['endTime']) duration = (end_time - program_date).total_seconds() title = program.get('title', {}) or {} thumb = (title.get('cover', {}) or {}).get('landscape', thumb) or thumb program_time_desc = datetime.datetime.strftime( program_date, '%H:%M') + ' - ' + datetime.datetime.strftime( end_time, '%H:%M') description = '%s | %s' % (program_time_desc, program.get('description')) tags = [program_time_desc] if program.get('liveBroadcast', False): tags.append(control.lang(32004)) tags.extend(program.get('tags', []) or []) yield { 'handler': PLAYER_HANDLER, 'method': 'playlive', 'id': media_id, 'IsPlayable': True, 'livefeed': True, 'live': program['liveBroadcast'], 'channel_id': broadcast['channel']['id'], 'service_id': service_id, 'program_id': title.get('originProgramId'), 'studio': 'Canais Globo', 'label': label, 'title': label, 'year': title.get('releaseYear'), 'country': title.get('countries', []), 'genre': title.get('genresNames', []), 'cast': title.get('castNames', []), 'director': title.get('directorsNames', []), 'writer': title.get('screenwritersNames', []), 'credits': title.get('artDirectorsNames', []), 'mpaa': program.get('contentRating'), # 'title': program.get('metadata', program.get('name', '')), 'tvshowtitle': program['name'] if program_name else None, 'sorttitle': program_name, 'tag': tags, 'plot': description, 'duration': int(duration), 'dateadded': datetime.datetime.strftime(program_date, '%Y-%m-%d %H:%M:%S'), 'mediatype': 'episode', 'art': { 'icon': broadcast['channel']['logo'], 'clearlogo': broadcast['channel']['logo'], 'fanart': (title.get('cover', {}) or {}).get('landscape', fanart) or fanart, 'thumb': thumb, 'tvshow.poster': (title.get('poster', {}) or {}).get('web', thumb), } }
def __get_affiliate_live_channels(affiliate): control.log('__get_affiliate_live_channels: %s' % affiliate) live_globo_id = get_globo_live_id() code, latitude, longitude = control.get_coordinates(affiliate) if code is None and latitude is not None: result = get_affiliate_by_coordinates(latitude, longitude) code = result['code'] if result and 'code' in result else None if code is None: control.log('No affiliate code for: %s' % affiliate) return [] live_program = __get_live_program(code) program_description = get_program_description( live_program.get('program_id_epg'), live_program.get('program_id'), code) control.log("globo live (%s) program_description: %s" % (code, repr(program_description))) item = {} item.update(program_description) item.pop('datetimeutc', None) title = program_description[ 'title'] if 'title' in program_description else live_program.get( 'title') safe_tvshowtitle = program_description[ 'tvshowtitle'] if 'tvshowtitle' in program_description and program_description[ 'tvshowtitle'] else '' safe_subtitle = program_description[ 'subtitle'] if 'subtitle' in program_description and program_description[ 'subtitle'] and not safe_tvshowtitle.startswith( program_description['subtitle']) else '' subtitle_txt = (" / " if safe_tvshowtitle and safe_subtitle else '') + safe_subtitle tvshowtitle = " - " + safe_tvshowtitle + subtitle_txt if safe_tvshowtitle or subtitle_txt else '' program_name = '%s%s' % (title, tvshowtitle) item.update({ 'handler': PLAYER_HANDLER, 'method': 'play_stream', 'lat': latitude, 'long': longitude, 'affiliate_code': code, 'IsPlayable': True, 'id': live_globo_id, 'program_id': live_program.get('program_id'), 'service_id': 4654, 'channel_id': 196, 'live': True, 'livefeed': True, 'label': '[B]Globo %s[/B][I] - %s[/I]' % (re.sub(r'\d+', '', code), program_name), 'title': '[B]Globo %s[/B][I] - %s[/I]' % (re.sub(r'\d+', '', code), program_name), 'tvshowtitle': safe_tvshowtitle + subtitle_txt, 'sorttitle': program_name, 'studio': 'Globoplay', }) art = item.get('art', {}) or {} if not art: item['art'] = art if not art.get('thumb'): # thumb = 'https://live-thumbs.video.globo.com/globo-rj/snapshot/' + str(int(time.time())) art['thumb'] = live_program.get('thumb') if not art.get('fanart'): art['fanart'] = live_program.get('fanart') if not art.get('poster'): art['tvshow.poster'] = live_program.get('poster') art['clearlogo'] = GLOBO_LOGO art['icon'] = GLOBO_LOGO return [item]
def play_stream(self, id, meta, children_id=None): control.log( "GloboPlay - play_stream: id=%s | children_id=%s | meta=%s" % (id, children_id, meta)) if id is None: return try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, "mediatype": "video", "aired": None } self.isLive = 'live' in meta and meta['live'] if 'livefeed' in meta and meta['livefeed'] == 'true': control.log("PLAY LIVE!") self.isLive = True affiliate = meta['affiliate'] if 'affiliate' in meta else None if affiliate is None: code, latitude, longitude = control.get_coordinates( control.get_affiliates_by_id(-1)) affiliate = 'lat=%s&long=%s' % (latitude, longitude) info = self.__getLiveVideoInfo(id, affiliate) if info is None: return item, self.url, stopEvent = self.__get_list_item(meta, info) else: info = resourceshelper.get_video_info(id, children_id) if info is None: return if 'resource_id' not in info: control.log("PLAY CHILDREN!") items = [] xbmc.PlayList(1).clear() first = True for i in info: hash, user, self.credentials = self.sign_resource( i['resource_id'], i['id'], i['player'], i['version']) i['hash'] = hash i['user'] = user item, url, stopEvent = self.__get_list_item(meta, i, False) if first: self.url = url first = False items.append(item) control.log("PLAYLIST ITEM URL: %s" % url) xbmc.PlayList(1).add(url, item) item = items[0] else: control.log("PLAY SINGLE RESOURCE!") hash, user, self.credentials = self.sign_resource( info['resource_id'], info["id"], info['player'], info['version'], meta['anonymous'] if 'anonymous' in meta else False) info['hash'] = hash info['user'] = user item, self.url, stopEvent = self.__get_list_item(meta, info) self.offset = float(meta['milliseconds_watched'] ) / 1000.0 if 'milliseconds_watched' in meta else 0 syshandle = int(sys.argv[1]) control.resolve(syshandle, True, item) self.stopPlayingEvent = threading.Event() self.stopPlayingEvent.clear() self.program_id = info['program_id'] if 'program_id' in info else None self.video_id = id first_run = True last_time = 0.0 while not self.stopPlayingEvent.isSet(): if control.monitor.abortRequested(): control.log("Abort requested") break if self.isPlaying(): if first_run: self.showSubtitles(False) first_run = False if not self.isLive: total_time = self.getTotalTime() current_time = self.getTime() if current_time - last_time > 5 or (last_time == 0 and current_time > 1): last_time = current_time percentage_watched = current_time / total_time if total_time > 0 else 1.0 / 1000000.0 self.save_video_progress( self.credentials, self.program_id, self.video_id, current_time * 1000, fully_watched=0.9 < percentage_watched <= 1) control.sleep(500) if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set() control.log("Done playing. Quitting...")
def play_stream(self, id, meta, children_id=None): meta = meta or {} control.log( "GloboPlay - play_stream: id=%s | children_id=%s | meta=%s" % (id, children_id, meta)) if id is None: return self.isLive = meta.get('livefeed', False) stop_event = None cdn = control.setting('globo_cdn') if cdn: cdn = cdn.lower() if cdn.lower() != 'auto' else None if self.isLive and meta.get('lat') and meta.get('long'): control.log("PLAY LIVE!") latitude = meta.get('lat') longitude = meta.get('long') if not latitude or not longitude: code, latitude, longitude = control.get_coordinates( control.get_affiliates_by_id(-1)) info = self.__getLiveVideoInfo(id, latitude, longitude, cdn) if info is None: return item, self.url, stop_event = self.__get_list_item(meta, info) else: if not meta.get('router', True) or cdn: info = resourceshelper.get_video_info(id, children_id, cdn) else: info = resourceshelper.get_video_router(id, self.isLive, cdn) if not info: info = resourceshelper.get_video_info(id, children_id, cdn) if info is None: return if 'resource_id' not in info: control.log("PLAY CHILDREN!") items = [] xbmc.PlayList(1).clear() first = True for i in info: hash_token, user, self.credentials = self.sign_resource( i['resource_id'], i['id'], i['player'], i['version'], cdn=i['cdn']) i['hash'] = hash_token i['user'] = user item, url, stop_event = self.__get_list_item( meta, i, False) if first: self.url = url first = False items.append(item) control.log("PLAYLIST ITEM URL: %s" % url) xbmc.PlayList(1).add(url, item) item = items[0] else: control.log("PLAY SINGLE RESOURCE!") hash_token, user, self.credentials = self.sign_resource( info['resource_id'], info["id"], info['player'], info['version'], meta['anonymous'] if 'anonymous' in meta else False, cdn=info['cdn']) info['hash'] = hash_token info['user'] = user item, self.url, stop_event = self.__get_list_item(meta, info) self.offset = float(meta['milliseconds_watched'] ) / 1000.0 if 'milliseconds_watched' in meta else 0 self.stop_playing_event = threading.Event() self.stop_playing_event.clear() self.program_id = info[ 'program_id'] if 'program_id' in info else meta.get('program_id') self.video_id = id syshandle = int(sys.argv[1]) control.resolve(syshandle, True, item) first_run = True last_time = 0.0 while not self.stop_playing_event.isSet(): if control.monitor.abortRequested(): control.log("Abort requested") break if self.isPlaying(): if first_run: self.showSubtitles(False) first_run = False if not self.isLive: total_time = self.getTotalTime() current_time = self.getTime() if current_time - last_time > 5 or (last_time == 0 and current_time > 1): last_time = current_time percentage_watched = current_time / total_time if total_time > 0 else 1.0 / 1000000.0 self.save_video_progress( self.credentials, self.program_id, self.video_id, current_time * 1000, fully_watched=0.9 < percentage_watched <= 1) control.sleep(500) if stop_event: control.log("Setting stop event for proxy player") stop_event.set() control.log("Done playing. Quitting...")