mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-01-24 14:04:54 +03:00
feat: adding torbox integration
This commit is contained in:
parent
83e662f633
commit
201d89e2c4
@ -11,6 +11,7 @@ import { uploadGamesBatch } from "./services/library-sync";
|
|||||||
import { Aria2 } from "./services/aria2";
|
import { Aria2 } from "./services/aria2";
|
||||||
import { Downloader } from "@shared";
|
import { Downloader } from "@shared";
|
||||||
import { IsNull, Not } from "typeorm";
|
import { IsNull, Not } from "typeorm";
|
||||||
|
import { TorBoxClient } from "./services/download/torbox";
|
||||||
|
|
||||||
const loadState = async (userPreferences: UserPreferences | null) => {
|
const loadState = async (userPreferences: UserPreferences | null) => {
|
||||||
import("./events");
|
import("./events");
|
||||||
@ -21,6 +22,8 @@ const loadState = async (userPreferences: UserPreferences | null) => {
|
|||||||
RealDebridClient.authorize(userPreferences?.realDebridApiToken);
|
RealDebridClient.authorize(userPreferences?.realDebridApiToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TorBoxClient.authorize("7371d5ec-52fa-4b87-9052-0c8c96d947cc");
|
||||||
|
|
||||||
Ludusavi.addManifestToLudusaviConfig();
|
Ludusavi.addManifestToLudusaviConfig();
|
||||||
|
|
||||||
HydraApi.setupApi().then(() => {
|
HydraApi.setupApi().then(() => {
|
||||||
|
@ -20,6 +20,7 @@ import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity
|
|||||||
import { RealDebridClient } from "./real-debrid";
|
import { RealDebridClient } from "./real-debrid";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import { logger } from "../logger";
|
import { logger } from "../logger";
|
||||||
|
import { TorBoxClient } from "./torbox";
|
||||||
|
|
||||||
export class DownloadManager {
|
export class DownloadManager {
|
||||||
private static downloadingGameId: number | null = null;
|
private static downloadingGameId: number | null = null;
|
||||||
@ -29,6 +30,7 @@ export class DownloadManager {
|
|||||||
game?.status === "active"
|
game?.status === "active"
|
||||||
? await this.getDownloadPayload(game).catch(() => undefined)
|
? await this.getDownloadPayload(game).catch(() => undefined)
|
||||||
: undefined,
|
: undefined,
|
||||||
|
|
||||||
initialSeeding?.map((game) => ({
|
initialSeeding?.map((game) => ({
|
||||||
game_id: game.id,
|
game_id: game.id,
|
||||||
url: game.uri!,
|
url: game.uri!,
|
||||||
@ -294,6 +296,18 @@ export class DownloadManager {
|
|||||||
save_path: game.downloadPath!,
|
save_path: game.downloadPath!,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
case Downloader.TorBox: {
|
||||||
|
const downloadUrl = await TorBoxClient.getDownloadUrl(game.uri!);
|
||||||
|
console.log(downloadUrl);
|
||||||
|
|
||||||
|
if (!downloadUrl) return;
|
||||||
|
return {
|
||||||
|
action: "start",
|
||||||
|
game_id: game.id,
|
||||||
|
url: downloadUrl,
|
||||||
|
save_path: game.downloadPath!,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ export class TorBoxClient {
|
|||||||
Authorization: `Bearer ${apiToken}`,
|
Authorization: `Bearer ${apiToken}`,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
this.apiToken = apiToken;
|
this.apiToken = "7371d5ec-52fa-4b87-9052-0c8c96d947cc";
|
||||||
}
|
}
|
||||||
|
|
||||||
static async addMagnet(magnet: string) {
|
static async addMagnet(magnet: string) {
|
||||||
@ -55,22 +55,16 @@ export class TorBoxClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static async requestLink(id: number) {
|
static async requestLink(id: number) {
|
||||||
const searchParams = new URLSearchParams({});
|
const searchParams = new URLSearchParams({
|
||||||
|
token: this.apiToken,
|
||||||
searchParams.set("token", this.apiToken);
|
torrent_id: id.toString(),
|
||||||
searchParams.set("torrent_id", id.toString());
|
zip_link: "true",
|
||||||
searchParams.set("zip_link", "true");
|
});
|
||||||
|
|
||||||
const response = await this.instance.get<TorBoxRequestLinkRequest>(
|
const response = await this.instance.get<TorBoxRequestLinkRequest>(
|
||||||
"/torrents/requestdl?" + searchParams.toString()
|
"/torrents/requestdl?" + searchParams.toString()
|
||||||
);
|
);
|
||||||
|
|
||||||
if (response.status !== 200) {
|
|
||||||
logger.error(response.data.error);
|
|
||||||
logger.error(response.data.detail);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return response.data.data;
|
return response.data.data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,4 +88,9 @@ export class TorBoxClient {
|
|||||||
const torrent = await this.addMagnet(magnetUri);
|
const torrent = await this.addMagnet(magnetUri);
|
||||||
return torrent.torrent_id;
|
return torrent.torrent_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async getDownloadUrl(uri: string) {
|
||||||
|
const id = await this.getTorrentId(uri);
|
||||||
|
return this.requestLink(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
BIN
src/renderer/src/assets/icons/torbox.webp
Normal file
BIN
src/renderer/src/assets/icons/torbox.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
@ -8,6 +8,7 @@ export const DOWNLOADER_NAME = {
|
|||||||
[Downloader.Gofile]: "Gofile",
|
[Downloader.Gofile]: "Gofile",
|
||||||
[Downloader.PixelDrain]: "PixelDrain",
|
[Downloader.PixelDrain]: "PixelDrain",
|
||||||
[Downloader.Qiwi]: "Qiwi",
|
[Downloader.Qiwi]: "Qiwi",
|
||||||
|
[Downloader.TorBox]: "TorBox",
|
||||||
};
|
};
|
||||||
|
|
||||||
export const MAX_MINUTES_TO_SHOW_IN_PLAYTIME = 120;
|
export const MAX_MINUTES_TO_SHOW_IN_PLAYTIME = 120;
|
||||||
|
@ -31,6 +31,8 @@ import {
|
|||||||
XCircleIcon,
|
XCircleIcon,
|
||||||
} from "@primer/octicons-react";
|
} from "@primer/octicons-react";
|
||||||
|
|
||||||
|
import torBoxLogo from "@renderer/assets/icons/torbox.webp";
|
||||||
|
|
||||||
export interface DownloadGroupProps {
|
export interface DownloadGroupProps {
|
||||||
library: LibraryGame[];
|
library: LibraryGame[];
|
||||||
title: string;
|
title: string;
|
||||||
@ -276,7 +278,28 @@ export function DownloadGroup({
|
|||||||
/>
|
/>
|
||||||
|
|
||||||
<div className={styles.downloadCoverContent}>
|
<div className={styles.downloadCoverContent}>
|
||||||
<Badge>{DOWNLOADER_NAME[game.downloader]}</Badge>
|
{game.downloader === Downloader.TorBox ? (
|
||||||
|
<div
|
||||||
|
style={{
|
||||||
|
display: "flex",
|
||||||
|
alignItems: "center",
|
||||||
|
background: "#11141b",
|
||||||
|
padding: `${SPACING_UNIT / 2}px ${SPACING_UNIT}px`,
|
||||||
|
borderRadius: "4px",
|
||||||
|
gap: 4,
|
||||||
|
border: `1px solid ${vars.color.border}`,
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src={torBoxLogo}
|
||||||
|
alt="TorBox"
|
||||||
|
style={{ width: 13 }}
|
||||||
|
/>
|
||||||
|
<span style={{ fontSize: 10 }}>TorBox</span>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<Badge>{DOWNLOADER_NAME[game.downloader]}</Badge>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -68,11 +68,9 @@ export function DownloadSettingsModal({
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Gives preference to Real Debrid */
|
/* Gives preference to TorBox */
|
||||||
const selectedDownloader = filteredDownloaders.includes(
|
const selectedDownloader = filteredDownloaders.includes(Downloader.TorBox)
|
||||||
Downloader.RealDebrid
|
? Downloader.TorBox
|
||||||
)
|
|
||||||
? Downloader.RealDebrid
|
|
||||||
: filteredDownloaders[0];
|
: filteredDownloaders[0];
|
||||||
|
|
||||||
setSelectedDownloader(
|
setSelectedDownloader(
|
||||||
|
@ -4,6 +4,7 @@ export enum Downloader {
|
|||||||
Gofile,
|
Gofile,
|
||||||
PixelDrain,
|
PixelDrain,
|
||||||
Qiwi,
|
Qiwi,
|
||||||
|
TorBox,
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum DownloadSourceStatus {
|
export enum DownloadSourceStatus {
|
||||||
|
@ -92,7 +92,7 @@ export const getDownloadersForUri = (uri: string) => {
|
|||||||
return [Downloader.RealDebrid];
|
return [Downloader.RealDebrid];
|
||||||
|
|
||||||
if (uri.startsWith("magnet:")) {
|
if (uri.startsWith("magnet:")) {
|
||||||
return [Downloader.Torrent, Downloader.RealDebrid];
|
return [Downloader.Torrent, Downloader.TorBox, Downloader.RealDebrid];
|
||||||
}
|
}
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
|
Loading…
Reference in New Issue
Block a user