aboutsummaryrefslogtreecommitdiffstats
path: root/src/assets/javascripts/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets/javascripts/helpers')
-rw-r--r--src/assets/javascripts/helpers/common.js57
-rw-r--r--src/assets/javascripts/helpers/google-maps.js104
-rw-r--r--src/assets/javascripts/helpers/google-search.js101
-rw-r--r--src/assets/javascripts/helpers/google-translate.js47
-rw-r--r--src/assets/javascripts/helpers/instagram.js73
-rw-r--r--src/assets/javascripts/helpers/medium.js54
-rw-r--r--src/assets/javascripts/helpers/reddit.js136
-rw-r--r--src/assets/javascripts/helpers/twitter.js101
-rw-r--r--src/assets/javascripts/helpers/wikipedia.js59
-rw-r--r--src/assets/javascripts/helpers/youtube.js299
10 files changed, 884 insertions, 147 deletions
diff --git a/src/assets/javascripts/helpers/common.js b/src/assets/javascripts/helpers/common.js
index a2f951ae..094c19e4 100644
--- a/src/assets/javascripts/helpers/common.js
+++ b/src/assets/javascripts/helpers/common.js
@@ -1,3 +1,14 @@
+import twitterHelper from "./twitter.js";
+import youtubeHelper from "./youtube.js";
+import instagramHelper from "./instagram.js";
+import mediumHelper from "./medium.js";
+import redditHelper from "./reddit.js";
+import searchHelper from "./google-search.js";
+import googleTranslateHelper from "./google-translate.js";
+import wikipediaHelper from "./wikipedia.js";
+import mapsHelper from "./google-maps.js";
+import medium from "./medium.js";
+
function filterInstances(instances) {
let onionScan = instances.filter((instance) => !instance.includes(".onion"))
@@ -21,27 +32,16 @@ function updateInstances() {
if (request.status === 200) {
const instances = JSON.parse(request.responseText);
- const invidiousRandomPool = addHttps(filterInstances(instances.invidious));
- const nitterRandomPool = addHttps(filterInstances(instances.nitter));
- const bibliogramRandomPool = addHttps(filterInstances(instances.bibliogram));
- const tedditRandomPool = addHttps(filterInstances(instances.teddit));
- const simplyTranslateRandomPool = addHttps(filterInstances(instances.simplyTranslate))
- const searxRandomPool = addHttps(filterInstances(instances.simplyTranslate));
- const whoogleRandomPool = addHttps(filterInstances(instances.whoogle));
- const wikilessRandomPool = addHttps(filterInstances(instances.wikiless));
- const scribeRandomPool = addHttps(filterInstances(instances.scribe));
- browser.storage.sync.set({
- invidiousRandomPool,
- nitterRandomPool,
- bibliogramRandomPool,
- tedditRandomPool,
- searxRandomPool,
- whoogleRandomPool,
- simplyTranslateRandomPool,
- wikilessRandomPool,
- scribeRandomPool
- });
- console.info("Successfully updated Instances")
+ youtubeHelper.redirects = addHttps(filterInstances(instances.invidious));
+ twitterHelper.redirects = addHttps(filterInstances(instances.nitter));
+ instagramHelper.redirects = addHttps(filterInstances(instances.bibliogram));
+ redditHelper.redirects.libreddit = addHttps(filterInstances(instances.simplyTranslate))
+ redditHelper.redirects.teddit = addHttps(filterInstances(instances.teddit));
+ searchHelper.redirects.searx = addHttps(filterInstances(instances.simplyTranslate));
+ searchHelper.redirects.whoogle = addHttps(filterInstances(instances.whoogle));
+ wikipediaHelper.redirects = addHttps(filterInstances(instances.wikiless));
+ mediumHelper.redirects = addHttps(filterInstances(instances.scribe));
+ console.info("Successfully updated Instances");
return true;
}
return false;
@@ -95,6 +95,17 @@ function updateListElement(listElement, list) {
});
}
+function isFirefox() {
+ return typeof InstallTrigger !== "undefined";
+}
+
+function isException(url, initiator) {
+ return (
+ data.exceptions.some((regex) => regex.test(url.href)) ||
+ (initiator && data.exceptions.some((regex) => regex.test(initiator.href)))
+ );
+}
+
export default {
filterInstances,
getRandomInstance,
@@ -103,5 +114,7 @@ export default {
debounce,
validURL,
filterList,
- updateListElement
+ updateListElement,
+ isFirefox,
+ isException,
};
diff --git a/src/assets/javascripts/helpers/google-maps.js b/src/assets/javascripts/helpers/google-maps.js
index 2ba924ba..f0cf01bc 100644
--- a/src/assets/javascripts/helpers/google-maps.js
+++ b/src/assets/javascripts/helpers/google-maps.js
@@ -1,5 +1,9 @@
const targets = /https?:\/\/(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/;
-const redirects = ["https://openstreetmap.org"];
+const redirects = {
+ "normal": [
+ "https://openstreetmap.org"
+ ]
+};
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\/(.*)\//;
@@ -40,6 +44,99 @@ function addressToLatLng(address, callback) {
xmlhttp.send();
}
+let disableOsm;
+const getDisableOsm = () => disableOsm;
+function setDisableOsm(val) {
+ disableOsm = val;
+ browser.storage.sync.set({ disableOsm })
+}
+
+let osmInstance;
+const getOsmInstance = () => osmInstance;
+function setOsmInstance(val) {
+ osmInstance = val;
+ browser.storage.sync.set({ osmInstance })
+};
+
+function redirectGoogleMaps(url, initiator) {
+ if (disableOsm || data.isException(url, initiator))
+ return null;
+
+ if (initiator && initiator.host === "earth.google.com")
+ return null;
+
+ let redirect;
+ let link = commonHelper.getRandomInstance(mapsHelper.redirects.normal);
+ let mapCentre = "";
+ let params = "";
+ // Set map centre if present
+ if (url.pathname.match(mapsHelper.mapCentreRegex)) {
+ const [, lat, lon, zoom] = url.pathname.match(mapsHelper.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}`;
+ // Set default zoom if mapCentre not present
+ } else {
+ params = "&zoom=17";
+ }
+ // Set map layer
+ params = `${params}&layers=${mapsHelper.layers[url.searchParams.get("layer")] || mapsHelper.layers["none"]
+ }`;
+ // Handle Google Maps Embed API
+ if (url.pathname.split("/").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];
+ } catch (error) {
+ console.error(error);
+ // Unable to find map marker in URL.
+ }
+ }
+ let marker, bbox;
+ mapsHelper.addressToLatLng(query, (coords, boundingbox) => {
+ marker = coords;
+ bbox = boundingbox;
+ });
+ redirect = `${link}/export/embed.html?bbox=${bbox}&layer=mapnik&marker=${marker}`;
+ // Handle Google Maps Directions
+ } else if (url.pathname.split("/").includes("dir")) {
+ const travelMode = mapsHelper.travelModes[url.searchParams.get("travelmode")] || mapsHelper.travelModes["driving"];
+ let origin;
+ mapsHelper.addressToLatLng(url.searchParams.get("origin"), (coords) => origin = coords);
+ let destination;
+ mapsHelper.addressToLatLng(url.searchParams.get("destination"), (coords) => destination = coords);
+ redirect = `${link}/directions?engine=${travelMode}&route=${origin}%3B${destination}${mapCentre}${params}`;
+ // Get marker from data attribute
+ } else if (
+ url.pathname.includes("data=") &&
+ url.pathname.match(mapsHelper.dataLatLngRegex)
+ ) {
+ const [mlat, mlon] = url.pathname.match(mapsHelper.dataLatLngRegex);
+ redirect = `${link}/?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(",");
+ redirect = `${link}/?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(",");
+ redirect = `${link}/?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");
+ else if (url.pathname.match(mapsHelper.placeRegex)) query = url.pathname.match(mapsHelper.placeRegex)[1];
+
+ redirect = `${link}/${query ? "search?query=" + query : ""}${mapCentre || "#"}${params}`;
+ }
+ return redirect;
+}
+
export default {
targets,
redirects,
@@ -49,4 +146,9 @@ export default {
travelModes,
layers,
addressToLatLng,
+ getDisableOsm,
+ setDisableOsm,
+ getOsmInstance,
+ setOsmInstance,
+ redirectGoogleMaps,
};
diff --git a/src/assets/javascripts/helpers/google-search.js b/src/assets/javascripts/helpers/google-search.js
index fa38df10..a17843b7 100644
--- a/src/assets/javascripts/helpers/google-search.js
+++ b/src/assets/javascripts/helpers/google-search.js
@@ -4,14 +4,8 @@ const targets = [
/https?:\/\/(((www|maps)\.)?(google\.).*(\/search)|search\.(google\.).*)/
];
const redirects = {
- "searx":
- [
- "https://3afisqjw2rxm6z7mmstyt5rx75qfqrgxnkzftknbp2vhipr2nrmrjdyd.onion",
- "https://ransack.i2p",
- "https://mqamk4cfykdvhw5kjez2gnvse56gmnqxn7vkvvbuor4k4j2lbbnq.b32.i2p",
- "https://searxbgetrkiwxhdwi6svpgh7eotopqyxhbqiokrwzg7dcte44t36kyd.onion",
- "https://suche.xyzco456vwisukfg.onion",
- "https://w5rl6wsd7mzj4bdkbuqvzidet5osdsm5jhg2f7nvfidakfq5exda5wid.onion",
+ "searx": {
+ "normal": [
"https://a.searx.space",
"https://anon.sx",
"https://beezboo.com",
@@ -22,7 +16,6 @@ const redirects = {
"https://metasearch.nl",
"https://nibblehole.com",
"https://northboot.xyz",
- "https://4n53nafyi77iplnbrpmxnp3x4exbswwxigujaxy3b37fvr7bvlopxeyd.onion",
"https://paulgo.io",
"https://procurx.pt",
"https://putin.agency",
@@ -32,7 +25,6 @@ const redirects = {
"https://search.activemail.de",
"https://search.anonymize.com",
"https://search.antonkling.se",
- "https://z34ambyi6makk6ta7ksog2sljly2ctt2sa3apekb7wkllk72sxecdtad.onion",
"https://search.asynchronousexchange.com",
"https://search.biboumail.fr",
"https://search.blou.xyz",
@@ -43,28 +35,22 @@ const redirects = {
"https://search.jigsaw-security.com",
"https://search.jpope.org",
"https://search.mdosch.de",
- "https://search.4bkxscubgtxwvhpe.onion",
"https://search.ononoki.org",
"https://search.snopyta.org",
- "https://juy4e6eicawzdrz7.onion",
"https://search.st8.at",
"https://search.stinpriza.org",
- "https://z5vawdol25vrmorm4yydmohsd4u6rdoj2sylvoi3e3nqvxkvpqul7bqd.onion",
"https://search.trom.tf",
"https://search.zdechov.net",
"https://searx.bar",
"https://searx.be",
"https://searx.bissisoft.com",
- "https://zbuc3bbzbfdqqo2x46repx2ddajbha6fpsjeeptjhhhhzji3zopxdqyd.onion",
"https://searx.divided-by-zero.eu",
- "https://f4qfqajszpx5b7itzxt6mb7kj4ktpgbdq7lq6xaiqyqx6a7de3epptad.onion",
"https://searx.dresden.network",
"https://searx.esmailelbob.xyz",
"https://searx.everdot.org",
"https://searx.feneas.org",
"https://searx.fmac.xyz",
"https://searx.fossencdi.org",
- "https://searx.cwuzdtzlubq5uual.onion",
"https://searx.gnous.eu",
"https://searx.gnu.style",
"https://searx.hardwired.link",
@@ -82,7 +68,6 @@ const redirects = {
"https://searx.operationtulip.com",
"https://searx.org",
"https://searx.prvcy.eu",
- "https://rq2w52kyrif3xpfihkgjnhqm3a5aqhoikpv72z3drpjglfzc2wr5z4yd.onion",
"https://searx.pwoss.org",
"https://searx.rasp.fr",
"https://searx.roughs.ru",
@@ -99,7 +84,6 @@ const redirects = {
"https://searx.theanonymouse.xyz",
"https://searx.thegreenwebfoundation.org",
"https://searx.tiekoetter.com",
- "https://searx3aolosaf3urwnhpynlhuokqsgz47si4pzz5hvb7uuzyjncl2tid.onion",
"https://searx.tk",
"https://searx.tux.land",
"https://searx.tuxcloud.net",
@@ -107,7 +91,6 @@ const redirects = {
"https://searx.vitanetworks.link",
"https://searx.webheberg.info",
"https://searx.xkek.net",
- "https://searx.bsbvtqi5oq2cqzn32zt4cr2f2z2rwots3dq7gmdcnlyqoxko2wx6reqd.onion",
"https://searx.xyz",
"https://searx.zackptg5.com",
"https://searx.zapashcanon.fr",
@@ -130,8 +113,30 @@ const redirects = {
"https://xeek.com",
"searx.roflcopter.fr"
],
- "whoogle":
- [
+ "onion": [
+ "https://3afisqjw2rxm6z7mmstyt5rx75qfqrgxnkzftknbp2vhipr2nrmrjdyd.onion",
+ "https://searxbgetrkiwxhdwi6svpgh7eotopqyxhbqiokrwzg7dcte44t36kyd.onion",
+ "https://suche.xyzco456vwisukfg.onion",
+ "https://w5rl6wsd7mzj4bdkbuqvzidet5osdsm5jhg2f7nvfidakfq5exda5wid.onion",
+ "https://4n53nafyi77iplnbrpmxnp3x4exbswwxigujaxy3b37fvr7bvlopxeyd.onion",
+ "https://z34ambyi6makk6ta7ksog2sljly2ctt2sa3apekb7wkllk72sxecdtad.onion",
+ "https://search.4bkxscubgtxwvhpe.onion",
+ "https://juy4e6eicawzdrz7.onion",
+ "https://z5vawdol25vrmorm4yydmohsd4u6rdoj2sylvoi3e3nqvxkvpqul7bqd.onion",
+ "https://zbuc3bbzbfdqqo2x46repx2ddajbha6fpsjeeptjhhhhzji3zopxdqyd.onion",
+ "https://f4qfqajszpx5b7itzxt6mb7kj4ktpgbdq7lq6xaiqyqx6a7de3epptad.onion",
+ "https://searx.cwuzdtzlubq5uual.onion",
+ "https://rq2w52kyrif3xpfihkgjnhqm3a5aqhoikpv72z3drpjglfzc2wr5z4yd.onion",
+ "https://searx3aolosaf3urwnhpynlhuokqsgz47si4pzz5hvb7uuzyjncl2tid.onion",
+ "https://searx.bsbvtqi5oq2cqzn32zt4cr2f2z2rwots3dq7gmdcnlyqoxko2wx6reqd.onion",
+ ],
+ "i2p": [
+ "https://ransack.i2p",
+ "https://mqamk4cfykdvhw5kjez2gnvse56gmnqxn7vkvvbuor4k4j2lbbnq.b32.i2p",
+ ]
+ },
+ "whoogle": {
+ "normal": [
"https://s.alefvanoon.xyz",
"https://search.albony.xyz",
"https://search.exonip.de",
@@ -142,9 +147,63 @@ const redirects = {
"https://www.whooglesearch.ml",
"https://whoogle.dcs0.hu",
]
+ }
+};
+
+
+let disableSearch;
+const getDisableSearch = () => disableSearch;
+function setDisableSearch(val) {
+ disableSearch = val;
+ browser.storage.sync.set({ disableSearch })
+}
+
+let searchInstance;
+const getSearchInstance = () => searchInstance;
+function setSearchInstance(val) {
+ searchInstance = val;
+ browser.storage.sync.set({ searchInstance })
};
+let searchFrontend;
+const getSearchFrontend = () => searchFrontend;
+function setSearchFrontend(val) {
+ searchFrontend = val;
+ browser.storage.sync.set({ searchFrontend })
+};
+
+function redirect(url, initiator) {
+ console.info("searchFrontend:", searchFrontend)
+ if (disableSearch || data.isException(url, initiator)) {
+ return null;
+ }
+
+ let instance;
+ let path;
+ if (searchFrontend == 'searx') {
+ instance = commonHelper.getRandomInstance(searchHelper.redirects.searx.normal);
+ path = "/"
+ }
+ if (searchFrontend == 'whoogle') {
+ instance = commonHelper.getRandomInstance(searchHelper.redirects.whoogle.normal);
+ path = "/search"
+ }
+
+ let searchQuery = "";
+ url.search.slice(1).split("&").forEach(function (input) {
+ if (input.startsWith("q=")) searchQuery = input;
+ });
+ return `${instance}${path}?${searchQuery}`;
+}
+
export default {
targets,
redirects,
+ getDisableSearch,
+ setDisableSearch,
+ getSearchInstance,
+ setSearchInstance,
+ getSearchFrontend,
+ setSearchFrontend,
+ redirect,
};
diff --git a/src/assets/javascripts/helpers/google-translate.js b/src/assets/javascripts/helpers/google-translate.js
index 04501f9b..9560602d 100644
--- a/src/assets/javascripts/helpers/google-translate.js
+++ b/src/assets/javascripts/helpers/google-translate.js
@@ -3,20 +3,47 @@ const targets = [
"translate.google.no"
];
-const redirects = [
- "https://translate.metalune.xyz",
- "https://simplytranslate.org",
- "https://st.alefvanoon.xyz",
- "https://translate.josias.dev",
- "https://translate.namazso.eu",
- "https://translate.riverside.rocks",
- "https://manerakai.asuscomm.com:447",
- "https://translate.bus-hit.me"
-];
+const redirects = {
+ "normal": [
+ "https://translate.metalune.xyz",
+ "https://simplytranslate.org",
+ "https://st.alefvanoon.xyz",
+ "https://translate.josias.dev",
+ "https://translate.namazso.eu",
+ "https://translate.riverside.rocks",
+ "https://manerakai.asuscomm.com:447",
+ "https://translate.bus-hit.me"
+ ]
+};
+
+let disableSimplyTranslate;
+const getDisableSimplyTranslate = () => disableSimplyTranslate;
+function setDisableSimplyTranslate(val) {
+ disableSimplyTranslate = val;
+ browser.storage.sync.set({ disableSimplyTranslate })
+}
+
+let simplyTranslateInstance;
+const getSimplyTranslateInstance = () => simplyTranslateInstance;
+function setSimplyTranslateInstance(val) {
+ simplyTranslateInstance = val;
+ browser.storage.sync.set({ simplyTranslateInstance })
+};
+
+function redirectGoogleTranslate(url, initiator) {
+ if (disableSimplyTranslate || isException(url, initiator)) return null;
+
+ return `${simplyTranslateInstance}/${url.search}`;
+}
export default {
targets,
redirects,
+ getDisableSimplyTranslate,
+ setDisableSimplyTranslate,
+ getSimplyTranslateInstance,
+ setSimplyTranslateInstance,
+ redirectGoogleTranslate,
};
diff --git a/src/assets/javascripts/helpers/instagram.js b/src/assets/javascripts/helpers/instagram.js
index 77596035..1d7f8890 100644
--- a/src/assets/javascripts/helpers/instagram.js
+++ b/src/assets/javascripts/helpers/instagram.js
@@ -4,16 +4,18 @@ const targets = [
"help.instagram.com",
"about.instagram.com",
];
-const redirects = [
- "https://bibliogram.art",
- "https://bibliogram.snopyta.org",
- "https://bibliogram.pussthecat.org",
- "https://bibliogram.nixnet.services",
- "https://bibliogram.ethibox.fr",
- "https://bibliogram.hamster.dance",
- "https://insta.trom.tf",
- "https://bib.actionsack.com"
-];
+const redirects = {
+ "normal": [
+ "https://bibliogram.art",
+ "https://bibliogram.snopyta.org",
+ "https://bibliogram.pussthecat.org",
+ "https://bibliogram.nixnet.services",
+ "https://bibliogram.ethibox.fr",
+ "https://bibliogram.hamster.dance",
+ "https://insta.trom.tf",
+ "https://bib.actionsack.com"
+ ],
+};
const reservedPaths = [
"about",
"explore",
@@ -41,9 +43,60 @@ const reservedPaths = [
];
const bypassPaths = /\/(accounts\/|embeds?.js)/;
+let disableBibliogram;
+const getDisableBibliogram = () => disableBibliogram;
+function setDisableBibliogram(val) {
+ disableBibliogram = val;
+ browser.storage.sync.set({ disableBibliogram })
+}
+
+let bibliogramInstance;
+const getBibliogramInstance = () => bibliogramInstance;
+function setBibliogramInstance(val) {
+ bibliogramInstance = val;
+ browser.storage.sync.set({ bibliogramInstance })
+};
+
+
+function redirect(url, initiator, type) {
+ if (data.disableBibliogram || data.isException(url, initiator))
+ return null;
+
+ // Do not redirect Bibliogram view on Instagram links
+ if (
+ initiator &&
+ (
+ initiator.origin === data.bibliogramInstance ||
+ instagramHelper.redirects.normal.includes(initiator.origin) ||
+ instagramHelper.targets.includes(initiator.host)
+ )
+ )
+ return null;
+
+ // Do not redirect /accounts, /embeds.js, or anything other than main_frame
+ if (type !== "main_frame" || url.pathname.match(instagramHelper.bypassPaths))
+ return null;
+
+ let link = commonHelper.getRandomInstance(instagramHelper.redirects.normal);
+ if (
+ url.pathname === "/" ||
+ data.instagramReservedPaths.includes(url.pathname.split("/")[1])
+ )
+ return `${link}${url.pathname}${url.search}`;
+ else
+ // Likely a user profile, redirect to '/u/...'
+ return `${link}/u${url.pathname}${url.search}`;
+}
+
+
export default {
targets,
redirects,
reservedPaths,
bypassPaths,
+ getDisableBibliogram,
+ setDisableBibliogram,
+ getBibliogramInstance,
+ setBibliogramInstance,
+ redirect,
};
diff --git a/src/assets/javascripts/helpers/medium.js b/src/assets/javascripts/helpers/medium.js
index e62a6549..6bb6cd31 100644
--- a/src/assets/javascripts/helpers/medium.js
+++ b/src/assets/javascripts/helpers/medium.js
@@ -1,3 +1,5 @@
+import data from "../data.js";
+
const targets = [
// /(.*\.medium\.com)?(?(1)|^medium\.com)/,
/^medium.com/,
@@ -14,12 +16,56 @@ const targets = [
/blog.coinbase.com/
];
-const redirects = [
- "https://scribe.rip",
- "https://scribe.nixnet.services"
-];
+const redirects = {
+ "normal": [
+ "https://scribe.rip",
+ "https://scribe.nixnet.services"
+ ]
+};
+
+let disableScribe;
+const getDisableScribe = () => disableScribe;
+function setDisableScribe(val) {
+ disableScribe = val;
+ browser.storage.sync.set({ disableScribe })
+}
+
+
+let scribeInstance;
+const getScribeInstance = () => scribeInstance;
+function setScribeInstance(val) {
+ scribeInstance = val;
+ browser.storage.sync.set({ scribeInstance })
+};
+
+
+function redirectMedium(url, initiator) {
+ if (disableScribe || data.isException(url, initiator)) return null;
+
+ if (url.pathname == "/") return null;
+
+ if (
+ data.isFirefox() &&
+ initiator &&
+ (
+ initiator.origin === scribeInstance ||
+ mediumHelper.redirects.normal.includes(initiator.origin) ||
+ mediumHelper.targets.includes(initiator.host)
+ )
+ ) {
+ browser.storage.sync.set({ redirectBypassFlag: true });
+ return null;
+ }
+ return `${commonHelper.getRandomInstance(mediumHelper.redirects.normal)}${url.pathname}${url.search}`;
+}
+
export default {
targets,
redirects,
+ getDisableScribe,
+ setDisableScribe,
+ getScribeInstance,
+ setScribeInstance,
+ redirectMedium,
};
diff --git a/src/assets/javascripts/helpers/reddit.js b/src/assets/javascripts/helpers/reddit.js
index 681afa1d..deca2c80 100644
--- a/src/assets/javascripts/helpers/reddit.js
+++ b/src/assets/javascripts/helpers/reddit.js
@@ -8,45 +8,119 @@ const targets = [
];
const redirects = {
// modern UI
- "libreddit": [
- "https://libredd.it",
- "https://libreddit.spike.codes",
- "https://libreddit.kavin.rocks",
- "https://libreddit.insanity.wtf",
- "https://libreddit.dothq.co",
- "https://libreddit.silkky.cloud",
- "https://libreddit.himiko.cloud",
- "https://reddit.artemislena.eu",
- "https://reddit.git-bruh.duckdns.org",
- ],
+ "libreddit": {
+ "normal": [
+ "https://libredd.it",
+ "https://libreddit.spike.codes",
+ "https://libreddit.kavin.rocks",
+ "https://libreddit.insanity.wtf",
+ "https://libreddit.dothq.co",
+ "https://libreddit.silkky.cloud",
+ "https://libreddit.himiko.cloud",
+ "https://reddit.artemislena.eu",
+ "https://reddit.git-bruh.duckdns.org",
+ ]
+ },
// old UI
- "teddit": [
- "https://teddit.net",
- "https://teddit.ggc-project.de",
- "https://teddit.kavin.rocks",
- "https://teddit.zaggy.nl",
- "https://teddit.namazso.eu",
- "https://teddit.nautolan.racing",
- "https://teddit.tinfoil-hat.net",
- "https://teddit.domain.glass",
- "https://snoo.ioens.is",
- "https://teddit.httpjames.space",
- "https://teddit.alefvanoon.xyz",
- "https://incogsnoo.com",
- "https://teddit.pussthecat.org",
- "https://reddit.lol",
- "https://teddit.sethforprivacy.com",
- "https://teddit.totaldarkness.net",
- "https://teddit.adminforge.de",
- "https://teddit.bus-hit.me"
- ],
+ "teddit": {
+
+ "normal": [
+ "https://teddit.net",
+ "https://teddit.ggc-project.de",
+ "https://teddit.kavin.rocks",
+ "https://teddit.zaggy.nl",
+ "https://teddit.namazso.eu",
+ "https://teddit.nautolan.racing",
+ "https://teddit.tinfoil-hat.net",
+ "https://teddit.domain.glass",
+ "https://snoo.ioens.is",
+ "https://teddit.httpjames.space",
+ "https://teddit.alefvanoon.xyz",
+ "https://incogsnoo.com",
+ "https://teddit.pussthecat.org",
+ "https://reddit.lol",
+ "https://teddit.sethforprivacy.com",
+ "https://teddit.totaldarkness.net",
+ "https://teddit.adminforge.de",
+ "https://teddit.bus-hit.me"
+ ],
+ },
"desktop": "https://old.reddit.com", // desktop
"mobile": "https://i.reddit.com", // mobile
};
const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/;
+let disableReddit;
+const getDisableReddit = () => disableReddit;
+function setDisableReddit(val) {
+ disableReddit = val;
+ browser.storage.sync.set({ disableReddit })
+}
+let redditInstance;
+const getRedditInstance = () => redditInstance;
+function setRedditInstance(val) {
+ redditInstance = val;
+ browser.storage.sync.set({ redditInstance })
+};
+
+let redditFrontend;
+const getRedditFrontend = () => redditFrontend;
+function setRedditFrontend(val) {
+ redditFrontend = val;
+ browser.storage.sync.set({ redditFrontend })
+};
+
+
+function redirect(url, initiator, type) {
+
+ if (disableReddit || data.isException(url, initiator))
+ return null;
+
+ // Do not redirect when already on the selected view
+ if ((initiator && initiator.origin === redditInstance) || url.origin === redditInstance)
+ return null;
+
+
+ // Do not redirect exclusions nor anything other than main_frame
+ if (type !== "main_frame" || url.pathname.match(redditHelper.bypassPaths))
+ return null;
+
+ let libredditLink = commonHelper.getRandomInstance(redditHelper.redirects.libreddit.normal);
+ let tedditLink = commonHelper.getRandomInstance(redditHelper.redirects.teddit.normal);
+
+ if (url.host === "i.redd.it")
+ // As of 2021-04-09, redirects for teddit images are nontrivial:
+ // - navigating to the image before ever navigating to its page causes
+ // 404 error (probably needs fix on teddit project)
+ // - some image links on teddit are very different
+ // Therefore, don't support redirecting image links for teddit.
+ return `${libredditLink}/img${url.pathname}${url.search}`;
+ else if (url.host === "redd.it") {
+ if (redditFrontend == 'libreddit') return `${libredditLink}${url.pathname}${url.search}`;
+ if (redditFrontend == 'teddit' && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/))
+ // As of 2021-04-22, redirects for teddit redd.it/foo links don't work.
+ // It appears that adding "/comments" as a prefix works, so manually add
+ // that prefix if it is missing. Even though redd.it/comments/foo links
+ // don't seem to work or exist, guard against affecting those kinds of
+ // paths.
+ // Note the difference between redd.it/comments/foo (doesn't work) and
+ // teddit.net/comments/foo (works).
+ return `${tedditLink}/comments${url.pathname}${url.search}`;
+ }
+ if (redditFrontend == 'libreddit') return `${libredditLink}${url.pathname}${url.search}`;
+ if (redditFrontend == 'teddit') return `${tedditLink}${url.pathname}${url.search}`;
+}
+
+
export default {
targets,
redirects,
bypassPaths,
+ getDisableReddit,
+ setDisableReddit,
+ getRedditInstance,
+ setRedditInstance,
+ getRedditFrontend,
+ setRedditFrontend,
+ redirect,
};
diff --git a/src/assets/javascripts/helpers/twitter.js b/src/assets/javascripts/helpers/twitter.js
index f520d76f..4fdad605 100644
--- a/src/assets/javascripts/helpers/twitter.js
+++ b/src/assets/javascripts/helpers/twitter.js
@@ -1,3 +1,4 @@
+import data from "../data.js";
/*
Please remember to also update the src/manifest.json file
(content_scripts > matches, 'remove-twitter-sw.js')
@@ -15,30 +16,86 @@ const targets = [
src/assets/javascripts/remove-twitter-sw.js file
(const nitterInstances) when updating this list:
*/
-const redirects = [
- "https://nitter.net",
- "https://nitter.snopyta.org",
- "https://nitter.42l.fr",
- "https://nitter.nixnet.services",
- "https://nitter.pussthecat.org",
- "https://nitter.dark.fail",
- "https://nitter.tedomum.net",
- "https://nitter.cattube.org",
- "https://nitter.fdn.fr",
- "https://nitter.1d4.us",
- "https://nitter.kavin.rocks",
- "https://tweet.lambda.dance",
- "https://nitter.cc",
- "https://nitter.vxempire.xyz",
- "https://nitter.unixfox.eu",
- "https://bird.trom.tf",
- "http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion",
- "http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion",
- "http://nitterlgj3n5fgwesu3vxc5h67ruku33nqaoeoocae2mvlzhsu6k7fqd.onion",
- "http://npf37k3mtzwxreiw52ccs5ay4e6qt2fkcs2ndieurdyn2cuzzsfyfvid.onion",
-];
+const redirects = {
+ "normal": [
+ "https://nitter.net",
+ "https://nitter.snopyta.org",
+ "https://nitter.42l.fr",
+ "https://nitter.nixnet.services",
+ "https://nitter.pussthecat.org",
+ "https://nitter.dark.fail",
+ "https://nitter.tedomum.net",
+ "https://nitter.cattube.org",
+ "https://nitter.fdn.fr",
+ "https://nitter.1d4.us",
+ "https://nitter.kavin.rocks",
+ "https://tweet.lambda.dance",
+ "https://nitter.cc",
+ "https://nitter.vxempire.xyz",
+ "https://nitter.unixfox.eu",
+ "https://bird.trom.tf",
+ ],
+ "onion": [
+ "http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion",
+ "http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion",
+ "http://nitterlgj3n5fgwesu3vxc5h67ruku33nqaoeoocae2mvlzhsu6k7fqd.onion",
+ "http://npf37k3mtzwxreiw52ccs5ay4e6qt2fkcs2ndieurdyn2cuzzsfyfvid.onion",
+ ]
+};
+
+let disableNitter;
+const getDisableNitter = () => disableNitter;
+function setDisableNitter(val) {
+ disableNitter = val;
+ browser.storage.sync.set({ disableNitter })
+}
+
+let nitterInstance;
+const getNitterInstance = () => nitterInstance;
+function setNitterInstance(val) {
+ nitterInstance = val;
+ browser.storage.sync.set({ nitterInstance })
+}
+
+
+function redirect(url, initiator) {
+ if (disableNitter || data.isException(url, initiator))
+ return null;
+
+ if (url.pathname.split("/").includes("home")) {
+ return null;
+ }
+ if (
+ data.isFirefox() &&
+ initiator &&
+ (
+ initiator.origin === nitterInstance ||
+ twitterHelper.redirects.normal.includes(initiator.origin) ||
+ twitterHelper.targets.includes(initiator.host)
+ )
+ ) {
+ browser.storage.sync.set({ redirectBypassFlag: true });
+ return null;
+ }
+ let link = commonHelper.getRandomInstance(twitterHelper.redirects.normal)
+ if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video")
+ return `${link}/pic/${encodeURIComponent(url.href)}`;
+
+ else if (url.pathname.split("/").includes("tweets"))
+ return `${link}${url.pathname.replace("/tweets", "")}${url.search}`;
+
+ else
+ return `${link}${url.pathname}${url.search}`;
+
+}
+
export default {
targets,
redirects,
+ getDisableNitter,
+ setDisableNitter,
+ getNitterInstance,
+ setNitterInstance,
+ redirect,
};
diff --git a/src/assets/javascripts/helpers/wikipedia.js b/src/assets/javascripts/helpers/wikipedia.js
index 28006614..00a8a4cc 100644
--- a/src/assets/javascripts/helpers/wikipedia.js
+++ b/src/assets/javascripts/helpers/wikipedia.js
@@ -1,8 +1,65 @@
const targets = /wikipedia.org/;
-const redirects = ["https://wikiless.org"];
+const redirects = {
+ "normal": [
+ "https://wikiless.org"
+ ]
+};
+
+let disableWikipedia;
+function setDisableWikipedia(val) {
+ disableWikipedia = val;
+ browser.storage.sync.set({ disableWikipedia })
+}
+const getDisableWikipedia = () => disableWikipedia;
+
+let wikipediaInstance;
+function setWikipediaInstance(val) {
+ wikipediaInstance = val;
+ browser.storage.sync.set({ wikipediaInstance })
+};
+const getWikipediaInstance = () => wikipediaInstance;
+
+function redirectWikipedia(url, initiator) {
+ if (disableWikipedia || data.isException(url, initiator)) return null;
+
+ let GETArguments = [];
+ if (url.search.length > 0) {
+ let search = url.search.substring(1); //get rid of '?'
+ let argstrings = search.split("&");
+ for (let i = 0; i < argstrings.length; i++) {
+ let args = argstrings[i].split("=");
+ GETArguments.push([args[0], args[1]]);
+ }
+ }
+ let link = `${wikipediaInstance}${url.pathname}`;
+ let urlSplit = url.host.split(".");
+ if (urlSplit[0] != "wikipedia" && urlSplit[0] != "www") {
+ if (urlSplit[0] == "m")
+ GETArguments.push(["mobileaction", "toggle_view_mobile"]);
+ else GETArguments.push(["lang", urlSplit[0]]);
+ if (urlSplit[1] == "m")
+ GETArguments.push(["mobileaction", "toggle_view_mobile"]);
+ //wikiless doesn't have mobile view support yet
+ }
+ for (let i = 0; i < GETArguments.length; i++)
+ link += (i == 0 ? "?" : "&") + GETArguments[i][0] + "=" + GETArguments[i][1];
+
+ if (
+ urlSplit[urlSplit.length - 1] == "org" &&
+ urlSplit[urlSplit.length - 2] == "wikipedia"
+ )
+ //just in case someone wanted to visit wikipedia.org.foo.bar.net
+ return link;
+ else return null;
+}
export default {
+ setDisableWikipedia,
+ getDisableWikipedia,
+ setWikipediaInstance,
+ getWikipediaInstance,
+ redirectWikipedia,
targets,
redirects,
};
diff --git a/src/assets/javascripts/helpers/youtube.js b/src/assets/javascripts/helpers/youtube.js
index df6dda4c..c55dda5b 100644
--- a/src/assets/javascripts/helpers/youtube.js
+++ b/src/assets/javascripts/helpers/youtube.js
@@ -1,3 +1,7 @@
+"use strict";
+
+window.browser = window.browser || window.chrome;
+
const targets = [
"m.youtube.com",
"youtube.com",
@@ -14,33 +18,278 @@ const targets = [
(content_scripts > matches, 'persist-invidious-prefs.js')
when updating this list:
*/
-const redirects = [
- "https://invidious.snopyta.org",
- "https://invidious.xyz",
- "https://invidious.kavin.rocks",
- "https://tube.connect.cafe",
- "https://invidious.zapashcanon.fr",
- "https://invidiou.site",
- "https://vid.mint.lgbt",
- "https://invidious.site",
- "https://yewtu.be",
- "https://invidious.tube",
- "https://invidious.silkky.cloud",
- "https://invidious.himiko.cloud",
- "https://inv.skyn3t.in",
- "https://tube.incognet.io",
- "https://invidious.tinfoil-hat.net",
- "https://invidious.namazso.eu",
- "https://vid.puffyan.us",
- "https://dev.viewtube.io",
- "https://invidious.048596.xyz",
- "http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion",
- "http://qklhadlycap4cnod.onion",
- "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion",
- "http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion",
-];
+const redirects = {
+ "normal": [
+ "https://invidious.snopyta.org",
+ "https://invidious.xyz",
+ "https://invidious.kavin.rocks",
+ "https://tube.connect.cafe",
+ "https://invidious.zapashcanon.fr",
+ "https://invidiou.site",
+ "https://vid.mint.lgbt",
+ "https://invidious.site",
+ "https://yewtu.be",
+ "https://invidious.tube",
+ "https://invidious.silkky.cloud",
+ "https://invidious.himiko.cloud",
+ "https://inv.skyn3t.in",
+ "https://tube.incognet.io",
+ "https://invidious.tinfoil-hat.net",
+ "https://invidious.namazso.eu",
+ "https://vid.puffyan.us",
+ "https://dev.viewtube.io",
+ "https://invidious.048596.xyz",
+ ],
+ "onion": [
+ "http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion",
+ "http://qklhadlycap4cnod.onion",
+ "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion",
+ "http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion",
+ ]
+};
+
+let disableInvidious;
+const getDisableInvidious = () => disableInvidious;
+function setDisableInvidious(val) {
+ disableInvidious = val;
+ browser.storage.sync.set({ disableInvidious })
+ console.log("disableInvidious: ", disableInvidious)
+}
+
+let invidiousInstance;
+const getInvidiousInstance = () => invidiousInstance;
+function setInvidiousInstance(val) {
+ invidiousInstance = val;
+ browser.storage.sync.set({ invidiousInstance })
+ console.log("invidiousInstance: ", invidiousInstance)
+}
+
+let invidiousAlwaysProxy;
+function setInvidiousAlwaysProxy(val) {
+ invidiousAlwaysProxy = val;
+ browser.storage.sync.set({ invidiousAlwaysProxy })
+ console.log("invidiousAlwaysProxy: ", invidiousAlwaysProxy);
+}
+const getInvidiousAlwaysProxy = () => invidiousAlwaysProxy;
+
+let invidiousOnlyEmbeddedVideo;
+function setInvidiousOnlyEmbeddedVideo(val) {
+ invidiousOnlyEmbeddedVideo = val;
+ browser.storage.sync.set({ invidiousOnlyEmbeddedVideo })
+ console.log("invidiousOnlyEmbeddedVideo: ", invidiousOnlyEmbeddedVideo)
+}
+const getInvidiousOnlyEmbeddedVideo = () => invidiousOnlyEmbeddedVideo;
+
+let invidiousVideoQuality;
+function setInvidiousVideoQuality(val) {
+ invidiousVideoQuality = val;
+ browser.storage.sync.set({ invidiousVideoQuality })
+ console.log("invidiousVideoQuality: ", invidiousVideoQuality)
+}
+const getInvidiousVideoQuality = () => invidiousVideoQuality;
+
+let invidiousDarkMode;
+const getInvidiousDarkMode = () => invidiousDarkMode;
+function setInvidiousDarkMode(val) {
+ invidiousDarkMode = val;
+ browser.storage.sync.set({ invidiousDarkMode })
+ console.log("invidiousDarkMode: ", invidiousDarkMode)
+}
+
+let invidiousVolume;
+const getInvidiousVolume = () => invidiousVolume;
+function setInvidiousVolume(val) {
+ invidiousVolume = val;
+ browser.storage.sync.set({ invidiousVolume })
+ console.log("invidiousVolume: ", invidiousVolume)
+}
+
+
+let invidiousPlayerStyle;
+const getInvidiousPlayerStyle = () => invidiousPlayerStyle;
+function setInvidiousPlayerStyle(val) {
+ invidiousPlayerStyle = val;
+ browser.storage.sync.set({ invidiousPlayerStyle })
+ console.log("invidiousPlayerStyle: ", invidiousPlayerStyle)
+}
+
+let invidiousSubtitles;
+function setInvidiousSubtitles(val) {
+ invidiousSubtitles = val;
+ browser.storage.sync.set({ invidiousSubtitles })
+ console.log("invidiousSubtitles: ", invidiousSubtitles)
+}
+let getInvidiousSubtitles = () => invidiousSubtitles;
+
+let invidiousAutoplay;
+function setInvidiousAutoplay(val) {
+ invidiousAutoplay = val;
+ browser.storage.sync.set({ invidiousAutoplay })
+ console.log("invidiousAutoplay: ", invidiousAutoplay)
+}
+const getInvidiousAutoplay = () => invidiousAutoplay;
+
+let useFreeTube;
+function setUseFreeTube(val) {
+ useFreeTube = val;
+ browser.storage.sync.set({ useFreeTube })
+ console.log("useFreeTube: ", useFreeTube)
+}
+const getUseFreeTube = () => useFreeTube;
+
+
+let persistInvidiousPrefs;
+function setPersistInvidiousPrefs(val) {
+ persistInvidiousPrefs = val;
+ browser.storage.sync.set({ persistInvidiousPrefs })
+ console.log("persistInvidiousPrefs: ", persistInvidiousPrefs)
+ if (persistInvidiousPrefs) initInvidiousCookie()
+}
+const getPersistInvidiousPrefs = () => persistInvidiousPrefs;
+
+function redirect(url, initiator, type) {
+ if (disableInvidious || data.isException(url, initiator))
+ return null;
+
+ if (
+ initiator &&
+ (
+ initiator.origin === invidiousInstance ||
+ youtubeHelper.redirects.normal.includes(initiator.origin) ||
+ youtubeHelper.targets.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")
+ // Avoid redirecting `studio.youtube.com`
+ return null;
+
+ if (invidiousOnlyEmbeddedVideo && type !== "sub_frame")
+ return null;
+
+ if (useFreeTube && type === "main_frame")
+ return `freetube://${url}`;
+
+ // Apply settings
+ if (invidiousAlwaysProxy) url.searchParams.append("local", true);
+
+ if (invidiousVideoQuality) url.searchParams.append("quality", invidiousVideoQuality);
+
+ if (invidiousDarkMode) url.searchParams.append("dark_mode", invidiousDarkMode);
+
+ if (invidiousVolume) url.searchParams.append("volume", invidiousVolume);
+
+ if (invidiousPlayerStyle) url.searchParams.append("player_style", invidiousPlayerStyle);
+
+ if (invidiousSubtitles) url.searchParams.append("subtitles", invidiousSubtitles);
+
+ if (invidiousAutoplay) url.searchParams.append("autoplay", 1);
+
+ let randomInstance = commonHelper.getRandomInstance(youtubeHelper.redirects.normal)
+
+ return `${randomInstance}${url.pathname.replace("/shorts", "")}${url.search}`;
+}
+
+
+function getCookie() {
+ let ca = document.cookie.split(";");
+ for (let i = 0; i < ca.length; i++) {
+ let c = ca[i];
+ while (c.charAt(0) == " ") c = c.substring(1, c.length);
+ if (c.indexOf("PREFS=") == 0)
+ return JSON.parse(
+ decodeURIComponent(c.substring("PREFS=".length, c.length))
+ );
+ }
+ return {};
+}
+
+function initInvidiousCookie() {
+ const prefs = getCookie();
+ prefs.local = invidiousAlwaysProxy;
+ prefs.quality = invidiousVideoQuality;
+ prefs.dark_mode = invidiousDarkMode;
+ document.cookie = `PREFS=${encodeURIComponent(JSON.stringify(prefs))}`;
+}
+async function init() {
+ let result = await browser.storage.sync.get(
+ [
+ "invidiousAlwaysProxy",
+ "invidiousVideoQuality",
+ "invidiousDarkMode",
+ "persistInvidiousPrefs",
+ "disableInvidious",
+ "invidiousInstance",
+ "invidiousAlwaysProxy",
+ "invidiousOnlyEmbeddedVideo",
+ "invidiousVideoQuality",
+ "invidiousDarkMode",
+ "invidiousVolume",
+ "invidiousPlayerStyle",
+ "invidiousSubtitles",
+ "invidiousAutoplay",
+ "useFreeTube",
+ ]);
+ disableInvidious = result.disableInvidious;
+ invidiousInstance = result.invidiousInstance;
+ invidiousAlwaysProxy = result.invidiousAlwaysProxy;
+ invidiousOnlyEmbeddedVideo = result.invidiousOnlyEmbeddedVideo;
+ invidiousVideoQuality = result.invidiousVideoQuality;
+ invidiousDarkMode = result.invidiousDarkMode;
+ invidiousVolume = result.invidiousVolume;
+ invidiousPlayerStyle = result.invidiousPlayerStyle;
+ invidiousSubtitles = result.invidiousSubtitles;
+ invidiousAutoplay = result.invidiousAutoplay;
+ useFreeTube = result.useFreeTube;
+
+ if (result.persistInvidiousPrefs) initInvidiousCookie();
+}
export default {
targets,
redirects,
+ redirect,
+
+ getDisableInvidious,
+ setDisableInvidious,
+
+ setInvidiousInstance,
+ getInvidiousInstance,
+
+ setInvidiousAlwaysProxy,
+ getInvidiousAlwaysProxy,
+
+ setInvidiousOnlyEmbeddedVideo,
+ getInvidiousOnlyEmbeddedVideo,
+
+ setInvidiousVideoQuality,
+ getInvidiousVideoQuality,
+
+ setInvidiousDarkMode,
+ getInvidiousDarkMode,
+
+ setInvidiousVolume,
+ getInvidiousVolume,
+
+ setInvidiousPlayerStyle,
+ getInvidiousPlayerStyle,
+
+ setInvidiousSubtitles,
+ getInvidiousSubtitles,
+
+ setInvidiousAutoplay,
+ getInvidiousAutoplay,
+
+ getUseFreeTube,
+ setUseFreeTube,
+
+ getPersistInvidiousPrefs,
+ setPersistInvidiousPrefs,
+
+ init,
};