def play(video): item = None if 'url' in video: item = xbmcgui.ListItem(path=video['url']) for protocol, protocol_info in PROTOCOLS.items(): if any(".%s" % extension in video['url'] for extension in protocol_info['extensions']): from inputstreamhelper import Helper is_helper = Helper(protocol, drm=DRM) if is_helper.check_inputstream(): item.setMimeType(protocol_info['mimetype']) item.setContentLookup(False) item.setProperty(INPUTSTREAM_PROP, is_helper.inputstream_addon) item.setProperty('inputstream.adaptive.manifest_type', protocol) item.setProperty('inputstream.adaptive.license_type', DRM) license_key = '%s|authorization=bearer %s|R{SSM}|' % ( LICENSE_URL, video['drm']) item.setProperty('inputstream.adaptive.license_key', license_key) item.setProperty( 'inputstream.adaptive.manifest_update_parameter', 'full') if item is not None: xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=True, listitem=item)
def playLiveTV(property_name, client_location, access_token, client_token, infoLabels={}): # Inputstream and DRM helper = Helper(protocol='mpd', drm='widevine') if helper.check_inputstream() == False: return url = 'https://vas-live-mdp.glomex.com/live/1.0/getprotocols?%s' % ( urllib.urlencode({ 'access_token': access_token, 'client_location': client_location, 'property_name': property_name, 'client_token': client_token, 'secure_delivery': 'true' })) data = getUrl(url) server_token = data.get('server_token') salt = '01!8d8F_)r9]4s[qeuXfP%' client_token = salt[:2] + sha1(''.join([ property_name, salt, access_token, server_token, client_location, 'dash:widevine' ]).encode('utf-8')).hexdigest() url = 'https://vas-live-mdp.glomex.com/live/1.0/geturls?%s' % ( urllib.urlencode({ 'access_token': access_token, 'client_location': client_location, 'property_name': property_name, 'protocols': 'dash:widevine', 'server_token': server_token, 'client_token': client_token, 'secure_delivery': 'true' })) data = getUrl(url)['urls']['dash']['widevine'] li = xbmcgui.ListItem(path=data['url'] + "|" + userAgent) li.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') li.setProperty('inputstream.adaptive.manifest_type', 'mpd') li.setProperty('inputstream.adaptive.manifest_update_parameter', 'full') li.setProperty('inputstreamaddon', 'inputstream.adaptive') try: lic = data['drm']['licenseAcquisitionUrl'] token = data['drm']['token'] li.setProperty('inputstream.adaptive.license_key', '%s?token=%s|%s|R{SSM}|' % (lic, token, userAgent)) except: pass if infoLabels and len(infoLabels) > 0: li.setInfo('video', ast.literal_eval(infoLabels)) xbmcplugin.setResolvedUrl(addon_handle, True, li)
def play(self, manifest_url, package_code, parental_rating=0, info_tag=None, art_tag=None, apix_id=None): # Inputstream and DRM helper = Helper(protocol='ism', drm='widevine') if not helper.check_inputstream(): return False # Jugendschutz if not self.parentalCheck(parental_rating, play=True): xbmcgui.Dialog().notification( 'Sky Ticket - FSK ' + str(parental_rating), 'Keine Berechtigung zum Abspielen dieses Eintrags.', xbmcgui.NOTIFICATION_ERROR, 2000, True) return False if self.login(username, password): if self.may_play(package_code): init_data = None # create init data for license acquiring if apix_id: init_data = self.get_init_data(self.sessionId, apix_id) # Prepare new ListItem to start playback li = xbmcgui.ListItem(path=manifest_url) if info_tag: li.setInfo('video', info_tag) if art_tag: li.setArt(art_tag) li.setProperty('inputstreamaddon', 'inputstream.adaptive') li.setProperty('inputstream.adaptive.license_type', self.license_type) li.setProperty('inputstream.adaptive.license_key', self.license_url) li.setProperty('inputstream.adaptive.manifest_type', 'ism') li.setProperty('inputstream.adaptive.license_flags', 'persistent_storage') if init_data: li.setProperty('inputstream.adaptive.license_data', init_data) # Start Playing xbmcplugin.setResolvedUrl(self.addon_handle, True, listitem=li) else: xbmcgui.Dialog().notification( 'Sky Ticket Fehler', 'Keine Berechtigung zum Abspielen dieses Eintrags', xbmcgui.NOTIFICATION_ERROR, 2000, True) else: xbmcgui.Dialog().notification('Sky Ticket Fehler', 'Fehler beim Login.', xbmcgui.NOTIFICATION_ERROR, 2000, True) print 'Fehler beim Einloggen'
def playLiveTV(property_name, client_location, access_token, client_token, infoLabels={}): from hashlib import sha1 # Inputstream and DRM helper = Helper(protocol='mpd', drm='widevine') isInputstream = helper.check_inputstream() url = 'https://vas-live-mdp.glomex.com/live/1.0/getprotocols?%s' % (urllib.urlencode({ 'access_token': access_token, 'client_location': client_location, 'property_name': property_name, 'client_token': client_token, 'secure_delivery': 'true' })) data = getUrl(url) server_token = data.get('server_token') salt = '01!8d8F_)r9]4s[qeuXfP%' client_token = salt[:2] + sha1(''.join([property_name, salt, access_token, server_token, client_location, 'dash:widevine']).encode('utf-8')).hexdigest() url = 'https://vas-live-mdp.glomex.com/live/1.0/geturls?%s' % (urllib.urlencode({ 'access_token': access_token, 'client_location': client_location, 'property_name': property_name, 'protocols': 'dash:widevine', 'server_token': server_token, 'client_token': client_token, 'secure_delivery': 'true' })) print url data = getUrl(url)['urls']['dash']['widevine'] li = xbmcgui.ListItem(path=data['url'] + "|"+userAgent) li.setProperty("inputstream.adaptive.license_type", "com.widevine.alpha") li.setProperty("inputstream.adaptive.manifest_type", "mpd") li.setProperty('inputstreamaddon', 'inputstream.adaptive') try: lic = data["drm"]["licenseAcquisitionUrl"] token = data["drm"]["token"] li.setProperty('inputstream.adaptive.license_key', lic +"?token="+token+"|"+userAgent+"|R{SSM}|") except: pass if infoLabels is not None and len(infoLabels) > 0: try: li.setInfo('video', ast.literal_eval(infoLabels)) except: pass xbmcplugin.setResolvedUrl(addon_handle, True, li)
def playLive(entry): # Inputstream and DRM helper = Helper(protocol='mpd', drm='widevine') if helper.check_inputstream() == False: return url = 'https://vas-live-mdp.glomex.com/live/1.0/getprotocols?{0}'.format( urllib.urlencode({ 'access_token': entry.get('access_token'), 'client_location': entry.get('client_location'), 'property_name': entry.get('property_name'), 'client_token': entry.get('client_token'), 'secure_delivery': 'true' })) data = requests.get(url).json() server_token = data.get('server_token') salt = '01!8d8F_)r9]4s[qeuXfP%' client_token = '{0}{1}'.format( salt[:2], sha1('{0}{1}{2}{3}{4}{5}'.format( entry.get('property_name'), salt, entry.get('access_token'), server_token, entry.get('client_location'), 'dash:widevine').encode('utf-8')).hexdigest()) url = 'https://vas-live-mdp.glomex.com/live/1.0/geturls?{0}'.format( urllib.urlencode({ 'access_token': entry.get('access_token'), 'client_location': entry.get('client_location'), 'property_name': entry.get('property_name'), 'protocols': 'dash:widevine', 'server_token': server_token, 'client_token': client_token, 'secure_delivery': 'true' })) data = requests.get(url).json()['urls']['dash']['widevine'] li = xbmcgui.ListItem(path='{0}|{1}'.format(data['url'], userAgent)) li.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') li.setProperty('inputstream.adaptive.manifest_type', 'mpd') li.setProperty('inputstream.adaptive.manifest_update_parameter', 'full') li.setProperty('inputstreamaddon', 'inputstream.adaptive') try: lic = data['drm']['licenseAcquisitionUrl'] token = data['drm']['token'] li.setProperty( 'inputstream.adaptive.license_key', '{0}?token={1}|{2}|{3}|'.format(lic, token, userAgent, 'R{SSM}')) except: pass xbmcplugin.setResolvedUrl(addon_handle, True, li)
def playdash(file, session, userid, channelid, ids, desc="", title="", is_type="", mediathek=0): helper = Helper(protocol='mpd', drm='widevine') if not helper.check_inputstream(): xbmc.executebuiltin( 'Notification("Inputstream", "DRM geschützte Folgen gehen nur mit Inputstream")' ) header = [] header.append(("Authorization", "Bearer " + session)) header.append(("UserId", userid)) content = getUrl(baseurl + "/api/time/v1", header=header) struktur = json.loads(content) timestamp = int(struktur["nowUnixtime"]) newurl = baseurl + "/api/airing/v2/" + str(ids) content = getUrl(newurl, header=header) struktur2 = json.loads(content) title = struktur2["title"] try: desc = struktur2["description"] except: desc = "" try: stop = struktur["stopUnixtime"] dauer = stop - timestamp except: dauer = 0 stop = 0 listitem = xbmcgui.ListItem(path=file) pin = addon.getSetting("pin") lic_header = "|Authorization=Bearer%20" + session + "&UserId=" + userid + "&Magine-ChannelId=" + channelid + "&Magine-Md=PC-Awesomesauce" + "&Magine-ParentalControlPinCode=" + pin + "&Magine-Mk=HTML5" + "&Magine-ClientId=c060c1bf-d805-4feb-74d4-d8241e27d836" + "&Magine-ProgramId=" + ids + "|R{SSM}|" listitem.setProperty(is_type + '.license_type', 'com.widevine.alpha') listitem.setProperty( is_type + '.license_key', "https://magine.com/api/drm/v4/license/widevine" + lic_header) if mediathek == 0: listitem.setProperty( is_type + '.license_data', base64.b64encode(b'\x08\x01\x12\x10' + '{KID}' + b'\x1A\x05' + 'tvoli"' + chr(len('channel.' + channelid + '.' + ids)) + 'channel.' + channelid + '.' + ids + '*' + b'\x02' + 'SD2' + b'\x00')) listitem.setProperty('inputstreamaddon', is_type) listitem.setProperty(is_type + ".manifest_type", "mpd") listitem.setInfo("video", {"Title": title, "Plot": desc}) return listitem, dauer, title
def playdash(mpd, key, url): helper = Helper(protocol='mpd', drm='widevine') if not helper.check_inputstream(): xbmc.executebuiltin( 'Notification("Inputstream", "DRM geschützte Folgen gehen nur mit Inputstream")' ) debug("playdash") debug(mpd) debug(key) listitem = widevinelist(mpd, key, "") xbmcplugin.setResolvedUrl(addon_handle, True, listitem)
def play(self, manifest_url, package_code, parental_rating=0, info_tag=None, art_tag=None, apix_id=None, webvod_url=None): # Inputstream and DRM helper = Helper(protocol='ism', drm='widevine') if helper.check_inputstream(): # Jugendschutz if not self.parentalCheck(parental_rating, play=True): xbmcgui.Dialog().notification('Sky Go: FSK {0}'.format(parental_rating), 'Keine Berechtigung zum Abspielen dieses Eintrags.', xbmcgui.NOTIFICATION_ERROR, 2000, True) xbmc.log('[Sky Go] FSK {0}: Keine Berechtigung zum Abspielen'.format(parental_rating)) if self.login(): if self.may_play(package_code): init_data = None # create init data for license acquiring if apix_id: init_data = self.get_init_data(self.sessionId, apix_id) # Prepare new ListItem to start playback li = xbmcgui.ListItem(path=manifest_url) if info_tag: li.setInfo('video', info_tag) if art_tag: li.setArt(art_tag) li.setProperty('inputstreamaddon', 'inputstream.adaptive') li.setProperty('inputstream.adaptive.license_type', self.license_type) li.setProperty('inputstream.adaptive.manifest_type', 'ism') li.setProperty('inputstream.adaptive.license_flags', 'persistent_storage') li.setProperty('inputstream.adaptive.stream_headers', 'User-Agent={0}'.format(self.user_agent)) if self.license_url: webvod_url = webvod_url if webvod_url and webvod_url != '' else self.referer license_key = '{0}|User-Agent={1}&Referer={2}&Content-Type=|R{{SSM}}|'.format(self.license_url, self.user_agent, webvod_url) li.setProperty('inputstream.adaptive.license_key', license_key) if init_data: li.setProperty('inputstream.adaptive.license_data', init_data) # Start Playing xbmcplugin.setResolvedUrl(self.common.addon_handle, True, li) return else: xbmcgui.Dialog().notification('Sky Go: Berechtigung', 'Keine Berechtigung zum Abspielen dieses Eintrags', xbmcgui.NOTIFICATION_ERROR, 2000, True) xbmc.log('[Sky Go] Keine Berechtigung zum Abspielen') xbmc.log('[Sky Go] Berechtigungen = {0}'.format(self.entitlements)) xbmc.log('[Sky Go] Geforderte Berechtigung = {0}'.format(package_code)) else: xbmc.log('[Sky Go] Fehler beim Login') xbmcplugin.setResolvedUrl(self.common.addon_handle, False, xbmcgui.ListItem())
def _check_inputstream(): """ Check if inputstreamhelper and inputstream.adaptive are fine. :rtype boolean """ try: from inputstreamhelper import Helper is_helper = Helper('mpd', drm='com.widevine.alpha') if not is_helper.check_inputstream(): # inputstreamhelper has already shown an error return False except ImportError: kodiutils.ok_dialog(message=kodiutils.localize(30708)) # Please reboot Kodi return False return True
def play(self, item, quality=0): if quality == 7: # inputstream.adaptive if not Helper("hls").check_inputstream(): return False item.setProperty("inputstreamaddon", "inputstream.adaptive") item.setProperty("inputstream.adaptive.manifest_type", "hls") xbmcplugin.setResolvedUrl(self.handle, True, item) return True
def riproduci_video(self, pid, live=False): from inputstreamhelper import Helper # pylint: disable=import-error kodiutils.log("Trying to get the video from pid" + pid) data = self.med.OttieniDatiVideo(pid, live) if data['type'] == 'video/mp4': kodiutils.setResolvedUrl(data['url']) return is_helper = Helper('mpd', 'com.widevine.alpha' if data['security'] else None) if not is_helper.check_inputstream(): kodiutils.showOkDialog(kodiutils.LANGUAGE(32132), kodiutils.LANGUAGE(32133)) kodiutils.setResolvedUrl(solved=False) return headers = '&User-Agent={useragent}'.format(useragent=self.ua) props = {'manifest_type': 'mpd', 'stream_headers': headers} if data['security']: user = kodiutils.getSetting('email') password = kodiutils.getSetting('password') if user == '' or password == '': kodiutils.showOkDialog(kodiutils.LANGUAGE(32132), kodiutils.LANGUAGE(32134)) kodiutils.setResolvedUrl(solved=False) return if not self.med.login(user, password): kodiutils.showOkDialog(kodiutils.LANGUAGE(32132), kodiutils.LANGUAGE(32135)) kodiutils.setResolvedUrl(solved=False) return headers += '&Accept=*/*&Content-Type=' props['license_type'] = 'com.widevine.alpha' props['stream_headers'] = headers url = self.med.OttieniWidevineAuthUrl(data['pid']) props['license_key'] = '{url}|{headers}|R{{SSM}}|'.format( url=url, headers=headers) headers = { 'user-agent': self.ua, 't-apigw': self.med.apigw, 't-cts': self.med.cts } kodiutils.setResolvedUrl(data['url'], headers=headers, ins=is_helper.inputstream_addon, insdata=props)
def getPlayableItem(video): item = None if 'url' in video: item = xbmcgui.ListItem(path=video['url']) if '.mpd' in video['url']: from inputstreamhelper import Helper is_helper = Helper('mpd', drm='com.widevine.alpha') if is_helper.check_inputstream(): item.setProperty('inputstreamaddon', is_helper.inputstream_addon) item.setProperty('inputstream.adaptive.manifest_type', 'mpd') item.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha') item.setProperty('inputstream.adaptive.manifest_update_parameter', 'full') # TODO check this item.setContentLookup(False) # TODO check this # TODO: get license url from config licUrl = 'https://prod-lic2widevine.sd-ngp.net/proxy|authorization=bearer ' + video['drm'] + '|R{SSM}|' item.setProperty('inputstream.adaptive.license_key', licUrl) return item
def play(self, item, manifest, mime=None): if not Helper(manifest).check_inputstream(): return False item.setProperty("inputstreamaddon", "inputstream.adaptive") item.setProperty("inputstream.adaptive.manifest_type", manifest) if mime: item.setMimeType(mime) item.setContentLookup(False) xbmcplugin.setResolvedUrl(self.handle, True, item) return True
def playItem(self, item, manifestType, mimeType=None, headers=None): if not Helper(manifestType).check_inputstream(): return False item.setProperty("inputstream", "inputstream.adaptive") item.setProperty("inputstream.adaptive.manifest_type", manifestType) if headers and isinstance(headers, dict): headers = "&".join( ("=".join(header) for header in headers.items())) item.setProperty("inputstream.adaptive.stream_headers", headers) return super(InvidiousPlugin, self).playItem(item, mimeType=mimeType)
def setup(self): # STEP 0 - SETUP DRM from inputstreamhelper import Helper is_helper = Helper('mpd', drm='com.widevine.alpha') is_helper.check_inputstream() # STEP 1, show country selection dialog li_items_list = [] for country in HbogoConstants.countries: li_items_list.append(xbmcgui.ListItem(label=country[0], label2=country[1])) li_items_list[-1].setArt({'thumb': "https://www.countryflags.io/" + country[1] + "/flat/64.png", 'icon': "https://www.countryflags.io/" + country[1] + "/flat/64.png"}) index = xbmcgui.Dialog().select(self.language(30441), li_items_list, useDetails=True) if index != -1: country_id = li_items_list[index].getLabel2() self.addon.setSetting('country_code', country_id) else: sys.exit()
def _mode_watch(self, video_id, version=None): # type: (Text, Optional[Text]) -> None is_helper = Helper("mpd") streams = self._api.get_video_streams(video_id) if not version: # First stream is default version = next(iter(streams), None) if not version: _LOGGER.error("No stream available for video %s", video_id) return video_url = streams[version].url else: if version not in streams: _LOGGER.error('No stream "%s" available for video %s', version, video_id) return video_url = streams[version].url logging.debug("Stream URL for video %s: %s", video_id, video_url) listitem = ListItem(path=video_url, offscreen=True) # Use inpoutstream.adaptive for better HLS stream management if is_helper.check_inputstream(): listitem.setMimeType("application/vnd.apple.mpegurl") listitem.setProperty("inputstream.adaptive.manifest_type", "hls") if _KODI_VERSION >= 19: listitem.setProperty("inputstream", is_helper.inputstream_addon) else: listitem.setProperty("inputstreamaddon", is_helper.inputstream_addon) xbmcplugin.setResolvedUrl(self._handle, True, listitem)
def play(url, name, logo, idCh, retry=False): if (idCh != None): deviceIdFile = os.path.join( xbmcvfs.translatePath(addon.getAddonInfo('profile')), '.deviceId') digi = DigiApi(deviceIdFile=deviceIdFile) if (digi.login(addon.getSetting('username'), addon.getSetting('password')) == False): xbmcgui.Dialog().ok(addon.getLocalizedString(30013), digi.error) return url = digi.getPlayStream(idCh) if (url == False): #error #Pentru acces la programele transmise prin DigiOnline trebuie sa aveti un serviciu. (303) if (retry == True or digi.errorCode != '303'): xbmcgui.Dialog().ok(addon.getLocalizedString(30013), digi.error) else: #retry by relogin os.remove(deviceIdFile) play(url, name, logo, idCh, True) return player = xbmc.Player() osAndroid = xbmc.getCondVisibility('system.platform.android') if (osAndroid): from streamplayer import streamplayer player = streamplayer(fakeRequest=True) listitem = xbmcgui.ListItem(name) listitem.setInfo('video', {'Title': name}) player.play(url, listitem) else: addon_log(url) digi = Digi(deviceId=addon.getSetting('deviceId'), DOSESSV3PRI=addon.getSetting('DOSESSV3PRI')) url = digi.scrapPlayUrl(url) if (url['err'] != None): addon_log(url['err']) xbmcgui.Dialog().ok(addon.getLocalizedString(30013), url['err']) else: if '.mpd' in url['url']: from inputstreamhelper import Helper # type: ignore listitem = xbmcgui.ListItem(name, thumbnailImage=logo) listitem.setInfo('video', {'Title': name}) KODI_VERSION_MAJOR = int( xbmc.getInfoLabel('System.BuildVersion').split('.')[0]) PROTOCOL = 'mpd' DRM = 'com.widevine.alpha' MIME_TYPE = 'application/dash+xml' LICENSE_URL = 'https://wvp-cdn.rcs-rds.ro/proxy' license_headers = 'verifypeer=false' license_key = LICENSE_URL + '|' + license_headers + '|R{SSM}|' is_helper = Helper(PROTOCOL, drm=DRM) if is_helper.check_inputstream(): listitem = xbmcgui.ListItem(path=url['url']) listitem.setContentLookup(False) listitem.setMimeType(MIME_TYPE) if KODI_VERSION_MAJOR >= 19: listitem.setProperty('inputstream', is_helper.inputstream_addon) else: listitem.setProperty('inputstreamaddon', is_helper.inputstream_addon) listitem.setProperty('inputstream.adaptive.manifest_type', PROTOCOL) listitem.setProperty('inputstream.adaptive.license_type', DRM) listitem.setProperty('inputstream.adaptive.license_key', license_key) # inject subtitles folder = xbmc.translatePath(addon.getAddonInfo('profile')) folder = folder + 'subs' + os.sep # if inject subtitles is enable cache direct subtitle links if available and set subtitles from cache addon_log( "Cache subtitles enabled, downloading and converting subtitles in: " + folder) if not os.path.exists(os.path.dirname(folder)): try: os.makedirs(os.path.dirname(folder)) except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise try: files = os.listdir(folder) for f in files: os.remove(folder + f) subtitles = url['subtitles'] if len(subtitles) > 0: subs_paths = [] for sub in subtitles: addon_log( "Processing subtitle language code: " + sub['SubFileName'] + " URL: " + sub['Url']) r = requests.get(sub['Url']) with open(folder + sub['SubFileName'], 'wb') as f: f.write(r.content) vtt_to_srt(folder + sub['SubFileName']) subs_paths.append(folder + sub['SubFileName']) listitem.setSubtitles(subs_paths) addon_log("Local subtitles set") else: addon_log( "Inject subtitles error: No subtitles for the media" ) except KeyError: addon_log("Inject subtitles error: No subtitles key") except Exception: addon_log("Unexpected inject subtitles error: " + traceback.format_exc()) xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, listitem) else: player = xbmc.Player() osAndroid = xbmc.getCondVisibility('system.platform.android') if (osAndroid): from streamplayer import streamplayer player = streamplayer( deviceId=addon.getSetting('deviceId'), DOSESSV3PRI=addon.getSetting('DOSESSV3PRI')) listitem = xbmcgui.ListItem(name) listitem.setInfo('video', {'Title': name}) player.play(url['url'], listitem)
def rollback(): """The API interface to rollback Widevine CDM""" Helper('mpd', drm='widevine').rollback_libwv()
def start_is_helper(self): helper = Helper(protocol='hls') return helper.check_inputstream()
def widevine_remove(): """The API interface to remove Widevine CDMs""" Helper('mpd', drm='widevine').remove_widevine()
def info_dialog(): """The API interface to show an info Dialog""" Helper('mpd', drm='widevine').info_dialog()
def check_inputstream(protocol, drm=None): """The API interface to check inputstream""" Helper(protocol, drm=drm).check_inputstream()
def widevine_install(): """The API interface to install Widevine CDM""" Helper('mpd', drm='widevine').install_widevine()
def play(self, content_id, retry=0): self.log("Initializing playback... " + str(content_id)) self.login() media_item = self.get_from_hbogo( self.API_URL_BROWSE + content_id + self.LANGUAGE_CODE, 'xml') if media_item is False: return media_info = self.construct_media_info(media_item.find('.//item')) if self.lograwdata: self.log("Play Media: ") self.log(ET.tostring(media_item, encoding='utf8')) mpd_pre_url = media_item.find( './/media:content[@profile="HBO-DASH-WIDEVINE"]', namespaces=self.NAMESPACES).get('url') + '&responseType=xml' mpd = self.get_from_hbogo(mpd_pre_url, 'xml', False) if mpd is False: return if self.lograwdata: self.log("Manifest: ") self.log(ET.tostring(mpd, encoding='utf8')) mpd_url = mpd.find('.//url').text self.log("Manifest url: " + str(mpd_url)) media_guid = media_item.find('.//guid').text license_headers = 'X-Clearleap-AssetID=' + media_guid + '&X-Clearleap-DeviceId=' + self.API_DEVICE_ID + \ '&X-Clearleap-DeviceToken=' + self.API_DEVICE_TOKEN + '&Content-Type=' license_url = 'https://' + self.API_HOST + '/cloffice/drm/wv/' + media_guid + '|' + license_headers + '|R{SSM}|' li = xbmcgui.ListItem(path=mpd_url) li.setArt(media_info["art"]) li.setInfo(type="Video", infoLabels=media_info["info"]) protocol = 'mpd' drm = 'com.widevine.alpha' li.setContentLookup(False) li.setMimeType('application/dash+xml') from inputstreamhelper import Helper # type: ignore is_helper = Helper(protocol, drm=drm) if is_helper.check_inputstream(): if sys.version_info < ( 3, 0 ): # if python version < 3 is safe to assume we are running on Kodi 18 li.setProperty( 'inputstreamaddon', 'inputstream.adaptive') # compatible with Kodi 18 API else: li.setProperty('inputstream', 'inputstream.adaptive' ) # compatible with recent builds Kodi 19 API li.setProperty('inputstream.adaptive.license_type', drm) li.setProperty('inputstream.adaptive.manifest_type', protocol) li.setProperty('inputstream.adaptive.license_key', license_url) # GET SUBTITLES if self.addon.getSetting('forcesubs') == 'true': folder = KodiUtil.translatePath( self.addon.getAddonInfo('profile')) folder = folder + 'subs' self.clean_sub_cache(folder) folder = folder + os.sep + media_guid + os.sep self.log( "Cache subtitles enabled, downloading and converting subtitles in: " + folder) if not os.path.exists(os.path.dirname(folder)): try: os.makedirs(os.path.dirname(folder)) except OSError as exc: # Guard against race condition if exc.errno != errno.EEXIST: raise try: subs = media_item.findall('.//media:subTitle', namespaces=self.NAMESPACES) subs_paths = [] for sub in subs: self.log("Processing subtitle language code: " + sub.get('lang') + " URL: " + sub.get('href')) r = requests.get(sub.get('href')) with open(folder + sub.get('lang') + ".xml", 'wb') as f: f.write(r.content) ttml = Ttml2Srt( py2_encode(folder + sub.get('lang') + ".xml"), 25) srt_file = ttml.write2file( ttml.mfn2srtfn( py2_encode(folder + sub.get('lang')), ttml.lang, False)) self.log("Subtitle converted to srt format") subs_paths.append(srt_file) self.log("Subtitle added: " + srt_file) li.setSubtitles(subs_paths) self.log("Local subtitles set") except Exception: self.log("Unexpected error in subtitles processing: " + traceback.format_exc()) self.log("Play url: " + str(li)) xbmcplugin.setResolvedUrl(self.handle, True, listitem=li) else: self.log("DRM problem playback not possible") xbmcplugin.setResolvedUrl(self.handle, False, listitem=li)
def IStreamPlayback(trailer, isAdult, extern): drm_check = var.addon.getSetting("drm_check") == 'true' verifyISA = '{"jsonrpc":"2.0","id":1,"method":"Addons.GetAddonDetails","params":{"addonid":"inputstream.adaptive"}}' if 'error' in xbmc.executeJSONRPC(verifyISA): xbmc.executebuiltin('UpdateAddonRepos', True) xbmc.executebuiltin('InstallAddon(inputstream.adaptive)', True) if 'error' in xbmc.executeJSONRPC(verifyISA): Log('InputStream.Adaptive addon is not installed') playDummyVid() return True inputstream_helper = Helper('mpd', drm='com.widevine.alpha') vMT = 'Trailer' if trailer else 'Feature' if not inputstream_helper.check_inputstream(): Log('No Inputstream Addon found or activated') return True cookie = MechanizeLogin() if not cookie: Dialog.notification(getString(30203), getString(30200), xbmcgui.NOTIFICATION_ERROR) Log('Login error at playback') playDummyVid() return True mpd, subs = getStreams(*getUrldata('catalog/GetPlaybackResources', var.args.get('asin'), extra=True, vMT=vMT, useCookie=cookie), retmpd=True) cj_str = ';'.join(['%s=%s' % (k, v) for k, v in cookie.items()]) opt = '|Content-Type=application%2Fx-www-form-urlencoded&Cookie=' + urllib.quote_plus(cj_str) opt += '|widevine2Challenge=B{SSM}&includeHdcpTestKeyInLicense=true' opt += '|JBlicense;hdcpEnforcementResolutionPixels' licURL = getUrldata('catalog/GetPlaybackResources', var.args.get('asin'), extra=True, vMT=vMT, dRes='Widevine2License', opt=opt, retURL=True) if not mpd: Dialog.notification(getString(30203), subs, xbmcgui.NOTIFICATION_ERROR) return True is_version = xbmcaddon.Addon(is_addon).getAddonInfo('version') if is_addon else '0' is_binary = xbmc.getCondVisibility('System.HasAddon(kodi.binary.instance.inputstream)') mpd = re.sub(r'~', '', mpd) if drm_check: mpdcontent = getURL(mpd, rjson=False) if 'avc1.4D00' in mpdcontent and not platform & OS_ANDROID and not is_binary: return extrFr(mpdcontent) Log(mpd) infoLabels = GetStreamInfo(var.args.get('asin')) mpaa_str = RestrAges + getString(30171) mpaa_check = infoLabels.get('MPAA', mpaa_str) in mpaa_str or isAdult if mpaa_check and not RequestPin(): return True listitem = xbmcgui.ListItem(path=mpd) if extern: infoLabels['Title'] = infoLabels.get('EpisodeName', infoLabels['Title']) if trailer: infoLabels['Title'] += ' (Trailer)' if 'Thumb' not in infoLabels.keys(): infoLabels['Thumb'] = None if 'Fanart' in infoLabels.keys(): listitem.setArt({'fanart': infoLabels['Fanart']}) if 'Poster' in infoLabels.keys(): listitem.setArt({'tvshow.poster': infoLabels['Poster']}) else: listitem.setArt({'poster': infoLabels['Thumb']}) if 'adaptive' in is_addon: listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') Log('Using %s Version:%s' %(is_addon, is_version)) listitem.setArt({'thumb': infoLabels['Thumb']}) listitem.setInfo('video', getInfolabels(infoLabels)) listitem.setSubtitles(subs) listitem.setProperty('%s.license_type' % is_addon, 'com.widevine.alpha') listitem.setProperty('%s.license_key' % is_addon, licURL) listitem.setProperty('%s.stream_headers' % is_addon, 'user-agent=' + UserAgent) listitem.setProperty('inputstreamaddon', is_addon) listitem.setMimeType('application/dash+xml') listitem.setContentLookup(False) player = AmazonPlayer() player.asin = var.args.get('asin') player.cookie = cookie player.content = trailer player.extern = extern player.resolve(listitem) starttime = time.time() while not xbmc.abortRequested and player.running: if player.isPlayingVideo(): player.video_lastpos = player.getTime() if time.time() > starttime + player.interval: starttime = time.time() player.updateStream('PLAY') sleep(1) del player return True
def _IStreamPlayback(asin, name, streamtype, isAdult, extern): from .ages import AgeRestrictions vMT = ['Feature', 'Trailer', 'LiveStreaming'][streamtype] dRes = 'PlaybackUrls' if streamtype > 1 else 'PlaybackUrls,SubtitleUrls,ForcedNarratives,TransitionTimecodes' opt = '&liveManifestType=accumulating,live&playerType=xp&playerAttributes={"frameRate":"HFR"}' if streamtype > 1 else '' mpaa_str = AgeRestrictions().GetRestrictedAges() + getString(30171) drm_check = g.addon.getSetting("drm_check") == 'true' inputstream_helper = Helper('mpd', drm='com.widevine.alpha') if not inputstream_helper.check_inputstream(): Log('No Inputstream Addon found or activated') _playDummyVid() return True cookie = MechanizeLogin() if not cookie: g.dialog.notification(getString(30203), getString(30200), xbmcgui.NOTIFICATION_ERROR) Log('Login error at playback') _playDummyVid() return True mpd, subs, timecodes = _ParseStreams( *getURLData('catalog/GetPlaybackResources', asin, extra=True, vMT=vMT, dRes=dRes, useCookie=cookie, proxyEndpoint='gpr', opt=opt), retmpd=True, bypassproxy=s.bypassProxy or (streamtype > 1)) if not mpd: g.dialog.notification(getString(30203), subs, xbmcgui.NOTIFICATION_ERROR) _playDummyVid() return True skip = timecodes.get('skipElements') Log('Skip Items: %s' % skip, Log.DEBUG) cj_str = ';'.join(['%s=%s' % (k, v) for k, v in cookie.items()]) opt = '|Content-Type=application%2Fx-www-form-urlencoded&Cookie=' + quote_plus( cj_str) opt += '|widevine2Challenge=B{SSM}&includeHdcpTestKeyInLicense=true' opt += '|JBlicense;hdcpEnforcementResolutionPixels' licURL = getURLData('catalog/GetPlaybackResources', asin, opt=opt, extra=True, vMT=vMT, dRes='Widevine2License', retURL=True) from xbmcaddon import Addon as KodiAddon is_version = KodiAddon( g.is_addon).getAddonInfo('version') if g.is_addon else '0' is_binary = xbmc.getCondVisibility( 'System.HasAddon(kodi.binary.instance.inputstream)') if (not s.audioDescriptions) and (streamtype != 2): mpd = re.sub(r'(~|%7E)', '', mpd) if drm_check and (not g.platform & g.OS_ANDROID) and (not is_binary): mpdcontent = getURL(mpd, useCookie=cookie, rjson=False) if 'avc1.4D00' in mpdcontent: # xbmc.executebuiltin('ActivateWindow(busydialog)') return _extrFr(mpdcontent) Log(mpd, Log.DEBUG) if g.KodiVersion < 18 and extern: content = getATVData('GetASINDetails', 'ASINList=' + asin)['titles'][0] ct, Info = g.amz.getInfos(content, False) title = Info['DisplayTitle'] thumb = Info.get('Poster', Info['Thumb']) mpaa_check = str(Info.get('MPAA', mpaa_str)) in mpaa_str or isAdult else: mpaa_check = _getListItem('MPAA') in mpaa_str + mpaa_str.replace( ' ', '') or isAdult title = _getListItem('Label') thumb = _getListItem('Art(season.poster)') if not thumb: thumb = _getListItem('Art(tvshow.poster)') if not thumb: thumb = _getListItem('Art(thumb)') if streamtype == 1: title += ' (Trailer)' if not title: title = name if mpaa_check and not AgeRestrictions().RequestPin(): return True listitem = xbmcgui.ListItem(label=title, path=mpd) if g.KodiVersion < 18 and extern: listitem.setInfo('video', getInfolabels(Info)) if 'adaptive' in g.is_addon: listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') Log('Using %s Version: %s' % (g.is_addon, is_version)) listitem.setArt({'thumb': thumb}) listitem.setSubtitles(subs) listitem.setProperty('%s.license_type' % g.is_addon, 'com.widevine.alpha') listitem.setProperty('%s.license_key' % g.is_addon, licURL) listitem.setProperty('%s.stream_headers' % g.is_addon, 'user-agent=' + getConfig('UserAgent')) listitem.setProperty( 'inputstreamaddon' if g.KodiVersion < 19 else 'inputstream', g.is_addon) listitem.setMimeType('application/dash+xml') listitem.setContentLookup(False) player = _AmazonPlayer() player.asin = asin player.cookie = cookie player.content = streamtype player.extern = extern player.resolve(listitem) starttime = time.time() skip_button = _SkipButton() while (not g.monitor.abortRequested()) and player.running: if player.isPlayingVideo(): player.video_lastpos = player.getTime() if time.time() > (starttime + player.interval): starttime = time.time() player.updateStream('PLAY') if skip and s.skip_scene > 0: for elem in skip: st_pos = elem.get('startTimecodeMs') et_pos = (elem.get('endTimecodeMs') - 5000 ) # * 0.9 + st_pos btn_type = elem.get('elementType') if st_pos <= (player.video_lastpos * 1000) <= et_pos: skip_button.display(elem) elif skip_button.act_btn == btn_type: skip_button.hide() g.monitor.waitForAbort(1) skip_button.hide() player.finished(True) del player, skip_button return True
def start_is_helper(self): helper = Helper(protocol='mpd', drm='widevine') return helper.check_inputstream()
def IStreamPlayback(trailer, isAdult, extern): drm_check = var.addon.getSetting("drm_check") == 'true' verifyISA = '{"jsonrpc":"2.0","id":1,"method":"Addons.GetAddonDetails","params":{"addonid":"inputstream.adaptive"}}' if 'error' in xbmc.executeJSONRPC(verifyISA): xbmc.executebuiltin('UpdateAddonRepos', True) xbmc.executebuiltin('InstallAddon(inputstream.adaptive)', True) if 'error' in xbmc.executeJSONRPC(verifyISA): Log('InputStream.Adaptive addon is not installed') playDummyVid() return True inputstream_helper = Helper('mpd', drm='com.widevine.alpha') vMT = 'Trailer' if trailer else 'Feature' if not inputstream_helper.check_inputstream(): Log('No Inputstream Addon found or activated') return True cookie = MechanizeLogin() if not cookie: Dialog.notification(getString(30203), getString(30200), xbmcgui.NOTIFICATION_ERROR) Log('Login error at playback') playDummyVid() return True mpd, subs = getStreams(*getUrldata('catalog/GetPlaybackResources', var.args.get('asin'), extra=True, vMT=vMT, useCookie=cookie), retmpd=True) cj_str = ';'.join(['{}={}'.format(k, v) for k, v in cookie.items()]) opt = '|Content-Type=application%2Fx-www-form-urlencoded&Cookie=' + quote_plus( cj_str) opt += '|widevine2Challenge=B{SSM}&includeHdcpTestKeyInLicense=true' opt += '|JBlicense;hdcpEnforcementResolutionPixels' licURL = getUrldata('catalog/GetPlaybackResources', var.args.get('asin'), extra=True, vMT=vMT, dRes='Widevine2License', opt=opt, retURL=True) if not mpd: Dialog.notification(getString(30203), subs, xbmcgui.NOTIFICATION_ERROR) return True is_version = xbmcaddon.Addon(is_addon).getAddonInfo( 'version') if is_addon else '0' is_binary = xbmc.getCondVisibility( 'System.HasAddon(kodi.binary.instance.inputstream)') mpd = re.sub(r'~', '', mpd) if drm_check: mpdcontent = getURL(mpd, rjson=False) if 'avc1.4D00' in mpdcontent and not platform & OS_ANDROID and not is_binary: return extrFr(mpdcontent) Log(mpd) infoLabels = GetStreamInfo(var.args.get('asin')) mpaa_str = RestrAges + getString(30171) mpaa_check = infoLabels.get('MPAA', mpaa_str) in mpaa_str or isAdult if mpaa_check and not RequestPin(): return True listitem = xbmcgui.ListItem(path=mpd) if extern: infoLabels['Title'] = infoLabels.get('EpisodeName', infoLabels['Title']) if trailer: infoLabels['Title'] += ' (Trailer)' if 'Thumb' not in infoLabels.keys(): infoLabels['Thumb'] = None if 'Fanart' in infoLabels.keys(): listitem.setArt({'fanart': infoLabels['Fanart']}) if 'Poster' in infoLabels.keys(): listitem.setArt({'tvshow.poster': infoLabels['Poster']}) else: listitem.setArt({'poster': infoLabels['Thumb']}) if 'adaptive' in is_addon: listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') Log('Using {} Version:{}'.format(is_addon, is_version)) listitem.setArt({'thumb': infoLabels['Thumb']}) listitem.setInfo('video', getInfolabels(infoLabels)) listitem.setSubtitles(subs) listitem.setProperty('{}.license_type'.format(is_addon), 'com.widevine.alpha') listitem.setProperty('{}.license_key'.format(is_addon), licURL) listitem.setProperty('{}.stream_headers'.format(is_addon), 'user-agent=' + UserAgent) listitem.setProperty('inputstreamaddon', is_addon) listitem.setMimeType('application/dash+xml') listitem.setContentLookup(False) player = AmazonPlayer() player.asin = var.args.get('asin') player.cookie = cookie player.content = trailer player.extern = extern player.resolve(listitem) starttime = time.time() monitor = xbmc.Monitor() while (not monitor.abortRequested()) and player.running: if player.isPlayingVideo(): player.video_lastpos = player.getTime() if time.time() > starttime + player.interval: starttime = time.time() player.updateStream('PLAY') sleep(1) del player return True
def play(self, category, item): """ Play the requested item. :type category: string :type item: string """ # Check if inputstreamhelper is correctly installed try: from inputstreamhelper import Helper is_helper = Helper('mpd', drm='com.widevine.alpha') if not is_helper.check_inputstream(): # inputstreamhelper has already shown an error return except ImportError: self._kodi.show_ok_dialog(message=self._kodi.localize(30708)) # Please reboot Kodi return try: # Get stream information resolved_stream = self._vtm_go_stream.get_stream(category, item) except StreamGeoblockedException: self._kodi.show_ok_dialog(heading=self._kodi.localize(30709), message=self._kodi.localize(30710)) # This video is geo-blocked... self._kodi.end_of_directory() return except StreamUnavailableException: self._kodi.show_ok_dialog(heading=self._kodi.localize(30711), message=self._kodi.localize(30712)) # The video is unavailable... self._kodi.end_of_directory() return info_dict = { 'tvshowtitle': resolved_stream.program, 'title': resolved_stream.title, 'duration': resolved_stream.duration, } prop_dict = {} stream_dict = { 'duration': resolved_stream.duration, } # Lookup metadata try: if category in ['movies', 'oneoffs']: info_dict.update({'mediatype': 'movie'}) # Get details details = VtmGo(self._kodi).get_movie(item) info_dict.update({ 'plot': details.description, 'year': details.year, 'aired': details.aired, }) elif category == 'episodes': info_dict.update({'mediatype': 'episode'}) # Get details details = VtmGo(self._kodi).get_episode(item) info_dict.update({ 'plot': details.description, 'season': details.season, 'episode': details.number, }) elif category == 'channels': info_dict.update({'mediatype': 'episode'}) # For live channels, we need to keep on updating the manifest # This might not be needed, and could be done with the Location-tag updates if inputstream.adaptive supports it # See https://github.com/peak3d/inputstream.adaptive/pull/298#issuecomment-524206935 prop_dict.update({ 'inputstream.adaptive.manifest_update_parameter': 'full', }) else: raise Exception('Unknown category %s' % category) except UnavailableException: # We continue without details. # This seems to make it possible to play some programs what don't have metadata. pass # Play this item self._kodi.play( TitleItem( title=resolved_stream.title, path=resolved_stream.url, subtitles_path=resolved_stream.subtitles, art_dict={}, info_dict=info_dict, prop_dict=prop_dict, stream_dict=stream_dict, is_playable=True, ), license_key=self._vtm_go_stream.create_license_key(resolved_stream.license_url))
def _IStreamPlayback(asin, name, trailer, isAdult, extern): from .ages import AgeRestrictions vMT = ['Feature', 'Trailer', 'LiveStreaming'][trailer] dRes = 'PlaybackUrls' if trailer == 2 else 'PlaybackUrls,SubtitleUrls,ForcedNarratives' mpaa_str = AgeRestrictions().GetRestrictedAges() + getString(30171) drm_check = g.addon.getSetting("drm_check") == 'true' verifyISA = '{"jsonrpc":"2.0","id":1,"method":"Addons.GetAddonDetails","params":{"addonid":"inputstream.adaptive"}}' if 'error' in xbmc.executeJSONRPC(verifyISA): xbmc.executebuiltin('UpdateAddonRepos', True) xbmc.executebuiltin('InstallAddon(inputstream.adaptive)', True) if 'error' in xbmc.executeJSONRPC(verifyISA): Log('InputStream.Adaptive addon is not installed') _playDummyVid() return True inputstream_helper = Helper('mpd', drm='com.widevine.alpha') if not inputstream_helper.check_inputstream(): Log('No Inputstream Addon found or activated') _playDummyVid() return True cookie = MechanizeLogin() if not cookie: g.dialog.notification(getString(30203), getString(30200), xbmcgui.NOTIFICATION_ERROR) Log('Login error at playback') _playDummyVid() return True mpd, subs = _ParseStreams(*getURLData('catalog/GetPlaybackResources', asin, extra=True, vMT=vMT, dRes=dRes, useCookie=cookie, proxyEndpoint='gpr'), retmpd=True) cj_str = ';'.join(['%s=%s' % (k, v) for k, v in cookie.items()]) opt = '|Content-Type=application%2Fx-www-form-urlencoded&Cookie=' + quote_plus(cj_str) opt += '|widevine2Challenge=B{SSM}&includeHdcpTestKeyInLicense=true' opt += '|JBlicense;hdcpEnforcementResolutionPixels' licURL = getURLData('catalog/GetPlaybackResources', asin, opt=opt, extra=True, vMT=vMT, dRes='Widevine2License', retURL=True) if not mpd: g.dialog.notification(getString(30203), subs, xbmcgui.NOTIFICATION_ERROR) _playDummyVid() return True from xbmcaddon import Addon as KodiAddon is_version = KodiAddon(g.is_addon).getAddonInfo('version') if g.is_addon else '0' is_binary = xbmc.getCondVisibility('System.HasAddon(kodi.binary.instance.inputstream)') if (not s.audioDescriptions) and (trailer != 2): mpd = re.sub(r'(~|%7E)', '', mpd) if drm_check and (not g.platform & g.OS_ANDROID) and (not is_binary): mpdcontent = getURL(mpd, useCookie=cookie, rjson=False) if 'avc1.4D00' in mpdcontent: # xbmc.executebuiltin('ActivateWindow(busydialog)') return _extrFr(mpdcontent) Log(mpd, Log.DEBUG) if g.KodiK and extern: content = getATVData('GetASINDetails', 'ASINList=' + asin)['titles'][0] ct, Info = g.amz.getInfos(content, False) title = Info['DisplayTitle'] thumb = Info.get('Poster', Info['Thumb']) mpaa_check = str(Info.get('MPAA', mpaa_str)) in mpaa_str or isAdult else: mpaa_check = _getListItem('MPAA') in mpaa_str + mpaa_str.replace(' ', '') or isAdult title = _getListItem('Label') thumb = _getListItem('Art(season.poster)') if not thumb: thumb = _getListItem('Art(tvshow.poster)') if not thumb: thumb = _getListItem('Art(thumb)') if trailer == 1: title += ' (Trailer)' if not title: title = name if mpaa_check and not AgeRestrictions().RequestPin(): return True listitem = xbmcgui.ListItem(label=title, path=mpd) if g.KodiK and extern: listitem.setInfo('video', getInfolabels(Info)) if 'adaptive' in g.is_addon: listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') Log('Using %s Version: %s' % (g.is_addon, is_version)) listitem.setArt({'thumb': thumb}) listitem.setSubtitles(subs) listitem.setProperty('%s.license_type' % g.is_addon, 'com.widevine.alpha') listitem.setProperty('%s.license_key' % g.is_addon, licURL) listitem.setProperty('%s.stream_headers' % g.is_addon, 'user-agent=' + getConfig('UserAgent')) listitem.setProperty('inputstreamaddon', g.is_addon) listitem.setMimeType('application/dash+xml') listitem.setContentLookup(False) player = _AmazonPlayer() player.asin = asin player.cookie = cookie player.content = trailer player.extern = extern player.resolve(listitem) starttime = time.time() while not xbmc.abortRequested and player.running: if player.isPlayingVideo(): player.video_lastpos = player.getTime() if time.time() > starttime + player.interval: starttime = time.time() player.updateStream('PLAY') sleep(1) player.finished() del player return True
def widevine_remove(): ''' The API interface to remove Widevine CDMs ''' Helper('mpd', drm='widevine').remove_widevine()
def IStreamPlayback(trailer, isAdult, extern): drm_check = addon.getSetting("drm_check") == 'true' at_check = addon.getSetting("at_check") == 'true' inputstream_helper = Helper('mpd', drm='com.widevine.alpha') vMT = 'Trailer' if trailer else 'Feature' if not inputstream_helper.check_inputstream(): Log('No Inputstream Addon found or activated') return True cookie = MechanizeLogin() if not cookie: Dialog.notification(getString(30203), getString(30200), xbmcgui.NOTIFICATION_ERROR) Log('Login error at playback') playDummyVid() return True mpd, subs = getStreams(*getUrldata( 'catalog/GetPlaybackResources', args.get('asin'), extra=True, vMT=vMT, opt='&titleDecorationScheme=primary-content', useCookie=cookie), retmpd=True) cj_str = ';'.join(['%s=%s' % (k, v) for k, v in cookie.items()]) opt = '|Content-Type=application%2Fx-www-form-urlencoded&Cookie=' + urllib.quote_plus( cj_str) opt += '|widevine2Challenge=B{SSM}&includeHdcpTestKeyInLicense=true' opt += '|JBlicense;hdcpEnforcementResolutionPixels' licURL = getUrldata('catalog/GetPlaybackResources', args.get('asin'), extra=True, vMT=vMT, dRes='Widevine2License', opt=opt, retURL=True) if not mpd: Dialog.notification(getString(30203), subs, xbmcgui.NOTIFICATION_ERROR) return True orgmpd = mpd is_version = xbmcaddon.Addon(is_addon).getAddonInfo( 'version') if is_addon else '0' is_binary = xbmc.getCondVisibility( 'System.HasAddon(kodi.binary.instance.inputstream)') mpd = re.sub(r'~', '', mpd) if drm_check: mpdcontent = getURL(mpd, rjson=False) if 'avc1.4D00' in mpdcontent and platform != osAndroid and not is_binary: xbmc.executebuiltin('ActivateWindow(busydialog)') return extrFr(mpdcontent) if mpdcontent.count('EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED') > 1 and ( platform == osAndroid or is_binary): mpd = orgmpd at_check = False Log(mpd) infoLabels = GetStreamInfo(args.get('asin')) mpaa_str = RestrAges + getString(30171) mpaa_check = infoLabels.get('MPAA', mpaa_str) in mpaa_str or isAdult if mpaa_check and not RequestPin(): return True listitem = xbmcgui.ListItem(path=mpd) if extern: infoLabels['Title'] = infoLabels.get('EpisodeName', infoLabels['Title']) if trailer: infoLabels['Title'] += ' (Trailer)' if 'Thumb' not in infoLabels.keys(): infoLabels['Thumb'] = None if 'Fanart' in infoLabels.keys(): listitem.setArt({'fanart': infoLabels['Fanart']}) if 'Poster' in infoLabels.keys(): listitem.setArt({'tvshow.poster': infoLabels['Poster']}) else: listitem.setArt({'poster': infoLabels['Thumb']}) if 'adaptive' in is_addon: listitem.setProperty('inputstream.adaptive.manifest_type', 'mpd') Log('Using %s Version:%s' % (is_addon, is_version)) listitem.setArt({'thumb': infoLabels['Thumb']}) listitem.setInfo('video', getInfolabels(infoLabels)) listitem.setSubtitles(subs) listitem.setProperty('%s.license_type' % is_addon, 'com.widevine.alpha') listitem.setProperty('%s.license_key' % is_addon, licURL) listitem.setProperty('%s.stream_headers' % is_addon, 'user-agent=' + UserAgent) listitem.setProperty('inputstreamaddon', is_addon) listitem.setMimeType('application/dash+xml') listitem.setContentLookup(False) xbmcplugin.setResolvedUrl(pluginhandle, True, listitem=listitem) valid_track = validAudioTrack() Log( 'Video ContentType Movie? %s' % xbmc.getCondVisibility('VideoPlayer.Content(movies)'), 0) Log( 'Video ContentType Episode? %s' % xbmc.getCondVisibility('VideoPlayer.Content(episodes)'), 0) if not valid_track and at_check: lang = jsonRPC('Player.GetProperties', 'currentaudiostream', {'playerid': 0})['language'] all_tracks = jsonRPC('Player.GetProperties', 'audiostreams', {'playerid': 0}) Log(str(all_tracks).replace('},', '}\n')) count = 3 while count and len(all_tracks) > 1: cur_track = jsonRPC('Player.GetProperties', 'currentaudiostream', {'playerid': 0})['index'] all_tracks = [i for i in all_tracks if i['index'] != cur_track] Log('Current AudioTrackID %d' % cur_track) tracks = all_tracks if lang in str(tracks): tracks = [i for i in tracks if i['language'] == lang] if 'eac3' in str(tracks): tracks = [i for i in tracks if i['codec'] == 'eac3'] chan = max([i['channels'] for i in tracks]) trackid = -1 trackbr = 0 for at in tracks: if at['channels'] == chan and at['bitrate'] > trackbr: trackid = at['index'] trackbr = at['bitrate'] if trackid > -1: Log('Switching to AudioTrackID %d' % trackid) xbmc.Player().setAudioStream(trackid) if validAudioTrack(): break count -= 1 return True
def is_helper(): from inputstreamhelper import Helper helper = Helper(protocol='mpd', drm='widevine') if helper.check_inputstream(): dialog.ok(addon_name, getString(30023))