Bluestall/generate_json.py

152 lines
4.7 KiB
Python
Raw Normal View History

2024-09-17 14:24:15 -07:00
import argparse
import json
import os
from io import StringIO
import mistletoe
import pandas as pd
from bs4 import BeautifulSoup
from github import Github
from get_bundle_id import get_single_bundle_id
def transform_object(original_object):
transformed_object = {**original_object, "apps": None}
app_map = {}
for app in original_object["apps"]:
(
name,
bundle_identifier,
version,
version_date,
size,
download_url,
developer_name,
localized_description,
icon_url,
) = (
app["name"],
app["bundleIdentifier"],
app["version"],
app["versionDate"],
app["size"],
app["downloadURL"],
app["developerName"],
app["localizedDescription"],
app["iconURL"],
)
if name not in app_map:
app_map[name] = {
"name": name,
"bundleIdentifier": bundle_identifier,
"developerName": developer_name,
"iconURL": icon_url,
"versions": [],
}
app_map[name]["versions"].append(
{
"version": version,
"date": version_date,
"size": size,
"downloadURL": download_url,
"localizedDescription": localized_description,
}
)
for name, app_info in app_map.items():
app_info["versions"].sort(key=lambda x: x["date"], reverse=True)
transformed_object["apps"] = list(app_map.values())
return transformed_object
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--token", help="Github token")
args = parser.parse_args()
token = args.token
with open("apps.json", "r") as f:
data = json.load(f)
if os.path.exists("bundleId.csv"):
df = pd.read_csv("bundleId.csv")
else:
df = pd.DataFrame(columns=["name", "bundleId"])
md_df = None
if os.path.exists("README.md"):
with open("README.md", "r", encoding="utf-8") as f:
raw_md = f.read()
html = mistletoe.markdown(raw_md)
soup = BeautifulSoup(html, "html.parser")
table = soup.find_all("table")[1]
md_df = pd.read_html(StringIO(str(table)), keep_default_na=False)[0]
md_df["App Name"] = md_df["App Name"].str.replace(" ", "").str.lower()
# clear apps
data["apps"] = []
g = Github(token)
repo = g.get_repo("swaggyP36000/TrollStore-IPAs")
releases = repo.get_releases()
for release in releases:
print(release.title)
for asset in release.get_assets():
if asset.name[-3:] != "ipa":
continue
name = asset.name[:-4]
date = asset.created_at.strftime("%Y-%m-%d")
try:
app_name, version = name.split("-", 1)
except:
app_name = name
version = "1.0"
if app_name in df.name.values:
bundle_id = str(df[df.name == app_name].bundleId.values[0])
else:
bundle_id = get_single_bundle_id(asset.browser_download_url)
df = pd.concat([df, pd.DataFrame({"name": [app_name], "bundleId": [bundle_id]})], ignore_index=True)
desc = ""
dev_name = ""
if md_df is not None:
row = md_df.loc[md_df["App Name"] == app_name.replace(" ", "").lower()]
if len(row.values):
raw_desc = row["Description"].values[0]
raw_last_updated = row["Last Updated"].values[0]
raw_status = row["Status"].values[0]
desc = f"{raw_desc}\nLast updated: {raw_last_updated}\nStatus: {raw_status}"
dev_name = f"{row['Source/Maintainer'].values[0]}"
data["apps"].append(
{
"name": app_name,
"bundleIdentifier": bundle_id,
"version": version,
"versionDate": date,
"size": asset.size,
"downloadURL": asset.browser_download_url,
"developerName": dev_name,
"localizedDescription": desc,
"iconURL": f"https://raw.githubusercontent.com/swaggyP36000/TrollStore-IPAs/main/icons/{bundle_id}.png",
}
)
df.to_csv("bundleId.csv", index=False)
with open("apps_esign.json", "w") as json_file:
json.dump(data, json_file, indent=2)
with open("apps.json", "w") as file:
json.dump(transform_object(data), file, indent=2)