From c1d15efbc0d0f3a4f1d7b88c7881195330d1953b Mon Sep 17 00:00:00 2001 From: Shisuys Date: Sun, 26 Jan 2025 11:19:41 -0300 Subject: [PATCH] Mediafire Support --- .../services/download/download-manager.ts | 12 ++++++- src/main/services/hosters/index.ts | 1 + src/main/services/hosters/mediafire.ts | 31 +++++++++++++++++++ src/renderer/src/constants.ts | 1 + src/shared/constants.ts | 1 + src/shared/index.ts | 1 + 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/main/services/hosters/mediafire.ts diff --git a/src/main/services/download/download-manager.ts b/src/main/services/download/download-manager.ts index 134a74e6..d8be2b52 100644 --- a/src/main/services/download/download-manager.ts +++ b/src/main/services/download/download-manager.ts @@ -8,7 +8,7 @@ import { } from "@main/repository"; import { publishDownloadCompleteNotification } from "../notifications"; import type { DownloadProgress } from "@types"; -import { GofileApi, QiwiApi, DatanodesApi } from "../hosters"; +import { GofileApi, QiwiApi, DatanodesApi, MediafireApi } from "../hosters"; import { PythonRPC } from "../python-rpc"; import { LibtorrentPayload, @@ -287,6 +287,16 @@ export class DownloadManager { save_path: game.downloadPath!, }; } + case Downloader.Mediafire: { + const downloadUrl = await MediafireApi.getDownloadUrl(game.uri!); + + return { + action: "start", + game_id: game.id, + url: downloadUrl, + save_path: game.downloadPath!, + }; + } case Downloader.Torrent: return { action: "start", diff --git a/src/main/services/hosters/index.ts b/src/main/services/hosters/index.ts index 8cff7bd2..556897cd 100644 --- a/src/main/services/hosters/index.ts +++ b/src/main/services/hosters/index.ts @@ -1,3 +1,4 @@ export * from "./gofile"; export * from "./qiwi"; export * from "./datanodes"; +export * from "./mediafire"; diff --git a/src/main/services/hosters/mediafire.ts b/src/main/services/hosters/mediafire.ts new file mode 100644 index 00000000..1efdd3ef --- /dev/null +++ b/src/main/services/hosters/mediafire.ts @@ -0,0 +1,31 @@ +import axios, { AxiosResponse } from "axios"; +import { JSDOM } from "jsdom"; + +export class MediafireApi { + private static readonly session = axios.create(); + + public static async getDownloadUrl(mediafireUrl: string): Promise { + const response: AxiosResponse = await this.session.get( + mediafireUrl, + { + headers: { + "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"] || ""; + } + + const dom = new JSDOM(response.data); + const downloadButton = dom.window.document.querySelector( + "a#downloadButton" + ) as HTMLAnchorElement; + + return downloadButton?.href || ""; + } +} diff --git a/src/renderer/src/constants.ts b/src/renderer/src/constants.ts index d0797caf..8f20ad7a 100644 --- a/src/renderer/src/constants.ts +++ b/src/renderer/src/constants.ts @@ -9,6 +9,7 @@ export const DOWNLOADER_NAME = { [Downloader.PixelDrain]: "PixelDrain", [Downloader.Qiwi]: "Qiwi", [Downloader.Datanodes]: "Datanodes", + [Downloader.Mediafire]: "Mediafire", }; export const MAX_MINUTES_TO_SHOW_IN_PLAYTIME = 120; diff --git a/src/shared/constants.ts b/src/shared/constants.ts index f2bcc793..3f3e0a8b 100644 --- a/src/shared/constants.ts +++ b/src/shared/constants.ts @@ -5,6 +5,7 @@ export enum Downloader { PixelDrain, Qiwi, Datanodes, + Mediafire, } export enum DownloadSourceStatus { diff --git a/src/shared/index.ts b/src/shared/index.ts index 7d612a17..decb218e 100644 --- a/src/shared/index.ts +++ b/src/shared/index.ts @@ -88,6 +88,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 (uri.startsWith("https://www.mediafire.com")) return [Downloader.Mediafire]; if (realDebridHosts.some((host) => uri.startsWith(host))) return [Downloader.RealDebrid];