[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:
parent
4191edb88c
commit
d57b4b4b68
1 changed files with 43 additions and 18 deletions
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Reference in a new issue