mirror of
				https://github.com/hydralauncher/hydra.git
				synced 2025-03-09 15:40:26 +00:00 
			
		
		
		
	feat: add ablity to pause and resume the seeding process
This commit is contained in:
		
							parent
							
								
									c556a00e4a
								
							
						
					
					
						commit
						b32952f076
					
				
					 11 changed files with 120 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -32,6 +32,8 @@ import "./torrenting/cancel-game-download";
 | 
			
		|||
import "./torrenting/pause-game-download";
 | 
			
		||||
import "./torrenting/resume-game-download";
 | 
			
		||||
import "./torrenting/start-game-download";
 | 
			
		||||
import "./torrenting/pause-game-seed";
 | 
			
		||||
import "./torrenting/resume-game-seed";
 | 
			
		||||
import "./user-preferences/get-user-preferences";
 | 
			
		||||
import "./user-preferences/update-user-preferences";
 | 
			
		||||
import "./user-preferences/auto-launch";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										21
									
								
								src/main/events/torrenting/pause-game-seed.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/main/events/torrenting/pause-game-seed.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
import { registerEvent } from "../register-event";
 | 
			
		||||
 | 
			
		||||
import { DownloadManager } from "@main/services";
 | 
			
		||||
import { dataSource } from "@main/data-source";
 | 
			
		||||
import { Game } from "@main/entity";
 | 
			
		||||
 | 
			
		||||
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 DownloadManager.pauseSeeding(gameId);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
registerEvent("pauseGameSeed", pauseGameSeed);
 | 
			
		||||
							
								
								
									
										31
									
								
								src/main/events/torrenting/resume-game-seed.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/main/events/torrenting/resume-game-seed.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
import { registerEvent } from "../register-event";
 | 
			
		||||
import { gameRepository } from "../../repository";
 | 
			
		||||
 | 
			
		||||
import { DownloadManager } from "@main/services";
 | 
			
		||||
import { dataSource } from "@main/data-source";
 | 
			
		||||
import { Game } from "@main/entity";
 | 
			
		||||
 | 
			
		||||
const resumeGameSeed = async (
 | 
			
		||||
  _event: Electron.IpcMainInvokeEvent,
 | 
			
		||||
  gameId: number
 | 
			
		||||
) => {
 | 
			
		||||
  const game = await gameRepository.findOne({
 | 
			
		||||
    where: {
 | 
			
		||||
      id: gameId,
 | 
			
		||||
      isDeleted: false,
 | 
			
		||||
    },
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  if (!game) return;
 | 
			
		||||
 | 
			
		||||
  await dataSource.transaction(async (transactionalEntityManager) => {
 | 
			
		||||
    
 | 
			
		||||
    await transactionalEntityManager
 | 
			
		||||
    .getRepository(Game)
 | 
			
		||||
    .update({ id: gameId }, { status: "seeding", shouldSeed: true });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  await DownloadManager.resumeSeeding(gameId, game.uri!, game.downloadPath!);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
registerEvent("resumeGameSeed", resumeGameSeed);
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,8 @@ import {
 | 
			
		|||
  LibtorrentStatus,
 | 
			
		||||
  LibtorrentPayload,
 | 
			
		||||
  ProcessPayload,
 | 
			
		||||
  PauseSeedingPayload,
 | 
			
		||||
  ResumeSeedingPayload,
 | 
			
		||||
} from "./types";
 | 
			
		||||
import { pythonInstanceLogger as logger } from "../logger";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -133,6 +135,26 @@ export class PythonInstance {
 | 
			
		|||
    return response.data;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static async pauseSeeding(gameId: number) {
 | 
			
		||||
    await this.rpc
 | 
			
		||||
      .post("/action", {
 | 
			
		||||
        action: "pause-seeding",
 | 
			
		||||
        game_id: gameId,
 | 
			
		||||
      } as PauseSeedingPayload)
 | 
			
		||||
      .catch(() => {});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static async resumeSeeding(gameId: number, magnet: string, savePath: string) {
 | 
			
		||||
    await this.rpc
 | 
			
		||||
      .post("/action", {
 | 
			
		||||
        action: "resume-seeding",
 | 
			
		||||
        game_id: gameId,
 | 
			
		||||
        magnet,
 | 
			
		||||
        save_path: savePath,
 | 
			
		||||
      } as ResumeSeedingPayload)
 | 
			
		||||
      .catch(() => {});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static async pauseDownload() {
 | 
			
		||||
    await this.rpc
 | 
			
		||||
      .post("/action", {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,3 +37,11 @@ export interface ProcessPayload {
 | 
			
		|||
  exe: string;
 | 
			
		||||
  pid: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface PauseSeedingPayload {
 | 
			
		||||
  game_id: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface ResumeSeedingPayload {
 | 
			
		||||
  game_id: number;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,10 @@ contextBridge.exposeInMainWorld("electron", {
 | 
			
		|||
    ipcRenderer.invoke("pauseGameDownload", gameId),
 | 
			
		||||
  resumeGameDownload: (gameId: number) =>
 | 
			
		||||
    ipcRenderer.invoke("resumeGameDownload", gameId),
 | 
			
		||||
  pauseGameSeed: (gameId: number) =>
 | 
			
		||||
    ipcRenderer.invoke("pauseGameSeed", gameId),
 | 
			
		||||
  resumeGameSeed: (gameId: number) =>
 | 
			
		||||
    ipcRenderer.invoke("resumeGameSeed", gameId),
 | 
			
		||||
  onDownloadProgress: (cb: (value: DownloadProgress) => void) => {
 | 
			
		||||
    const listener = (
 | 
			
		||||
      _event: Electron.IpcRendererEvent,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										2
									
								
								src/renderer/src/declaration.d.ts
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/renderer/src/declaration.d.ts
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -46,6 +46,8 @@ declare global {
 | 
			
		|||
    cancelGameDownload: (gameId: number) => Promise<void>;
 | 
			
		||||
    pauseGameDownload: (gameId: number) => Promise<void>;
 | 
			
		||||
    resumeGameDownload: (gameId: number) => Promise<void>;
 | 
			
		||||
    pauseGameSeed: (gameId: number) => Promise<void>;
 | 
			
		||||
    resumeGameSeed: (gameId: number) => Promise<void>;
 | 
			
		||||
    onDownloadProgress: (
 | 
			
		||||
      cb: (value: DownloadProgress) => void
 | 
			
		||||
    ) => () => Electron.IpcRenderer;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -66,6 +66,16 @@ export function useDownload() {
 | 
			
		|||
      updateLibrary();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
  const pauseSeeding = async (gameId: number) => {
 | 
			
		||||
    await window.electron.pauseGameSeed(gameId);
 | 
			
		||||
    await updateLibrary();
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const resumeSeeding = async (gameId: number) => {
 | 
			
		||||
    await window.electron.resumeGameSeed(gameId);
 | 
			
		||||
    await updateLibrary();
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const calculateETA = () => {
 | 
			
		||||
    if (!lastPacket || lastPacket.timeRemaining < 0) return "";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -96,6 +106,8 @@ export function useDownload() {
 | 
			
		|||
    removeGameFromLibrary,
 | 
			
		||||
    removeGameInstaller,
 | 
			
		||||
    isGameDeleting,
 | 
			
		||||
    pauseSeeding,
 | 
			
		||||
    resumeSeeding,
 | 
			
		||||
    clearDownload: () => dispatch(clearDownload()),
 | 
			
		||||
    setLastPacket: (packet: DownloadProgress) =>
 | 
			
		||||
      dispatch(setLastPacket(packet)),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,7 @@ export type GameStatus =
 | 
			
		|||
  | "paused"
 | 
			
		||||
  | "error"
 | 
			
		||||
  | "complete"
 | 
			
		||||
  | "seeding"
 | 
			
		||||
  | "removed";
 | 
			
		||||
 | 
			
		||||
export type GameShop = "steam" | "epic";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -121,6 +121,10 @@ class Handler(BaseHTTPRequestHandler):
 | 
			
		|||
            elif data['action'] == 'kill-torrent':
 | 
			
		||||
                torrent_downloader.abort_session()
 | 
			
		||||
                torrent_downloader = None
 | 
			
		||||
            elif data['action'] == 'pause-seeding':
 | 
			
		||||
                torrent_downloader.pause_seeding(data['game_id'])
 | 
			
		||||
            elif data['action'] == 'resume-seeding':
 | 
			
		||||
                torrent_downloader.resume_seeding(data['game_id'], data['magnet'], data['save_path'])
 | 
			
		||||
 | 
			
		||||
            self.send_response(200)
 | 
			
		||||
            self.end_headers()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -189,3 +189,16 @@ class TorrentDownloader:
 | 
			
		|||
                response.append(torrent_info)
 | 
			
		||||
 | 
			
		||||
        return response
 | 
			
		||||
 | 
			
		||||
    def pause_seeding(self, game_id: int):
 | 
			
		||||
        torrent_handle = self.torrent_handles.get(game_id)
 | 
			
		||||
        if torrent_handle:
 | 
			
		||||
            torrent_handle.pause()
 | 
			
		||||
            torrent_handle.unset_flags(lt.torrent_flags.auto_managed)
 | 
			
		||||
 | 
			
		||||
    def resume_seeding(self, game_id: int, magnet: str, save_path: str):
 | 
			
		||||
        params = {'url': magnet, 'save_path': save_path, 'trackers': self.trackers}
 | 
			
		||||
        torrent_handle = self.session.add_torrent(params)
 | 
			
		||||
        self.torrent_handles[game_id] = torrent_handle
 | 
			
		||||
        torrent_handle.set_flags(lt.torrent_flags.auto_managed)
 | 
			
		||||
        torrent_handle.resume()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue