diff --git a/src/index.ts b/src/index.ts index 3c40562b..95174336 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,7 +13,7 @@ import { parse } from 'node-html-parser'; import config from './config'; import { refreshMenu, setApplicationMenu } from './menu'; -import { fileExists, injectCSS, injectCSSAsFile } from './plugins/utils'; +import { fileExists, injectCSS, injectCSSAsFile } from './plugins/utils/main'; import { isTesting } from './utils/testing'; import { setUpTray } from './tray'; import { setupSongInfo } from './providers/song-info'; diff --git a/src/menu.ts b/src/menu.ts index 7a6436a1..51f733d2 100644 --- a/src/menu.ts +++ b/src/menu.ts @@ -10,7 +10,7 @@ import promptOptions from './providers/prompt-options'; // eslint-disable-next-line import/order import { pluginList as menuList } from 'virtual:MenuPlugins'; -import { getAvailablePluginNames } from './plugins/utils'; +import { getAvailablePluginNames } from './plugins/utils/main'; export type MenuTemplate = Electron.MenuItemConstructorOptions[]; diff --git a/src/plugins/album-color-theme/back.ts b/src/plugins/album-color-theme/back.ts index e82da6b8..1d313bf0 100644 --- a/src/plugins/album-color-theme/back.ts +++ b/src/plugins/album-color-theme/back.ts @@ -2,7 +2,7 @@ import { BrowserWindow } from 'electron'; import style from './style.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; export default (win: BrowserWindow) => { injectCSS(win.webContents, style); diff --git a/src/plugins/ambient-mode/back.ts b/src/plugins/ambient-mode/back.ts index 4a4c9e31..ab1bb380 100644 --- a/src/plugins/ambient-mode/back.ts +++ b/src/plugins/ambient-mode/back.ts @@ -3,7 +3,7 @@ import { BrowserWindow } from 'electron'; import config from './config'; import style from './style.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; export default (win: BrowserWindow) => { config.subscribeAll((newConfig) => { diff --git a/src/plugins/blur-nav-bar/back.ts b/src/plugins/blur-nav-bar/back.ts index e82da6b8..1d313bf0 100644 --- a/src/plugins/blur-nav-bar/back.ts +++ b/src/plugins/blur-nav-bar/back.ts @@ -2,7 +2,7 @@ import { BrowserWindow } from 'electron'; import style from './style.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; export default (win: BrowserWindow) => { injectCSS(win.webContents, style); diff --git a/src/plugins/captions-selector/front.ts b/src/plugins/captions-selector/front.ts index 492ac2c4..cd4c0833 100644 --- a/src/plugins/captions-selector/front.ts +++ b/src/plugins/captions-selector/front.ts @@ -2,7 +2,7 @@ import configProvider from './config-renderer'; import CaptionsSettingsButtonHTML from './templates/captions-settings-template.html?raw'; -import { ElementFromHtml } from '../utils-renderer'; +import { ElementFromHtml } from '../utils/renderer'; import { YoutubePlayer } from '../../types/youtube-player'; import type { ConfigType } from '../../config/dynamic'; diff --git a/src/plugins/downloader/back.ts b/src/plugins/downloader/back.ts index f48372f6..bcd6fb05 100644 --- a/src/plugins/downloader/back.ts +++ b/src/plugins/downloader/back.ts @@ -35,7 +35,7 @@ import style from './style.css'; import { fetchFromGenius } from '../lyrics-genius/back'; import { isEnabled } from '../../config/plugins'; import { cleanupName, getImage, SongInfo } from '../../providers/song-info'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; import { cache } from '../../providers/decorators'; import type { FormatOptions } from 'youtubei.js/dist/src/types/FormatUtils'; diff --git a/src/plugins/downloader/front.ts b/src/plugins/downloader/front.ts index 1b450819..5c6bcd50 100644 --- a/src/plugins/downloader/front.ts +++ b/src/plugins/downloader/front.ts @@ -2,7 +2,7 @@ import downloadHTML from './templates/download.html?raw'; import defaultConfig from '../../config/defaults'; import { getSongMenu } from '../../providers/dom-elements'; -import { ElementFromHtml } from '../utils-renderer'; +import { ElementFromHtml } from '../utils/renderer'; import { getSongInfo } from '../../providers/song-info-front'; let menu: Element | null = null; diff --git a/src/plugins/in-app-menu/back.ts b/src/plugins/in-app-menu/back.ts index 02658704..a97177cd 100644 --- a/src/plugins/in-app-menu/back.ts +++ b/src/plugins/in-app-menu/back.ts @@ -4,7 +4,7 @@ import { BrowserWindow, Menu, MenuItem, ipcMain, nativeImage } from 'electron'; import titlebarStyle from './titlebar.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; // Tracks menu visibility export default (win: BrowserWindow) => { diff --git a/src/plugins/in-app-menu/menu/panel.ts b/src/plugins/in-app-menu/menu/panel.ts index 18bd39f7..16bdeae7 100644 --- a/src/plugins/in-app-menu/menu/panel.ts +++ b/src/plugins/in-app-menu/menu/panel.ts @@ -1,6 +1,6 @@ import Icons from './icons'; -import { ElementFromHtml } from '../../utils-renderer'; +import { ElementFromHtml } from '../../utils/renderer'; import type { MenuItem } from 'electron'; diff --git a/src/plugins/lyrics-genius/back.ts b/src/plugins/lyrics-genius/back.ts index dad2000a..d8b58371 100644 --- a/src/plugins/lyrics-genius/back.ts +++ b/src/plugins/lyrics-genius/back.ts @@ -7,7 +7,7 @@ import { GetGeniusLyric } from './types'; import { cleanupName, SongInfo } from '../../providers/song-info'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; import type { ConfigType } from '../../config/dynamic'; diff --git a/src/plugins/navigation/back.ts b/src/plugins/navigation/back.ts index baecc244..51dceb4c 100644 --- a/src/plugins/navigation/back.ts +++ b/src/plugins/navigation/back.ts @@ -2,7 +2,7 @@ import { BrowserWindow } from 'electron'; import style from './style.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; export function handle(win: BrowserWindow) { injectCSS(win.webContents, style, () => { diff --git a/src/plugins/navigation/front.ts b/src/plugins/navigation/front.ts index cc5c86b1..8cfcf45f 100644 --- a/src/plugins/navigation/front.ts +++ b/src/plugins/navigation/front.ts @@ -1,7 +1,7 @@ import forwardHTML from './templates/forward.html?raw'; import backHTML from './templates/back.html?raw'; -import { ElementFromHtml } from '../utils-renderer'; +import { ElementFromHtml } from '../utils/renderer'; export function run() { window.ipcRenderer.on('navigation-css-ready', () => { diff --git a/src/plugins/no-google-login/back.ts b/src/plugins/no-google-login/back.ts index e82da6b8..1d313bf0 100644 --- a/src/plugins/no-google-login/back.ts +++ b/src/plugins/no-google-login/back.ts @@ -2,7 +2,7 @@ import { BrowserWindow } from 'electron'; import style from './style.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; export default (win: BrowserWindow) => { injectCSS(win.webContents, style); diff --git a/src/plugins/notifications/interactive.ts b/src/plugins/notifications/interactive.ts index dd9c1082..df483f8b 100644 --- a/src/plugins/notifications/interactive.ts +++ b/src/plugins/notifications/interactive.ts @@ -7,7 +7,7 @@ import getSongControls from '../../providers/song-controls'; import registerCallback, { SongInfo } from '../../providers/song-info'; import { changeProtocolHandler } from '../../providers/protocol-handler'; import { setTrayOnClick, setTrayOnDoubleClick } from '../../tray'; -import { mediaIcons } from '../utils'; +import { mediaIcons } from '../../types/media-icons'; import playIcon from '../../../assets/media-icons-black/play.png?asset&asarUnpack'; import pauseIcon from '../../../assets/media-icons-black/pause.png?asset&asarUnpack'; diff --git a/src/plugins/picture-in-picture/back.ts b/src/plugins/picture-in-picture/back.ts index 11e59faf..e1fad077 100644 --- a/src/plugins/picture-in-picture/back.ts +++ b/src/plugins/picture-in-picture/back.ts @@ -2,7 +2,7 @@ import { app, BrowserWindow, ipcMain } from 'electron'; import style from './style.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; import { setOptions as setPluginOptions } from '../../config/plugins'; import type { ConfigType } from '../../config/dynamic'; diff --git a/src/plugins/picture-in-picture/front.ts b/src/plugins/picture-in-picture/front.ts index b152dd51..d75bf900 100644 --- a/src/plugins/picture-in-picture/front.ts +++ b/src/plugins/picture-in-picture/front.ts @@ -5,7 +5,7 @@ import pipHTML from './templates/picture-in-picture.html?raw'; import { getSongMenu } from '../../providers/dom-elements'; -import { ElementFromHtml } from '../utils-renderer'; +import { ElementFromHtml } from '../utils/renderer'; import type { ConfigType } from '../../config/dynamic'; diff --git a/src/plugins/playback-speed/front.ts b/src/plugins/playback-speed/front.ts index 7ff6a8f8..b105a589 100644 --- a/src/plugins/playback-speed/front.ts +++ b/src/plugins/playback-speed/front.ts @@ -1,7 +1,7 @@ import sliderHTML from './templates/slider.html?raw'; import { getSongMenu } from '../../providers/dom-elements'; -import { ElementFromHtml } from '../utils-renderer'; +import { ElementFromHtml } from '../utils/renderer'; import { singleton } from '../../providers/decorators'; diff --git a/src/plugins/precise-volume/back.ts b/src/plugins/precise-volume/back.ts index 07077e82..e161f4f2 100644 --- a/src/plugins/precise-volume/back.ts +++ b/src/plugins/precise-volume/back.ts @@ -2,7 +2,7 @@ import { globalShortcut, BrowserWindow } from 'electron'; import volumeHudStyle from './volume-hud.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; import type { ConfigType } from '../../config/dynamic'; diff --git a/src/plugins/quality-changer/front.ts b/src/plugins/quality-changer/front.ts index a936ae37..8f6982e0 100644 --- a/src/plugins/quality-changer/front.ts +++ b/src/plugins/quality-changer/front.ts @@ -1,6 +1,6 @@ import qualitySettingsTemplate from './templates/qualitySettingsTemplate.html?raw'; -import { ElementFromHtml } from '../utils-renderer'; +import { ElementFromHtml } from '../utils/renderer'; import { YoutubePlayer } from '../../types/youtube-player'; function $(selector: string): HTMLElement | null { diff --git a/src/plugins/taskbar-mediacontrol/back.ts b/src/plugins/taskbar-mediacontrol/back.ts index 5b9bbd18..17467734 100644 --- a/src/plugins/taskbar-mediacontrol/back.ts +++ b/src/plugins/taskbar-mediacontrol/back.ts @@ -2,7 +2,7 @@ import { BrowserWindow, nativeImage } from 'electron'; import getSongControls from '../../providers/song-controls'; import registerCallback, { SongInfo } from '../../providers/song-info'; -import { mediaIcons } from '../utils'; +import { mediaIcons } from '../../types/media-icons'; import playIcon from '../../../assets/media-icons-black/play.png?asset&asarUnpack'; import pauseIcon from '../../../assets/media-icons-black/pause.png?asset&asarUnpack'; diff --git a/src/plugins/utils.ts b/src/plugins/utils/main/css.ts similarity index 53% rename from src/plugins/utils.ts rename to src/plugins/utils/main/css.ts index 3124bb33..c7dd40cc 100644 --- a/src/plugins/utils.ts +++ b/src/plugins/utils/main/css.ts @@ -1,32 +1,5 @@ import fs from 'node:fs'; -import is from 'electron-is'; - -import defaultConfig from '../config/defaults'; - -export const mediaIcons = { - play: '\u{1405}', // ᐅ - pause: '\u{2016}', // ‖ - next: '\u{1433}', // ᐳ - previous: '\u{1438}', // ᐸ -} as const; - -export const fileExists = ( - path: fs.PathLike, - callbackIfExists: { (): void; (): void; (): void; }, - callbackIfError: (() => void) | undefined = undefined, -) => { - fs.access(path, fs.constants.F_OK, (error) => { - if (error) { - callbackIfError?.(); - - return; - } - - callbackIfExists(); - }); -}; - const cssToInject = new Map void) | undefined>(); const cssToInjectFile = new Map void) | undefined>(); export const injectCSS = (webContents: Electron.WebContents, css: string, cb: (() => void) | undefined = undefined) => { @@ -53,21 +26,8 @@ const setupCssInjection = (webContents: Electron.WebContents) => { }); cssToInjectFile.forEach(async (callback, filepath) => { - await webContents.insertCSS(fs.readFileSync(filepath, 'utf8')); + await webContents.insertCSS(fs.readFileSync(filepath, 'utf-8')); callback?.(); }); }); }; - -export const getAvailablePluginNames = () => { - return Object.keys(defaultConfig.plugins).filter((name) => { - if (is.windows() && name === 'touchbar') { - return false; - } else if (is.macOS() && name === 'taskbar-mediacontrol') { - return false; - } else if (is.linux() && (name === 'taskbar-mediacontrol' || name === 'touchbar')) { - return false; - } - return true; - }); -}; diff --git a/src/plugins/utils/main/fs.ts b/src/plugins/utils/main/fs.ts new file mode 100644 index 00000000..1e478796 --- /dev/null +++ b/src/plugins/utils/main/fs.ts @@ -0,0 +1,17 @@ +import fs from 'node:fs'; + +export const fileExists = ( + path: fs.PathLike, + callbackIfExists: { (): void; (): void; (): void; }, + callbackIfError: (() => void) | undefined = undefined, +) => { + fs.access(path, fs.constants.F_OK, (error) => { + if (error) { + callbackIfError?.(); + + return; + } + + callbackIfExists(); + }); +}; diff --git a/src/plugins/utils/main/index.ts b/src/plugins/utils/main/index.ts new file mode 100644 index 00000000..e185a90a --- /dev/null +++ b/src/plugins/utils/main/index.ts @@ -0,0 +1,3 @@ +export * from './css'; +export * from './fs'; +export * from './plugin'; diff --git a/src/plugins/utils/main/plugin.ts b/src/plugins/utils/main/plugin.ts new file mode 100644 index 00000000..4505e7ff --- /dev/null +++ b/src/plugins/utils/main/plugin.ts @@ -0,0 +1,16 @@ +import is from 'electron-is'; + +import defaultConfig from '../../../config/defaults'; + +export const getAvailablePluginNames = () => { + return Object.keys(defaultConfig.plugins).filter((name) => { + if (is.windows() && name === 'touchbar') { + return false; + } else if (is.macOS() && name === 'taskbar-mediacontrol') { + return false; + } else if (is.linux() && (name === 'taskbar-mediacontrol' || name === 'touchbar')) { + return false; + } + return true; + }); +}; diff --git a/src/plugins/utils-renderer.ts b/src/plugins/utils/renderer/html.ts similarity index 100% rename from src/plugins/utils-renderer.ts rename to src/plugins/utils/renderer/html.ts diff --git a/src/plugins/utils/renderer/index.ts b/src/plugins/utils/renderer/index.ts new file mode 100644 index 00000000..f7bfdd14 --- /dev/null +++ b/src/plugins/utils/renderer/index.ts @@ -0,0 +1 @@ +export * from './html'; diff --git a/src/plugins/video-toggle/back.ts b/src/plugins/video-toggle/back.ts index f4286eb1..ea53b948 100644 --- a/src/plugins/video-toggle/back.ts +++ b/src/plugins/video-toggle/back.ts @@ -3,7 +3,7 @@ import { BrowserWindow } from 'electron'; import forceHideStyle from './force-hide.css'; import buttonSwitcherStyle from './button-switcher.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; import type { ConfigType } from '../../config/dynamic'; diff --git a/src/plugins/video-toggle/front.ts b/src/plugins/video-toggle/front.ts index 033fb1de..7ddfb3c4 100644 --- a/src/plugins/video-toggle/front.ts +++ b/src/plugins/video-toggle/front.ts @@ -1,6 +1,6 @@ import buttonTemplate from './templates/button_template.html?raw'; -import { ElementFromHtml } from '../utils-renderer'; +import { ElementFromHtml } from '../utils/renderer'; import { moveVolumeHud as preciseVolumeMoveVolumeHud } from '../precise-volume/front'; diff --git a/src/plugins/visualizer/back.ts b/src/plugins/visualizer/back.ts index 99036b20..84123c6f 100644 --- a/src/plugins/visualizer/back.ts +++ b/src/plugins/visualizer/back.ts @@ -2,7 +2,7 @@ import { BrowserWindow } from 'electron'; import emptyPlayerStyle from './empty-player.css'; -import { injectCSS } from '../utils'; +import { injectCSS } from '../utils/main'; export default (win: BrowserWindow) => { injectCSS(win.webContents, emptyPlayerStyle); diff --git a/src/types/media-icons.ts b/src/types/media-icons.ts new file mode 100644 index 00000000..2617ee3f --- /dev/null +++ b/src/types/media-icons.ts @@ -0,0 +1,6 @@ +export const mediaIcons = { + play: '\u{1405}', // ᐅ + pause: '\u{2016}', // ‖ + next: '\u{1433}', // ᐳ + previous: '\u{1438}', // ᐸ +} as const;