mirror of
https://github.com/hydralauncher/hydra.git
synced 2025-02-04 01:03:47 +03:00
99 lines
2.6 KiB
TypeScript
99 lines
2.6 KiB
TypeScript
import { JSDOM } from "jsdom";
|
||
|
||
import parseTorrent, { toMagnetURI } from "parse-torrent";
|
||
|
||
import { Repack } from "@main/entity";
|
||
import { logger } from "../logger";
|
||
import { requestWebPage, savePage } from "./helpers";
|
||
import type { GameRepackInput } from "./helpers";
|
||
|
||
const getTorrentBuffer = (url: string) =>
|
||
fetch(url, { method: "GET" }).then((response) =>
|
||
response.arrayBuffer().then((buffer) => Buffer.from(buffer))
|
||
);
|
||
|
||
const formatXatabDate = (str: string) => {
|
||
const date = new Date();
|
||
|
||
const [day, month, year] = str.split(".");
|
||
|
||
date.setDate(Number(day));
|
||
date.setMonth(Number(month) - 1);
|
||
date.setFullYear(Number(year));
|
||
date.setHours(0, 0, 0, 0);
|
||
|
||
return date;
|
||
};
|
||
|
||
const formatXatabDownloadSize = (str: string) =>
|
||
str.replace(",", ".").replace(/Гб/g, "GB").replace(/Мб/g, "MB");
|
||
|
||
const getXatabRepack = async (url: string) => {
|
||
const data = await requestWebPage(url);
|
||
const { window } = new JSDOM(data);
|
||
const { document } = window;
|
||
|
||
const $uploadDate = document.querySelector(".entry__date");
|
||
const $size = document.querySelector(".entry__info-size");
|
||
|
||
const $downloadButton = document.querySelector(
|
||
".download-torrent"
|
||
) as HTMLAnchorElement;
|
||
|
||
if (!$downloadButton) throw new Error("Download button not found");
|
||
|
||
const torrentBuffer = await getTorrentBuffer($downloadButton.href);
|
||
|
||
return {
|
||
fileSize: formatXatabDownloadSize($size.textContent).toUpperCase(),
|
||
magnet: toMagnetURI({
|
||
infoHash: parseTorrent(torrentBuffer).infoHash,
|
||
}),
|
||
uploadDate: formatXatabDate($uploadDate.textContent),
|
||
};
|
||
};
|
||
|
||
export const getNewRepacksFromXatab = async (
|
||
existingRepacks: Repack[] = [],
|
||
page = 1
|
||
): Promise<void> => {
|
||
const data = await requestWebPage(`https://byxatab.com/page/${page}`);
|
||
|
||
const { window } = new JSDOM(data);
|
||
|
||
const repacks: GameRepackInput[] = [];
|
||
|
||
for (const $a of Array.from(
|
||
window.document.querySelectorAll(".entry__title a")
|
||
)) {
|
||
try {
|
||
const repack = await getXatabRepack(($a as HTMLAnchorElement).href);
|
||
|
||
repacks.push({
|
||
title: $a.textContent,
|
||
repacker: "Xatab",
|
||
...repack,
|
||
page,
|
||
});
|
||
} catch (err: unknown) {
|
||
logger.error((err as Error).message, {
|
||
method: "getNewRepacksFromXatab",
|
||
});
|
||
}
|
||
}
|
||
|
||
const newRepacks = repacks.filter(
|
||
(repack) =>
|
||
repack.uploadDate &&
|
||
!existingRepacks.some(
|
||
(existingRepack) => existingRepack.title === repack.title
|
||
)
|
||
);
|
||
|
||
if (!newRepacks.length) return;
|
||
|
||
await savePage(newRepacks);
|
||
|
||
return getNewRepacksFromXatab(existingRepacks, page + 1);
|
||
};
|