const { app, BrowserWindow, dialog, ipcMain } = require('electron'); const path = require('path'); const { scanDirectory, extractFileMetadata } = require('./utils/fileUtils'); // Handle creating/removing shortcuts on Windows when installing/uninstalling. try { if (require('electron-squirrel-startup')) { app.quit(); } } catch (error) { // electron-squirrel-startup not available on non-Windows platforms console.log('electron-squirrel-startup not available (expected on non-Windows platforms)'); } let mainWindow; // Create the browser window. function createWindow() { mainWindow = new BrowserWindow({ width: 1200, height: 800, webPreferences: { nodeIntegration: true, contextIsolation: false, enableRemoteModule: true, }, }); // and load the index.html of the app. mainWindow.loadFile('index.html'); // Open the DevTools. // mainWindow.webContents.openDevTools(); } // IPC handler for selecting directory ipcMain.handle('select-directory', async () => { try { const result = await dialog.showOpenDialog({ properties: ['openDirectory'] }); if (result.canceled) { return { success: false, error: 'No directory selected' }; } return { success: true, directory: result.filePaths[0] }; } catch (error) { return { success: false, error: error.message }; } }); // IPC handler for scanning directory ipcMain.handle('scan-directory', async (event, directoryPath) => { try { if (!directoryPath) { return { success: false, error: 'No directory path provided' }; } const files = await scanDirectory(directoryPath); return { success: true, files: files }; } catch (error) { return { success: false, error: error.message }; } }); // Enhanced logging for debugging problematic files ipcMain.handle('log-file-info', async (event, filePath) => { try { const fs = require('fs'); const stats = fs.statSync(filePath); return { success: true, fileInfo: { path: filePath, size: stats.size, modified: stats.mtime, isFile: stats.isFile(), isDirectory: stats.isDirectory() } }; } catch (error) { return { success: false, error: error.message }; } }); // IPC handler for renaming file ipcMain.handle('rename-file', async (event, { oldPath, newName }) => { try { const fs = require('fs'); const newPath = path.join(path.dirname(oldPath), newName); // Check if file exists if (!fs.existsSync(oldPath)) { return { success: false, error: 'Original file does not exist' }; } // Check if new name is different if (oldPath === newPath) { return { success: true, message: 'File name unchanged' }; } // Rename the file fs.renameSync(oldPath, newPath); return { success: true, message: 'File renamed successfully' }; } catch (error) { return { success: false, error: error.message }; } }); // IPC handler for searching TVDB (placeholder) ipcMain.handle('search-tvdb', async (event, query) => { try { // This is a placeholder - in a real implementation, this would call TheTVDB API // For now, we'll return mock data to demonstrate the UI functionality const mockResults = [ { id: 1, seriesName: 'Breaking Bad' }, { id: 2, seriesName: 'Game of Thrones' }, { id: 3, seriesName: 'The Office' }, { id: 4, seriesName: 'Friends' }, { id: 5, seriesName: 'Stranger Things' } ]; // Filter results based on query const filteredResults = mockResults.filter(show => show.seriesName.toLowerCase().includes(query.toLowerCase()) ); return { success: true, results: filteredResults }; } catch (error) { return { success: false, error: error.message }; } }); // Test function to verify API connectivity ipcMain.handle('test-tvdb-api', async () => { try { // This is a placeholder test - in a real implementation, this would test actual API connectivity // For now, we'll simulate a successful API test return { success: true, message: 'TVDB API test successful', timestamp: new Date().toISOString() }; } catch (error) { return { success: false, error: error.message }; } }); // This method will be called when Electron has finished // initialization and is ready to create browser windows. app.whenReady().then(createWindow); // Quit when all windows are closed, except on macOS. There, it's common // for applications and their menu bar to stay active until the user quits // explicitly with Cmd + Q. app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { // On OS X it's common to re-create a window in the app when the // dock icon is clicked and there are no other windows open. if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } });