Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
    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'
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
    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())
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
 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
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
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
Exemplo n.º 13
0
 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
Exemplo n.º 14
0
 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)
Exemplo n.º 15
0
    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()
Exemplo n.º 16
0
    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)
Exemplo n.º 17
0
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)
Exemplo n.º 18
0
def rollback():
    """The API interface to rollback Widevine CDM"""
    Helper('mpd', drm='widevine').rollback_libwv()
Exemplo n.º 19
0
 def start_is_helper(self):
     helper = Helper(protocol='hls')
     return helper.check_inputstream()
Exemplo n.º 20
0
def widevine_remove():
    """The API interface to remove Widevine CDMs"""
    Helper('mpd', drm='widevine').remove_widevine()
Exemplo n.º 21
0
def info_dialog():
    """The API interface to show an info Dialog"""
    Helper('mpd', drm='widevine').info_dialog()
Exemplo n.º 22
0
def check_inputstream(protocol, drm=None):
    """The API interface to check inputstream"""
    Helper(protocol, drm=drm).check_inputstream()
Exemplo n.º 23
0
def widevine_install():
    """The API interface to install Widevine CDM"""
    Helper('mpd', drm='widevine').install_widevine()
Exemplo n.º 24
0
    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)
Exemplo n.º 25
0
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
Exemplo n.º 26
0
    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
Exemplo n.º 27
0
 def start_is_helper(self):
     helper = Helper(protocol='mpd', drm='widevine')
     return helper.check_inputstream()
Exemplo n.º 28
0
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
Exemplo n.º 29
0
    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))
Exemplo n.º 30
0
    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
Exemplo n.º 31
0
 def start_is_helper(self):
     helper = Helper(protocol='mpd', drm='widevine')
     return helper.check_inputstream()
def widevine_remove():
    ''' The API interface to remove Widevine CDMs '''
    Helper('mpd', drm='widevine').remove_widevine()
Exemplo n.º 33
0
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
Exemplo n.º 34
0
def is_helper():
    from inputstreamhelper import Helper
    helper = Helper(protocol='mpd', drm='widevine')
    if helper.check_inputstream():
        dialog.ok(addon_name, getString(30023))