Merge pull request #1378 from Shisuiicaro/Feature/Datanodes-Hoster
Some checks are pending
Release / build (ubuntu-latest) (push) Waiting to run
Release / build (windows-latest) (push) Waiting to run

Feat: Datanodes Hoster
This commit is contained in:
Chubby Granny Chaser 2025-01-07 08:40:45 +00:00 committed by GitHub
commit 11700b7c16
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 61 additions and 1 deletions

View File

@ -8,7 +8,7 @@ import {
} from "@main/repository";
import { publishDownloadCompleteNotification } from "../notifications";
import type { DownloadProgress } from "@types";
import { GofileApi, QiwiApi } from "../hosters";
import { GofileApi, QiwiApi, DatanodesApi } from "../hosters";
import { PythonRPC } from "../python-rpc";
import {
LibtorrentPayload,
@ -277,6 +277,16 @@ export class DownloadManager {
save_path: game.downloadPath!,
};
}
case Downloader.Datanodes: {
const downloadUrl = await DatanodesApi.getDownloadUrl(game.uri!);
return {
action: "start",
game_id: game.id,
url: downloadUrl,
save_path: game.downloadPath!,
};
}
case Downloader.Torrent:
return {
action: "start",

View File

@ -0,0 +1,46 @@
import axios, { AxiosResponse } from "axios";
export class DatanodesApi {
private static readonly session = axios.create({});
public static async getDownloadUrl(downloadUrl: string): Promise<string> {
const parsedUrl = new URL(downloadUrl);
const pathSegments = parsedUrl.pathname.split("/");
const fileCode = decodeURIComponent(pathSegments[1]);
const fileName = decodeURIComponent(pathSegments[pathSegments.length - 1]);
const payload = new URLSearchParams({
op: "download2",
id: fileCode,
rand: "",
referer: "https://datanodes.to/download",
method_free: "Free Download >>",
method_premium: "",
adblock_detected: "",
});
const response: AxiosResponse = await this.session.post(
"https://datanodes.to/download",
payload,
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Cookie: `lang=english; file_name=${fileName}; file_code=${fileCode};`,
Host: "datanodes.to",
Origin: "https://datanodes.to",
Referer: "https://datanodes.to/download",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
},
maxRedirects: 0, validateStatus: (status: number) => status === 302 || status < 400,
}
);
if (response.status === 302) {
return response.headers["location"];
}
return "";
}
}

View File

@ -1,2 +1,3 @@
export * from "./gofile";
export * from "./qiwi";
export * from "./datanodes";

View File

@ -8,6 +8,7 @@ export const DOWNLOADER_NAME = {
[Downloader.Gofile]: "Gofile",
[Downloader.PixelDrain]: "PixelDrain",
[Downloader.Qiwi]: "Qiwi",
[Downloader.Datanodes]: "Datanodes",
};
export const MAX_MINUTES_TO_SHOW_IN_PLAYTIME = 120;

View File

@ -4,6 +4,7 @@ export enum Downloader {
Gofile,
PixelDrain,
Qiwi,
Datanodes,
}
export enum DownloadSourceStatus {

View File

@ -87,6 +87,7 @@ export const getDownloadersForUri = (uri: string) => {
if (uri.startsWith("https://pixeldrain.com")) return [Downloader.PixelDrain];
if (uri.startsWith("https://qiwi.gg")) return [Downloader.Qiwi];
if (uri.startsWith("https://datanodes.to")) return [Downloader.Datanodes];
if (realDebridHosts.some((host) => uri.startsWith(host)))
return [Downloader.RealDebrid];