feat: move default download directories to desktop

This commit is contained in:
Sucukdeluxe
2026-08-09 14:43:42 +02:00
parent 1750c6f0a9
commit 403051e3cf
6 changed files with 114 additions and 38 deletions
+5
View File
@@ -301,6 +301,11 @@ This makes it easy to share one URL plus token during support, so current packag
Detailed release history is published on [GitHub Releases](https://github.com/Sucukdeluxe/multi-debrid-downloader/releases).
### 2.0.5
- Move the default download, extraction, and video collection directories to the desktop under `Multi-Debrid-Downloader`.
- Migrate untouched legacy default directories from `Downloads\RealDebrid` to the new desktop location.
### 2.0.4
- Rename the online backup action from "create" to "export" for clearer wording.
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "real-debrid-downloader",
"version": "2.0.4",
"version": "2.0.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "real-debrid-downloader",
"version": "2.0.4",
"version": "2.0.5",
"license": "MIT",
"dependencies": {
"adm-zip": "0.6.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "real-debrid-downloader",
"version": "2.0.4",
"version": "2.0.5",
"description": "Desktop downloader",
"main": "build/main/main/main.js",
"author": "Sucukdeluxe",
+1 -1
View File
@@ -41,7 +41,7 @@ export const DEFAULT_UPDATE_REPO = "Sucukdeluxe/multi-debrid-downloader";
export const ONLINE_BACKUP_API_URL = "https://downloader.24-music.de/backup-api";
export function defaultSettings(): AppSettings {
const baseDir = path.join(os.homedir(), "Downloads", "RealDebrid");
const baseDir = path.join(os.homedir(), "Desktop", "Multi-Debrid-Downloader");
return {
token: "",
realDebridUseWebLogin: false,
+35 -3
View File
@@ -1,5 +1,6 @@
import fs from "node:fs";
import fsp from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { getDebridLinkApiKeyIds } from "../shared/debrid-link-keys";
import { getMegaDebridAccountIds } from "../shared/mega-debrid-accounts";
@@ -104,6 +105,36 @@ function normalizeAbsoluteDir(value: unknown, fallback: string): string {
return path.resolve(text);
}
function samePath(left: unknown, right: string): boolean {
const leftText = asText(left);
if (!leftText) {
return false;
}
const leftResolved = path.resolve(leftText);
const rightResolved = path.resolve(right);
return process.platform === "win32"
? leftResolved.toLowerCase() === rightResolved.toLowerCase()
: leftResolved === rightResolved;
}
function migrateLegacyDefaultDirectories(settings: AppSettings, defaults: AppSettings): AppSettings {
const legacyBaseDir = path.join(os.homedir(), "Downloads", "RealDebrid");
const legacyExtractDir = path.join(legacyBaseDir, "_entpackt");
const legacyMkvLibraryDir = path.join(legacyBaseDir, "_mkv");
const isUntouchedLegacyConfiguration = samePath(settings.outputDir, legacyBaseDir)
&& samePath(settings.extractDir, legacyExtractDir)
&& samePath(settings.mkvLibraryDir, legacyMkvLibraryDir);
if (!isUntouchedLegacyConfiguration) {
return settings;
}
return {
...settings,
outputDir: defaults.outputDir,
extractDir: defaults.extractDir,
mkvLibraryDir: defaults.mkvLibraryDir
};
}
const DEFAULT_COLUMN_ORDER = ["name", "size", "progress", "hoster", "account", "prio", "status", "speed"];
const ALL_VALID_COLUMNS = new Set([...DEFAULT_COLUMN_ORDER, "added"]);
@@ -344,6 +375,7 @@ function migrateUpdateRepo(raw: string, fallback: string): string {
export function normalizeSettings(settings: AppSettings): AppSettings {
const defaults = defaultSettings();
const directorySettings = migrateLegacyDefaultDirectories(settings, defaults);
const currentUsageDay = getProviderUsageDayKey();
const megaLogin = asText(settings.megaLogin);
const megaPassword = asText(settings.megaPassword);
@@ -419,15 +451,15 @@ export function normalizeSettings(settings: AppSettings): AppSettings {
providerSecondary: normalizeFallbackProvider(settings.providerSecondary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled),
providerTertiary: normalizeFallbackProvider(settings.providerTertiary, megaDebridPreferApi, megaDebridApiEnabled, megaDebridWebEnabled),
autoProviderFallback: Boolean(settings.autoProviderFallback),
outputDir: normalizeAbsoluteDir(settings.outputDir, defaults.outputDir),
outputDir: normalizeAbsoluteDir(directorySettings.outputDir, defaults.outputDir),
packageName: asText(settings.packageName),
autoExtract: Boolean(settings.autoExtract),
autoRename4sf4sj: Boolean(settings.autoRename4sf4sj),
keepGermanAudioOnly: Boolean(settings.keepGermanAudioOnly),
germanAudioMode: settings.germanAudioMode === "first" ? "first" : "tag",
extractDir: normalizeAbsoluteDir(settings.extractDir, defaults.extractDir),
extractDir: normalizeAbsoluteDir(directorySettings.extractDir, defaults.extractDir),
collectMkvToLibrary: Boolean(settings.collectMkvToLibrary),
mkvLibraryDir: normalizeAbsoluteDir(settings.mkvLibraryDir, defaults.mkvLibraryDir),
mkvLibraryDir: normalizeAbsoluteDir(directorySettings.mkvLibraryDir, defaults.mkvLibraryDir),
createExtractSubfolder: Boolean(settings.createExtractSubfolder),
hybridExtract: Boolean(settings.hybridExtract),
cleanupMode: settings.cleanupMode,
+39
View File
@@ -17,6 +17,45 @@ afterEach(() => {
});
describe("settings storage", () => {
it("defaults download directories to the desktop project folder", () => {
const baseDir = path.join(os.homedir(), "Desktop", "Multi-Debrid-Downloader");
const defaults = defaultSettings();
expect(defaults.outputDir).toBe(baseDir);
expect(defaults.extractDir).toBe(path.join(baseDir, "_entpackt"));
expect(defaults.mkvLibraryDir).toBe(path.join(baseDir, "_mkv"));
});
it("migrates an untouched legacy directory configuration", () => {
const legacyBaseDir = path.join(os.homedir(), "Downloads", "RealDebrid");
const normalized = normalizeSettings({
...defaultSettings(),
outputDir: legacyBaseDir,
extractDir: path.join(legacyBaseDir, "_entpackt"),
mkvLibraryDir: path.join(legacyBaseDir, "_mkv")
});
const defaults = defaultSettings();
expect(normalized.outputDir).toBe(defaults.outputDir);
expect(normalized.extractDir).toBe(defaults.extractDir);
expect(normalized.mkvLibraryDir).toBe(defaults.mkvLibraryDir);
});
it("keeps custom directory choices during legacy migration", () => {
const legacyBaseDir = path.join(os.homedir(), "Downloads", "RealDebrid");
const customOutputDir = path.join(os.homedir(), "Videos", "Custom-Downloads");
const normalized = normalizeSettings({
...defaultSettings(),
outputDir: customOutputDir,
extractDir: path.join(legacyBaseDir, "_entpackt"),
mkvLibraryDir: path.join(legacyBaseDir, "_mkv")
});
expect(normalized.outputDir).toBe(customOutputDir);
expect(normalized.extractDir).toBe(path.join(legacyBaseDir, "_entpackt"));
expect(normalized.mkvLibraryDir).toBe(path.join(legacyBaseDir, "_mkv"));
});
it("does not persist provider credentials when rememberToken is disabled", () => {
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "rd-store-"));
tempDirs.push(dir);