feat: implement directory size check and seed abort

This commit is contained in:
Hachi-R 2024-12-22 09:08:20 -03:00
parent bd184fceda
commit abb3db4e30
2 changed files with 53 additions and 11 deletions

View File

@ -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", {

View File

@ -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<number> => {
const getItemSize = async (filePath: string): Promise<number> => {
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;
}
};