mirror of
https://github.com/jeffvli/feishin.git
synced 2026-06-14 23:44:01 +02:00
prevent desktopCaturer from running unless visualizer explicitly requested (#1931)
This commit is contained in:
@@ -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
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user