From c7813c26a8cb7bb8b03f5466b9e165c3e94bb077 Mon Sep 17 00:00:00 2001 From: Sucukdeluxe Date: Fri, 27 Feb 2026 04:16:14 +0100 Subject: [PATCH] Normalize debrid filenames and bump to 1.1.14 --- package-lock.json | 4 ++-- package.json | 2 +- src/main/constants.ts | 2 +- src/main/utils.ts | 17 +++++++++++++++-- tests/utils.test.ts | 8 +++++++- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9c5679..1474056 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "real-debrid-downloader", - "version": "1.1.13", + "version": "1.1.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "real-debrid-downloader", - "version": "1.1.13", + "version": "1.1.14", "license": "MIT", "dependencies": { "adm-zip": "^0.5.16", diff --git a/package.json b/package.json index ba31d2e..38bca74 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "real-debrid-downloader", - "version": "1.1.13", + "version": "1.1.14", "description": "Real-Debrid Downloader Desktop (Electron + React + TypeScript)", "main": "build/main/main/main.js", "author": "Sucukdeluxe", diff --git a/src/main/constants.ts b/src/main/constants.ts index 7bd21d5..898aa2d 100644 --- a/src/main/constants.ts +++ b/src/main/constants.ts @@ -3,7 +3,7 @@ import os from "node:os"; import { AppSettings } from "../shared/types"; export const APP_NAME = "Debrid Download Manager"; -export const APP_VERSION = "1.1.13"; +export const APP_VERSION = "1.1.14"; export const API_BASE_URL = "https://api.real-debrid.com/rest/1.0"; export const DCRYPT_UPLOAD_URL = "https://dcrypt.it/decrypt/upload"; diff --git a/src/main/utils.ts b/src/main/utils.ts index 746b5a9..7bfbb24 100644 --- a/src/main/utils.ts +++ b/src/main/utils.ts @@ -51,8 +51,21 @@ export function humanSize(bytes: number): string { export function filenameFromUrl(url: string): string { try { const parsed = new URL(url); - const name = path.basename(parsed.pathname || ""); - return sanitizeFilename(name || "download.bin"); + const queryName = parsed.searchParams.get("filename") + || parsed.searchParams.get("file") + || parsed.searchParams.get("name") + || parsed.searchParams.get("download") + || parsed.searchParams.get("title") + || ""; + const rawName = queryName || path.basename(parsed.pathname || ""); + const decoded = decodeURIComponent(rawName || "").trim(); + const normalized = decoded + .replace(/\.(rar|zip|7z|tar|gz|bz2|xz|iso|part\d+\.rar|r\d{2})\.html$/i, ".$1") + .replace(/\.(mp4|mkv|avi|mp3|flac|srt)\.html$/i, ".$1"); + if (/^[a-f0-9]{24,}$/i.test(normalized)) { + return "download.bin"; + } + return sanitizeFilename(normalized || "download.bin"); } catch { return "download.bin"; } diff --git a/tests/utils.test.ts b/tests/utils.test.ts index 7f08861..41d52da 100644 --- a/tests/utils.test.ts +++ b/tests/utils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { parsePackagesFromLinksText, isHttpLink, sanitizeFilename, formatEta } from "../src/main/utils"; +import { parsePackagesFromLinksText, isHttpLink, sanitizeFilename, formatEta, filenameFromUrl } from "../src/main/utils"; describe("utils", () => { it("validates http links", () => { @@ -30,4 +30,10 @@ describe("utils", () => { expect(formatEta(65)).toBe("01:05"); expect(formatEta(3661)).toBe("01:01:01"); }); + + it("normalizes filenames from links", () => { + expect(filenameFromUrl("https://rapidgator.net/file/id/show.part1.rar.html")).toBe("show.part1.rar"); + expect(filenameFromUrl("https://debrid.example/dl/abc?filename=Movie.S01E01.mkv")).toBe("Movie.S01E01.mkv"); + expect(filenameFromUrl("https://debrid.example/dl/e51f6809bb6ca615601f5ac5db433737")).toBe("download.bin"); + }); });