forked from miao-moe/QZMusic_PC
feat: 播放器核心集成;MediaSession集成
This commit is contained in:
@@ -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)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user