From fe2a23b345f3d1d7454aea2e561056a9e1f5240a Mon Sep 17 00:00:00 2001 From: Shisuys <126631781+Shisuiicaro@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:18:59 -0300 Subject: [PATCH] Fix 403 --- src/main/services/hosters/mediafire.ts | 74 ++++++++++++++++---------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/src/main/services/hosters/mediafire.ts b/src/main/services/hosters/mediafire.ts index 41f021cb..2c69522f 100644 --- a/src/main/services/hosters/mediafire.ts +++ b/src/main/services/hosters/mediafire.ts @@ -1,39 +1,57 @@ -import axios, { AxiosResponse } from "axios"; -import { JSDOM } from "jsdom"; +import fetch from "node-fetch"; export class MediafireApi { - private static readonly session = axios.create(); + private static readonly corsProxy = "https://corsproxy.io/?"; + private static readonly validMediafireIdentifierDL = /^[a-zA-Z0-9]+$/m; + private static readonly validMediafirePreDL = + /(?<=['"])(https?:)?(\/\/)?(www\.)?mediafire\.com\/(file|view|download)\/[^'"?]+\?dkey=[^'"]+(?=['"])/; + private static readonly validDynamicDL = + /(?<=['"])https?:\/\/download[0-9]+\.mediafire\.com\/[^'"]+(?=['"])/; + private static readonly checkHTTP = /^https?:\/\//m; 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 === 200 || status === 302, - } - ); + try { + const processedUrl = this.processUrl(mediafireUrl); + const response = await fetch( + `${this.corsProxy}${encodeURIComponent(processedUrl)}` + ); - if (response.status === 302) { - const location = response.headers["location"]; - if (!location) { - throw new Error("Missing location header in 302 redirect response"); - } - return location; + if (!response.ok) throw new Error("Failed to fetch Mediafire page"); + + const html = await response.text(); + return this.extractDirectUrl(html, processedUrl); + } catch (error) { + throw new Error(`Failed to get download URL: ${error.message}`); + } + } + + private static processUrl(url: string): string { + let processed = url.replace("http://", "https://"); + + if (this.validMediafireIdentifierDL.test(processed)) { + processed = `https://mediafire.com/?${processed}`; } - const dom = new JSDOM(response.data); - const downloadButton = dom.window.document.querySelector( - "a#downloadButton" - ) as HTMLAnchorElement; - - if (!downloadButton?.href) { - throw new Error("Download button URL not found in page content"); + if (!this.checkHTTP.test(processed)) { + processed = processed.startsWith("//") + ? `https:${processed}` + : `https://${processed}`; } - return downloadButton.href; + return processed; + } + + private static extractDirectUrl(html: string, _originalUrl: string): string { + const preUrls = html.match(this.validMediafirePreDL); + if (preUrls && preUrls[0]) { + return preUrls[0]; + } + + const dlUrls = html.match(this.validDynamicDL); + if (dlUrls && dlUrls[0]) { + return dlUrls[0]; + } + + throw new Error("No valid download links found"); } }