Esempio n. 1
0
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)
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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())
Esempio n. 7
0
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)
Esempio n. 8
0
	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
Esempio n. 9
0
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
Esempio n. 10
0
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")
Esempio n. 11
0
    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
Esempio n. 12
0
    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
Esempio n. 13
0
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()
Esempio n. 14
0
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")
Esempio n. 15
0
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
Esempio n. 16
0
    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()
Esempio n. 17
0
    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"],