예제 #1
0
 def _refreshToken(self):
     try:
         with PersistentDict("userdata.pickle") as db:
             oldToken = db.get("token")
             if oldToken:
                 resp = self.session.get(url_constructor(
                     "/in/aadhar/v2/firetv/in/users/refresh-token"),
                                         headers={
                                             "userIdentity":
                                             oldToken,
                                             "deviceId":
                                             db.get("deviceId",
                                                    str(uuid4()))
                                         },
                                         raise_for_status=False,
                                         max_age=-1).json()
                 if resp.get("errorCode"):
                     return resp.get("message")
                 new_token = deep_get(resp, "description.userIdentity")
                 db['token'] = new_token
                 db.flush()
                 return new_token
         return False
     except Exception as e:
         return e
예제 #2
0
 def getPlay(self,
             contentId,
             subtag,
             drm=False,
             lang=None,
             partner=None,
             ask=False):
     url = url_constructor(
         "/play/v1/playback/%scontent/%s" %
         ('partner/' if partner is not None else '', contentId))
     encryption = "widevine" if drm else "plain"
     if partner:
         resp = self.post(url,
                          headers=self._getPlayHeaders(
                              extra={"X-HS-Platform": "android"}),
                          params=self._getPlayParams(subtag, encryption),
                          max_age=-1,
                          json={
                              "user_id": "",
                              "partner_data": "x",
                              "data": {
                                  "third_party_bundle": partner
                              }
                          })
     else:
         resp = self.get(url,
                         headers=self._getPlayHeaders(),
                         params=self._getPlayParams(subtag, encryption),
                         max_age=-1)
     playBackSets = deep_get(resp, "data.playBackSets")
     if playBackSets is None:
         return None, None, None
     playbackUrl, licenceUrl, playbackProto = HotstarAPI._findPlayback(
         playBackSets, lang, ask)
     return playbackUrl, licenceUrl, playbackProto
예제 #3
0
 def getMenu(self):
     url = url_constructor("/o/v2/menu")
     resp = self.get(url,
                     headers={
                         "x-country-code": "in",
                         "x-platform-code": "ANDROID_TV"
                     })
     return deep_get(resp, "body.results.menuItems")
예제 #4
0
    def getTray(self, url, search_query=None):
        if search_query:
            url = url_constructor("/s/v1/scout?q=%s&size=30" %
                                  quote_plus(search_query))
        if "persona" in url:
            with PersistentDict("userdata.pickle") as db:
                pid = db.get("udata", {}).get("pId")
            results = self.get(url.format(pid=pid),
                               headers={
                                   "hotstarauth":
                                   self._getAuth(includeST=True, persona=True)
                               })
            # ids = ",".join(map(lambda x: x.get("item_id"),
            #                deep_get(results, "data.items")))
            # url = url_constructor("/o/v1/multi/get/content?ids=" + ids)
        else:
            results = self.get(url)

        if "data" in results:
            results = results.get("data")
            if "progress_meta" in results and type(
                    results.get("items")) is dict:
                for cID, data in results.get("progress_meta").items():
                    results["items"][cID].update(data)
        else:
            results = deep_get(results, "body.results")

        if results:
            items = results.get("items") or deep_get(
                results, "assets.items") or (results.get("map") and list(
                    results.get("map").values())) or deep_get(
                        results, "trays.items") or []
            if type(items) is dict:
                items = list(items.values())
            nextPageUrl = deep_get(
                results,
                "assets.nextOffsetURL") or results.get("nextOffsetURL")

            totalResults = deep_get(
                results, "assets.totalResults") or results.get("totalResults")
            offset = deep_get(results,
                              "assets.offset") or results.get("offset")
            allResultsPageUrl = None
            if len(items) > 0 and nextPageUrl is not None and (
                    "/season/" in nextPageUrl or items[0].get("assetType")
                    == "EPISODE") and totalResults is not None:
                allResultsPageUrl = updateQueryParams(
                    nextPageUrl, {
                        "size": str(totalResults),
                        "tas": str(totalResults),
                        "offset": "0"
                    })

            if deep_get(results, "channelClip.clipType", "") == "LIVE":
                items.insert(0, deep_get(results, "channelClip", {}))

            return items, nextPageUrl, allResultsPageUrl
        return [], None, None
예제 #5
0
 def getExtItem(self, contentId):
     url = url_constructor(
         "/o/v1/multi/get/content?ids={0}".format(contentId))
     resp = self.get(url)
     url = deep_get(resp, "body.results.map.{0}.uri".format(contentId))
     if url is None:
         return None, None, None
     resp = self.get(url)
     item = deep_get(resp, "body.results.item")
     if item.get("clipType") == "LIVE":
         item["encrypted"] = True
     return "com.widevine.alpha" if item.get(
         "encrypted"
     ) else False, item.get("isSubTagged") and "subs-tag:%s|" % item.get(
         "features")[0].get("subType"), item.get("title")
예제 #6
0
 def doLogin(self):
     url = url_constructor("/in/aadhar/v2/firetv/in/users/logincode/")
     resp = self.post(url, headers={"Content-Length": "0"})
     code = deep_get(resp, "description.code")
     yield (code, 1)
     for i in range(2, 101):
         resp = self.get(url + code, max_age=-1)
         Script.log(resp, lvl=Script.INFO)
         token = deep_get(resp, "description.userIdentity")
         if token:
             with PersistentDict("userdata.pickle") as db:
                 db["token"] = token
                 db["deviceId"] = str(uuid4())
                 db["udata"] = json.loads(
                     json.loads(b64decode(token.split(".")[1] +
                                          "========")).get("sub"))
                 if db.get("isGuest"):
                     del db["isGuest"]
                 db.flush()
             yield code, 100
             break
         yield code, i