Example #1
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).encode('utf-8'),
                                        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()
Example #2
0
def play(video):
    item = None
    if 'url' in video:
        item = xbmcgui.ListItem(path=video['url'])
        if '.%s' % PROTOCOL in video['url']:
            from inputstreamhelper import Helper
            is_helper = Helper(PROTOCOL, drm=DRM)
            if is_helper.check_inputstream():
                item.setMimeType(MIME_TYPE)
                item.setContentLookup(False)
                item.setProperty(
                    'inputstreamaddon',
                    is_helper.inputstream_addon)  # TODO Kodi version dep
                item.setProperty('inputstream.adaptive.manifest_type',
                                 PROTOCOL)
                item.setProperty('inputstream.adaptive.license_type', DRM)
                item.setProperty(
                    'inputstream.adaptive.manifest_update_parameter', 'full')
                license_key = '%s|authorization=bearer %s|R{SSM}|' % (
                    LICENSE_URL, video['drm'])
                item.setProperty('inputstream.adaptive.license_key',
                                 license_key)

    if item is not None:
        xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]),
                                  succeeded=True,
                                  listitem=item)
 def install_widevine(self):
     ''' Install Widevine using inputstreamhelper '''
     ok = self.show_yesno_dialog(heading=self.localize(30971),
                                 message=self.localize(30972))
     if not ok:
         return
     try:
         from inputstreamhelper import Helper
         is_helper = Helper('mpd', drm='com.widevine.alpha')
         if is_helper.check_inputstream():
             self.show_notification(heading=self.localize(30971),
                                    message=self.localize(30974),
                                    icon='info',
                                    time=5000)
         else:
             self.show_notification(heading=self.localize(30971),
                                    message=self.localize(30973),
                                    icon='error',
                                    time=5000)
     except Exception:
         self.show_notification(heading=self.localize(30971),
                                message=self.localize(30973),
                                icon='error',
                                time=5000)
     self.end_of_directory()
Example #4
0
    def _mode_watch(self):
        # type: () -> None

        video_id = self._params["id"]

        is_helper = Helper("mpd")
        use_dash = bool(is_helper.check_inputstream())
        video_url = FranceTVVideo().get_video_url(video_id, use_dash)

        # Workaround for
        # https://github.com/melmorabity/plugin.video.francetv/issues/2
        headers = "User-Agent={}".format(self._USER_AGENT)

        listitem = ListItem(
            path="{}|{}".format(video_url, headers),
            offscreen=True,
        )

        # Use DASH if possible for better subtitle management
        if use_dash and ".mpd" in video_url:
            listitem.setMimeType("application/dash+xml")
            listitem.setProperty("inputstream.adaptive.manifest_type", "mpd")
            if _KODI_VERSION >= 19:
                listitem.setProperty("inputstream",
                                     is_helper.inputstream_addon)
            else:
                listitem.setProperty("inputstreamaddon",
                                     is_helper.inputstream_addon)
            listitem.setProperty("inputstream.adaptive.stream_headers",
                                 headers)
        xbmcplugin.setResolvedUrl(self._handle, True, listitem)
Example #5
0
    def play(self, manifest_url, package_code, parental_rating=0, info_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 Go - 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)

                li.setProperty('inputstream.adaptive.license_type', self.license_type)
                li.setProperty('inputstream.adaptive.manifest_type', 'ism')
                if init_data:
                    li.setProperty('inputstream.adaptive.license_key', self.license_url)
                    li.setProperty('inputstream.adaptive.license_data', init_data)
                li.setProperty('inputstreamaddon', 'inputstream.adaptive')
                # Start Playing
                xbmcplugin.setResolvedUrl(addon_handle, True, listitem=li)
            else:
                xbmcgui.Dialog().notification('Sky Go Fehler', 'Keine Berechtigung zum Abspielen dieses Eintrags', xbmcgui.NOTIFICATION_ERROR, 2000, True)
        else:
            xbmcgui.Dialog().notification('Sky Go Fehler', 'Fehler beim Login.', xbmcgui.NOTIFICATION_ERROR, 2000, True)
            print 'Fehler beim Einloggen'
Example #6
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)
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 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)
Example #9
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
Example #10
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)
Example #11
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)
Example #12
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())
Example #13
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
Example #14
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)
Example #15
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
Example #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)
Example #17
0
 def start_is_helper(self):
     helper = Helper(protocol='mpd', drm='widevine')
     return helper.check_inputstream()
    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)
Example #19
0
def is_helper():
    from inputstreamhelper import Helper
    helper = Helper(protocol='mpd', drm='widevine')
    if helper.check_inputstream():
        dialog.ok(addon_name, getString(30023))
Example #20
0
def play_video(video_id,
               client_data,
               stream_type,
               season_id=None,
               compilation_id=None):

    from .mpd_parser import mpd_parser as mpd_parser
    from xbmc import getCondVisibility
    xbmc_helper().log_debug('play_video: video_id {}', video_id)
    succeeded = False
    list_item = ListItem()

    if not xbmc_helper().addon_enabled(CONST['INPUTSTREAM_ADDON']):
        xbmc_helper().dialog_id('MSG_INPUSTREAM_NOT_ENABLED')
        exit(0)

    if not getCondVisibility('System.Platform.Android'):
        from inputstreamhelper import Helper
        is_helper = Helper('mpd', drm='com.widevine.alpha')
        if not is_helper.check_inputstream():
            xbmc_helper().dialog_id('MSG_WIDEVINE_NOT_FOUND')
            exit(0)
    try:
        from .submodules.libjoyn_video import get_video_data
        video_data = get_video_data(video_id, loads(client_data), stream_type,
                                    season_id, compilation_id)

        xbmc_helper().log_debug('Got video data: {}',
                                video_data.get('licenseUrl'))

        parser = video_data.get('parser', None)
        if parser is not None:

            list_item.setProperty('inputstreamaddon',
                                  CONST['INPUTSTREAM_ADDON'])
            # DASH
            if isinstance(parser, mpd_parser):
                list_item.setMimeType('application/dash+xml')
                list_item.setProperty(
                    compat._format('{}.manifest_type',
                                   CONST['INPUTSTREAM_ADDON']), 'mpd')
                if parser.mpd_filepath is not None:
                    list_item.setPath(
                        parser.mpd_filepath
                        if not getCondVisibility('System.Platform.Windows')
                        and not getCondVisibility('System.Platform.UWP') else
                        parser.mpd_filepath.replace('\\', '/'))
                elif parser.mpd_url is not None:
                    list_item.setPath(lib_joyn().add_user_agent_http_header(
                        parser.mpd_url))
                else:
                    raise ValueError(
                        compat._format(
                            'Could not find a valid DASH Manifest - parser: {}',
                            vars(mpd_parser)))

                drm = video_data.get('drm', '')
                license_key = video_data.get('licenseUrl', None)
                license_cert = video_data.get('certificateUrl', None)
                xbmc_helper().log_debug('drm: {} key: {} cert: {}', drm,
                                        license_key, license_cert)

                if license_key is not None:
                    if drm.lower() == 'widevine':
                        xbmc_helper().log_notice('Using Widevine as DRM')

                        list_item.setProperty(
                            compat._format('{}.license_type',
                                           CONST['INPUTSTREAM_ADDON']),
                            'com.widevine.alpha')
                        list_item.setProperty(
                            compat._format('{}.license_key',
                                           CONST['INPUTSTREAM_ADDON']),
                            compat._format(
                                '{}|{}|R{{SSM}}|', license_key,
                                request_helper.get_header_string({
                                    'User-Agent':
                                    lib_joyn().config.get('USER_AGENT'),
                                    'Content-Type':
                                    'application/octet-stream'
                                })))
                        list_item.setProperty(
                            compat._format('{}.stream_headers',
                                           CONST['INPUTSTREAM_ADDON']),
                            request_helper.get_header_string({
                                'User-Agent':
                                lib_joyn().config['USER_AGENT']
                            }))

                        if license_cert is not None and xbmc_helper(
                        ).get_bool_setting('checkdrmcert') is True:
                            xbmc_helper().log_debug('Set DRM cert: {}',
                                                    license_cert)
                            list_item.setProperty(
                                compat._format('{}.server_certificate',
                                               CONST['INPUTSTREAM_ADDON']),
                                lib_joyn().add_user_agent_http_header(
                                    license_cert))

                    elif drm.lower() == 'playready':
                        xbmc_helper().log_notice('Using PlayReady as DRM')
                        list_item.setProperty(
                            compat._format('{}.license_type',
                                           CONST['INPUTSTREAM_ADDON']),
                            'com.microsoft.playready')
                        list_item.setProperty(
                            compat._format('{}.license_key',
                                           CONST['INPUTSTREAM_ADDON']),
                            compat._format(
                                '{}|{}|R{{SSM}}|', license_key,
                                request_helper.get_header_string({
                                    'User-Agent':
                                    CONST['EDGE_UA'],
                                    'Content-Type':
                                    'text/xml',
                                    'SOAPAction':
                                    'http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense'
                                })))

                        list_item.setProperty(
                            compat._format('{}.stream_headers',
                                           CONST['INPUTSTREAM_ADDON']),
                            request_helper.get_header_string(
                                {'User-Agent': CONST['EDGE_UA']}))
                    else:
                        raise ValueError(
                            compat._format('Unsupported DRM {}', drm))

            if stream_type == 'LIVE':
                list_item.setProperty(
                    compat._format('{}.manifest_update_parameter',
                                   CONST['INPUTSTREAM_ADDON']), 'full')

                if xbmc_helper().get_bool_setting(
                        'fix_livestream_audio_sync') is True:
                    mpd_timeshift_buffer = parser.get_timeshift_buffer_secs()
                    if mpd_timeshift_buffer is not None:
                        xbmc_helper().log_debug(
                            'Got timeshiftbuffer from mpd: {}',
                            mpd_timeshift_buffer)
                        live_stream_length = mpd_timeshift_buffer
                    else:
                        live_stream_length = xbmc_helper().get_int_setting(
                            'livestream_total_length')

                    live_stream_resume_pos = live_stream_length - xbmc_helper(
                    ).get_int_setting('livestream_offset')

                    list_item.setProperty('TotalTime',
                                          str(float(live_stream_length)))
                    list_item.setProperty('ResumeTime',
                                          str(float(live_stream_resume_pos)))
                    xbmc_helper().log_debug(
                        'Tried fixing livestream audio sync issue - total time: {} - resume pos {}',
                        live_stream_length, live_stream_resume_pos)

            succeeded = True

            from .submodules.plugin_lastseen import add_lastseen
            if 'season_id' in video_data.keys(
            ) and video_data['season_id'] is not None:
                add_lastseen(season_id=video_data['season_id'],
                             max_lastseen=CONST['LASTSEEN_ITEM_COUNT'])
            elif 'compilation_id' in video_data.keys(
            ) and video_data['compilation_id'] is not None:
                add_lastseen(compilation_id=video_data['compilation_id'],
                             max_lastseen=CONST['LASTSEEN_ITEM_COUNT'])

        else:
            raise ValueError(compat._format('Could not get parser: {}',
                                            parser))

    except Exception as e:
        xbmc_helper().log_error(
            'Getting videostream / manifest failed with Exception: {}', e)
        xbmc_helper().notification(
            compat._format(xbmc_helper().translation('ERROR'), 'Video-Stream'),
            xbmc_helper().translation('MSG_ERROR_NO_VIDEOSTEAM'))
        pass

    if succeeded is True and stream_type == 'VOD':
        from xbmcgui import Window, getCurrentWindowId
        Window(getCurrentWindowId()).setProperty('joyn_video_id', video_id)

    setResolvedUrl(pluginhandle, succeeded, list_item)
Example #21
0
def playVideo(entry):
    video_id = None
    content = getContentPreview(entry.get('domain'), entry.get('path'))
    if content:
        video_id = getVideoId(content.get('data'))

    # Inputstream and DRM
    helper = Helper(protocol='mpd', drm='widevine')
    isInputstream = helper.check_inputstream()

    if not isInputstream:
        access_token = 'h' 'b' 'b' 't' 'v'
        salt = '0' '1' 'r' 'e' 'e' '6' 'e' 'L' 'e' 'i' 'w' 'i' 'u' 'm' 'i' 'e' '7' 'i' 'e' 'V' '8' 'p' 'a' 'h' 'g' 'e' 'i' 'T' 'u' 'i' '3' 'B'
        client_name = 'h' 'b' 'b' 't' 'v'
    else:
        access_token = 'seventv-web'
        salt = '01!8d8F_)r9]4s[qeuXfP%'
        client_name = ''

    source_id = 0
    json_url = 'http://vas.sim-technik.de/vas/live/v2/videos/{0}?{1}'.format(
        video_id,
        urllib.urlencode({
            'access_token': access_token,
            'client_location': entry.get('path'),
            'client_name': client_name
        }))
    json_data = requests.get(json_url).json()

    if isInputstream:
        for stream in json_data['sources']:
            if stream['mimetype'] == 'application/dash+xml':
                if int(source_id) < int(stream['id']):
                    source_id = stream['id']
    else:
        if json_data["is_protected"] == True:
            xbmc.executebuiltin(
                'Notification("Inputstream", "DRM geschützte Folgen gehen nur mit Inputstream")'
            )
            return
        else:
            for stream in json_data['sources']:
                if stream['mimetype'] == 'video/mp4':
                    if int(source_id) < int(stream['id']):
                        source_id = stream['id']

    client_id_1 = '{0}{1}'.format(
        salt[:2],
        sha1('{0}{1}{2}{3}{4}{5}'.format(
            video_id, salt, access_token, entry.get('path'), salt,
            client_name).encode('utf-8')).hexdigest())

    json_url = 'https://vas.sim-technik.de/vas/live/v2/videos/{0}/sources?{1}'.format(
        video_id,
        urllib.urlencode({
            'access_token': access_token,
            'client_location': entry.get('path'),
            'client_name': client_name,
            'client_id': client_id_1
        }))
    json_data = requests.get(json_url).json()
    server_id = json_data['server_id']

    # client_name = 'kolibri-1.2.5'
    client_id = '{0}{1}'.format(
        salt[:2],
        sha1('{0}{1}{2}{3}{4}{5}{6}{7}'.format(
            salt, video_id, access_token, server_id, entry.get('path'),
            source_id, salt, client_name).encode('utf-8')).hexdigest())
    url_api_url = 'http://vas.sim-technik.de/vas/live/v2/videos/{0}/sources/url?{1}'.format(
        video_id,
        urllib.urlencode({
            'access_token': access_token,
            'client_id': client_id,
            'client_location': entry.get('path'),
            'client_name': client_name,
            'server_id': server_id,
            'source_ids': str(source_id),
        }))

    json_data = requests.get(url_api_url).json()
    max_id = 0
    for stream in json_data["sources"]:
        ul = stream["url"]
        try:
            sid = re.compile('-tp([0-9]+).mp4', re.DOTALL).findall(ul)[0]
            id = int(sid)
            if max_id < id:
                max_id = id
                data = ul
        except:
            data = ul

    li = xbmcgui.ListItem(path='{0}|{1}'.format(data, userAgent))
    li.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
    li.setProperty('inputstream.adaptive.manifest_type', 'mpd')
    li.setProperty('inputstreamaddon', 'inputstream.adaptive')

    try:
        lic = json_data['drm']['licenseAcquisitionUrl']
        token = json_data['drm']['token']
        li.setProperty(
            'inputstream.adaptive.license_key',
            '{0}?token={1}|{2}|{3}|'.format(lic, token, userAgent, 'R{SSM}'))
    except:
        pass

    if entry.get('infoLabels') and len(entry.get('infoLabels')) > 0:
        li.setInfo('video', entry.get('infoLabels'))

    xbmcplugin.setResolvedUrl(addon_handle, True, li)
Example #22
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
Example #23
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))
Example #24
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
Example #25
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
Example #26
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), 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
Example #27
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)
Example #28
0
    def play(self, url, content_id):
        self.log("Play: " + str(url))

        if not self.chk_login():
            self.login()

        if not self.chk_login():
            self.log("NOT LOGGED IN, ABORTING PLAY")
            xbmcgui.Dialog().ok(self.LB_LOGIN_ERROR, self.language(30103))
            self.logout()
            return

        media_item = self.get_from_hbogo(url + self.LANGUAGE_CODE, 'xml')

        if self.lograwdata:
            self.log("Play Media: " + 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')
        if self.lograwdata:
            self.log("Manifest: " + 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)

        protocol = 'mpd'
        drm = 'com.widevine.alpha'
        from inputstreamhelper import Helper
        is_helper = Helper(protocol, drm=drm)
        if is_helper.check_inputstream():
            li.setProperty('inputstreamaddon', 'inputstream.adaptive')
            li.setProperty('inputstream.adaptive.license_type', drm)
            li.setProperty('inputstream.adaptive.manifest_type', protocol)
            li.setProperty('inputstream.adaptive.license_key', license_url)

            li.setMimeType('application/dash+xml')
            li.setContentLookup(False)
            # GET SUBTITLES
            folder = xbmc.translatePath(self.addon.getAddonInfo('profile'))
            folder = folder + 'subs' + os.sep + media_guid + os.sep
            if self.addon.getSetting('forcesubs') == 'true':
                self.log(
                    "Force subtitles enabled, downloading and converting subtitles in: "
                    + str(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: " +
                                 str(sub.get('lang')) + " URL: " +
                                 str(sub.get('href')))
                        r = requests.get(sub.get('href'))
                        with open(
                                str(folder) + str(sub.get('lang')) + ".xml",
                                'wb') as f:
                            f.write(r.content)
                        ttml = Ttml2srt(
                            str(folder) + str(sub.get('lang')) + ".xml", 25)
                        srt_file = ttml.write_srt_file(
                            str(folder) + str(sub.get('lang')))
                        self.log("Subtitle converted to srt format")
                        subs_paths.append(srt_file)
                        self.log("Subtitle added: " + srt_file)
                    self.log("Setting subtitles: " + str(subs_paths))
                    li.setSubtitles(subs_paths)
                    self.log("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)
Example #29
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
Example #30
0
def IStreamPlayback(trailer, isAdult, extern):
    drm_check = var.addon.getSetting("drm_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',
        var.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',
                        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)
    xbmcplugin.setResolvedUrl(var.pluginhandle, True, listitem=listitem)

    PlayerInfo('Starting Playback...')
    Log(
        'Video ContentType Movie? %s' %
        xbmc.getCondVisibility('VideoPlayer.Content(movies)'), 0)
    Log(
        'Video ContentType Episode? %s' %
        xbmc.getCondVisibility('VideoPlayer.Content(episodes)'), 0)

    return True
 def start_is_helper(self):
     helper = Helper(protocol='mpd', drm='widevine')
     return helper.check_inputstream()
Example #32
0
 def start_is_helper(self):
     helper = Helper(protocol='hls')
     return helper.check_inputstream()
Example #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
def playVideo(video_id, client_location, source_id=None, infoLabels=None):
    # Inputstream and DRM
    helper = Helper(protocol='mpd', drm='widevine')
    isInputstream = helper.check_inputstream()

    if not isInputstream:
        access_token = 'h' 'b' 'b' 't' 'v'
        salt = '0' '1' 'r' 'e' 'e' '6' 'e' 'L' 'e' 'i' 'w' 'i' 'u' 'm' 'i' 'e' '7' 'i' 'e' 'V' '8' 'p' 'a' 'h' 'g' 'e' 'i' 'T' 'u' 'i' '3' 'B'
        client_name = 'h' 'b' 'b' 't' 'v'
    else:
        access_token = 'seventv-web'
        salt = '01!8d8F_)r9]4s[qeuXfP%'
        client_name = ''

    if source_id is None:
        source_id = 0
        json_url = 'http://vas.sim-technik.de/vas/live/v2/videos/%s?access_token=%s&client_location=%s&client_name=%s' % (
            video_id, access_token, client_location, client_name)
        json_data = getUrl(json_url)

        if isInputstream:
            for stream in json_data['sources']:
                if stream['mimetype'] == 'application/dash+xml':
                    if int(source_id) < int(stream['id']):
                        source_id = stream['id']
        else:
            if json_data["is_protected"] == True:
                xbmc.executebuiltin(
                    'Notification("Inputstream", "DRM geschützte Folgen gehen nur mit Inputstream")'
                )
                return
            else:
                for stream in json_data['sources']:
                    if stream['mimetype'] == 'video/mp4':
                        if int(source_id) < int(stream['id']):
                            source_id = stream['id']

    client_id_1 = salt[:2] + sha1(''.join([
        str(video_id), salt, access_token, client_location, salt, client_name
    ]).encode('utf-8')).hexdigest()

    json_url = 'http://vas.sim-technik.de/vas/live/v2/videos/%s/sources?access_token=%s&client_location=%s&client_name=%s&client_id=%s' % (
        video_id, access_token, client_location, client_name, client_id_1)
    json_data = getUrl(json_url)
    server_id = json_data['server_id']

    # client_name = 'kolibri-1.2.5'
    client_id = salt[:2] + sha1(''.join([
        salt, video_id, access_token, server_id, client_location,
        str(source_id), salt, client_name
    ]).encode('utf-8')).hexdigest()
    url_api_url = 'http://vas.sim-technik.de/vas/live/v2/videos/%s/sources/url?%s' % (
        video_id,
        urllib.urlencode({
            'access_token': access_token,
            'client_id': client_id,
            'client_location': client_location,
            'client_name': client_name,
            'server_id': server_id,
            'source_ids': str(source_id),
        }))

    json_data = getUrl(url_api_url)
    max_id = 0
    for stream in json_data["sources"]:
        ul = stream["url"]
        try:
            sid = re.compile('-tp([0-9]+).mp4', re.DOTALL).findall(ul)[0]
            id = int(sid)
            if max_id < id:
                max_id = id
                data = ul
        except:
            data = ul

    li = xbmcgui.ListItem(path='%s|%s' % (data, userAgent))
    li.setProperty('inputstream.adaptive.license_type', 'com.widevine.alpha')
    li.setProperty('inputstream.adaptive.manifest_type', 'mpd')
    li.setProperty('inputstreamaddon', 'inputstream.adaptive')

    try:
        lic = json_data['drm']['licenseAcquisitionUrl']
        token = json_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', infoLabels)

    xbmcplugin.setResolvedUrl(addon_handle, True, li)