MovieMapper/main.js

173 lines
4.9 KiB
JavaScript

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();
}
});