def get_stream_url(data_url): utils.log("Getting URL for channel: " + data_url) config.login_check() streamurl = None url = API_ENDPOINT + "/api/v1.4/get/content/live-streams/" + data_url + "?include=quality" opener = get_url_opener() opener.addheaders.append( ('Authorization', "Bearer " + config.get_setting(constants.TOKEN))) response = opener.open(url) response_text = response.read() response_code = response.getcode() if response_code != 200: config.set_setting_bool(constants.LOGGED_IN, False) raise ApiError( "Got incorrect response code while requesting stream info. Reponse code: " + response_code + ";\nText: " + response_text) json_object = None try: json_object = json.loads(response_text) except ValueError, e: config.set_setting(constants.LOGGED_IN, False) raise ApiError("Did not receive json, something wrong: " + response_text)
def get_epg(date): utils.log("Getting EPG for date: " + date) timestampFrom = utils.unixTSFromDateString(date) timestampTo = int(timestampFrom + 86400) url = API_ENDPOINT + "/get/content/epgs/?include=channel&page[size]=100000&filter[utTo]=" + str( timestampTo) + "&filter[utFrom]=" + str(timestampFrom) opener = get_url_opener() response = opener.open(url) response_text = response.read() response_code = response.getcode() if response_code != 200: raise ApiError("Got bad response from EPG service. Response code: " + response_code) json_object = None try: json_object = json.loads(response_text) except ValueError: raise ApiError("Did not receive json, something wrong: " + response_text) return json_object
def get_stream_url(data_url): utils.log("Getting URL for channel: " + data_url) config.login_check() streamurl = None url = API_ENDPOINT + "/get/content/live-streams/" + data_url + "?include=quality" opener = get_url_opener() opener.addheaders.append( ('Authorization', "Bearer " + config.get_setting(constants.TOKEN))) response = None try: response = opener.open(url) except urllib.error.HTTPError as e: config.set_setting(constants.LOGGED_IN, "False") raise ApiError("Something wrong: " + e.code) response_text = response.read() response_code = response.getcode() if response_code != 200: config.set_setting_bool(constants.LOGGED_IN, "False") raise ApiError( "Got incorrect response code while requesting stream info. Reponse code: " + response_code + ";\nText: " + response_text) json_object = None try: json_object = json.loads(response_text) except ValueError: config.set_setting(constants.LOGGED_IN, "False") raise ApiError("Did not receive json, something wrong: " + response_text) stream_links = {} for stream in json_object["data"]: if stream["type"] != "live-streams": continue url = stream["attributes"][ "stream-url"] + "&auth_token=app_" + config.get_setting( constants.TOKEN) if "_lq.stream" in stream["id"]: stream_links["3-lq"] = url elif "_mq.stream" in stream["id"]: stream_links["2-mq"] = url elif "_hq.stream" in stream["id"]: stream_links["1-hq"] = url elif "_hd.stream" in stream["id"]: stream_links["0-hd"] = url for key in sorted(stream_links.keys()): streamurl = stream_links[key] break return streamurl
def login(force=False): utils.log("User: "******"; Logged in: " + str(config.get_setting_bool(constants.LOGGED_IN)) + "; Token: " + config.get_setting(constants.TOKEN)) if force is False and not utils.isEmpty(config.get_setting( constants.TOKEN)) and config.get_setting_bool(constants.LOGGED_IN): utils.log("Already logged in") return opener = get_url_opener() values = { 'id': config.get_setting(constants.USERNAME), 'uid': config.get_unique_id(), 'password': config.get_setting(constants.PASSWORD) } response = opener.open(API_ENDPOINT + '/post/user/users?%s' % urllib.parse.urlencode(values)) response_code = response.getcode() response_text = response.read() if response_code == 422: raise ApiError( "Login failed, Status: 422 Unprocessable Entity. Did you enter username/password?" ) if response_code == 401: raise ApiError( "Login failed, Status: 401 unauthorized. Check your username/password" ) if response_code != 200: raise ApiError( "Got incorrect response code during login. Reponse code: " + response_code + "; Text: " + response_text) json_object = None try: json_object = json.loads(response_text) except ValueError: config.set_setting_bool(constants.LOGGED_IN, False) config.set_setting(constants.TOKEN, "") utils.log("Did not receive json, something wrong: " + response_text) raise ApiError("Failed to log in, API error") utils.log(response_text) config.set_setting_bool(constants.LOGGED_IN, True) config.set_setting(constants.TOKEN, json_object["data"]["attributes"]["token"]) utils.log("Login success! Token: " + config.get_setting(constants.TOKEN)) return True
def create_new_user(name, mail, password): try: new_user = User(name=name, mail=mail, pwdhash=hash_password(password)) except BadRequestKeyError: raise ApiError(400, "missing parameters") db.session.add(new_user) try: db.session.commit() except sqlalchemy.exc.SQLAlchemyError as e: raise ApiError(500, "unable to persist user") return new_user
def update_user(user_id): user = User.query.filter_by(id=user_id).first() if user: # Update existing user try: user.update(g.data) db.session.commit() except sqlalchemy.exc.SQLAlchemyError as e: print(e) db.session.rollback() return jsonify({ "code": 404, "msg": "Unable to update the user" }), 404 return jsonify(user.export_public()) else: # Create new user at id try: user = User(id=user_id, **g.data) db.session.add(user) db.session.commit() except BadRequestKeyError: raise ApiError(400, "missing parameters") except sqlalchemy.exc.SQLAlchemyError as e: return jsonify({"code": 500, "msg": "unable to persist user"}), 500 return jsonify(user.export_public())
def get_channels(): config.login_check() url = API_ENDPOINT + '/get/content/packages?include=channels' opener = get_url_opener() response = opener.open(url) response_text = response.read() response_code = response.getcode() if response_code != 200: raise ApiError( "Got incorrect response code while requesting channel list. Reponse code: " + response_code + ";\nText: " + response_text) json_object = None try: json_object = json.loads(response_text) except ValueError, e: raise ApiError("Did not receive json, something wrong: " + response_text)
def session_post(self, url, params={}, data={}, headers={}, cookies={}, timeout=(10, 10), auth=False): if auth: data['jwt'] = self.jwt response = self.session.post(url, params=params, data=data, headers=headers, cookies=cookies, timeout=timeout) data = response.json() if not data['success']: raise ApiError(data['message']) return response
def get_channels(): config.login_check() url = API_ENDPOINT + '/get/content/packages?include=channels' opener = get_url_opener() response = opener.open(url) response_text = response.read() response_code = response.getcode() if response_code != 200: raise ApiError( "Got incorrect response code while requesting channel list. Reponse code: " + response_code + ";\nText: " + response_text) json_object = None try: json_object = json.loads(response_text) except ValueError: raise ApiError("Did not receive json, something wrong: " + response_text) if "included" not in json_object: raise ApiError("Invalid response: " + response_text) channels = [] for item in json_object["included"]: if "type" not in item or "id" not in item: continue if item["type"] != "channels": continue if item["attributes"] is None or item["attributes"]["title"] is None: continue channels.append({ 'id': item["id"], 'name': item["attributes"]["title"], 'logo': item["attributes"]["logo-url"], 'thumb': item["attributes"]["epg-default-poster-url"] }) return channels
def verify_token(): authorization = request.headers.get("Authorization") [type, token] = authorization.split(" ") try: tok = jwt.JWT(jwt=token).token key_set_verify( tok, jwk.JWKSet.from_json(get_keys().export(private_keys=False))) return jsonify({"valid": True}) except jws.InvalidJWSSignature: return jsonify({"valid": False}) except: raise ApiError(400, "Invalid token format")
def initialize(self, dry_run=False): """Create conf base directory and run git init. Return True if it exists.""" if os.path.isdir(self.conf_base): return True if dry_run: return False os.makedirs(self.conf_base) status, out = self.git_repo.init() if status > 0: raise ApiError(out) return True
def _api_call(self, path, params): params['cid'] = self.cid if 'from_' in params: params['from'] = params.pop('from_') params['sign'] = self._make_sign(path, params) response = self.session.get(self.API_URL + path, params=params) if response.status_code == 502: raise ApiError('Bad Gateway', 502) elif response.status_code == 504: raise ApiError('Gateway Timeout', 504) else: response.raise_for_status() data = response.json() if isinstance(data, dict): err = data.get('error') if err: raise ApiError(**err) return data
def get_fresh_token(rt: str): db_token = RefreshToken.query.filter_by(jti=rt, revoked=False).first() if not db_token: # Refresh token does not exist raise ApiError(401, "Invalid refresh token.") if datetime.now(tz=pytz.utc) > db_token.exp: # Token has expired try: db.session.delete(db_token) db.session.commit() except sqlalchemy.exc.SQLAlchemyError: raise ApiError(500, "Unable to delete expired refresh token.") raise ApiError(401, "Invalid refresh token.") token = jwt.JWT(header={ "alg": "RS256", "typ": "JWT" }, claims=access_token(db_token)) token.make_signed_token(get_signing_key()) return token.serialize()
def login(force=False): utils.log("User: "******"; Logged in: " + str(config.get_setting_bool(constants.LOGGED_IN)) + "; Token: " + config.get_setting(constants.TOKEN)) if force is False and not utils.isEmpty(config.get_setting( constants.TOKEN)) and config.get_setting_bool(constants.LOGGED_IN): utils.log("Already logged in") return opener = get_url_opener() values = { 'username': config.get_setting(constants.USERNAME), 'uid': config.get_unique_id(), 'password': config.get_setting(constants.PASSWORD) } response = opener.open(API_ENDPOINT + '/api/v1.4/post/user/login', urllib.urlencode(values)) response_code = response.getcode() response_text = response.read() if response_code != 200: raise ApiError( "Got incorrect response code during login. Reponse code: " + response_code + "; Text: " + response_text) json_object = None try: json_object = json.loads(response_text) except ValueError, e: config.set_setting_bool(constants.LOGGED_IN, False) config.set_setting(constants.TOKEN, "") utils.log("Did not receive json, something wrong: " + response_text) raise ApiError("Failed to log in, API error")
def refresh_token(user): # Check if the user has already a refresh token db_token = RefreshToken.query.filter_by(user_id=user.id, revoked=False).first() if db_token: if datetime.now(tz=pytz.utc) <= db_token.exp: return db_token else: # Token has expired db.session.delete(db_token) db_token = RefreshToken(user_id=user.id, jti=str(uuid4()), exp=datetime.now(tz=pytz.utc) + timedelta(weeks=4)) try: db.session.add(db_token) db.session.commit() except sqlalchemy.exc.SQLAlchemyError as e: raise ApiError(500, "unable to persist refresh token") return db_token
json_object = None try: json_object = json.loads(response_text) except ValueError, e: config.set_setting_bool(constants.LOGGED_IN, False) config.set_setting(constants.TOKEN, "") utils.log("Did not receive json, something wrong: " + response_text) raise ApiError("Failed to log in, API error") if json_object["status"] == "ko": config.set_setting_bool(constants.LOGGED_IN, False) config.set_setting(constants.TOKEN, "") utils.log("Failed to log in. Message: " + response_text) raise ApiError("Failed to log in, check credentials") utils.log(response_text) config.set_setting_bool(constants.LOGGED_IN, True) config.set_setting(constants.TOKEN, json_object["token"]) utils.log("Login success! Token: " + config.get_setting(constants.TOKEN)) return True def get_channels(): config.login_check() url = API_ENDPOINT + '/api/v1.4/get/tv/channels' opener = get_url_opener()
response = opener.open(url) response_text = response.read() response_code = response.getcode() if response_code != 200: raise ApiError( "Got incorrect response code while requesting channel list. Reponse code: " + response_code + ";\nText: " + response_text) json_object = None try: json_object = json.loads(response_text) except ValueError, e: raise ApiError("Did not receive json, something wrong: " + response_text) if "included" not in json_object: raise ApiError("Invalid response: " + response_text) channels = [] for item in json_object["included"]: if "type" not in item or "id" not in item: continue if item["type"] != "channels": continue if item["attributes"] is None or item["attributes"]["title"] is None: continue channels.append({ 'id': item["id"], 'name': item["attributes"]["title"],