def playlive(self, id, meta): meta = meta or {} control.log("Oi Play - play_stream: id=%s | meta=%s" % (id, meta)) if id is None: return provider = meta.get('provider') self.isLive = meta.get('livefeed', False) data = self.individualize(self.isLive, id, provider) if not data or 'individualization' not in data: error_message = '%s: %s' % ( data.get('reason'), data.get('detail')) if data and data.get( 'reason') else control.lang(34100).encode('utf-8') control.infoDialog(error_message, icon='ERROR') return encrypted = 'drm' in data and 'licenseUrl' in data['drm'] if encrypted and not control.is_inputstream_available(): control.okDialog(u'Oi Play', control.lang(34103).encode('utf-8')) return url = data['individualization']['url'] # info = data.get('token', {}).get('cmsChannelItem') or data.get('token', {}).get('cmsContentItem') control.log("live media url: %s" % url) self.offset = float(meta['milliseconds_watched'] ) / 1000.0 if 'milliseconds_watched' in meta else 0 parsed_url = urlparse(url) if ".m3u8" in parsed_url.path: 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)) if control.supports_offscreen: item = control.item(path=self.url, offscreen=True) else: item = control.item(path=self.url) item.setArt(meta.get('art', {})) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=control.filter_info_labels(meta)) item.setContentLookup(False) if ".mpd" in parsed_url.path: mime_type = 'application/dash+xml' item.setProperty('inputstream.adaptive.manifest_type', 'mpd') if self.isLive: item.setProperty( 'inputstream.adaptive.manifest_update_parameter', 'full') else: item.setProperty('inputstream.adaptive.manifest_type', 'hls') if encrypted: control.log("DRM: com.widevine.alpha") # licence_url = data['drm']['licenseUrl'] + '&token=' + data['drm']['jwtToken'] if data.get('drm', {}).get('jwtToken'): licence_url = '%s&token=%s' % (data.get( 'drm', {}).get('licenseUrl'), data.get('drm', {}).get('jwtToken')) else: licence_url = data.get('drm', {}).get('licenseUrl') item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') 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 control.is_inputstream_available(): 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() 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 play_vod(self, id, meta): self.retry = 0 control.log("PLAY SEXYHOT - ID: %s" % id) if id is None: return id = self.__get_globo_id(id) control.log('globo_midia_id: %s' % str(id)) if id is None: return info = self.__get_video_info(id) if info is None: return title = info['title'] signed_hashes = 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': 'html5' } 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": None, "mediatype": "video" } meta.update({ "genre": info["category"], }) poster = meta['poster'] if 'poster' in meta else control.addonPoster() thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"] url, mime_type, stopEvent = hlshelper.pick_bandwidth(url) control.log("Resolved URL: %s" % repr(url)) item = control.item(path=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) control.resolve(int(sys.argv[1]), id != None, item) self.stopPlayingEvent = threading.Event() self.stopPlayingEvent.clear() while not self.stopPlayingEvent.isSet(): if control.monitor.abortRequested(): control.log("Abort requested") break control.sleep(500) if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set()
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 __get_list_item(self, meta, info, pick_bandwidth=True): hash = info['hash'] user = info['user'] title = info['title'] # or meta['title'] if 'title' in meta else None 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) meta.update({ "genre": info["category"], "plot": info["title"], "plotoutline": info["title"], "title": title }) poster = meta['poster'] if 'poster' in meta else control.addonPoster() thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"] parsed_url = urlparse(url) if parsed_url.path.endswith(".m3u8"): if pick_bandwidth: url, mime_type, stopEvent, cookies = hlshelper.pick_bandwidth( url) else: mime_type, stopEvent, cookies = None, None, None else: # self.url = url mime_type, stopEvent, cookies = 'video/mp4', None, None if url is None: if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set() control.infoDialog(message=control.lang(34100).encode('utf-8'), icon='ERROR') return None, None, None control.log("Resolved URL: %s" % repr(url)) item = control.item(path=url) item.setInfo(type='video', infoLabels=meta) item.setArt({ 'icon': thumb, 'thumb': thumb, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster }) item.setProperty('IsPlayable', 'true') item.setContentLookup(False) if parsed_url.path.endswith(".mpd"): mime_type = 'application/dash+xml' if not control.disable_inputstream_adaptive: control.log("Using inputstream.adaptive MPD") item.setProperty('inputstream.adaptive.manifest_type', 'mpd') item.setProperty('inputstreamaddon', 'inputstream.adaptive') if mime_type: item.setMimeType(mime_type) elif not cookies: item.setMimeType('application/vnd.apple.mpegurl') if not control.disable_inputstream_adaptive: control.log("Using inputstream.adaptive HLS") item.setProperty('inputstream.adaptive.manifest_type', 'hls') item.setProperty('inputstreamaddon', 'inputstream.adaptive') # if self.offset > 0: # duration = float(meta['duration']) if 'duration' in meta else 0 # if duration > 0: # item.setProperty('StartPercent', str((self.offset / duration) * 100)) # if self.offset > 0: # item.setProperty('resumetime', str(self.offset)) # duration = float(meta['duration']) if 'duration' in meta else self.offset # duration = duration * 1000.0 # item.setProperty('totaltime', str(duration)) if 'subtitles' in info and info['subtitles'] and len( info['subtitles']) > 0: item.setSubtitles([sub['url'] for sub in info['subtitles']]) return item, url, stopEvent
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 play_vod(self, id, meta): self.retry = 0 control.log("PLAY SEXYHOT - ID: %s" % id) if id is None: return id = self.__get_globo_id(id) control.log('globo_midia_id: %s' % str(id)) if id is None: return meta = json.loads(meta) if 'url' not in meta or meta['url'] is None: return token = self.__get_token(meta['url']) info = self.__get_video_info(id, token) if info is None: return signed_hashes = 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 '' } self.url = '?'.join([info['url'], query_string]) control.log("live media url: %s" % self.url) meta.update({ "genre": info["category"], }) poster = meta['poster'] if 'poster' in meta else control.addonPoster() thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"] url, mime_type, stopEvent, cookies = hlshelper.pick_bandwidth(self.url) control.log("Resolved URL: %s" % repr(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 item = control.item(path=url) item.setArt({'icon': thumb, 'thumb': thumb, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster}) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=control.filter_info_labels(meta)) item.setContentLookup(False) if mime_type: item.setMimeType(mime_type) if not cookies: item.setProperty('inputstream.adaptive.manifest_type', 'hls') item.setProperty('inputstreamaddon', 'inputstream.adaptive') # if cookies: # item.setProperty('inputstream.adaptive.stream_headers', 'Cookie=' + cookies) control.resolve(int(sys.argv[1]), id is not None, item) self.stopPlayingEvent = threading.Event() self.stopPlayingEvent.clear() while not self.stopPlayingEvent.isSet(): if control.monitor.abortRequested(): control.log("Abort requested") break control.sleep(100) if stopEvent: control.log("Setting stop event for proxy player") stopEvent.set()
def playlive(self, id, meta): control.log("Oi Play - play_stream: id=%s | meta=%s" % (id, meta)) if id is None: return data = self.individualize(id) encrypted = 'drm' in data and 'licenseUrl' in data['drm'] if encrypted and not control.is_inputstream_available(): control.okDialog(u'Oi Play', control.lang(34103).encode('utf-8')) return url = data['individualization']['url'] url = url.replace('https://', 'http://') # hack info = data['token']['cmsChannelItem'] title = info['title'] control.log("live media url: %s" % url) try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, "title": title, "thumb": info['positiveLogoUrl'], "mediatype": "video", "aired": None, "genre": info["categoryName"], "plot": title, "plotoutline": title } # meta.update({ # "genre": info["categoryName"], # "plot": title, # "plotoutline": title # }) # poster = meta['poster'] if 'poster' in meta else control.addonPoster() thumb = meta['thumb'] if 'thumb' in meta else info['positiveLogoUrl'] self.offset = float(meta['milliseconds_watched'] ) / 1000.0 if 'milliseconds_watched' in meta else 0 self.isLive = info['isLive'] parsed_url = urlparse(url) if ".m3u8" in parsed_url.path: 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}) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=control.filter_info_labels(meta)) item.setContentLookup(False) if ".mpd" in parsed_url.path: mime_type = 'application/dash+xml' item.setProperty('inputstream.adaptive.manifest_type', 'mpd') if self.isLive: item.setProperty( 'inputstream.adaptive.manifest_update_parameter', 'full') else: item.setProperty('inputstream.adaptive.manifest_type', 'hls') if encrypted: control.log("DRM: com.widevine.alpha") licence_url = data['drm']['licenseUrl'] + '&token=' + data['drm'][ 'jwtToken'] item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') 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 control.is_inputstream_available(): 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() 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, encrypted=False): control.log("TNT Play - play_stream: id=%s | meta=%s" % (id, meta)) if id is None: return try: url = self.geturl(id, encrypted=encrypted) except Exception as ex: control.log(traceback.format_exc(), control.LOGERROR) control.okDialog(u'TNT Play', str(ex)) return if encrypted and not control.is_inputstream_available(): control.okDialog(u'TNT Play', control.lang(34103).encode('utf-8')) return control.log("live media url: %s" % url) try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, } poster = meta['poster'] if 'poster' in meta else None thumb = meta['thumb'] if 'thumb' in meta else None self.offset = float(meta['milliseconds_watched'] ) / 1000.0 if 'milliseconds_watched' in meta else 0 self.isLive = not encrypted parsed_url = urlparse(url) if ".m3u8" in parsed_url.path: self.url, mime_type, stopEvent, cookies = hlshelper.pick_bandwidth( url) else: self.url = url mime_type, stopEvent, cookies = None, 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}) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=control.filter_info_labels(meta)) item.setContentLookup(False) manifest_type = 'hls' if parsed_url.path.endswith(".m3u8") else 'mpd' if encrypted: control.log("DRM: com.widevine.alpha") licence_url = 'https://widevine.license.istreamplanet.com/widevine/api/license/7837c2c6-8fe4-4db0-9900-1bd66c21ffa3' item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') item.setProperty('inputstream.adaptive.manifest_type', manifest_type) cookie = get_token() retry = 1 token = '' while retry >= 0: retry = retry - 1 headers = { 'Accept': 'application/json', 'cookie': 'avs_cookie=' + cookie, 'User-Agent': 'Tnt/2.2.13.1908061505 CFNetwork/1107.1 Darwin/19.0.0' } drm_url = 'https://api.tntgo.tv/AGL/1.0/A/{lang}/{platform}/TNTGO_LATAM_BR/CONTENT/GETDRMTOKEN/{id}'.format( lang=LANGUAGE, platform=vod_platform, id=id) control.log('TNT DRM GET %s' % drm_url) control.log(headers) drm_response = requests.get( drm_url, headers=headers, proxies=proxy).json() or {} control.log(drm_response) if drm_response.get('resultCode', 'KO') == u'OK': token = drm_response.get('resultObj') break if drm_response.get('message', '') == 'Token not valid': cookie = get_token(True) else: logout() control.infoDialog(drm_response.get( 'message', u'DRM ERROR'), icon='ERROR') return key_headers = 'x-isp-token=%s&Origin=https://www.tntgo.tv' % token license_key = '%s|%s|R{SSM}|' % (licence_url, key_headers) item.setProperty('inputstream.adaptive.license_key', license_key) else: item.setProperty('inputstream.adaptive.manifest_type', 'hls') # mime_type = 'application/vnd.apple.mpegurl' # item.setProperty('inputstream.adaptive.manifest_update_parameter', 'full') if mime_type: item.setMimeType(mime_type) control.log("MIME TYPE: %s" % repr(mime_type)) if not cookies and control.is_inputstream_available(): item.setProperty('inputstreamaddon', 'inputstream.adaptive') item.setProperty('inputstream', 'inputstream.adaptive') # Kodi 19 control.resolve(int(sys.argv[1]), True, item) control.log("Done playing. Quitting...")
def playlive(self, id, meta): meta = meta or {} control.log("Globosat Play - play_stream: id=%s | meta=%s" % (id, meta)) if id is None: return self.isLive = meta.get('livefeed', False) cdn = control.setting('globosat_cdn') if cdn: cdn = cdn.lower() if cdn.lower() != 'auto' else None if meta.get('geofencing') and meta.get('lat') and meta.get('long'): info = resourceshelper.get_geofence_video_info( id, meta.get('lat'), meta.get('long'), auth_helper.get_credentials(), cdn) elif not meta.get('router', True) or cdn: info = resourceshelper.get_video_info(id, cdn=cdn) else: info = resourceshelper.get_video_router(id, self.isLive, cdn) if not info: info = resourceshelper.get_video_info(id, cdn=cdn) control.log("INFO: %s" % repr(info)) if not info or info is None or 'channel' not in info: return try: hash_token = info.get('hash_token') user = info.get('user') if not hash_token: control.log('Signing resource: %s' % info['resource_id']) hash_token, user, credentials = self.sign_resource( info['provider_id'], info['resource_id'], id, info['player'], info['version'], cdn) except Exception as ex: control.log(traceback.format_exc(), control.LOGERROR) control.log("PLAYER ERROR: %s" % repr(ex)) return encrypted = 'encrypted' in info and info['encrypted'] if encrypted and not control.is_inputstream_available(): control.okDialog(control.lang(31200), control.lang(34103).encode('utf-8')) return query_string = re.sub(r'{{(\w*)}}', r'%(\1)s', info['query_string_template']) query_string = query_string % { 'hash': hash_token, 'key': 'app', 'openClosed': 'F' if info['subscriber_only'] and user else 'A', 'user': user if info['subscriber_only'] and user else '', 'token': hash_token } url = '?'.join([info['url'], query_string]) control.log("live media url: %s" % url) self.offset = float(meta['milliseconds_watched'] ) / 1000.0 if 'milliseconds_watched' in meta else 0 parsed_url = urlparse(url) if parsed_url.path.endswith(".m3u8"): self.url, mime_type, stop_event, cookies = hlshelper.pick_bandwidth( url) elif parsed_url.path.endswith(".mpd") and not self.isLive: proxy_handler = MediaProxy() self.url = proxy_handler.resolve(url) stop_event = proxy_handler.stop_event mime_type = None cookies = None else: self.url = url mime_type, stop_event, cookies = 'video/mp4', None, None if self.url is None: if stop_event: control.log("Setting stop event for proxy player") stop_event.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)) if control.supports_offscreen: item = control.item(path=self.url, offscreen=True) else: item = control.item(path=self.url) item.setArt(meta.get('art', {})) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=control.filter_info_labels(meta)) item.setContentLookup(False) if parsed_url.path.endswith(".mpd"): mime_type = 'application/dash+xml' item.setProperty('inputstream.adaptive.manifest_type', 'mpd') if self.isLive: item.setProperty( 'inputstream.adaptive.manifest_update_parameter', 'full') 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 control.is_inputstream_available(): item.setProperty('inputstreamaddon', 'inputstream.adaptive') # reqCookies = client.request(url=self.url,output='cookiejar',headRequest=True) # cookie_string = "; ".join([str(x) + "=" + str(y) for x, y in reqCookies.items()]) # item.setProperty('inputstream.adaptive.stream_headers', 'cookie=%s' % cookie_string) # control.log("COOKIE STRING: %s" % cookie_string) 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 stop_event: control.log("Setting stop event for proxy player") stop_event.set() control.log("Done playing. Quitting...")
def __get_list_item(self, meta, info, pick_bandwidth=True): hash_token = info['hash'] user = info['user'] query_string = re.sub(r'{{(\w*)}}', r'%(\1)s', info['query_string_template']) query_string = query_string % { 'hash': hash_token, 'key': 'app', 'openClosed': 'F' if info['subscriber_only'] and user else 'A', 'user': user if info['subscriber_only'] and user else '', 'token': hash_token } url = '?'.join([info['url'], query_string]) control.log("live media url: %s" % url) parsed_url = urlparse(url) if parsed_url.path.endswith(".m3u8"): if pick_bandwidth: url, mime_type, stop_event, cookies = hlshelper.pick_bandwidth( url) else: mime_type, stop_event, cookies = None, None, None elif parsed_url.path.endswith(".mpd"): proxy_handler = MediaProxy() url = proxy_handler.resolve(url) stop_event = proxy_handler.stop_event mime_type = None cookies = None else: mime_type, stop_event, cookies = 'video/mp4', None, None if url is None: if stop_event: control.log("Setting stop event for proxy player") stop_event.set() control.infoDialog(message=control.lang(34100).encode('utf-8'), icon='ERROR') return None, None, None control.log("Resolved URL: %s" % repr(url)) if control.supports_offscreen: item = control.item(path=url, offscreen=True) else: item = control.item(path=url) item.setInfo(type='video', infoLabels=control.filter_info_labels(meta)) item.setArt(meta.get('art', {})) item.setProperty('IsPlayable', 'true') item.setContentLookup(False) user_agent = 'User-Agent=Globo Play/0 (iPhone)' if parsed_url.path.endswith(".mpd"): mime_type = 'application/dash+xml' if control.enable_inputstream_adaptive: control.log("Using inputstream.adaptive MPD") item.setProperty('inputstream.adaptive.manifest_type', 'mpd') item.setProperty('inputstream.adaptive.stream_headers', user_agent) item.setProperty('inputstreamaddon', 'inputstream.adaptive') if mime_type: item.setMimeType(mime_type) elif not cookies: item.setMimeType('application/vnd.apple.mpegurl') if control.enable_inputstream_adaptive: control.log("Using inputstream.adaptive HLS") item.setProperty('inputstream.adaptive.manifest_type', 'hls') item.setProperty('inputstream.adaptive.stream_headers', user_agent) item.setProperty('inputstreamaddon', 'inputstream.adaptive') encrypted = info.get('encrypted', False) if encrypted and not control.is_inputstream_available(): control.okDialog(control.lang(31200), control.lang(34103).encode('utf-8')) return 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 self.offset > 0: # duration = float(meta['duration']) if 'duration' in meta else 0 # if duration > 0: # item.setProperty('StartPercent', str((self.offset / duration) * 100)) # if self.offset > 0: # item.setProperty('resumetime', str(self.offset)) # duration = float(meta['duration']) if 'duration' in meta else self.offset # duration = duration * 1000.0 # item.setProperty('totaltime', str(duration)) if 'subtitles' in info and info['subtitles'] and len( info['subtitles']) > 0: item.setSubtitles([sub['url'] for sub in info['subtitles']]) return item, url, stop_event
def play_stream(self, id, meta): if id is None: return try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, "mediatype": "video", "aired": None } self.isLive = False if 'live' in meta and meta['live'] == True: self.isLive = True info = self.__getLiveVideoInfo( id, meta['affiliate'] if 'affiliate' in meta else None) else: info = self.__getVideoInfo(id) title = meta['title'] if 'title' in meta else info['title'] signed_hashes = 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) meta.update({ "genre": info["category"], "plot": info["title"], "plotoutline": info["title"], "title": title }) poster = meta['poster'] if 'poster' in meta else control.addonPoster() thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"] syshandle = int(sys.argv[1]) self.offset = float(meta['milliseconds_watched'] ) / 1000.0 if 'milliseconds_watched' in meta else 0 self.isLive = 'live' in meta and meta['live'] 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(message=control.lang(34100).encode('utf-8'), icon='ERROR') return control.log("Resolved URL: %s" % repr(self.url)) item = control.item(path=self.url) item.setInfo(type='video', infoLabels=meta) item.setArt({ 'icon': thumb, 'thumb': thumb, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster }) item.setProperty('IsPlayable', 'true') item.setContentLookup(False) if mime_type: item.setMimeType(mime_type) elif not cookies: item.setProperty('inputstream.adaptive.manifest_type', 'hls') item.setProperty('inputstreamaddon', 'inputstream.adaptive') # if self.offset > 0: # duration = float(meta['duration']) if 'duration' in meta else 0 # if duration > 0: # item.setProperty('StartPercent', str((self.offset / duration) * 100)) # if self.offset > 0: # item.setProperty('resumetime', str(self.offset)) # duration = float(meta['duration']) if 'duration' in meta else self.offset # duration = duration * 1000.0 # item.setProperty('totaltime', str(duration)) control.resolve(syshandle, True, item) self.stopPlayingEvent = threading.Event() self.stopPlayingEvent.clear() self.credentials = info[ 'credentials'] if 'credentials' in info else None self.program_id = info['program_id'] if 'program_id' in info else None 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 not self.isLive and self.isPlaying(): 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 playlive(self, id, meta): control.log("Oi Play - play_stream: id=%s | meta=%s" % (id, meta)) if id is None: return try: url = self.geturl(id) except Exception as ex: control.okDialog(control.lang(31200), str(ex)) return encrypted = False # 'drm' in data and 'licenseUrl' in data['drm'] if encrypted: print('DRM Video!') if encrypted and not control.is_inputstream_available(): control.okDialog(control.lang(31200), control.lang(34103).encode('utf-8')) return # url = data['individualization']['url'] # url = url.replace('https://', 'http://') # hack # info = data['token']['cmsChannelItem'] # title = info['title'] control.log("live media url: %s" % url) try: meta = json.loads(meta) except: meta = { "playcount": 0, "overlay": 6, # "title": title, # "thumb": info['positiveLogoUrl'], # "mediatype": "video", # "aired": None, # "genre": info["categoryName"], # "plot": title, # "plotoutline": title } poster = meta['poster'] if 'poster' in meta else None thumb = meta['thumb'] if 'thumb' in meta else None self.offset = float(meta['milliseconds_watched']) / 1000.0 if 'milliseconds_watched' in meta else 0 self.isLive = True # info['isLive'] parsed_url = urlparse(url) if ".m3u8" in parsed_url.path: 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}) item.setProperty('IsPlayable', 'true') item.setInfo(type='Video', infoLabels=control.filter_info_labels(meta)) item.setContentLookup(False) # if ".mpd" in parsed_url.path: # mime_type = 'application/dash+xml' # item.setProperty('inputstream.adaptive.manifest_type', 'mpd') # if self.isLive: # item.setProperty('inputstream.adaptive.manifest_update_parameter', 'full') # # else: item.setProperty('inputstream.adaptive.manifest_type', 'hls') if encrypted: control.log("DRM: com.widevine.alpha") # licence_url = data['drm']['licenseUrl'] + '&token=' + data['drm']['jwtToken'] # item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') # 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 control.is_inputstream_available(): item.setProperty('inputstreamaddon', 'inputstream.adaptive') item.setProperty('inputstream', 'inputstream.adaptive') # Kodi 19 control.resolve(int(sys.argv[1]), True, item) control.log("Done playing. Quitting...")