diff options
author | ManeraKai <manerakai@protonmail.com> | 2022-02-01 21:37:43 +0300 |
---|---|---|
committer | ManeraKai <manerakai@protonmail.com> | 2022-02-01 21:37:43 +0300 |
commit | 41c1c6effac3f6a777fce47df025e513bda6157a (patch) | |
tree | 38da025cc97986b852b734c3b051fa33ce8cf149 /src/assets | |
parent | Fixed theme issue (diff) | |
download | libredirect-41c1c6effac3f6a777fce47df025e513bda6157a.zip |
Changing data handling
Diffstat (limited to 'src/assets')
-rw-r--r-- | src/assets/javascripts/data.js | 20 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/common.js | 57 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/google-maps.js | 104 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/google-search.js | 101 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/google-translate.js | 47 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/instagram.js | 73 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/medium.js | 54 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/reddit.js | 136 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/twitter.js | 101 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/wikipedia.js | 59 | ||||
-rw-r--r-- | src/assets/javascripts/helpers/youtube.js | 299 | ||||
-rw-r--r-- | src/assets/javascripts/persist-invidious-prefs.js | 30 |
12 files changed, 904 insertions, 177 deletions
diff --git a/src/assets/javascripts/data.js b/src/assets/javascripts/data.js new file mode 100644 index 00000000..13172f79 --- /dev/null +++ b/src/assets/javascripts/data.js @@ -0,0 +1,20 @@ +"use strict"; + +let exceptions; +function setExceptions(val) { + exceptions = val; + browser.storage.sync.set({ exceptions }) +}; + +let theme; +function setTheme(val) { + theme = val; + browser.storage.sync.set({ theme }) +}; + +export default { + exceptions, + theme, + setTheme, + setExceptions, +} \ No newline at end of file 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, }; diff --git a/src/assets/javascripts/persist-invidious-prefs.js b/src/assets/javascripts/persist-invidious-prefs.js index 9e313059..e69de29b 100644 --- a/src/assets/javascripts/persist-invidious-prefs.js +++ b/src/assets/javascripts/persist-invidious-prefs.js @@ -1,30 +0,0 @@ -"use strict"; - -window.browser = window.browser || window.chrome; - -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 {}; -} - -browser.storage.sync.get( - ["invidiousAlwaysProxy", "invidiousVideoQuality", "invidiousDarkMode", "persistInvidiousPrefs"], - (result) => { - if (result.persistInvidiousPrefs) { - const prefs = getCookie(); - prefs.local = result.invidiousAlwaysProxy; - prefs.quality = result.invidiousVideoQuality; - prefs.dark_mode = result.invidiousDarkMode; - document.cookie = `PREFS=${encodeURIComponent(JSON.stringify(prefs))}`; - } - } -); |