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 _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), 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 trailer != 2: mpd = re.sub(r'~', '', 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