mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 10:31:47 +00:00
feat: add auto-importer for menu
This commit is contained in:
@ -12,6 +12,7 @@ export default defineConfig({
|
|||||||
plugins: [
|
plugins: [
|
||||||
viteResolve({
|
viteResolve({
|
||||||
'virtual:MainPlugins': pluginVirtualModuleGenerator('back'),
|
'virtual:MainPlugins': pluginVirtualModuleGenerator('back'),
|
||||||
|
'virtual:MenuPlugins': pluginVirtualModuleGenerator('menu'),
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
publicDir: 'assets',
|
publicDir: 'assets',
|
||||||
|
|||||||
42
src/menu.ts
42
src/menu.ts
@ -7,21 +7,9 @@ import config from './config';
|
|||||||
import { startingPages } from './providers/extracted-data';
|
import { startingPages } from './providers/extracted-data';
|
||||||
import promptOptions from './providers/prompt-options';
|
import promptOptions from './providers/prompt-options';
|
||||||
|
|
||||||
import adblockerMenu from './plugins/adblocker/menu';
|
// eslint-disable-next-line import/order
|
||||||
import ambientModeMenu from './plugins/ambient-mode/menu';
|
import { pluginList as menuList } from 'virtual:MenuPlugins';
|
||||||
import captionsSelectorMenu from './plugins/captions-selector/menu';
|
|
||||||
import crossfadeMenu from './plugins/crossfade/menu';
|
|
||||||
import disableAutoplayMenu from './plugins/disable-autoplay/menu';
|
|
||||||
import discordMenu from './plugins/discord/menu';
|
|
||||||
import downloaderMenu from './plugins/downloader/menu';
|
|
||||||
import inAppMenuTitlebarMenu from './plugins/in-app-menu/menu';
|
|
||||||
import lyricsGeniusMenu from './plugins/lyrics-genius/menu';
|
|
||||||
import notificationsMenu from './plugins/notifications/menu';
|
|
||||||
import pictureInPictureMenu from './plugins/picture-in-picture/menu';
|
|
||||||
import preciseVolumeMenu from './plugins/precise-volume/menu';
|
|
||||||
import shortcutsMenu from './plugins/shortcuts/menu';
|
|
||||||
import videoToggleMenu from './plugins/video-toggle/menu';
|
|
||||||
import visualizerMenu from './plugins/visualizer/menu';
|
|
||||||
import { getAvailablePluginNames } from './plugins/utils';
|
import { getAvailablePluginNames } from './plugins/utils';
|
||||||
|
|
||||||
export type MenuTemplate = Electron.MenuItemConstructorOptions[];
|
export type MenuTemplate = Electron.MenuItemConstructorOptions[];
|
||||||
@ -31,24 +19,6 @@ const inAppMenuActive = config.plugins.isEnabled('in-app-menu');
|
|||||||
|
|
||||||
const betaPlugins = ['crossfade', 'lumiastream'];
|
const betaPlugins = ['crossfade', 'lumiastream'];
|
||||||
|
|
||||||
const pluginMenus = {
|
|
||||||
'adblocker': adblockerMenu,
|
|
||||||
'ambient-mode': ambientModeMenu,
|
|
||||||
'disable-autoplay': disableAutoplayMenu,
|
|
||||||
'captions-selector': captionsSelectorMenu,
|
|
||||||
'crossfade': crossfadeMenu,
|
|
||||||
'discord': discordMenu,
|
|
||||||
'downloader': downloaderMenu,
|
|
||||||
'in-app-menu': inAppMenuTitlebarMenu,
|
|
||||||
'lyrics-genius': lyricsGeniusMenu,
|
|
||||||
'notifications': notificationsMenu,
|
|
||||||
'picture-in-picture': pictureInPictureMenu,
|
|
||||||
'precise-volume': preciseVolumeMenu,
|
|
||||||
'shortcuts': shortcutsMenu,
|
|
||||||
'video-toggle': videoToggleMenu,
|
|
||||||
'visualizer': visualizerMenu,
|
|
||||||
};
|
|
||||||
|
|
||||||
const pluginEnabledMenu = (plugin: string, label = '', hasSubmenu = false, refreshMenu: (() => void ) | undefined = undefined): Electron.MenuItemConstructorOptions => ({
|
const pluginEnabledMenu = (plugin: string, label = '', hasSubmenu = false, refreshMenu: (() => void ) | undefined = undefined): Electron.MenuItemConstructorOptions => ({
|
||||||
label: label || plugin,
|
label: label || plugin,
|
||||||
type: 'checkbox',
|
type: 'checkbox',
|
||||||
@ -86,8 +56,8 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => {
|
|||||||
pluginLabel += ' [beta]';
|
pluginLabel += ' [beta]';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.hasOwn(pluginMenus, pluginName)) {
|
if (Object.hasOwn(menuList, pluginName)) {
|
||||||
const getPluginMenu = pluginMenus[pluginName as keyof typeof pluginMenus];
|
const getPluginMenu = menuList[pluginName];
|
||||||
|
|
||||||
if (!config.plugins.isEnabled(pluginName)) {
|
if (!config.plugins.isEnabled(pluginName)) {
|
||||||
return pluginEnabledMenu(pluginName, pluginLabel, true, innerRefreshMenu);
|
return pluginEnabledMenu(pluginName, pluginLabel, true, innerRefreshMenu);
|
||||||
@ -98,7 +68,7 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => {
|
|||||||
submenu: [
|
submenu: [
|
||||||
pluginEnabledMenu(pluginName, 'Enabled', true, innerRefreshMenu),
|
pluginEnabledMenu(pluginName, 'Enabled', true, innerRefreshMenu),
|
||||||
{ type: 'separator' },
|
{ type: 'separator' },
|
||||||
...getPluginMenu(win, config.plugins.getOptions(pluginName), innerRefreshMenu),
|
...(getPluginMenu(win, config.plugins.getOptions(pluginName), innerRefreshMenu) as MenuTemplate),
|
||||||
],
|
],
|
||||||
} satisfies Electron.MenuItemConstructorOptions;
|
} satisfies Electron.MenuItemConstructorOptions;
|
||||||
}
|
}
|
||||||
|
|||||||
8
src/virtual-module.d.ts
vendored
8
src/virtual-module.d.ts
vendored
@ -5,6 +5,14 @@ declare module 'virtual:MainPlugins' {
|
|||||||
export const pluginList: Record<string, (win: BrowserWindow, options: ConfigType) => Promise<void>>;
|
export const pluginList: Record<string, (win: BrowserWindow, options: ConfigType) => Promise<void>>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare module 'virtual:MenuPlugins' {
|
||||||
|
import type { BrowserWindow } from 'electron';
|
||||||
|
import type { MenuTemplate } from './menu';
|
||||||
|
import type { ConfigType } from './config/dynamic';
|
||||||
|
|
||||||
|
export const pluginList: Record<string, (win: BrowserWindow, options: ConfigType, refreshMenu: () => void) => MenuTemplate>;
|
||||||
|
}
|
||||||
|
|
||||||
declare module 'virtual:PreloadPlugins' {
|
declare module 'virtual:PreloadPlugins' {
|
||||||
export const pluginList: Record<string, () => Promise<void>>;
|
export const pluginList: Record<string, () => Promise<void>>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import { globSync } from 'glob';
|
|||||||
|
|
||||||
const snakeToCamel = (text: string) => text.replace(/-(\w)/g, (_, letter: string) => letter.toUpperCase());
|
const snakeToCamel = (text: string) => text.replace(/-(\w)/g, (_, letter: string) => letter.toUpperCase());
|
||||||
|
|
||||||
export const pluginVirtualModuleGenerator = (mode: 'back' | 'preload' | 'front') => {
|
export const pluginVirtualModuleGenerator = (mode: 'back' | 'preload' | 'front' | 'menu') => {
|
||||||
const srcPath = resolve(__dirname, '..', 'src');
|
const srcPath = resolve(__dirname, '..', 'src');
|
||||||
|
|
||||||
const plugins = globSync(`${srcPath}/plugins/*`)
|
const plugins = globSync(`${srcPath}/plugins/*`)
|
||||||
|
|||||||
Reference in New Issue
Block a user