124 lines
3.2 KiB
JavaScript
124 lines
3.2 KiB
JavaScript
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: false, // Make window frameless
|
|
webPreferences: {
|
|
preload: path.join(__dirname, 'preload.js'),
|
|
contextIsolation: true,
|
|
nodeIntegration: false
|
|
},
|
|
show: false
|
|
});
|
|
|
|
const { Menu } = require('electron');
|
|
Menu.setApplicationMenu(null); // Hide the default menu bar
|
|
|
|
mainWindow.loadFile(path.join(__dirname, 'src', 'index.html'));
|
|
|
|
// Open devtools if needed in development
|
|
// mainWindow.webContents.openDevTools();
|
|
|
|
mainWindow.once('ready-to-show', () => {
|
|
mainWindow.show();
|
|
});
|
|
}
|
|
|
|
// IPC Handlers for custom titlebar controls
|
|
ipcMain.on('window-minimize', () => {
|
|
if (mainWindow) mainWindow.minimize();
|
|
});
|
|
|
|
ipcMain.on('window-close', () => {
|
|
if (mainWindow) mainWindow.close();
|
|
});
|
|
|
|
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, browser }) => {
|
|
try {
|
|
const info = await downloader.getVideoInfo(url, browser);
|
|
return { success: true, info };
|
|
} catch (error) {
|
|
return { success: false, error: error.message };
|
|
}
|
|
});
|
|
|
|
// IPC Handler: Download Media
|
|
ipcMain.handle('download-media', async (event, { items, browser }) => {
|
|
try {
|
|
const stats = await downloader.downloadMedia(items, selectedOutputDir, browser, (progressData) => {
|
|
if (mainWindow) {
|
|
mainWindow.webContents.send('download-progress', progressData);
|
|
}
|
|
});
|
|
return { success: true, stats };
|
|
} catch (error) {
|
|
return { success: false, error: error.message };
|
|
}
|
|
});
|
|
|
|
// IPC Handler: Open Path in File Explorer
|
|
ipcMain.handle('open-path', async (event, folderPath) => {
|
|
try {
|
|
const { shell } = require('electron');
|
|
await shell.openPath(folderPath);
|
|
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;
|
|
});
|