From 96856b02e04aac36141a526daf8f9bfa1f325060 Mon Sep 17 00:00:00 2001 From: shirt Date: Mon, 16 Jan 2023 18:40:34 -0500 Subject: [PATCH] Add new MPL profiles, add option to disable HPL --- .gitignore | 1 + README.md | 1 + background.js | 8 ++---- cadmium-playercore-shim.js | 42 ++++++++++++++++++---------- content_script.js | 32 +++++++-------------- manifest.json | 2 +- netflix_max_bitrate.js | 57 ++++++++++++++++++++++++++------------ pages/options.html | 9 ++++-- pages/options.js | 6 ++++ 9 files changed, 94 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index c4c4ffc..4df9adb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.zip +_metadata diff --git a/README.md b/README.md index 366b1b5..4522800 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ Contact me on discord: shirt#1337 # Based on the following extensions - https://github.com/DavidBuchanan314/Turbo-Recadmiumator - https://github.com/truedread/netflix-1080p +- https://github.com/lkmvip/netflix-4K-DDplus diff --git a/background.js b/background.js index 2b8ea29..d86bfad 100644 --- a/background.js +++ b/background.js @@ -14,11 +14,6 @@ function getBrowser() { chrome.webRequest.onBeforeRequest.addListener( function (details) { - /* Allow our shim to load an untouched copy */ - if (details.url.endsWith("?no_filter")) { - return {}; - } - if (getBrowser() == "Chrome") { return { redirectUrl: chrome.runtime.getURL("cadmium-playercore-shim.js") }; } @@ -46,6 +41,7 @@ chrome.webRequest.onBeforeRequest.addListener( urls: [ "*://assets.nflxext.com/*/ffe/player/html/*", "*://www.assets.nflxext.com/*/ffe/player/html/*" - ] + ], + types: ["script"] }, ["blocking"] ); diff --git a/cadmium-playercore-shim.js b/cadmium-playercore-shim.js index e869cc7..00917a5 100644 --- a/cadmium-playercore-shim.js +++ b/cadmium-playercore-shim.js @@ -2,6 +2,14 @@ // This script runs as a drop-in replacement of the original cadmium-playercore. This is not a content script. console.log("Netflix International script active!"); +if (window.globalOptions === undefined) { + try { + window.globalOptions = JSON.parse(document.getElementById("netflix-intl-settings").innerText); + } catch(e) { + console.error("Could not load settings:", e); + } +} + /* eslint-disable no-undef */ // https://stackoverflow.com/a/45985333 function getBrowser() { @@ -47,23 +55,29 @@ function get_profile_list(original_profiles) { "playready-h264mpl30-dash", "playready-h264mpl31-dash", "playready-h264mpl40-dash", + "h264mpl30-dash-playready-prk-qc", + "h264mpl31-dash-playready-prk-qc", + "h264mpl40-dash-playready-prk-qc", ]); } - if (original_profiles.includes("playready-h264hpl30-dash")) { - profiles = profiles.concat([ - "playready-h264hpl30-dash", - "playready-h264hpl31-dash", - "playready-h264hpl40-dash", - ]); - } - - if (original_profiles.includes("h264hpl30-dash-playready-live")) { - profiles = profiles.concat([ - "h264hpl30-dash-playready-live", - "h264hpl31-dash-playready-live", - "h264hpl40-dash-playready-live", - ]); + if (!globalOptions.disableHPL) { + if (original_profiles.includes("playready-h264hpl30-dash")) { + profiles = profiles.concat([ + "playready-h264hpl30-dash", + "playready-h264hpl31-dash", + "playready-h264hpl40-dash", + ]); + } + if (original_profiles.includes("h264hpl30-dash-playready-live")) { + profiles = profiles.concat([ + "h264hpl30-dash-playready-live", + "h264hpl31-dash-playready-live", + "h264hpl40-dash-playready-live", + ]); + } + } else { + profiles = profiles.filter(val => !val.includes("h264hpl")); } if (!globalOptions.disableVP9 && original_profiles.includes("vp9-profile0-L30-dash-cenc")) { diff --git a/content_script.js b/content_script.js index d6ed47b..dae47d1 100644 --- a/content_script.js +++ b/content_script.js @@ -31,44 +31,32 @@ function chromeStorageGet(opts) { } } -function attachScript(resp) { - let xhr = resp.target; - let mainScript = document.createElement("script"); - mainScript.type = "application/javascript"; - if (xhr.status == 200) { - mainScript.text = xhr.responseText; - document.documentElement.appendChild(mainScript); - } -} - chromeStorageGet({ use6Channels: true, showAllTracks: true, setMaxBitrate: false, disableVP9: false, disableAV1: true, + disableHPL: false, useDDPlus: false, preferredLocale: null, preferredTextLocale: null, }).then(items => { // very messy workaround for accessing chrome storage outside of background / content scripts let mainScript = document.createElement("script"); - mainScript.type = "application/javascript"; - mainScript.text = `var globalOptions = JSON.parse('${JSON.stringify(items)}');`; + mainScript.type = "application/json"; + mainScript.id = "netflix-intl-settings"; + mainScript.text = JSON.stringify(items); document.documentElement.appendChild(mainScript); }).then(() => { // attach and include additional scripts after we have loaded the main configuration - for (let i = 0; i < script_urls.length; i++) { - let script = document.createElement("script"); - script.src = script_urls[i]; - document.documentElement.appendChild(script); - } for (let i = 0; i < urls.length; i++) { - let mainScriptUrl = chrome.extension.getURL(urls[i]); - let xhr = new XMLHttpRequest(); - xhr.open("GET", mainScriptUrl, true); - xhr.onload = attachScript; - xhr.send(); + const mainScriptUrl = chrome.runtime.getURL(urls[i]); + + const mainScript = document.createElement('script'); + mainScript.type = 'application/javascript'; + mainScript.src = mainScriptUrl; + document.documentElement.appendChild(mainScript); } }); diff --git a/manifest.json b/manifest.json index ab66991..03e54e1 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "Netflix International", "description": "Displays all available Netflix audio and subtitle tracks.", - "version": "2.0.16", + "version": "2.0.17", "author": "shirt", "browser_action": { "default_icon": "img/icon128.png", diff --git a/netflix_max_bitrate.js b/netflix_max_bitrate.js index 048d2fb..9ad496b 100644 --- a/netflix_max_bitrate.js +++ b/netflix_max_bitrate.js @@ -5,18 +5,33 @@ let getElementByXPath = function (xpath) { ).singleNodeValue; }; -const fn = function () { - window.dispatchEvent(new KeyboardEvent("keydown", { +let fn = function () { + const VIDEO_SELECT = getElementByXPath("//div[text()='Video Bitrate']"); + const AUDIO_SELECT = getElementByXPath("//div[text()='Audio Bitrate']"); + const BUTTON = getElementByXPath("//button[text()='Override']"); + + const videoPlayer = netflix.appContext.state.playerApp.getAPI().videoPlayer; + if(!videoPlayer) { + console.log("API Not Loading!"); + return false; + } + const player = videoPlayer.getVideoPlayerBySessionId(videoPlayer.getAllPlayerSessionIds()[0]); + if(!player) { + console.log("Video Not Loading!"); + return false; + } + if(!player.isPlaying()) { + console.log("Video Not Playing!"); + return false; + } + + window.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 83, ctrlKey: true, altKey: true, shiftKey: true, })); - const VIDEO_SELECT = getElementByXPath("//div[text()='Video Bitrate']"); - const AUDIO_SELECT = getElementByXPath("//div[text()='Audio Bitrate']"); - const BUTTON = getElementByXPath("//button[text()='Override']"); - if (!(VIDEO_SELECT && AUDIO_SELECT && BUTTON)){ return false; } @@ -24,40 +39,46 @@ const fn = function () { [VIDEO_SELECT, AUDIO_SELECT].forEach(function (el) { let parent = el.parentElement; - let options = parent.querySelectorAll("select > option"); + let options = parent.querySelectorAll('select > option'); for (var i = 0; i < options.length - 1; i++) { - options[i].removeAttribute("selected"); + options[i].removeAttribute('selected'); } - options[options.length - 1].setAttribute("selected", "selected"); + options[options.length - 1].setAttribute('selected', 'selected'); }); + console.log("Video Playing!"); BUTTON.click(); return true; }; let run = function () { - if (!fn()) { - setTimeout(run, 100); - } + fn() || setTimeout(run, 100) }; const WATCH_REGEXP = /netflix.com\/watch\/.*/; let oldLocation; -if(globalOptions.setMaxBitrate) { +if (window.globalOptions === undefined) { + try { + window.globalOptions = JSON.parse(document.getElementById("netflix-intl-settings").innerText); + } catch(e) { + console.error("Could not load settings:", e); + } +} +if(window.globalOptions.setMaxBitrate ) { console.log("netflix_max_bitrate.js enabled"); + //setInterval(test, 500); setInterval(function () { + let newLocation = window.location.toString(); if (newLocation !== oldLocation) { oldLocation = newLocation; - if (WATCH_REGEXP.test(newLocation)) { - run(); - } + WATCH_REGEXP.test(newLocation) && run(); } - }, 500); -} + }, 500); +} \ No newline at end of file diff --git a/pages/options.html b/pages/options.html index 6f1598f..f51e58a 100644 --- a/pages/options.html +++ b/pages/options.html @@ -6,6 +6,7 @@ @@ -17,11 +18,13 @@

- +
- +
- + +
+
diff --git a/pages/options.js b/pages/options.js index 9f4498c..1992ee0 100644 --- a/pages/options.js +++ b/pages/options.js @@ -5,6 +5,7 @@ function save_options() { const setMaxBitrate = document.getElementById("setMaxBitrate").checked; const disableVP9 = document.getElementById("disableVP9").checked; const disableAV1 = document.getElementById("disableAV1").checked; + const disableHPL = document.getElementById("disableHPL").checked; const useDDPlus = document.getElementById("useDDPlus").checked; const preferredLocale = document.getElementById("preferredLocale").value; const preferredTextLocale = document.getElementById("preferredTextLocale").value; @@ -15,6 +16,7 @@ function save_options() { setMaxBitrate: setMaxBitrate, disableVP9: disableVP9, disableAV1: disableAV1, + disableHPL: disableHPL, useDDPlus: useDDPlus, preferredLocale: preferredLocale, preferredTextLocale: preferredTextLocale, @@ -33,6 +35,7 @@ function reset_options() { document.getElementById("setMaxBitrate").checked = false; document.getElementById("disableVP9").checked = false; document.getElementById("disableAV1").checked = true; + document.getElementById("disableHPL").checked = false; document.getElementById("useDDPlus").checked = false; document.getElementById("preferredLocale").value = null; document.getElementById("preferredTextLocale").value = null; @@ -43,6 +46,7 @@ function reset_options() { setMaxBitrate: false, disableVP9: false, disableAV1: true, + disableHPL: false, useDDPlus: false, preferredLocale: null, preferredTextLocale: null, @@ -62,6 +66,7 @@ function restore_options() { setMaxBitrate: false, disableVP9: false, disableAV1: true, + disableHPL: false, useDDPlus: false, preferredLocale: null, preferredTextLocale: null, @@ -71,6 +76,7 @@ function restore_options() { document.getElementById("setMaxBitrate").checked = items.setMaxBitrate; document.getElementById("disableVP9").checked = items.disableVP9; document.getElementById("disableAV1").checked = items.disableAV1; + document.getElementById("disableHPL").checked = items.disableHPL; document.getElementById("useDDPlus").checked = items.useDDPlus; document.getElementById("preferredLocale").value = items.preferredLocale; document.getElementById("preferredTextLocale").value = items.preferredTextLocale;