From e463ee569a053e846cbe6d307c705a62cce15fb7 Mon Sep 17 00:00:00 2001 From: Hachi-R Date: Mon, 23 Dec 2024 01:25:01 -0300 Subject: [PATCH] feat: add initial download handling in Python RPC and update spawn method to accept download parameters --- python_rpc/main.py | 15 +++++++++++++++ src/main/main.ts | 22 ++++++++++++++-------- src/main/services/python-rpc.ts | 16 ++++++++++++++-- 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/python_rpc/main.py b/python_rpc/main.py index 060e01c2..028e9fa3 100644 --- a/python_rpc/main.py +++ b/python_rpc/main.py @@ -11,6 +11,7 @@ app = Flask(__name__) torrent_port = sys.argv[1] http_port = sys.argv[2] rpc_password = sys.argv[3] +start_download_payload = sys.argv[4] downloads = {} # This can be streamed down from Node @@ -18,6 +19,20 @@ downloading_game_id = -1 torrent_session = lt.session({'listen_interfaces': '0.0.0.0:{port}'.format(port=torrent_port)}) +if start_download_payload: + initial_download = json.loads(urllib.parse.unquote(start_download_payload)) + downloading_game_id = initial_download['game_id'] + + if initial_download['url'].startswith('magnet'): + torrent_downloader = TorrentDownloader(torrent_session) + downloads[initial_download['game_id']] = torrent_downloader + torrent_downloader.start_download(initial_download['url'], initial_download['save_path'], "") + else: + http_downloader = HttpDownloader() + downloads[initial_download['game_id']] = http_downloader + http_downloader.start_download(initial_download['url'], initial_download['save_path'], initial_download.get('header')) + + def validate_rpc_password(): """Middleware to validate RPC password.""" header_password = request.headers.get('x-hydra-rpc-password') diff --git a/src/main/main.ts b/src/main/main.ts index df14c4b4..63517ce2 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -1,4 +1,4 @@ -import { DownloadManager, Ludusavi, startMainLoop } from "./services"; +import { Ludusavi, startMainLoop } from "./services"; import { downloadQueueRepository, userPreferencesRepository, @@ -10,7 +10,6 @@ import { uploadGamesBatch } from "./services/library-sync"; import { PythonRPC } from "./services/python-rpc"; import { Aria2 } from "./services/aria2"; import { startSeedProcess } from "./services/seed"; -import { sleep } from "./helpers"; const loadState = async (userPreferences: UserPreferences | null) => { import("./events"); @@ -36,12 +35,19 @@ const loadState = async (userPreferences: UserPreferences | null) => { }, }); - PythonRPC.spawn(); - await sleep(1000); - // wait for python process to start - - if (nextQueueItem?.game.status === "active") { - DownloadManager.startDownload(nextQueueItem.game); + if ( + nextQueueItem?.game.status === "active" && + nextQueueItem?.game.id && + nextQueueItem?.game.uri && + nextQueueItem?.game.downloadPath + ) { + PythonRPC.spawn({ + game_id: nextQueueItem.game.id, + url: nextQueueItem.game.uri, + save_path: nextQueueItem.game.downloadPath, + }); + } else { + PythonRPC.spawn(); } await startSeedProcess(); diff --git a/src/main/services/python-rpc.ts b/src/main/services/python-rpc.ts index 55e3845b..622fb4ce 100644 --- a/src/main/services/python-rpc.ts +++ b/src/main/services/python-rpc.ts @@ -9,6 +9,12 @@ import { logger } from "./logger"; import { Readable } from "node:stream"; import { app, dialog } from "electron"; +interface StartDownloadPayload { + game_id: number; + url: string; + save_path: string; +} + const binaryNameByPlatform: Partial> = { darwin: "hydra-python-rpc", linux: "hydra-python-rpc", @@ -36,9 +42,15 @@ export class PythonRPC { readable.on("data", logger.log); } - public static spawn() { + public static spawn(initialDownload?: StartDownloadPayload) { console.log([this.BITTORRENT_PORT, this.RPC_PORT, this.RPC_PASSWORD]); - const commonArgs = [this.BITTORRENT_PORT, this.RPC_PORT, this.RPC_PASSWORD]; + + const commonArgs = [ + this.BITTORRENT_PORT, + this.RPC_PORT, + this.RPC_PASSWORD, + initialDownload ? JSON.stringify(initialDownload) : "", + ]; if (app.isPackaged) { const binaryName = binaryNameByPlatform[process.platform]!;