use new dynamic config

This commit is contained in:
Araxeus
2023-03-19 23:47:55 +02:00
parent 648d102101
commit 2ad097c743
5 changed files with 127 additions and 112 deletions

View File

@ -108,7 +108,7 @@ const defaultConfig = {
enabled: false,
fadeInDuration: 1500, // ms
fadeOutDuration: 5000, // ms
exitMusicBeforeEnd: 10, // s
secondsBeforeEnd: 10, // s
fadeScaling: "linear", // 'linear', 'logarithmic' or a positive number in dB
},
visualizer: {

View File

@ -1,7 +1,9 @@
const { ipcMain } = require("electron");
const { Innertube } = require("youtubei.js");
module.exports = async (win, options) => {
require("./config");
module.exports = async () => {
const yt = await Innertube.create();
ipcMain.handle("audio-url", async (_, videoID) => {

View File

@ -0,0 +1,3 @@
const { PluginConfig } = require("../../config/dynamic");
const config = new PluginConfig("crossfade", { enableFront: true });
module.exports = { ...config };

View File

@ -1,32 +1,43 @@
const { ipcRenderer } = require("electron");
const { Howl } = require("howler");
const { ipcRenderer } = require('electron');
const { Howl } = require('howler');
// Extracted from https://github.com/bitfasching/VolumeFader
require("./fader");
require('./fader');
let transitionAudio; // Howler audio used to fade out the current music
let firstVideo = true;
let waitForTransition;
const config = require('../../config/defaults').plugins.crossfade;
const defaultConfig = require('../../config/defaults').plugins.crossfade;
const configProvider = require('./config');
let config = configProvider.getAll();
console.log({ config });
configProvider.subscribeAll((newConfig) => {
config = newConfig;
});
const configGetNum = (key) => Number(config[key]) || defaultConfig[key];
const getStreamURL = async (videoID) => {
const url = await ipcRenderer.invoke("audio-url", videoID);
const url = await ipcRenderer.invoke('audio-url', videoID);
return url;
};
const getVideoIDFromURL = (url) => {
return new URLSearchParams(url.split("?")?.at(-1)).get("v");
return new URLSearchParams(url.split('?')?.at(-1)).get('v');
};
const isReadyToCrossfade = () => {
return transitionAudio && transitionAudio.state() === "loaded";
return transitionAudio && transitionAudio.state() === 'loaded';
};
const watchVideoIDChanges = (cb) => {
navigation.addEventListener("navigate", (event) => {
navigation.addEventListener('navigate', (event) => {
const currentVideoID = getVideoIDFromURL(
event.currentTarget.currentEntry.url
event.currentTarget.currentEntry.url,
);
const nextVideoID = getVideoIDFromURL(event.destination.url);
@ -60,10 +71,11 @@ const createAudioForCrossfade = async (url) => {
};
const syncVideoWithTransitionAudio = async () => {
const video = document.querySelector("video");
const video = document.querySelector('video');
const videoFader = new VolumeFader(video, {
fadeScaling: config.fadeScaling,
fadeDuration: config.fadeInDuration,
fadeScaling: configGetNum('fadeScaling'),
fadeDuration: configGetNum('fadeInDuration'),
});
await transitionAudio.play();
@ -89,13 +101,13 @@ const syncVideoWithTransitionAudio = async () => {
const transitionBeforeEnd = () => {
if (
video.currentTime >=
video.duration - config.exitMusicBeforeEnd &&
video.duration - configGetNum('secondsBeforeEnd') &&
isReadyToCrossfade()
) {
video.removeEventListener("timeupdate", transitionBeforeEnd);
video.removeEventListener('timeupdate', transitionBeforeEnd);
// Go to next video - XXX: does not support "repeat 1" mode
document.querySelector(".next-button").click();
document.querySelector('.next-button').click();
}
};
video.ontimeupdate = transitionBeforeEnd;
@ -109,7 +121,7 @@ const onApiLoaded = () => {
});
};
const crossfade = (cb) => {
const crossfade = async (cb) => {
if (!isReadyToCrossfade()) {
cb();
return;
@ -120,12 +132,12 @@ const crossfade = (cb) => {
resolveTransition = resolve;
});
const video = document.querySelector("video");
const video = document.querySelector('video');
const fader = new VolumeFader(transitionAudio._sounds[0]._node, {
initialVolume: video.volume,
fadeScaling: config.fadeScaling,
fadeDuration: config.fadeOutDuration,
fadeScaling: configGetNum('fadeScaling'),
fadeDuration: configGetNum('fadeOutDuration'),
});
// Fade out the music
@ -136,10 +148,8 @@ const crossfade = (cb) => {
});
};
module.exports = (options) => {
Object.assign(config, options);
document.addEventListener("apiLoaded", onApiLoaded, {
module.exports = () => {
document.addEventListener('apiLoaded', onApiLoaded, {
once: true,
passive: true,
});

View File

@ -1,15 +1,15 @@
const { setOptions } = require("../../config/plugins");
const config = require("./config");
const defaultOptions = require("../../config/defaults").plugins.crossfade;
const prompt = require("custom-electron-prompt");
const promptOptions = require("../../providers/prompt-options");
module.exports = (win, options) => [
module.exports = (win) => [
{
label: "Advanced",
click: async () => {
const newOptions = await promptCrossfadeValues(win, options);
setOptions("crossfade", { ...options, ...newOptions });
const newOptions = await promptCrossfadeValues(win, config.getAll());
if (newOptions) config.setAll(newOptions);
},
},
];
@ -43,7 +43,7 @@ async function promptCrossfadeValues(win, options) {
{
label: "Crossfade x seconds before end",
value:
options.exitMusicBeforeEnd || defaultOptions.exitMusicBeforeEnd,
options.secondsBeforeEnd || defaultOptions.secondsBeforeEnd,
inputAttrs: {
type: "number",
required: true,
@ -66,7 +66,7 @@ async function promptCrossfadeValues(win, options) {
return {
fadeInDuration: Number(res[0]),
fadeOutDuration: Number(res[1]),
exitMusicBeforeEnd: Number(res[2]),
secondsBeforeEnd: Number(res[2]),
fadeScaling: res[3],
};
}