From 3522925dec70f9bb8fb8ea56f9bf6902e80bafe4 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 01:00:23 +0300 Subject: [PATCH 01/57] remove `open` dependency --- package.json | 3 +-- plugins/last-fm/back.js | 4 ++-- yarn.lock | 16 +--------------- 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 238659d5..9e44f245 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "scripts": { "test": "jest", "start": "electron .", - "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron .", + "start:debug": "ELECTRON_ENABLE_LOGGING=1 electron .", "icon": "rimraf assets/generated && electron-icon-maker --input=assets/youtube-music.png --output=assets/generated", "generate:package": "node utils/generate-package-json.js", "postinstall": "yarn run icon && yarn run plugins", @@ -82,7 +82,6 @@ "md5": "^2.3.0", "node-fetch": "^2.6.1", "node-notifier": "^9.0.1", - "open": "^8.0.3", "ytdl-core": "^4.5.0", "ytpl": "^2.1.1" }, diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index efa4f41e..1aaee32b 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -1,6 +1,6 @@ const fetch = require('node-fetch'); +const { shell } = require('electron') const md5 = require('md5'); -const open = require("open"); const { setOptions } = require('../../config/plugins'); const getSongInfo = require('../../providers/song-info'); const defaultConfig = require('../../config/defaults'); @@ -58,7 +58,7 @@ const authenticate = async config => { // asks the user for authentication config.token = await createToken(config); setOptions('last-fm', config); - open(`https://www.last.fm/api/auth/?api_key=${config.api_key}&token=${config.token}`); + shell.openExternal(`https://www.last.fm/api/auth/?api_key=${config.api_key}&token=${config.token}`); return config; } diff --git a/yarn.lock b/yarn.lock index 60a92cfd..fcdcc85b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2995,11 +2995,6 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -5005,7 +5000,7 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-docker@^2.0.0, is-docker@^2.1.1: +is-docker@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== @@ -6770,15 +6765,6 @@ open@^7.3.0: is-docker "^2.0.0" is-wsl "^2.1.1" -open@^8.0.3: - version "8.0.5" - resolved "https://registry.yarnpkg.com/open/-/open-8.0.5.tgz#92ee3faafef4ddbe78006f7881572f3e81430b8f" - integrity sha512-hkPXCz7gijWp2GoWqsQ4O/5p7F6d5pIQ/+9NyeWG1nABJ4zvLi9kJRv1a44kVf5p13wK0WMoiRA+Xey68yOytA== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" From e985b782418a409152673cc1e26f4c1c9ab58972 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 01:08:24 +0300 Subject: [PATCH 02/57] lint --- plugins/last-fm/back.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index 1aaee32b..aa0aafca 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -1,6 +1,6 @@ const fetch = require('node-fetch'); -const { shell } = require('electron') const md5 = require('md5'); +const { shell } = require('electron'); const { setOptions } = require('../../config/plugins'); const getSongInfo = require('../../providers/song-info'); const defaultConfig = require('../../config/defaults'); From cceb45319ae82ff7c23c7accce64132aeb51b703 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 04:03:34 +0300 Subject: [PATCH 03/57] debug videoUrl from `start Radio` button in menu --- plugins/downloader/front.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/downloader/front.js b/plugins/downloader/front.js index 200a7e15..23cd1448 100644 --- a/plugins/downloader/front.js +++ b/plugins/downloader/front.js @@ -40,9 +40,9 @@ const baseUrl = defaultConfig.url; global.download = () => { let metadata; let videoUrl = getSongMenu() - .querySelector("ytmusic-menu-navigation-item-renderer") - .querySelector("#navigation-endpoint") - .getAttribute("href"); + ?.querySelector('ytmusic-menu-navigation-item-renderer.iron-selected[tabindex="0"]') + ?.querySelector("#navigation-endpoint") + ?.getAttribute("href"); if (videoUrl) { videoUrl = baseUrl + "/" + videoUrl; metadata = null; From 2168cbca30b3dcecd265552926fac83683da8f78 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 04:04:35 +0300 Subject: [PATCH 04/57] use image from imageSrc if transfered --- plugins/downloader/back.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index ac32623d..ddf3dc46 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -44,12 +44,13 @@ function handle(win) { ipcMain.on("add-metadata", async (event, filePath, songBuffer, currentMetadata) => { let fileBuffer = songBuffer; - const songMetadata = { ...metadata, ...currentMetadata }; - if (!songMetadata.image && songMetadata.imageSrc) { - songMetadata.image = await getImage(songMetadata.imageSrc); + if (currentMetadata.imageSrc) { + currentMetadata.image = await getImage(currentMetadata.imageSrc); } + const songMetadata = { ...metadata, ...currentMetadata }; + try { const coverBuffer = songMetadata.image ? songMetadata.image.toPNG() : null; const writer = new ID3Writer(songBuffer); From a8ac2c3af988f299be85010e7fea541096b7e261 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 07:11:54 +0300 Subject: [PATCH 05/57] download progress bar on taskbar + Get the best possible artwork --- plugins/downloader/actions.js | 1 + plugins/downloader/back.js | 17 +++++++++++------ plugins/downloader/front.js | 7 ++++++- plugins/downloader/menu.js | 3 +-- plugins/downloader/utils.js | 30 ++++++++++++++++++++++++++++++ plugins/downloader/youtube-dl.js | 23 +++++++++++++---------- 6 files changed, 62 insertions(+), 19 deletions(-) diff --git a/plugins/downloader/actions.js b/plugins/downloader/actions.js index da75f181..0d6c3426 100644 --- a/plugins/downloader/actions.js +++ b/plugins/downloader/actions.js @@ -2,6 +2,7 @@ const CHANNEL = "downloader"; const ACTIONS = { ERROR: "error", METADATA: "metadata", + PROGRESS: "progress", }; module.exports = { diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index ddf3dc46..4590525e 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -6,10 +6,11 @@ const { dialog, ipcMain } = require("electron"); const getSongInfo = require("../../providers/song-info"); const { injectCSS, listenAction } = require("../utils"); +const { cropMaxWidth } = require("./utils"); const { ACTIONS, CHANNEL } = require("./actions.js"); const { getImage } = require("../../providers/song-info"); -const sendError = (win, err) => { +const sendError = (err) => { const dialogOpts = { type: "info", buttons: ["OK"], @@ -17,6 +18,7 @@ const sendError = (win, err) => { message: "Argh! Apologies, download failed…", detail: err.toString(), }; + win.setProgressBar(-1); // close progress bar dialog.showMessageBox(dialogOpts); }; @@ -29,14 +31,17 @@ function handle(win) { metadata = info; }); - listenAction(CHANNEL, (event, action, error) => { + listenAction(CHANNEL, (event, action, arg) => { switch (action) { - case ACTIONS.ERROR: - sendError(win, error); + case ACTIONS.ERROR: //arg = error + sendError(arg); break; case ACTIONS.METADATA: event.returnValue = JSON.stringify(metadata); break; + case ACTIONS.PROGRESS: //arg = progress + win.setProgressBar(arg); + break; default: console.log("Unknown action: " + action); } @@ -46,7 +51,7 @@ function handle(win) { let fileBuffer = songBuffer; if (currentMetadata.imageSrc) { - currentMetadata.image = await getImage(currentMetadata.imageSrc); + currentMetadata.image = cropMaxWidth(await getImage(currentMetadata.imageSrc)); } const songMetadata = { ...metadata, ...currentMetadata }; @@ -69,7 +74,7 @@ function handle(win) { writer.addTag(); fileBuffer = Buffer.from(writer.arrayBuffer); } catch (error) { - sendError(win, error); + sendError(error); } writeFileSync(filePath, fileBuffer); diff --git a/plugins/downloader/front.js b/plugins/downloader/front.js index 23cd1448..f9a0e9b9 100644 --- a/plugins/downloader/front.js +++ b/plugins/downloader/front.js @@ -25,6 +25,7 @@ const observer = new MutationObserver((mutations, observer) => { }); const reinit = () => { + triggerAction(CHANNEL, ACTIONS.PROGRESS, -1); // closes progress bar if (!progress) { console.warn("Cannot update progress"); } else { @@ -38,6 +39,7 @@ const baseUrl = defaultConfig.url; // contextBridge.exposeInMainWorld("downloader", { // download: () => { global.download = () => { + triggerAction(CHANNEL, ACTIONS.PROGRESS, 2); // starts with indefinite progress bar let metadata; let videoUrl = getSongMenu() ?.querySelector('ytmusic-menu-navigation-item-renderer.iron-selected[tabindex="0"]') @@ -53,12 +55,15 @@ global.download = () => { downloadVideoToMP3( videoUrl, - (feedback) => { + (feedback, ratio = undefined) => { if (!progress) { console.warn("Cannot update progress"); } else { progress.innerHTML = feedback; } + if (ratio) { + triggerAction(CHANNEL, ACTIONS.PROGRESS, ratio); + } }, (error) => { triggerAction(CHANNEL, ACTIONS.ERROR, error); diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.js index f5b99d73..b2dd5f25 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.js @@ -32,7 +32,7 @@ module.exports = (win, options) => { const currentURL = metadataURL || win.webContents.getURL(); const playlistID = new URL(currentURL).searchParams.get("list"); if (!playlistID) { - sendError(win, new Error("No playlist ID found")); + sendError(new Error("No playlist ID found")); return; } @@ -46,7 +46,6 @@ module.exports = (win, options) => { const playlistFolder = join(folder, playlistTitle); if (existsSync(playlistFolder)) { sendError( - win, new Error(`The folder ${playlistFolder} already exists`) ); return; diff --git a/plugins/downloader/utils.js b/plugins/downloader/utils.js index e2763541..7c5b9b96 100644 --- a/plugins/downloader/utils.js +++ b/plugins/downloader/utils.js @@ -3,3 +3,33 @@ const electron = require("electron"); module.exports.getFolder = (customFolder) => customFolder || (electron.app || electron.remote.app).getPath("downloads"); module.exports.defaultMenuDownloadLabel = "Download playlist"; + +module.exports.UrlToJPG = (imgUrl, videoId) => { + if (!imgUrl || imgUrl.includes(".jpg")) return imgUrl; + if (imgUrl.includes("maxresdefault")) { + return "https://img.youtube.com/vi/"+videoId+"/maxresdefault.jpg"; + } + if (imgUrl.includes("hqdefault")) { + return "https://img.youtube.com/vi/"+videoId+"/hqdefault.jpg"; + } //it will almost never get further than hq + if (imgUrl.includes("mqdefault")) { + return "https://img.youtube.com/vi/"+videoId+"/mqdefault.jpg"; + } + if (imgUrl.includes("sdddefault")) { + return "https://img.youtube.com/vi/"+videoId+"/sdddefault.jpg"; + } + return "https://img.youtube.com/vi/"+videoId+"/default.jpg"; +} + +module.exports.cropMaxWidth = (image) => { + const imageSize = image.getSize(); + if (imageSize.width === 1280 && imageSize.height === 720) { + return image.crop({ + x: 280, + y: 0, + width: 720, + height: 720 + }); + } + return image; +} diff --git a/plugins/downloader/youtube-dl.js b/plugins/downloader/youtube-dl.js index 814d9924..7edf8143 100644 --- a/plugins/downloader/youtube-dl.js +++ b/plugins/downloader/youtube-dl.js @@ -14,7 +14,7 @@ const ytdl = require("ytdl-core"); const { triggerAction, triggerActionSync } = require("../utils"); const { ACTIONS, CHANNEL } = require("./actions.js"); -const { getFolder } = require("./utils"); +const { getFolder, UrlToJPG } = require("./utils"); const { cleanupArtistName } = require("../../providers/song-info"); const { createFFmpeg } = FFmpeg; @@ -37,12 +37,14 @@ const downloadVideoToMP3 = async ( sendFeedback("Downloading…"); if (metadata === null) { - const info = await ytdl.getInfo(videoUrl); - const thumbnails = info.videoDetails?.author?.thumbnails; + const { videoDetails } = await ytdl.getInfo(videoUrl); + const thumbnails = videoDetails?.thumbnails; metadata = { - artist: info.videoDetails?.media?.artist || cleanupArtistName(info.videoDetails?.author?.name) || "", - title: info.videoDetails?.media?.song || info.videoDetails?.title || "", - imageSrc: thumbnails ? thumbnails[thumbnails.length - 1].url : "" + artist: videoDetails?.media?.artist || cleanupArtistName(videoDetails?.author?.name) || "", + title: videoDetails?.media?.song || videoDetails?.title || "", + imageSrc: thumbnails ? + UrlToJPG(thumbnails[thumbnails.length - 1].url, videoDetails?.videoId) + : "" } } @@ -65,9 +67,10 @@ const downloadVideoToMP3 = async ( .on("data", (chunk) => { chunks.push(chunk); }) - .on("progress", (chunkLength, downloaded, total) => { - const progress = Math.floor((downloaded / total) * 100); - sendFeedback("Download: " + progress + "%"); + .on("progress", (_chunkLength, downloaded, total) => { + const ratio = downloaded / total; + const progress = Math.floor(ratio * 100); + sendFeedback("Download: " + progress + "%", ratio); }) .on("info", (info, format) => { videoName = info.videoDetails.title.replace("|", "").toString("ascii"); @@ -112,7 +115,7 @@ const toMP3 = async ( try { if (!ffmpeg.isLoaded()) { - sendFeedback("Loading…"); + sendFeedback("Loading…", 2); // indefinite progress bar after download await ffmpeg.load(); } From 3ea17e6f468c77fb4ec20b474dfb9170016c2879 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 08:05:38 +0300 Subject: [PATCH 06/57] refactor --- plugins/downloader/utils.js | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/plugins/downloader/utils.js b/plugins/downloader/utils.js index 7c5b9b96..8408456d 100644 --- a/plugins/downloader/utils.js +++ b/plugins/downloader/utils.js @@ -4,25 +4,21 @@ module.exports.getFolder = (customFolder) => customFolder || (electron.app || electron.remote.app).getPath("downloads"); module.exports.defaultMenuDownloadLabel = "Download playlist"; +const orderedQualityList = ["maxresdefault", "hqdefault", "mqdefault", "sdddefault"]; module.exports.UrlToJPG = (imgUrl, videoId) => { if (!imgUrl || imgUrl.includes(".jpg")) return imgUrl; - if (imgUrl.includes("maxresdefault")) { - return "https://img.youtube.com/vi/"+videoId+"/maxresdefault.jpg"; + //it will almost never get further than hqdefault + for (const quality of orderedQualityList) { + if (imgUrl.includes(quality)) { + return `https://img.youtube.com/vi/${videoId}/${quality}.jpg`; + } } - if (imgUrl.includes("hqdefault")) { - return "https://img.youtube.com/vi/"+videoId+"/hqdefault.jpg"; - } //it will almost never get further than hq - if (imgUrl.includes("mqdefault")) { - return "https://img.youtube.com/vi/"+videoId+"/mqdefault.jpg"; - } - if (imgUrl.includes("sdddefault")) { - return "https://img.youtube.com/vi/"+videoId+"/sdddefault.jpg"; - } - return "https://img.youtube.com/vi/"+videoId+"/default.jpg"; + return `https://img.youtube.com/vi/${videoId}/default.jpg`; } module.exports.cropMaxWidth = (image) => { const imageSize = image.getSize(); + // standart youtube artwork width with margins from both sides is 280 + 720 + 280 if (imageSize.width === 1280 && imageSize.height === 720) { return image.crop({ x: 280, From 96a74f8955e7b7653fe4763e1023092a9913ec3d Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Sat, 8 May 2021 19:19:11 +0300 Subject: [PATCH 07/57] use original metadata only if not already captured from ytpl.getInfo() --- plugins/downloader/back.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 4590525e..7064aada 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -49,13 +49,14 @@ function handle(win) { ipcMain.on("add-metadata", async (event, filePath, songBuffer, currentMetadata) => { let fileBuffer = songBuffer; - - if (currentMetadata.imageSrc) { + let songMetadata; + if (currentMetadata.imageSrc) { // means metadata come from ytpl.getInfo(); currentMetadata.image = cropMaxWidth(await getImage(currentMetadata.imageSrc)); + songMetadata = { ...currentMetadata }; + } else { + songMetadata = { ...metadata, ...currentMetadata }; } - const songMetadata = { ...metadata, ...currentMetadata }; - try { const coverBuffer = songMetadata.image ? songMetadata.image.toPNG() : null; const writer = new ID3Writer(songBuffer); From b3da77a6bc31473826cfd517b4427f67dd1b7778 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Sat, 8 May 2021 19:24:25 +0300 Subject: [PATCH 08/57] small refactor --- plugins/downloader/back.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 7064aada..aae5344d 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -51,8 +51,10 @@ function handle(win) { let fileBuffer = songBuffer; let songMetadata; if (currentMetadata.imageSrc) { // means metadata come from ytpl.getInfo(); - currentMetadata.image = cropMaxWidth(await getImage(currentMetadata.imageSrc)); - songMetadata = { ...currentMetadata }; + songMetadata = { + ...currentMetadata, + image: cropMaxWidth(await getImage(currentMetadata.imageSrc)) + }; } else { songMetadata = { ...metadata, ...currentMetadata }; } From e46e7b74e2c7c75592c0cc6df9bcc3221461df42 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 19:34:57 +0300 Subject: [PATCH 09/57] fix sendError() --- plugins/downloader/back.js | 6 +++--- plugins/downloader/menu.js | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index aae5344d..43e385bb 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -10,7 +10,7 @@ const { cropMaxWidth } = require("./utils"); const { ACTIONS, CHANNEL } = require("./actions.js"); const { getImage } = require("../../providers/song-info"); -const sendError = (err) => { +const sendError = (win, err) => { const dialogOpts = { type: "info", buttons: ["OK"], @@ -34,7 +34,7 @@ function handle(win) { listenAction(CHANNEL, (event, action, arg) => { switch (action) { case ACTIONS.ERROR: //arg = error - sendError(arg); + sendError(win, arg); break; case ACTIONS.METADATA: event.returnValue = JSON.stringify(metadata); @@ -77,7 +77,7 @@ function handle(win) { writer.addTag(); fileBuffer = Buffer.from(writer.arrayBuffer); } catch (error) { - sendError(error); + sendError(win, error); } writeFileSync(filePath, fileBuffer); diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.js index b2dd5f25..f5b99d73 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.js @@ -32,7 +32,7 @@ module.exports = (win, options) => { const currentURL = metadataURL || win.webContents.getURL(); const playlistID = new URL(currentURL).searchParams.get("list"); if (!playlistID) { - sendError(new Error("No playlist ID found")); + sendError(win, new Error("No playlist ID found")); return; } @@ -46,6 +46,7 @@ module.exports = (win, options) => { const playlistFolder = join(folder, playlistTitle); if (existsSync(playlistFolder)) { sendError( + win, new Error(`The folder ${playlistFolder} already exists`) ); return; From 3831e61d106b5f9cfa61971ba3ca011a70b7bf3b Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 19:45:33 +0300 Subject: [PATCH 10/57] differentiate names of different metadata sources --- plugins/downloader/back.js | 12 ++++++------ plugins/downloader/youtube-dl.js | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 43e385bb..9d7b95b6 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -22,13 +22,13 @@ const sendError = (win, err) => { dialog.showMessageBox(dialogOpts); }; -let metadata = {}; +let nowPlayingMetadata = {}; function handle(win) { injectCSS(win.webContents, join(__dirname, "style.css")); const registerCallback = getSongInfo(win); registerCallback((info) => { - metadata = info; + nowPlayingMetadata = info; }); listenAction(CHANNEL, (event, action, arg) => { @@ -37,7 +37,7 @@ function handle(win) { sendError(win, arg); break; case ACTIONS.METADATA: - event.returnValue = JSON.stringify(metadata); + event.returnValue = JSON.stringify(nowPlayingMetadata); break; case ACTIONS.PROGRESS: //arg = progress win.setProgressBar(arg); @@ -50,13 +50,13 @@ function handle(win) { ipcMain.on("add-metadata", async (event, filePath, songBuffer, currentMetadata) => { let fileBuffer = songBuffer; let songMetadata; - if (currentMetadata.imageSrc) { // means metadata come from ytpl.getInfo(); + if (currentMetadata.imageSrcYTPL) { // means metadata come from ytpl.getInfo(); songMetadata = { ...currentMetadata, - image: cropMaxWidth(await getImage(currentMetadata.imageSrc)) + image: cropMaxWidth(await getImage(currentMetadata.imageSrcYTPL)) }; } else { - songMetadata = { ...metadata, ...currentMetadata }; + songMetadata = { ...nowPlayingMetadata, ...currentMetadata }; } try { diff --git a/plugins/downloader/youtube-dl.js b/plugins/downloader/youtube-dl.js index 7edf8143..7e54195a 100644 --- a/plugins/downloader/youtube-dl.js +++ b/plugins/downloader/youtube-dl.js @@ -42,7 +42,7 @@ const downloadVideoToMP3 = async ( metadata = { artist: videoDetails?.media?.artist || cleanupArtistName(videoDetails?.author?.name) || "", title: videoDetails?.media?.song || videoDetails?.title || "", - imageSrc: thumbnails ? + imageSrcYTPL: thumbnails ? UrlToJPG(thumbnails[thumbnails.length - 1].url, videoDetails?.videoId) : "" } @@ -149,7 +149,7 @@ const toMP3 = async ( ipcRenderer.send("add-metadata", filePath, fileBuffer, { artist: metadata.artist, title: metadata.title, - imageSrc: metadata.imageSrc + imageSrcYTPL: metadata.imageSrcYTPL }); ipcRenderer.once("add-metadata-done", reinit); } catch (e) { From ccd320d8ff27d91633f425fd55f1c5f16978cbf9 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 20:40:44 +0300 Subject: [PATCH 11/57] minimize getArtist() --- providers/song-info.js | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/providers/song-info.js b/providers/song-info.js index 15b51459..fc0c14c5 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -30,15 +30,11 @@ const getPausedStatus = async (win) => { }; const getArtist = async (win) => { - return await win.webContents.executeJavaScript( - ` - var bar = document.getElementsByClassName('subtitle ytmusic-player-bar')[0]; - var artistName = (bar.getElementsByClassName('yt-formatted-string')[0]) || (bar.getElementsByClassName('byline ytmusic-player-bar')[0]); - if (artistName) { - artistName.textContent; - } - ` - ); + return await win.webContents.executeJavaScript(` + document.querySelector(".subtitle.ytmusic-player-bar") + ?.querySelector(".yt-formatted-string") + ?.textContent + `); } // Fill songInfo with empty values @@ -66,6 +62,8 @@ const handleData = async (responseText, win) => { songInfo.uploadDate = data?.microformat?.microformatDataRenderer?.uploadDate; songInfo.url = data?.microformat?.microformatDataRenderer?.urlCanonical; + console.log("updating song-info"); + win.webContents.send("update-song-info", JSON.stringify(songInfo)); }; From da3c709ff0bbecf6d85813eee22ad408f8ef266a Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 20:46:15 +0300 Subject: [PATCH 12/57] remove videoDetails?.media query from XHR (it never exists in the XHR responce) --- providers/song-info.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/providers/song-info.js b/providers/song-info.js index fc0c14c5..ff12d55e 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -53,8 +53,8 @@ const songInfo = { const handleData = async (responseText, win) => { let data = JSON.parse(responseText); - songInfo.title = data.videoDetails?.media?.song || data?.videoDetails?.title; - songInfo.artist = data.videoDetails?.media?.artist || await getArtist(win) || cleanupArtistName(data?.videoDetails?.author); + songInfo.title = data?.videoDetails?.title; + songInfo.artist = await getArtist(win) || cleanupArtistName(data?.videoDetails?.author); songInfo.views = data?.videoDetails?.viewCount; songInfo.imageSrc = data?.videoDetails?.thumbnail?.thumbnails?.pop()?.url; songInfo.songDuration = data?.videoDetails?.lengthSeconds; @@ -62,8 +62,6 @@ const handleData = async (responseText, win) => { songInfo.uploadDate = data?.microformat?.microformatDataRenderer?.uploadDate; songInfo.url = data?.microformat?.microformatDataRenderer?.urlCanonical; - console.log("updating song-info"); - win.webContents.send("update-song-info", JSON.stringify(songInfo)); }; From 6b88397f820eee0d94cbc4f4bef7f420f1ac2468 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 21:21:07 +0300 Subject: [PATCH 13/57] lint --- plugins/downloader/back.js | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 9d7b95b6..76a77b92 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -10,16 +10,15 @@ const { cropMaxWidth } = require("./utils"); const { ACTIONS, CHANNEL } = require("./actions.js"); const { getImage } = require("../../providers/song-info"); -const sendError = (win, err) => { - const dialogOpts = { +const sendError = (win, error) => { + win.setProgressBar(-1); // close progress bar + dialog.showMessageBox({ type: "info", buttons: ["OK"], title: "Error in download!", message: "Argh! Apologies, download failed…", - detail: err.toString(), - }; - win.setProgressBar(-1); // close progress bar - dialog.showMessageBox(dialogOpts); + detail: error.toString(), + }); }; let nowPlayingMetadata = {}; @@ -33,13 +32,13 @@ function handle(win) { listenAction(CHANNEL, (event, action, arg) => { switch (action) { - case ACTIONS.ERROR: //arg = error + case ACTIONS.ERROR: // arg = error sendError(win, arg); break; case ACTIONS.METADATA: event.returnValue = JSON.stringify(nowPlayingMetadata); break; - case ACTIONS.PROGRESS: //arg = progress + case ACTIONS.PROGRESS: // arg = progress win.setProgressBar(arg); break; default: @@ -49,15 +48,12 @@ function handle(win) { ipcMain.on("add-metadata", async (event, filePath, songBuffer, currentMetadata) => { let fileBuffer = songBuffer; - let songMetadata; - if (currentMetadata.imageSrcYTPL) { // means metadata come from ytpl.getInfo(); - songMetadata = { + const songMetadata = currentMetadata.imageSrcYTPL ? // This means metadata come from ytpl.getInfo(); + { ...currentMetadata, image: cropMaxWidth(await getImage(currentMetadata.imageSrcYTPL)) - }; - } else { - songMetadata = { ...nowPlayingMetadata, ...currentMetadata }; - } + } : + { ...nowPlayingMetadata, ...currentMetadata }; try { const coverBuffer = songMetadata.image ? songMetadata.image.toPNG() : null; @@ -71,7 +67,7 @@ function handle(win) { writer.setFrame("APIC", { type: 3, data: coverBuffer, - description: "", + description: "" }); } writer.addTag(); From d7e42471a473f0a8cefd955f0a7db5d8fd7116af Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 23:01:57 +0300 Subject: [PATCH 14/57] lint --- plugins/downloader/front.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/downloader/front.js b/plugins/downloader/front.js index f9a0e9b9..034834ae 100644 --- a/plugins/downloader/front.js +++ b/plugins/downloader/front.js @@ -42,9 +42,10 @@ global.download = () => { triggerAction(CHANNEL, ACTIONS.PROGRESS, 2); // starts with indefinite progress bar let metadata; let videoUrl = getSongMenu() - ?.querySelector('ytmusic-menu-navigation-item-renderer.iron-selected[tabindex="0"]') - ?.querySelector("#navigation-endpoint") + // selector of first button which is always "Start Radio" + ?.querySelector('ytmusic-menu-navigation-item-renderer.iron-selected[tabindex="0"] #navigation-endpoint') ?.getAttribute("href"); + console.log(videoUrl) if (videoUrl) { videoUrl = baseUrl + "/" + videoUrl; metadata = null; From cf4bbf94e47cc150ac690e47ece415db2605fd47 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 23:02:52 +0300 Subject: [PATCH 15/57] update radioButton querySelector --- plugins/downloader/front.js | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/downloader/front.js b/plugins/downloader/front.js index 034834ae..879ba222 100644 --- a/plugins/downloader/front.js +++ b/plugins/downloader/front.js @@ -45,7 +45,6 @@ global.download = () => { // selector of first button which is always "Start Radio" ?.querySelector('ytmusic-menu-navigation-item-renderer.iron-selected[tabindex="0"] #navigation-endpoint') ?.getAttribute("href"); - console.log(videoUrl) if (videoUrl) { videoUrl = baseUrl + "/" + videoUrl; metadata = null; From d2a5110f3b5d7fb863f650d5f43000ec3cfd242a Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 8 May 2021 23:06:18 +0300 Subject: [PATCH 16/57] querySelector optimization #2 --- providers/song-info.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/providers/song-info.js b/providers/song-info.js index ff12d55e..5701d1f3 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -31,8 +31,7 @@ const getPausedStatus = async (win) => { const getArtist = async (win) => { return await win.webContents.executeJavaScript(` - document.querySelector(".subtitle.ytmusic-player-bar") - ?.querySelector(".yt-formatted-string") + document.querySelector(".subtitle.ytmusic-player-bar .yt-formatted-string") ?.textContent `); } From 163dc7e1d147fe04cabb68b3f96031ad251e7390 Mon Sep 17 00:00:00 2001 From: TC Date: Sat, 8 May 2021 22:41:56 +0200 Subject: [PATCH 17/57] Downloader: catch error when fetching playlist --- plugins/downloader/menu.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.js index f5b99d73..9822c8ed 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.js @@ -36,10 +36,16 @@ module.exports = (win, options) => { return; } - console.log("trying to get playlist ID" +playlistID); - const playlist = await ytpl(playlistID, - { limit: options.playlistMaxItems || Infinity } - ); + console.log(`trying to get playlist ID: '${playlistID}'`); + let playlist; + try { + playlist = await ytpl(playlistID, { + limit: options.playlistMaxItems || Infinity, + }); + } catch (e) { + sendError(win, e); + return; + } const playlistTitle = playlist.title; const folder = getFolder(options.downloadFolder); From a3778af48a33fb4a4fea9e1186182694c76d14bd Mon Sep 17 00:00:00 2001 From: TC Date: Sat, 8 May 2021 22:48:18 +0200 Subject: [PATCH 18/57] Downloader: rename UrlToJPG to urlToJPG --- plugins/downloader/utils.js | 2 +- plugins/downloader/youtube-dl.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/downloader/utils.js b/plugins/downloader/utils.js index 8408456d..07bca3a5 100644 --- a/plugins/downloader/utils.js +++ b/plugins/downloader/utils.js @@ -5,7 +5,7 @@ module.exports.getFolder = (customFolder) => module.exports.defaultMenuDownloadLabel = "Download playlist"; const orderedQualityList = ["maxresdefault", "hqdefault", "mqdefault", "sdddefault"]; -module.exports.UrlToJPG = (imgUrl, videoId) => { +module.exports.urlToJPG = (imgUrl, videoId) => { if (!imgUrl || imgUrl.includes(".jpg")) return imgUrl; //it will almost never get further than hqdefault for (const quality of orderedQualityList) { diff --git a/plugins/downloader/youtube-dl.js b/plugins/downloader/youtube-dl.js index 7e54195a..f0f47cec 100644 --- a/plugins/downloader/youtube-dl.js +++ b/plugins/downloader/youtube-dl.js @@ -14,7 +14,7 @@ const ytdl = require("ytdl-core"); const { triggerAction, triggerActionSync } = require("../utils"); const { ACTIONS, CHANNEL } = require("./actions.js"); -const { getFolder, UrlToJPG } = require("./utils"); +const { getFolder, urlToJPG } = require("./utils"); const { cleanupArtistName } = require("../../providers/song-info"); const { createFFmpeg } = FFmpeg; @@ -43,7 +43,7 @@ const downloadVideoToMP3 = async ( artist: videoDetails?.media?.artist || cleanupArtistName(videoDetails?.author?.name) || "", title: videoDetails?.media?.song || videoDetails?.title || "", imageSrcYTPL: thumbnails ? - UrlToJPG(thumbnails[thumbnails.length - 1].url, videoDetails?.videoId) + urlToJPG(thumbnails[thumbnails.length - 1].url, videoDetails?.videoId) : "" } } From 792c2931b0f2a120dabba0130082cf6c82e361ad Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sun, 9 May 2021 22:10:20 +0300 Subject: [PATCH 19/57] fix config overwrite on each start --- plugins/last-fm/back.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index aa0aafca..54975103 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -131,7 +131,7 @@ let scrobbleTimer = undefined; const lastfm = async (win, config) => { const registerCallback = getSongInfo(win); - if (!config.api_root || !config.suffixesToRemove) { + if (!config.api_root) { // settings are not present, creating them with the default values config = defaultConfig.plugins['last-fm']; config.enabled = true; From 7cf78c6635919d561cc915077404592e132d7fc1 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Mon, 10 May 2021 04:15:56 +0300 Subject: [PATCH 20/57] setup SongInfo **once** --- index.js | 2 ++ plugins/discord/back.js | 4 +--- plugins/downloader/back.js | 3 +-- plugins/last-fm/back.js | 6 ++---- plugins/notifications/back.js | 3 +-- plugins/taskbar-mediacontrol/back.js | 3 +-- plugins/touchbar/back.js | 3 +-- providers/song-info.js | 22 +++++++++++----------- 8 files changed, 20 insertions(+), 26 deletions(-) diff --git a/index.js b/index.js index 81fd45b5..f4e4212d 100644 --- a/index.js +++ b/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", ( diff --git a/plugins/discord/back.js b/plugins/discord/back.js index 33dbb38b..c6faadd7 100644 --- a/plugins/discord/back.js +++ b/plugins/discord/back.js @@ -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", () => { diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index 76a77b92..ee345ab2 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -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; }); diff --git a/plugins/last-fm/back.js b/plugins/last-fm/back.js index 54975103..567dccc0 100644 --- a/plugins/last-fm/back.js +++ b/plugins/last-fm/back.js @@ -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']; diff --git a/plugins/notifications/back.js b/plugins/notifications/back.js index d1ef3114..91d3ea72 100644 --- a/plugins/notifications/back.js +++ b/plugins/notifications/back.js @@ -1,6 +1,6 @@ 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") @@ -29,7 +29,6 @@ module.exports = (win, options) => { if (isInteractive) { setupInteractive(win, options.unpauseNotification); } - const registerCallback = getSongInfo(win); let oldNotification; let oldURL = ""; win.once("ready-to-show", () => { diff --git a/plugins/taskbar-mediacontrol/back.js b/plugins/taskbar-mediacontrol/back.js index 46cb399e..26a11732 100644 --- a/plugins/taskbar-mediacontrol/back.js +++ b/plugins/taskbar-mediacontrol/back.js @@ -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 }; diff --git a/plugins/touchbar/back.js b/plugins/touchbar/back.js index 0fca17a7..acaee583 100644 --- a/plugins/touchbar/back.js +++ b/plugins/touchbar/back.js @@ -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 diff --git a/providers/song-info.js b/providers/song-info.js index 5701d1f3..97ddb071 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -51,6 +51,7 @@ const songInfo = { }; const handleData = async (responseText, win) => { + console.log("handling song-info") let data = JSON.parse(responseText); songInfo.title = data?.videoDetails?.title; songInfo.artist = await getArtist(win) || cleanupArtistName(data?.videoDetails?.author); @@ -64,15 +65,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 +94,6 @@ const registerProvider = (win) => { c(songInfo); }); }); - - return registerCallback; }; const suffixesToRemove = [' - Topic', 'VEVO']; @@ -110,7 +109,8 @@ function cleanupArtistName(artist) { return artist; } -module.exports = registerProvider; +module.exports = registerCallback; +module.exports.setupSongInfo = registerProvider; module.exports.getImage = getImage; module.exports.cleanupArtistName = cleanupArtistName; From cb743de7fdec4ebb932c2ad3d0aa2b529c6a71f2 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Mon, 10 May 2021 05:00:58 +0300 Subject: [PATCH 21/57] refactor notifications plugin --- plugins/notifications/back.js | 49 ++++++++++------------------ plugins/notifications/interactive.js | 15 ++++++--- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/plugins/notifications/back.js b/plugins/notifications/back.js index 91d3ea72..59b934c9 100644 --- a/plugins/notifications/back.js +++ b/plugins/notifications/back.js @@ -3,7 +3,7 @@ const is = require("electron-is"); const registerCallback = require("../../providers/song-info"); const { notificationImage } = require("./utils"); -const { setupInteractive, notifyInteractive } = require("./interactive") +const setupInteractive = require("./interactive") const notify = (info, options) => { @@ -23,37 +23,22 @@ 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 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); - } - } - }); + + registerCallback(songInfo => { + if (!songInfo.isPaused || options.unpauseNotification) { + // 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); + } }); +} + +module.exports = (win, options) => { + // Register the callback for new song information + is.windows() && options.interactive ? + setupInteractive(win, options.unpauseNotification) : + setup(options); }; diff --git a/plugins/notifications/interactive.js b/plugins/notifications/interactive.js index cb487cae..210402bf 100644 --- a/plugins/notifications/interactive.js +++ b/plugins/notifications/interactive.js @@ -1,18 +1,25 @@ 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; -//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 }; - notificationOnPause = unpauseNotification; + // Register songInfoCallback + registerCallback(songInfo => { + if (!songInfo.isPaused || notificationOnPause) { + sendToaster(songInfo); + } + }); + win.webContents.once("closed", () => { deleteNotification() }); @@ -33,7 +40,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); From b266037bb412e1d80dd496beb2c3007ecbab72b5 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Mon, 10 May 2021 06:05:39 +0300 Subject: [PATCH 22/57] lint --- providers/song-info.js | 1 - 1 file changed, 1 deletion(-) diff --git a/providers/song-info.js b/providers/song-info.js index 97ddb071..1b119b82 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -51,7 +51,6 @@ const songInfo = { }; const handleData = async (responseText, win) => { - console.log("handling song-info") let data = JSON.parse(responseText); songInfo.title = data?.videoDetails?.title; songInfo.artist = await getArtist(win) || cleanupArtistName(data?.videoDetails?.author); From 8284b56075baf819ec89884530ff2022cf94bdfb Mon Sep 17 00:00:00 2001 From: Araxeus Date: Mon, 10 May 2021 20:40:25 +0300 Subject: [PATCH 23/57] set appID on windows --- index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.js b/index.js index 81fd45b5..1e1af391 100644 --- a/index.js +++ b/index.js @@ -255,6 +255,10 @@ app.on("ready", () => { }, 20000); } + if (is.windows()) { + app.setAppUserModelId("com.github.th-ch.youtube-music"); + } + mainWindow = createMainWindow(); setApplicationMenu(mainWindow); if (config.get("options.restartOnConfigChanges")) { From 93d4d3c976ec5b945cc0d122c506805c0502423c Mon Sep 17 00:00:00 2001 From: Araxeus Date: Mon, 10 May 2021 22:13:45 +0300 Subject: [PATCH 24/57] writeShortcut on windows --- index.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 1e1af391..278d51c4 100644 --- a/index.js +++ b/index.js @@ -255,8 +255,18 @@ app.on("ready", () => { }, 20000); } - if (is.windows()) { - app.setAppUserModelId("com.github.th-ch.youtube-music"); + if (!is.dev() && is.windows()) { + const appID = "com.github.th-ch.youtube-music"; + electron.shell.writeShortcutLink( + path.join(app.getPath("appData"), 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'YouTube Music.lnk'), + 'update', + { + target: process.execPath, + description: "YouTube Music Desktop App - including custom plugins", + appUserModelId: appID + } + ); + app.setAppUserModelId(appID); } mainWindow = createMainWindow(); From 8cca9f3eeb048ce27de8c06dc541b1bfc9e5c18b Mon Sep 17 00:00:00 2001 From: Araxeus Date: Mon, 10 May 2021 23:23:17 +0300 Subject: [PATCH 25/57] create shortcut only if needed --- index.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 278d51c4..399c8a3f 100644 --- a/index.js +++ b/index.js @@ -255,17 +255,29 @@ app.on("ready", () => { }, 20000); } + // Register shortcut & appID on windows if (!is.dev() && is.windows()) { const appID = "com.github.th-ch.youtube-music"; - electron.shell.writeShortcutLink( - path.join(app.getPath("appData"), 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'YouTube Music.lnk'), - 'update', - { - target: process.execPath, - description: "YouTube Music Desktop App - including custom plugins", - appUserModelId: appID + const shortcutPath = path.join(app.getPath("appData"), "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk"); + const appLocation = process.execPath; + try { // check if shortcut is registered and valid + const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet + if (shortcutDetails.target !== appLocation || shortcutDetails.appUserModelId !== appID) { + throw undefined; } - ); + } catch { // if not valid -> Register shortcut + electron.shell.writeShortcutLink( + shortcutPath, + "create", + { + target: appLocation, + cwd: appLocation.slice(0, appLocation.lastIndexOf(path.sep)), + description: "YouTube Music Desktop App - including custom plugins", + appUserModelId: appID + } + ); + } + // set appID app.setAppUserModelId(appID); } From 78a7dcb7e8f60a992b2b9c9e39a7a45147966b1b Mon Sep 17 00:00:00 2001 From: Araxeus Date: Mon, 10 May 2021 23:46:56 +0300 Subject: [PATCH 26/57] lint --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 399c8a3f..851b26f9 100644 --- a/index.js +++ b/index.js @@ -263,12 +263,12 @@ app.on("ready", () => { try { // check if shortcut is registered and valid const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet if (shortcutDetails.target !== appLocation || shortcutDetails.appUserModelId !== appID) { - throw undefined; + throw "needUpdate"; } - } catch { // if not valid -> Register shortcut + } catch (error) { // if not valid -> Register shortcut electron.shell.writeShortcutLink( shortcutPath, - "create", + error === "needUpdate" ? "update" : "create", { target: appLocation, cwd: appLocation.slice(0, appLocation.lastIndexOf(path.sep)), From cb5ef1d6e58fcbef1b6120b9ea030892dce40791 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Tue, 11 May 2021 00:15:54 +0300 Subject: [PATCH 27/57] check that app is installed / unpacked --- index.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 851b26f9..c053e5e0 100644 --- a/index.js +++ b/index.js @@ -255,11 +255,12 @@ app.on("ready", () => { }, 20000); } + const appLocation = process.execPath; + // Register shortcut & appID on windows - if (!is.dev() && is.windows()) { + if (is.windows() && !is.dev() && !appLocation.startsWith(path.join(app.getPath("appData"), "..", "Local", "Temp"))) { const appID = "com.github.th-ch.youtube-music"; const shortcutPath = path.join(app.getPath("appData"), "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk"); - const appLocation = process.execPath; try { // check if shortcut is registered and valid const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet if (shortcutDetails.target !== appLocation || shortcutDetails.appUserModelId !== appID) { From d6150302225701a56dfcfafa6ff127edc10bf4a9 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Tue, 11 May 2021 00:34:40 +0300 Subject: [PATCH 28/57] register appID on windows reguardless of shortcut --- index.js | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/index.js b/index.js index c053e5e0..4c33d750 100644 --- a/index.js +++ b/index.js @@ -255,31 +255,32 @@ app.on("ready", () => { }, 20000); } - const appLocation = process.execPath; - - // Register shortcut & appID on windows - if (is.windows() && !is.dev() && !appLocation.startsWith(path.join(app.getPath("appData"), "..", "Local", "Temp"))) { + // Register appID on windows + if (is.windows()) { + const appLocation = process.execPath; const appID = "com.github.th-ch.youtube-music"; - const shortcutPath = path.join(app.getPath("appData"), "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk"); - try { // check if shortcut is registered and valid - const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet - if (shortcutDetails.target !== appLocation || shortcutDetails.appUserModelId !== appID) { - throw "needUpdate"; - } - } catch (error) { // if not valid -> Register shortcut - electron.shell.writeShortcutLink( - shortcutPath, - error === "needUpdate" ? "update" : "create", - { - target: appLocation, - cwd: appLocation.slice(0, appLocation.lastIndexOf(path.sep)), - description: "YouTube Music Desktop App - including custom plugins", - appUserModelId: appID - } - ); - } - // set appID app.setAppUserModelId(appID); + // check shortcut validity if not in dev mode / running portable app + if (!is.dev() && !appLocation.startsWith(path.join(app.getPath("appData"), "..", "Local", "Temp"))) { + const shortcutPath = path.join(app.getPath("appData"), "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk"); + try { // check if shortcut is registered and valid + const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet + if (shortcutDetails.target !== appLocation || shortcutDetails.appUserModelId !== appID) { + throw "needUpdate"; + } + } catch (error) { // if not valid -> Register shortcut + electron.shell.writeShortcutLink( + shortcutPath, + error === "needUpdate" ? "update" : "create", + { + target: appLocation, + cwd: appLocation.slice(0, appLocation.lastIndexOf(path.sep)), + description: "YouTube Music Desktop App - including custom plugins", + appUserModelId: appID + } + ); + } + } } mainWindow = createMainWindow(); From cb6a5a478eafab5104200bbfc56c4d9ee7bfca60 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Tue, 11 May 2021 16:47:51 +0300 Subject: [PATCH 29/57] lint --- index.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 4c33d750..83f8d59f 100644 --- a/index.js +++ b/index.js @@ -257,12 +257,13 @@ app.on("ready", () => { // Register appID on windows if (is.windows()) { - const appLocation = process.execPath; const appID = "com.github.th-ch.youtube-music"; app.setAppUserModelId(appID); + const appLocation = process.execPath; + const appData = app.getPath("appData"); // check shortcut validity if not in dev mode / running portable app - if (!is.dev() && !appLocation.startsWith(path.join(app.getPath("appData"), "..", "Local", "Temp"))) { - const shortcutPath = path.join(app.getPath("appData"), "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk"); + if (!is.dev() && !appLocation.startsWith(path.join(appData, "..", "Local", "Temp"))) { + const shortcutPath = path.join(appData, "Microsoft", "Windows", "Start Menu", "Programs", "YouTube Music.lnk"); try { // check if shortcut is registered and valid const shortcutDetails = electron.shell.readShortcutLink(shortcutPath); // throw error if doesn't exist yet if (shortcutDetails.target !== appLocation || shortcutDetails.appUserModelId !== appID) { From 0e8e78362b5ddaea352bb93ad1c4c9853d725106 Mon Sep 17 00:00:00 2001 From: TC Date: Tue, 11 May 2021 22:56:07 +0200 Subject: [PATCH 30/57] Upgrade electron to v12 --- package.json | 4 +- yarn.lock | 121 +++++++++++++++++++++++++++++++++------------------ 2 files changed, 80 insertions(+), 45 deletions(-) diff --git a/package.json b/package.json index 9e44f245..4a41c6de 100644 --- a/package.json +++ b/package.json @@ -86,14 +86,14 @@ "ytpl": "^2.1.1" }, "devDependencies": { - "electron": "^11.4.4", + "electron": "^12.0.7", "electron-builder": "^22.10.5", "electron-devtools-installer": "^3.1.1", "electron-icon-maker": "0.0.5", "get-port": "^5.1.1", "jest": "^26.6.3", "rimraf": "^3.0.2", - "spectron": "^13.0.0", + "spectron": "^14.0.0", "xo": "^0.38.2" }, "resolutions": { diff --git a/yarn.lock b/yarn.lock index fcdcc85b..4a6bc17a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -497,7 +497,7 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" -"@electron/get@^1.0.1", "@electron/get@^1.12.2": +"@electron/get@^1.0.1", "@electron/get@^1.12.4": version "1.12.4" resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.12.4.tgz#a5971113fc1bf8fa12a8789dc20152a7359f06ab" integrity sha512-6nr9DbJPUR9Xujw6zD3y+rS95TyItEVM0NVjt1EehY2vUWfIgPiIPVHxCvaTS0xr2B+DRxovYVKbuOWqC35kjg== @@ -513,6 +513,11 @@ global-agent "^2.0.2" global-tunnel-ng "^2.7.1" +"@electron/remote@^1.0.4": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-1.1.0.tgz#167d119c7c03c7778b556fdc4f1f38a44b23f1c2" + integrity sha512-yr8gZTkIgJYKbFqExI4QZqMSjn1kL/us9Dl46+TH1EZdhgRtsJ6HDfdsIxu0QEc6Hv+DMAXs69rgquH+8FDk4w== + "@electron/universal@1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.4.tgz#231ac246c39d45b80e159bd21c3f9027dcaa10f5" @@ -1301,10 +1306,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.25.tgz#15967a7b577ff81383f9b888aa6705d43fbbae93" integrity sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ== -"@types/node@^12.0.12": - version "12.19.16" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.19.16.tgz#15753af35cbef636182d8d8ca55b37c8583cecb3" - integrity sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q== +"@types/node@^14.6.2": + version "14.14.44" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.44.tgz#df7503e6002847b834371c004b372529f3f85215" + integrity sha512-+gaugz6Oce6ZInfI/tK4Pq5wIIkJMEJUu92RB3Eu93mtj4wjjjz9EB5mLp5s1pSsLXdC/CPut/xF20ZzAQJbTA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -2046,9 +2051,9 @@ bn.js@^5.0.0, bn.js@^5.1.1: integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== boolean@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.2.tgz#df1baa18b6a2b0e70840475e1d93ec8fe75b2570" - integrity sha512-RwywHlpCRc3/Wh81MiCKun4ydaIFyW5Ea6JbL6sRCVx5q5irDw7pMXBUFYF/jArQ6YrG36q0kpovc9P/Kd3I4g== + version "3.0.3" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.3.tgz#0fee0c9813b66bef25a8a6a904bb46736d05f024" + integrity sha512-EqrTKXQX6Z3A2nRmMEIlAIfjQOgFnVO2nqZGpbcsPnYGWBwpFqzlrozU1dy+S2iqfYDLh26ef4KrgTxu9xQrxA== boxen@^5.0.0: version "5.0.0" @@ -2729,9 +2734,9 @@ core-assert@^0.2.0: is-error "^2.2.0" core-js@^3.6.5: - version "3.8.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.3.tgz#c21906e1f14f3689f93abcc6e26883550dd92dd0" - integrity sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q== + version "3.12.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.12.0.tgz#62bac86f7d7f087d40dba3e90a211c2c3c8559ea" + integrity sha512-SaMnchL//WwU2Ot1hhkPflE8gzo7uq1FGvUJ8GKmi3TOU7rGTHIU+eir1WGf6qOtTyxdfdcp10yPdGZ59sQ3hw== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -3055,9 +3060,9 @@ detect-newline@^3.0.0: integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== detect-node@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.0.5" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.5.tgz#9d270aa7eaa5af0b72c4c9d9b814e7f4ce738b79" + integrity sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw== dev-null@^0.1.1: version "0.1.1" @@ -3271,12 +3276,12 @@ electron-builder@^22.10.5: update-notifier "^5.1.0" yargs "^16.2.0" -electron-chromedriver@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-11.0.0.tgz#49b034ed0ad12c12e3522862c7bb46875a0d85e1" - integrity sha512-ayMJPBbB4puU0SqYbcD9XvF3/7GWIhqKE1n5lG2/GQPRnrZkNoPIilsrS0rQcD50Xhl69KowatDqLhUznZWtbA== +electron-chromedriver@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/electron-chromedriver/-/electron-chromedriver-12.0.0.tgz#55bdc451b938b384642d613a05eadacb1fe476ee" + integrity sha512-zOs98o9+20Er8Q44z06h90VldwrJaoRCieW3Q8WkdDjA3cMRU5mlmm1kGDhPLMeYNuhq6e39aGMVH/IBFD97HQ== dependencies: - "@electron/get" "^1.12.2" + "@electron/get" "^1.12.4" extract-zip "^2.0.0" electron-debug@^3.2.0: @@ -3388,13 +3393,13 @@ electron-updater@^4.3.8: lodash.isequal "^4.5.0" semver "^7.3.4" -electron@^11.4.4: - version "11.4.4" - resolved "https://registry.yarnpkg.com/electron/-/electron-11.4.4.tgz#d6c046dedd9e22df5f6408841c3f8ae1a1d59414" - integrity sha512-m52nF85VADCmL9DpzJfgmkvc9fNiGZPYwptv/4fTYrYhAMiO+hmClGMXncCoSAzoULQjl+f+0b9CY4yd6nRFlQ== +electron@^12.0.7: + version "12.0.7" + resolved "https://registry.yarnpkg.com/electron/-/electron-12.0.7.tgz#e0fca2c8be34cb7da48c4d15cfb1d2ad666d2718" + integrity sha512-722TZNKDuLpEmj96AzTYFKHaJEH98xgOBH0aldStaPXI1xDFfb9SJQQuirvwFlkwG5OqQdz6Ne3OwwJ7Dbs5nQ== dependencies: "@electron/get" "^1.0.1" - "@types/node" "^12.0.12" + "@types/node" "^14.6.2" extract-zip "^1.0.3" elliptic@^6.5.3: @@ -3471,9 +3476,9 @@ env-editor@^0.4.1: integrity sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA== env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== errlop@^4.0.0: version "4.1.0" @@ -4418,9 +4423,9 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: path-is-absolute "^1.0.0" global-agent@^2.0.2: - version "2.1.12" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195" - integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.2.0.tgz#566331b0646e6bf79429a16877685c4a1fbf76dc" + integrity sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg== dependencies: boolean "^3.0.1" core-js "^3.6.5" @@ -4475,9 +4480,9 @@ globals@^13.6.0: type-fest "^0.20.2" globalthis@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" - integrity sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw== + version "1.0.2" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.2.tgz#2a235d34f4d8036219f7e34929b5de9e18166b8b" + integrity sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ== dependencies: define-properties "^1.1.3" @@ -4535,6 +4540,23 @@ got@^11.0.2: p-cancelable "^2.0.0" responselike "^2.0.0" +got@^11.8.0: + version "11.8.2" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599" + integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.1" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + got@^9.6.0: version "9.6.0" resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" @@ -4552,11 +4574,16 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4: version "4.2.5" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.5.tgz#bc18864a6c9fc7b303f2e2abdb9155ad178fbe29" integrity sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw== +graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -6165,12 +6192,12 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: +lodash@^4.13.1, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: version "4.17.20" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== -lodash@^4.17.21: +lodash@^4.17.10, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7846,13 +7873,20 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^7.2.1, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== dependencies: lru-cache "^6.0.0" +semver@^7.3.2: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + serialize-error@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" @@ -8065,14 +8099,15 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== -spectron@^13.0.0: - version "13.0.0" - resolved "https://registry.yarnpkg.com/spectron/-/spectron-13.0.0.tgz#16bdfcf9a2b26cb5ee6c3e29b4f08101e339aa4d" - integrity sha512-7RPa6Fp8gqL4V0DubobnqIRFHIijkpjg6MFHcJlxoerWyvLJd+cQvOh756XpB1Z/U3DyA9jPcS+HE2PvYRP5+A== +spectron@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/spectron/-/spectron-14.0.0.tgz#c8160e38c30dcda39734f3e8e809162dc0805d14" + integrity sha512-88GM7D1eLiTxjByjtY7lxU7CJcQ92kX1x0WfnADaIXqqYRLbI1KlIWxXz1Xm5UxuMJh5N847K0NONG49mvZtuw== dependencies: + "@electron/remote" "^1.0.4" dev-null "^0.1.1" - electron-chromedriver "^11.0.0" - request "^2.88.2" + electron-chromedriver "^12.0.0" + got "^11.8.0" split "^1.0.1" webdriverio "^6.9.1" From bbe5a7d50bd5fa6fe9f18a5cbb9c7776a141c615 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 17 May 2021 04:44:57 +0000 Subject: [PATCH 31/57] fix: upgrade ytpl from 2.1.1 to 2.2.0 Snyk has created this PR to upgrade ytpl from 2.1.1 to 2.2.0. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4a41c6de..7e10df26 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "node-fetch": "^2.6.1", "node-notifier": "^9.0.1", "ytdl-core": "^4.5.0", - "ytpl": "^2.1.1" + "ytpl": "^2.2.0" }, "devDependencies": { "electron": "^12.0.7", diff --git a/yarn.lock b/yarn.lock index 4a6bc17a..28933db7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9339,10 +9339,10 @@ ytdl-core@^4.5.0: 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" From 4fb0b1dd085a22f5c6bda67a000ad09071845a08 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Wed, 19 May 2021 00:22:12 +0300 Subject: [PATCH 32/57] switch to `registerCallback()` on song info --- plugins/downloader/menu.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.js index 9822c8ed..ce7f5643 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.js @@ -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; }); From 177ce5721fef2bc5a58373f5ad9139e9edd975d7 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 19 May 2021 05:31:34 +0000 Subject: [PATCH 33/57] fix: upgrade filenamify from 4.2.0 to 4.3.0 Snyk has created this PR to upgrade filenamify from 4.2.0 to 4.3.0. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4a41c6de..0e31c913 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "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", diff --git a/yarn.lock b/yarn.lock index 4a6bc17a..8fb5ee79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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" From 81246231426856b83d9bb1cfe90aba63d43ba10a Mon Sep 17 00:00:00 2001 From: Araxeus Date: Sat, 22 May 2021 18:38:36 +0300 Subject: [PATCH 34/57] fix notificationOnUnpause option --- plugins/notifications/back.js | 4 +++- plugins/notifications/interactive.js | 11 +++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/plugins/notifications/back.js b/plugins/notifications/back.js index 59b934c9..654e3b54 100644 --- a/plugins/notifications/back.js +++ b/plugins/notifications/back.js @@ -25,11 +25,13 @@ const notify = (info, options) => { const setup = (options) => { let oldNotification; + let currentUrl; registerCallback(songInfo => { - if (!songInfo.isPaused || options.unpauseNotification) { + 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); } diff --git a/plugins/notifications/interactive.js b/plugins/notifications/interactive.js index 210402bf..c30c1020 100644 --- a/plugins/notifications/interactive.js +++ b/plugins/notifications/interactive.js @@ -5,17 +5,20 @@ const notifier = require("node-notifier"); //store song controls reference on launch let controls; -let notificationOnPause; +let notificationOnUnpause; module.exports = (win, unpauseNotification) => { //Save controls and onPause option const { playPause, next, previous } = getSongControls(win); controls = { playPause, next, previous }; - notificationOnPause = unpauseNotification; + notificationOnUnpause = unpauseNotification; + + let currentUrl; // Register songInfoCallback registerCallback(songInfo => { - if (!songInfo.isPaused || notificationOnPause) { + if (!songInfo.isPaused && (songInfo.url !== currentUrl || notificationOnUnpause)) { + currentUrl = songInfo.url; sendToaster(songInfo); } }); @@ -78,7 +81,7 @@ 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); } From fb61dbfa6c13023c269569a90fd7c8ac4b122119 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 26 May 2021 04:36:03 +0000 Subject: [PATCH 35/57] fix: upgrade @ffmpeg/core from 0.8.5 to 0.9.0 Snyk has created this PR to upgrade @ffmpeg/core from 0.8.5 to 0.9.0. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4a41c6de..424d2010 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ }, "dependencies": { "@cliqz/adblocker-electron": "^1.20.4", - "@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", diff --git a/yarn.lock b/yarn.lock index 4a6bc17a..ef902cc8 100644 --- a/yarn.lock +++ b/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" From 14dc78984fdd86fb8afe5a97aeabfe7221a5c782 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 26 May 2021 04:36:06 +0000 Subject: [PATCH 36/57] fix: upgrade ytdl-core from 4.5.0 to 4.7.0 Snyk has created this PR to upgrade ytdl-core from 4.5.0 to 4.7.0. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4a41c6de..cc297c43 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "md5": "^2.3.0", "node-fetch": "^2.6.1", "node-notifier": "^9.0.1", - "ytdl-core": "^4.5.0", + "ytdl-core": "^4.7.0", "ytpl": "^2.1.1" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 4a6bc17a..84d94f93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9330,10 +9330,10 @@ 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" From c5f84b568b0c3480af1abc8ff111771e2170a50e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Wed, 26 May 2021 04:36:08 +0000 Subject: [PATCH 37/57] fix: upgrade @cliqz/adblocker-electron from 1.20.4 to 1.20.5 Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.20.4 to 1.20.5. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 62 ++++++++++++++++++++++++++-------------------------- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/package.json b/package.json index 4a41c6de..07f7c5b1 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "npm": "Please use yarn and not npm" }, "dependencies": { - "@cliqz/adblocker-electron": "^1.20.4", + "@cliqz/adblocker-electron": "^1.20.5", "@ffmpeg/core": "^0.8.5", "@ffmpeg/ffmpeg": "^0.9.7", "YoutubeNonStop": "git://github.com/lawfx/YoutubeNonStop.git#v0.9.0", diff --git a/yarn.lock b/yarn.lock index 4a6bc17a..cadafb45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -439,45 +439,45 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cliqz/adblocker-content@^1.20.4": - version "1.20.4" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.20.4.tgz#68c0c628acd6da49bb5a6ad9ee0cb540a8d50acd" - integrity sha512-Cp6M6MERCsLwklX6lAmrgOxom0pr4DjxmUGLcmM9MDACOIzk/m7ya1e82bXzEWAU1Jni2Bp91xUUWxg+DLWJgQ== +"@cliqz/adblocker-content@^1.20.6": + version "1.20.6" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.20.6.tgz#1bfbdb1e5757fc610f3d5d9921bba9d166d687a7" + integrity sha512-KRo8EjIbiuAHBQHJcgs0oefJlp/lw93KQL1Rv9CeMFdKqVZV8IReGqe/V+ipoaOQFVgLZ8gWPOzEkLAQ4P2ZBQ== dependencies: - "@cliqz/adblocker-extended-selectors" "^1.20.4" + "@cliqz/adblocker-extended-selectors" "^1.20.6" -"@cliqz/adblocker-electron-preload@^1.20.4": - version "1.20.4" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.20.4.tgz#b7d6606dfc24e7b3f80109cc6820bd203faaf26e" - integrity sha512-tIEgFJJhEDTYrSUzAL+wbw+BBVwCtuFtckA/scka990DGlXsEmkJ7HxNXvUPwhOQiV4YUwN5bsqxCDA8VDTZNw== +"@cliqz/adblocker-electron-preload@^1.20.6": + version "1.20.6" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.20.6.tgz#c2804edb8c4dd5ce226a2a5ef95b9e6cd3745767" + integrity sha512-2dF6aaTZftwUXswHRSIlSIop4SQGmtpzp3FHVQvB3lCCE2ssONT38nCY0b4PREooZ35tzZTZNyYcOboaear3UQ== dependencies: - "@cliqz/adblocker-content" "^1.20.4" + "@cliqz/adblocker-content" "^1.20.6" -"@cliqz/adblocker-electron@^1.20.4": - version "1.20.4" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.20.4.tgz#6d7de52cff013ef3cd0f4a7850ebfc31f6240a46" - integrity sha512-HaHexPnJL1BBvloXuqmSh8WtpPKYHyZ+o6f+9SciySN4dJAX9BIGTk9D/V6eJWLmy6+wY7/Bpcn2Q4nrYXsqBw== +"@cliqz/adblocker-electron@^1.20.5": + version "1.20.6" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.20.6.tgz#870ff1ba7765f545fee70327d3c7e08adadc7764" + integrity sha512-//fdnVxuab6nfx/Eq9u6r8EbgHl/wOGGIUu/ueaYEstR+m3Re22zJDtbj8AwmN75aDynQ7jhUz81GLqH4o4pzg== dependencies: - "@cliqz/adblocker" "^1.20.4" - "@cliqz/adblocker-electron-preload" "^1.20.4" + "@cliqz/adblocker" "^1.20.6" + "@cliqz/adblocker-electron-preload" "^1.20.6" tldts-experimental "^5.6.21" -"@cliqz/adblocker-extended-selectors@^1.20.4": - version "1.20.4" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.20.4.tgz#6f5ab8251a0d40cacf3703f5621025e0d85d6348" - integrity sha512-VBP8iv1IdYpwQ0hbbeiXCSW7ppzK05dbPM4DyeCb54mB0CjWj/pMQwEvjMZKLWTkEyPd26oMqnxNQz1UgGaZag== +"@cliqz/adblocker-extended-selectors@^1.20.6": + version "1.20.6" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.20.6.tgz#964d3b96e419778c6e4c8ecf5c2b94599dfbdcd7" + integrity sha512-EuGLyv00GeRFr2PKZLaWgnRpKSFLdezqXTJFaljtvb0iieR7yNdjfEdoEJmctRmslTrlcMmpOlNhAOpJavY4bw== -"@cliqz/adblocker@^1.20.4": - version "1.20.4" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.20.4.tgz#63f75456b6d63f66dc73b9ac2971ed073bf26722" - integrity sha512-ylwc4fScwgDjh9mKAvBQ+oCNyZWncrPakU17KbMtq+l82LkzJ0ND0wififpeq+nI9JBiQosW+eus5R08THpwCQ== +"@cliqz/adblocker@^1.20.6": + version "1.20.6" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.20.6.tgz#3428d3c066dbaafa98644fadfd28dd206f8691e2" + integrity sha512-BhYna9gkQnqQfFJy4FOW3cER2oO0IwZzvYQaQEMP5Y/ETUzMq5WBHq5X4dOU+hiJdbkgogIS5L73uPUHDK01Hw== dependencies: - "@cliqz/adblocker-content" "^1.20.4" - "@cliqz/adblocker-extended-selectors" "^1.20.4" + "@cliqz/adblocker-content" "^1.20.6" + "@cliqz/adblocker-extended-selectors" "^1.20.6" "@remusao/guess-url-type" "^1.1.2" "@remusao/small" "^1.1.2" "@remusao/smaz" "^1.7.1" - "@types/chrome" "^0.0.133" + "@types/chrome" "^0.0.136" "@types/firefox-webext-browser" "^82.0.0" tldts-experimental "^5.6.21" @@ -1193,10 +1193,10 @@ "@types/node" "*" "@types/responselike" "*" -"@types/chrome@^0.0.133": - version "0.0.133" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.133.tgz#9e1d55441584ba2d5274ca84db36427da9c5dc6e" - integrity sha512-G8uIUdaCTBILprQvQXBWGXZxjAWbkCkFQit17cdH3zYQEwU8f/etNl8+M7e8MRz9Xj8daHaVpysneMZMx8/ldQ== +"@types/chrome@^0.0.136": + version "0.0.136" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.136.tgz#7c011b9f997b0156f25a140188a0c5689d3f368f" + integrity sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA== dependencies: "@types/filesystem" "*" "@types/har-format" "*" From cd613aaba27715dc67c57fe9775bf76e53470a1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 May 2021 02:56:37 +0000 Subject: [PATCH 38/57] Bump browserslist from 4.16.3 to 4.16.6 Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.16.3 to 4.16.6. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.16.3...4.16.6) Signed-off-by: dependabot[bot] --- yarn.lock | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/yarn.lock b/yarn.lock index 4a6bc17a..187c35d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2177,15 +2177,15 @@ browserify-zlib@^0.2.0: pako "~1.0.5" browserslist@^4.14.5: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^1.1.71" bser@2.1.1: version "2.1.1" @@ -2367,10 +2367,10 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001181: - version "1.0.30001208" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz#a999014a35cebd4f98c405930a057a0d75352eb9" - integrity sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA== +caniuse-lite@^1.0.30001219: + version "1.0.30001230" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71" + integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ== capture-exit@^2.0.0: version "2.0.0" @@ -2593,7 +2593,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.1: +colorette@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== @@ -3365,10 +3365,10 @@ electron-store@^7.0.3: conf "^9.0.0" type-fest "^0.20.2" -electron-to-chromium@^1.3.649: - version "1.3.711" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.711.tgz#92c3caf7ffed5e18bf63f66b4b57b4db2409c450" - integrity sha512-XbklBVCDiUeho0PZQCjC25Ha6uBwqqJeyDhPLwLwfWRAo4x+FZFsmu1pPPkXT+B4MQMQoQULfyaMltDopfeiHQ== +electron-to-chromium@^1.3.723: + version "1.3.740" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.740.tgz#e38b7d2b848f632191b643e6dabca51be2162922" + integrity sha512-Mi2m55JrX2BFbNZGKYR+2ItcGnR4O5HhrvgoRRyZQlaMGQULqDhoGkLWHzJoshSzi7k1PUofxcDbNhlFrDZNhg== electron-unhandled@^3.0.2: version "3.0.2" @@ -6613,10 +6613,10 @@ node-notifier@^9.0.1: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.70: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" From d8f3246e464b98c10dd98abb43782fb45170320a Mon Sep 17 00:00:00 2001 From: TC Date: Fri, 28 May 2021 23:13:07 +0200 Subject: [PATCH 39/57] Bump electron to 12.0.8 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 4a41c6de..ba1ee12f 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "ytpl": "^2.1.1" }, "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", diff --git a/yarn.lock b/yarn.lock index 4a6bc17a..194b5e04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -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" From e5dc1f8a589b36cd84c8d206f95cddd8792e375d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 May 2021 21:39:25 +0000 Subject: [PATCH 40/57] Bump ws from 7.4.3 to 7.4.6 Bumps [ws](https://github.com/websockets/ws) from 7.4.3 to 7.4.6. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.4.3...7.4.6) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 6880584c..4ea2c502 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9114,9 +9114,9 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^7.2.3, ws@^7.3.1: - version "7.4.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.3.tgz#1f9643de34a543b8edb124bdcbc457ae55a6e5cd" - integrity sha512-hr6vCR76GsossIRsr8OLR9acVVm1jyfEWvhbNjtgPOrfvAlKzvyeg/P6r8RuDjRyrcQoPQT7K0DGEPc7Ae6jzA== + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== xdg-basedir@^4.0.0: version "4.0.0" From f186da08349bc4b8f8d617aeff654d6f6f927b15 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 29 May 2021 04:38:22 +0000 Subject: [PATCH 41/57] fix: upgrade @ffmpeg/ffmpeg from 0.9.7 to 0.9.8 Snyk has created this PR to upgrade @ffmpeg/ffmpeg from 0.9.7 to 0.9.8. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index eef4eb58..cfe821e3 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "dependencies": { "@cliqz/adblocker-electron": "^1.20.5", "@ffmpeg/core": "^0.9.0", - "@ffmpeg/ffmpeg": "^0.9.7", + "@ffmpeg/ffmpeg": "^0.9.8", "YoutubeNonStop": "git://github.com/lawfx/YoutubeNonStop.git#v0.9.0", "async-mutex": "^0.3.1", "browser-id3-writer": "^4.4.0", diff --git a/yarn.lock b/yarn.lock index 4ea2c502..a81d2429 100644 --- a/yarn.lock +++ b/yarn.lock @@ -549,10 +549,10 @@ 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" - resolved "https://registry.yarnpkg.com/@ffmpeg/ffmpeg/-/ffmpeg-0.9.7.tgz#f309d689c59e35d345c049bf5e35f1ccde28c215" - integrity sha512-WpZkNnqYGoaMcMd1EpaDi7nxRyEd05OjOTAfItH/ZwvAKJpr7ksvHKTC/NjP0li6mFrTFLGudP81J1tG0babdg== +"@ffmpeg/ffmpeg@^0.9.8": + version "0.9.8" + resolved "https://registry.yarnpkg.com/@ffmpeg/ffmpeg/-/ffmpeg-0.9.8.tgz#d0292ac1e31f6a070b35e18e50dbbd79f2e2bb08" + integrity sha512-QradleJx78hHJBtI1wRsus1L1jxQB3v4h6k8c3CERI9fssm+NSSppuofmsOei7uq7iQEYq3oK9tJNAyEsRoNng== dependencies: is-url "^1.2.4" node-fetch "^2.6.1" From b8c6ebfa53ee649b8c86543e8861a24cbb6f85e7 Mon Sep 17 00:00:00 2001 From: TC Date: Thu, 3 Jun 2021 21:43:07 +0200 Subject: [PATCH 42/57] Set test environment per test file --- jest.config.js | 1 - tests/index.test.js | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/jest.config.js b/jest.config.js index 21e1944c..472d5584 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,6 +2,5 @@ module.exports = { globals: { __APP__: undefined, // A different app will be launched in each test environment }, - testEnvironment: "./tests/environment", testTimeout: 30000, // 30s }; diff --git a/tests/index.test.js b/tests/index.test.js index 9ab4bf63..ccb261ca 100644 --- a/tests/index.test.js +++ b/tests/index.test.js @@ -1,3 +1,7 @@ +/** + * @jest-environment ./tests/environment + */ + describe("YouTube Music App", () => { const app = global.__APP__; From 30e94d1d6f2d15fdfdcd15cf199b781b19fe9745 Mon Sep 17 00:00:00 2001 From: TC Date: Thu, 3 Jun 2021 21:45:28 +0200 Subject: [PATCH 43/57] Refactor videoElement getter into a provider with callback --- plugins/disable-autoplay/front.js | 31 ++++++++----------------------- providers/video-element.js | 22 ++++++++++++++++++++++ 2 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 providers/video-element.js diff --git a/plugins/disable-autoplay/front.js b/plugins/disable-autoplay/front.js index c40eb7fd..eb1b72db 100644 --- a/plugins/disable-autoplay/front.js +++ b/plugins/disable-autoplay/front.js @@ -1,25 +1,10 @@ -let videoElement = null; +const { ontimeupdate } = require("../../providers/video-element"); -const observer = new MutationObserver((mutations, observer) => { - if (!videoElement) { - videoElement = document.querySelector("video"); - } - - if (videoElement) { - videoElement.ontimeupdate = () => { - if (videoElement.currentTime === 0 && videoElement.duration !== NaN) { - // auto-confirm-when-paused plugin can interfere here if not disabled! - videoElement.pause(); - } - }; - } -}); - -function observeVideoElement() { - observer.observe(document, { - childList: true, - subtree: true, +module.exports = () => { + ontimeupdate((videoElement) => { + if (videoElement.currentTime === 0 && videoElement.duration !== NaN) { + // auto-confirm-when-paused plugin can interfere here if not disabled! + videoElement.pause(); + } }); -} - -module.exports = observeVideoElement; +}; diff --git a/providers/video-element.js b/providers/video-element.js new file mode 100644 index 00000000..7be61c89 --- /dev/null +++ b/providers/video-element.js @@ -0,0 +1,22 @@ +let videoElement = null; + +module.exports.ontimeupdate = (cb) => { + const observer = new MutationObserver((mutations, observer) => { + if (!videoElement) { + videoElement = document.querySelector("video"); + if (videoElement) { + observer.disconnect(); + videoElement.ontimeupdate = () => cb(videoElement); + } + } + }); + + if (!videoElement) { + observer.observe(document, { + childList: true, + subtree: true, + }); + } else { + videoElement.ontimeupdate = () => cb(videoElement); + } +}; From ca64a77ed0236fd9cfb4b40e450578a186638dc7 Mon Sep 17 00:00:00 2001 From: TC Date: Thu, 3 Jun 2021 21:47:00 +0200 Subject: [PATCH 44/57] Add SponsorBlock plugin --- config/defaults.js | 14 +++++- plugins/sponsorblock/back.js | 51 +++++++++++++++++++++ plugins/sponsorblock/front.js | 27 +++++++++++ plugins/sponsorblock/segments.js | 29 ++++++++++++ plugins/sponsorblock/tests/segments.test.js | 34 ++++++++++++++ 5 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 plugins/sponsorblock/back.js create mode 100644 plugins/sponsorblock/front.js create mode 100644 plugins/sponsorblock/segments.js create mode 100644 plugins/sponsorblock/tests/segments.test.js diff --git a/config/defaults.js b/config/defaults.js index 12f6a248..f0533241 100644 --- a/config/defaults.js +++ b/config/defaults.js @@ -63,7 +63,19 @@ const defaultConfig = { volumeDown: "Shift+PageDown" }, savedVolume: undefined //plugin save volume between session here - } + }, + sponsorblock: { + enabled: false, + apiURL: "https://sponsor.ajay.app", + categories: [ + "sponsor", + "intro", + "outro", + "interaction", + "selfpromo", + "music_offtopic", + ], + }, }, }; diff --git a/plugins/sponsorblock/back.js b/plugins/sponsorblock/back.js new file mode 100644 index 00000000..3c7eb5b4 --- /dev/null +++ b/plugins/sponsorblock/back.js @@ -0,0 +1,51 @@ +const fetch = require("node-fetch"); + +const defaultConfig = require("../../config/defaults"); +const registerCallback = require("../../providers/song-info"); +const { sortSegments } = require("./segments"); + +let videoID; + +module.exports = (win, options) => { + const { apiURL, categories } = { + ...defaultConfig.plugins.sponsorblock, + ...options, + }; + + registerCallback(async (info) => { + const newURL = info.url || win.webContents.getURL(); + const newVideoID = new URL(newURL).searchParams.get("v"); + + if (videoID !== newVideoID) { + videoID = newVideoID; + const segments = await fetchSegments(apiURL, categories); + win.webContents.send("sponsorblock-skip", segments); + } + }); +}; + +const fetchSegments = async (apiURL, categories) => { + const sponsorBlockURL = `${apiURL}/api/skipSegments?videoID=${videoID}&categories=${JSON.stringify( + categories + )}`; + try { + const resp = await fetch(sponsorBlockURL, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + redirect: "follow", + }); + if (resp.status !== 200) { + return []; + } + const segments = await resp.json(); + const sortedSegments = sortSegments( + segments.map((submission) => submission.segment) + ); + + return sortedSegments; + } catch { + return []; + } +}; diff --git a/plugins/sponsorblock/front.js b/plugins/sponsorblock/front.js new file mode 100644 index 00000000..f9a9dcaa --- /dev/null +++ b/plugins/sponsorblock/front.js @@ -0,0 +1,27 @@ +const { ipcRenderer } = require("electron"); + +const is = require("electron-is"); + +const { ontimeupdate } = require("../../providers/video-element"); + +let currentSegments = []; + +module.exports = () => { + ipcRenderer.on("sponsorblock-skip", (_, segments) => { + currentSegments = segments; + }); + + ontimeupdate((videoElement) => { + if ( + currentSegments.length > 0 && + videoElement.currentTime >= currentSegments[0][0] && + videoElement.currentTime <= currentSegments[0][1] + ) { + videoElement.currentTime = currentSegments[0][1]; + const skipped = currentSegments.shift(); + if (is.dev()) { + console.log("SponsorBlock: skipping segment", skipped); + } + } + }); +}; diff --git a/plugins/sponsorblock/segments.js b/plugins/sponsorblock/segments.js new file mode 100644 index 00000000..c12a9e88 --- /dev/null +++ b/plugins/sponsorblock/segments.js @@ -0,0 +1,29 @@ +// Segments are an array [ [start, end], … ] +module.exports.sortSegments = (segments) => { + segments.sort((segment1, segment2) => + segment1[0] === segment2[0] + ? segment1[1] - segment2[1] + : segment1[0] - segment2[0] + ); + + const compiledSegments = []; + let currentSegment; + + segments.forEach((segment) => { + if (!currentSegment) { + currentSegment = segment; + return; + } + + if (currentSegment[1] < segment[0]) { + compiledSegments.push(currentSegment); + currentSegment = segment; + return; + } + + currentSegment[1] = Math.max(currentSegment[1], segment[1]); + }); + compiledSegments.push(currentSegment); + + return compiledSegments; +}; diff --git a/plugins/sponsorblock/tests/segments.test.js b/plugins/sponsorblock/tests/segments.test.js new file mode 100644 index 00000000..dbc3d4b0 --- /dev/null +++ b/plugins/sponsorblock/tests/segments.test.js @@ -0,0 +1,34 @@ +const { sortSegments } = require("../segments"); + +test("Segment sorting", () => { + expect( + sortSegments([ + [0, 3], + [7, 8], + [5, 6], + ]) + ).toEqual([ + [0, 3], + [5, 6], + [7, 8], + ]); + + expect( + sortSegments([ + [0, 5], + [6, 8], + [4, 6], + ]) + ).toEqual([[0, 8]]); + + expect( + sortSegments([ + [0, 6], + [7, 8], + [4, 6], + ]) + ).toEqual([ + [0, 6], + [7, 8], + ]); +}); From cda07c96751c3424fe81779d25e0c8d0edd6677e Mon Sep 17 00:00:00 2001 From: TC Date: Thu, 3 Jun 2021 22:04:49 +0200 Subject: [PATCH 45/57] Update adblocking --- package.json | 2 +- plugins/adblocker/blocker.js | 4 ++- yarn.lock | 62 ++++++++++++++++++------------------ 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index cfe821e3..12602a18 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "npm": "Please use yarn and not npm" }, "dependencies": { - "@cliqz/adblocker-electron": "^1.20.5", + "@cliqz/adblocker-electron": "^1.22.0", "@ffmpeg/core": "^0.9.0", "@ffmpeg/ffmpeg": "^0.9.8", "YoutubeNonStop": "git://github.com/lawfx/YoutubeNonStop.git#v0.9.0", diff --git a/plugins/adblocker/blocker.js b/plugins/adblocker/blocker.js index f1b73b7b..81d6ec5f 100644 --- a/plugins/adblocker/blocker.js +++ b/plugins/adblocker/blocker.js @@ -8,7 +8,9 @@ const SOURCES = [ "https://raw.githubusercontent.com/kbinani/adblock-youtube-ads/master/signed.txt", // uBlock Origin "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt", - "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2020.txt", + "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters-2021.txt", + // Fanboy Annoyances + "https://secure.fanboy.co.nz/fanboy-annoyance_ubo.txt", ]; const loadAdBlockerEngine = ( diff --git a/yarn.lock b/yarn.lock index a81d2429..26ee2ded 100644 --- a/yarn.lock +++ b/yarn.lock @@ -439,45 +439,45 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cliqz/adblocker-content@^1.20.6": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.20.6.tgz#1bfbdb1e5757fc610f3d5d9921bba9d166d687a7" - integrity sha512-KRo8EjIbiuAHBQHJcgs0oefJlp/lw93KQL1Rv9CeMFdKqVZV8IReGqe/V+ipoaOQFVgLZ8gWPOzEkLAQ4P2ZBQ== +"@cliqz/adblocker-content@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.22.0.tgz#4a625ddfcefa203d98e27f16c16328c655842b8c" + integrity sha512-M6L6OVcuxdu1YA7sSjTtU1CV+taMx+fCd5Wqqfepp2o8eEo9HxNdWrKRfnOG6O0vmpvdRLtdVMPvd74wPr2vvQ== dependencies: - "@cliqz/adblocker-extended-selectors" "^1.20.6" + "@cliqz/adblocker-extended-selectors" "^1.22.0" -"@cliqz/adblocker-electron-preload@^1.20.6": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.20.6.tgz#c2804edb8c4dd5ce226a2a5ef95b9e6cd3745767" - integrity sha512-2dF6aaTZftwUXswHRSIlSIop4SQGmtpzp3FHVQvB3lCCE2ssONT38nCY0b4PREooZ35tzZTZNyYcOboaear3UQ== +"@cliqz/adblocker-electron-preload@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.22.0.tgz#ea04db27572b8be4c34457ecf91f9f6d6d9e470f" + integrity sha512-LwdRIslyPW0tkAua2pqSDCGC89gjTOUToY2/1i6Hdm3ErTw2H3YbIl5/xZJd2pmU56kPtojDsREHowzdxvsXXw== dependencies: - "@cliqz/adblocker-content" "^1.20.6" + "@cliqz/adblocker-content" "^1.22.0" -"@cliqz/adblocker-electron@^1.20.5": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.20.6.tgz#870ff1ba7765f545fee70327d3c7e08adadc7764" - integrity sha512-//fdnVxuab6nfx/Eq9u6r8EbgHl/wOGGIUu/ueaYEstR+m3Re22zJDtbj8AwmN75aDynQ7jhUz81GLqH4o4pzg== +"@cliqz/adblocker-electron@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.22.0.tgz#6648a5c0e648f95eaa12481593b0acafbeb6621a" + integrity sha512-eEv3Y6fKu7529ZDZknVla3PmdsEuychQP+S/d1Ck5s5S0xumnIoh4s9VW5u7XoJJ1dRqy+hUd03la2xoiueQVA== dependencies: - "@cliqz/adblocker" "^1.20.6" - "@cliqz/adblocker-electron-preload" "^1.20.6" + "@cliqz/adblocker" "^1.22.0" + "@cliqz/adblocker-electron-preload" "^1.22.0" tldts-experimental "^5.6.21" -"@cliqz/adblocker-extended-selectors@^1.20.6": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.20.6.tgz#964d3b96e419778c6e4c8ecf5c2b94599dfbdcd7" - integrity sha512-EuGLyv00GeRFr2PKZLaWgnRpKSFLdezqXTJFaljtvb0iieR7yNdjfEdoEJmctRmslTrlcMmpOlNhAOpJavY4bw== +"@cliqz/adblocker-extended-selectors@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.22.0.tgz#29d7f615db8b7bf79e1cdcbd4526f39355230a19" + integrity sha512-tZVPySwPFjYwiUU9wFWbn1VtT3B0BSSdeQT2HjB9CF5EvU33RxywIiF7Kg8gQ3JWwbCeONcmDNQybyOv5hMXQw== -"@cliqz/adblocker@^1.20.6": - version "1.20.6" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.20.6.tgz#3428d3c066dbaafa98644fadfd28dd206f8691e2" - integrity sha512-BhYna9gkQnqQfFJy4FOW3cER2oO0IwZzvYQaQEMP5Y/ETUzMq5WBHq5X4dOU+hiJdbkgogIS5L73uPUHDK01Hw== +"@cliqz/adblocker@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.22.0.tgz#4588ea79d9493638c8babec128e78947d92fee0b" + integrity sha512-vZuZlG0q8+AaEBsfI/b/CvgpSPR5Ipg8GfSZcD/UxtiHHP3otkVDSMKP65T8ypzxh47VdXXEJx950vfDpqjfgA== dependencies: - "@cliqz/adblocker-content" "^1.20.6" - "@cliqz/adblocker-extended-selectors" "^1.20.6" + "@cliqz/adblocker-content" "^1.22.0" + "@cliqz/adblocker-extended-selectors" "^1.22.0" "@remusao/guess-url-type" "^1.1.2" "@remusao/small" "^1.1.2" "@remusao/smaz" "^1.7.1" - "@types/chrome" "^0.0.136" + "@types/chrome" "^0.0.143" "@types/firefox-webext-browser" "^82.0.0" tldts-experimental "^5.6.21" @@ -1193,10 +1193,10 @@ "@types/node" "*" "@types/responselike" "*" -"@types/chrome@^0.0.136": - version "0.0.136" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.136.tgz#7c011b9f997b0156f25a140188a0c5689d3f368f" - integrity sha512-XDEiRhLkMd+SB7Iw3ZUIj/fov3wLd4HyTdLltVszkgl1dBfc3Rb7oPMVZ2Mz2TLqnF7Ow+StbR8E7r9lqpb4DA== +"@types/chrome@^0.0.143": + version "0.0.143" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.143.tgz#0722fd6c76a73003fa220d869d2dbc8afd581810" + integrity sha512-tkPDutWjEl/9hPnfR48IJLpH2Xg1Zs/vxfODRp7duY5a4frkULOHvEED8moJsELTrFkiEciwCxAjxVk2XhKSsA== dependencies: "@types/filesystem" "*" "@types/har-format" "*" From 4a60aa9f200004ac7319ed93c9c36d5ece540eac Mon Sep 17 00:00:00 2001 From: TC Date: Thu, 3 Jun 2021 22:15:36 +0200 Subject: [PATCH 46/57] Keep segments when skipping --- plugins/sponsorblock/front.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/plugins/sponsorblock/front.js b/plugins/sponsorblock/front.js index f9a9dcaa..4f248bfa 100644 --- a/plugins/sponsorblock/front.js +++ b/plugins/sponsorblock/front.js @@ -12,16 +12,16 @@ module.exports = () => { }); ontimeupdate((videoElement) => { - if ( - currentSegments.length > 0 && - videoElement.currentTime >= currentSegments[0][0] && - videoElement.currentTime <= currentSegments[0][1] - ) { - videoElement.currentTime = currentSegments[0][1]; - const skipped = currentSegments.shift(); - if (is.dev()) { - console.log("SponsorBlock: skipping segment", skipped); + currentSegments.forEach((segment) => { + if ( + videoElement.currentTime >= segment[0] && + videoElement.currentTime <= segment[1] + ) { + videoElement.currentTime = segment[1]; + if (is.dev()) { + console.log("SponsorBlock: skipping segment", segment); + } } - } + }); }); }; From 1943116aa1cab0fe4f84c492739273ed0074594e Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 5 Jun 2021 03:53:12 +0000 Subject: [PATCH 47/57] fix: upgrade custom-electron-titlebar from 3.2.6 to 3.2.7 Snyk has created this PR to upgrade custom-electron-titlebar from 3.2.6 to 3.2.7. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 12602a18..bcbce499 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "async-mutex": "^0.3.1", "browser-id3-writer": "^4.4.0", "chokidar": "^3.5.1", - "custom-electron-titlebar": "^3.2.6", + "custom-electron-titlebar": "^3.2.7", "discord-rpc": "^3.2.0", "electron-debug": "^3.2.0", "electron-is": "^3.0.0", diff --git a/yarn.lock b/yarn.lock index 26ee2ded..2a4b29b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2882,10 +2882,10 @@ cssstyle@^2.2.0: dependencies: cssom "~0.3.6" -custom-electron-titlebar@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/custom-electron-titlebar/-/custom-electron-titlebar-3.2.6.tgz#4cd064efa5020954c09732efa8c667a7ee3636e3" - integrity sha512-P3ZGEr0eouUHqhdBBXllpuy2bFhfSmp+32HQBPcwzujjIsUhQxQj/nCpJiFa4SUGAEp1ifu/icuZdDKNNX72Tw== +custom-electron-titlebar@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/custom-electron-titlebar/-/custom-electron-titlebar-3.2.7.tgz#fb249d6180cbda074b1d392bea755fa0743012a8" + integrity sha512-KO/6e3r6YflfNUOzi5QHLwkLHBP+ICtHPo70u/kUIKR8UUkDTPb4a9i19q0uDZQcjkH6oqRvFCz9wEHeEpCgxw== dashdash@^1.12.0: version "1.14.1" From cc4dae60efb997f8bde92ebd7044881ef45893c4 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 8 Jun 2021 04:08:41 +0000 Subject: [PATCH 48/57] fix: upgrade @ffmpeg/ffmpeg from 0.9.8 to 0.10.0 Snyk has created this PR to upgrade @ffmpeg/ffmpeg from 0.9.8 to 0.10.0. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 12602a18..26051fdb 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "dependencies": { "@cliqz/adblocker-electron": "^1.22.0", "@ffmpeg/core": "^0.9.0", - "@ffmpeg/ffmpeg": "^0.9.8", + "@ffmpeg/ffmpeg": "^0.10.0", "YoutubeNonStop": "git://github.com/lawfx/YoutubeNonStop.git#v0.9.0", "async-mutex": "^0.3.1", "browser-id3-writer": "^4.4.0", diff --git a/yarn.lock b/yarn.lock index 26ee2ded..439408ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -549,10 +549,10 @@ resolved "https://registry.yarnpkg.com/@ffmpeg/core/-/core-0.9.0.tgz#4a999a07671c081216fcc2714f73ec02ddc9c24b" integrity sha512-d931yzQpb8GRgTZr+T7+BMqglPZ1R8FPH3W3UA8I21RzuasRHsMwQ4MQTlS9twjfqvUGIkD8p/8mNToUVN/Yrw== -"@ffmpeg/ffmpeg@^0.9.8": - version "0.9.8" - resolved "https://registry.yarnpkg.com/@ffmpeg/ffmpeg/-/ffmpeg-0.9.8.tgz#d0292ac1e31f6a070b35e18e50dbbd79f2e2bb08" - integrity sha512-QradleJx78hHJBtI1wRsus1L1jxQB3v4h6k8c3CERI9fssm+NSSppuofmsOei7uq7iQEYq3oK9tJNAyEsRoNng== +"@ffmpeg/ffmpeg@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@ffmpeg/ffmpeg/-/ffmpeg-0.10.0.tgz#0bebd944d50ce11297b91883f94b2f6220b74e34" + integrity sha512-W+d0ysYTO6d4vue/0KMYrxaprh9wvmnPqh6qyHXavBWLrDcE7gI3cJ/EQVfwe9nrt2e0Pi7873P2I18VEDgRfA== dependencies: is-url "^1.2.4" node-fetch "^2.6.1" From 1987ad1d4f18d40186ab6bf373f4faf52b9574e2 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 8 Jun 2021 04:08:44 +0000 Subject: [PATCH 49/57] fix: upgrade @ffmpeg/core from 0.9.0 to 0.10.0 Snyk has created this PR to upgrade @ffmpeg/core from 0.9.0 to 0.10.0. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 12602a18..3e667818 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ }, "dependencies": { "@cliqz/adblocker-electron": "^1.22.0", - "@ffmpeg/core": "^0.9.0", + "@ffmpeg/core": "^0.10.0", "@ffmpeg/ffmpeg": "^0.9.8", "YoutubeNonStop": "git://github.com/lawfx/YoutubeNonStop.git#v0.9.0", "async-mutex": "^0.3.1", diff --git a/yarn.lock b/yarn.lock index 26ee2ded..36652636 100644 --- a/yarn.lock +++ b/yarn.lock @@ -544,10 +544,10 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@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/core@^0.10.0": + version "0.10.0" + resolved "https://registry.yarnpkg.com/@ffmpeg/core/-/core-0.10.0.tgz#f6a58361b22d7c23c6f7071b9fff6d572bc3f499" + integrity sha512-qunWJl5PezpXEm31tb8Qu5z37B5KVA1VYZCpXchMhuAb3X9T7PuE3SlhOwphEoRhzaOa3lpofDfzihAUMFaVPQ== "@ffmpeg/ffmpeg@^0.9.8": version "0.9.8" From 8eb38271ff655315ad8e8b00128cbf2de38d4073 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Wed, 9 Jun 2021 19:53:04 +0300 Subject: [PATCH 50/57] fix unsupported hidden webp coverart --- providers/song-info.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/providers/song-info.js b/providers/song-info.js index 1b119b82..08eaf944 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -9,18 +9,21 @@ const progressSelector = "#progress-bar"; // Grab the progress using the selector const getProgress = async (win) => { // Get current value of the progressbar element - const elapsedSeconds = await win.webContents.executeJavaScript( + return win.webContents.executeJavaScript( 'document.querySelector("' + progressSelector + '").value' ); - - return elapsedSeconds; }; // Grab the native image using the src const getImage = async (src) => { const result = await fetch(src); const buffer = await result.buffer(); - return nativeImage.createFromBuffer(buffer); + const output = nativeImage.createFromBuffer(buffer); + if (output.isEmpty() && !src.endsWith(".jpg") && src.includes(".jpg")) { // fix hidden webp files (https://github.com/th-ch/youtube-music/issues/315) + return getImage(src.slice(0, src.lastIndexOf(".jpg")+4)); + } else { + return output; + } }; // To find the paused status, we check if the title contains `-` @@ -30,7 +33,7 @@ const getPausedStatus = async (win) => { }; const getArtist = async (win) => { - return await win.webContents.executeJavaScript(` + return win.webContents.executeJavaScript(` document.querySelector(".subtitle.ytmusic-player-bar .yt-formatted-string") ?.textContent `); @@ -112,4 +115,3 @@ module.exports = registerCallback; module.exports.setupSongInfo = registerProvider; module.exports.getImage = getImage; module.exports.cleanupArtistName = cleanupArtistName; - From 2a58dc823a2248b19da6daf7864a1b0ba4c139b0 Mon Sep 17 00:00:00 2001 From: Araxeus Date: Wed, 9 Jun 2021 20:05:14 +0300 Subject: [PATCH 51/57] check if native image is empty before writing id tag --- plugins/downloader/back.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index ee345ab2..060245ed 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -55,7 +55,9 @@ function handle(win) { { ...nowPlayingMetadata, ...currentMetadata }; try { - const coverBuffer = songMetadata.image ? songMetadata.image.toPNG() : null; + const coverBuffer = songMetadata.image && !songMetadata.image.isEmpty() ? + songMetadata.image.toPNG() : null; + const writer = new ID3Writer(songBuffer); // Create the metadata tags From 4387cb485dbe002b0751dd2c5453f106f8dccc3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jun 2021 18:57:55 +0000 Subject: [PATCH 52/57] Bump trim-newlines from 3.0.0 to 3.0.1 Bumps [trim-newlines](https://github.com/sindresorhus/trim-newlines) from 3.0.0 to 3.0.1. - [Release notes](https://github.com/sindresorhus/trim-newlines/releases) - [Commits](https://github.com/sindresorhus/trim-newlines/commits) --- updated-dependencies: - dependency-name: trim-newlines dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 26ee2ded..31bf4f87 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8602,9 +8602,9 @@ tr46@^2.0.2: punycode "^2.1.1" trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== trim-repeated@^1.0.0: version "1.0.0" From fffeac21b76f1c2c6828580aa5ef7fb769cd7e20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jun 2021 04:46:20 +0000 Subject: [PATCH 53/57] Bump normalize-url from 4.5.0 to 4.5.1 Bumps [normalize-url](https://github.com/sindresorhus/normalize-url) from 4.5.0 to 4.5.1. - [Release notes](https://github.com/sindresorhus/normalize-url/releases) - [Commits](https://github.com/sindresorhus/normalize-url/commits) --- updated-dependencies: - dependency-name: normalize-url dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 26ee2ded..dba113f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6651,9 +6651,9 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-url@^4.1.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" - integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== npm-conf@^1.1.3: version "1.1.3" From b7ebb7d49993d0b7f30a6b6b523393a7a5a9ca66 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 12 Jun 2021 04:23:30 +0000 Subject: [PATCH 54/57] fix: upgrade electron-updater from 4.3.8 to 4.3.9 Snyk has created this PR to upgrade electron-updater from 4.3.8 to 4.3.9. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 58 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index 12602a18..dede8b50 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "electron-localshortcut": "^3.2.1", "electron-store": "^7.0.3", "electron-unhandled": "^3.0.2", - "electron-updater": "^4.3.8", + "electron-updater": "^4.3.9", "filenamify": "^4.3.0", "md5": "^2.3.0", "node-fetch": "^2.6.1", diff --git a/yarn.lock b/yarn.lock index 26ee2ded..6adc6c09 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1355,10 +1355,10 @@ dependencies: "@types/node" "*" -"@types/semver@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.4.tgz#43d7168fec6fa0988bb1a513a697b29296721afb" - integrity sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ== +"@types/semver@^7.3.5": + version "7.3.6" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.6.tgz#e9831776f4512a7ba6da53e71c26e5fb67882d63" + integrity sha512-0caWDWmpCp0uifxFh+FaqK3CuZ2SkRR/ZRxAV5+zNdC3QVUi6wyOJnefhPvtNt8NQWXB5OA93BUvZsXpWat2Xw== "@types/stack-utils@^2.0.0": version "2.0.0" @@ -2249,6 +2249,14 @@ builder-util-runtime@8.7.3: debug "^4.3.2" sax "^1.2.4" +builder-util-runtime@8.7.5: + version "8.7.5" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.7.5.tgz#fbe59e274818885e0d2e358d5b7017c34ae6b0f5" + integrity sha512-fgUFHKtMNjdvH6PDRFntdIGUPgwZ69sXsAqEulCtoiqgWes5agrMq/Ud274zjJRTbckYh2PHh8/1CpFc6dpsbQ== + dependencies: + debug "^4.3.2" + sax "^1.2.4" + builder-util@22.10.5: version "22.10.5" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-22.10.5.tgz#8d0b04a3be6acc74938679aa90dcb3181b1ae86b" @@ -3380,18 +3388,19 @@ electron-unhandled@^3.0.2: ensure-error "^2.0.0" lodash.debounce "^4.0.8" -electron-updater@^4.3.8: - version "4.3.8" - resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.8.tgz#94f1731682a756385726183e2b04b959cb319456" - integrity sha512-/tB82Ogb2LqaXrUzAD8waJC+TZV52Pr0Znfj7w+i4D+jA2GgrKFI3Pxjp+36y9FcBMQz7kYsMHcB6c5zBJao+A== +electron-updater@^4.3.9: + version "4.3.9" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.9.tgz#247c660bafad7c07935e1b81acd3e9a5fd733154" + integrity sha512-LCNfedSwZfS4Hza+pDyPR05LqHtGorCStaBgVpRnfKxOlZcvpYEX0AbMeH5XUtbtGRoH2V8osbbf2qKPNb7AsA== dependencies: - "@types/semver" "^7.3.4" - builder-util-runtime "8.7.3" - fs-extra "^9.1.0" - js-yaml "^4.0.0" + "@types/semver" "^7.3.5" + builder-util-runtime "8.7.5" + fs-extra "^10.0.0" + js-yaml "^4.1.0" lazy-val "^1.0.4" + lodash.escaperegexp "^4.1.2" lodash.isequal "^4.5.0" - semver "^7.3.4" + semver "^7.3.5" electron@^12.0.8: version "12.0.8" @@ -4261,6 +4270,15 @@ fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -5784,6 +5802,13 @@ js-yaml@^4.0.0: dependencies: argparse "^2.0.1" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -6152,6 +6177,11 @@ lodash.difference@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" @@ -7880,7 +7910,7 @@ semver@^7.2.1, semver@^7.3.4: dependencies: lru-cache "^6.0.0" -semver@^7.3.2: +semver@^7.3.2, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== From 2a192f39f9b4d754d47c090262acbeeb1b60dcdc Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 19 Jun 2021 05:30:04 +0000 Subject: [PATCH 55/57] fix: upgrade ytdl-core from 4.8.0 to 4.8.2 Snyk has created this PR to upgrade ytdl-core from 4.8.0 to 4.8.2. See this package in npm: See this project in Snyk: https://app.snyk.io/org/th-ch/project/81809c53-bb7b-46b9-a0d7-806d45d74ac6?utm_source=github&utm_medium=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 12602a18..69b974a1 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "md5": "^2.3.0", "node-fetch": "^2.6.1", "node-notifier": "^9.0.1", - "ytdl-core": "^4.7.0", + "ytdl-core": "^4.8.2", "ytpl": "^2.2.0" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 26ee2ded..910ac6da 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9330,10 +9330,10 @@ 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.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== +ytdl-core@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.8.2.tgz#f034ad942c5d958f5987fc8ff0b0639664ae2fb7" + integrity sha512-O3n++YcgZawaXJwbPmnRDgfN6b4kU0DpNdkI9Na5yM3JAdfJmoq5UHc8v9Xjgjr1RilQUUh7mhDnRRPDtKr0Kg== dependencies: m3u8stream "^0.8.3" miniget "^4.0.0" From 0c58bec92130f422eb0894eb4a0c1fd792b64554 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 19 Jun 2021 20:29:37 +0000 Subject: [PATCH 56/57] Bump hosted-git-info from 2.8.8 to 2.8.9 Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.8 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.8...v2.8.9) --- updated-dependencies: - dependency-name: hosted-git-info dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 26ee2ded..5aca322d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4717,9 +4717,9 @@ hmac-drbg@^1.0.1: minimalistic-crypto-utils "^1.0.1" hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^3.0.6, hosted-git-info@^3.0.8: version "3.0.8" From 8ce71d628db25e8495ec54bd08f8ff00233cfccb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 24 Jun 2021 20:04:35 +0000 Subject: [PATCH 57/57] Bump lodash from 4.17.20 to 4.17.21 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.20 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.20...4.17.21) --- updated-dependencies: - dependency-name: lodash dependency-type: indirect ... Signed-off-by: dependabot[bot] --- yarn.lock | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 76151c0e..00b2d9b0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6222,12 +6222,7 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= -lodash@^4.13.1, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -lodash@^4.17.10, lodash@^4.17.21: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==