feat: initialize electron main and preload scripts
This commit is contained in:
@@ -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;
|
||||
});
|
||||
+11
@@ -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')
|
||||
});
|
||||
Reference in New Issue
Block a user