def del_watch_later(video_id): token = auth_helper.get_globosat_token() url = GLOBOSAT_DEL_WATCH_LATER % (token, video_id) headers = { "Accept-Encoding": "gzip", "Content-Type": "application/x-www-form-urlencoded", "version": "2", "Authorization": GLOBOSAT_API_AUTHORIZATION } requests.delete(url=url, headers=headers)
def request_query(query, variables, force_refresh=False, retry=3, use_cache=True): tenant = 'globosat-play' token = auth_helper.get_globosat_token() url = 'https://products-jarvis.globo.com/graphql?query={query}&variables={variables}'.format( query=query, variables=urllib.quote_plus(variables)) headers = { 'authorization': token, 'x-tenant-id': tenant, 'x-platform-id': 'web', 'x-device-id': 'desktop', 'x-client-version': '1.5.1', 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } control.log('{} - GET {}'.format(tenant, url)) if use_cache: response = cache.get(requests.get, 1, url, headers=headers, force_refresh=force_refresh, table='globosat') else: response = requests.get(url, headers=headers) if response.status_code >= 500 and retry > 0: return request_query(query, variables, True, retry - 1) response.raise_for_status() json_response = response.json() control.log(json_response) return json_response
def add_watch_later(video_id): post_data = {'id': video_id} token = auth_helper.get_globosat_token() url = GLOBOSAT_BASE_WATCH_LATER % token headers = { "Accept-Encoding": "gzip", "Content-Type": "application/x-www-form-urlencoded", "version": "2", "Authorization": GLOBOSAT_API_AUTHORIZATION } post_data = urllib.urlencode(post_data) client.request(url, headers=headers, post=post_data)
def request_url(url, force_refresh=False, retry=3, use_cache=True): tenant = 'globosat-play' token = auth_helper.get_globosat_token() headers = { 'authorization': token, 'x-tenant-id': tenant, 'x-platform-id': 'web', 'x-device-id': 'desktop', 'x-client-version': '1.17.0', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36' } control.log('{} - GET {}'.format(tenant, url)) if use_cache: response = cache.get(requests.get, 1, url, headers=headers, force_refresh=force_refresh, table='globosat') else: response = requests.get(url, headers=headers) if response.status_code >= 500 and retry > 0: return request_url(url, True, retry - 1) response.raise_for_status() json_response = response.json() control.log(json_response) return json_response
def get_authorized_channels(): token = auth_helper.get_globosat_token() if not token: return [] client_id = "85014160-e953-4ddb-bbce-c8271e4fde74" channels_url = "https://gsatmulti.globo.com/oauth/sso/login/?chave=%s&token=%s" % ( client_id, token) channels = [] pkgs_response = client.request(channels_url, headers={"Accept-Encoding": "gzip"}) control.log("-- PACKAGES: %s" % repr(pkgs_response)) pkgs = pkgs_response['pacotes'] channel_ids = [] for pkg in pkgs: for channel in pkg['canais']: if channel['slug'] == 'telecine-zone': continue elif channel['id_globo_videos'] not in channel_ids: channel_ids.append(channel['id_globo_videos']) channels.append({ "id": channel['id_globo_videos'], # "channel_id": channel['id_globo_videos'], "id_cms": channel['id_cms'], "logo": channel['logo_fundo_claro'], "name": channel['nome'], "slug": channel['slug'], "adult": channel['slug'] == 'sexyhot', "vod": "vod" in channel['acls'], "live": "live" in channel['acls'] }) return channels
def playlive(self, id, meta): if id is None: return info = resourceshelper.get_video_info(id) control.log("INFO: %s" % repr(info)) if not info or info is None or 'channel' not in info: return try: hash, user, credentials = self.sign_resource(info['provider_id'], info['resource_id'], id, info['player'], info['version']) except Exception as ex: control.log("ERROR: %s" % repr(ex)) return encrypted = 'encrypted' in info and info['encrypted'] if encrypted and not control.is_inputstream_available(): control.infoDialog(message=control.lang(34103).encode('utf-8'), icon='Wr') return title = info['channel'] query_string = re.sub(r'{{(\w*)}}', r'%(\1)s', info['query_string_template']) query_string = query_string % { 'hash': hash, 'key': 'app', 'openClosed': 'F' if info['subscriber_only'] else 'A', 'user': user if info['subscriber_only'] else '' } url = '?'.join([info['url'], query_string]) control.log("live media url: %s" % url) try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, "title": title, "thumb": info["thumbUri"], "mediatype": "video", "aired": info["exhibited_at"] } meta.update({ "genre": info["category"], "plot": info["title"], "plotoutline": info["title"] }) poster = meta['poster'] if 'poster' in meta else control.addonPoster() thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"] self.offset = float(meta['milliseconds_watched']) / 1000.0 if 'milliseconds_watched' in meta else 0 self.isLive = 'livefeed' in meta and meta['livefeed'] == 'true' parsed_url = urlparse(url) if parsed_url.path.endswith(".m3u8"): self.url, mime_type, stopEvent, cookies = hlshelper.pick_bandwidth(url) else: self.url = url mime_type, stopEvent, cookies = 'video/mp4', None, None if self.url is None: if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set() control.infoDialog(control.lang(34100).encode('utf-8'), icon='ERROR') return control.log("Resolved URL: %s" % repr(self.url)) control.log("Parsed URL: %s" % repr(parsed_url)) item = control.item(path=self.url) item.setArt({'icon': thumb, 'thumb': thumb, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster}) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=meta) item.setContentLookup(False) if parsed_url.path.endswith(".mpd"): mime_type = 'application/dash+xml' item.setProperty('inputstream.adaptive.manifest_type', 'mpd') elif parsed_url.path.endswith(".ism/manifest"): mime_type = 'application/vnd.ms-sstr+xml' item.setProperty('inputstream.adaptive.manifest_type', 'ism') else: item.setProperty('inputstream.adaptive.manifest_type', 'hls') if encrypted: control.log("DRM: %s" % info['drm_scheme']) licence_url = info['protection_url'] item.setProperty('inputstream.adaptive.license_type', info['drm_scheme']) if info['drm_scheme'] == 'com.widevine.alpha' or info['drm_scheme'] == 'com.microsoft.playready': item.setProperty('inputstream.adaptive.license_key', licence_url + "||R{SSM}|") if mime_type: item.setMimeType(mime_type) control.log("MIME TYPE: %s" % repr(mime_type)) if not cookies and not control.disable_inputstream_adaptive: item.setProperty('inputstreamaddon', 'inputstream.adaptive') if 'subtitles' in info and info['subtitles'] and len(info['subtitles']) > 0: control.log("FOUND SUBTITLES: %s" % repr([sub['url'] for sub in info['subtitles']])) item.setSubtitles([sub['url'] for sub in info['subtitles']]) control.resolve(int(sys.argv[1]), True, item) self.stopPlayingEvent = threading.Event() self.stopPlayingEvent.clear() self.token = auth_helper.get_globosat_token() self.video_id = info['id'] if 'id' in info else None 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: current_time = self.getTime() if current_time - last_time > 5 or (last_time == 0 and current_time > 1): last_time = current_time self.save_video_progress(self.token, self.video_id, current_time) control.sleep(1000) if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set() control.log("Done playing. Quitting...")
def playlive(self, id, meta): if id is None: return info = self.__get_video_info(id) if not info or 'channel' not in info: return if 'encrypted' in info and info['encrypted'] == 'true': control.infoDialog(message=control.lang(34103).encode('utf-8'), icon='Wr') return title = info['channel'] signed_hashes = util.get_signed_hashes(info['hash']) query_string = re.sub(r'{{(\w*)}}', r'%(\1)s', info['query_string_template']) query_string = query_string % { 'hash': signed_hashes[0], 'key': 'app', 'openClosed': 'F' if info['subscriber_only'] else 'A', 'user': info['user'] if info['subscriber_only'] else '' } url = '?'.join([info['url'], query_string]) control.log("live media url: %s" % url) try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, "title": title, "thumb": info["thumbUri"], "mediatype": "video", "aired": info["exhibited_at"] } meta.update({ "genre": info["category"], "plot": info["title"], "plotoutline": info["title"] }) poster = meta['poster'] if 'poster' in meta else control.addonPoster() thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"] self.offset = float(meta['milliseconds_watched']) / 1000.0 if 'milliseconds_watched' in meta else 0 self.isLive = 'livefeed' in meta and meta['livefeed'] == 'true' self.url, mime_type, stopEvent = hlshelper.pick_bandwidth(url) if self.url is None: if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set() control.infoDialog(control.lang(34100).encode('utf-8'), icon='ERROR') return control.log("Resolved URL: %s" % repr(self.url)) item = control.item(path=self.url) item.setArt({'icon': thumb, 'thumb': thumb, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster}) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=meta) if mime_type: item.setMimeType(mime_type) item.setContentLookup(False) item.setProperty('inputstream.adaptive.manifest_type', 'hls') item.setProperty('inputstreamaddon', 'inputstream.adaptive') control.resolve(int(sys.argv[1]), True, item) self.stopPlayingEvent = threading.Event() self.stopPlayingEvent.clear() self.token = auth_helper.get_globosat_token() self.video_id = info['id'] if 'id' in info else None last_time = 0.0 while not self.stopPlayingEvent.isSet(): if control.monitor.abortRequested(): control.log("Abort requested") break if self.isPlaying() and not self.isLive: current_time = self.getTime() if current_time - last_time > 5 or (last_time == 0 and current_time > 1): last_time = current_time self.save_video_progress(self.token, self.video_id, current_time) control.sleep(1000) if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set() control.log("Done playing. Quitting...")
def get_watch_history(page=1): # GET /globosatplay/watch_history.json?token=bd97dc379d3648d23b69257160a40c6e&page=1&per_page=50 HTTP/1.1 # Host: api.vod.globosat.tv # Accept-Language: en-US # Accept-Encoding: gzip # version: 2 # Authorization: token b4b4fb9581bcc0352173c23d81a26518455cc521 headers = { 'Accept-Encoding': 'gzip', 'Authorization': GLOBOSAT_API_AUTHORIZATION, 'Version': 2 } token = auth_helper.get_globosat_token() watch_later_list = client.request(GLOBOSAT_WATCH_HISTORY % (token, page, 50), headers=headers) results = watch_later_list['data'] while watch_later_list['next'] is not None: watch_later_list = client.request(watch_later_list['next'], headers=headers) results += watch_later_list['data'] videos = [] results = sorted(results, key=lambda x: x['watched_date'], reverse=True) for item in results: video = { 'id': item['id_globo_videos'], 'label': item['channel']['title'] + (' - ' + item['program']['title'] if 'program' in item and item['program'] else '') + ' - ' + item['title'], 'title': item['title'], 'tvshowtitle': item['program']['title'] if 'program' in item and item['program'] else item['title'], 'studio': item['channel']['title'], 'plot': item['description'], 'tagline': None, 'duration': float(item['duration_in_milliseconds']) / 1000.0, 'logo': item['program']['logo_image'] if 'program' in item and item['program'] else item['channel']['color_logo'], 'clearlogo': item['program']['logo_image'] if 'program' in item and item['program'] else item['channel']['color_logo'], 'poster': item['program']['poster_image'] if 'program' in item and item['program'] else item['card_image'], 'thumb': item['thumb_image'], 'fanart': item['program']['background_image_tv_cropped'] if 'program' in item and item['program'] else item['background_image'], 'mediatype': 'episode', 'brplayprovider': 'globosat', 'milliseconds_watched': int(item['watched_seconds']) * 1000 } videos.append(video) return videos
def get_watch_later(page=1): headers = { 'Accept-Encoding': 'gzip', 'Authorization': GLOBOSAT_API_AUTHORIZATION, 'Version': 2 } token = auth_helper.get_globosat_token() watch_later_list = client.request(GLOBOSAT_WATCH_LATER % (token, page, 50), headers=headers) results = watch_later_list['data'] while watch_later_list['next'] is not None: watch_later_list = client.request(watch_later_list['next'], headers=headers) results += watch_later_list['data'] videos = [] for item in results: video = { 'id': item['id_globo_videos'], 'label': item['channel']['title'] + (' - ' + item['program']['title'] if 'program' in item and item['program'] else '') + ' - ' + item['title'], 'title': item['title'], 'tvshowtitle': item['program']['title'] if 'program' in item and item['program'] else item['title'], 'studio': item['channel']['title'], 'plot': item['description'], 'tagline': None, 'duration': float(item['duration_in_milliseconds']) / 1000.0, 'logo': item['program']['logo_image'] if 'program' in item and item['program'] else item['channel']['color_logo'], 'clearlogo': item['program']['logo_image'] if 'program' in item and item['program'] else item['channel']['color_logo'], 'poster': item['program']['poster_image'] if 'program' in item and item['program'] else item['card_image'], 'thumb': item['thumb_image'], 'fanart': item['program']['background_image_tv_cropped'] if 'program' in item and item['program'] else item['background_image_tv_cropped'], 'mediatype': 'episode', 'brplayprovider': 'globosat' } videos.append(video) return videos