def del_watch_later(video_id):

    token = auth_helper.get_globosat_token()

    url = GLOBOSAT_DEL_WATCH_LATER % (token, video_id)
    headers = {
        "Accept-Encoding": "gzip",
        "Content-Type": "application/x-www-form-urlencoded",
        "version": "2",
        "Authorization": GLOBOSAT_API_AUTHORIZATION
    }

    requests.delete(url=url, headers=headers)
def request_query(query,
                  variables,
                  force_refresh=False,
                  retry=3,
                  use_cache=True):
    tenant = 'globosat-play'

    token = auth_helper.get_globosat_token()

    url = 'https://products-jarvis.globo.com/graphql?query={query}&variables={variables}'.format(
        query=query, variables=urllib.quote_plus(variables))
    headers = {
        'authorization':
        token,
        'x-tenant-id':
        tenant,
        'x-platform-id':
        'web',
        'x-device-id':
        'desktop',
        'x-client-version':
        '1.5.1',
        'user-agent':
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
    }

    control.log('{} - GET {}'.format(tenant, url))

    if use_cache:
        response = cache.get(requests.get,
                             1,
                             url,
                             headers=headers,
                             force_refresh=force_refresh,
                             table='globosat')
    else:
        response = requests.get(url, headers=headers)

    if response.status_code >= 500 and retry > 0:
        return request_query(query, variables, True, retry - 1)

    response.raise_for_status()

    json_response = response.json()

    control.log(json_response)

    return json_response
def add_watch_later(video_id):
    post_data = {'id': video_id}

    token = auth_helper.get_globosat_token()

    url = GLOBOSAT_BASE_WATCH_LATER % token
    headers = {
        "Accept-Encoding": "gzip",
        "Content-Type": "application/x-www-form-urlencoded",
        "version": "2",
        "Authorization": GLOBOSAT_API_AUTHORIZATION
    }

    post_data = urllib.urlencode(post_data)

    client.request(url, headers=headers, post=post_data)
Beispiel #4
0
def request_url(url, force_refresh=False, retry=3, use_cache=True):
    tenant = 'globosat-play'

    token = auth_helper.get_globosat_token()

    headers = {
        'authorization':
        token,
        'x-tenant-id':
        tenant,
        'x-platform-id':
        'web',
        'x-device-id':
        'desktop',
        'x-client-version':
        '1.17.0',
        'user-agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
    }

    control.log('{} - GET {}'.format(tenant, url))

    if use_cache:
        response = cache.get(requests.get,
                             1,
                             url,
                             headers=headers,
                             force_refresh=force_refresh,
                             table='globosat')
    else:
        response = requests.get(url, headers=headers)

    if response.status_code >= 500 and retry > 0:
        return request_url(url, True, retry - 1)

    response.raise_for_status()

    json_response = response.json()

    control.log(json_response)

    return json_response
def get_authorized_channels():
    token = auth_helper.get_globosat_token()

    if not token:
        return []

    client_id = "85014160-e953-4ddb-bbce-c8271e4fde74"
    channels_url = "https://gsatmulti.globo.com/oauth/sso/login/?chave=%s&token=%s" % (
        client_id, token)

    channels = []

    pkgs_response = client.request(channels_url,
                                   headers={"Accept-Encoding": "gzip"})

    control.log("-- PACKAGES: %s" % repr(pkgs_response))

    pkgs = pkgs_response['pacotes']

    channel_ids = []
    for pkg in pkgs:
        for channel in pkg['canais']:
            if channel['slug'] == 'telecine-zone':
                continue

            elif channel['id_globo_videos'] not in channel_ids:
                channel_ids.append(channel['id_globo_videos'])
                channels.append({
                    "id": channel['id_globo_videos'],
                    # "channel_id": channel['id_globo_videos'],
                    "id_cms": channel['id_cms'],
                    "logo": channel['logo_fundo_claro'],
                    "name": channel['nome'],
                    "slug": channel['slug'],
                    "adult": channel['slug'] == 'sexyhot',
                    "vod": "vod" in channel['acls'],
                    "live": "live" in channel['acls']
                })

    return channels
Beispiel #6
0
    def playlive(self, id, meta):

        if id is None: return

        info = resourceshelper.get_video_info(id)

        control.log("INFO: %s" % repr(info))

        if not info or info is None or 'channel' not in info:
            return

        try:
            hash, user, credentials = self.sign_resource(info['provider_id'], info['resource_id'], id, info['player'], info['version'])
        except Exception as ex:
            control.log("ERROR: %s" % repr(ex))
            return

        encrypted = 'encrypted' in info and info['encrypted']

        if encrypted and not control.is_inputstream_available():
            control.infoDialog(message=control.lang(34103).encode('utf-8'), icon='Wr')
            return

        title = info['channel']

        query_string = re.sub(r'{{(\w*)}}', r'%(\1)s', info['query_string_template'])

        query_string = query_string % {
            'hash': hash,
            'key': 'app',
            'openClosed': 'F' if info['subscriber_only'] else 'A',
            'user': user if info['subscriber_only'] else ''
        }

        url = '?'.join([info['url'], query_string])

        control.log("live media url: %s" % url)

        try:
            meta = json.loads(meta)
        except:
            meta = {
                "playcount": 0,
                "overlay": 6,
                "title": title,
                "thumb": info["thumbUri"],
                "mediatype": "video",
                "aired": info["exhibited_at"]
            }

        meta.update({
            "genre": info["category"],
            "plot": info["title"],
            "plotoutline": info["title"]
        })

        poster = meta['poster'] if 'poster' in meta else control.addonPoster()
        thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"]

        self.offset = float(meta['milliseconds_watched']) / 1000.0 if 'milliseconds_watched' in meta else 0

        self.isLive = 'livefeed' in meta and meta['livefeed'] == 'true'

        parsed_url = urlparse(url)
        if parsed_url.path.endswith(".m3u8"):
            self.url, mime_type, stopEvent, cookies = hlshelper.pick_bandwidth(url)
        else:
            self.url = url
            mime_type, stopEvent, cookies = 'video/mp4', None, None

        if self.url is None:
            if stopEvent:
                control.log("Setting stop event for proxy player")
                stopEvent.set()
            control.infoDialog(control.lang(34100).encode('utf-8'), icon='ERROR')
            return

        control.log("Resolved URL: %s" % repr(self.url))
        control.log("Parsed URL: %s" % repr(parsed_url))

        item = control.item(path=self.url)
        item.setArt({'icon': thumb, 'thumb': thumb, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster})
        item.setProperty('IsPlayable', 'true')
        item.setInfo(type='Video', infoLabels=meta)

        item.setContentLookup(False)

        if parsed_url.path.endswith(".mpd"):
            mime_type = 'application/dash+xml'
            item.setProperty('inputstream.adaptive.manifest_type', 'mpd')

        elif parsed_url.path.endswith(".ism/manifest"):
            mime_type = 'application/vnd.ms-sstr+xml'
            item.setProperty('inputstream.adaptive.manifest_type', 'ism')

        else:
            item.setProperty('inputstream.adaptive.manifest_type', 'hls')

        if encrypted:
            control.log("DRM: %s" % info['drm_scheme'])
            licence_url = info['protection_url']
            item.setProperty('inputstream.adaptive.license_type', info['drm_scheme'])
            if info['drm_scheme'] == 'com.widevine.alpha' or info['drm_scheme'] == 'com.microsoft.playready':
                item.setProperty('inputstream.adaptive.license_key', licence_url + "||R{SSM}|")

        if mime_type:
            item.setMimeType(mime_type)
            control.log("MIME TYPE: %s" % repr(mime_type))

        if not cookies and not control.disable_inputstream_adaptive:
            item.setProperty('inputstreamaddon', 'inputstream.adaptive')

        if 'subtitles' in info and info['subtitles'] and len(info['subtitles']) > 0:
            control.log("FOUND SUBTITLES: %s" % repr([sub['url'] for sub in info['subtitles']]))
            item.setSubtitles([sub['url'] for sub in info['subtitles']])

        control.resolve(int(sys.argv[1]), True, item)

        self.stopPlayingEvent = threading.Event()
        self.stopPlayingEvent.clear()

        self.token = auth_helper.get_globosat_token()

        self.video_id = info['id'] if 'id' in info else None

        first_run = True
        last_time = 0.0
        while not self.stopPlayingEvent.isSet():
            if control.monitor.abortRequested():
                control.log("Abort requested")
                break

            if self.isPlaying():
                if first_run:
                    self.showSubtitles(False)
                    first_run = False
                if not self.isLive:
                    current_time = self.getTime()
                    if current_time - last_time > 5 or (last_time == 0 and current_time > 1):
                        last_time = current_time
                        self.save_video_progress(self.token, self.video_id, current_time)
            control.sleep(1000)

        if stopEvent:
            control.log("Setting stop event for proxy player")
            stopEvent.set()

        control.log("Done playing. Quitting...")
    def playlive(self, id, meta):

        if id is None: return

        info = self.__get_video_info(id)

        if not info or 'channel' not in info:
            return

        if 'encrypted' in info and info['encrypted'] == 'true':
            control.infoDialog(message=control.lang(34103).encode('utf-8'), icon='Wr')
            return

        title = info['channel']

        signed_hashes = util.get_signed_hashes(info['hash'])

        query_string = re.sub(r'{{(\w*)}}', r'%(\1)s', info['query_string_template'])

        query_string = query_string % {
            'hash': signed_hashes[0],
            'key': 'app',
            'openClosed': 'F' if info['subscriber_only'] else 'A',
            'user': info['user'] if info['subscriber_only'] else ''
        }

        url = '?'.join([info['url'], query_string])

        control.log("live media url: %s" % url)

        try:
            meta = json.loads(meta)
        except:
            meta = {
                "playcount": 0,
                "overlay": 6,
                "title": title,
                "thumb": info["thumbUri"],
                "mediatype": "video",
                "aired": info["exhibited_at"]
            }

        meta.update({
            "genre": info["category"],
            "plot": info["title"],
            "plotoutline": info["title"]
        })

        poster = meta['poster'] if 'poster' in meta else control.addonPoster()
        thumb = meta['thumb'] if 'thumb' in meta else info["thumbUri"]

        self.offset = float(meta['milliseconds_watched']) / 1000.0 if 'milliseconds_watched' in meta else 0

        self.isLive = 'livefeed' in meta and meta['livefeed'] == 'true'

        self.url, mime_type, stopEvent = hlshelper.pick_bandwidth(url)

        if self.url is None:
            if stopEvent:
                control.log("Setting stop event for proxy player")
                stopEvent.set()
            control.infoDialog(control.lang(34100).encode('utf-8'), icon='ERROR')
            return

        control.log("Resolved URL: %s" % repr(self.url))

        item = control.item(path=self.url)
        item.setArt({'icon': thumb, 'thumb': thumb, 'poster': poster, 'tvshow.poster': poster, 'season.poster': poster})
        item.setProperty('IsPlayable', 'true')
        item.setInfo(type='Video', infoLabels=meta)

        if mime_type:
            item.setMimeType(mime_type)

        item.setContentLookup(False)

        item.setProperty('inputstream.adaptive.manifest_type', 'hls')
        item.setProperty('inputstreamaddon', 'inputstream.adaptive')

        control.resolve(int(sys.argv[1]), True, item)

        self.stopPlayingEvent = threading.Event()
        self.stopPlayingEvent.clear()

        self.token = auth_helper.get_globosat_token()

        self.video_id = info['id'] if 'id' in info else None

        last_time = 0.0
        while not self.stopPlayingEvent.isSet():
            if control.monitor.abortRequested():
                control.log("Abort requested")
                break
            if self.isPlaying() and not self.isLive:
                current_time = self.getTime()
                if current_time - last_time > 5 or (last_time == 0 and current_time > 1):
                    last_time = current_time
                    self.save_video_progress(self.token, self.video_id, current_time)
            control.sleep(1000)

        if stopEvent:
            control.log("Setting stop event for proxy player")
            stopEvent.set()

        control.log("Done playing. Quitting...")
def get_watch_history(page=1):

    # GET /globosatplay/watch_history.json?token=bd97dc379d3648d23b69257160a40c6e&page=1&per_page=50 HTTP/1.1
    # Host: api.vod.globosat.tv
    # Accept-Language: en-US
    # Accept-Encoding: gzip
    # version: 2
    # Authorization: token b4b4fb9581bcc0352173c23d81a26518455cc521

    headers = {
        'Accept-Encoding': 'gzip',
        'Authorization': GLOBOSAT_API_AUTHORIZATION,
        'Version': 2
    }

    token = auth_helper.get_globosat_token()

    watch_later_list = client.request(GLOBOSAT_WATCH_HISTORY %
                                      (token, page, 50),
                                      headers=headers)

    results = watch_later_list['data']

    while watch_later_list['next'] is not None:
        watch_later_list = client.request(watch_later_list['next'],
                                          headers=headers)
        results += watch_later_list['data']

    videos = []

    results = sorted(results, key=lambda x: x['watched_date'], reverse=True)

    for item in results:
        video = {
            'id':
            item['id_globo_videos'],
            'label':
            item['channel']['title'] +
            (' - ' + item['program']['title'] if 'program' in item
             and item['program'] else '') + ' - ' + item['title'],
            'title':
            item['title'],
            'tvshowtitle':
            item['program']['title']
            if 'program' in item and item['program'] else item['title'],
            'studio':
            item['channel']['title'],
            'plot':
            item['description'],
            'tagline':
            None,
            'duration':
            float(item['duration_in_milliseconds']) / 1000.0,
            'logo':
            item['program']['logo_image'] if 'program' in item
            and item['program'] else item['channel']['color_logo'],
            'clearlogo':
            item['program']['logo_image'] if 'program' in item
            and item['program'] else item['channel']['color_logo'],
            'poster':
            item['program']['poster_image']
            if 'program' in item and item['program'] else item['card_image'],
            'thumb':
            item['thumb_image'],
            'fanart':
            item['program']['background_image_tv_cropped'] if 'program' in item
            and item['program'] else item['background_image'],
            'mediatype':
            'episode',
            'brplayprovider':
            'globosat',
            'milliseconds_watched':
            int(item['watched_seconds']) * 1000
        }

        videos.append(video)

    return videos
def get_watch_later(page=1):
    headers = {
        'Accept-Encoding': 'gzip',
        'Authorization': GLOBOSAT_API_AUTHORIZATION,
        'Version': 2
    }

    token = auth_helper.get_globosat_token()

    watch_later_list = client.request(GLOBOSAT_WATCH_LATER % (token, page, 50),
                                      headers=headers)

    results = watch_later_list['data']

    while watch_later_list['next'] is not None:
        watch_later_list = client.request(watch_later_list['next'],
                                          headers=headers)
        results += watch_later_list['data']

    videos = []

    for item in results:

        video = {
            'id':
            item['id_globo_videos'],
            'label':
            item['channel']['title'] +
            (' - ' + item['program']['title'] if 'program' in item
             and item['program'] else '') + ' - ' + item['title'],
            'title':
            item['title'],
            'tvshowtitle':
            item['program']['title']
            if 'program' in item and item['program'] else item['title'],
            'studio':
            item['channel']['title'],
            'plot':
            item['description'],
            'tagline':
            None,
            'duration':
            float(item['duration_in_milliseconds']) / 1000.0,
            'logo':
            item['program']['logo_image'] if 'program' in item
            and item['program'] else item['channel']['color_logo'],
            'clearlogo':
            item['program']['logo_image'] if 'program' in item
            and item['program'] else item['channel']['color_logo'],
            'poster':
            item['program']['poster_image']
            if 'program' in item and item['program'] else item['card_image'],
            'thumb':
            item['thumb_image'],
            'fanart':
            item['program']['background_image_tv_cropped'] if 'program' in item
            and item['program'] else item['background_image_tv_cropped'],
            'mediatype':
            'episode',
            'brplayprovider':
            'globosat'
        }

        videos.append(video)

    return videos