From 5ec19ef53ecf53113ce959caf25bbe05f3c8b7cd Mon Sep 17 00:00:00 2001 From: Administrator Date: Tue, 10 Mar 2026 02:34:07 +0100 Subject: [PATCH] feat: wire updater IPC into main process and preload --- main.js | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++- preload.js | 14 ++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/main.js b/main.js index dbaa686..2d33409 100644 --- a/main.js +++ b/main.js @@ -1,9 +1,11 @@ const { app, BrowserWindow, ipcMain, dialog, clipboard } = require('electron'); const path = require('path'); +const fs = require('fs'); const ConfigStore = require('./lib/config-store'); const UploadManager = require('./lib/upload-manager'); const { HOSTER_CONFIGS } = require('./lib/hosters'); const VidmolyUploader = require('./lib/vidmoly-upload'); +const { checkForUpdate, installUpdate, abortUpdate } = require('./lib/updater'); let mainWindow; const configStore = new ConfigStore(app); @@ -36,6 +38,24 @@ function normalizeApiError(payload, fallback) { return fallback; } +function getLogFilePath() { + // Next to the EXE when packaged, next to project root when dev + const baseDir = app.isPackaged + ? path.dirname(process.execPath) + : path.join(__dirname); + return path.join(baseDir, 'fileuploader.log'); +} + +function appendUploadLog(hoster, link, fileName) { + try { + const now = new Date(); + const pad = (n) => String(n).padStart(2, '0'); + const dateStr = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`; + const line = `${dateStr}|${hoster}|${link}||${fileName}|\n`; + fs.appendFileSync(getLogFilePath(), line, 'utf-8'); + } catch {} +} + async function checkDoodstreamHealth(hosterConfig) { const apiKey = hosterConfig && hosterConfig.apiKey ? String(hosterConfig.apiKey).trim() @@ -188,7 +208,18 @@ function createWindow() { mainWindow.loadFile(path.join(__dirname, 'renderer', 'index.html')); } -app.whenReady().then(createWindow); +app.whenReady().then(() => { + createWindow(); + // Auto-check for updates after 3 seconds + setTimeout(async () => { + try { + const result = await checkForUpdate(); + if (result && result.available && mainWindow && !mainWindow.isDestroyed()) { + mainWindow.webContents.send('app:update-available', result); + } + } catch {} + }, 3000); +}); app.on('window-all-closed', () => { app.quit(); @@ -261,6 +292,18 @@ ipcMain.handle('start-upload', (_event, payload) => { uploadManager.on('batch-done', (summary) => { configStore.appendHistory(summary); + // Write successful uploads to fileuploader.log + for (const file of summary.files || []) { + for (const result of file.results || []) { + if (result.status === 'done' && (result.download_url || result.embed_url)) { + appendUploadLog( + result.hoster || '', + result.download_url || result.embed_url || '', + file.name || '' + ); + } + } + } if (mainWindow && !mainWindow.isDestroyed()) { mainWindow.webContents.send('upload-batch-done', summary); } @@ -287,3 +330,33 @@ ipcMain.handle('copy-to-clipboard', (_event, text) => { clipboard.writeText(text); return true; }); + +ipcMain.handle('app:check-updates', async () => { + try { + return await checkForUpdate(); + } catch (err) { + return { available: false, error: err.message }; + } +}); + +ipcMain.handle('app:install-update', async () => { + try { + installUpdate((progress) => { + if (mainWindow && !mainWindow.isDestroyed()) { + mainWindow.webContents.send('app:update-progress', progress); + } + }); + return { started: true }; + } catch (err) { + return { error: err.message }; + } +}); + +ipcMain.handle('app:abort-update', () => { + abortUpdate(); + return true; +}); + +ipcMain.handle('app:get-version', () => { + return app.getVersion(); +}); diff --git a/preload.js b/preload.js index 7e372da..f533482 100644 --- a/preload.js +++ b/preload.js @@ -19,6 +19,18 @@ contextBridge.exposeInMainWorld('api', { // Clipboard copyToClipboard: (text) => ipcRenderer.invoke('copy-to-clipboard', text), + // Updates + checkForUpdate: () => ipcRenderer.invoke('app:check-updates'), + installUpdate: () => ipcRenderer.invoke('app:install-update'), + abortUpdate: () => ipcRenderer.invoke('app:abort-update'), + getVersion: () => ipcRenderer.invoke('app:get-version'), + onUpdateAvailable: (callback) => { + ipcRenderer.on('app:update-available', (_event, data) => callback(data)); + }, + onUpdateProgress: (callback) => { + ipcRenderer.on('app:update-progress', (_event, data) => callback(data)); + }, + // Events (main -> renderer) onUploadProgress: (callback) => { ipcRenderer.on('upload-progress', (_event, data) => callback(data)); @@ -29,5 +41,7 @@ contextBridge.exposeInMainWorld('api', { removeAllListeners: () => { ipcRenderer.removeAllListeners('upload-progress'); ipcRenderer.removeAllListeners('upload-batch-done'); + ipcRenderer.removeAllListeners('app:update-available'); + ipcRenderer.removeAllListeners('app:update-progress'); } });