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 1/5] 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"); } } From 3aa0b8fa6c61a47b81f18c973bd36186f6b70f9b Mon Sep 17 00:00:00 2001 From: Shisuys <126631781+Shisuiicaro@users.noreply.github.com> Date: Sat, 1 Feb 2025 19:41:32 -0300 Subject: [PATCH 2/5] Update src/main/services/hosters/mediafire.ts Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- src/main/services/hosters/mediafire.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/services/hosters/mediafire.ts b/src/main/services/hosters/mediafire.ts index 2c69522f..9913ecee 100644 --- a/src/main/services/hosters/mediafire.ts +++ b/src/main/services/hosters/mediafire.ts @@ -41,7 +41,7 @@ export class MediafireApi { return processed; } - private static extractDirectUrl(html: string, _originalUrl: string): string { + private static extractDirectUrl(html: string): string { const preUrls = html.match(this.validMediafirePreDL); if (preUrls && preUrls[0]) { return preUrls[0]; From a126707fb77ae61a200d94e3b810b79b14a1169d Mon Sep 17 00:00:00 2001 From: Shisuys Date: Sat, 1 Feb 2025 19:54:31 -0300 Subject: [PATCH 3/5] Update mediafire.ts --- src/main/services/hosters/mediafire.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/services/hosters/mediafire.ts b/src/main/services/hosters/mediafire.ts index 9913ecee..df63a263 100644 --- a/src/main/services/hosters/mediafire.ts +++ b/src/main/services/hosters/mediafire.ts @@ -6,7 +6,7 @@ export class MediafireApi { private static readonly validMediafirePreDL = /(?<=['"])(https?:)?(\/\/)?(www\.)?mediafire\.com\/(file|view|download)\/[^'"?]+\?dkey=[^'"]+(?=['"])/; private static readonly validDynamicDL = - /(?<=['"])https?:\/\/download[0-9]+\.mediafire\.com\/[^'"]+(?=['"])/; + /(?<=['"])https?:\/\/download\d+\.mediafire\.com\/[^'"]+(?=['"])/; private static readonly checkHTTP = /^https?:\/\//m; public static async getDownloadUrl(mediafireUrl: string): Promise { @@ -19,7 +19,7 @@ export class MediafireApi { if (!response.ok) throw new Error("Failed to fetch Mediafire page"); const html = await response.text(); - return this.extractDirectUrl(html, processedUrl); + return this.extractDirectUrl(html); } catch (error) { throw new Error(`Failed to get download URL: ${error.message}`); } @@ -42,14 +42,14 @@ export class MediafireApi { } private static extractDirectUrl(html: string): string { - const preUrls = html.match(this.validMediafirePreDL); - if (preUrls && preUrls[0]) { - return preUrls[0]; + const preMatch = this.validMediafirePreDL.exec(html); + if (preMatch?.[0]) { + return preMatch[0]; } - const dlUrls = html.match(this.validDynamicDL); - if (dlUrls && dlUrls[0]) { - return dlUrls[0]; + const dlMatch = this.validDynamicDL.exec(html); + if (dlMatch?.[0]) { + return dlMatch[0]; } throw new Error("No valid download links found"); From c554dd0cbe0f7bbb0703334cc08cbc2e2c4d3eb2 Mon Sep 17 00:00:00 2001 From: Shisuys Date: Sat, 1 Feb 2025 19:57:18 -0300 Subject: [PATCH 4/5] Update mediafire.ts --- src/main/services/hosters/mediafire.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/services/hosters/mediafire.ts b/src/main/services/hosters/mediafire.ts index df63a263..623c0c3d 100644 --- a/src/main/services/hosters/mediafire.ts +++ b/src/main/services/hosters/mediafire.ts @@ -21,7 +21,7 @@ export class MediafireApi { const html = await response.text(); return this.extractDirectUrl(html); } catch (error) { - throw new Error(`Failed to get download URL: ${error.message}`); + throw new Error(`Failed to get download URL`); } } From d017b0c26119707a38a9061648f753e02279655c Mon Sep 17 00:00:00 2001 From: Shisuys Date: Sat, 1 Feb 2025 20:09:41 -0300 Subject: [PATCH 5/5] Remove Cors proxy --- src/main/services/hosters/mediafire.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/services/hosters/mediafire.ts b/src/main/services/hosters/mediafire.ts index 623c0c3d..babb7e7d 100644 --- a/src/main/services/hosters/mediafire.ts +++ b/src/main/services/hosters/mediafire.ts @@ -1,7 +1,6 @@ import fetch from "node-fetch"; export class MediafireApi { - 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=[^'"]+(?=['"])/; @@ -12,9 +11,7 @@ export class MediafireApi { public static async getDownloadUrl(mediafireUrl: string): Promise { try { const processedUrl = this.processUrl(mediafireUrl); - const response = await fetch( - `${this.corsProxy}${encodeURIComponent(processedUrl)}` - ); + const response = await fetch(processedUrl); if (!response.ok) throw new Error("Failed to fetch Mediafire page");