From e44a961faaacec8a992da13fe4bc71f89ca0c0a0 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Wed, 7 May 2025 00:05:42 +0500 Subject: [PATCH] feat: download of specific mods --- gui/app/components/ModTable.tsx | 31 ++++++++++++------ gui/app/pack/page.tsx | 29 ++++++++++++++++- src/api/download.py | 57 +++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 10 deletions(-) diff --git a/gui/app/components/ModTable.tsx b/gui/app/components/ModTable.tsx index afb3670..4a70b95 100644 --- a/gui/app/components/ModTable.tsx +++ b/gui/app/components/ModTable.tsx @@ -18,6 +18,7 @@ export const ModTable = (props: { mods: Mod[]; updatePack: () => void; packID: string; + downloadMods: (mods: string[]) => void; }) => { const [selectedMods, setSelectedMods] = useState([]); @@ -130,7 +131,10 @@ export const ModTable = (props: { {mod.url}
- +
+ + +
diff --git a/gui/app/pack/page.tsx b/gui/app/pack/page.tsx index 2382b49..867e95d 100644 --- a/gui/app/pack/page.tsx +++ b/gui/app/pack/page.tsx @@ -281,6 +281,24 @@ export default function PackPage() { setdownloadModalOpen(true); } + async function downloadMods(mods: string[]) { + if (!packData) return; + + fetch(`${DOWNLOAD_ENDPOINT["downloadMods"]}`, { + method: "POST", + body: JSON.stringify({ + pack_id: packData._id, + mods: mods, + }), + headers: { + "content-type": "application/json", + accept: "application/json", + }, + }); + + setdownloadModalOpen(true); + } + return (
{packDataLoading && ( @@ -342,6 +360,7 @@ export default function PackPage() {
@@ -386,7 +405,15 @@ export default function PackPage() { - + { + if (downloadProgressFile.current == downloadProgressFile.total) { + setdownloadModalOpen(false); + } + }} + > Download progress
diff --git a/src/api/download.py b/src/api/download.py index b6ddd77..2b96ac2 100644 --- a/src/api/download.py +++ b/src/api/download.py @@ -108,3 +108,60 @@ def downloadPack(): "message": f"download of {pack_id} with {total} mods finished", }, ) + + +@apiDownload.route("/mods", methods=["POST"]) +def downloadMods(): + pack = {} + pack_id = request.json.get("pack_id") + mods_slugs = request.json.get("mods") + + with open(f"{PACKS_FOLDER}/{pack_id}/packfile.json") as fp: + pack = json.load(fp) + fp.close() + + mods = pack.get("mods", []) + total = len(mods_slugs) + + os.makedirs(f"{PACKS_FOLDER}/{pack_id}/mods", exist_ok=True) + + for i, slug in enumerate(mods_slugs): + for mod in mods: + if mod.get("slug") == slug: + emit( + "download_total", + { + "status": "ok", + "total": total, + "current": i, + "title": mod.get("title"), + "filename": mod.get("file").get("filename"), + }, + namespace="/", + broadcast=True, + ) + download( + f"{PACKS_FOLDER}/{pack_id}/mods", + mod.get("file").get("url"), + mod.get("file").get("filename"), + mod.get("file").get("size"), + ) + + emit( + "download_total", + { + "status": "ok", + "total": total, + "current": total, + "title": "", + "filename": "", + }, + namespace="/", + broadcast=True, + ) + return jsonify( + { + "status": "ok", + "message": f"download of {pack_id} with {total} mods finished", + }, + )