diff --git a/index.js b/index.js index 50e31d10..c1437847 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,8 @@ const path = require("path"); const electron = require("electron"); +const remote = require('@electron/remote/main'); +remote.initialize(); const enhanceWebRequest = require("electron-better-web-request").default; const is = require("electron-is"); const unhandled = require("electron-unhandled"); @@ -24,8 +26,9 @@ const app = electron.app; app.commandLine.appendSwitch( "js-flags", // WebAssembly flags - "--experimental-wasm-threads --experimental-wasm-bulk-memory" + "--experimental-wasm-threads" ); +app.commandLine.appendSwitch('enable-features', "SharedArrayBuffer"); // Fix downloader bug app.allowRendererProcessReuse = true; // https://github.com/electron/electron/issues/18397 if (config.get("options.disableHardwareAcceleration")) { if (is.dev()) { @@ -98,7 +101,6 @@ function createMainWindow() { preload: path.join(__dirname, "preload.js"), nodeIntegrationInSubFrames: true, nativeWindowOpen: true, // window.open return Window object(like in regular browsers), not BrowserWindowProxy - enableRemoteModule: true, affinity: "main-window", // main window, and addition windows should work in one process ...(isTesting() ? { @@ -116,6 +118,7 @@ function createMainWindow() { : "default", autoHideMenuBar: config.get("options.hideMenu"), }); + remote.enable(win.webContents); if (windowPosition) { const { x, y } = windowPosition; win.setPosition(x, y); @@ -163,6 +166,31 @@ function createMainWindow() { } app.once("browser-window-created", (event, win) => { + // User agents are from https://developers.whatismybrowser.com/useragents/explore/ + const originalUserAgent = win.webContents.userAgent; + const userAgents = { + mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 12.1; rv:95.0) Gecko/20100101 Firefox/95.0", + windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:95.0) Gecko/20100101 Firefox/95.0", + linux: "Mozilla/5.0 (Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0", + } + + const updatedUserAgent = + is.macOS() ? userAgents.mac : + is.windows() ? userAgents.windows : + userAgents.linux; + + win.webContents.userAgent = updatedUserAgent; + app.userAgentFallback = updatedUserAgent; + + win.webContents.session.webRequest.onBeforeSendHeaders((details, cb) => { + // this will only happen if login failed, and "retry" was pressed + if (win.webContents.getURL().startsWith("https://accounts.google.com") && details.url.startsWith("https://accounts.google.com")){ + details.requestHeaders["User-Agent"] = originalUserAgent; + } + cb({ requestHeaders: details.requestHeaders }); + }); + + setupSongInfo(win); loadPlugins(win); @@ -197,31 +225,6 @@ app.once("browser-window-created", (event, win) => { event.preventDefault(); }); - win.webContents.on("will-navigate", (_, url) => { - if (url.startsWith("https://accounts.google.com")) { - // Force user-agent "Firefox Windows" for Google OAuth to work - // From https://github.com/firebase/firebase-js-sdk/issues/2478#issuecomment-571356751 - // Only set on accounts.google.com, otherwise querySelectors in preload scripts fail (?) - // Uses custom user agent to Google alert with a correct device type (https://github.com/th-ch/youtube-music/issues/327) - // User agents are from https://developers.whatismybrowser.com/useragents/explore/ - const userAgents = { - mac: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:70.0) Gecko/20100101 Firefox/70.0", - windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0", - linux: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0", - } - - const userAgent = - is.macOS() ? userAgents.mac : - is.windows() ? userAgents.windows : - userAgents.linux; - - win.webContents.session.webRequest.onBeforeSendHeaders((details, cb) => { - details.requestHeaders["User-Agent"] = userAgent; - cb({ requestHeaders: details.requestHeaders }); - }); - } - }); - win.webContents.on( "new-window", (e, url, frameName, disposition, options) => { diff --git a/package.json b/package.json index 072e77a6..5c67cc60 100644 --- a/package.json +++ b/package.json @@ -67,13 +67,14 @@ }, "dependencies": { "@cliqz/adblocker-electron": "^1.23.0", + "@electron/remote": "^2.0.1", "@ffmpeg/core": "^0.10.0", "@ffmpeg/ffmpeg": "^0.10.0", "async-mutex": "^0.3.2", "browser-id3-writer": "^4.4.0", "chokidar": "^3.5.2", - "custom-electron-prompt": "^1.3.1", - "custom-electron-titlebar": "^3.2.7", + "custom-electron-prompt": "^1.4.0", + "custom-electron-titlebar": "^3.2.9", "discord-rpc": "^3.2.0", "electron-better-web-request": "^1.0.1", "electron-debug": "^3.2.0", @@ -88,11 +89,11 @@ "mpris-service": "^2.1.2", "node-fetch": "^2.6.6", "node-notifier": "^9.0.1", - "ytdl-core": "^4.9.1", + "ytdl-core": "^4.9.2", "ytpl": "^2.2.3" }, "devDependencies": { - "electron": "^12.2.2", + "electron": "^16.0.2", "electron-builder": "^22.10.5", "electron-devtools-installer": "^3.1.1", "electron-icon-maker": "0.0.5", diff --git a/plugins/downloader/utils.js b/plugins/downloader/utils.js index 07bca3a5..40e5969f 100644 --- a/plugins/downloader/utils.js +++ b/plugins/downloader/utils.js @@ -1,7 +1,6 @@ const electron = require("electron"); -module.exports.getFolder = (customFolder) => - customFolder || (electron.app || electron.remote.app).getPath("downloads"); +module.exports.getFolder = customFolder => customFolder || electron.app.getPath("downloads"); module.exports.defaultMenuDownloadLabel = "Download playlist"; const orderedQualityList = ["maxresdefault", "hqdefault", "mqdefault", "sdddefault"]; diff --git a/plugins/downloader/youtube-dl.js b/plugins/downloader/youtube-dl.js index 906fc35c..345f3ff2 100644 --- a/plugins/downloader/youtube-dl.js +++ b/plugins/downloader/youtube-dl.js @@ -3,6 +3,7 @@ const { join } = require("path"); const Mutex = require("async-mutex").Mutex; const { ipcRenderer } = require("electron"); +const remote = require('@electron/remote'); const is = require("electron-is"); const filenamify = require("filenamify"); @@ -14,7 +15,7 @@ const ytdl = require("ytdl-core"); const { triggerAction, triggerActionSync } = require("../utils"); const { ACTIONS, CHANNEL } = require("./actions.js"); -const { getFolder, urlToJPG } = require("./utils"); +const { urlToJPG } = require("./utils"); const { cleanupName } = require("../../providers/song-info"); const { createFFmpeg } = FFmpeg; @@ -135,7 +136,7 @@ const toMP3 = async ( safeVideoName + "." + extension ); - const folder = getFolder(options.downloadFolder); + const folder = options.downloadFolder || remote.app.getPath("downloads"); const name = metadata.title ? `${metadata.artist ? `${metadata.artist} - ` : ""}${metadata.title}` : videoName; diff --git a/plugins/in-app-menu/front.js b/plugins/in-app-menu/front.js index 0ed91a48..f576f588 100644 --- a/plugins/in-app-menu/front.js +++ b/plugins/in-app-menu/front.js @@ -1,4 +1,6 @@ -const { remote, ipcRenderer } = require("electron"); +const { ipcRenderer } = require("electron"); +const { Menu } = require("@electron/remote"); + const customTitlebar = require("custom-electron-titlebar"); function $(selector) { return document.querySelector(selector); } @@ -12,7 +14,7 @@ module.exports = () => { document.title = "Youtube Music"; ipcRenderer.on("updateMenu", function (_event, showMenu) { - bar.updateMenu(showMenu ? remote.Menu.getApplicationMenu() : null); + bar.updateMenu(showMenu ? Menu.getApplicationMenu() : null); }); // Increases the right margin of Navbar background when the scrollbar is visible to avoid blocking it (z-index doesn't affect it) diff --git a/plugins/precise-volume/front.js b/plugins/precise-volume/front.js index 189a20eb..19f63327 100644 --- a/plugins/precise-volume/front.js +++ b/plugins/precise-volume/front.js @@ -1,4 +1,5 @@ -const { ipcRenderer, remote } = require("electron"); +const { ipcRenderer } = require("electron"); +const { globalShortcut } = require('@electron/remote'); const { setOptions } = require("../../config/plugins"); @@ -202,10 +203,10 @@ function setTooltip(volume) { function setupGlobalShortcuts(options) { if (options.globalShortcuts.volumeUp) { - remote.globalShortcut.register((options.globalShortcuts.volumeUp), () => changeVolume(true, options)); + globalShortcut.register((options.globalShortcuts.volumeUp), () => changeVolume(true, options)); } if (options.globalShortcuts.volumeDown) { - remote.globalShortcut.register((options.globalShortcuts.volumeDown), () => changeVolume(false, options)); + globalShortcut.register((options.globalShortcuts.volumeDown), () => changeVolume(false, options)); } } diff --git a/plugins/quality-changer/front.js b/plugins/quality-changer/front.js index 9972c97f..669d39ba 100644 --- a/plugins/quality-changer/front.js +++ b/plugins/quality-changer/front.js @@ -1,5 +1,5 @@ const { ElementFromFile, templatePath } = require("../utils"); -const dialog = require('electron').remote.dialog +const { dialog } = require('@electron/remote'); function $(selector) { return document.querySelector(selector); } diff --git a/plugins/video-toggle/front.js b/plugins/video-toggle/front.js index a4b75a96..1c35ce4a 100644 --- a/plugins/video-toggle/front.js +++ b/plugins/video-toggle/front.js @@ -56,7 +56,7 @@ function changeDisplay(showVideo) { } function videoStarted() { - if (player.videoMode_) { + if (api.getPlayerResponse().videoDetails.musicVideoType !== 'MUSIC_VIDEO_TYPE_ATV') { // switch to high res thumbnail forceThumbnail($('#song-image img')); // show toggle button @@ -98,7 +98,7 @@ function moveVolumeHud(showVideo) { function observeThumbnail() { const playbackModeObserver = new MutationObserver(mutations => { - if (!$('#player').videoMode_) return; + if (!player.videoMode_) return; mutations.forEach(mutation => { if (!mutation.target.src.startsWith('data:')) return; diff --git a/preload.js b/preload.js index daffe887..621f46c0 100644 --- a/preload.js +++ b/preload.js @@ -1,6 +1,6 @@ const path = require("path"); -const { remote } = require("electron"); +const remote = require('@electron/remote'); const config = require("./config"); const { fileExists } = require("./plugins/utils"); diff --git a/yarn.lock b/yarn.lock index 19f566db..c25ed838 100644 --- a/yarn.lock +++ b/yarn.lock @@ -700,7 +700,7 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" -"@electron/get@^1.0.1", "@electron/get@^1.12.4": +"@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== @@ -716,11 +716,37 @@ global-agent "^2.0.2" global-tunnel-ng "^2.7.1" +"@electron/get@^1.13.0": + version "1.13.1" + resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.13.1.tgz#42a0aa62fd1189638bd966e23effaebb16108368" + integrity sha512-U5vkXDZ9DwXtkPqlB45tfYnnYBN8PePp1z/XDCupnSpdrxT8/ThCv9WCwPLf9oqiSGZTkH6dx2jDUPuoXpjkcA== + dependencies: + debug "^4.1.1" + env-paths "^2.2.0" + fs-extra "^8.1.0" + got "^9.6.0" + progress "^2.0.3" + semver "^6.2.0" + sumchecker "^3.0.1" + optionalDependencies: + global-agent "^3.0.0" + 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/remote@^1.1.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-1.2.2.tgz#4c390a2e669df47af973c09eec106162a296c323" + integrity sha512-PfnXpQGWh4vpX866NNucJRnNOzDRZcsLcLaT32fUth9k0hccsohfxprqEDYLzRg+ZK2xRrtyUN5wYYoHimMCJg== + +"@electron/remote@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.1.tgz#810cbc595a21f0f94641eb2d7e8264063a3f84de" + integrity sha512-bGX4/yB2bPZwXm1DsxgoABgH0Cz7oFtXJgkerB8VrStYdTyvhGAULzNLRn9rVmeAuC3VUDXaXpZIlZAZHpsLIA== + "@electron/universal@1.0.5": version "1.0.5" resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.0.5.tgz#b812340e4ef21da2b3ee77b2b4d35c9b86defe37" @@ -1572,6 +1598,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.44.tgz#df7503e6002847b834371c004b372529f3f85215" integrity sha512-+gaugz6Oce6ZInfI/tK4Pq5wIIkJMEJUu92RB3Eu93mtj4wjjjz9EB5mLp5s1pSsLXdC/CPut/xF20ZzAQJbTA== +"@types/node@^17.0.0": + version "17.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.0.tgz#62797cee3b8b497f6547503b2312254d4fe3c2bb" + integrity sha512-eMhwJXc931Ihh4tkU+Y7GiLzT/y/DBNpNtr4yU9O2w3SYBsr9NaOPhQlLKRmoWtI54uNwuo0IOUFQjVOTZYRvw== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -2903,15 +2934,18 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -custom-electron-prompt@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/custom-electron-prompt/-/custom-electron-prompt-1.3.1.tgz#5c5c1266bb94ca618c493bdbebef2732286a06f2" - integrity sha512-QKq0H87G1EQS6QEc1lNmPrMj+J/h/1F4BAcmH2UQ+JUX9MOHZKZvbuIMEdsjYHlgI42SUAcnQklJ9F18ZCAc3A== +custom-electron-prompt@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/custom-electron-prompt/-/custom-electron-prompt-1.4.0.tgz#04d261372807b87ec07ed12e990306d5debd5667" + integrity sha512-tqDa3yDILVI3xxwNRW1m2fyQgdMYtFcnl1d3uMx8Tt6sQ9zG+Y4n/ie4VbttQaq7dJvFCu9K3JX65K8hfaSf1g== -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== +custom-electron-titlebar@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/custom-electron-titlebar/-/custom-electron-titlebar-3.2.9.tgz#382e889315ba76edd7f2acdd1f7f32e46848ad4a" + integrity sha512-kWMUrpYWq0LAikwMbn7rx3SHcr1RpEfYO3aju/FcMzoQbiaaAsc55EiEVB0eyp9VGWAmOqakFtkObpCa4kp9Mg== + dependencies: + "@electron/remote" "^1.1.0" + "@types/node" "^17.0.0" dashdash@^1.12.0: version "1.14.1" @@ -3412,12 +3446,12 @@ electron-updater@^4.6.1: lodash.isequal "^4.5.0" semver "^7.3.5" -electron@^12.2.2: - version "12.2.2" - resolved "https://registry.yarnpkg.com/electron/-/electron-12.2.2.tgz#9627594d6b5bb589f00355989d316b6542539e54" - integrity sha512-Oma/nIfvgql9JjAxdB9gQk//qxpJaI6PgMocYMiW4kFyLi+8jS6oGn33QG3FESS//cw09KRnWmA9iutuFAuXtw== +electron@^16.0.2: + version "16.0.4" + resolved "https://registry.yarnpkg.com/electron/-/electron-16.0.4.tgz#87dfe21d17608537fc6df292c437362297566a73" + integrity sha512-IptwmowvMP1SFOmZLh6rrURwfnOxbDBXBRBcaOdfBM5I+B9mgtdNwzNC3ymFFNzEkZUwdOyg9fu3iyjAAQIQgw== dependencies: - "@electron/get" "^1.0.1" + "@electron/get" "^1.13.0" "@types/node" "^14.6.2" extract-zip "^1.0.3" @@ -4395,6 +4429,18 @@ global-agent@^2.0.2: semver "^7.3.2" serialize-error "^7.0.1" +global-agent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" + integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== + dependencies: + boolean "^3.0.1" + es6-error "^4.1.1" + matcher "^3.0.0" + roarr "^2.15.3" + semver "^7.3.2" + serialize-error "^7.0.1" + global-dirs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" @@ -6197,10 +6243,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -m3u8stream@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.3.tgz#c4624e92b4240eb356d040c4a5e155586cf58108" - integrity sha512-0nAcdrF8YJKUkb6PzWdvGftTPyCVWgoiot1AkNVbPKTeIGsWs6DrOjifrJ0Zi8WQfQmD2SuVCjkYIOip12igng== +m3u8stream@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/m3u8stream/-/m3u8stream-0.8.4.tgz#15b49d0c2b510755ea43c1e53f85d7aaa4dc65c2" + integrity sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w== dependencies: miniget "^4.0.0" sax "^1.2.4" @@ -8875,12 +8921,12 @@ yocto-queue@^1.0.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== -ytdl-core@^4.9.1: - version "4.9.1" - resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.9.1.tgz#f587e2bd8329b5133c0bac4ce5ee1f3c7a1175a9" - integrity sha512-6Jbp5RDhUEozlaJQAR+l8oV8AHsx3WUXxSyPxzE6wOIAaLql7Hjiy0ZM58wZoyj1YEenlEPjEqcJIjKYKxvHtQ== +ytdl-core@^4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.9.2.tgz#c2d1ec44ee3cabff35e5843c6831755e69ffacf0" + integrity sha512-aTlsvsN++03MuOtyVD4DRF9Z/9UAeeuiNbjs+LjQBAiw4Hrdp48T3U9vAmRPyvREzupraY8pqRoBfKGqpq+eHA== dependencies: - m3u8stream "^0.8.3" + m3u8stream "^0.8.4" miniget "^4.0.0" sax "^1.1.3"