|
import random
|
|
|
|
import flask
|
|
import src.functions.config
|
|
import src.functions.credentials
|
|
import src.functions.drivetools
|
|
import src.functions.metadata
|
|
|
|
metadataBP = flask.Blueprint("metadata", __name__)
|
|
|
|
|
|
@metadataBP.route("/api/v1/metadata")
|
|
async def metadataFunction():
|
|
a = flask.request.args.get("a")
|
|
c = flask.request.args.get("c")
|
|
g = flask.request.args.get("g")
|
|
id = flask.request.args.get("id")
|
|
q = flask.request.args.get("q")
|
|
r = flask.request.args.get("r")
|
|
s = flask.request.args.get("s")
|
|
rmdup = flask.request.args.get("rmdup")
|
|
rmnobanner = flask.request.args.get("rmnobanner")
|
|
config = src.functions.config.readConfig()
|
|
tmp_metadata = src.functions.metadata.readMetadata(config)
|
|
|
|
if (
|
|
any(a == account["auth"] for account in config["account_list"])
|
|
or config.get("auth") == False
|
|
):
|
|
account = next((i for i in config["account_list"] if i["auth"] == a), None)
|
|
whitelisted_categories_metadata = []
|
|
for category in tmp_metadata:
|
|
category_config = next(
|
|
(i for i in config["category_list"] if i["id"] == category["id"]), None
|
|
)
|
|
if category_config:
|
|
if category_config.get("whitelist"):
|
|
if account["auth"] in category_config.get("whitelist"):
|
|
whitelisted_categories_metadata.append(category)
|
|
else:
|
|
whitelisted_categories_metadata.append(category)
|
|
else:
|
|
whitelisted_categories_metadata.append(category)
|
|
tmp_metadata = whitelisted_categories_metadata
|
|
whitelisted_accounts_metadata = []
|
|
if account:
|
|
if account.get("whitelist"):
|
|
for x in tmp_metadata:
|
|
if any(x["id"] == whitelist for whitelist in account["whitelist"]):
|
|
whitelisted_accounts_metadata.append(x)
|
|
tmp_metadata = whitelisted_accounts_metadata
|
|
if c:
|
|
tmp_metadata = [
|
|
next((i for i in tmp_metadata if i["categoryInfo"]["name"] == c), None)
|
|
]
|
|
if tmp_metadata:
|
|
pass
|
|
else:
|
|
return (
|
|
flask.jsonify(
|
|
{
|
|
"code": 400,
|
|
"content": None,
|
|
"message": "The category provided could not be found.",
|
|
"success": False,
|
|
}
|
|
),
|
|
400,
|
|
)
|
|
if g:
|
|
index = 0
|
|
for category in tmp_metadata:
|
|
tmp_metadata[index]["children"] = [
|
|
item for item in category["children"] if g in item["genres"]
|
|
]
|
|
index += 1
|
|
if q:
|
|
index = 0
|
|
for category in tmp_metadata:
|
|
tmp_metadata[index]["children"] = [
|
|
item
|
|
for item in category["children"]
|
|
if q.lower() in item["title"].lower()
|
|
]
|
|
index += 1
|
|
if s:
|
|
index = 0
|
|
for category in tmp_metadata:
|
|
if s == "alphabet-asc":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"], key=lambda k: k["title"]
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "alphabet-des":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"], key=lambda k: k["title"], reverse=True
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "date-asc":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"],
|
|
key=lambda k: tuple(
|
|
map(int, k.get("releaseDate", "1900-01-01").split("-"))
|
|
),
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "date-des":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"],
|
|
key=lambda k: tuple(
|
|
map(int, k.get("releaseDate", "1900-01-01").split("-"))
|
|
),
|
|
reverse=True,
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "popularity-asc":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"],
|
|
key=lambda k: float(k.get("popularity", 0.0)),
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "popularity-des":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"],
|
|
key=lambda k: float(k.get("popularity", 0.0)),
|
|
reverse=True,
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "vote-asc":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"],
|
|
key=lambda k: float(k.get("voteAverage", 0.0)),
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "vote-des":
|
|
try:
|
|
tmp_metadata[index]["children"] = sorted(
|
|
category["children"],
|
|
key=lambda k: float(k.get("voteAverage", 0.0)),
|
|
reverse=True,
|
|
)
|
|
except:
|
|
pass
|
|
elif s == "random":
|
|
try:
|
|
random.shuffle(tmp_metadata[index]["children"])
|
|
except:
|
|
pass
|
|
else:
|
|
return (
|
|
flask.jsonify(
|
|
{
|
|
"code": 400,
|
|
"content": None,
|
|
"message": "Bad request! Sorting parameter '%s' does not exist."
|
|
% (s),
|
|
"success": False,
|
|
}
|
|
),
|
|
400,
|
|
)
|
|
index += 1
|
|
if rmnobanner == "true" or config.get("remove_no_poster") == True:
|
|
for category in tmp_metadata:
|
|
tmp_children = []
|
|
for item in category["children"]:
|
|
try:
|
|
if item.get("posterPath") not in ["", None]:
|
|
tmp_children.append(item)
|
|
except:
|
|
pass
|
|
category["children"] = tmp_children
|
|
if rmdup == "true" or config.get("remove_duplicates") == True:
|
|
for category in tmp_metadata:
|
|
unique = ["null"]
|
|
tmp_children = []
|
|
for item in category["children"]:
|
|
try:
|
|
if item.get("apiId", "null") not in unique:
|
|
unique.append(item["apiId"])
|
|
tmp_children.append(item)
|
|
elif item.get("apiId") == None:
|
|
tmp_children.append(item)
|
|
except:
|
|
pass
|
|
category["children"] = tmp_children
|
|
for x in tmp_metadata:
|
|
x["length"] = len(x["children"])
|
|
if id:
|
|
tmp_metadata = src.functions.metadata.jsonExtract(
|
|
tmp_metadata, "id", id, False
|
|
)
|
|
config, drive = src.functions.credentials.refreshCredentials(config)
|
|
if tmp_metadata:
|
|
if config.get("build_type") == "full":
|
|
if tmp_metadata.get("type") == "directory":
|
|
tmp_metadata["parent_children"] = []
|
|
for item in src.functions.drivetools.driveIter(
|
|
{"id": tmp_metadata["parents"][0]}, drive, "PLACEHOLDER-X"
|
|
):
|
|
if item["mimeType"] == "application/vnd.google-apps.folder":
|
|
item["type"] = "directory"
|
|
tmp_metadata["parent_children"].append(item)
|
|
else:
|
|
if (
|
|
tmp_metadata.get("title")
|
|
and tmp_metadata.get("type") == "directory"
|
|
):
|
|
tmp_metadata["children"] = []
|
|
for item in src.functions.drivetools.driveIter(
|
|
tmp_metadata, drive, "video"
|
|
):
|
|
if item["mimeType"] == "application/vnd.google-apps.folder":
|
|
item["type"] = "directory"
|
|
tmp_metadata["children"].append(item)
|
|
else:
|
|
item["type"] = "file"
|
|
tmp_metadata["children"].append(item)
|
|
elif tmp_metadata.get("type") == "directory":
|
|
tmp_metadata["parent_children"] = []
|
|
for item in src.functions.drivetools.driveIter(
|
|
{"id": tmp_metadata["parents"][0]}, drive, "PLACEHOLDER-X"
|
|
):
|
|
if item["mimeType"] == "application/vnd.google-apps.folder":
|
|
item["type"] = "directory"
|
|
tmp_metadata["parent_children"].append(item)
|
|
return (
|
|
flask.jsonify(
|
|
{
|
|
"code": 200,
|
|
"content": tmp_metadata,
|
|
"message": "Metadata parsed successfully.",
|
|
"success": True,
|
|
}
|
|
),
|
|
200,
|
|
)
|
|
tmp_metadata = (
|
|
drive.files()
|
|
.get(
|
|
fileId=id, supportsAllDrives=True, fields="id,name,mimeType,parents"
|
|
)
|
|
.execute()
|
|
)
|
|
if tmp_metadata["mimeType"] == "application/vnd.google-apps.folder":
|
|
tmp_metadata["type"] = "directory"
|
|
tmp_metadata["children"] = []
|
|
tmp_metadata["parent_children"] = []
|
|
for item in src.functions.drivetools.driveIter(
|
|
tmp_metadata, drive, "video"
|
|
):
|
|
if (
|
|
tmp_metadata.get("mimeType")
|
|
== "application/vnd.google-apps.folder"
|
|
):
|
|
tmp_metadata["type"] = "directory"
|
|
tmp_metadata["children"].append(item)
|
|
else:
|
|
tmp_metadata["type"] = "file"
|
|
tmp_metadata["children"].append(item)
|
|
for item in src.functions.drivetools.driveIter(
|
|
{"id": tmp_metadata["parents"][0]}, drive, "PLACEHOLDER-X"
|
|
):
|
|
if item["mimeType"] == "application/vnd.google-apps.folder":
|
|
item["type"] = "directory"
|
|
tmp_metadata["parent_children"].append(item)
|
|
if r:
|
|
index = 0
|
|
for category in tmp_metadata:
|
|
tmp_metadata[index]["children"] = eval(
|
|
"category['children']" + "[" + r + "]"
|
|
)
|
|
index += 1
|
|
return (
|
|
flask.jsonify(
|
|
{
|
|
"code": 200,
|
|
"content": tmp_metadata,
|
|
"message": "Metadata parsed successfully.",
|
|
"success": True,
|
|
}
|
|
),
|
|
200,
|
|
)
|
|
else:
|
|
return (
|
|
flask.jsonify(
|
|
{
|
|
"code": 401,
|
|
"content": None,
|
|
"message": "Your credentials are invalid.",
|
|
"success": False,
|
|
}
|
|
),
|
|
401,
|
|
)
|
|
|