Merge branch 'feature/seed-completed-downloads' into feat/achievements-points

This commit is contained in:
Zamitto 2024-12-22 20:27:09 -03:00
commit 7b724d4185
10 changed files with 37 additions and 97 deletions

1
.gitignore vendored
View File

@ -1,6 +1,5 @@
.vscode/
node_modules/
fastlist.exe
__pycache__
dist
out

View File

@ -199,8 +199,8 @@
"no_downloads_description": "Você ainda não baixou nada pelo Hydra, mas nunca é tarde para começar.",
"checking_files": "Verificando arquivos…",
"seeding": "Semeando",
"stop_seeding": "Parar semeio",
"resume_seeding": "Retomar semeio",
"stop_seeding": "Parar de semear",
"resume_seeding": "Semear",
"options": "Gerenciar"
},
"settings": {

View File

@ -2,6 +2,7 @@ import { registerEvent } from "../register-event";
import { DownloadManager, HydraApi, gamesPlaytime } from "@main/services";
import { dataSource } from "@main/data-source";
import { DownloadQueue, Game, UserAuth, UserSubscription } from "@main/entity";
import { PythonRPC } from "@main/services/python-rpc";
const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
const databaseOperations = dataSource
@ -27,8 +28,7 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => {
DownloadManager.cancelDownload();
/* Disconnects libtorrent */
// TODO
// TorrentDownloader.killTorrent();
PythonRPC.kill();
HydraApi.handleSignOut();

View File

@ -1,11 +1,14 @@
import { registerEvent } from "../register-event";
import { PythonRPC } from "@main/services/python-rpc";
const processProfileImage = async (
_event: Electron.IpcMainInvokeEvent,
path: string
) => {
return path;
// return PythonInstance.processProfileImage(path);
return PythonRPC.rpc.post<{ imagePath: string; mimeType: string }>(
"/profile_image_processor/process_image",
{ path }
);
};
registerEvent("processProfileImage", processProfileImage);

View File

@ -8,11 +8,9 @@ const pauseGameSeed = async (
_event: Electron.IpcMainInvokeEvent,
gameId: number
) => {
await dataSource.transaction(async (transactionalEntityManager) => {
await transactionalEntityManager
.getRepository(Game)
.update({ id: gameId }, { status: "complete", shouldSeed: false });
});
await dataSource
.getRepository(Game)
.update({ id: gameId }, { status: "complete", shouldSeed: false });
await DownloadManager.cancelDownload(gameId);
};

View File

@ -20,11 +20,9 @@ const resumeGameSeed = async (
if (!game) return;
await dataSource.transaction(async (transactionalEntityManager) => {
await transactionalEntityManager
.getRepository(Game)
.update({ id: gameId }, { status: "seeding", shouldSeed: true });
});
await dataSource
.getRepository(Game)
.update({ id: gameId }, { status: "seeding", shouldSeed: true });
await DownloadManager.startDownload(game);
};

View File

@ -1,8 +1,5 @@
import { Ludusavi, startMainLoop } from "./services";
import {
// downloadQueueRepository,
userPreferencesRepository,
} from "./repository";
import { userPreferencesRepository } from "./repository";
import { UserPreferences } from "./entity";
import { RealDebridClient } from "./services/download/real-debrid";
import { HydraApi } from "./services/hydra-api";
@ -25,24 +22,7 @@ const loadState = async (userPreferences: UserPreferences | null) => {
uploadGamesBatch();
});
// const [nextQueueItem] = await downloadQueueRepository.find({
// order: {
// id: "DESC",
// },
// relations: {
// game: true,
// },
// });
PythonRPC.spawn();
// start download
// if (nextQueueItem?.game.status === "active") {
// DownloadManager.startDownload(nextQueueItem.game);
// } else {
// PythonInstance.spawn();
// }
startMainLoop();
};

View File

@ -84,7 +84,7 @@ export class DownloadManager {
public static async watchDownloads() {
const status = await this.getDownloadStatus();
// // status = await RealDebridDownloader.getStatus();
// status = await RealDebridDownloader.getStatus();
if (status) {
const { gameId, progress } = status;
@ -180,61 +180,6 @@ export class DownloadManager {
"on-seeding-status",
JSON.parse(JSON.stringify(seedStatus.data))
);
// const gamesToSeed = await gameRepository.find({
// where: { shouldSeed: true, isDeleted: false },
// });
// if (gamesToSeed.length === 0) return;
// const seedStatus = await PythonRPC.rpc
// .get<LibtorrentPayload[] | null>("/seed-status")
// .then((results) => {
// if (results === null) return [];
// return results.data;
// });
// if (!seedStatus.length === 0) {
// for (const game of gamesToSeed) {
// if (game.uri && game.downloadPath) {
// await this.resumeSeeding(game.id, game.uri, game.downloadPath);
// }
// }
// }
// const gameIds = seedStatus.map((status) => status.gameId);
// for (const gameId of gameIds) {
// const game = await gameRepository.findOne({
// where: { id: gameId },
// });
// if (game) {
// const isNotDeleted = fs.existsSync(
// path.join(game.downloadPath!, game.folderName!)
// );
// if (!isNotDeleted) {
// await this.pauseSeeding(game.id);
// await gameRepository.update(game.id, {
// status: "complete",
// shouldSeed: false,
// });
// WindowManager.mainWindow?.webContents.send("on-hard-delete");
// }
// }
// }
// const updateList = await gameRepository.find({
// where: {
// id: In(gameIds),
// status: Not(In(["complete", "seeding"])),
// shouldSeed: true,
// isDeleted: false,
// },
// });
// if (updateList.length > 0) {
// await gameRepository.update(
// { id: In(updateList.map((game) => game.id)) },
// { status: "seeding" }
// );
// }
// WindowManager.mainWindow?.webContents.send(
// "on-seeding-status",
// JSON.parse(JSON.stringify(seedStatus))
// );
}
static async pauseDownload() {

View File

@ -4,7 +4,7 @@
&__content {
background-color: globals.$dark-background-color;
border: 1px solid globals.$border-color;
border-radius: 4px;
border-radius: 6px;
min-width: 200px;
flex-direction: column;
align-items: center;

View File

@ -20,7 +20,16 @@ import {
DropdownMenu,
DropdownMenuItem,
} from "@renderer/components/dropdown-menu/dropdown-menu";
import { ThreeBarsIcon } from "@primer/octicons-react";
import {
ColumnsIcon,
DownloadIcon,
LinkIcon,
PlayIcon,
ThreeBarsIcon,
TrashIcon,
UnlinkIcon,
XCircleIcon,
} from "@primer/octicons-react";
export interface DownloadGroupProps {
library: LibraryGame[];
@ -168,10 +177,12 @@ export function DownloadGroup({
label: t("install"),
disabled: deleting,
onClick: () => openGameInstaller(game.id),
icon: <DownloadIcon />,
},
{
label: t("stop_seeding"),
disabled: deleting,
icon: <UnlinkIcon />,
show:
game.status === "seeding" && game.downloader === Downloader.Torrent,
onClick: () => pauseSeeding(game.id),
@ -179,6 +190,7 @@ export function DownloadGroup({
{
label: t("resume_seeding"),
disabled: deleting,
icon: <LinkIcon />,
show:
game.status !== "seeding" && game.downloader === Downloader.Torrent,
onClick: () => resumeSeeding(game.id),
@ -186,6 +198,7 @@ export function DownloadGroup({
{
label: t("delete"),
disabled: deleting,
icon: <TrashIcon />,
onClick: () => openDeleteGameModal(game.id),
},
];
@ -196,10 +209,12 @@ export function DownloadGroup({
{
label: t("pause"),
onClick: () => pauseDownload(game.id),
icon: <ColumnsIcon />,
},
{
label: t("cancel"),
onClick: () => cancelDownload(game.id),
icon: <XCircleIcon />,
},
];
}
@ -211,10 +226,12 @@ export function DownloadGroup({
game.downloader === Downloader.RealDebrid &&
!userPreferences?.realDebridApiToken,
onClick: () => resumeDownload(game.id),
icon: <PlayIcon />,
},
{
label: t("cancel"),
onClick: () => cancelDownload(game.id),
icon: <XCircleIcon />,
},
];
};
@ -290,7 +307,7 @@ export function DownloadGroup({
<DropdownMenu
align="end"
items={getGameActions(game)}
sideOffset={-70}
sideOffset={-75}
>
<Button
style={{