From 745c5babcf9104924631185b2ea3f235c45d270a Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Sun, 12 Jul 2020 11:26:48 +1000 Subject: Improve exceptions (whitelist), i18n (fr), etc. - Closes #69 - Closes #70 - Fixes #71 - Closes #72 - added fr l10n - Fixes #73 - Implement additional Invidious params (#66) --- pages/options/options.js | 225 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 204 insertions(+), 21 deletions(-) (limited to 'pages/options/options.js') diff --git a/pages/options/options.js b/pages/options/options.js index 5e25a495..19f9bba7 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -1,5 +1,55 @@ 'use strict'; +const nitterInstances = [ + 'https://nitter.net', + 'https://nitter.snopyta.org', + 'https://nitter.42l.fr', + 'https://nitter.nixnet.services', + 'https://nitter.13ad.de', + 'https://nitter.pussthecat.org', + 'https://nitter.mastodont.cat', + 'https://nitter.dark.fail', + 'https://nitter.tedomum.net', + 'https://t.maisputain.ovh', + 'http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion', + 'http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion' +]; +const invidiousInstances = [ + 'https://invidio.us', + 'https://invidious.snopyta.org', + 'https://invidious.fdn.fr', + 'https://invidious.13ad.de', + 'https://watch.nettohikari.com', + 'https://yewtu.be', + 'https://yt.maisputain.ovh', + 'https://invidious.toot.koeln', + 'https://invidious.ggc-project.de', + 'http://kgg2m7yk5aybusll.onion', + 'http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion', + 'http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion', + 'http://qklhadlycap4cnod.onion', + 'http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion', + 'http://mfqczy4mysscub2s.onion' +]; +const bibliogramInstances = [ + 'https://bibliogram.art', + 'https://bibliogram.snopyta.org', + 'https://bibliogram.pussthecat.org', + 'https://bibliogram.nixnet.services', + 'https://bibliogram.hamster.dance', + 'https://insta.maisputain.ovh', + 'https://bibliogram.ggc-project.de' +]; +const osmInstances = [ + 'https://openstreetmap.org' +]; +const autocompletes = [ + { id: 'nitter-instance', instances: nitterInstances }, + { id: 'invidious-instance', instances: invidiousInstances }, + { id: 'bibliogram-instance', instances: bibliogramInstances }, + { id: 'osm-instance', instances: osmInstances } +]; + let nitterInstance = document.getElementById('nitter-instance'); let invidiousInstance = document.getElementById('invidious-instance'); let bibliogramInstance = document.getElementById('bibliogram-instance'); @@ -14,24 +64,35 @@ let videoQuality = document.getElementById('video-quality'); let removeTwitterSW = document.getElementById('remove-twitter-sw'); let invidiousDarkMode = document.getElementById('invidious-dark-mode'); let persistInvidiousPrefs = document.getElementById('persist-invidious-prefs'); -let whitelist; +let invidiousVolume = document.getElementById('invidious-volume'); +let invidiousPlayerStyle = document.getElementById('invidious-player-style'); +let invidiousSubtitles = document.getElementById('invidious-subtitles'); +let invidiousAutoplay = document.getElementById('invidious-autoplay'); +let exceptions; window.browser = window.browser || window.chrome; -function prependWhitelistItem(item, index) { +function prependExceptionsItem(item, index) { const li = document.createElement('li'); li.appendChild(document.createTextNode(item.toString())); const button = document.createElement('button'); - button.appendChild(document.createTextNode('X')); + li.appendChild(button); + document.getElementById('exceptions-items').prepend(li); + const svg = + ` + + + `; + button.innerHTML = svg; button.addEventListener('click', () => { - li.remove(); - whitelist.splice(index, 1); + exceptions.splice(index, 1); browser.storage.sync.set({ - whitelist: whitelist + exceptions: exceptions }); + li.remove(); }); - li.appendChild(button); - document.getElementById('whitelist-items').prepend(li); } browser.storage.sync.get( @@ -48,9 +109,13 @@ browser.storage.sync.get( 'onlyEmbeddedVideo', 'videoQuality', 'removeTwitterSW', - 'whitelist', 'invidiousDarkMode', - 'persistInvidiousPrefs' + 'persistInvidiousPrefs', + 'invidiousVolume', + 'invidiousPlayerStyle', + 'invidiousSubtitles', + 'invidiousAutoplay', + 'exceptions' ], result => { nitterInstance.value = result.nitterInstance || ''; @@ -67,8 +132,12 @@ browser.storage.sync.get( removeTwitterSW.checked = !result.removeTwitterSW; invidiousDarkMode.checked = result.invidiousDarkMode; persistInvidiousPrefs.checked = result.persistInvidiousPrefs; - whitelist = result.whitelist || []; - whitelist.forEach(prependWhitelistItem); + exceptions = result.exceptions || []; + exceptions.forEach(prependExceptionsItem); + invidiousVolume.value = result.invidiousVolume; + invidiousPlayerStyle.value = result.invidiousPlayerStyle; + invidiousSubtitles.value = result.invidiousSubtitles || ''; + invidiousAutoplay.checked = !result.invidiousAutoplay; } ); @@ -92,22 +161,27 @@ document.getElementById('general-tab').addEventListener( document.getElementById('advanced-tab').addEventListener( 'click', openTab.bind(null, 'advanced') ); -document.getElementById('whitelist-tab').addEventListener( - 'click', openTab.bind(null, 'whitelist') +document.getElementById('exceptions-tab').addEventListener( + 'click', openTab.bind(null, 'exceptions') ); document.getElementById('general-tab').click(); -function addToWhitelist() { - const input = document.getElementById('new-whitelist-item'); +function addToExceptions() { + const input = document.getElementById('new-exceptions-item'); + const type = document.querySelector('input[name="type"]:checked').value; if (input.value) { try { + let value = input.value; new RegExp(input.value); - const index = whitelist.push(input.value); - prependWhitelistItem(input.value, index); + if (type === 'URL') { + value = value.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + exceptions.push(value); browser.storage.sync.set({ - whitelist: whitelist + exceptions: exceptions }); + prependExceptionsItem(value, exceptions.indexOf(value)); input.value = ''; } catch (error) { input.setCustomValidity('Invalid RegExp'); @@ -117,8 +191,8 @@ function addToWhitelist() { } } -document.getElementById('add-to-whitelist').addEventListener( - 'click', addToWhitelist +document.getElementById('add-to-exceptions').addEventListener( + 'click', addToExceptions ); function debounce(func, wait, immediate) { @@ -231,3 +305,112 @@ invidiousDarkMode.addEventListener('change', event => { persistInvidiousPrefs.addEventListener('change', event => { browser.storage.sync.set({ persistInvidiousPrefs: event.target.checked }); }); + +let invidiousVolumeChange = debounce(() => { + if (invidiousInstance.checkValidity()) { + browser.storage.sync.set({ + invidiousVolume: invidiousVolume.value + }); + } +}, 500); +invidiousVolume.addEventListener('input', invidiousVolumeChange); + +invidiousPlayerStyle.addEventListener('change', event => { + browser.storage.sync.set({ + invidiousPlayerStyle: event.target.options[invidiousPlayerStyle.selectedIndex].value + }); +}); + +let invidiousSubtitlesChange = debounce(() => { + if (invidiousInstance.checkValidity()) { + browser.storage.sync.set({ + invidiousSubtitles: invidiousSubtitles.value + }); + } +}, 500); +invidiousSubtitles.addEventListener('input', invidiousSubtitlesChange); + +invidiousAutoplay.addEventListener('change', event => { + browser.storage.sync.set({ invidiousAutoplay: !event.target.checked }); +}); + + +function autocomplete(input, list) { + let currentFocus; + input.addEventListener("focus", (e) => { + showOptions(e); + }); + input.addEventListener("input", (e) => { + const val = e.target.value; + if (!val) { return false; } + currentFocus = -1; + showOptions(e); + }); + input.addEventListener("keydown", function (e) { + let x = document.getElementById(this.id + "autocomplete-list"); + if (x) x = x.getElementsByTagName("div"); + if (e.keyCode == 40) { + currentFocus++; + addActive(x); + } else if (e.keyCode == 38) { + currentFocus--; + addActive(x); + } else if (e.keyCode == 13) { + e.preventDefault(); + if (currentFocus > -1) { + if (x) x[currentFocus].click(); + } + } + }); + function showOptions(e) { + let a, b, i, val = e.target.value; + closeAllLists(); + a = document.createElement("div"); + a.setAttribute("id", e.target.id + "autocomplete-list"); + a.setAttribute("class", "autocomplete-items"); + e.target.parentNode.appendChild(a); + for (i = 0; i < list.length; i++) { + if (list[i].toLowerCase().indexOf(val.toLowerCase()) > -1) { + b = document.createElement("div"); + b.innerHTML = "" + list[i].substr(0, val.length) + ""; + b.innerHTML += list[i].substr(val.length); + b.innerHTML += ""; + b.addEventListener("click", function (e) { + input.value = e.target.getElementsByTagName("input")[0].value; + input.dispatchEvent(new Event('input')); + closeAllLists(); + }); + a.appendChild(b); + } + } + } + function addActive(x) { + if (!x) return false; + removeActive(x); + if (currentFocus >= x.length) currentFocus = 0; + if (currentFocus < 0) currentFocus = (x.length - 1); + x[currentFocus].classList.add("autocomplete-active"); + } + function removeActive(x) { + for (let i = 0; i < x.length; i++) { + x[i].classList.remove("autocomplete-active"); + } + } + function closeAllLists(elmnt) { + let x = document.getElementsByClassName("autocomplete-items"); + for (let i = 0; i < x.length; i++) { + if (elmnt != x[i] && elmnt != input) { + x[i].parentNode.removeChild(x[i]); + } + } + } + document.addEventListener("click", (e) => { + if (!autocompletes.find(element => element.id === e.target.id)) { + closeAllLists(e.target); + } + }); +} + +autocompletes.forEach((value) => { + autocomplete(document.getElementById(value.id), value.instances); +}) -- cgit 1.4.1 From 7ba890045e03808321904f0278015744ef16d377 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Thu, 16 Jul 2020 09:59:14 +1000 Subject: Closes #74 - Option to manually override theme. --- manifest.json | 23 +- pages/options/options.html | 722 +++++++++++++++++++++++++++------------------ pages/options/options.js | 341 +++++++++++---------- pages/popup/popup.html | 261 +++++++++------- pages/popup/popup.js | 34 ++- pages/styles.css | 182 +++++------- 6 files changed, 888 insertions(+), 675 deletions(-) (limited to 'pages/options/options.js') diff --git a/manifest.json b/manifest.json index 41f04696..1e408456 100644 --- a/manifest.json +++ b/manifest.json @@ -1,12 +1,10 @@ { "name": "__MSG_extensionName__", "description": "__MSG_extensionDescription__", - "version": "1.1.36", + "version": "1.1.37", "manifest_version": 2, "background": { - "scripts": [ - "background.js" - ], + "scripts": ["background.js"], "persistent": true }, "default_locale": "en", @@ -16,12 +14,7 @@ "48": "assets/images/icon48.png", "128": "assets/images/icon128.png" }, - "permissions": [ - "storage", - "webRequest", - "webRequestBlocking", - "" - ], + "permissions": ["storage", "webRequest", "webRequestBlocking", ""], "browser_action": { "default_title": "Privacy Redirect", "default_popup": "pages/popup/popup.html", @@ -41,9 +34,7 @@ "*://pbs.twimg.com/*", "*://video.twimg.com/*" ], - "js": [ - "assets/javascript/remove-twitter-sw.js" - ], + "js": ["assets/javascript/remove-twitter-sw.js"], "run_at": "document_start" }, { @@ -64,9 +55,7 @@ "*://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion/*", "*://mfqczy4mysscub2s.onio/*n" ], - "js": [ - "assets/javascript/persist-invidious-prefs.js" - ], + "js": ["assets/javascript/persist-invidious-prefs.js"], "run_at": "document_start" } ], @@ -79,4 +68,4 @@ "id": "{b7f9d2cd-d772-4302-8c3f-eb941af36f76}" } } -} \ No newline at end of file +} diff --git a/pages/options/options.html b/pages/options/options.html index e254765d..f5947bc9 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -1,286 +1,450 @@ + + + + + + Privacy Redirect Options + - - - - - - Privacy Redirect Options - + +
+ + + +
- +
+
+ + + + + + + +
+

Nitter Redirects

+
+   + +
+
+
+ + + + + + + +
+

+ Invidious Redirects +

+
+   + +
+
+
+ + + + + + + +
+

+ Bibliogram Redirects +

+
+   + +
+
+
+ + + + + + + +
+

+ OpenStreetMap Redirects +

+
+   + +
+
+
+

Nitter Instance

+
+ +
+
+
+

Invidious Instance

+
+ +
+
+
+

Bibliogram Instance

+
+ +
+
+
+

OpenStreetMap Instance

+
+ +
+
+
+

Theme

+ +
+
-
- - - -
+
+
+ + + + + + + +
+

+ Always proxy videos through Invidious +

+
+   + +
+
+
+ + + + + + + +
+

+ Only redirect embedded video to Invidious +

+
+   + +
+
+
+

Invidious Video Quality

+ +
+
+ + + + + + + +
+

+ Invidious dark mode always on +

+
+   + +
+
+
+

Invidious Volume

+ +
+
+

+ Invidious Player Style +

+ +
+
+

+ Invidious Subtitles - language codes (comma-separated) +

+ +
+
+ + + + + + + +
+

+ Invidious automatically play video on load +

+
+   + +
+
+
+ + + + + + + +
+

+ Persist Invidious preferences (as cookie) +

+
+   + +
+
+
+ + + + + + + +
+

+ Proactively remove Twitter service worker +

+
+   + +
+
+
-
-
- - - - - - - -
-

Nitter Redirects

-
-   - -
-
-
- - - - - - - -
-

Invidious Redirects

-
-   - -
-
-
- - - - - - - -
-

Bibliogram Redirects

-
-   - -
-
-
- - - - - - - -
-

OpenStreetMap Redirects

-
-   - -
-
-
-

Nitter Instance

-
- -
-
-
-

Invidious Instance

-
- -
-
-
-

Bibliogram Instance

-
- -
-
- -

OpenStreetMap Instance

-
- -
-
-
+
+
+

+ Enter a URL or Regular Expression to be excluded from redirects. +

+

+ All requests for or initiating from a URL that matches your exception + will be excluded from redirects. +

+

+ Note - Supports JavaScript regular expressions, excluding the + enclosing forward slashes. +

+
+
+ + + + + + + + + + + +
+

Add Exception

+
+ + + + + + + + +
+
+
    +
    -
    -
    - - - - - - - -
    -

    Always proxy videos through Invidious

    -
    -   - -
    -
    -
    - - - - - - - -
    -

    Only redirect embedded video to Invidious

    -
    -   - -
    -
    -
    -

    Invidious Video Quality

    - -
    -
    - - - - - - - -
    -

    Invidious dark mode always on

    -
    -   - -
    -
    -
    -

    Invidious Volume

    - -
    -
    -

    Invidious Player Style

    - -
    -
    -

    Invidious Subtitles - language codes (comma-separated)

    - -
    -
    - - - - - - - -
    -

    Invidious automatically play video on load

    -
    -   - -
    -
    -
    - - - - - - - -
    -

    Persist Invidious preferences (as cookie)

    -
    -   - -
    -
    -
    - - - - - - - -
    -

    Proactively remove Twitter service worker

    -
    -   - -
    -
    -
    - -
    -
    -

    - Enter a URL or Regular Expression to be excluded from redirects. -

    -

    - All requests for or initiating from a URL that matches your exception - will be excluded from redirects. -

    -

    - Note - Supports JavaScript regular expressions, excluding - the enclosing forward slashes. -

    -
    -
    - - - - - - - - - - - -
    -

    Add Exception

    -
    - - - - - - - - -
    -
    -
      -
      - - - - - - \ No newline at end of file + + + + diff --git a/pages/options/options.js b/pages/options/options.js index 19f9bba7..352db45a 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -1,95 +1,93 @@ -'use strict'; +"use strict"; const nitterInstances = [ - 'https://nitter.net', - 'https://nitter.snopyta.org', - 'https://nitter.42l.fr', - 'https://nitter.nixnet.services', - 'https://nitter.13ad.de', - 'https://nitter.pussthecat.org', - 'https://nitter.mastodont.cat', - 'https://nitter.dark.fail', - 'https://nitter.tedomum.net', - 'https://t.maisputain.ovh', - 'http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion', - 'http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion' + "https://nitter.net", + "https://nitter.snopyta.org", + "https://nitter.42l.fr", + "https://nitter.nixnet.services", + "https://nitter.13ad.de", + "https://nitter.pussthecat.org", + "https://nitter.mastodont.cat", + "https://nitter.dark.fail", + "https://nitter.tedomum.net", + "https://t.maisputain.ovh", + "http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion", + "http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion", ]; const invidiousInstances = [ - 'https://invidio.us', - 'https://invidious.snopyta.org', - 'https://invidious.fdn.fr', - 'https://invidious.13ad.de', - 'https://watch.nettohikari.com', - 'https://yewtu.be', - 'https://yt.maisputain.ovh', - 'https://invidious.toot.koeln', - 'https://invidious.ggc-project.de', - 'http://kgg2m7yk5aybusll.onion', - 'http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion', - 'http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion', - 'http://qklhadlycap4cnod.onion', - 'http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion', - 'http://mfqczy4mysscub2s.onion' + "https://invidio.us", + "https://invidious.snopyta.org", + "https://invidious.fdn.fr", + "https://invidious.13ad.de", + "https://watch.nettohikari.com", + "https://yewtu.be", + "https://yt.maisputain.ovh", + "https://invidious.toot.koeln", + "https://invidious.ggc-project.de", + "http://kgg2m7yk5aybusll.onion", + "http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion", + "http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion", + "http://qklhadlycap4cnod.onion", + "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion", + "http://mfqczy4mysscub2s.onion", ]; const bibliogramInstances = [ - 'https://bibliogram.art', - 'https://bibliogram.snopyta.org', - 'https://bibliogram.pussthecat.org', - 'https://bibliogram.nixnet.services', - 'https://bibliogram.hamster.dance', - 'https://insta.maisputain.ovh', - 'https://bibliogram.ggc-project.de' -]; -const osmInstances = [ - 'https://openstreetmap.org' + "https://bibliogram.art", + "https://bibliogram.snopyta.org", + "https://bibliogram.pussthecat.org", + "https://bibliogram.nixnet.services", + "https://bibliogram.hamster.dance", + "https://insta.maisputain.ovh", + "https://bibliogram.ggc-project.de", ]; +const osmInstances = ["https://openstreetmap.org"]; const autocompletes = [ - { id: 'nitter-instance', instances: nitterInstances }, - { id: 'invidious-instance', instances: invidiousInstances }, - { id: 'bibliogram-instance', instances: bibliogramInstances }, - { id: 'osm-instance', instances: osmInstances } + { id: "nitter-instance", instances: nitterInstances }, + { id: "invidious-instance", instances: invidiousInstances }, + { id: "bibliogram-instance", instances: bibliogramInstances }, + { id: "osm-instance", instances: osmInstances }, ]; -let nitterInstance = document.getElementById('nitter-instance'); -let invidiousInstance = document.getElementById('invidious-instance'); -let bibliogramInstance = document.getElementById('bibliogram-instance'); -let osmInstance = document.getElementById('osm-instance'); -let disableNitter = document.getElementById('disable-nitter'); -let disableInvidious = document.getElementById('disable-invidious'); -let disableBibliogram = document.getElementById('disable-bibliogram'); -let disableOsm = document.getElementById('disable-osm'); -let alwaysProxy = document.getElementById('always-proxy'); -let onlyEmbeddedVideo = document.getElementById('only-embed'); -let videoQuality = document.getElementById('video-quality'); -let removeTwitterSW = document.getElementById('remove-twitter-sw'); -let invidiousDarkMode = document.getElementById('invidious-dark-mode'); -let persistInvidiousPrefs = document.getElementById('persist-invidious-prefs'); -let invidiousVolume = document.getElementById('invidious-volume'); -let invidiousPlayerStyle = document.getElementById('invidious-player-style'); -let invidiousSubtitles = document.getElementById('invidious-subtitles'); -let invidiousAutoplay = document.getElementById('invidious-autoplay'); +let nitterInstance = document.getElementById("nitter-instance"); +let invidiousInstance = document.getElementById("invidious-instance"); +let bibliogramInstance = document.getElementById("bibliogram-instance"); +let osmInstance = document.getElementById("osm-instance"); +let disableNitter = document.getElementById("disable-nitter"); +let disableInvidious = document.getElementById("disable-invidious"); +let disableBibliogram = document.getElementById("disable-bibliogram"); +let disableOsm = document.getElementById("disable-osm"); +let alwaysProxy = document.getElementById("always-proxy"); +let onlyEmbeddedVideo = document.getElementById("only-embed"); +let videoQuality = document.getElementById("video-quality"); +let removeTwitterSW = document.getElementById("remove-twitter-sw"); +let invidiousDarkMode = document.getElementById("invidious-dark-mode"); +let persistInvidiousPrefs = document.getElementById("persist-invidious-prefs"); +let invidiousVolume = document.getElementById("invidious-volume"); +let invidiousPlayerStyle = document.getElementById("invidious-player-style"); +let invidiousSubtitles = document.getElementById("invidious-subtitles"); +let invidiousAutoplay = document.getElementById("invidious-autoplay"); +let theme = document.getElementById("theme"); let exceptions; window.browser = window.browser || window.chrome; function prependExceptionsItem(item, index) { - const li = document.createElement('li'); + const li = document.createElement("li"); li.appendChild(document.createTextNode(item.toString())); - const button = document.createElement('button'); + const button = document.createElement("button"); li.appendChild(button); - document.getElementById('exceptions-items').prepend(li); - const svg = - ` + document.getElementById("exceptions-items").prepend(li); + const svg = ` `; button.innerHTML = svg; - button.addEventListener('click', () => { + button.addEventListener("click", () => { exceptions.splice(index, 1); browser.storage.sync.set({ - exceptions: exceptions + exceptions: exceptions, }); li.remove(); }); @@ -97,108 +95,112 @@ function prependExceptionsItem(item, index) { browser.storage.sync.get( [ - 'nitterInstance', - 'invidiousInstance', - 'bibliogramInstance', - 'osmInstance', - 'disableNitter', - 'disableInvidious', - 'disableBibliogram', - 'disableOsm', - 'alwaysProxy', - 'onlyEmbeddedVideo', - 'videoQuality', - 'removeTwitterSW', - 'invidiousDarkMode', - 'persistInvidiousPrefs', - 'invidiousVolume', - 'invidiousPlayerStyle', - 'invidiousSubtitles', - 'invidiousAutoplay', - 'exceptions' + "nitterInstance", + "invidiousInstance", + "bibliogramInstance", + "osmInstance", + "disableNitter", + "disableInvidious", + "disableBibliogram", + "disableOsm", + "alwaysProxy", + "onlyEmbeddedVideo", + "videoQuality", + "removeTwitterSW", + "invidiousDarkMode", + "persistInvidiousPrefs", + "invidiousVolume", + "invidiousPlayerStyle", + "invidiousSubtitles", + "invidiousAutoplay", + "exceptions", + "theme", ], - result => { - nitterInstance.value = result.nitterInstance || ''; - invidiousInstance.value = result.invidiousInstance || ''; - bibliogramInstance.value = result.bibliogramInstance || ''; - osmInstance.value = result.osmInstance || ''; + (result) => { + theme.value = result.theme || ""; + if (result.theme) document.body.classList.add(result.theme); + nitterInstance.value = result.nitterInstance || ""; + invidiousInstance.value = result.invidiousInstance || ""; + bibliogramInstance.value = result.bibliogramInstance || ""; + osmInstance.value = result.osmInstance || ""; disableNitter.checked = !result.disableNitter; disableInvidious.checked = !result.disableInvidious; disableBibliogram.checked = !result.disableBibliogram; disableOsm.checked = !result.disableOsm; alwaysProxy.checked = result.alwaysProxy; onlyEmbeddedVideo.checked = result.onlyEmbeddedVideo; - videoQuality.value = result.videoQuality || ''; + videoQuality.value = result.videoQuality || ""; removeTwitterSW.checked = !result.removeTwitterSW; invidiousDarkMode.checked = result.invidiousDarkMode; persistInvidiousPrefs.checked = result.persistInvidiousPrefs; exceptions = result.exceptions || []; exceptions.forEach(prependExceptionsItem); invidiousVolume.value = result.invidiousVolume; - invidiousPlayerStyle.value = result.invidiousPlayerStyle; - invidiousSubtitles.value = result.invidiousSubtitles || ''; + invidiousPlayerStyle.value = result.invidiousPlayerStyle || ""; + invidiousSubtitles.value = result.invidiousSubtitles || ""; invidiousAutoplay.checked = !result.invidiousAutoplay; } ); function openTab(tab, event) { let i, tabcontent, tablinks; - tabcontent = document.getElementsByClassName('tabcontent'); + tabcontent = document.getElementsByClassName("tabcontent"); for (i = 0; i < tabcontent.length; i++) { - tabcontent[i].style.display = 'none'; + tabcontent[i].style.display = "none"; } - tablinks = document.getElementsByClassName('tablinks'); + tablinks = document.getElementsByClassName("tablinks"); for (i = 0; i < tablinks.length; i++) { - tablinks[i].className = tablinks[i].className.replace(' active', ''); + tablinks[i].className = tablinks[i].className.replace(" active", ""); } - document.getElementById(tab).style.display = 'block'; - event.currentTarget.className += ' active'; + document.getElementById(tab).style.display = "block"; + event.currentTarget.className += " active"; } -document.getElementById('general-tab').addEventListener( - 'click', openTab.bind(null, 'general') -); -document.getElementById('advanced-tab').addEventListener( - 'click', openTab.bind(null, 'advanced') -); -document.getElementById('exceptions-tab').addEventListener( - 'click', openTab.bind(null, 'exceptions') -); +document + .getElementById("general-tab") + .addEventListener("click", openTab.bind(null, "general")); +document + .getElementById("advanced-tab") + .addEventListener("click", openTab.bind(null, "advanced")); +document + .getElementById("exceptions-tab") + .addEventListener("click", openTab.bind(null, "exceptions")); -document.getElementById('general-tab').click(); +document.getElementById("general-tab").click(); function addToExceptions() { - const input = document.getElementById('new-exceptions-item'); + const input = document.getElementById("new-exceptions-item"); const type = document.querySelector('input[name="type"]:checked').value; if (input.value) { try { let value = input.value; new RegExp(input.value); - if (type === 'URL') { - value = value.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + if (type === "URL") { + value = value.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&"); } exceptions.push(value); browser.storage.sync.set({ - exceptions: exceptions + exceptions: exceptions, }); prependExceptionsItem(value, exceptions.indexOf(value)); - input.value = ''; + input.value = ""; } catch (error) { - input.setCustomValidity('Invalid RegExp'); + input.setCustomValidity("Invalid RegExp"); } } else { - input.setCustomValidity('Invalid RegExp'); + input.setCustomValidity("Invalid RegExp"); } } -document.getElementById('add-to-exceptions').addEventListener( - 'click', addToExceptions -); +document + .getElementById("add-to-exceptions") + .addEventListener("click", addToExceptions); function debounce(func, wait, immediate) { let timeout; return () => { - let context = this, args = arguments; + let context = this, + args = arguments; let later = () => { timeout = null; if (!immediate) func.apply(context, args); @@ -208,132 +210,152 @@ function debounce(func, wait, immediate) { timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; -}; +} function parseURL(urlString) { if (urlString) { try { const url = new URL(urlString); if (url.username && url.password) { - return `${url.protocol}//${url.username}:${url.password}@${url.host}` + return `${url.protocol}//${url.username}:${url.password}@${url.host}`; } else { return url.origin; } } catch (error) { console.log(error); - return ''; + return ""; } } else { - return ''; + return ""; } } let nitterInstanceChange = debounce(() => { if (nitterInstance.checkValidity()) { browser.storage.sync.set({ - nitterInstance: parseURL(nitterInstance.value) + nitterInstance: parseURL(nitterInstance.value), }); } }, 500); -nitterInstance.addEventListener('input', nitterInstanceChange); +nitterInstance.addEventListener("input", nitterInstanceChange); let invidiousInstanceChange = debounce(() => { if (invidiousInstance.checkValidity()) { browser.storage.sync.set({ - invidiousInstance: parseURL(invidiousInstance.value) + invidiousInstance: parseURL(invidiousInstance.value), }); } }, 500); -invidiousInstance.addEventListener('input', invidiousInstanceChange); +invidiousInstance.addEventListener("input", invidiousInstanceChange); let bibliogramInstanceChange = debounce(() => { if (bibliogramInstance.checkValidity()) { browser.storage.sync.set({ - bibliogramInstance: parseURL(bibliogramInstance.value) + bibliogramInstance: parseURL(bibliogramInstance.value), }); } }, 500); -bibliogramInstance.addEventListener('input', bibliogramInstanceChange); +bibliogramInstance.addEventListener("input", bibliogramInstanceChange); let osmInstanceChange = debounce(() => { if (osmInstance.checkValidity()) { browser.storage.sync.set({ - osmInstance: parseURL(osmInstance.value) + osmInstance: parseURL(osmInstance.value), }); } }, 500); -osmInstance.addEventListener('input', osmInstanceChange); +osmInstance.addEventListener("input", osmInstanceChange); -disableNitter.addEventListener('change', event => { +disableNitter.addEventListener("change", (event) => { browser.storage.sync.set({ disableNitter: !event.target.checked }); }); -disableInvidious.addEventListener('change', event => { +disableInvidious.addEventListener("change", (event) => { browser.storage.sync.set({ disableInvidious: !event.target.checked }); }); -disableBibliogram.addEventListener('change', event => { +disableBibliogram.addEventListener("change", (event) => { browser.storage.sync.set({ disableBibliogram: !event.target.checked }); }); -disableOsm.addEventListener('change', event => { +disableOsm.addEventListener("change", (event) => { browser.storage.sync.set({ disableOsm: !event.target.checked }); }); -alwaysProxy.addEventListener('change', event => { +alwaysProxy.addEventListener("change", (event) => { browser.storage.sync.set({ alwaysProxy: event.target.checked }); }); -onlyEmbeddedVideo.addEventListener('change', event => { +onlyEmbeddedVideo.addEventListener("change", (event) => { browser.storage.sync.set({ onlyEmbeddedVideo: event.target.checked }); }); -videoQuality.addEventListener('change', event => { +videoQuality.addEventListener("change", (event) => { browser.storage.sync.set({ - videoQuality: event.target.options[videoQuality.selectedIndex].value + videoQuality: event.target.options[videoQuality.selectedIndex].value, }); }); -removeTwitterSW.addEventListener('change', event => { +removeTwitterSW.addEventListener("change", (event) => { browser.storage.sync.set({ removeTwitterSW: !event.target.checked }); }); -invidiousDarkMode.addEventListener('change', event => { +invidiousDarkMode.addEventListener("change", (event) => { browser.storage.sync.set({ invidiousDarkMode: event.target.checked }); }); -persistInvidiousPrefs.addEventListener('change', event => { +persistInvidiousPrefs.addEventListener("change", (event) => { browser.storage.sync.set({ persistInvidiousPrefs: event.target.checked }); }); let invidiousVolumeChange = debounce(() => { if (invidiousInstance.checkValidity()) { browser.storage.sync.set({ - invidiousVolume: invidiousVolume.value + invidiousVolume: invidiousVolume.value, }); } }, 500); -invidiousVolume.addEventListener('input', invidiousVolumeChange); +invidiousVolume.addEventListener("input", invidiousVolumeChange); -invidiousPlayerStyle.addEventListener('change', event => { +invidiousPlayerStyle.addEventListener("change", (event) => { browser.storage.sync.set({ - invidiousPlayerStyle: event.target.options[invidiousPlayerStyle.selectedIndex].value + invidiousPlayerStyle: + event.target.options[invidiousPlayerStyle.selectedIndex].value, }); }); let invidiousSubtitlesChange = debounce(() => { if (invidiousInstance.checkValidity()) { browser.storage.sync.set({ - invidiousSubtitles: invidiousSubtitles.value + invidiousSubtitles: invidiousSubtitles.value, }); } }, 500); -invidiousSubtitles.addEventListener('input', invidiousSubtitlesChange); +invidiousSubtitles.addEventListener("input", invidiousSubtitlesChange); -invidiousAutoplay.addEventListener('change', event => { +invidiousAutoplay.addEventListener("change", (event) => { browser.storage.sync.set({ invidiousAutoplay: !event.target.checked }); }); +theme.addEventListener("change", (event) => { + const value = event.target.options[theme.selectedIndex].value; + switch (value) { + case "dark-theme": + document.body.classList.add("dark-theme"); + document.body.classList.remove("light-theme"); + break; + case "light-theme": + document.body.classList.add("light-theme"); + document.body.classList.remove("dark-theme"); + break; + default: + document.body.classList.remove("light-theme"); + document.body.classList.remove("dark-theme"); + } + browser.storage.sync.set({ + theme: value, + }); +}); function autocomplete(input, list) { let currentFocus; @@ -342,7 +364,9 @@ function autocomplete(input, list) { }); input.addEventListener("input", (e) => { const val = e.target.value; - if (!val) { return false; } + if (!val) { + return false; + } currentFocus = -1; showOptions(e); }); @@ -363,7 +387,10 @@ function autocomplete(input, list) { } }); function showOptions(e) { - let a, b, i, val = e.target.value; + let a, + b, + i, + val = e.target.value; closeAllLists(); a = document.createElement("div"); a.setAttribute("id", e.target.id + "autocomplete-list"); @@ -377,7 +404,7 @@ function autocomplete(input, list) { b.innerHTML += " + + + + + - - - - - - + + - -
      -
      - Privacy Redirect logo -

      Privacy
      Redirect

      -
      -
      - Version:  -
      -
      +
      + + + + + + + +
      +

      Nitter Redirects

      +
      +   + +
      +
      -
      - - - - - - - -
      -

      Nitter Redirects

      -
      -   - -
      -
      +
      + + + + + + + +
      +

      + Invidious Redirects +

      +
      +   + +
      +
      -
      - - - - - - - -
      -

      Invidious Redirects

      -
      -   - -
      -
      +
      + + + + + + + +
      +

      + Bibliogram Redirects +

      +
      +   + +
      +
      -
      - - - - - - - -
      -

      Bibliogram Redirects

      -
      -   - -
      -
      +
      + + + + + + + +
      +

      + OpenStreetMap Redirects +

      +
      +   + +
      +
      -
      - - - - - - - -
      -

      OpenStreetMap Redirects

      -
      -   - -
      -
      +
      -
      -
      + - - - - - - - \ No newline at end of file + + + + diff --git a/pages/popup/popup.js b/pages/popup/popup.js index 2e8ec491..ece04384 100644 --- a/pages/popup/popup.js +++ b/pages/popup/popup.js @@ -1,21 +1,23 @@ -'use strict'; +"use strict"; -let disableNitter = document.querySelector('#disable-nitter'); -let disableInvidious = document.querySelector('#disable-invidious'); -let disableBibliogram = document.querySelector('#disable-bibliogram'); -let disableOsm = document.querySelector('#disable-osm'); -let version = document.querySelector('#version'); +let disableNitter = document.querySelector("#disable-nitter"); +let disableInvidious = document.querySelector("#disable-invidious"); +let disableBibliogram = document.querySelector("#disable-bibliogram"); +let disableOsm = document.querySelector("#disable-osm"); +let version = document.querySelector("#version"); window.browser = window.browser || window.chrome; browser.storage.sync.get( [ - 'disableNitter', - 'disableInvidious', - 'disableBibliogram', - 'disableOsm' + "disableNitter", + "disableInvidious", + "disableBibliogram", + "disableOsm", + "theme", ], - result => { + (result) => { + document.body.classList.add(result.theme); disableNitter.checked = !result.disableNitter; disableInvidious.checked = !result.disableInvidious; disableBibliogram.checked = !result.disableBibliogram; @@ -25,22 +27,22 @@ browser.storage.sync.get( version.textContent = browser.runtime.getManifest().version; -disableNitter.addEventListener('change', event => { +disableNitter.addEventListener("change", (event) => { browser.storage.sync.set({ disableNitter: !event.target.checked }); }); -disableInvidious.addEventListener('change', event => { +disableInvidious.addEventListener("change", (event) => { browser.storage.sync.set({ disableInvidious: !event.target.checked }); }); -disableBibliogram.addEventListener('change', event => { +disableBibliogram.addEventListener("change", (event) => { browser.storage.sync.set({ disableBibliogram: !event.target.checked }); }); -disableOsm.addEventListener('change', event => { +disableOsm.addEventListener("change", (event) => { browser.storage.sync.set({ disableOsm: !event.target.checked }); }); -document.querySelector('#more-options').addEventListener('click', () => { +document.querySelector("#more-options").addEventListener("click", () => { browser.runtime.openOptionsPage(); }); diff --git a/pages/styles.css b/pages/styles.css index 29667d71..300dadbf 100644 --- a/pages/styles.css +++ b/pages/styles.css @@ -1,31 +1,41 @@ -:root { - --text-main: #fff; - --text-secondary: #000; - --dark: #3c4043; - --darker: #292a2d; - --light: #e3e7ea; - --lighter: #fff; +body { + --text: #fff; + --bg-main: #3c4043; + --bg-secondary: #292a2d; --active: #ff5b56; --space: 5px; --danger: #f04141; --danger-light: #f9d0d5; + --dark-grey: #767676; + --light-grey: #c3c3c3; +} + +body.light-theme { + --text: #000; + --bg-main: #e3e7ea; + --bg-secondary: #fff; +} + +.light-theme.popup, +.light-theme .popup { + background-color: var(--bg-secondary); } body { - color: var(--text-secondary); margin: 0; max-width: 400px; margin: auto; min-height: 572px; font-family: Sans-Serif; - background-color: var(--darker); + background-color: var(--bg-secondary); + color: var(--text); } .popup { width: 300px; min-height: auto; overflow: hidden; - background-color: var(--dark); + background-color: var(--bg-main); } input { @@ -35,8 +45,8 @@ input { } header { - background-color: var(--lighter); - color: var(--text-secondary); + background-color: var(--bg-main); + color: var(--text); display: flex; padding: var(--space); } @@ -95,7 +105,7 @@ h3 { h1, h2 { - color: var(--text-main); + color: var(--text); } footer { @@ -112,6 +122,9 @@ select { width: 100%; box-sizing: border-box; margin-bottom: var(--space); + background-color: var(--bg-main); + border-style: inset; + color: var(--text); } input[type="url"] { @@ -136,7 +149,7 @@ input[type="radio"]:checked + label { margin-left: 5px; background: grey; border-radius: 25px; - color: var(--text-main); + color: var(--text); cursor: pointer; display: block; float: right; @@ -148,7 +161,7 @@ input[type="radio"]:checked + label { } .checkbox-label:after { - background: var(--text-main); + background: white; border-radius: 90px; content: ""; height: 20px; @@ -179,8 +192,8 @@ input:checked + label:after { .button { border: var(--active) solid 1px; - color: var(--text-main); - stroke: var(--text-main); + color: var(--text); + stroke: var(--text); display: block; font-size: 12px; font-weight: bold; @@ -199,13 +212,13 @@ input:checked + label:after { .button:hover { background-color: var(--active); - color: var(--text-main); - stroke: var(--text-main); + color: var(--text); + stroke: var(--text); } .button:active { background-color: var(--active); - box-shadow: 0 var(--space) var(--dark); + box-shadow: 0 var(--space) var(--bg-main); transform: translateY(4px); } @@ -221,13 +234,13 @@ input:invalid { .tab { overflow: hidden; - background-color: var(--darker); + background-color: var(--bg-secondary); } .tab button { border-top-left-radius: 10px; border-top-right-radius: 10px; - color: var(--text-main); + color: var(--text); background-color: inherit; float: left; border: none; @@ -235,7 +248,7 @@ input:invalid { cursor: pointer; padding: 14px 16px; transition: 0.3s; - border: solid 1px var(--dark); + border: solid 1px var(--bg-main); width: 33.333%; font-size: 14px; } @@ -245,13 +258,13 @@ input:invalid { } .tab button.active { - background-color: var(--dark); + background-color: var(--bg-main); } .tabcontent { padding-top: 10px; display: none; - background-color: var(--dark); + background-color: var(--bg-main); min-height: 510px; } @@ -268,7 +281,7 @@ div.exceptions > input { float: right; border: var(--active) solid 1px; background-color: var(--active); - color: var(--text-main); + color: var(--text); font-weight: bold; cursor: pointer; border-radius: 50%; @@ -284,12 +297,12 @@ div.exceptions > input { ul { padding: 0; list-style-type: none; - color: var(--text-main); + color: var(--text); margin: 20px 20px 0 20px; } li { - border-bottom: solid 0.5px var(--darker); + border-bottom: solid 0.5px var(--bg-secondary); padding: 20px 0px 20px 20px; } @@ -298,7 +311,7 @@ li { margin-right: -5px; border: var(--active) solid 1px; background-color: var(--active); - color: var(--text-main); + color: var(--text); font-weight: bold; cursor: pointer; border-radius: 50%; @@ -322,22 +335,25 @@ li { .autocomplete-items { position: absolute; - border: 1px solid var(--dark); + border: 1px solid var(--bg-main); border-bottom: none; border-top: none; z-index: 99; top: 85%; left: 0; right: 0; - overflow: auto; + overflow-y: auto; max-height: 175px; + color: var(--text); + overflow-x: hidden; + max-width: 380px; } .autocomplete-items div { padding: 10px; cursor: pointer; - background-color: var(--darker); - border-bottom: 1px solid var(--dark); + background-color: var(--bg-secondary); + border-bottom: 1px solid var(--bg-main); } .autocomplete-items div:hover { @@ -346,7 +362,7 @@ li { .autocomplete-active { background-color: var(--active); - color: var(--lighter); + color: var(--text); } .option { @@ -371,15 +387,15 @@ input[type="range"]::-webkit-slider-runnable-track { width: 100%; height: 8.4px; cursor: pointer; - box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; - background: var(--light); + border-color: var(--dark-grey), var(--light-grey); + background: var(--bg-main); border-radius: 1.3px; - border: 0.2px solid #010101; + border: 0.2px inset var(--dark-grey); } input[type="range"]::-webkit-slider-thumb { - box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; - border: 1px solid #000000; + border-color: var(--active); + border: 1px solid var(--dark-grey); height: 36px; width: 16px; border-radius: 3px; @@ -390,22 +406,22 @@ input[type="range"]::-webkit-slider-thumb { } input[type="range"]:focus::-webkit-slider-runnable-track { - background: var(--light); + background: var(--bg-main); } input[type="range"]::-moz-range-track { width: 100%; height: 8.4px; cursor: pointer; - box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; - background: var(--light); + border-color: var(--dark-grey), var(--light-grey); + background: var(--bg-main); border-radius: 1.3px; - border: 0.2px solid #010101; + border: 0.2px inset var(--dark-grey); } input[type="range"]::-moz-range-thumb { - box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d; - border: 1px solid #000000; + border-color: var(--active); + border: 1px solid var(--dark-grey); height: 36px; width: 16px; border-radius: 3px; @@ -413,73 +429,31 @@ input[type="range"]::-moz-range-thumb { cursor: pointer; } -@media (prefers-color-scheme: dark) { - body.popup, - header, - h1, - input, - select, - div.tabcontent, - button.tablinks.active { - background-color: var(--dark); - color: var(--text-main); - } - - body { - background-color: var(--darker); - } - - a.button { - color: var(--text-main); - } +::placeholder { + color: var(--text); + opacity: 0.7; +} - ::placeholder { - color: var(--text-main); - opacity: 0.7; - } +*:focus { + outline: var(--active) solid 2px; } @media (prefers-color-scheme: light) { - body.popup, - header, - h1, - input, - select, - div.tabcontent, - button.tablinks.active, - ul { - background-color: var(--lighter); - color: var(--text-secondary); - } - body { - background-color: var(--light); - } - - a.button { - color: var(--text-secondary); - stroke: var(--text-secondary); - } - - button.tablinks { - background-color: var(--light); - color: var(--text-secondary); - } - - ::placeholder { - color: var(--text-secondary); - opacity: 0.7; - } - - .tab button { - border-bottom: solid 1px var(--light); + --text: #000; + --text-secondary: #fff; + --bg-main: #e3e7ea; + --bg-secondary: #fff; } - button.tablinks.active { - border-bottom: solid 1px var(--lighter); + body.dark-theme { + --text: #fff; + --text-secondary: #000; + --bg-main: #3c4043; + --bg-secondary: #292a2d; } - .autocomplete-items div { - background-color: var(--light); + .popup { + background-color: var(--bg-secondary); } } -- cgit 1.4.1 From 6e9c84d45fd6d7dbe8376b378d5391039e0d3adb Mon Sep 17 00:00:00 2001 From: ueberchild Date: Sat, 1 Aug 2020 15:31:35 +0300 Subject: update invidious instances --- manifest.json | 12 +++++++----- pages/options/options.js | 10 ++++++---- 2 files changed, 13 insertions(+), 9 deletions(-) (limited to 'pages/options/options.js') diff --git a/manifest.json b/manifest.json index d49fc9b9..a4de451c 100644 --- a/manifest.json +++ b/manifest.json @@ -39,21 +39,23 @@ }, { "matches": [ - "*://invidio.us/*", "*://invidio.us/*", "*://invidious.snopyta.org/*", - "*://invidiou.sh/*", "*://yewtu.be/*", - "*://yt.maisputain.ovh/*", - "*://invidious.toot.koeln/*", "*://invidious.ggc-project.de/*", + "*://invidious.13ad.de/*", "*://invidious.toot.koeln/*", + "*://invidious.fdn.fr/*", + "*://watch.nettohikari.com/*", + "*://yt.iswleuven.be/*", + "*://yt.maisputain.ovh/*", "*://kgg2m7yk5aybusll.onion/*", "*://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion/*", "*://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion/*", "*://qklhadlycap4cnod.onion/*", "*://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion/*", - "*://mfqczy4mysscub2s.onio/*n" + "*://mfqczy4mysscub2s.onion/*" + "*://4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd.onion/*", ], "js": ["assets/javascript/persist-invidious-prefs.js"], "run_at": "document_start" diff --git a/pages/options/options.js b/pages/options/options.js index 352db45a..43545385 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -17,19 +17,21 @@ const nitterInstances = [ const invidiousInstances = [ "https://invidio.us", "https://invidious.snopyta.org", - "https://invidious.fdn.fr", + "https://yewtu.be", + "https://invidious.ggc-project.de", "https://invidious.13ad.de", + "https://invidious.toot.koeln", + "https://invidious.fdn.fr", "https://watch.nettohikari.com", - "https://yewtu.be", + "https://yt.iswleuven.be", "https://yt.maisputain.ovh", - "https://invidious.toot.koeln", - "https://invidious.ggc-project.de", "http://kgg2m7yk5aybusll.onion", "http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion", "http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion", "http://qklhadlycap4cnod.onion", "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion", "http://mfqczy4mysscub2s.onion", + "http://4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd.onion", ]; const bibliogramInstances = [ "https://bibliogram.art", -- cgit 1.4.1 From 564e25db3d5eb112458fcadc45200ea754fd01af Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Thu, 27 Aug 2020 15:22:46 +1000 Subject: Randomise Invidious instance if empty or https://invidio.us --- background.js | 415 ++++++++++++++++++++++++++------------------- manifest.json | 10 +- pages/options/options.html | 2 +- pages/options/options.js | 4 +- 4 files changed, 246 insertions(+), 185 deletions(-) (limited to 'pages/options/options.js') diff --git a/background.js b/background.js index 95561752..092f8d9d 100644 --- a/background.js +++ b/background.js @@ -1,26 +1,36 @@ -'use strict'; +"use strict"; -const invidiousDefault = 'https://invidio.us'; +const invidiousDefault = "https://invidious.snopyta.org"; const youtubeDomains = [ - 'm.youtube.com', - 'youtube.com', - 'img.youtube.com', - 'www.youtube.com', - 'youtube-nocookie.com', - 'www.youtube-nocookie.com', - 'youtu.be', - 's.ytimg.com', - 'music.youtube.com' + "m.youtube.com", + "youtube.com", + "img.youtube.com", + "www.youtube.com", + "youtube-nocookie.com", + "www.youtube-nocookie.com", + "youtu.be", + "s.ytimg.com", + "music.youtube.com", ]; -const nitterDefault = 'https://nitter.net'; +const invidiousInstances = [ + "https://invidious.snopyta.org", + "https://yewtu.be", + "https://invidious.13ad.de", + "https://invidious.xyz", + "https://invidious.site", + "https://invidiou.site", + "https://invidious.fdn.fr", + "https://invidious.toot.koeln", +]; +const nitterDefault = "https://nitter.net"; const twitterDomains = [ - 'twitter.com', - 'www.twitter.com', - 'mobile.twitter.com', - 'pbs.twimg.com', - 'video.twimg.com', + "twitter.com", + "www.twitter.com", + "mobile.twitter.com", + "pbs.twimg.com", + "video.twimg.com", ]; -const bibliogramDefault = 'https://bibliogram.art'; +const bibliogramDefault = "https://bibliogram.art"; const instagramDomains = [ "instagram.com", "www.instagram.com", @@ -28,50 +38,50 @@ const instagramDomains = [ "about.instagram.com", ]; const instagramReservedPaths = [ - 'about', - 'explore', - 'support', - 'press', - 'api', - 'privacy', - 'safety', - 'admin', - 'graphql', - 'accounts', - 'help', - 'terms', - 'contact', - 'blog', - 'igtv', - 'u', - 'p', - 'fragment', - 'imageproxy', - 'videoproxy', - '.well-known' + "about", + "explore", + "support", + "press", + "api", + "privacy", + "safety", + "admin", + "graphql", + "accounts", + "help", + "terms", + "contact", + "blog", + "igtv", + "u", + "p", + "fragment", + "imageproxy", + "videoproxy", + ".well-known", ]; const bibliogramBypassPaths = /\/(accounts\/|embeds?.js)/; const bibliogramInstances = [ - 'https://bibliogram.art', - 'https://bibliogram.snopyta.org' + "https://bibliogram.art", + "https://bibliogram.snopyta.org", ]; -const osmDefault = 'https://openstreetmap.org'; +const osmDefault = "https://openstreetmap.org"; const googleMapsRegex = /https?:\/\/(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/; const mapCentreRegex = /@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/; const dataLatLngRegex = /(!3d|!4d)(-?[0-9]{1,10}.[0-9]{1,10})/g; const placeRegex = /\/place\/(.*)\//; const travelModes = { - 'driving': 'fossgis_osrm_car', - 'walking': 'fossgis_osrm_foot', - 'bicycling': 'fossgis_osrm_bike', - 'transit': 'fossgis_osrm_car' // not implemented on OSM, default to car. + driving: "fossgis_osrm_car", + walking: "fossgis_osrm_foot", + bicycling: "fossgis_osrm_bike", + transit: "fossgis_osrm_car", // not implemented on OSM, default to car. }; const layers = { - 'none': 'S', - 'transit': 'T', - 'traffic': 'S', // not implemented on OSM, default to standard. - 'bicycling': 'C' -} + none: "S", + transit: "T", + traffic: "S", // not implemented on OSM, default to standard. + bicycling: "C", +}; let disableNitter; let disableInvidious; @@ -95,25 +105,25 @@ window.browser = window.browser || window.chrome; browser.storage.sync.get( [ - 'nitterInstance', - 'invidiousInstance', - 'bibliogramInstance', - 'osmInstance', - 'disableNitter', - 'disableInvidious', - 'disableBibliogram', - 'disableOsm', - 'alwaysProxy', - 'onlyEmbeddedVideo', - 'videoQuality', - 'invidiousDarkMode', - 'invidiousVolume', - 'invidiousPlayerStyle', - 'invidiousSubtitles', - 'invidiousAutoplay', - 'exceptions' + "nitterInstance", + "invidiousInstance", + "bibliogramInstance", + "osmInstance", + "disableNitter", + "disableInvidious", + "disableBibliogram", + "disableOsm", + "alwaysProxy", + "onlyEmbeddedVideo", + "videoQuality", + "invidiousDarkMode", + "invidiousVolume", + "invidiousPlayerStyle", + "invidiousSubtitles", + "invidiousAutoplay", + "exceptions", ], - result => { + (result) => { disableNitter = result.disableNitter; disableInvidious = result.disableInvidious; disableBibliogram = result.disableBibliogram; @@ -126,67 +136,70 @@ browser.storage.sync.get( onlyEmbeddedVideo = result.onlyEmbeddedVideo; videoQuality = result.videoQuality; invidiousDarkMode = result.invidiousDarkMode; - exceptions = result.exceptions ? result.exceptions.map(e => { - return new RegExp(e); - }) : []; + exceptions = result.exceptions + ? result.exceptions.map((e) => { + return new RegExp(e); + }) + : []; invidiousVolume = result.invidiousVolume; invidiousPlayerStyle = result.invidiousPlayerStyle; - invidiousSubtitles = result.invidiousSubtitles || ''; + invidiousSubtitles = result.invidiousSubtitles || ""; invidiousAutoplay = !result.invidiousAutoplay; } ); -browser.storage.onChanged.addListener(changes => { - if ('nitterInstance' in changes) { +browser.storage.onChanged.addListener((changes) => { + if ("nitterInstance" in changes) { nitterInstance = changes.nitterInstance.newValue || nitterDefault; } - if ('invidiousInstance' in changes) { + if ("invidiousInstance" in changes) { invidiousInstance = changes.invidiousInstance.newValue || invidiousDefault; } - if ('bibliogramInstance' in changes) { - bibliogramInstance = changes.bibliogramInstance.newValue || bibliogramDefault; + if ("bibliogramInstance" in changes) { + bibliogramInstance = + changes.bibliogramInstance.newValue || bibliogramDefault; } - if ('osmInstance' in changes) { + if ("osmInstance" in changes) { osmInstance = changes.osmInstance.newValue || osmDefault; } - if ('disableNitter' in changes) { + if ("disableNitter" in changes) { disableNitter = changes.disableNitter.newValue; } - if ('disableInvidious' in changes) { + if ("disableInvidious" in changes) { disableInvidious = changes.disableInvidious.newValue; } - if ('disableBibliogram' in changes) { + if ("disableBibliogram" in changes) { disableBibliogram = changes.disableBibliogram.newValue; } - if ('disableOsm' in changes) { + if ("disableOsm" in changes) { disableOsm = changes.disableOsm.newValue; } - if ('alwaysProxy' in changes) { + if ("alwaysProxy" in changes) { alwaysProxy = changes.alwaysProxy.newValue; } - if ('onlyEmbeddedVideo' in changes) { + if ("onlyEmbeddedVideo" in changes) { onlyEmbeddedVideo = changes.onlyEmbeddedVideo.newValue; } - if ('videoQuality' in changes) { + if ("videoQuality" in changes) { videoQuality = changes.videoQuality.newValue; } - if ('invidiousDarkMode' in changes) { + if ("invidiousDarkMode" in changes) { invidiousDarkMode = changes.invidiousDarkMode.newValue; } - if ('invidiousVolume' in changes) { + if ("invidiousVolume" in changes) { invidiousVolume = changes.invidiousVolume.newValue; } - if ('invidiousPlayerStyle' in changes) { + if ("invidiousPlayerStyle" in changes) { invidiousPlayerStyle = changes.invidiousPlayerStyle.newValue; } - if ('invidiousSubtitles' in changes) { + if ("invidiousSubtitles" in changes) { invidiousSubtitles = changes.invidiousSubtitles.newValue; } - if ('invidiousAutoplay' in changes) { + if ("invidiousAutoplay" in changes) { invidiousAutoplay = changes.invidiousAutoplay.newValue; } - if ('exceptions' in changes) { - exceptions = changes.exceptions.newValue.map(e => { + if ("exceptions" in changes) { + exceptions = changes.exceptions.newValue.map((e) => { return new RegExp(e); }); } @@ -204,14 +217,13 @@ function addressToLatLng(address, callback) { `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}` ); } - } - else { + } else { console.info("Error: Status is " + xmlhttp.status); } } }; xmlhttp.open( - 'GET', + "GET", `https://nominatim.openstreetmap.org/search/${address}?format=json&limit=1`, false ); @@ -219,52 +231,58 @@ function addressToLatLng(address, callback) { } function isException(url, initiator) { - return exceptions.some(regex => (regex.test(url.href))) || - (initiator && exceptions.some(regex => (regex.test(initiator.href)))); + return ( + exceptions.some((regex) => regex.test(url.href)) || + (initiator && exceptions.some((regex) => regex.test(initiator.href))) + ); } function isFirefox() { - return typeof InstallTrigger !== 'undefined'; + return typeof InstallTrigger !== "undefined"; } function redirectYouTube(url, initiator, type) { if (disableInvidious || isException(url, initiator)) { return null; } - if (initiator && (initiator.origin === invidiousInstance || youtubeDomains.includes(initiator.host))) { + if ( + initiator && + (initiator.origin === invidiousInstance || + youtubeDomains.includes(initiator.host)) + ) { return null; } if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) { // Don't redirect YouTube Player API. return null; } - if (url.host.split('.')[0] === 'studio') { + if (url.host.split(".")[0] === "studio") { // Avoid redirecting `studio.youtube.com` return null; } - if (onlyEmbeddedVideo && type !== 'sub_frame') { + if (onlyEmbeddedVideo && type !== "sub_frame") { return null; } // Apply settings if (alwaysProxy) { - url.searchParams.append('local', true); + url.searchParams.append("local", true); } if (videoQuality) { - url.searchParams.append('quality', videoQuality); + url.searchParams.append("quality", videoQuality); } if (invidiousDarkMode) { - url.searchParams.append('dark_mode', invidiousDarkMode); + url.searchParams.append("dark_mode", invidiousDarkMode); } if (invidiousVolume) { - url.searchParams.append('volume', invidiousVolume); + url.searchParams.append("volume", invidiousVolume); } if (invidiousPlayerStyle) { - url.searchParams.append('player_style', invidiousPlayerStyle); + url.searchParams.append("player_style", invidiousPlayerStyle); } if (invidiousSubtitles) { - url.searchParams.append('subtitles', invidiousSubtitles); + url.searchParams.append("subtitles", invidiousSubtitles); } - url.searchParams.append('autoplay', invidiousAutoplay ? 1 : 0); + url.searchParams.append("autoplay", invidiousAutoplay ? 1 : 0); return `${invidiousInstance}${url.pathname}${url.search}`; } @@ -273,21 +291,28 @@ function redirectTwitter(url, initiator) { if (disableNitter || isException(url, initiator)) { return null; } - if (url.pathname.includes('/home')) { + if (url.pathname.includes("/home")) { return null; } - if (isFirefox() && initiator && (initiator.origin === nitterInstance || twitterDomains.includes(initiator.host))) { + if ( + isFirefox() && + initiator && + (initiator.origin === nitterInstance || + twitterDomains.includes(initiator.host)) + ) { browser.storage.sync.set({ - redirectBypassFlag: true + redirectBypassFlag: true, }); return null; } - if (url.host.split('.')[0] === 'pbs') { + if (url.host.split(".")[0] === "pbs") { return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; - } else if (url.host.split('.')[0] === 'video') { + } else if (url.host.split(".")[0] === "video") { return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; - } else if (url.pathname.includes('tweets')) { - return `${nitterInstance}${url.pathname.replace('/tweets', '')}${url.search}`; + } else if (url.pathname.includes("tweets")) { + return `${nitterInstance}${url.pathname.replace("/tweets", "")}${ + url.search + }`; } else { return `${nitterInstance}${url.pathname}${url.search}`; } @@ -298,14 +323,21 @@ function redirectInstagram(url, initiator, type) { return null; } // Do not redirect Bibliogram view on Instagram links - if (initiator && (initiator.origin === bibliogramInstance || instagramDomains.includes(initiator.host))) { + if ( + initiator && + (initiator.origin === bibliogramInstance || + instagramDomains.includes(initiator.host)) + ) { return null; } // Do not redirect /accounts, /embeds.js, or anything other than main_frame - if (type !== 'main_frame' || url.pathname.match(bibliogramBypassPaths)) { + if (type !== "main_frame" || url.pathname.match(bibliogramBypassPaths)) { return null; } - if (url.pathname === '/' || instagramReservedPaths.includes(url.pathname.split('/')[1])) { + if ( + url.pathname === "/" || + instagramReservedPaths.includes(url.pathname.split("/")[1]) + ) { return `${bibliogramInstance}${url.pathname}${url.search}`; } else { // Likely a user profile, redirect to '/u/...' @@ -318,31 +350,33 @@ function redirectGoogleMaps(url, initiator) { return null; } let redirect; - let mapCentre = ''; - let params = ''; + let mapCentre = ""; + let params = ""; // Set map centre if present if (url.pathname.match(mapCentreRegex)) { const [, lat, lon, zoom] = url.pathname.match(mapCentreRegex); mapCentre = `#map=${zoom}/${lat}/${lon}`; - } else if (url.search.includes('center=')) { - const [lat, lon] = url.searchParams.get('center').split(','); - mapCentre = `#map=${url.searchParams.get('zoom') || '17'}/${lat}/${lon}`; + } else if (url.search.includes("center=")) { + const [lat, lon] = url.searchParams.get("center").split(","); + mapCentre = `#map=${url.searchParams.get("zoom") || "17"}/${lat}/${lon}`; // Set default zoom if mapCentre not present } else { - params = '&zoom=17'; + params = "&zoom=17"; } // Set map layer - params = `${params}&layers=${layers[url.searchParams.get('layer')] || layers['none']}`; + params = `${params}&layers=${ + layers[url.searchParams.get("layer")] || layers["none"] + }`; // Handle Google Maps Embed API - if (url.pathname.includes('/embed')) { - let query = ''; - if (url.searchParams.has('q')) { - query = url.searchParams.get('q'); - } else if (url.searchParams.has('query')) { - query = url.searchParams.has('query'); - } else if (url.searchParams.has('pb')) { + if (url.pathname.includes("/embed")) { + let query = ""; + if (url.searchParams.has("q")) { + query = url.searchParams.get("q"); + } else if (url.searchParams.has("query")) { + query = url.searchParams.has("query"); + } else if (url.searchParams.has("pb")) { try { - query = url.searchParams.get('pb').split(/!2s(.*?)!/)[1]; + query = url.searchParams.get("pb").split(/!2s(.*?)!/)[1]; } catch (error) { console.error(error); // Unable to find map marker in URL. @@ -355,47 +389,56 @@ function redirectGoogleMaps(url, initiator) { }); redirect = `${osmInstance}/export/embed.html?bbox=${bbox}&layer=mapnik&marker=${marker}`; // Handle Google Maps Directions - } else if (url.pathname.includes('/dir')) { - const travelMode = travelModes[url.searchParams.get('travelmode')] || travelModes['driving']; + } else if (url.pathname.includes("/dir")) { + const travelMode = + travelModes[url.searchParams.get("travelmode")] || travelModes["driving"]; let origin; - addressToLatLng(url.searchParams.get('origin'), coords => { + addressToLatLng(url.searchParams.get("origin"), (coords) => { origin = coords; }); let destination; - addressToLatLng(url.searchParams.get('destination'), coords => { + addressToLatLng(url.searchParams.get("destination"), (coords) => { destination = coords; }); redirect = `${osmInstance}/directions?engine=${travelMode}&route=${origin}%3B${destination}${mapCentre}${params}`; // Get marker from data attribute - } else if (url.pathname.includes('data=') && url.pathname.match(dataLatLngRegex)) { + } else if ( + url.pathname.includes("data=") && + url.pathname.match(dataLatLngRegex) + ) { const [mlat, mlon] = url.pathname.match(dataLatLngRegex); - redirect = `${osmInstance}/?mlat=${mlat.replace('!3d', '')}&mlon=${mlon.replace('!4d', '')}${mapCentre}${params}`; + redirect = `${osmInstance}/?mlat=${mlat.replace( + "!3d", + "" + )}&mlon=${mlon.replace("!4d", "")}${mapCentre}${params}`; // Get marker from ll param - } else if (url.searchParams.has('ll')) { - const [mlat, mlon] = url.searchParams.get('ll').split(','); + } else if (url.searchParams.has("ll")) { + const [mlat, mlon] = url.searchParams.get("ll").split(","); redirect = `${osmInstance}/?mlat=${mlat}&mlon=${mlon}${mapCentre}${params}`; // Get marker from viewpoint param. - } else if (url.searchParams.has('viewpoint')) { - const [mlat, mlon] = url.searchParams.get('viewpoint').split(','); + } else if (url.searchParams.has("viewpoint")) { + const [mlat, mlon] = url.searchParams.get("viewpoint").split(","); redirect = `${osmInstance}/?mlat=${mlat}&mlon=${mlon}${mapCentre}${params}`; // Use query as search if present. } else { let query; - if (url.searchParams.has('q')) { - query = url.searchParams.get('q'); - } else if (url.searchParams.has('query')) { - query = url.searchParams.get('query'); + if (url.searchParams.has("q")) { + query = url.searchParams.get("q"); + } else if (url.searchParams.has("query")) { + query = url.searchParams.get("query"); } else if (url.pathname.match(placeRegex)) { query = url.pathname.match(placeRegex)[1]; } - redirect = `${osmInstance}/${query ? 'search?query=' + query : ''}${mapCentre || '#'}${params}`; + redirect = `${osmInstance}/${query ? "search?query=" + query : ""}${ + mapCentre || "#" + }${params}`; } return redirect; } browser.webRequest.onBeforeRequest.addListener( - details => { + (details) => { const url = new URL(details.url); let initiator; if (details.originUrl) { @@ -406,55 +449,69 @@ browser.webRequest.onBeforeRequest.addListener( let redirect; if (youtubeDomains.includes(url.host)) { redirect = { - redirectUrl: redirectYouTube(url, initiator, details.type) + redirectUrl: redirectYouTube(url, initiator, details.type), }; } else if (twitterDomains.includes(url.host)) { redirect = { - redirectUrl: redirectTwitter(url, initiator) + redirectUrl: redirectTwitter(url, initiator), }; } else if (instagramDomains.includes(url.host)) { redirect = { - redirectUrl: redirectInstagram(url, initiator, details.type) + redirectUrl: redirectInstagram(url, initiator, details.type), }; } else if (url.href.match(googleMapsRegex)) { redirect = { - redirectUrl: redirectGoogleMaps(url, initiator) + redirectUrl: redirectGoogleMaps(url, initiator), }; } if (redirect && redirect.redirectUrl) { console.info( - 'Redirecting', `"${url.href}"`, '=>', `"${redirect.redirectUrl}"` + "Redirecting", + `"${url.href}"`, + "=>", + `"${redirect.redirectUrl}"` ); - console.info('Details', details); + console.info("Details", details); } return redirect; }, { - urls: [""] + urls: [""], }, - ['blocking'] + ["blocking"] ); -browser.runtime.onInstalled.addListener( - details => { - if (details.reason === 'install') { - browser.storage.sync.set({ - bibliogramInstance: bibliogramInstances[~~(bibliogramInstances.length * Math.random())] - }); - } else if (details.reason === 'update') { - browser.storage.sync.get(['whitelist', 'exceptions'], - result => { - if (result.whitelist) { - let whitelist = result.whitelist.map( - e => e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') - ); - browser.storage.sync.set({ - exceptions: result.exceptions.concat(whitelist), - whitelist: null - }); - } +browser.runtime.onInstalled.addListener((details) => { + if (details.reason === "install") { + browser.storage.sync.set({ + bibliogramInstance: + bibliogramInstances[~~(bibliogramInstances.length * Math.random())], + invidiousInstance: + invidiousInstances[~~(invidiousInstances.length * Math.random())], + }); + } else if (details.reason === "update") { + browser.storage.sync.get( + ["whitelist", "exceptions", "invidiousInstance"], + (result) => { + if (result.whitelist) { + let whitelist = result.whitelist.map((e) => + e.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") + ); + browser.storage.sync.set({ + exceptions: result.exceptions.concat(whitelist), + whitelist: null, + }); } - ); - } + if ( + result.invidiousInstance === "https://invidio.us" || + result.invidiousInstance === null + ) { + browser.storage.sync.set({ + invidiousInstance: + invidiousInstances[~~(invidiousInstances.length * Math.random())], + }); + } + } + ); } -); +}); diff --git a/manifest.json b/manifest.json index ba55111a..88be6e84 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_extensionName__", "description": "__MSG_extensionDescription__", - "version": "1.1.39", + "version": "1.1.40", "manifest_version": 2, "background": { "scripts": ["background.js"], @@ -39,9 +39,11 @@ }, { "matches": [ - "*://invidio.us/*", "*://invidious.snopyta.org/*", "*://yewtu.be/*", + "*://invidious.xyz/*", + "*://invidious.site/*", + "*://invidiou.site/*", "*://invidious.ggc-project.de/*", "*://invidious.13ad.de/*", "*://invidious.toot.koeln/*", @@ -54,8 +56,8 @@ "*://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion/*", "*://qklhadlycap4cnod.onion/*", "*://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion/*", - "*://mfqczy4mysscub2s.onion/*" - "*://4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd.onion/*", + "*://mfqczy4mysscub2s.onion/*", + "*://4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd.onion/*" ], "js": ["assets/javascript/persist-invidious-prefs.js"], "run_at": "document_start" diff --git a/pages/options/options.html b/pages/options/options.html index 0f38ff0a..8e074037 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -137,7 +137,7 @@ diff --git a/pages/options/options.js b/pages/options/options.js index 43545385..d6fc731b 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -15,12 +15,14 @@ const nitterInstances = [ "http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion", ]; const invidiousInstances = [ - "https://invidio.us", "https://invidious.snopyta.org", "https://yewtu.be", "https://invidious.ggc-project.de", "https://invidious.13ad.de", + "https://invidious.xyz", "https://invidious.toot.koeln", + "https://invidious.site", + "https://invidiou.site", "https://invidious.fdn.fr", "https://watch.nettohikari.com", "https://yt.iswleuven.be", -- cgit 1.4.1 From 67dc5fcc3b3ae35fb2aa9abbde24b35df8bf75a3 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Fri, 28 Aug 2020 09:17:36 +1000 Subject: Fixes #89 - autoplay reversed, improve instance selects (#90) --- background.js | 2 +- pages/options/options.js | 46 +++++++++++++++++++++++++--------------------- 2 files changed, 26 insertions(+), 22 deletions(-) (limited to 'pages/options/options.js') diff --git a/background.js b/background.js index 092f8d9d..ffe1857e 100644 --- a/background.js +++ b/background.js @@ -144,7 +144,7 @@ browser.storage.sync.get( invidiousVolume = result.invidiousVolume; invidiousPlayerStyle = result.invidiousPlayerStyle; invidiousSubtitles = result.invidiousSubtitles || ""; - invidiousAutoplay = !result.invidiousAutoplay; + invidiousAutoplay = result.invidiousAutoplay; } ); diff --git a/pages/options/options.js b/pages/options/options.js index d6fc731b..89ef315f 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -142,7 +142,7 @@ browser.storage.sync.get( invidiousVolume.value = result.invidiousVolume; invidiousPlayerStyle.value = result.invidiousPlayerStyle || ""; invidiousSubtitles.value = result.invidiousSubtitles || ""; - invidiousAutoplay.checked = !result.invidiousAutoplay; + invidiousAutoplay.checked = result.invidiousAutoplay; } ); @@ -338,7 +338,7 @@ let invidiousSubtitlesChange = debounce(() => { invidiousSubtitles.addEventListener("input", invidiousSubtitlesChange); invidiousAutoplay.addEventListener("change", (event) => { - browser.storage.sync.set({ invidiousAutoplay: !event.target.checked }); + browser.storage.sync.set({ invidiousAutoplay: event.target.checked }); }); theme.addEventListener("change", (event) => { @@ -364,7 +364,7 @@ theme.addEventListener("change", (event) => { function autocomplete(input, list) { let currentFocus; input.addEventListener("focus", (e) => { - showOptions(e); + showOptions(e, true); }); input.addEventListener("input", (e) => { const val = e.target.value; @@ -390,31 +390,35 @@ function autocomplete(input, list) { } } }); - function showOptions(e) { - let a, - b, + function showOptions(event, showAll = false) { + let div, i, - val = e.target.value; + val = event.target.value; closeAllLists(); - a = document.createElement("div"); - a.setAttribute("id", e.target.id + "autocomplete-list"); - a.setAttribute("class", "autocomplete-items"); - e.target.parentNode.appendChild(a); + div = document.createElement("div"); + div.setAttribute("id", event.target.id + "autocomplete-list"); + div.setAttribute("class", "autocomplete-items"); + event.target.parentNode.appendChild(div); for (i = 0; i < list.length; i++) { if (list[i].toLowerCase().indexOf(val.toLowerCase()) > -1) { - b = document.createElement("div"); - b.innerHTML = "" + list[i].substr(0, val.length) + ""; - b.innerHTML += list[i].substr(val.length); - b.innerHTML += ""; - b.addEventListener("click", function (e) { - input.value = e.target.getElementsByTagName("input")[0].value; - input.dispatchEvent(new Event("input")); - closeAllLists(); - }); - a.appendChild(b); + div.appendChild(getItem(list[i], val)); + } else if (showAll) { + div.appendChild(getItem(list[i], val)); } } } + function getItem(item, val) { + let div = document.createElement("div"); + div.innerHTML = "" + item.substr(0, val.length) + ""; + div.innerHTML += item.substr(val.length); + div.innerHTML += ""; + div.addEventListener("click", function (e) { + input.value = e.target.getElementsByTagName("input")[0].value; + input.dispatchEvent(new Event("input")); + closeAllLists(); + }); + return div; + } function addActive(x) { if (!x) return false; removeActive(x); -- cgit 1.4.1 From ae6f4f6a6cd9fbd5fe583f52782e94641c752706 Mon Sep 17 00:00:00 2001 From: SimonBrazell Date: Tue, 1 Sep 2020 17:26:23 +1000 Subject: Randomise instances when empty (#48) --- assets/javascript/remove-twitter-sw.js | 68 ++++++++++++++++--------- background.js | 91 ++++++++++++++++++++++------------ manifest.json | 2 +- pages/options/options.html | 17 ++++--- pages/options/options.js | 14 ++++-- pages/styles.css | 4 ++ 6 files changed, 125 insertions(+), 71 deletions(-) (limited to 'pages/options/options.js') diff --git a/assets/javascript/remove-twitter-sw.js b/assets/javascript/remove-twitter-sw.js index d9d3ce3e..222a7283 100644 --- a/assets/javascript/remove-twitter-sw.js +++ b/assets/javascript/remove-twitter-sw.js @@ -1,6 +1,20 @@ -'use strict'; +"use strict"; -const nitterDefault = 'https://nitter.net'; +const nitterInstances = [ + "https://nitter.net", + "https://nitter.snopyta.org", + "https://nitter.42l.fr", + "https://nitter.nixnet.services", + "https://nitter.13ad.de", + "https://nitter.pussthecat.org", + "https://nitter.mastodont.cat", + "https://nitter", + "https://nitter.tedomum.net", + "https://nitter.cattube.org", + "https://nitter.fdn.fr", + "https://nitter.1d4.us", + "https://nitter.kavin.rocks", +]; let disableNitter; let nitterInstance; @@ -9,61 +23,67 @@ let exceptions; window.browser = window.browser || window.chrome; +function getRandomInstance() { + return nitterInstances[~~(nitterInstances.length * Math.random())]; +} + function isNotException(url) { - return !exceptions.some(regex => (regex.test(url.href))); + return !exceptions.some((regex) => regex.test(url.href)); } function shouldRedirect(url) { - return !redirectBypassFlag && + return ( + !redirectBypassFlag && isNotException(url) && !disableNitter && url.host !== nitterInstance && - !url.pathname.includes('/home'); + !url.pathname.includes("/home") + ); } function redirectTwitter(url) { - if (url.host.split('.')[0] === 'pbs') { + if (url.host.split(".")[0] === "pbs") { return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; - } else if (url.host.split('.')[0] === 'video') { + } else if (url.host.split(".")[0] === "video") { return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; } else { return `${nitterInstance}${url.pathname}${url.search}`; - }; + } } browser.storage.sync.get( [ - 'nitterInstance', - 'disableNitter', - 'removeTwitterSW', - 'redirectBypassFlag', - 'exceptions' + "nitterInstance", + "disableNitter", + "removeTwitterSW", + "redirectBypassFlag", + "exceptions", ], (result) => { redirectBypassFlag = result.redirectBypassFlag; browser.storage.sync.set({ - redirectBypassFlag: false + redirectBypassFlag: false, }); if (!result.removeTwitterSW) { disableNitter = result.disableNitter; - nitterInstance = result.nitterInstance || nitterDefault; - exceptions = result.exceptions ? result.exceptions.map(e => { - return new RegExp(e); - }) : []; - navigator.serviceWorker.getRegistrations().then(registrations => { + nitterInstance = result.nitterInstance || getRandomInstance(); + exceptions = result.exceptions + ? result.exceptions.map((e) => { + return new RegExp(e); + }) + : []; + navigator.serviceWorker.getRegistrations().then((registrations) => { for (let registration of registrations) { - if (registration.scope === 'https://twitter.com/') { + if (registration.scope === "https://twitter.com/") { registration.unregister(); - console.log('Unregistered Twitter SW', registration); + console.log("Unregistered Twitter SW", registration); } } }); const url = new URL(window.location); if (shouldRedirect()) { const redirect = redirectTwitter(url); - console.info( - 'Redirecting', `"${url.href}"`, '=>', `"${redirect}"` - ); + console.info("Redirecting", `"${url.href}"`, "=>", `"${redirect}"`); window.location = redirect; } } diff --git a/background.js b/background.js index ffe1857e..3f5145cd 100644 --- a/background.js +++ b/background.js @@ -1,6 +1,5 @@ "use strict"; -const invidiousDefault = "https://invidious.snopyta.org"; const youtubeDomains = [ "m.youtube.com", "youtube.com", @@ -22,7 +21,6 @@ const invidiousInstances = [ "https://invidious.fdn.fr", "https://invidious.toot.koeln", ]; -const nitterDefault = "https://nitter.net"; const twitterDomains = [ "twitter.com", "www.twitter.com", @@ -30,7 +28,20 @@ const twitterDomains = [ "pbs.twimg.com", "video.twimg.com", ]; -const bibliogramDefault = "https://bibliogram.art"; +const nitterInstances = [ + "https://nitter.net", + "https://nitter.snopyta.org", + "https://nitter.42l.fr", + "https://nitter.nixnet.services", + "https://nitter.13ad.de", + "https://nitter.pussthecat.org", + "https://nitter.mastodont.cat", + "https://nitter.tedomum.net", + "https://nitter.cattube.org", + "https://nitter.fdn.fr", + "https://nitter.1d4.us", + "https://nitter.kavin.rocks", +]; const instagramDomains = [ "instagram.com", "www.instagram.com", @@ -64,6 +75,13 @@ const bibliogramBypassPaths = /\/(accounts\/|embeds?.js)/; const bibliogramInstances = [ "https://bibliogram.art", "https://bibliogram.snopyta.org", + "https://bibliogram.pussthecat.org", + "https://bibliogram.nixnet.services", + "https://bg.endl.site", + "https://bibliogram.13ad.de ", + "https://bibliogram.stemy.me ", + "https://bibliogram.hamster.dance", + "https://bibliogram.ggc-project.de", ]; const osmDefault = "https://openstreetmap.org"; const googleMapsRegex = /https?:\/\/(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/; @@ -128,9 +146,9 @@ browser.storage.sync.get( disableInvidious = result.disableInvidious; disableBibliogram = result.disableBibliogram; disableOsm = result.disableOsm; - nitterInstance = result.nitterInstance || nitterDefault; - invidiousInstance = result.invidiousInstance || invidiousDefault; - bibliogramInstance = result.bibliogramInstance || bibliogramDefault; + nitterInstance = result.nitterInstance; + invidiousInstance = result.invidiousInstance; + bibliogramInstance = result.bibliogramInstance; osmInstance = result.osmInstance || osmDefault; alwaysProxy = result.alwaysProxy; onlyEmbeddedVideo = result.onlyEmbeddedVideo; @@ -150,14 +168,13 @@ browser.storage.sync.get( browser.storage.onChanged.addListener((changes) => { if ("nitterInstance" in changes) { - nitterInstance = changes.nitterInstance.newValue || nitterDefault; + nitterInstance = changes.nitterInstance.newValue; } if ("invidiousInstance" in changes) { - invidiousInstance = changes.invidiousInstance.newValue || invidiousDefault; + invidiousInstance = changes.invidiousInstance.newValue; } if ("bibliogramInstance" in changes) { - bibliogramInstance = - changes.bibliogramInstance.newValue || bibliogramDefault; + bibliogramInstance = changes.bibliogramInstance.newValue; } if ("osmInstance" in changes) { osmInstance = changes.osmInstance.newValue || osmDefault; @@ -205,6 +222,10 @@ browser.storage.onChanged.addListener((changes) => { } }); +function getRandomInstance(instanceList) { + return instanceList[~~(instanceList.length * Math.random())]; +} + function addressToLatLng(address, callback) { const xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = () => { @@ -248,6 +269,7 @@ function redirectYouTube(url, initiator, type) { if ( initiator && (initiator.origin === invidiousInstance || + invidiousInstances.includes(initiator.origin) || youtubeDomains.includes(initiator.host)) ) { return null; @@ -284,7 +306,9 @@ function redirectYouTube(url, initiator, type) { } url.searchParams.append("autoplay", invidiousAutoplay ? 1 : 0); - return `${invidiousInstance}${url.pathname}${url.search}`; + return `${invidiousInstance || getRandomInstance(invidiousInstances)}${ + url.pathname + }${url.search}`; } function redirectTwitter(url, initiator) { @@ -298,6 +322,7 @@ function redirectTwitter(url, initiator) { isFirefox() && initiator && (initiator.origin === nitterInstance || + nitterInstances.includes(initiator.origin) || twitterDomains.includes(initiator.host)) ) { browser.storage.sync.set({ @@ -306,15 +331,21 @@ function redirectTwitter(url, initiator) { return null; } if (url.host.split(".")[0] === "pbs") { - return `${nitterInstance}/pic/${encodeURIComponent(url.href)}`; + return `${ + nitterInstance || getRandomInstance(nitterInstances) + }/pic/${encodeURIComponent(url.href)}`; } else if (url.host.split(".")[0] === "video") { - return `${nitterInstance}/gif/${encodeURIComponent(url.href)}`; + return `${ + nitterInstance || getRandomInstance(nitterInstances) + }/gif/${encodeURIComponent(url.href)}`; } else if (url.pathname.includes("tweets")) { - return `${nitterInstance}${url.pathname.replace("/tweets", "")}${ - url.search - }`; + return `${ + nitterInstance || getRandomInstance(nitterInstances) + }${url.pathname.replace("/tweets", "")}${url.search}`; } else { - return `${nitterInstance}${url.pathname}${url.search}`; + return `${nitterInstance || getRandomInstance(nitterInstances)}${ + url.pathname + }${url.search}`; } } @@ -326,6 +357,7 @@ function redirectInstagram(url, initiator, type) { if ( initiator && (initiator.origin === bibliogramInstance || + bibliogramInstances.includes(initiator.origin) || instagramDomains.includes(initiator.host)) ) { return null; @@ -338,10 +370,14 @@ function redirectInstagram(url, initiator, type) { url.pathname === "/" || instagramReservedPaths.includes(url.pathname.split("/")[1]) ) { - return `${bibliogramInstance}${url.pathname}${url.search}`; + return `${bibliogramInstance || getRandomInstance(bibliogramInstances)}${ + url.pathname + }${url.search}`; } else { // Likely a user profile, redirect to '/u/...' - return `${bibliogramInstance}/u${url.pathname}${url.search}`; + return `${bibliogramInstance || getRandomInstance(bibliogramInstances)}/u${ + url.pathname + }${url.search}`; } } @@ -482,14 +518,7 @@ browser.webRequest.onBeforeRequest.addListener( ); browser.runtime.onInstalled.addListener((details) => { - if (details.reason === "install") { - browser.storage.sync.set({ - bibliogramInstance: - bibliogramInstances[~~(bibliogramInstances.length * Math.random())], - invidiousInstance: - invidiousInstances[~~(invidiousInstances.length * Math.random())], - }); - } else if (details.reason === "update") { + if (details.reason === "update") { browser.storage.sync.get( ["whitelist", "exceptions", "invidiousInstance"], (result) => { @@ -502,13 +531,9 @@ browser.runtime.onInstalled.addListener((details) => { whitelist: null, }); } - if ( - result.invidiousInstance === "https://invidio.us" || - result.invidiousInstance === null - ) { + if (result.invidiousInstance === "https://invidio.us") { browser.storage.sync.set({ - invidiousInstance: - invidiousInstances[~~(invidiousInstances.length * Math.random())], + invidiousInstance: null, }); } } diff --git a/manifest.json b/manifest.json index 88be6e84..ea0756b3 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_extensionName__", "description": "__MSG_extensionDescription__", - "version": "1.1.40", + "version": "1.1.41", "manifest_version": 2, "background": { "scripts": ["background.js"], diff --git a/pages/options/options.html b/pages/options/options.html index 8e074037..6641e5c4 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -127,7 +127,7 @@ id="nitter-instance" type="url" name="nitter-instance" - placeholder="https://nitter.net" + placeholder="Random instance (none selected)" /> @@ -137,7 +137,7 @@ @@ -147,7 +147,7 @@ @@ -228,9 +228,8 @@ - + +
      @@ -257,7 +256,9 @@
      -

      Invidious Volume

      +

      + Invidious Volume +

      + />

      diff --git a/pages/options/options.js b/pages/options/options.js index 89ef315f..8149be7b 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -140,6 +140,9 @@ browser.storage.sync.get( exceptions = result.exceptions || []; exceptions.forEach(prependExceptionsItem); invidiousVolume.value = result.invidiousVolume; + document.querySelector("#volume-value").textContent = result.invidiousVolume + ? `${result.invidiousVolume}%` + : " - "; invidiousPlayerStyle.value = result.invidiousPlayerStyle || ""; invidiousSubtitles.value = result.invidiousSubtitles || ""; invidiousAutoplay.checked = result.invidiousAutoplay; @@ -313,11 +316,12 @@ persistInvidiousPrefs.addEventListener("change", (event) => { }); let invidiousVolumeChange = debounce(() => { - if (invidiousInstance.checkValidity()) { - browser.storage.sync.set({ - invidiousVolume: invidiousVolume.value, - }); - } + document.querySelector( + "#volume-value" + ).textContent = `${invidiousVolume.value}%`; + browser.storage.sync.set({ + invidiousVolume: invidiousVolume.value, + }); }, 500); invidiousVolume.addEventListener("input", invidiousVolumeChange); diff --git a/pages/styles.css b/pages/styles.css index 300dadbf..dd58676b 100644 --- a/pages/styles.css +++ b/pages/styles.css @@ -457,3 +457,7 @@ input[type="range"]::-moz-range-thumb { background-color: var(--bg-secondary); } } + +#volume-value { + float: right; +} -- cgit 1.4.1