From 2925eb58fe531bb94ba79239fa44c47449e9eb89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Cmit=20Tun=C3=A7?= Date: Tue, 5 May 2026 14:30:00 +0300 Subject: [PATCH] feat: initialize electron main and preload scripts --- main.js | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ preload.js | 11 ++++++ 2 files changed, 112 insertions(+) create mode 100644 main.js create mode 100644 preload.js diff --git a/main.js b/main.js new file mode 100644 index 0000000..5269344 --- /dev/null +++ b/main.js @@ -0,0 +1,101 @@ +const { app, BrowserWindow, ipcMain, dialog } = require('electron'); +const path = require('path'); +const fs = require('fs'); +const downloader = require('./utils/downloader'); + +let mainWindow; +let selectedOutputDir = app.getPath('downloads'); + +function createWindow() { + mainWindow = new BrowserWindow({ + width: 900, + height: 700, + minWidth: 800, + minHeight: 600, + frame: true, // We can use frame: true, but let's make it styled inside the HTML with gorgeous glassmorphism! + title: 'VibeDownloader - Premium YouTube & MP3 Downloader', + webPreferences: { + preload: path.join(__dirname, 'preload.js'), + contextIsolation: true, + nodeIntegration: false + }, + show: false + }); + + mainWindow.loadFile(path.join(__dirname, 'src', 'index.html')); + + // Open devtools if needed in development + // mainWindow.webContents.openDevTools(); + + mainWindow.once('ready-to-show', () => { + mainWindow.show(); + }); +} + +app.whenReady().then(() => { + createWindow(); + + app.on('activate', () => { + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); + +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') app.quit(); +}); + +// IPC Handler: Dependency Check +ipcMain.handle('check-dependencies', async () => { + try { + await downloader.checkDependencies((message, progress) => { + if (mainWindow) { + mainWindow.webContents.send('dependency-status', { message, progress }); + } + }); + return { success: true }; + } catch (error) { + return { success: false, error: error.message }; + } +}); + +// IPC Handler: Get Video Details +ipcMain.handle('get-video-info', async (event, url) => { + try { + const info = await downloader.getVideoInfo(url); + return { success: true, info }; + } catch (error) { + return { success: false, error: error.message }; + } +}); + +// IPC Handler: Download Media +ipcMain.handle('download-media', async (event, { url, format }) => { + try { + await downloader.downloadMedia(url, format, selectedOutputDir, (percent, status) => { + if (mainWindow) { + mainWindow.webContents.send('download-progress', { percent, status }); + } + }); + return { success: true }; + } catch (error) { + return { success: false, error: error.message }; + } +}); + +// IPC Handler: Select Output Directory +ipcMain.handle('select-directory', async () => { + const result = await dialog.showOpenDialog(mainWindow, { + properties: ['openDirectory'], + defaultPath: selectedOutputDir + }); + if (!result.canceled && result.filePaths.length > 0) { + selectedOutputDir = result.filePaths[0]; + return selectedOutputDir; + } + return selectedOutputDir; +}); + +// IPC Handler: Get Default Downloads Folder +ipcMain.handle('get-downloads-folder', () => { + return selectedOutputDir; +}); diff --git a/preload.js b/preload.js new file mode 100644 index 0000000..efe87c6 --- /dev/null +++ b/preload.js @@ -0,0 +1,11 @@ +const { contextBridge, ipcRenderer } = require('electron'); + +contextBridge.exposeInMainWorld('api', { + checkDependencies: () => ipcRenderer.invoke('check-dependencies'), + onDependencyStatus: (callback) => ipcRenderer.on('dependency-status', (_, data) => callback(data)), + getVideoInfo: (url) => ipcRenderer.invoke('get-video-info', url), + downloadMedia: (url, format) => ipcRenderer.invoke('download-media', { url, format }), + onDownloadProgress: (callback) => ipcRenderer.on('download-progress', (_, data) => callback(data)), + selectDirectory: () => ipcRenderer.invoke('select-directory'), + getDownloadsFolder: () => ipcRenderer.invoke('get-downloads-folder') +});