feat: 播放器核心集成;MediaSession集成

This commit is contained in:
lqtmcstudio
2026-02-02 21:27:48 +08:00
parent 9fc08c59d7
commit 6965858ae3
8 changed files with 286 additions and 75 deletions

View File

@@ -2,6 +2,7 @@ import { app, BrowserWindow, Menu, ipcMain } from 'electron'
import { createRequire } from 'node:module'
import { fileURLToPath } from 'node:url'
import path from 'node:path'
import { MpvController } from './mpvController'
// @ts-ignore
const require = createRequire(import.meta.url)
@@ -16,6 +17,7 @@ export const RENDERER_DIST = path.join(process.env.APP_ROOT, 'dist')
process.env.VITE_PUBLIC = VITE_DEV_SERVER_URL ? path.join(process.env.APP_ROOT, 'public') : RENDERER_DIST
let win: BrowserWindow | null
let mpv: MpvController | null
// === Electron 窗口逻辑 ===
@@ -23,14 +25,14 @@ function createWindow() {
win = new BrowserWindow({
frame: false,
minWidth: 950,
minHeight: 700,
minHeight: 800,
width: 1000,
height: 800,
icon: path.join(process.env.VITE_PUBLIC, 'electron-vite.svg'),
webPreferences: {
preload: path.join(__dirname, 'preload.mjs'),
nodeIntegration: false,
contextIsolation: true,
// nodeIntegration: false,
// contextIsolation: true,
},
})
@@ -54,6 +56,23 @@ ipcMain.on('window-maximize', () => win?.isMaximized() ? win.unmaximize() : win?
ipcMain.on('window-close', () => win?.close())
ipcMain.handle('window-is-maximized', () => win?.isMaximized() || false)
// --- MPV IPC Handlers ---
ipcMain.handle('mpv-command', async (_, command: any[]) => {
if (mpv) {
mpv.send(command)
}
})
// Quick Helpers
ipcMain.handle('mpv-load', (_, url) => mpv?.load(url))
ipcMain.handle('mpv-play', () => mpv?.play())
ipcMain.handle('mpv-pause', () => mpv?.pause())
ipcMain.handle('mpv-toggle-pause', () => mpv?.togglePause())
ipcMain.handle('mpv-stop', () => mpv?.stop())
ipcMain.handle('mpv-set-volume', (e, vol) => mpv?.setVolume(vol))
ipcMain.handle('mpv-seek', (_, time) => mpv?.seek(time))
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
@@ -61,6 +80,12 @@ app.on('window-all-closed', () => {
}
})
app.on('will-quit', () => {
if (mpv) {
mpv.destroy()
}
})
function registerZoomShortcuts(win: BrowserWindow) {
win.webContents.on('before-input-event', (event, input) => {
if (input.control || input.meta) {
@@ -92,4 +117,15 @@ app.on('activate', () => {
app.whenReady().then(() => {
Menu.setApplicationMenu(null)
createWindow()
// Start MPV
mpv = new MpvController()
mpv.start()
mpv.on('event', (data) => {
// Forward MPV events to Render Process
if (win && !win.isDestroyed()) {
win.webContents.send('mpv-event', data)
}
})
})

View File

@@ -6,4 +6,16 @@ contextBridge.exposeInMainWorld('electronAPI', {
maximizeWindow: () => ipcRenderer.send('window-maximize'),
closeWindow: () => ipcRenderer.send('window-close'),
isMaximized: () => ipcRenderer.invoke('window-is-maximized'),
// MPV Control
mpv: {
load: (url: string) => ipcRenderer.invoke('mpv-load', url),
play: () => ipcRenderer.invoke('mpv-play'),
pause: () => ipcRenderer.invoke('mpv-pause'),
togglePause: () => ipcRenderer.invoke('mpv-toggle-pause'),
stop: () => ipcRenderer.invoke('mpv-stop'),
setVolume: (vol: number) => ipcRenderer.invoke('mpv-set-volume', vol),
seek: (time: number) => ipcRenderer.invoke('mpv-seek', time),
onEvent: (callback: (event: any, data: any) => void) => ipcRenderer.on('mpv-event', callback)
}
})