mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 18:41:47 +00:00
* feat(music-together): test `peerjs` * feat(music-together): replace `prompt` to `custom-electron-prompt` * fix(music-together): fix * test fix * wow * test * feat(music-together): improve `onStart` * fix: adblocker * fix(adblock): fix crash with `peerjs` * feat(music-together): add host UI * feat(music-together): implement addSong, removeSong, syncQueue * feat(music-together): inject panel * feat(music-together): redesign music together panel * feat(music-together): sync queue, profile * feat(music-together): sync progress, song, state * fix(music-together): fix some bug * fix(music-together): fix sync queue * feat(music-together): support i18n * feat(music-together): improve sync queue * feat(music-together): add profile in music item * refactor(music-together): refactor structure * feat(music-together): add permission * fix(music-together): fix queue sync bug * fix(music-together): fix some bugs * fix(music-together): fix permission not working on guest mode * fix(music-together): fix queue sync relate bugs * fix(music-together): fix automix items not append using music together * fix(music-together): fix * feat(music-together): improve video injection * fix(music-together): fix injection code * fix(music-together): fix broadcast guest * feat(music-together): add more permission * fix(music-together): fix injector * fix(music-together): fix guest add song logic * feat(music-together): add popup close listener * fix(music-together): fix connection issue * fix(music-together): fix connection issue 2 * feat(music-together): reserve playlist * fix(music-together): exclude automix songs * fix(music-together): fix playlist index sync bug * fix(music-together): fix connection failed error and sync index * fix(music-together): fix host set index bug * fix: apply fix from eslint * feat(util): add `ImageElementFromSrc` * chore(util): update jsdoc * feat(music-together): add owner name * chore(music-together): add translation * feat(music-together): add progress sync * chore(music-together): remove `console.log` --------- Co-authored-by: JellyBrick <shlee1503@naver.com>
134 lines
3.7 KiB
TypeScript
134 lines
3.7 KiB
TypeScript
import { contextBridge, webFrame } from 'electron';
|
|
|
|
import { blockers } from './types';
|
|
import { createPlugin } from '@/utils';
|
|
import {
|
|
isBlockerEnabled,
|
|
loadAdBlockerEngine,
|
|
unloadAdBlockerEngine,
|
|
} from './blocker';
|
|
|
|
import injectCliqzPreload from './injectors/inject-cliqz-preload';
|
|
import { inject, isInjected } from './injectors/inject';
|
|
|
|
import { t } from '@/i18n';
|
|
|
|
import type { BrowserWindow } from 'electron';
|
|
|
|
interface AdblockerConfig {
|
|
/**
|
|
* Whether to enable the adblocker.
|
|
* @default true
|
|
*/
|
|
enabled: boolean;
|
|
/**
|
|
* When enabled, the adblocker will cache the blocklists.
|
|
* @default true
|
|
*/
|
|
cache: boolean;
|
|
/**
|
|
* Which adblocker to use.
|
|
* @default blockers.InPlayer
|
|
*/
|
|
blocker: (typeof blockers)[keyof typeof blockers];
|
|
/**
|
|
* Additional list of filters to use.
|
|
* @example ["https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt"]
|
|
* @default []
|
|
*/
|
|
additionalBlockLists: string[];
|
|
/**
|
|
* Disable the default blocklists.
|
|
* @default false
|
|
*/
|
|
disableDefaultLists: boolean;
|
|
}
|
|
|
|
export default createPlugin({
|
|
name: () => t('plugins.adblocker.name'),
|
|
description: () => t('plugins.adblocker.description'),
|
|
restartNeeded: false,
|
|
config: {
|
|
enabled: true,
|
|
cache: true,
|
|
blocker: blockers.InPlayer,
|
|
additionalBlockLists: [],
|
|
disableDefaultLists: false,
|
|
} as AdblockerConfig,
|
|
menu: async ({ getConfig, setConfig }) => {
|
|
const config = await getConfig();
|
|
|
|
return [
|
|
{
|
|
label: t('plugins.adblocker.menu.blocker'),
|
|
submenu: Object.values(blockers).map((blocker) => ({
|
|
label: blocker,
|
|
type: 'radio',
|
|
checked: (config.blocker || blockers.WithBlocklists) === blocker,
|
|
click() {
|
|
setConfig({ blocker });
|
|
},
|
|
})),
|
|
},
|
|
];
|
|
},
|
|
backend: {
|
|
mainWindow: null as BrowserWindow | null,
|
|
async start({ getConfig, window }) {
|
|
const config = await getConfig();
|
|
this.mainWindow = window;
|
|
|
|
if (config.blocker === blockers.WithBlocklists) {
|
|
await loadAdBlockerEngine(
|
|
window.webContents.session,
|
|
config.cache,
|
|
config.additionalBlockLists,
|
|
config.disableDefaultLists,
|
|
);
|
|
}
|
|
},
|
|
stop({ window }) {
|
|
if (isBlockerEnabled(window.webContents.session)) {
|
|
unloadAdBlockerEngine(window.webContents.session);
|
|
}
|
|
},
|
|
async onConfigChange(newConfig) {
|
|
if (this.mainWindow) {
|
|
if (
|
|
newConfig.blocker === blockers.WithBlocklists &&
|
|
!isBlockerEnabled(this.mainWindow.webContents.session)
|
|
) {
|
|
await loadAdBlockerEngine(
|
|
this.mainWindow.webContents.session,
|
|
newConfig.cache,
|
|
newConfig.additionalBlockLists,
|
|
newConfig.disableDefaultLists,
|
|
);
|
|
}
|
|
}
|
|
},
|
|
},
|
|
preload: {
|
|
script: 'window.JSON.parse = window._proxyJsonParse; window._proxyJsonParse = undefined; window.Response.prototype.json = window._proxyResponseJson; window._proxyResponseJson = undefined; 0',
|
|
async start({ getConfig }) {
|
|
const config = await getConfig();
|
|
|
|
if (config.blocker === blockers.WithBlocklists) {
|
|
// Preload adblocker to inject scripts/styles
|
|
await injectCliqzPreload();
|
|
} else if (config.blocker === blockers.InPlayer && !isInjected()) {
|
|
inject(contextBridge);
|
|
await webFrame.executeJavaScript(this.script);
|
|
}
|
|
},
|
|
async onConfigChange(newConfig) {
|
|
if (newConfig.blocker === blockers.WithBlocklists) {
|
|
await injectCliqzPreload();
|
|
} else if (newConfig.blocker === blockers.InPlayer && !isInjected()) {
|
|
inject(contextBridge);
|
|
await webFrame.executeJavaScript(this.script);
|
|
}
|
|
},
|
|
},
|
|
});
|