prevent desktopCaturer from running unless visualizer explicitly requested (#1931)

This commit is contained in:
jeffvli
2026-05-20 20:34:25 -07:00
parent 4008c8dfdf
commit 3551ee5077
6 changed files with 66 additions and 1 deletions
+1
View File
@@ -4,3 +4,4 @@ import './player';
import './remote'; import './remote';
import './settings'; import './settings';
import './discord-rpc'; import './discord-rpc';
import './visualizer';
@@ -0,0 +1,30 @@
import { ipcMain } from 'electron';
import { getMpvInstance } from '../player';
import { store } from '../settings';
import { PlayerType } from '/@/shared/types/types';
let isLocalVisualizerSurfaceVisible = false;
export const setLocalVisualizerSurfaceVisible = (visible: boolean) => {
isLocalVisualizerSurfaceVisible = visible;
};
export const canHandleVisualizerDisplayMedia = (): boolean => {
const playbackType = store.get('playbackType', PlayerType.WEB) as PlayerType;
if (playbackType !== PlayerType.LOCAL) {
return false;
}
if (!isLocalVisualizerSurfaceVisible) {
return false;
}
return Boolean(getMpvInstance()?.isRunning());
};
ipcMain.on('visualizer-set-local-surface-visible', (_event, visible: boolean) => {
setLocalVisualizerSurfaceVisible(Boolean(visible));
});
+7 -1
View File
@@ -30,7 +30,9 @@ import packageJson from '../../package.json';
import { disableMediaKeys, enableMediaKeys } from './features/core/player/media-keys'; import { disableMediaKeys, enableMediaKeys } from './features/core/player/media-keys';
import { shutdownServer } from './features/core/remote'; import { shutdownServer } from './features/core/remote';
import { store } from './features/core/settings'; import { store } from './features/core/settings';
import { canHandleVisualizerDisplayMedia } from './features/core/visualizer';
import MenuBuilder, { MenuPlaybackState } from './menu'; import MenuBuilder, { MenuPlaybackState } from './menu';
import './features';
import { import {
autoUpdaterLogInterface, autoUpdaterLogInterface,
createLog, createLog,
@@ -40,7 +42,6 @@ import {
isMacOS, isMacOS,
isWindows, isWindows,
} from './utils'; } from './utils';
import './features';
import { PlayerRepeat, PlayerStatus, PlayerType, TitleTheme } from '/@/shared/types/types'; import { PlayerRepeat, PlayerStatus, PlayerType, TitleTheme } from '/@/shared/types/types';
@@ -734,6 +735,11 @@ async function createWindow(first = true): Promise<void> {
}); });
mainWindow.webContents.session.setDisplayMediaRequestHandler((_request, callback) => { mainWindow.webContents.session.setDisplayMediaRequestHandler((_request, callback) => {
if (!canHandleVisualizerDisplayMedia()) {
callback({});
return;
}
if (!isMacOS()) { if (!isMacOS()) {
callback({ audio: 'loopback' }); callback({ audio: 'loopback' });
return; return;
+2
View File
@@ -11,6 +11,7 @@ import { mpris } from './mpris';
import { mpvPlayer, mpvPlayerListener } from './mpv-player'; import { mpvPlayer, mpvPlayerListener } from './mpv-player';
import { remote } from './remote'; import { remote } from './remote';
import { utils } from './utils'; import { utils } from './utils';
import { visualizer } from './visualizer';
// Custom APIs for renderer // Custom APIs for renderer
const api = { const api = {
@@ -25,6 +26,7 @@ const api = {
mpvPlayerListener, mpvPlayerListener,
remote, remote,
utils, utils,
visualizer,
}; };
export type PreloadApi = typeof api; export type PreloadApi = typeof api;
+11
View File
@@ -0,0 +1,11 @@
import { ipcRenderer } from 'electron';
const setLocalSurfaceVisible = (visible: boolean) => {
ipcRenderer.send('visualizer-set-local-surface-visible', visible);
};
export const visualizer = {
setLocalSurfaceVisible,
};
export type VisualizerApi = typeof visualizer;
@@ -21,6 +21,21 @@ type PromptState = 'loading' | { consent: boolean };
export function VisualizerSystemAudioBridgeHook() { export function VisualizerSystemAudioBridgeHook() {
const playbackType = usePlaybackType(); const playbackType = usePlaybackType();
const isVisualizerSurfaceVisible = useIsLocalVisualizerSurfaceVisible();
useEffect(() => {
if (!isElectron()) {
return;
}
const shouldReportVisible = playbackType === PlayerType.LOCAL && isVisualizerSurfaceVisible;
window.api.visualizer.setLocalSurfaceVisible(shouldReportVisible);
return () => {
window.api.visualizer.setLocalSurfaceVisible(false);
};
}, [playbackType, isVisualizerSurfaceVisible]);
if (!isElectron() || playbackType !== PlayerType.LOCAL) { if (!isElectron() || playbackType !== PlayerType.LOCAL) {
return null; return null;