[bugfix]: properly clean up MPV on quit, use pid for socket (#627)

* fix cleanup

* don't delete file if windows
This commit is contained in:
Kendall Garner 2024-07-03 08:36:01 +00:00 committed by GitHub
parent 4191edb88c
commit d57b4b4b68
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,4 +1,6 @@
import console from 'console'; import console from 'console';
import { rm } from 'fs/promises';
import { pid } from 'node:process';
import { app, ipcMain } from 'electron'; import { app, ipcMain } from 'electron';
import uniq from 'lodash/uniq'; import uniq from 'lodash/uniq';
import MpvAPI from 'node-mpv'; import MpvAPI from 'node-mpv';
@ -18,6 +20,7 @@ declare module 'node-mpv';
// } // }
let mpvInstance: MpvAPI | null = null; let mpvInstance: MpvAPI | null = null;
const socketPath = isWindows() ? `\\\\.\\pipe\\mpvserver-${pid}` : `/tmp/node-mpv-${pid}.sock`;
const NodeMpvErrorCode = { const NodeMpvErrorCode = {
0: 'Unable to load file or stream', 0: 'Unable to load file or stream',
@ -62,7 +65,6 @@ const mpvLog = (
}; };
const MPV_BINARY_PATH = store.get('mpv_path') as string | undefined; const MPV_BINARY_PATH = store.get('mpv_path') as string | undefined;
const isDevelopment = process.env.NODE_ENV === 'development' || process.env.DEBUG_PROD === 'true';
const prefetchPlaylistParams = [ const prefetchPlaylistParams = [
'--prefetch-playlist=no', '--prefetch-playlist=no',
@ -89,14 +91,12 @@ const createMpv = async (data: {
const params = uniq([...DEFAULT_MPV_PARAMETERS(extraParameters), ...(extraParameters || [])]); const params = uniq([...DEFAULT_MPV_PARAMETERS(extraParameters), ...(extraParameters || [])]);
const extra = isDevelopment ? '-dev' : '';
const mpv = new MpvAPI( const mpv = new MpvAPI(
{ {
audio_only: true, audio_only: true,
auto_restart: false, auto_restart: false,
binary: binaryPath || MPV_BINARY_PATH || undefined, binary: binaryPath || MPV_BINARY_PATH || undefined,
socket: isWindows() ? `\\\\.\\pipe\\mpvserver${extra}` : `/tmp/node-mpv${extra}.sock`, socket: socketPath,
time_update: 1, time_update: 1,
}, },
params, params,
@ -149,6 +149,16 @@ export const getMpvInstance = () => {
return mpvInstance; return mpvInstance;
}; };
const quit = async () => {
const instance = getMpvInstance();
if (instance) {
await instance.quit();
if (!isWindows()) {
await rm(socketPath);
}
}
};
const setAudioPlayerFallback = (isError: boolean) => { const setAudioPlayerFallback = (isError: boolean) => {
getMainWindow()?.webContents.send('renderer-player-fallback', isError); getMainWindow()?.webContents.send('renderer-player-fallback', isError);
}; };
@ -216,7 +226,7 @@ ipcMain.handle(
ipcMain.on('player-quit', async () => { ipcMain.on('player-quit', async () => {
try { try {
await getMpvInstance()?.stop(); await getMpvInstance()?.stop();
await getMpvInstance()?.quit(); await quit();
} catch (err: NodeMpvError | any) { } catch (err: NodeMpvError | any) {
mpvLog({ action: 'Failed to quit mpv' }, err); mpvLog({ action: 'Failed to quit mpv' }, err);
} finally { } finally {
@ -412,19 +422,34 @@ ipcMain.handle('player-get-time', async (): Promise<number | undefined> => {
} }
}); });
app.on('before-quit', async () => { enum MpvState {
try { STARTED,
await getMpvInstance()?.stop(); IN_PROGRESS,
await getMpvInstance()?.quit(); DONE,
} catch (err: NodeMpvError | any) { }
mpvLog({ action: `Failed to cleanly before-quit` }, err);
}
});
app.on('window-all-closed', async () => { let mpvState = MpvState.STARTED;
try {
await getMpvInstance()?.quit(); app.on('before-quit', async (event) => {
} catch (err: NodeMpvError | any) { switch (mpvState) {
mpvLog({ action: `Failed to cleanly exit` }, err); case MpvState.DONE:
return;
case MpvState.IN_PROGRESS:
event.preventDefault();
break;
case MpvState.STARTED: {
try {
mpvState = MpvState.IN_PROGRESS;
event.preventDefault();
await getMpvInstance()?.stop();
await quit();
} catch (err: NodeMpvError | any) {
mpvLog({ action: `Failed to cleanly before-quit` }, err);
} finally {
mpvState = MpvState.DONE;
app.quit();
}
break;
}
} }
}); });