hydra/src/main/services/download/torbox.ts
2024-12-23 10:50:35 -03:00

97 lines
2.4 KiB
TypeScript

import axios, { AxiosInstance } from "axios";
import parseTorrent from "parse-torrent";
import type {
TorBoxUserRequest,
TorBoxTorrentInfoRequest,
TorBoxAddTorrentRequest,
TorBoxRequestLinkRequest,
} from "@types";
import { logger } from "../logger";
export class TorBoxClient {
private static instance: AxiosInstance;
private static readonly baseURL = "https://api.torbox.app/v1/api";
public static apiToken: string;
static authorize(apiToken: string) {
this.instance = axios.create({
baseURL: this.baseURL,
headers: {
Authorization: `Bearer ${apiToken}`,
},
});
this.apiToken = apiToken;
}
static async addMagnet(magnet: string) {
const form = new FormData();
form.append("magnet", magnet);
const response = await this.instance.post<TorBoxAddTorrentRequest>(
"/torrents/createtorrent",
form
);
return response.data.data;
}
static async getTorrentInfo(id: number) {
const response =
await this.instance.get<TorBoxTorrentInfoRequest>("/torrents/mylist");
const data = response.data.data;
const info = data.find((item) => item.id === id);
if (!info) {
return null;
}
return info;
}
static async getUser() {
const response = await this.instance.get<TorBoxUserRequest>(`/user/me`);
return response.data.data;
}
static async requestLink(id: number) {
const searchParams = new URLSearchParams({});
searchParams.set("token", this.apiToken);
searchParams.set("torrent_id", id.toString());
searchParams.set("zip_link", "true");
const response = await this.instance.get<TorBoxRequestLinkRequest>(
"/torrents/requestdl?" + searchParams.toString()
);
if (response.status !== 200) {
logger.error(response.data.error);
logger.error(response.data.detail);
return null;
}
return response.data.data;
}
private static async getAllTorrentsFromUser() {
const response =
await this.instance.get<TorBoxTorrentInfoRequest>("/torrents/mylist");
return response.data.data;
}
static async getTorrentId(magnetUri: string) {
const userTorrents = await this.getAllTorrentsFromUser();
const { infoHash } = await parseTorrent(magnetUri);
const userTorrent = userTorrents.find(
(userTorrent) => userTorrent.hash === infoHash
);
if (userTorrent) return userTorrent.id;
const torrent = await this.addMagnet(magnetUri);
return torrent.torrent_id;
}
}