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
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
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")
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
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")
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