From abb3db4e303b691d01fae8773e9fe45100a6bf20 Mon Sep 17 00:00:00 2001 From: Hachi-R Date: Sun, 22 Dec 2024 09:08:20 -0300 Subject: [PATCH] feat: implement directory size check and seed abort --- .../services/download/download-manager.ts | 38 +++++++++++++------ src/main/services/download/helpers.ts | 26 +++++++++++++ 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/main/services/download/download-manager.ts b/src/main/services/download/download-manager.ts index 585f9700..7c57300e 100644 --- a/src/main/services/download/download-manager.ts +++ b/src/main/services/download/download-manager.ts @@ -15,9 +15,10 @@ import { LibtorrentStatus, PauseDownloadPayload, } from "./types"; -import { calculateETA } from "./helpers"; +import { calculateETA, getDirSize } from "./helpers"; import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity"; import { RealDebridClient } from "./real-debrid"; +import path from "path"; export class DownloadManager { private static downloadingGameId: number | null = null; @@ -123,7 +124,7 @@ export class DownloadManager { { status: "complete", shouldSeed: false } ); - this.pauseSeeding(gameId); + this.cancelDownload(gameId); } await downloadQueueRepository.delete({ game }); @@ -151,6 +152,30 @@ export class DownloadManager { if (!seedStatus.data.length) return; + seedStatus.data.forEach(async (status) => { + const game = await gameRepository.findOne({ + where: { id: status.gameId }, + }); + + if (!game) return; + + const totalSize = await getDirSize( + path.join(game.downloadPath!, status.folderName!) + ); + + if (totalSize < status.fileSize) { + await this.cancelDownload(game.id); + + await gameRepository.update(game.id, { + status: "paused", + shouldSeed: false, + progress: totalSize / status.fileSize, + }); + + WindowManager.mainWindow?.webContents.send("on-hard-delete"); + } + }); + WindowManager.mainWindow?.webContents.send( "on-seeding-status", JSON.parse(JSON.stringify(seedStatus.data)) @@ -212,15 +237,6 @@ export class DownloadManager { // ); } - static async pauseSeeding(gameId: number) { - await PythonRPC.rpc - .post("/action", { - action: "pause", - game_id: gameId, - } as PauseDownloadPayload) - .catch(() => {}); - } - static async pauseDownload() { await PythonRPC.rpc .post("/action", { diff --git a/src/main/services/download/helpers.ts b/src/main/services/download/helpers.ts index 07c962bc..284e520a 100644 --- a/src/main/services/download/helpers.ts +++ b/src/main/services/download/helpers.ts @@ -1,3 +1,6 @@ +import path from "node:path"; +import fs from "node:fs"; + export const calculateETA = ( totalLength: number, completedLength: number, @@ -11,3 +14,26 @@ export const calculateETA = ( return -1; }; + +export const getDirSize = async (dir: string): Promise => { + const getItemSize = async (filePath: string): Promise => { + const stat = await fs.promises.stat(filePath); + + if (stat.isDirectory()) { + return getDirSize(filePath); + } + + return stat.size; + }; + + try { + const files = await fs.promises.readdir(dir); + const filePaths = files.map((file) => path.join(dir, file)); + const sizes = await Promise.all(filePaths.map(getItemSize)); + + return sizes.reduce((total, size) => total + size, 0); + } catch (error) { + console.error(error); + return 0; + } +};