2022-09-04 21:58:42 +03:00
|
|
|
import genericProxyHandler from "utils/proxies/generic";
|
|
|
|
import credentialedProxyHandler from "utils/proxies/credentialed";
|
|
|
|
import rutorrentProxyHandler from "utils/proxies/rutorrent";
|
|
|
|
import nzbgetProxyHandler from "utils/proxies/nzbget";
|
|
|
|
import npmProxyHandler from "utils/proxies/npm";
|
2022-09-12 19:35:47 -07:00
|
|
|
import transmissionProxyHandler from "utils/proxies/transmission";
|
2022-09-16 19:11:57 -07:00
|
|
|
import qbittorrentProxyHandler from "utils/proxies/qbittorrent";
|
2022-09-04 21:58:42 +03:00
|
|
|
|
2022-09-17 08:32:40 +03:00
|
|
|
function jsonArrayMapper(data, map) {
|
|
|
|
if (data?.length > 0) {
|
2022-09-16 11:33:11 -07:00
|
|
|
const json = JSON.parse(data.toString());
|
|
|
|
if (json instanceof Array) {
|
2022-09-17 08:32:40 +03:00
|
|
|
return json.map(map);
|
2022-09-16 11:33:11 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
2022-09-17 13:05:44 +03:00
|
|
|
function asJson(data) {
|
|
|
|
if (data?.length > 0) {
|
|
|
|
const json = JSON.parse(data.toString());
|
|
|
|
return json;
|
|
|
|
}
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
2022-09-04 21:58:42 +03:00
|
|
|
const serviceProxyHandlers = {
|
|
|
|
// uses query param auth
|
|
|
|
emby: genericProxyHandler,
|
2022-09-05 08:19:50 +03:00
|
|
|
jellyfin: genericProxyHandler,
|
2022-09-04 21:58:42 +03:00
|
|
|
pihole: genericProxyHandler,
|
2022-09-17 13:05:44 +03:00
|
|
|
radarr: {
|
|
|
|
proxy: genericProxyHandler,
|
|
|
|
maps: {
|
|
|
|
movie: (data) => ({
|
|
|
|
wanted: jsonArrayMapper(data, (item) => item.isAvailable === false).length,
|
|
|
|
have: jsonArrayMapper(data, (item) => item.isAvailable === true).length,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
sonarr: {
|
|
|
|
proxy: genericProxyHandler,
|
|
|
|
maps: {
|
|
|
|
series: (data) => ({
|
|
|
|
total: asJson(data.toString()).length,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
lidarr: {
|
|
|
|
proxy: genericProxyHandler,
|
|
|
|
maps: {
|
|
|
|
album: (data) => ({
|
|
|
|
have: jsonArrayMapper(data, (item) => item.statistics.percentOfTracks === 100).length,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
readarr: {
|
|
|
|
proxy: genericProxyHandler,
|
|
|
|
maps: {
|
|
|
|
book: (data) => ({
|
|
|
|
have: jsonArrayMapper(data, (item) => item.statistics.bookFileCount > 0).length,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
bazarr: {
|
|
|
|
proxy: genericProxyHandler,
|
|
|
|
maps: {
|
|
|
|
movies: (data) => ({
|
|
|
|
total: asJson(data.toString()).total,
|
|
|
|
}),
|
|
|
|
episodes: (data) => ({
|
|
|
|
total: asJson(data.toString()).total,
|
|
|
|
}),
|
|
|
|
},
|
|
|
|
},
|
2022-09-04 21:58:42 +03:00
|
|
|
speedtest: genericProxyHandler,
|
|
|
|
tautulli: genericProxyHandler,
|
|
|
|
traefik: genericProxyHandler,
|
2022-09-12 02:22:39 +01:00
|
|
|
sabnzbd: genericProxyHandler,
|
2022-09-14 10:46:52 -07:00
|
|
|
jackett: genericProxyHandler,
|
2022-09-16 14:05:56 +03:00
|
|
|
adguard: genericProxyHandler,
|
2022-09-12 10:59:56 +03:00
|
|
|
// uses X-API-Key (or similar) header auth
|
2022-09-11 04:39:40 +01:00
|
|
|
gotify: credentialedProxyHandler,
|
2022-09-04 21:58:42 +03:00
|
|
|
portainer: credentialedProxyHandler,
|
|
|
|
jellyseerr: credentialedProxyHandler,
|
2022-09-11 17:24:33 +03:00
|
|
|
overseerr: credentialedProxyHandler,
|
2022-09-04 21:58:42 +03:00
|
|
|
ombi: credentialedProxyHandler,
|
2022-09-12 10:59:56 +03:00
|
|
|
coinmarketcap: credentialedProxyHandler,
|
2022-09-12 17:56:04 +01:00
|
|
|
prowlarr: credentialedProxyHandler,
|
2022-09-04 21:58:42 +03:00
|
|
|
// super specific handlers
|
|
|
|
rutorrent: rutorrentProxyHandler,
|
|
|
|
nzbget: nzbgetProxyHandler,
|
|
|
|
npm: npmProxyHandler,
|
2022-09-12 19:35:47 -07:00
|
|
|
transmission: transmissionProxyHandler,
|
2022-09-16 19:11:57 -07:00
|
|
|
qbittorrent: qbittorrentProxyHandler,
|
2022-09-04 21:58:42 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
export default async function handler(req, res) {
|
|
|
|
const { type } = req.query;
|
|
|
|
|
|
|
|
const serviceProxyHandler = serviceProxyHandlers[type];
|
|
|
|
|
|
|
|
if (serviceProxyHandler) {
|
2022-09-16 11:33:11 -07:00
|
|
|
if (serviceProxyHandler instanceof Function) {
|
|
|
|
return serviceProxyHandler(req, res);
|
|
|
|
}
|
|
|
|
|
2022-09-17 08:32:40 +03:00
|
|
|
const { proxy, maps } = serviceProxyHandler;
|
2022-09-16 11:33:11 -07:00
|
|
|
if (proxy) {
|
2022-09-17 08:32:40 +03:00
|
|
|
return proxy(req, res, maps);
|
2022-09-16 11:33:11 -07:00
|
|
|
}
|
2022-09-04 21:58:42 +03:00
|
|
|
}
|
|
|
|
|
2022-09-07 16:53:24 +03:00
|
|
|
return res.status(403).json({ error: "Unkown proxy service type" });
|
2022-09-04 21:58:42 +03:00
|
|
|
}
|