Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions plugins/discord/menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ const { setMenuOptions } = require("../../config/plugins");
const promptOptions = require("../../providers/prompt-options");
const { clear, connect, registerRefresh, isConnected } = require("./back");

let hasRegisterred = false;
const { singleton } = require("../../providers/decorators")

const registerRefreshOnce = singleton((refreshMenu) => {
registerRefresh(refreshMenu);
});

module.exports = (win, options, refreshMenu) => {
if (!hasRegisterred) {
registerRefresh(refreshMenu);
hasRegisterred = true;
}
registerRefreshOnce(refreshMenu);

return [
{
Expand Down
23 changes: 4 additions & 19 deletions plugins/downloader/back.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const { fetchFromGenius } = require('../lyrics-genius/back');
const { isEnabled } = require('../../config/plugins');
const { getImage } = require('../../providers/song-info');
const { injectCSS } = require('../utils');
const { cache } = require("../../providers/decorators")
const {
presets,
cropMaxWidth,
Expand All @@ -34,13 +35,6 @@ const ffmpeg = require('@ffmpeg/ffmpeg').createFFmpeg({
});
const ffmpegMutex = new Mutex();

const cache = {
getCoverBuffer: {
buffer: null,
url: null,
},
};

const config = require('./config');

/** @type {Innertube} */
Expand Down Expand Up @@ -295,19 +289,10 @@ async function iterableStreamToMP3(
}
}

async function getCoverBuffer(url) {
const store = cache.getCoverBuffer;
if (store.url === url) {
return store.buffer;
}
store.url = url;

const getCoverBuffer = cache(async (url) => {
const nativeImage = cropMaxWidth(await getImage(url));
store.buffer =
nativeImage && !nativeImage.isEmpty() ? nativeImage.toPNG() : null;

return store.buffer;
}
return nativeImage && !nativeImage.isEmpty() ? nativeImage.toPNG() : null;
});

async function writeID3(buffer, metadata, sendFeedback) {
try {
Expand Down
30 changes: 16 additions & 14 deletions plugins/notifications/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ const userData = app.getPath("userData");
const tempIcon = path.join(userData, "tempIcon.png");
const tempBanner = path.join(userData, "tempBanner.png");

const { cache } = require("../../providers/decorators")

module.exports.ToastStyles = {
logo: 1,
banner_centered_top: 2,
Expand All @@ -31,6 +33,18 @@ module.exports.urgencyLevels = [
{ name: "High", value: "critical" },
];

const nativeImageToLogo = cache((nativeImage) => {
const tempImage = nativeImage.resize({ height: 256 });
const margin = Math.max(tempImage.getSize().width - 256, 0);

return tempImage.crop({
x: Math.round(margin / 2),
y: 0,
width: 256,
height: 256,
});
});

module.exports.notificationImage = (songInfo) => {
if (!songInfo.image) return icon;
if (!config.get("interactive")) return nativeImageToLogo(songInfo.image);
Expand All @@ -44,27 +58,15 @@ module.exports.notificationImage = (songInfo) => {
};
};

module.exports.saveImage = (img, save_path) => {
module.exports.saveImage = cache((img, save_path) => {
try {
fs.writeFileSync(save_path, img.toPNG());
} catch (err) {
console.log(`Error writing song icon to disk:\n${err.toString()}`)
return icon;
}
return save_path;
}


function nativeImageToLogo(nativeImage) {
const tempImage = nativeImage.resize({ height: 256 });
const margin = Math.max((tempImage.getSize().width - 256), 0);

return tempImage.crop({
x: Math.round(margin / 2),
y: 0,
width: 256, height: 256
})
}
});

module.exports.save_temp_icons = () => {
for (const kind of Object.keys(module.exports.icons)) {
Expand Down
27 changes: 12 additions & 15 deletions plugins/playback-speed/front.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const { getSongMenu } = require("../../providers/dom-elements");
const { ElementFromFile, templatePath } = require("../utils");
const { singleton } = require("../../providers/decorators")

function $(selector) { return document.querySelector(selector); }

Expand All @@ -22,7 +23,16 @@ const updatePlayBackSpeed = () => {
};

let menu;
let observingSlider = false;

const setupSliderListener = singleton(() => {
$('#playback-speed-slider').addEventListener('immediate-value-changed', e => {
playbackSpeed = e.detail.value || MIN_PLAYBACK_SPEED;
if (isNaN(playbackSpeed)) {
playbackSpeed = 1;
}
updatePlayBackSpeed();
})
});

const observePopupContainer = () => {
const observer = new MutationObserver(() => {
Expand All @@ -32,10 +42,7 @@ const observePopupContainer = () => {

if (menu && menu.parentElement.eventSink_?.matches('ytmusic-menu-renderer.ytmusic-player-bar') && !menu.contains(slider)) {
menu.prepend(slider);
if (!observingSlider) {
setupSliderListener();
observingSlider = true;
}
setupSliderListener();
}
});

Expand Down Expand Up @@ -68,16 +75,6 @@ const setupWheelListener = () => {
})
}

function setupSliderListener() {
$('#playback-speed-slider').addEventListener('immediate-value-changed', e => {
playbackSpeed = e.detail.value || MIN_PLAYBACK_SPEED;
if (isNaN(playbackSpeed)) {
playbackSpeed = 1;
}
updatePlayBackSpeed();
})
}

function forcePlaybackRate(e) {
if (e.target.playbackRate !== playbackSpeed) {
e.target.playbackRate = playbackSpeed
Expand Down
75 changes: 28 additions & 47 deletions plugins/precise-volume/front.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ const { setOptions, setMenuOptions, isEnabled } = require("../../config/plugins"

function $(selector) { return document.querySelector(selector); }

const { debounce } = require("../../providers/decorators");

let api, options;

module.exports = (_options) => {
Expand All @@ -16,7 +18,27 @@ module.exports = (_options) => {
}, { once: true, passive: true })
};

module.exports.moveVolumeHud = moveVolumeHud;
//without this function it would rewrite config 20 time when volume change by 20
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit

Suggested change
//without this function it would rewrite config 20 time when volume change by 20
//without this function it would rewrite config 20 times when volume change by 20

const writeOptions = debounce(() => {
setOptions("precise-volume", options);
}, 1000);

module.exports.moveVolumeHud = debounce((showVideo) => {
const volumeHud = $("#volumeHud");
if (!volumeHud) return;
volumeHud.style.top = showVideo
? `${($("ytmusic-player").clientHeight - $("video").clientHeight) / 2}px`
: 0;
}, 250);

const hideVolumeHud = debounce((volumeHud) => {
volumeHud.style.opacity = 0;
}, 2000);

const hideVolumeSlider = debounce((slider) => {
slider.classList.remove("on-hover");
}, 2500);


/** Restore saved volume and setup tooltip */
function firstRun() {
Expand Down Expand Up @@ -67,33 +89,14 @@ function injectVolumeHud(noVid) {
}
}

let hudMoveTimeout;
function moveVolumeHud(showVideo) {
clearTimeout(hudMoveTimeout);
const volumeHud = $('#volumeHud');
if (!volumeHud) return;
hudMoveTimeout = setTimeout(() => {
volumeHud.style.top = showVideo ? `${($('ytmusic-player').clientHeight - $('video').clientHeight) / 2}px` : 0;
}, 250)
}

let hudFadeTimeout;

function showVolumeHud(volume) {
let volumeHud = $("#volumeHud");
const volumeHud = $("#volumeHud");
if (!volumeHud) return;

volumeHud.textContent = volume + '%';
volumeHud.textContent = `${volume}%`;
volumeHud.style.opacity = 1;

if (hudFadeTimeout) {
clearTimeout(hudFadeTimeout);
}

hudFadeTimeout = setTimeout(() => {
volumeHud.style.opacity = 0;
hudFadeTimeout = null;
}, 2000);
hideVolumeHud(volumeHud);
}

/** Add onwheel event to video player */
Expand All @@ -110,17 +113,6 @@ function saveVolume(volume) {
writeOptions();
}

//without this function it would rewrite config 20 time when volume change by 20
let writeTimeout;
function writeOptions() {
if (writeTimeout) clearTimeout(writeTimeout);

writeTimeout = setTimeout(() => {
setOptions("precise-volume", options);
writeTimeout = null;
}, 1000)
}

/** Add onwheel event to play bar and also track if play bar is hovered*/
function setupPlaybar() {
const playerbar = $("ytmusic-player-bar");
Expand Down Expand Up @@ -199,23 +191,12 @@ function updateVolumeSlider() {
}
}

let volumeHoverTimeoutID;

function showVolumeSlider() {
const slider = $("#volume-slider");
// This class display the volume slider if not in minimized mode
slider.classList.add("on-hover");
// Reset timeout if previous one hasn't completed
if (volumeHoverTimeoutID) {
clearTimeout(volumeHoverTimeoutID);
}
// Timeout to remove volume preview after 3 seconds if playbar isn't hovered
volumeHoverTimeoutID = setTimeout(() => {
volumeHoverTimeoutID = null;
if (!$("ytmusic-player-bar").classList.contains("on-hover")) {
slider.classList.remove("on-hover");
}
}, 3000);

hideVolumeSlider(slider);
}

// Set new volume as tooltip for volume slider and icon + expanding slider (appears when window size is small)
Expand Down
Loading