rewrite rutorrent proxy

pull/954/head
shamoon 1 year ago
parent 3cbfd10df7
commit b2211bcdfd

@ -29,7 +29,6 @@
"react-dom": "^18.2.0",
"react-i18next": "^11.18.6",
"react-icons": "^4.4.0",
"rutorrent-promise": "^2.0.0",
"shvl": "^3.0.0",
"swr": "^1.3.0",
"tough-cookie": "^4.1.2",

@ -33,7 +33,6 @@ specifiers:
react-dom: ^18.2.0
react-i18next: ^11.18.6
react-icons: ^4.4.0
rutorrent-promise: ^2.0.0
shvl: ^3.0.0
swr: ^1.3.0
tailwind-scrollbar: ^2.0.1
@ -63,7 +62,6 @@ dependencies:
react-dom: 18.2.0_react@18.2.0
react-i18next: 11.18.6_ulhmqqxshznzmtuvahdi5nasbq
react-icons: 4.4.0_react@18.2.0
rutorrent-promise: 2.0.0
shvl: 3.0.0
swr: 1.3.0_react@18.2.0
tough-cookie: 4.1.2
@ -1582,15 +1580,6 @@ packages:
mime-types: 2.1.35
dev: false
/form-data/3.0.1:
resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
engines: {node: '>= 6'}
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
dev: false
/fraction.js/4.2.0:
resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
dev: true
@ -2299,18 +2288,6 @@ packages:
- babel-plugin-macros
dev: false
/node-fetch/2.6.7:
resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
engines: {node: 4.x || >=6.0.0}
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
dependencies:
whatwg-url: 5.0.0
dev: false
/node-os-utils/1.3.7:
resolution: {integrity: sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==}
dev: false
@ -2836,15 +2813,6 @@ packages:
queue-microtask: 1.2.3
dev: true
/rutorrent-promise/2.0.0:
resolution: {integrity: sha512-ip6FxYM/BFxRgYSWr+2gZ0ao9LsJ1vJYWyFVnTkSmZrp4Cwa3CFpdxMi/5aZsUf1qve2CY9P4GLvrACx+PZ6yQ==}
dependencies:
form-data: 3.0.1
node-fetch: 2.6.7
transitivePeerDependencies:
- encoding
dev: false
/safe-buffer/5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
dev: false
@ -3207,10 +3175,6 @@ packages:
url-parse: 1.5.10
dev: false
/tr46/0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
dev: false
/triple-beam/1.3.0:
resolution: {integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==}
dev: false
@ -3346,17 +3310,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
/webidl-conversions/3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: false
/whatwg-url/5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
dev: false
/which-boxed-primitive/1.0.2:
resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
dependencies:

@ -1,6 +1,48 @@
import RuTorrent from "rutorrent-promise";
import getServiceWidget from "utils/config/service-helpers";
import { httpProxy } from "utils/proxy/http";
import widgets from "widgets/widgets";
import { formatApiCall } from "utils/proxy/api-helpers";
import createLogger from "utils/logger";
const logger = createLogger("rutorrentProxyHandler");
// from https://github.com/ctessier/node-rutorrent-promise/blob/next/utils.js
const getTorrentInfo = (data) => ({
'd.is_open': data[0],
'd.is_hash_checking': data[1],
'd.is_hash_checked': data[2],
'd.get_state': data[3],
'd.get_name': data[4],
'd.get_size_bytes': data[5],
'd.get_completed_chunks': data[6],
'd.get_size_chunks': data[7],
'd.get_bytes_done': data[8],
'd.get_up_total': data[9],
'd.get_ratio': data[10],
'd.get_up_rate': data[11],
'd.get_down_rate': data[12],
'd.get_chunk_size': data[13],
'd.get_custom1': data[14],
'd.get_peers_accounted': data[15],
'd.get_peers_not_connected': data[16],
'd.get_peers_connected': data[17],
'd.get_peers_complete': data[18],
'd.get_left_bytes': data[19],
'd.get_priority': data[20],
'd.get_state_changed': data[21],
'd.get_skip_total': data[22],
'd.get_hashing': data[23],
'd.get_chunks_hashed': data[24],
'd.get_base_path': data[25],
'd.get_creation_date': data[26],
'd.get_tracker_focus': data[27],
'd.is_active': data[28],
'd.get_message': data[29],
'd.get_custom2': data[30],
'd.get_free_diskspace': data[31],
'd.is_private': data[32],
'd.is_multi_file': data[33],
});
export default async function rutorrentProxyHandler(req, res) {
const { group, service } = req.query;
@ -9,27 +51,35 @@ export default async function rutorrentProxyHandler(req, res) {
const widget = await getServiceWidget(group, service);
if (widget) {
const constructedUrl = new URL(widget.url);
const api = widgets?.[widget.type]?.api;
const url = new URL(formatApiCall(api, { ...widget }));
let rtPort = constructedUrl.port;
if (rtPort === '') {
rtPort = constructedUrl.protocol === "https:" ? 443 : 80;
const headers = {}
if (widget.username) {
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
}
const rutorrent = new RuTorrent({
host: constructedUrl.hostname,
port: rtPort,
path: constructedUrl.pathname,
ssl: constructedUrl.protocol === "https:",
username: widget.username,
password: widget.password,
const [status, , data] = await httpProxy(url, {
method: "POST",
headers,
body: 'mode=list'
});
const data = await rutorrent.get(["d.get_down_rate", "d.get_up_rate", "d.get_state"]);
if (status !== 200) {
logger.error("HTTP Error %d calling %s", status, url.toString());
return res.status(status).json({error: {message: "HTTP Error", url, data}});
}
return res.status(200).send(data);
try {
const rawData = JSON.parse(data);
const parsedData = Object.keys(rawData.t).map((hashString) => getTorrentInfo(rawData.t[hashString]));
return res.status(200).send(parsedData);
} catch (e) {
return res.status(500).json({error: {message: e?.toString() ?? 'Error parsing rutorrent data', url, data}});
}
}
}
return res.status(400).json({ error: "Invalid proxy service type" });
return res.status(500).json({ error: "Invalid proxy service type" });
}

Loading…
Cancel
Save