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( "/torrents/createtorrent", form ); return response.data.data; } static async getTorrentInfo(id: number) { const response = await this.instance.get("/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(`/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( "/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("/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; } }