Пример #1
0
def get_token_record(token=None) -> dict:
    error_msg = None
    ret = {
        "success": False,
    }
    if token:
        record = mysql.exec(
            "SELECT `useage_remain` FROM `api`.`ptboard_token` WHERE `token`='{}'"
            .format(token))
        try:
            token_quote = int(record[0])
        except TypeError:
            token_quote = 0
            error_msg = "This token is not exist in database."
        else:
            if token_quote <= 0:
                mysql.exec(
                    "DELETE FROM `api`.`ptboard_token` WHERE `token`='{}'".
                    format(token))
                error_msg = "The quote of this token is exhaustion"
            else:
                ret.update({"success": True})
        ret.update({"token": token, "quote": token_quote})
    else:
        error_msg = "No token."
    ret.update({"error": error_msg})
    return ret
Пример #2
0
def gen():
    if request.method == "POST":
        url = request.form["url"]
    elif request.method == "GET":
        url = request.args.get("url")
    else:
        url = ""

    if url:
        _gen = Gen(url=url)

        row, data = mysql.exec(
            "SELECT * FROM `api`.`gen_info` WHERE `site`='{}' AND `sid`='{}'".
            format(_gen.site, _gen.sid),
            r_dict=True,
            ret_row=True)

        if int(row) == 0:
            data = _gen.gen()
            if data["success"]:  # 正确获取的情况下缓存请求结果
                mysql.exec(
                    "INSERT INTO `api`.`gen_info` (`site`, `sid`, `data`)"
                    " VALUES ('{}', '{}', '{}')".format(
                        _gen.site, _gen.sid, escape_string(json.dumps(data))))
        else:
            data_str = data.get("data")
            data = json.loads(data_str)

        return jsonify(data)
    else:
        return redirect("https://git.io/vFvmP", code=301)
Пример #3
0
def sign():
    ret = {}
    token = request.args.get("token") or None
    hashes = request.args.get("hashes") or None
    if token and hashes:
        token_verify = poi.token_verify(token=token, hashes=hashes)
        if token_verify["success"]:
            mysql.exec(
                "INSERT INTO `api`.`ptboard_token` (`token`) VALUES ('{}')".
                format(token))
        ret.update(get_token_record(token))
    return jsonify(ret)
Пример #4
0
def token_use(token=None) -> dict:
    record = get_token_record(token)
    token_quote = record.setdefault("quote", 0)

    if token_quote > 0:
        token_quote -= 1
        mysql.exec(
            "UPDATE `api`.`ptboard_token` SET `useage_remain`={} WHERE `token`='{}'"
            .format(token_quote, token))
        record.update({"quote": token_quote})

    return record
Пример #5
0
def ptboard():
    t0 = time.time()

    search_raw = request.args.get("search") or ""
    order_raw = request.args.get("order") or "desc"
    limit_raw = request.args.get("limit") or 50
    offset_raw = request.args.get("offset") or 0

    search = re.sub(r"[ _\-,.]", " ", search_raw)
    search = search.split()
    search = search[:10]
    if search:
        opt = " AND ".join([
            "`title` LIKE '%{key}%'".format(key=escape_string(i))
            for i in search
        ])
    else:
        opt = "1=1"

    order = "desc" if order_raw not in ["desc", "asc"] else order_raw
    try:
        limit = int(limit_raw)
        if limit > 200:
            limit = 200
    except ValueError or TypeError:
        limit = 50
    try:
        offset = int(offset_raw)
    except ValueError or TypeError:
        offset = 0

    sql = (
        "SELECT * FROM `rss_pt_site` WHERE {opt} ORDER BY `pubDate` {_da} LIMIT {_offset}, {_limit}"
        .format(opt=opt, _da=order.upper(), _offset=offset, _limit=limit))
    rows_count, rows_data = mysql.exec(sql=sql,
                                       r_dict=True,
                                       fetch_all=True,
                                       ret_row=True)

    total_data = mysql.exec(
        "SELECT `TABLE_ROWS` FROM `information_schema`.`TABLES` "
        "WHERE `TABLE_NAME`='rss_pt_site'")[0]

    return jsonify({
        "cost": time.time() - t0,
        "rows": rows_data,
        "total": rows_count if search else total_data
    })
Пример #6
0
    def token_valid(token_):
        if len(token_) != 32:
            return False

        row, data = mysql.exec("SELECT * FROM `api`.`ptboard_token` WHERE token = %s", token_, ret_row=True)

        if row > 0:
            return True
        else:
            return False
Пример #7
0
 def get_site_list():
     return [i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`", fetch_all=True)]
Пример #8
0
def ptboard():
    ret = {
        "success": False,
        "error": None
    }

    t0 = time.time()

    # 1. Get user requests
    search_raw = request.args.get("search") or search_default
    order_raw = request.args.get("order") or order_default
    site_raw = request.args.get("site") or site_default
    no_site_raw = request.args.get("no_site") or no_site_default
    limit = request.args.get("limit") or limit_default
    offset = request.args.get("offset") or offset_default
    start_time = request.args.get("start_time") or start_time_default
    end_time = request.args.get("end_time") or end_time_default

    # 2. Clean user requests
    search = re.sub(r"[ _\-,.+]", " ", search_raw)
    search = search.split()
    search = list(filter(lambda l: len(l) > 1, search))  # Remove those too short letter
    search = search[:10]

    search_opt = site_opt = no_site_opt = "1=1"
    if search:
        search_opt = warp_str(" AND ".join(map(lambda i: "title LIKE '%{}%'".format(escape_string(i)), search)))

    start_time = recover_int_to_default(start_time, start_time_default)
    end_time = recover_int_to_default(end_time, end_time_default)
    time_opt = warp_str("ptboard_record.pubDate BETWEEN {start} AND {end}".format(start=start_time, end=end_time))

    @cache.cached(timeout=86400)
    def get_site_list():
        return [i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`", fetch_all=True)]

    site_list = get_site_list()
    site = list(filter(lambda i: i in site_list, site_raw.split(",")))
    no_site = list(filter(lambda i: i in site_list, no_site_raw.split(",")))

    if site:
        site_opt = warp_str(" OR ".join(["ptboard_record.site = '{site}'".format(site=s) for s in site]))
    if no_site:
        no_site_opt = warp_str(" AND ".join(["ptboard_record.site != '{site}'".format(site=s) for s in no_site]))

    limit = recover_int_to_default(limit, limit_default)
    offset = recover_int_to_default(offset, offset_default)

    if limit > 200:
        limit = 200

    order = "desc" if order_raw.lower() not in ["desc", "asc"] else order_raw

    # 3. Get response data from Database
    opt = " AND ".join([time_opt, site_opt, no_site_opt, search_opt])
    sql = ("SELECT ptboard_record.sid, ptboard_site.site, ptboard_record.title, "
           "concat(ptboard_site.torrent_prefix,ptboard_record.sid, ptboard_site.torrent_suffix) AS link, "
           "ptboard_record.pubDate FROM api.ptboard_record "
           "INNER JOIN api.ptboard_site ON api.ptboard_site.site = api.ptboard_record.site "
           "WHERE {opt} ORDER BY `pubDate` {_da} "
           "LIMIT {_offset}, {_limit}".format(opt=opt, _da=order.upper(), _offset=offset, _limit=limit)
           )
    record_count, rows_data = mysql.exec(sql=sql, r_dict=True, fetch_all=True, ret_row=True)

    # 4. Sort Response data
    if app.config.get("DEBUG"):
        ret["sql"] = sql

    def fix_predb(d: dict):
        if d["site"] == "PreDB":
            d["link"] = predb_prefix + d["title"].split(" | ")[1]
        return d

    ret.update({
        "success": True,
        "rows": list(map(fix_predb, rows_data)),
        "total": record_count if search else mysql.exec("SELECT count(*) FROM `api`.`ptboard_record`")[0],
    })

    ret["cost"] = time.time() - t0
    return jsonify(ret)
Пример #9
0
 def get_site_list():
     return [
         i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`",
                                  fetch_all=True)
     ]
Пример #10
0
def ptboard():
    ret = {"success": False, "error": None}

    t0 = time.time()

    # 1. Get user requests
    search_raw = request.args.get("search") or search_default
    order_raw = request.args.get("order") or order_default
    site_raw = request.args.get("site") or site_default
    no_site_raw = request.args.get("no_site") or no_site_default
    limit = request.args.get("limit") or limit_default
    offset = request.args.get("offset") or offset_default
    start_time = request.args.get("start_time") or start_time_default
    end_time = request.args.get("end_time") or end_time_default

    # 2. Clean user requests
    search = re.sub(r"[ _\-,.+]", " ", search_raw)
    search = search.split()
    search = list(filter(lambda l: len(l) > 1,
                         search))  # Remove those too short letter
    search = search[:10]

    search_opt = site_opt = no_site_opt = "1=1"
    if search:
        search_opt = warp_str(" AND ".join(
            map(lambda i: "title LIKE '%{}%'".format(escape_string(i)),
                search)))

    start_time = recover_int_to_default(start_time, start_time_default)
    end_time = recover_int_to_default(end_time, end_time_default)
    time_opt = warp_str(
        "ptboard_record.pubDate BETWEEN {start} AND {end}".format(
            start=start_time, end=end_time))

    @cache.cached(timeout=86400)
    def get_site_list():
        return [
            i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`",
                                     fetch_all=True)
        ]

    site_list = get_site_list()
    site = list(filter(lambda i: i in site_list, site_raw.split(",")))
    no_site = list(filter(lambda i: i in site_list, no_site_raw.split(",")))

    if site:
        site_opt = warp_str(" OR ".join(
            ["ptboard_record.site = '{site}'".format(site=s) for s in site]))
    if no_site:
        no_site_opt = warp_str(" AND ".join([
            "ptboard_record.site != '{site}'".format(site=s) for s in no_site
        ]))

    limit = recover_int_to_default(limit, limit_default)
    offset = recover_int_to_default(offset, offset_default)

    if limit > 200:
        limit = 200

    order = "desc" if order_raw.lower() not in ["desc", "asc"] else order_raw

    # 3. Get response data from Database
    opt = " AND ".join([time_opt, site_opt, no_site_opt, search_opt])
    sql = (
        "SELECT ptboard_record.sid, ptboard_site.site, ptboard_record.title, "
        "concat(ptboard_site.torrent_prefix,ptboard_record.sid, ptboard_site.torrent_suffix) AS link, "
        "ptboard_record.pubDate FROM api.ptboard_record "
        "INNER JOIN api.ptboard_site ON api.ptboard_site.site = api.ptboard_record.site "
        "WHERE {opt} ORDER BY `pubDate` {_da} "
        "LIMIT {_offset}, {_limit}".format(opt=opt,
                                           _da=order.upper(),
                                           _offset=offset,
                                           _limit=limit))
    record_count, rows_data = mysql.exec(sql=sql,
                                         r_dict=True,
                                         fetch_all=True,
                                         ret_row=True)

    # 4. Sort Response data
    if app.config.get("DEBUG"):
        ret["sql"] = sql

    def fix_predb(d: dict):
        if d["site"] == "PreDB":
            d["link"] = predb_prefix + d["title"].split(" | ")[1]
        return d

    ret.update({
        "success":
        True,
        "rows":
        list(map(fix_predb, rows_data)),
        "total":
        record_count if search else
        mysql.exec("SELECT count(*) FROM `api`.`ptboard_record`")[0],
    })

    ret["cost"] = time.time() - t0
    return jsonify(ret)
Пример #11
0
def ptboard():
    ret = {"success": False, "error": None}

    t0 = time.time()

    search_raw = request.args.get("search") or search_default
    order_raw = request.args.get("order") or order_default
    site_raw = request.args.get("site") or site_default
    no_site_raw = request.args.get("no_site") or no_site_default
    limit = request.args.get("limit") or limit_default
    offset = request.args.get("offset") or offset_default
    start_time = request.args.get("start_time") or start_time_default
    end_time = request.args.get("end_time") or end_time_default

    search = re.sub(r"[ _\-,.+]", " ", search_raw)
    search = search.split()
    search = search[:10]

    search_opt = site_opt = no_site_opt = "1=1"
    if search:
        search_opt = warp_str(" AND ".join([
            "`title` LIKE '%{key}%'".format(key=escape_string(i))
            for i in search
        ]))

    start_time = recover_int_to_default(start_time, start_time_default)
    end_time = recover_int_to_default(end_time, end_time_default)
    time_opt = warp_str("`pubDate` BETWEEN {start} AND {end}".format(
        start=start_time, end=end_time))

    if site_raw:
        site = site_raw.split(",")
        site_opt = warp_str(" OR ".join(
            ["`site` = '{site}'".format(site=escape_string(s)) for s in site]))

    if no_site_raw:
        no_site = no_site_raw.split(",")
        no_site_opt = warp_str(" AND ".join([
            "`site` != '{site}'".format(site=escape_string(s)) for s in no_site
        ]))

    limit = recover_int_to_default(limit, limit_default)
    offset = recover_int_to_default(offset, offset_default)

    if limit > 200:
        limit = 200

    order = "desc" if order_raw not in ["desc", "asc"] else order_raw

    opt = " AND ".join([search_opt, time_opt, site_opt, no_site_opt])
    sql = (
        "SELECT * FROM `api`.`ptboard_record` WHERE {opt} ORDER BY `pubDate` {_da} "
        "LIMIT {_offset}, {_limit}".format(opt=opt,
                                           _da=order.upper(),
                                           _offset=offset,
                                           _limit=limit))

    record_count, rows_data = mysql.exec(sql=sql,
                                         r_dict=True,
                                         fetch_all=True,
                                         ret_row=True)

    ret.update({
        "success":
        True,
        "rows":
        rows_data,
        "total":
        record_count if search else
        mysql.exec("SELECT count(*) FROM `api`.`ptboard_record`")[0],
    })

    ret.update({"cost": time.time() - t0})
    return jsonify(ret)