This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
import path from "node:path";
|
||||
import { app } from "electron";
|
||||
import { AddLinksPayload, AppSettings, ParsedPackageInput, UiSnapshot } from "../shared/types";
|
||||
import { AddLinksPayload, AppSettings, ParsedPackageInput, UiSnapshot, UpdateCheckResult } from "../shared/types";
|
||||
import { importDlcContainers } from "./container";
|
||||
import { APP_VERSION, defaultSettings } from "./constants";
|
||||
import { DownloadManager } from "./download-manager";
|
||||
import { parseCollectorInput } from "./link-parser";
|
||||
import { configureLogger, logger } from "./logger";
|
||||
import { createStoragePaths, emptySession, loadSession, loadSettings, saveSettings } from "./storage";
|
||||
import { checkGitHubUpdate } from "./update";
|
||||
|
||||
export class AppController {
|
||||
private settings: AppSettings;
|
||||
@@ -64,6 +65,10 @@ export class AppController {
|
||||
return this.settings;
|
||||
}
|
||||
|
||||
public async checkUpdates(): Promise<UpdateCheckResult> {
|
||||
return checkGitHubUpdate(this.settings.updateRepo);
|
||||
}
|
||||
|
||||
public addLinks(payload: AddLinksPayload): { addedPackages: number; addedLinks: number; invalidCount: number } {
|
||||
const parsed = parseCollectorInput(payload.rawText, payload.packageName || this.settings.packageName);
|
||||
if (parsed.length === 0) {
|
||||
|
||||
@@ -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.14";
|
||||
export const APP_VERSION = "1.1.15";
|
||||
export const API_BASE_URL = "https://api.real-debrid.com/rest/1.0";
|
||||
|
||||
export const DCRYPT_UPLOAD_URL = "https://dcrypt.it/decrypt/upload";
|
||||
|
||||
@@ -40,6 +40,7 @@ function createWindow(): BrowserWindow {
|
||||
function registerIpcHandlers(): void {
|
||||
ipcMain.handle(IPC_CHANNELS.GET_SNAPSHOT, () => controller.getSnapshot());
|
||||
ipcMain.handle(IPC_CHANNELS.GET_VERSION, () => controller.getVersion());
|
||||
ipcMain.handle(IPC_CHANNELS.CHECK_UPDATES, async () => controller.checkUpdates());
|
||||
ipcMain.handle(IPC_CHANNELS.UPDATE_SETTINGS, (_event: IpcMainInvokeEvent, partial: Partial<AppSettings>) => controller.updateSettings(partial ?? {}));
|
||||
ipcMain.handle(IPC_CHANNELS.ADD_LINKS, (_event: IpcMainInvokeEvent, payload: AddLinksPayload) => controller.addLinks(payload));
|
||||
ipcMain.handle(IPC_CHANNELS.ADD_CONTAINERS, async (_event: IpcMainInvokeEvent, filePaths: string[]) => controller.addContainers(filePaths ?? []));
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
import { APP_VERSION, DEFAULT_UPDATE_REPO } from "./constants";
|
||||
import { UpdateCheckResult } from "../shared/types";
|
||||
import { compactErrorText } from "./utils";
|
||||
|
||||
function parseVersionParts(version: string): number[] {
|
||||
const cleaned = version.replace(/^v/i, "").trim();
|
||||
return cleaned.split(".").map((part) => Number(part.replace(/[^0-9].*$/, "") || "0"));
|
||||
}
|
||||
|
||||
function isRemoteNewer(currentVersion: string, latestVersion: string): boolean {
|
||||
const current = parseVersionParts(currentVersion);
|
||||
const latest = parseVersionParts(latestVersion);
|
||||
const maxLen = Math.max(current.length, latest.length);
|
||||
for (let i = 0; i < maxLen; i += 1) {
|
||||
const a = current[i] ?? 0;
|
||||
const b = latest[i] ?? 0;
|
||||
if (b > a) {
|
||||
return true;
|
||||
}
|
||||
if (b < a) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export async function checkGitHubUpdate(repo: string): Promise<UpdateCheckResult> {
|
||||
const safeRepo = (repo || DEFAULT_UPDATE_REPO).trim() || DEFAULT_UPDATE_REPO;
|
||||
const fallback: UpdateCheckResult = {
|
||||
updateAvailable: false,
|
||||
currentVersion: APP_VERSION,
|
||||
latestVersion: APP_VERSION,
|
||||
latestTag: `v${APP_VERSION}`,
|
||||
releaseUrl: `https://github.com/${safeRepo}/releases/latest`
|
||||
};
|
||||
|
||||
try {
|
||||
const response = await fetch(`https://api.github.com/repos/${safeRepo}/releases/latest`, {
|
||||
headers: {
|
||||
Accept: "application/vnd.github+json",
|
||||
"User-Agent": "RD-Node-Downloader/1.1.14"
|
||||
}
|
||||
});
|
||||
const payload = await response.json().catch(() => null) as Record<string, unknown> | null;
|
||||
if (!response.ok || !payload) {
|
||||
const reason = String((payload?.message as string) || `HTTP ${response.status}`);
|
||||
return { ...fallback, error: reason };
|
||||
}
|
||||
|
||||
const latestTag = String(payload.tag_name || `v${APP_VERSION}`).trim();
|
||||
const latestVersion = latestTag.replace(/^v/i, "") || APP_VERSION;
|
||||
const releaseUrl = String(payload.html_url || fallback.releaseUrl);
|
||||
|
||||
return {
|
||||
updateAvailable: isRemoteNewer(APP_VERSION, latestVersion),
|
||||
currentVersion: APP_VERSION,
|
||||
latestVersion,
|
||||
latestTag,
|
||||
releaseUrl
|
||||
};
|
||||
} catch (error) {
|
||||
return {
|
||||
...fallback,
|
||||
error: compactErrorText(error)
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user