From f4b6fd53f399ec4d18c3026b8950d338a37fd463 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 9 Nov 2021 05:45:17 +0000 Subject: [PATCH 01/15] fix: upgrade electron-updater from 4.6.0 to 4.6.1 Snyk has created this PR to upgrade electron-updater from 4.6.0 to 4.6.1. 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=referral&page=upgrade-pr --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 2228a191..2ab45575 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "electron-localshortcut": "^3.2.1", "electron-store": "^7.0.3", "electron-unhandled": "^3.0.2", - "electron-updater": "^4.4.6", + "electron-updater": "^4.6.1", "filenamify": "^4.3.0", "md5": "^2.3.0", "mpris-service": "^2.1.2", diff --git a/yarn.lock b/yarn.lock index 7a9b8336..2618b716 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2397,10 +2397,10 @@ builder-util-runtime@8.7.7: debug "^4.3.2" sax "^1.2.4" -builder-util-runtime@8.9.0: - version "8.9.0" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.0.tgz#5d8e7ef101c0bf8a54fec3a70f0c551e8fdd58c2" - integrity sha512-XT7asdRMiSqUj/7EtvSW1mzVARvnhj0Nv4Ei4kD0p8GrKMFJt1Nadm4XwD+PrI2+srrtU+l8JMoBgSe4LX8EmQ== +builder-util-runtime@8.9.2: + version "8.9.2" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz#a9669ae5b5dcabfe411ded26678e7ae997246c28" + integrity sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A== dependencies: debug "^4.3.2" sax "^1.2.4" @@ -3398,13 +3398,13 @@ electron-unhandled@^3.0.2: ensure-error "^2.0.0" lodash.debounce "^4.0.8" -electron-updater@^4.4.6: - version "4.6.0" - resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.0.tgz#17fc25a16d28f749cd3980430461bf7e6927d925" - integrity sha512-evvAwfDn100sIBZ/GLDpcWtWfaug48RGxVuYiSp0foKQkaXJGFyqYy5ADyt+HPML/mSTMPBvUq55cLEW45BroQ== +electron-updater@^4.6.1: + version "4.6.2" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.6.2.tgz#6edd2816a6b3859f55252082f59308b0d314f644" + integrity sha512-KAloJQNXwW2j81n0o2KgBsiRsxp2OS15nty4nZLUjZYNuRyJ7yp2zeKPL4fVNGY6Ave491ht7/Dyz5OIykJf9g== dependencies: "@types/semver" "^7.3.6" - builder-util-runtime "8.9.0" + builder-util-runtime "8.9.2" fs-extra "^10.0.0" js-yaml "^4.1.0" lazy-val "^1.0.5" From e70b41b256d50f6dc6ee4448e1c1394aab1715c1 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Tue, 9 Nov 2021 05:45:20 +0000 Subject: [PATCH 02/15] fix: upgrade @cliqz/adblocker-electron from 1.22.7 to 1.23.0 Snyk has created this PR to upgrade @cliqz/adblocker-electron from 1.22.7 to 1.23.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=referral&page=upgrade-pr --- package.json | 2 +- yarn.lock | 72 ++++++++++++++++++++++++++-------------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index 2228a191..cfa8009c 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "npm": "Please use yarn and not npm" }, "dependencies": { - "@cliqz/adblocker-electron": "^1.22.6", + "@cliqz/adblocker-electron": "^1.23.0", "@ffmpeg/core": "^0.10.0", "@ffmpeg/ffmpeg": "^0.10.0", "async-mutex": "^0.3.2", diff --git a/yarn.lock b/yarn.lock index 7a9b8336..04f18d31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -650,46 +650,46 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cliqz/adblocker-content@^1.22.7": - version "1.22.7" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.22.7.tgz#02bfa1775d8be1efa82e9d5802cc17cfa9dc0712" - integrity sha512-pAGxQ7sKCk7r0g/d7vyxY1MhkLfxfwMzd4WPL9234HmU/blCGCg1QL8wkjLTNYJERXZ+xoJ2dqMOisR/nE0ypA== +"@cliqz/adblocker-content@^1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-content/-/adblocker-content-1.23.0.tgz#4417a28d6018138956898efa141c9e6f52c9ec34" + integrity sha512-X1osDX8pWGE1wGFnJqdY4qnwHI9Kb48Tom8HeZWTYDsf8VN636xUB5e5s4YZCTSfn271tFHYSdXNx3+TZqkkkQ== dependencies: - "@cliqz/adblocker-extended-selectors" "^1.22.7" + "@cliqz/adblocker-extended-selectors" "^1.23.0" -"@cliqz/adblocker-electron-preload@^1.22.7": - version "1.22.7" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.22.7.tgz#1de6c4c3e66d566149cf60785b85d6f3fdb9a9ea" - integrity sha512-1eUQvmmDd5Wi0ka48SRggd80ZBilnA7uRePni/cVGfH5LSecCs5WoIpEhuoc1G333DXeBv9W0sRc1wVlKBsszg== +"@cliqz/adblocker-electron-preload@^1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron-preload/-/adblocker-electron-preload-1.23.0.tgz#69b42929fb06f1a3e0af7822813f7d4fb0698c3e" + integrity sha512-sLvmoI7sr9dro/zBidVJU8gGrh+8GmS4Bzkbmxl5Wzgr6Q7cAPf1OOO8ixSXltFurJWH7OJCgPss4WC8Q/kc5w== dependencies: - "@cliqz/adblocker-content" "^1.22.7" + "@cliqz/adblocker-content" "^1.23.0" -"@cliqz/adblocker-electron@^1.22.6": - version "1.22.7" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.22.7.tgz#bd29cf47835bc5c0c4d146333de3944096d23b4d" - integrity sha512-/O5Dskkr7R/8RKOby04VZ7HbnU/OD6Kk+raLxyP858FOYccHOnBjkAcUcUzun2x0UXmHX9Cus8SJ3h8GbrG7ZA== +"@cliqz/adblocker-electron@^1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-electron/-/adblocker-electron-1.23.0.tgz#8ad7f4f705291b9d038356464bde46b310af602c" + integrity sha512-j7X8B1p4PFHkHA7wOLxPpHUz2smsTkYM04/X8/mQyTUf42jzvqqA14qF0r4EGbavSrdqQxKEkHxeHhw2odHykQ== dependencies: - "@cliqz/adblocker" "^1.22.7" - "@cliqz/adblocker-electron-preload" "^1.22.7" + "@cliqz/adblocker" "^1.23.0" + "@cliqz/adblocker-electron-preload" "^1.23.0" tldts-experimental "^5.6.21" -"@cliqz/adblocker-extended-selectors@^1.22.7": - version "1.22.7" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.22.7.tgz#ca0f219d773af5e8013287e5ddd8b00761359d87" - integrity sha512-eHZWYJsgPZPaiLyQtZF7phDFoEqAzk54eno0P+Daal+QwiNixobsk3V4Uh1AVGFcmFEG/Z2CbC/vdWSHpSlImw== +"@cliqz/adblocker-extended-selectors@^1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.23.0.tgz#44e54a91ae6f4cbc24f76f5b0ce16ec03851c015" + integrity sha512-6Zl/wdGBuRd80ssmThOYS0L9u2t4lZElJXpxRB3Jp7uF6oL4LqSK4OKps4x8BktdQMgej6r5EhCh1avwu/13Bg== -"@cliqz/adblocker@^1.22.7": - version "1.22.7" - resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.22.7.tgz#e2ee745c663ad6862e627de240973bdb4f1dc100" - integrity sha512-DxHlLJmV1q05F1I6BORqvBaOc43Vqts8c+vZdsjYdfiwfrPtuVRFYVTwZeMlZHBhmWx4HyxnfFakzJ8hw/B09A== +"@cliqz/adblocker@^1.23.0": + version "1.23.0" + resolved "https://registry.yarnpkg.com/@cliqz/adblocker/-/adblocker-1.23.0.tgz#a970d1199d36161a6154e27654cd7eb59a10a497" + integrity sha512-SRgSqEzFSN99zBeW3Or7ZW1uiIn+O2/Ol6KmZnsTZ/Wrn2RAQsm4wEzxPi6BSC3HpdJh2JdKuAwISavpmhuuvA== dependencies: - "@cliqz/adblocker-content" "^1.22.7" - "@cliqz/adblocker-extended-selectors" "^1.22.7" + "@cliqz/adblocker-content" "^1.23.0" + "@cliqz/adblocker-extended-selectors" "^1.23.0" "@remusao/guess-url-type" "^1.1.2" "@remusao/small" "^1.1.2" "@remusao/smaz" "^1.7.1" - "@types/chrome" "^0.0.157" - "@types/firefox-webext-browser" "^82.0.0" + "@types/chrome" "^0.0.159" + "@types/firefox-webext-browser" "^94.0.0" tldts-experimental "^5.6.21" "@develar/schema-utils@~2.6.5": @@ -1441,10 +1441,10 @@ "@types/node" "*" "@types/responselike" "*" -"@types/chrome@^0.0.157": - version "0.0.157" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.157.tgz#5a50bd378f4f632383c6ebbc34c88fb87d501f58" - integrity sha512-q5SSmA9nKaDzFi8QkJW9kW8MYwWg9O7PKPUdBxsz+3rPcIF1Kxw0Bexpd70Uq1mU6PN4DBp4qKMXQDybUeiI9w== +"@types/chrome@^0.0.159": + version "0.0.159" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.159.tgz#0c1125fbb6d1fd64713e35de9aafbfd5a1b7a33a" + integrity sha512-WZBkNJGAwZuRgv/an94DANdzFtJK0TvlO/evMpJD/TYnkjIxynIAU6RM7M78e8tyig/vD6weQ9T1Ba7v8nYjXQ== dependencies: "@types/filesystem" "*" "@types/har-format" "*" @@ -1479,10 +1479,10 @@ resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3" integrity sha1-wFTor02d11205jq8dviFFocU1LM= -"@types/firefox-webext-browser@^82.0.0": - version "82.0.0" - resolved "https://registry.yarnpkg.com/@types/firefox-webext-browser/-/firefox-webext-browser-82.0.0.tgz#4d0f5cfebd7321d2cbf0ccfb6032570f0138b958" - integrity sha512-zKHePkjMx42KIUUZCPcUiyu1tpfQXH9VR4iDYfns3HvmKVJzt/TAFT+DFVroos8BI9RH78YgF3Hi/wlC6R6cKA== +"@types/firefox-webext-browser@^94.0.0": + version "94.0.0" + resolved "https://registry.yarnpkg.com/@types/firefox-webext-browser/-/firefox-webext-browser-94.0.0.tgz#8a470475ab111e47d34e2599034e227feece09f9" + integrity sha512-DU6rySaklQlzc3tnVAFNgK2OGkOKCDze8ZlhQFtx+Ag4w2rzgNFoqlwQHrUqUogRJph7Gxf1M8e9n4mlYlragw== "@types/fs-extra@^9.0.11": version "9.0.12" From 65ce62adc1077a0fd36d2a7e49df567e43ca2595 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Tue, 9 Nov 2021 13:29:41 +0200 Subject: [PATCH 03/15] use $('video') srcChanged event instead of loadeddata/metadata --- plugins/disable-autoplay/front.js | 2 +- plugins/playback-speed/front.js | 2 +- plugins/video-toggle/front.js | 6 +++--- providers/song-info-front.js | 24 ++++++++++++++++++------ 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/plugins/disable-autoplay/front.js b/plugins/disable-autoplay/front.js index 532405de..615b978a 100644 --- a/plugins/disable-autoplay/front.js +++ b/plugins/disable-autoplay/front.js @@ -1,6 +1,6 @@ module.exports = () => { document.addEventListener('apiLoaded', () => { - document.querySelector('video').addEventListener('loadeddata', e => { + document.querySelector('video').addEventListener('srcChanged', e => { e.target.pause(); }) }, { once: true, passive: true }) diff --git a/plugins/playback-speed/front.js b/plugins/playback-speed/front.js index f1ea78e8..c5e43064 100644 --- a/plugins/playback-speed/front.js +++ b/plugins/playback-speed/front.js @@ -49,7 +49,7 @@ const observePopupContainer = () => { const observeVideo = () => { $('video').addEventListener('ratechange', forcePlaybackRate) - $('video').addEventListener('loadeddata', forcePlaybackRate) + $('video').addEventListener('srcChanged', forcePlaybackRate) } const setupWheelListener = () => { diff --git a/plugins/video-toggle/front.js b/plugins/video-toggle/front.js index 588642a0..2fff595f 100644 --- a/plugins/video-toggle/front.js +++ b/plugins/video-toggle/front.js @@ -35,13 +35,13 @@ function setup() { setOptions("video-toggle", options); }) - $('video').addEventListener('loadedmetadata', videoStarted); + $('video').addEventListener('srcChanged', videoStarted); } function changeDisplay(showVideo) { - if (!showVideo && $('ytmusic-player').getAttribute('playback-mode') !== "ATV_PREFERRED") { + if (!showVideo) { $('video').style.top = "0"; - $('ytmusic-player').style.margin = "auto 21.5px"; + $('ytmusic-player').style.margin = "auto 0px"; $('ytmusic-player').setAttribute('playback-mode', "ATV_PREFERRED"); } diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 4ff6041d..bbbd981e 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -10,10 +10,22 @@ ipcRenderer.on("update-song-info", async (_, extractedSongInfo) => { }); module.exports = () => { - document.addEventListener('apiLoaded', e => { - document.querySelector('video').addEventListener('loadedmetadata', () => { - const data = e.detail.getPlayerResponse(); - ipcRenderer.send("song-info-request", JSON.stringify(data)); - }); - }, { once: true, passive: true }) + document.addEventListener('apiLoaded', e => observeSrcChange(e.detail), { once: true, passive: true }); }; + +// used because 'loadeddata' or 'loadedmetadata' weren't firing on song start for some users (https://github.com/th-ch/youtube-music/issues/473) +function observeSrcChange(api) { + const srcChangedEvent = new CustomEvent('srcChanged'); + + const video = document.querySelector('video'); + + const playbackModeObserver = new MutationObserver((mutations) => { + mutations.forEach(mutation => { + if (mutation.target.src) { // in first mutation src is usually an empty string (loading) + video.dispatchEvent(srcChangedEvent); + ipcRenderer.send("song-info-request", JSON.stringify(api.getPlayerResponse())); + } + }) + }); + playbackModeObserver.observe(video, { attributeFilter: ["src"] }) +} From 895136af0ad1f4423c7a9bfab11c4d8ac523fcf7 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Tue, 9 Nov 2021 16:08:40 +0200 Subject: [PATCH 04/15] used youtube's videodatachange event --- plugins/disable-autoplay/front.js | 6 ++--- plugins/video-toggle/front.js | 38 +++++++++++++++++++++++-------- providers/song-info-front.js | 29 ++++++++++------------- 3 files changed, 43 insertions(+), 30 deletions(-) diff --git a/plugins/disable-autoplay/front.js b/plugins/disable-autoplay/front.js index 615b978a..11e78ebc 100644 --- a/plugins/disable-autoplay/front.js +++ b/plugins/disable-autoplay/front.js @@ -1,7 +1,7 @@ module.exports = () => { - document.addEventListener('apiLoaded', () => { - document.querySelector('video').addEventListener('srcChanged', e => { - e.target.pause(); + document.addEventListener('apiLoaded', e => { + document.querySelector('video').addEventListener('srcChanged', () => { + e.detail.pauseVideo(); }) }, { once: true, passive: true }) }; diff --git a/plugins/video-toggle/front.js b/plugins/video-toggle/front.js index 2fff595f..5adb7ab0 100644 --- a/plugins/video-toggle/front.js +++ b/plugins/video-toggle/front.js @@ -6,6 +6,8 @@ function $(selector) { return document.querySelector(selector); } let options; +let api; + const switchButtonDiv = ElementFromFile( templatePath(__dirname, "button_template.html") ); @@ -17,7 +19,9 @@ module.exports = (_options) => { document.addEventListener('apiLoaded', setup, { once: true, passive: true }); } -function setup() { +function setup(e) { + api = e.detail; + $('ytmusic-player-page').prepend(switchButtonDiv); $('#song-image.ytmusic-player').style.display = "block" @@ -36,6 +40,8 @@ function setup() { }) $('video').addEventListener('srcChanged', videoStarted); + + observeThumbnail(); } function changeDisplay(showVideo) { @@ -51,11 +57,8 @@ function changeDisplay(showVideo) { } function videoStarted() { - if (videoExist()) { - const thumbnails = $('#movie_player').getPlayerResponse()?.videoDetails?.thumbnail?.thumbnails; - if (thumbnails && thumbnails.length > 0) { - $('#song-image img').src = thumbnails[thumbnails.length-1].url; - } + if (api.getPlayerResponse().videoDetails.musicVideoType === 'MUSIC_VIDEO_TYPE_OMV') { // or `$('#player').videoMode_` + forceThumbnail($('#song-image img')); switchButtonDiv.style.display = "initial"; if (!options.hideVideo && $('#song-video.ytmusic-player').style.display === "none") { changeDisplay(true); @@ -66,10 +69,6 @@ function videoStarted() { } } -function videoExist() { - return $('#player').videoMode_; -} - // on load, after a delay, the page overrides the playback-mode to 'OMV_PREFERRED' which causes weird aspect ratio in the image container // this function fix the problem by overriding that override :) function forcePlaybackMode() { @@ -83,3 +82,22 @@ function forcePlaybackMode() { }); playbackModeObserver.observe($('ytmusic-player'), { attributeFilter: ["playback-mode"] }) } + +function observeThumbnail() { + const playbackModeObserver = new MutationObserver(mutations => { + if (!$('#player').videoMode_) return; + + mutations.forEach(mutation => { + if (!mutation.target.src.startsWith('data:')) return; + forceThumbnail(mutation.target) + }); + }); + playbackModeObserver.observe($('#song-image img'), { attributeFilter: ["src"] }) +} + +function forceThumbnail(img) { + const thumbnails = $('#movie_player').getPlayerResponse()?.videoDetails?.thumbnail?.thumbnails; + if (thumbnails && thumbnails.length > 0) { + img.src = thumbnails[thumbnails.length - 1].url; + } +} diff --git a/providers/song-info-front.js b/providers/song-info-front.js index bbbd981e..072d7a53 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -9,23 +9,18 @@ ipcRenderer.on("update-song-info", async (_, extractedSongInfo) => { global.songInfo.image = await getImage(global.songInfo.imageSrc); }); -module.exports = () => { - document.addEventListener('apiLoaded', e => observeSrcChange(e.detail), { once: true, passive: true }); -}; - // used because 'loadeddata' or 'loadedmetadata' weren't firing on song start for some users (https://github.com/th-ch/youtube-music/issues/473) -function observeSrcChange(api) { - const srcChangedEvent = new CustomEvent('srcChanged'); +const srcChangedEvent = new CustomEvent('srcChanged'); - const video = document.querySelector('video'); - - const playbackModeObserver = new MutationObserver((mutations) => { - mutations.forEach(mutation => { - if (mutation.target.src) { // in first mutation src is usually an empty string (loading) - video.dispatchEvent(srcChangedEvent); - ipcRenderer.send("song-info-request", JSON.stringify(api.getPlayerResponse())); - } +module.exports = () => { + document.addEventListener('apiLoaded', apiEvent => { + const video = document.querySelector('video'); + // name = "dataloaded" and abit later "dataupdated" + apiEvent.detail.addEventListener('videodatachange', (name, dataEvent) => { + if (name !== 'dataloaded') return; + ipcRenderer.send("song-info-request", JSON.stringify(dataEvent.playerResponse)); + video.dispatchEvent(srcChangedEvent); }) - }); - playbackModeObserver.observe(video, { attributeFilter: ["src"] }) -} + + }, { once: true, passive: true }); +}; From 6dbed73e6be8e10029faad3e702d9bc1a62d6b0a Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Tue, 9 Nov 2021 18:15:26 +0200 Subject: [PATCH 05/15] fix disable autoplay --- plugins/disable-autoplay/front.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/disable-autoplay/front.js b/plugins/disable-autoplay/front.js index 11e78ebc..c34a453a 100644 --- a/plugins/disable-autoplay/front.js +++ b/plugins/disable-autoplay/front.js @@ -1,7 +1,14 @@ module.exports = () => { - document.addEventListener('apiLoaded', e => { - document.querySelector('video').addEventListener('srcChanged', () => { - e.detail.pauseVideo(); + document.addEventListener('apiLoaded', apiEvent => { + apiEvent.detail.addEventListener('videodatachange', name => { + if (name === 'dataloaded') { + apiEvent.detail.pauseVideo(); + document.querySelector('video').ontimeupdate = e => { + e.target.pause(); + } + } else { + document.querySelector('video').ontimeupdate = null; + } }) }, { once: true, passive: true }) }; From 08fdd07969d2090d20ab8c5358e649fe86faec2d Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Wed, 10 Nov 2021 20:44:13 +0200 Subject: [PATCH 06/15] speed up sponsorblock --- plugins/sponsorblock/back.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/plugins/sponsorblock/back.js b/plugins/sponsorblock/back.js index 0f16f102..592d486d 100644 --- a/plugins/sponsorblock/back.js +++ b/plugins/sponsorblock/back.js @@ -1,8 +1,8 @@ const fetch = require("node-fetch"); const is = require("electron-is"); +const { ipcMain } = require("electron"); const defaultConfig = require("../../config/defaults"); -const registerCallback = require("../../providers/song-info"); const { sortSegments } = require("./segments"); let videoID; @@ -13,15 +13,10 @@ module.exports = (win, options) => { ...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); - } + ipcMain.on("song-info-request", async (_, data) => { + videoID = JSON.parse(data)?.videoDetails?.videoId; + const segments = await fetchSegments(apiURL, categories); + win.webContents.send("sponsorblock-skip", segments); }); }; From cfe719b6bd2db3f15e668930df43a678cbc7c2f6 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Fri, 12 Nov 2021 17:46:40 +0200 Subject: [PATCH 07/15] use native thumbnail without modifiers --- plugins/video-toggle/front.js | 2 +- providers/song-info-front.js | 2 +- providers/song-info.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/video-toggle/front.js b/plugins/video-toggle/front.js index 5adb7ab0..d550a375 100644 --- a/plugins/video-toggle/front.js +++ b/plugins/video-toggle/front.js @@ -98,6 +98,6 @@ function observeThumbnail() { function forceThumbnail(img) { const thumbnails = $('#movie_player').getPlayerResponse()?.videoDetails?.thumbnail?.thumbnails; if (thumbnails && thumbnails.length > 0) { - img.src = thumbnails[thumbnails.length - 1].url; + img.src = thumbnails[thumbnails.length - 1].url.split("?")[0]; } } diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 072d7a53..03a8c6b1 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -18,8 +18,8 @@ module.exports = () => { // name = "dataloaded" and abit later "dataupdated" apiEvent.detail.addEventListener('videodatachange', (name, dataEvent) => { if (name !== 'dataloaded') return; - ipcRenderer.send("song-info-request", JSON.stringify(dataEvent.playerResponse)); video.dispatchEvent(srcChangedEvent); + ipcRenderer.send("song-info-request", JSON.stringify(dataEvent.playerResponse)); }) }, { once: true, passive: true }); diff --git a/providers/song-info.js b/providers/song-info.js index 37cd55fa..1c2c96c7 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -52,7 +52,7 @@ const handleData = async (responseText, win) => { songInfo.title = cleanupName(data?.videoDetails?.title); songInfo.artist =cleanupName(data?.videoDetails?.author); songInfo.views = data?.videoDetails?.viewCount; - songInfo.imageSrc = data?.videoDetails?.thumbnail?.thumbnails?.pop()?.url; + songInfo.imageSrc = data?.videoDetails?.thumbnail?.thumbnails?.pop()?.url.split("?")[0]; songInfo.songDuration = data?.videoDetails?.lengthSeconds; songInfo.image = await getImage(songInfo.imageSrc); songInfo.uploadDate = data?.microformat?.microformatDataRenderer?.uploadDate; From 8da78d50c4d977d218d88dc9c9372a11c84a0125 Mon Sep 17 00:00:00 2001 From: Rubecks Date: Fri, 12 Nov 2021 17:58:39 -0300 Subject: [PATCH 08/15] Exponential Volume Plugin --- plugins/exponential-volume/front.js | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 plugins/exponential-volume/front.js diff --git a/plugins/exponential-volume/front.js b/plugins/exponential-volume/front.js new file mode 100644 index 00000000..ad50d237 --- /dev/null +++ b/plugins/exponential-volume/front.js @@ -0,0 +1,47 @@ +// "Youtube Music fix volume ratio 0.4" by Marco Pfeiffer +// https://greasyfork.org/en/scripts/397686-youtube-music-fix-volume-ratio/ + +const exponentialVolume = () => { + // manipulation exponent, higher value = lower volume + // 3 is the value used by pulseaudio, which Barteks2x figured out this gist here: https://gist.github.com/Barteks2x/a4e189a36a10c159bb1644ffca21c02a + // 0.05 (or 5%) is the lowest you can select in the UI which with an exponent of 3 becomes 0.000125 or 0.0125% + const EXPONENT = 3; + + const storedOriginalVolumes = new WeakMap(); + const { get, set } = Object.getOwnPropertyDescriptor( + HTMLMediaElement.prototype, + "volume" + ); + Object.defineProperty(HTMLMediaElement.prototype, "volume", { + get() { + const lowVolume = get.call(this); + const calculatedOriginalVolume = lowVolume ** (1 / EXPONENT); + + // The calculated value has some accuracy issues which can lead to problems for implementations that expect exact values. + // To avoid this, I'll store the unmodified volume to return it when read here. + // This mostly solves the issue, but the initial read has no stored value and the volume can also change though external influences. + // To avoid ill effects, I check if the stored volume is somewhere in the same range as the calculated volume. + const storedOriginalVolume = storedOriginalVolumes.get(this); + const storedDeviation = Math.abs( + storedOriginalVolume - calculatedOriginalVolume + ); + + const originalVolume = + storedDeviation < 0.01 + ? storedOriginalVolume + : calculatedOriginalVolume; + return originalVolume; + }, + set(originalVolume) { + const lowVolume = originalVolume ** EXPONENT; + storedOriginalVolumes.set(this, originalVolume); + set.call(this, lowVolume); + }, + }); +}; + +module.exports = () => + document.addEventListener("apiLoaded", exponentialVolume, { + once: true, + passive: true, + }); From bf45ed10aa470a5964224d2de875b8cabee0d08e Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Sun, 14 Nov 2021 21:45:34 +0200 Subject: [PATCH 09/15] fix #490 --- plugins/blur-nav-bar/style.css | 2 +- plugins/in-app-menu/style.css | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/blur-nav-bar/style.css b/plugins/blur-nav-bar/style.css index d1722b79..13b7536c 100644 --- a/plugins/blur-nav-bar/style.css +++ b/plugins/blur-nav-bar/style.css @@ -1,6 +1,6 @@ #nav-bar-background, #header.ytmusic-item-section-renderer { background: rgba(0, 0, 0, 0.3) !important; - backdrop-filter: blur(18px) !important; + backdrop-filter: blur(8px) !important; } #nav-bar-divider { diff --git a/plugins/in-app-menu/style.css b/plugins/in-app-menu/style.css index 090a94ef..48ec7f67 100644 --- a/plugins/in-app-menu/style.css +++ b/plugins/in-app-menu/style.css @@ -7,7 +7,10 @@ /* fixes nav-bar-background opacity bug and allows clicking scrollbar through it */ #nav-bar-background { opacity: 1 !important; - pointer-events: none; + pointer-events: none !important; + position: sticky !important; + top: 0 !important; + height: 75px !important; } /* remove window dragging for nav bar (conflict with titlebar drag) */ @@ -19,7 +22,7 @@ ytmusic-pivot-bar-item-renderer { /* move up item selection renderer by 13 px */ ytmusic-item-section-renderer.stuck #header.ytmusic-item-section-renderer { - top: calc(var(--ytmusic-nav-bar-height) - 13px) !important; + top: calc(var(--ytmusic-nav-bar-height) - 13px) !important; } /* fix weird positioning in search screen*/ @@ -28,8 +31,7 @@ ytmusic-header-renderer.ytmusic-search-page { } /* Move navBar downwards */ -ytmusic-nav-bar[slot="nav-bar"], -#nav-bar-background { +ytmusic-nav-bar[slot="nav-bar"] { top: 17px !important; } From 93e0664f95dcb7ebd7037e47bd822510d484bd40 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Sun, 14 Nov 2021 21:59:04 +0200 Subject: [PATCH 10/15] fix height & blur of search page item header --- plugins/blur-nav-bar/style.css | 10 ++++++---- plugins/in-app-menu/style.css | 9 +++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/plugins/blur-nav-bar/style.css b/plugins/blur-nav-bar/style.css index 13b7536c..26ad4182 100644 --- a/plugins/blur-nav-bar/style.css +++ b/plugins/blur-nav-bar/style.css @@ -1,8 +1,10 @@ -#nav-bar-background, #header.ytmusic-item-section-renderer { - background: rgba(0, 0, 0, 0.3) !important; - backdrop-filter: blur(8px) !important; +#nav-bar-background, +#header.ytmusic-item-section-renderer, +ytmusic-tabs { + background: rgba(0, 0, 0, 0.3) !important; + backdrop-filter: blur(8px) !important; } #nav-bar-divider { - display: none !important; + display: none !important; } diff --git a/plugins/in-app-menu/style.css b/plugins/in-app-menu/style.css index 48ec7f67..8c13c62b 100644 --- a/plugins/in-app-menu/style.css +++ b/plugins/in-app-menu/style.css @@ -4,7 +4,7 @@ font-size: 14px !important; } -/* fixes nav-bar-background opacity bug and allows clicking scrollbar through it */ +/* fixes nav-bar-background opacity bug, reposition it, and allows clicking scrollbar through it */ #nav-bar-background { opacity: 1 !important; pointer-events: none !important; @@ -20,9 +20,10 @@ ytmusic-pivot-bar-item-renderer { -webkit-app-region: unset !important; } -/* move up item selection renderer by 13 px */ -ytmusic-item-section-renderer.stuck #header.ytmusic-item-section-renderer { - top: calc(var(--ytmusic-nav-bar-height) - 13px) !important; +/* move up item selection renderers */ +ytmusic-item-section-renderer.stuck #header.ytmusic-item-section-renderer, +ytmusic-tabs.stuck { + top: calc(var(--ytmusic-nav-bar-height) - 15px) !important; } /* fix weird positioning in search screen*/ From 6726e2600b3ca3a8d68e3e1b95b50da211fa354d Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Sun, 14 Nov 2021 23:43:04 +0200 Subject: [PATCH 11/15] rework songInfo pause listener --- plugins/sponsorblock/back.js | 2 +- providers/song-info-front.js | 14 ++++-- providers/song-info.js | 92 ++++++++++++++++-------------------- 3 files changed, 52 insertions(+), 56 deletions(-) diff --git a/plugins/sponsorblock/back.js b/plugins/sponsorblock/back.js index 592d486d..04667b85 100644 --- a/plugins/sponsorblock/back.js +++ b/plugins/sponsorblock/back.js @@ -13,7 +13,7 @@ module.exports = (win, options) => { ...options, }; - ipcMain.on("song-info-request", async (_, data) => { + ipcMain.on("video-src-changed", async (_, data) => { videoID = JSON.parse(data)?.videoDetails?.videoId; const segments = await fetchSegments(apiURL, categories); win.webContents.send("sponsorblock-skip", segments); diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 03a8c6b1..8b3c302f 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -16,11 +16,19 @@ module.exports = () => { document.addEventListener('apiLoaded', apiEvent => { const video = document.querySelector('video'); // name = "dataloaded" and abit later "dataupdated" - apiEvent.detail.addEventListener('videodatachange', (name, dataEvent) => { + apiEvent.detail.addEventListener('videodatachange', (name, _dataEvent) => { if (name !== 'dataloaded') return; video.dispatchEvent(srcChangedEvent); - ipcRenderer.send("song-info-request", JSON.stringify(dataEvent.playerResponse)); + ipcRenderer.send("video-src-changed", JSON.stringify(apiEvent.detail.getPlayerResponse())); }) - + for (const status of ['playing', 'pause']) { + video.addEventListener(status, sendSongInfo); + } + function sendSongInfo() { + const data = apiEvent.detail.getPlayerResponse(); + data.videoDetails.elapsedSeconds = Math.floor(video.currentTime); + data.videoDetails.isPaused = video.paused; + ipcRenderer.send("song-info-request", JSON.stringify(apiEvent.detail.getPlayerResponse())); + } }, { once: true, passive: true }); }; diff --git a/providers/song-info.js b/providers/song-info.js index 1c2c96c7..37954df2 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -4,32 +4,6 @@ const fetch = require("node-fetch"); const config = require("../config"); -// Grab the progress using the selector -const getProgress = async (win) => { - // Get current value of the progressbar element - return win.webContents.executeJavaScript( - 'document.querySelector("#progress-bar").value' - ); -}; - -// Grab the native image using the src -const getImage = async (src) => { - const result = await fetch(src); - const buffer = await result.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 `-` -const getPausedStatus = async (win) => { - const title = await win.webContents.executeJavaScript("document.title"); - return !title.includes("-"); -}; - // Fill songInfo with empty values /** * @typedef {songInfo} SongInfo @@ -47,21 +21,48 @@ const songInfo = { url: "", }; +// Grab the native image using the src +const getImage = async (src) => { + const result = await fetch(src); + const buffer = await result.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; + } +}; + const handleData = async (responseText, win) => { - let data = JSON.parse(responseText); - songInfo.title = cleanupName(data?.videoDetails?.title); - songInfo.artist =cleanupName(data?.videoDetails?.author); - songInfo.views = data?.videoDetails?.viewCount; - songInfo.imageSrc = data?.videoDetails?.thumbnail?.thumbnails?.pop()?.url.split("?")[0]; - songInfo.songDuration = data?.videoDetails?.lengthSeconds; - songInfo.image = await getImage(songInfo.imageSrc); - songInfo.uploadDate = data?.microformat?.microformatDataRenderer?.uploadDate; - songInfo.url = data?.microformat?.microformatDataRenderer?.urlCanonical?.split("&")[0]; + const data = JSON.parse(responseText); + if (!data) return; - // used for options.resumeOnStart - config.set("url", data?.microformat?.microformatDataRenderer?.urlCanonical); + const microformat = data.microformat?.microformatDataRenderer; + if (microformat) { + songInfo.uploadDate = microformat.uploadDate; + songInfo.url = microformat.urlCanonical?.split("&")[0]; - win.webContents.send("update-song-info", JSON.stringify(songInfo)); + // used for options.resumeOnStart + config.set("url", microformat.urlCanonical); + } + + const videoDetails = data.videoDetails; + if (videoDetails) { + songInfo.title = cleanupName(videoDetails.title); + songInfo.artist = cleanupName(videoDetails.author); + songInfo.views = videoDetails.viewCount; + songInfo.songDuration = videoDetails.lengthSeconds; + songInfo.elapsedSeconds = videoDetails.elapsedSeconds; + songInfo.isPaused = videoDetails.isPaused; + + const oldUrl = songInfo.imageSrc; + songInfo.imageSrc = videoDetails.thumbnail?.thumbnails?.pop()?.url.split("?")[0]; + if (oldUrl !== songInfo.imageSrc) { + songInfo.image = await getImage(songInfo.imageSrc); + } + + win.webContents.send("update-song-info", JSON.stringify(songInfo)); + } }; // This variable will be filled with the callbacks once they register @@ -81,19 +82,6 @@ const registerCallback = (callback) => { }; const registerProvider = (win) => { - win.on("page-title-updated", async () => { - // Get and set the new data - songInfo.isPaused = await getPausedStatus(win); - - const elapsedSeconds = await getProgress(win); - songInfo.elapsedSeconds = elapsedSeconds; - - // Trigger the callbacks - callbacks.forEach((c) => { - c(songInfo); - }); - }); - // This will be called when the song-info-front finds a new request with song data ipcMain.on("song-info-request", async (_, responseText) => { await handleData(responseText, win); @@ -114,7 +102,7 @@ const suffixesToRemove = [ function cleanupName(name) { if (!name) return name; - const lowCaseName = name.toLowerCase(); + const lowCaseName = name.toLowerCase(); for (const suffix of suffixesToRemove) { if (lowCaseName.endsWith(suffix)) { return name.slice(0, -suffix.length); From 185ebbf41792113815dcfcc6dcc654302b0f3150 Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Sun, 21 Nov 2021 19:44:01 +0200 Subject: [PATCH 12/15] fix downloader playlist download --- plugins/downloader/menu.js | 20 +++++++++----------- providers/song-info.js | 5 ++++- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/plugins/downloader/menu.js b/plugins/downloader/menu.js index ce7f5643..9ec83d4c 100644 --- a/plugins/downloader/menu.js +++ b/plugins/downloader/menu.js @@ -1,25 +1,23 @@ const { existsSync, mkdirSync } = require("fs"); const { join } = require("path"); -const { URL } = require("url"); -const { dialog } = require("electron"); +const { dialog, ipcMain } = require("electron"); const is = require("electron-is"); const ytpl = require("ytpl"); const chokidar = require('chokidar'); const { setOptions } = require("../../config/plugins"); -const registerCallback = require("../../providers/song-info"); const { sendError } = require("./back"); const { defaultMenuDownloadLabel, getFolder } = require("./utils"); let downloadLabel = defaultMenuDownloadLabel; -let metadataURL = undefined; +let playingPlaylistId = undefined; let callbackIsRegistered = false; module.exports = (win, options) => { if (!callbackIsRegistered) { - registerCallback((info) => { - metadataURL = info.url; + ipcMain.on("video-src-changed", async (_, data) => { + playingPlaylistId = JSON.parse(data)?.videoDetails?.playlistId; }); callbackIsRegistered = true; } @@ -28,17 +26,17 @@ module.exports = (win, options) => { { label: downloadLabel, click: async () => { - const currentURL = metadataURL || win.webContents.getURL(); - const playlistID = new URL(currentURL).searchParams.get("list"); - if (!playlistID) { + const currentPagePlaylistId = new URL(win.webContents.getURL()).searchParams.get("list"); + const playlistId = currentPagePlaylistId || playingPlaylistId; + if (!playlistId) { sendError(win, new Error("No playlist ID found")); return; } - console.log(`trying to get playlist ID: '${playlistID}'`); + console.log(`trying to get playlist ID: '${playlistId}'`); let playlist; try { - playlist = await ytpl(playlistID, { + playlist = await ytpl(playlistId, { limit: options.playlistMaxItems || Infinity, }); } catch (e) { diff --git a/providers/song-info.js b/providers/song-info.js index 37954df2..936ea6ef 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -19,6 +19,8 @@ const songInfo = { songDuration: 0, elapsedSeconds: 0, url: "", + videoId: "", + playlistId: "", }; // Grab the native image using the src @@ -41,7 +43,7 @@ const handleData = async (responseText, win) => { if (microformat) { songInfo.uploadDate = microformat.uploadDate; songInfo.url = microformat.urlCanonical?.split("&")[0]; - + songInfo.playlistId = new URL(microformat.urlCanonical).searchParams.get("list"); // used for options.resumeOnStart config.set("url", microformat.urlCanonical); } @@ -54,6 +56,7 @@ const handleData = async (responseText, win) => { songInfo.songDuration = videoDetails.lengthSeconds; songInfo.elapsedSeconds = videoDetails.elapsedSeconds; songInfo.isPaused = videoDetails.isPaused; + songInfo.videoId = videoDetails.videoId; const oldUrl = songInfo.imageSrc; songInfo.imageSrc = videoDetails.thumbnail?.thumbnails?.pop()?.url.split("?")[0]; From c76df84ce3b85d15c91d8a5e539dcbbe18cfa667 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Mon, 22 Nov 2021 04:09:33 +0000 Subject: [PATCH 13/15] fix: upgrade node-fetch from 2.6.5 to 2.6.6 Snyk has created this PR to upgrade node-fetch from 2.6.5 to 2.6.6. 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=referral&page=upgrade-pr --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2228a191..7f7a85fe 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "filenamify": "^4.3.0", "md5": "^2.3.0", "mpris-service": "^2.1.2", - "node-fetch": "^2.6.2", + "node-fetch": "^2.6.6", "node-notifier": "^9.0.1", "ytdl-core": "^4.9.1", "ytpl": "^2.2.3" diff --git a/yarn.lock b/yarn.lock index 7a9b8336..6394bba4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6448,10 +6448,10 @@ node-fetch@^2.6.1: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@^2.6.2: - version "2.6.5" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== +node-fetch@^2.6.6: + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== dependencies: whatwg-url "^5.0.0" From 92452f804f62f19b12f31bcfbf579191006ce85c Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Mon, 22 Nov 2021 18:20:12 +0200 Subject: [PATCH 14/15] fix song-info-request --- providers/song-info-front.js | 18 +++++++++++++----- providers/song-info.js | 9 ++++++++- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 8b3c302f..70d47817 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -19,16 +19,24 @@ module.exports = () => { apiEvent.detail.addEventListener('videodatachange', (name, _dataEvent) => { if (name !== 'dataloaded') return; video.dispatchEvent(srcChangedEvent); - ipcRenderer.send("video-src-changed", JSON.stringify(apiEvent.detail.getPlayerResponse())); + sendSongInfo(); }) - for (const status of ['playing', 'pause']) { - video.addEventListener(status, sendSongInfo); - } + + video.addEventListener('pause', e => { + ipcRenderer.send("playPaused", { isPaused: true, elapsedSeconds: Math.floor(e.target.currentTime) }); + }); + + video.addEventListener('playing', e => { + if (e.target.currentTime > 0){ + ipcRenderer.send("playPaused", { isPaused: false, elapsedSeconds: Math.floor(e.target.currentTime) }); + } + }); + function sendSongInfo() { const data = apiEvent.detail.getPlayerResponse(); data.videoDetails.elapsedSeconds = Math.floor(video.currentTime); data.videoDetails.isPaused = video.paused; - ipcRenderer.send("song-info-request", JSON.stringify(apiEvent.detail.getPlayerResponse())); + ipcRenderer.send("video-src-changed", JSON.stringify(apiEvent.detail.getPlayerResponse())); } }, { once: true, passive: true }); }; diff --git a/providers/song-info.js b/providers/song-info.js index 936ea6ef..ddeee4cd 100644 --- a/providers/song-info.js +++ b/providers/song-info.js @@ -86,12 +86,19 @@ const registerCallback = (callback) => { const registerProvider = (win) => { // This will be called when the song-info-front finds a new request with song data - ipcMain.on("song-info-request", async (_, responseText) => { + ipcMain.on("video-src-changed", async (_, responseText) => { await handleData(responseText, win); callbacks.forEach((c) => { c(songInfo); }); }); + ipcMain.on("playPaused", (_, { isPaused, elapsedSeconds }) => { + songInfo.isPaused = isPaused; + songInfo.elapsedSeconds = elapsedSeconds; + callbacks.forEach((c) => { + c(songInfo); + }); + }) }; const suffixesToRemove = [ From 8c5ac17cdfaaf2d4daeafa2ef35d302e6184df7a Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Tue, 23 Nov 2021 18:19:37 +0200 Subject: [PATCH 15/15] fix multiple songInfo calls on start --- providers/song-info-front.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/providers/song-info-front.js b/providers/song-info-front.js index 70d47817..acd41daf 100644 --- a/providers/song-info-front.js +++ b/providers/song-info-front.js @@ -22,21 +22,22 @@ module.exports = () => { sendSongInfo(); }) - video.addEventListener('pause', e => { - ipcRenderer.send("playPaused", { isPaused: true, elapsedSeconds: Math.floor(e.target.currentTime) }); - }); - - video.addEventListener('playing', e => { - if (e.target.currentTime > 0){ - ipcRenderer.send("playPaused", { isPaused: false, elapsedSeconds: Math.floor(e.target.currentTime) }); - } - }); + for (const status of ['playing', 'pause']) { + video.addEventListener(status, e => { + if (Math.floor(e.target.currentTime) > 0) { + ipcRenderer.send("playPaused", { + isPaused: status === 'pause', + elapsedSeconds: Math.floor(e.target.currentTime) + }); + } + }); + } function sendSongInfo() { const data = apiEvent.detail.getPlayerResponse(); data.videoDetails.elapsedSeconds = Math.floor(video.currentTime); - data.videoDetails.isPaused = video.paused; - ipcRenderer.send("video-src-changed", JSON.stringify(apiEvent.detail.getPlayerResponse())); + data.videoDetails.isPaused = false; + ipcRenderer.send("video-src-changed", JSON.stringify(data)); } }, { once: true, passive: true }); };