mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-14 11:51:47 +00:00
fix: add back butterchurn
This commit is contained in:
@ -191,8 +191,13 @@ const defaultConfig = {
|
|||||||
},
|
},
|
||||||
'visualizer': {
|
'visualizer': {
|
||||||
enabled: false,
|
enabled: false,
|
||||||
type: 'vudio',
|
type: 'butterchurn',
|
||||||
// Config per visualizer
|
// Config per visualizer
|
||||||
|
butterchurn: {
|
||||||
|
preset: 'martin [shadow harlequins shape code] - fata morgana',
|
||||||
|
renderingFrequencyInMs: 500,
|
||||||
|
blendTimeInSeconds: 2.7,
|
||||||
|
},
|
||||||
vudio: {
|
vudio: {
|
||||||
effect: 'lighting',
|
effect: 'lighting',
|
||||||
accuracy: 128,
|
accuracy: 128,
|
||||||
|
|||||||
63
package-lock.json
generated
63
package-lock.json
generated
@ -16,6 +16,8 @@
|
|||||||
"@foobar404/wave": "2.0.4",
|
"@foobar404/wave": "2.0.4",
|
||||||
"@xhayper/discord-rpc": "1.0.22",
|
"@xhayper/discord-rpc": "1.0.22",
|
||||||
"async-mutex": "0.4.0",
|
"async-mutex": "0.4.0",
|
||||||
|
"butterchurn": "2.6.7",
|
||||||
|
"butterchurn-presets": "2.4.7",
|
||||||
"conf": "10.2.0",
|
"conf": "10.2.0",
|
||||||
"custom-electron-prompt": "1.5.7",
|
"custom-electron-prompt": "1.5.7",
|
||||||
"custom-electron-titlebar": "4.1.6",
|
"custom-electron-titlebar": "4.1.6",
|
||||||
@ -250,6 +252,22 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@babel/runtime": {
|
||||||
|
"version": "7.22.15",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz",
|
||||||
|
"integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==",
|
||||||
|
"dependencies": {
|
||||||
|
"regenerator-runtime": "^0.14.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@babel/runtime/node_modules/regenerator-runtime": {
|
||||||
|
"version": "0.14.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
|
||||||
|
"integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
|
||||||
|
},
|
||||||
"node_modules/@cliqz/adblocker": {
|
"node_modules/@cliqz/adblocker": {
|
||||||
"version": "1.26.7--canary.50688cf.0",
|
"version": "1.26.7--canary.50688cf.0",
|
||||||
"resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.7--canary.50688cf.0.tgz",
|
"resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.26.7--canary.50688cf.0.tgz",
|
||||||
@ -2315,6 +2333,20 @@
|
|||||||
"proxy-from-env": "^1.1.0"
|
"proxy-from-env": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/babel-runtime": {
|
||||||
|
"version": "6.26.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
|
||||||
|
"integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
|
||||||
|
"dependencies": {
|
||||||
|
"core-js": "^2.4.0",
|
||||||
|
"regenerator-runtime": "^0.11.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/babel-runtime/node_modules/regenerator-runtime": {
|
||||||
|
"version": "0.11.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
|
||||||
|
"integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
|
||||||
|
},
|
||||||
"node_modules/balanced-match": {
|
"node_modules/balanced-match": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||||
@ -2560,6 +2592,25 @@
|
|||||||
"node": ">=10.16.0"
|
"node": ">=10.16.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/butterchurn": {
|
||||||
|
"version": "2.6.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/butterchurn/-/butterchurn-2.6.7.tgz",
|
||||||
|
"integrity": "sha512-BJiRA8L0L2+84uoG2SSfkp0kclBuN+vQKf217pK7pMlwEO2ZEg3MtO2/o+l8Qpr8Nbejg8tmL1ZHD1jmhiaaqg==",
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/runtime": "^7.0.0",
|
||||||
|
"ecma-proposal-math-extensions": "0.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/butterchurn-presets": {
|
||||||
|
"version": "2.4.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/butterchurn-presets/-/butterchurn-presets-2.4.7.tgz",
|
||||||
|
"integrity": "sha512-4MdM8ripz/VfH1BCldrIKdAc/1ryJFBDvqlyow6Ivo1frwj0H3duzvSMFC7/wIjAjxb1QpwVHVqGqS9uAFKhpg==",
|
||||||
|
"dependencies": {
|
||||||
|
"babel-runtime": "^6.26.0",
|
||||||
|
"ecma-proposal-math-extensions": "0.0.2",
|
||||||
|
"lodash": "^4.17.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/cacache": {
|
"node_modules/cacache": {
|
||||||
"version": "17.1.4",
|
"version": "17.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz",
|
||||||
@ -3063,6 +3114,13 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/core-js": {
|
||||||
|
"version": "2.6.12",
|
||||||
|
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
|
||||||
|
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
|
||||||
|
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
|
||||||
|
"hasInstallScript": true
|
||||||
|
},
|
||||||
"node_modules/core-util-is": {
|
"node_modules/core-util-is": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||||
@ -3626,6 +3684,11 @@
|
|||||||
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
|
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/ecma-proposal-math-extensions": {
|
||||||
|
"version": "0.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ecma-proposal-math-extensions/-/ecma-proposal-math-extensions-0.0.2.tgz",
|
||||||
|
"integrity": "sha512-80BnDp2Fn7RxXlEr5HHZblniY4aQ97MOAicdWWpSo0vkQiISSE9wLR4SqxKsu4gCtXFBIPPzy8JMhay4NWRg/Q=="
|
||||||
|
},
|
||||||
"node_modules/ejs": {
|
"node_modules/ejs": {
|
||||||
"version": "3.1.9",
|
"version": "3.1.9",
|
||||||
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
|
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
|
||||||
|
|||||||
@ -138,6 +138,8 @@
|
|||||||
"@foobar404/wave": "2.0.4",
|
"@foobar404/wave": "2.0.4",
|
||||||
"@xhayper/discord-rpc": "1.0.22",
|
"@xhayper/discord-rpc": "1.0.22",
|
||||||
"async-mutex": "0.4.0",
|
"async-mutex": "0.4.0",
|
||||||
|
"butterchurn": "2.6.7",
|
||||||
|
"butterchurn-presets": "2.4.7",
|
||||||
"conf": "10.2.0",
|
"conf": "10.2.0",
|
||||||
"custom-electron-prompt": "1.5.7",
|
"custom-electron-prompt": "1.5.7",
|
||||||
"custom-electron-titlebar": "4.1.6",
|
"custom-electron-titlebar": "4.1.6",
|
||||||
|
|||||||
53
plugins/visualizer/butterchurn.d.ts
vendored
Normal file
53
plugins/visualizer/butterchurn.d.ts
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
declare module 'butterchurn' {
|
||||||
|
interface VisualizerOptions {
|
||||||
|
width?: number;
|
||||||
|
height?: number;
|
||||||
|
meshWidth?: number;
|
||||||
|
meshHeight?: number;
|
||||||
|
pixelRatio?: number;
|
||||||
|
textureRatio?: number;
|
||||||
|
outputFXAA?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Visualizer {
|
||||||
|
constructor(audioContext: AudioContext, canvas: HTMLCanvasElement, opts: ButterchurnOptions);
|
||||||
|
loseGLContext(): void;
|
||||||
|
connectAudio(audioNode: AudioNode): void;
|
||||||
|
disconnectAudio(audioNode: AudioNode): void;
|
||||||
|
static overrideDefaultVars(baseValsDefaults: unknown, baseVals: unknown): unknown;
|
||||||
|
createQVars(): Record<string, WebAssembly.Global>;
|
||||||
|
createTVars(): Record<string, WebAssembly.Global>;
|
||||||
|
createPerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||||
|
createPerPixelPool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||||
|
createCustomShapePerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||||
|
createCustomWavePerFramePool(baseVals: unknown): Record<string, WebAssembly.Global>;
|
||||||
|
static makeShapeResetPool(pool: Record<string, WebAssembly.Global>, variables: string[], idx: number): Record<string, WebAssembly.Global>;
|
||||||
|
static base64ToArrayBuffer(base64: string): ArrayBuffer;
|
||||||
|
loadPreset(presetMap: unknown, blendTime?: number): Promise<void>;
|
||||||
|
async loadWASMPreset(preset: unknown, blendTime: number): Promise<void>;
|
||||||
|
loadJSPreset(preset: unknown, blendTime: number): void;
|
||||||
|
loadExtraImages(imageData: unknown): void;
|
||||||
|
setRendererSize(width: number, height: number, opts?: VisualizerOptions): void;
|
||||||
|
setInternalMeshSize(width: number, height: number): void;
|
||||||
|
setOutputAA(useAA: boolean): void;
|
||||||
|
setCanvas(canvas: HTMLCanvasElement): void;
|
||||||
|
render(opts?: VisualizerOptions): unknown;
|
||||||
|
launchSongTitleAnim(text: string): void;
|
||||||
|
toDataURL(): string;
|
||||||
|
warpBufferToDataURL(): string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ButterchurnOptions {
|
||||||
|
width?: number;
|
||||||
|
height?: number;
|
||||||
|
onlyUseWASM?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class Butterchurn {
|
||||||
|
static createVisualizer(audioContext: AudioContext, canvas: HTMLCanvasElement, options?: ButterchurnOptions): Visualizer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module 'butterchurn-presets' {
|
||||||
|
export function getPresets(): Record<string, unknown>;
|
||||||
|
}
|
||||||
@ -2,6 +2,7 @@ import { Visualizer } from './visualizers/visualizer';
|
|||||||
|
|
||||||
import vudio from './visualizers/vudio';
|
import vudio from './visualizers/vudio';
|
||||||
import wave from './visualizers/wave';
|
import wave from './visualizers/wave';
|
||||||
|
import butterchurn from './visualizers/butterchurn';
|
||||||
|
|
||||||
import defaultConfig from '../../config/defaults';
|
import defaultConfig from '../../config/defaults';
|
||||||
|
|
||||||
@ -15,7 +16,12 @@ export default (options: ConfigType<'visualizer'>) => {
|
|||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
let visualizerType: { new(...args: any[]): Visualizer<unknown> } = vudio;
|
let visualizerType: { new(...args: any[]): Visualizer<unknown> } = vudio;
|
||||||
if (optionsWithDefaults.type === 'wave') visualizerType = wave;
|
|
||||||
|
if (optionsWithDefaults.type === 'wave') {
|
||||||
|
visualizerType = wave;
|
||||||
|
} else if (optionsWithDefaults.type === 'butterchurn') {
|
||||||
|
visualizerType = butterchurn;
|
||||||
|
}
|
||||||
|
|
||||||
document.addEventListener(
|
document.addEventListener(
|
||||||
'audioCanPlay',
|
'audioCanPlay',
|
||||||
|
|||||||
63
plugins/visualizer/visualizers/butterchurn.ts
Normal file
63
plugins/visualizer/visualizers/butterchurn.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import Butterchurn from 'butterchurn';
|
||||||
|
import ButterchurnPresets from 'butterchurn-presets';
|
||||||
|
|
||||||
|
import { Visualizer } from './visualizer';
|
||||||
|
|
||||||
|
import { ConfigType } from '../../../config/dynamic';
|
||||||
|
|
||||||
|
const presets = ButterchurnPresets.getPresets();
|
||||||
|
|
||||||
|
class ButterchurnVisualizer extends Visualizer<Butterchurn> {
|
||||||
|
visualizer: ReturnType<typeof Butterchurn.createVisualizer>;
|
||||||
|
private readonly renderingFrequencyInMs: number;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
audioContext: AudioContext,
|
||||||
|
audioSource: MediaElementAudioSourceNode,
|
||||||
|
visualizerContainer: HTMLElement,
|
||||||
|
canvas: HTMLCanvasElement,
|
||||||
|
audioNode: GainNode,
|
||||||
|
stream: MediaStream,
|
||||||
|
options: ConfigType<'visualizer'>,
|
||||||
|
) {
|
||||||
|
super(
|
||||||
|
audioContext,
|
||||||
|
audioSource,
|
||||||
|
visualizerContainer,
|
||||||
|
canvas,
|
||||||
|
audioNode,
|
||||||
|
stream,
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
|
||||||
|
this.visualizer = Butterchurn.createVisualizer(
|
||||||
|
audioContext,
|
||||||
|
canvas,
|
||||||
|
{
|
||||||
|
width: canvas.width,
|
||||||
|
height: canvas.height,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const preset = presets[options.butterchurn.preset];
|
||||||
|
this.visualizer.loadPreset(preset, options.butterchurn.blendTimeInSeconds);
|
||||||
|
|
||||||
|
this.visualizer.connectAudio(audioNode);
|
||||||
|
|
||||||
|
this.renderingFrequencyInMs = options.butterchurn.renderingFrequencyInMs;
|
||||||
|
}
|
||||||
|
|
||||||
|
resize(width: number, height: number) {
|
||||||
|
this.visualizer.setRendererSize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const renderVisualizer = () => {
|
||||||
|
requestAnimationFrame(renderVisualizer);
|
||||||
|
this.visualizer.render();
|
||||||
|
};
|
||||||
|
setTimeout(renderVisualizer, this.renderingFrequencyInMs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ButterchurnVisualizer;
|
||||||
Reference in New Issue
Block a user