preload.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const { contextBridge, ipcRenderer } = require('electron')
  2. // Expose protected methods that allow the renderer process to use
  3. // the ipcRenderer without exposing the entire object
  4. contextBridge.exposeInMainWorld('electronAPI', {
  5. // File system operations
  6. selectSaveDirectory: () => ipcRenderer.invoke('select-save-directory'),
  7. selectCookieFile: () => ipcRenderer.invoke('select-cookie-file'),
  8. createDirectory: (dirPath) => ipcRenderer.invoke('create-directory', dirPath),
  9. // Desktop notifications and dialogs
  10. showNotification: (options) => ipcRenderer.invoke('show-notification', options),
  11. showErrorDialog: (options) => ipcRenderer.invoke('show-error-dialog', options),
  12. showInfoDialog: (options) => ipcRenderer.invoke('show-info-dialog', options),
  13. // Binary management
  14. checkBinaryVersions: () => ipcRenderer.invoke('check-binary-versions'),
  15. checkBinaryDependencies: () => ipcRenderer.invoke('check-binary-dependencies'),
  16. // Video operations
  17. downloadVideo: (options) => ipcRenderer.invoke('download-video', options),
  18. getVideoMetadata: (url) => ipcRenderer.invoke('get-video-metadata', url),
  19. getBatchVideoMetadata: (urls) => ipcRenderer.invoke('get-batch-video-metadata', urls),
  20. extractPlaylistVideos: (playlistUrl) => ipcRenderer.invoke('extract-playlist-videos', playlistUrl),
  21. // Format conversion operations
  22. cancelConversion: (conversionId) => ipcRenderer.invoke('cancel-conversion', conversionId),
  23. cancelAllConversions: () => ipcRenderer.invoke('cancel-all-conversions'),
  24. getActiveConversions: () => ipcRenderer.invoke('get-active-conversions'),
  25. // Download manager operations
  26. getDownloadStats: () => ipcRenderer.invoke('get-download-stats'),
  27. cancelDownload: (videoId) => ipcRenderer.invoke('cancel-download', videoId),
  28. cancelAllDownloads: () => ipcRenderer.invoke('cancel-all-downloads'),
  29. // Event listeners for download progress with enhanced data
  30. onDownloadProgress: (callback) => {
  31. const wrappedCallback = (event, progressData) => {
  32. // Ensure callback receives consistent progress data structure
  33. const enhancedData = {
  34. url: progressData.url,
  35. progress: progressData.progress || 0,
  36. status: progressData.status || 'downloading',
  37. stage: progressData.stage || 'download',
  38. message: progressData.message || null
  39. }
  40. callback(event, enhancedData)
  41. }
  42. ipcRenderer.on('download-progress', wrappedCallback)
  43. // Return cleanup function
  44. return () => {
  45. ipcRenderer.removeListener('download-progress', wrappedCallback)
  46. }
  47. },
  48. removeDownloadProgressListener: (callback) => {
  49. ipcRenderer.removeListener('download-progress', callback)
  50. },
  51. // App info
  52. getAppVersion: () => process.env.npm_package_version || '2.1.0',
  53. getPlatform: () => process.platform
  54. })