mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 10:31:47 +00:00
Merge branch 'master' of github.com:th-ch/youtube-music into snyk-upgrade-ce2777733d9dee231391c0a822c24a84
# By Araxeus (5) and others # Via GitHub (5) and TC (2) * 'master' of github.com:th-ch/youtube-music: Bump electron to 12.0.8 fix: upgrade ytdl-core from 4.5.0 to 4.7.0 fix: upgrade @ffmpeg/core from 0.8.5 to 0.9.0 fix notificationOnUnpause option fix: upgrade filenamify from 4.2.0 to 4.3.0 switch to `registerCallback()` on song info fix: upgrade ytpl from 2.1.1 to 2.2.0 lint refactor notifications plugin setup SongInfo **once**
This commit is contained in:
2
index.js
2
index.js
@ -11,6 +11,7 @@ const { setApplicationMenu } = require("./menu");
|
||||
const { fileExists, injectCSS } = require("./plugins/utils");
|
||||
const { isTesting } = require("./utils/testing");
|
||||
const { setUpTray } = require("./tray");
|
||||
const { setupSongInfo } = require("./providers/song-info");
|
||||
|
||||
// Catch errors and log them
|
||||
unhandled({
|
||||
@ -157,6 +158,7 @@ function createMainWindow() {
|
||||
}
|
||||
|
||||
app.once("browser-window-created", (event, win) => {
|
||||
setupSongInfo(win);
|
||||
loadPlugins(win);
|
||||
|
||||
win.webContents.on("did-fail-load", (
|
||||
|
||||
10
package.json
10
package.json
@ -64,7 +64,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@cliqz/adblocker-electron": "^1.20.5",
|
||||
"@ffmpeg/core": "^0.8.5",
|
||||
"@ffmpeg/core": "^0.9.0",
|
||||
"@ffmpeg/ffmpeg": "^0.9.7",
|
||||
"YoutubeNonStop": "git://github.com/lawfx/YoutubeNonStop.git#v0.9.0",
|
||||
"async-mutex": "^0.3.1",
|
||||
@ -78,15 +78,15 @@
|
||||
"electron-store": "^7.0.3",
|
||||
"electron-unhandled": "^3.0.2",
|
||||
"electron-updater": "^4.3.8",
|
||||
"filenamify": "^4.2.0",
|
||||
"filenamify": "^4.3.0",
|
||||
"md5": "^2.3.0",
|
||||
"node-fetch": "^2.6.1",
|
||||
"node-notifier": "^9.0.1",
|
||||
"ytdl-core": "^4.5.0",
|
||||
"ytpl": "^2.1.1"
|
||||
"ytdl-core": "^4.7.0",
|
||||
"ytpl": "^2.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"electron": "^12.0.7",
|
||||
"electron": "^12.0.8",
|
||||
"electron-builder": "^22.10.5",
|
||||
"electron-devtools-installer": "^3.1.1",
|
||||
"electron-icon-maker": "0.0.5",
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
const Discord = require("discord-rpc");
|
||||
|
||||
const getSongInfo = require("../../providers/song-info");
|
||||
const registerCallback = require("../../providers/song-info");
|
||||
|
||||
const rpc = new Discord.Client({
|
||||
transport: "ipc",
|
||||
@ -12,8 +12,6 @@ const clientId = "790655993809338398";
|
||||
let clearActivity;
|
||||
|
||||
module.exports = (win, {activityTimoutEnabled, activityTimoutTime}) => {
|
||||
const registerCallback = getSongInfo(win);
|
||||
|
||||
// If the page is ready, register the callback
|
||||
win.once("ready-to-show", () => {
|
||||
rpc.once("ready", () => {
|
||||
|
||||
@ -4,7 +4,7 @@ const { join } = require("path");
|
||||
const ID3Writer = require("browser-id3-writer");
|
||||
const { dialog, ipcMain } = require("electron");
|
||||
|
||||
const getSongInfo = require("../../providers/song-info");
|
||||
const registerCallback = require("../../providers/song-info");
|
||||
const { injectCSS, listenAction } = require("../utils");
|
||||
const { cropMaxWidth } = require("./utils");
|
||||
const { ACTIONS, CHANNEL } = require("./actions.js");
|
||||
@ -25,7 +25,6 @@ let nowPlayingMetadata = {};
|
||||
|
||||
function handle(win) {
|
||||
injectCSS(win.webContents, join(__dirname, "style.css"));
|
||||
const registerCallback = getSongInfo(win);
|
||||
registerCallback((info) => {
|
||||
nowPlayingMetadata = info;
|
||||
});
|
||||
|
||||
@ -2,13 +2,13 @@ const { existsSync, mkdirSync } = require("fs");
|
||||
const { join } = require("path");
|
||||
const { URL } = require("url");
|
||||
|
||||
const { dialog, ipcMain } = require("electron");
|
||||
const { dialog } = require("electron");
|
||||
const is = require("electron-is");
|
||||
const ytpl = require("ytpl");
|
||||
const chokidar = require('chokidar');
|
||||
|
||||
const { setOptions } = require("../../config/plugins");
|
||||
const getSongInfo = require("../../providers/song-info");
|
||||
const registerCallback = require("../../providers/song-info");
|
||||
const { sendError } = require("./back");
|
||||
const { defaultMenuDownloadLabel, getFolder } = require("./utils");
|
||||
|
||||
@ -18,7 +18,6 @@ let callbackIsRegistered = false;
|
||||
|
||||
module.exports = (win, options) => {
|
||||
if (!callbackIsRegistered) {
|
||||
const registerCallback = getSongInfo(win);
|
||||
registerCallback((info) => {
|
||||
metadataURL = info.url;
|
||||
});
|
||||
|
||||
@ -2,7 +2,7 @@ const fetch = require('node-fetch');
|
||||
const md5 = require('md5');
|
||||
const { shell } = require('electron');
|
||||
const { setOptions } = require('../../config/plugins');
|
||||
const getSongInfo = require('../../providers/song-info');
|
||||
const registerCallback = require('../../providers/song-info');
|
||||
const defaultConfig = require('../../config/defaults');
|
||||
|
||||
const createFormData = params => {
|
||||
@ -128,9 +128,7 @@ const setNowPlaying = (songInfo, config) => {
|
||||
// this will store the timeout that will trigger addScrobble
|
||||
let scrobbleTimer = undefined;
|
||||
|
||||
const lastfm = async (win, config) => {
|
||||
const registerCallback = getSongInfo(win);
|
||||
|
||||
const lastfm = async (_win, config) => {
|
||||
if (!config.api_root) {
|
||||
// settings are not present, creating them with the default values
|
||||
config = defaultConfig.plugins['last-fm'];
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
const { Notification } = require("electron");
|
||||
const is = require("electron-is");
|
||||
const getSongInfo = require("../../providers/song-info");
|
||||
const registerCallback = require("../../providers/song-info");
|
||||
const { notificationImage } = require("./utils");
|
||||
|
||||
const { setupInteractive, notifyInteractive } = require("./interactive")
|
||||
const setupInteractive = require("./interactive")
|
||||
|
||||
const notify = (info, options) => {
|
||||
|
||||
@ -23,38 +23,24 @@ const notify = (info, options) => {
|
||||
return currentNotification;
|
||||
};
|
||||
|
||||
module.exports = (win, options) => {
|
||||
const isInteractive = is.windows() && options.interactive;
|
||||
//setup interactive notifications for windows
|
||||
if (isInteractive) {
|
||||
setupInteractive(win, options.unpauseNotification);
|
||||
}
|
||||
const registerCallback = getSongInfo(win);
|
||||
const setup = (options) => {
|
||||
let oldNotification;
|
||||
let oldURL = "";
|
||||
win.once("ready-to-show", () => {
|
||||
// Register the callback for new song information
|
||||
registerCallback(songInfo => {
|
||||
// on pause - reset url? and skip notification
|
||||
if (songInfo.isPaused) {
|
||||
//reset oldURL if unpause notification option is on
|
||||
if (options.unpauseNotification) {
|
||||
oldURL = "";
|
||||
}
|
||||
return;
|
||||
}
|
||||
// If url isn't the same as last one - send notification
|
||||
if (songInfo.url !== oldURL) {
|
||||
oldURL = songInfo.url;
|
||||
if (isInteractive) {
|
||||
notifyInteractive(songInfo);
|
||||
} else {
|
||||
// Close the old notification
|
||||
oldNotification?.close();
|
||||
// This fixes a weird bug that would cause the notification to be updated instead of showing
|
||||
setTimeout(() => { oldNotification = notify(songInfo, options) }, 10);
|
||||
}
|
||||
}
|
||||
});
|
||||
let currentUrl;
|
||||
|
||||
registerCallback(songInfo => {
|
||||
if (!songInfo.isPaused && (songInfo.url !== currentUrl || options.unpauseNotification)) {
|
||||
// Close the old notification
|
||||
oldNotification?.close();
|
||||
currentUrl = songInfo.url;
|
||||
// This fixes a weird bug that would cause the notification to be updated instead of showing
|
||||
setTimeout(() => { oldNotification = notify(songInfo, options) }, 10);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = (win, options) => {
|
||||
// Register the callback for new song information
|
||||
is.windows() && options.interactive ?
|
||||
setupInteractive(win, options.unpauseNotification) :
|
||||
setup(options);
|
||||
};
|
||||
|
||||
@ -1,17 +1,27 @@
|
||||
const { notificationImage, icons } = require("./utils");
|
||||
const getSongControls = require('../../providers/song-controls');
|
||||
const registerCallback = require("../../providers/song-info");
|
||||
const notifier = require("node-notifier");
|
||||
|
||||
//store song controls reference on launch
|
||||
let controls;
|
||||
let notificationOnPause;
|
||||
let notificationOnUnpause;
|
||||
|
||||
//Save controls and onPause option
|
||||
module.exports.setupInteractive = (win, unpauseNotification) => {
|
||||
module.exports = (win, unpauseNotification) => {
|
||||
//Save controls and onPause option
|
||||
const { playPause, next, previous } = getSongControls(win);
|
||||
controls = { playPause, next, previous };
|
||||
notificationOnUnpause = unpauseNotification;
|
||||
|
||||
notificationOnPause = unpauseNotification;
|
||||
let currentUrl;
|
||||
|
||||
// Register songInfoCallback
|
||||
registerCallback(songInfo => {
|
||||
if (!songInfo.isPaused && (songInfo.url !== currentUrl || notificationOnUnpause)) {
|
||||
currentUrl = songInfo.url;
|
||||
sendToaster(songInfo);
|
||||
}
|
||||
});
|
||||
|
||||
win.webContents.once("closed", () => {
|
||||
deleteNotification()
|
||||
@ -33,7 +43,7 @@ function deleteNotification() {
|
||||
}
|
||||
|
||||
//New notification
|
||||
module.exports.notifyInteractive = function sendToaster(songInfo) {
|
||||
function sendToaster(songInfo) {
|
||||
deleteNotification();
|
||||
//download image and get path
|
||||
let imgSrc = notificationImage(songInfo, true);
|
||||
@ -71,7 +81,7 @@ module.exports.notifyInteractive = function sendToaster(songInfo) {
|
||||
// dont delete notification on play/pause
|
||||
toDelete = undefined;
|
||||
//manually send notification if not sending automatically
|
||||
if (!notificationOnPause) {
|
||||
if (!notificationOnUnpause) {
|
||||
songInfo.isPaused = false;
|
||||
sendToaster(songInfo);
|
||||
}
|
||||
|
||||
@ -1,12 +1,11 @@
|
||||
const getSongControls = require('../../providers/song-controls');
|
||||
const getSongInfo = require('../../providers/song-info');
|
||||
const registerCallback = require('../../providers/song-info');
|
||||
const path = require('path');
|
||||
|
||||
let controls;
|
||||
let currentSongInfo;
|
||||
|
||||
module.exports = win => {
|
||||
const registerCallback = getSongInfo(win);
|
||||
const { playPause, next, previous } = getSongControls(win);
|
||||
controls = { playPause, next, previous };
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@ const {
|
||||
TouchBarScrubber,
|
||||
} = TouchBar;
|
||||
|
||||
const getSongInfo = require("../../providers/song-info");
|
||||
const registerCallback = require("../../providers/song-info");
|
||||
const getSongControls = require("../../providers/song-controls");
|
||||
|
||||
// Songtitle label
|
||||
@ -59,7 +59,6 @@ const touchBar = new TouchBar({
|
||||
});
|
||||
|
||||
module.exports = (win) => {
|
||||
const registerCallback = getSongInfo(win);
|
||||
const { playPause, next, previous, like, dislike } = getSongControls(win);
|
||||
|
||||
// If the page is ready, register the callback
|
||||
|
||||
@ -64,15 +64,15 @@ const handleData = async (responseText, win) => {
|
||||
win.webContents.send("update-song-info", JSON.stringify(songInfo));
|
||||
};
|
||||
|
||||
// This variable will be filled with the callbacks once they register
|
||||
const callbacks = [];
|
||||
|
||||
// This function will allow plugins to register callback that will be triggered when data changes
|
||||
const registerCallback = (callback) => {
|
||||
callbacks.push(callback);
|
||||
};
|
||||
|
||||
const registerProvider = (win) => {
|
||||
// This variable will be filled with the callbacks once they register
|
||||
const callbacks = [];
|
||||
|
||||
// This function will allow plugins to register callback that will be triggered when data changes
|
||||
const registerCallback = (callback) => {
|
||||
callbacks.push(callback);
|
||||
};
|
||||
|
||||
win.on("page-title-updated", async () => {
|
||||
// Get and set the new data
|
||||
songInfo.isPaused = await getPausedStatus(win);
|
||||
@ -93,8 +93,6 @@ const registerProvider = (win) => {
|
||||
c(songInfo);
|
||||
});
|
||||
});
|
||||
|
||||
return registerCallback;
|
||||
};
|
||||
|
||||
const suffixesToRemove = [' - Topic', 'VEVO'];
|
||||
@ -110,7 +108,8 @@ function cleanupArtistName(artist) {
|
||||
return artist;
|
||||
}
|
||||
|
||||
module.exports = registerProvider;
|
||||
module.exports = registerCallback;
|
||||
module.exports.setupSongInfo = registerProvider;
|
||||
module.exports.getImage = getImage;
|
||||
module.exports.cleanupArtistName = cleanupArtistName;
|
||||
|
||||
|
||||
40
yarn.lock
40
yarn.lock
@ -544,10 +544,10 @@
|
||||
minimatch "^3.0.4"
|
||||
strip-json-comments "^3.1.1"
|
||||
|
||||
"@ffmpeg/core@^0.8.5":
|
||||
version "0.8.5"
|
||||
resolved "https://registry.yarnpkg.com/@ffmpeg/core/-/core-0.8.5.tgz#2d0b7d4409a4348fa6a1888c247de706ffc0e63f"
|
||||
integrity sha512-hemVFmhVLbD/VZaCG2BvCzFglKytMIMJ5aJfc12eXN4O4cG0wXnGTMVzlK1KKW/6viHhJMPkc9h4UDnJW8Uivg==
|
||||
"@ffmpeg/core@^0.9.0":
|
||||
version "0.9.0"
|
||||
resolved "https://registry.yarnpkg.com/@ffmpeg/core/-/core-0.9.0.tgz#4a999a07671c081216fcc2714f73ec02ddc9c24b"
|
||||
integrity sha512-d931yzQpb8GRgTZr+T7+BMqglPZ1R8FPH3W3UA8I21RzuasRHsMwQ4MQTlS9twjfqvUGIkD8p/8mNToUVN/Yrw==
|
||||
|
||||
"@ffmpeg/ffmpeg@^0.9.7":
|
||||
version "0.9.7"
|
||||
@ -3393,10 +3393,10 @@ electron-updater@^4.3.8:
|
||||
lodash.isequal "^4.5.0"
|
||||
semver "^7.3.4"
|
||||
|
||||
electron@^12.0.7:
|
||||
version "12.0.7"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-12.0.7.tgz#e0fca2c8be34cb7da48c4d15cfb1d2ad666d2718"
|
||||
integrity sha512-722TZNKDuLpEmj96AzTYFKHaJEH98xgOBH0aldStaPXI1xDFfb9SJQQuirvwFlkwG5OqQdz6Ne3OwwJ7Dbs5nQ==
|
||||
electron@^12.0.8:
|
||||
version "12.0.8"
|
||||
resolved "https://registry.yarnpkg.com/electron/-/electron-12.0.8.tgz#e52583b2b4f1eaa6fbb0e3666b9907f99f1f24c7"
|
||||
integrity sha512-bN2wYNnnma7ugBsiwysO1LI6oTTV1lDHOXuWip+OGjDUiz0IiJmZ+r0gAIMMeypVohZh7AA1ftnKad7tJ8sH4A==
|
||||
dependencies:
|
||||
"@electron/get" "^1.0.1"
|
||||
"@types/node" "^14.6.2"
|
||||
@ -4130,10 +4130,10 @@ filename-reserved-regex@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
|
||||
integrity sha1-q/c9+rc10EVECr/qLZHzieu/oik=
|
||||
|
||||
filenamify@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.2.0.tgz#c99716d676869585b3b5d328b3f06590d032e89f"
|
||||
integrity sha512-pkgE+4p7N1n7QieOopmn3TqJaefjdWXwEkj2XLZJLKfOgcQKkn11ahvGNgTD8mLggexLiDFQxeTs14xVU22XPA==
|
||||
filenamify@^4.3.0:
|
||||
version "4.3.0"
|
||||
resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106"
|
||||
integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==
|
||||
dependencies:
|
||||
filename-reserved-regex "^2.0.0"
|
||||
strip-outer "^1.0.1"
|
||||
@ -9330,19 +9330,19 @@ yocto-queue@^0.1.0:
|
||||
resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
|
||||
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
|
||||
|
||||
ytdl-core@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.5.0.tgz#f07733387c548e5c3a5614c93ef55bde666eeaf4"
|
||||
integrity sha512-e8r6skrakWNixsVlNPBMoRM1HrdW1swE97If9nenDUjF65uogYk4DvxIuqlmqRfBWKe+6aIZwqedNxUU9XLYJA==
|
||||
ytdl-core@^4.7.0:
|
||||
version "4.8.0"
|
||||
resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.0.tgz#d9f037a370a4b984f1f937e7a11b4531e8959443"
|
||||
integrity sha512-LFhhwqFojReoaME17VpsFeiamygM0W/YNG8O02mrmS2O6Em5LjCPiJYdq7Af3CmJtBEOCdptSZ3Ql+3LGWDGvg==
|
||||
dependencies:
|
||||
m3u8stream "^0.8.3"
|
||||
miniget "^4.0.0"
|
||||
sax "^1.1.3"
|
||||
|
||||
ytpl@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/ytpl/-/ytpl-2.1.1.tgz#c3c3e0e198e3fc7be13b52f5651e950b0aae94a0"
|
||||
integrity sha512-yrU/w1k75f089zUONUm1QjlCv96QWhk/SS6jNEVJXMr8/9zEj4k2EIv81nk5wldJvpb+2rvEfm2zIwRqXRoZ9w==
|
||||
ytpl@^2.2.0:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/ytpl/-/ytpl-2.2.1.tgz#e514eccdd46e02eeb0d16e08f8278489258ab31a"
|
||||
integrity sha512-sxty58s4JTNCDkiaiTkcaXfWCOW5sfHOPwDQtWIkoU4C+Kht2qat8yaLVbWZIclUSZo+naANyaI7LGjhhrErGA==
|
||||
dependencies:
|
||||
miniget "^4.2.0"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user