From c5a6623e0f320b2a789e0d2667ccfe2e1bd4335f Mon Sep 17 00:00:00 2001 From: ManeraKai Date: Mon, 30 May 2022 01:02:59 +0300 Subject: Fixed settings theme and translation flashing #286 --- src/assets/javascripts/general.js | 71 ++++ src/assets/javascripts/helpers/general.js | 71 ---- src/assets/javascripts/helpers/imgur.js | 191 --------- src/assets/javascripts/helpers/instagram.js | 166 -------- src/assets/javascripts/helpers/lbry.js | 156 ------- src/assets/javascripts/helpers/maps.js | 212 ---------- src/assets/javascripts/helpers/medium.js | 174 -------- src/assets/javascripts/helpers/peertube.js | 155 ------- src/assets/javascripts/helpers/reddit.js | 378 ----------------- src/assets/javascripts/helpers/search.js | 470 --------------------- src/assets/javascripts/helpers/sendTargets.js | 149 ------- src/assets/javascripts/helpers/tiktok.js | 175 -------- .../helpers/translate/get_lingva_preferences.js | 10 - .../helpers/translate/set_lingva_preferences.js | 19 - .../javascripts/helpers/translate/translate.js | 295 ------------- src/assets/javascripts/helpers/twitter.js | 241 ----------- src/assets/javascripts/helpers/utils.js | 456 -------------------- src/assets/javascripts/helpers/wikipedia.js | 220 ---------- .../youtube/get_pipedMaterial_preferences.js | 7 - .../helpers/youtube/get_piped_preferences.js | 24 -- .../youtube/set_pipedMaterial_preferences.js | 10 - .../helpers/youtube/set_piped_preferences.js | 44 -- src/assets/javascripts/helpers/youtube/youtube.js | 453 -------------------- src/assets/javascripts/helpers/youtubeMusic.js | 97 ----- src/assets/javascripts/imgur.js | 191 +++++++++ src/assets/javascripts/instagram.js | 166 ++++++++ src/assets/javascripts/lbry.js | 156 +++++++ src/assets/javascripts/localise.js | 34 +- src/assets/javascripts/maps.js | 212 ++++++++++ src/assets/javascripts/medium.js | 174 ++++++++ src/assets/javascripts/peertube.js | 155 +++++++ src/assets/javascripts/reddit.js | 378 +++++++++++++++++ src/assets/javascripts/search.js | 470 +++++++++++++++++++++ src/assets/javascripts/sendTargets.js | 149 +++++++ src/assets/javascripts/tiktok.js | 175 ++++++++ .../translate/get_lingva_preferences.js | 10 + .../translate/set_lingva_preferences.js | 19 + src/assets/javascripts/translate/translate.js | 295 +++++++++++++ src/assets/javascripts/twitter.js | 241 +++++++++++ src/assets/javascripts/utils.js | 452 ++++++++++++++++++++ src/assets/javascripts/wikipedia.js | 220 ++++++++++ .../youtube/get_pipedMaterial_preferences.js | 7 + .../javascripts/youtube/get_piped_preferences.js | 24 ++ .../youtube/set_pipedMaterial_preferences.js | 10 + .../javascripts/youtube/set_piped_preferences.js | 44 ++ src/assets/javascripts/youtube/youtube.js | 451 ++++++++++++++++++++ src/assets/javascripts/youtubeMusic.js | 97 +++++ 47 files changed, 4180 insertions(+), 4194 deletions(-) create mode 100644 src/assets/javascripts/general.js delete mode 100644 src/assets/javascripts/helpers/general.js delete mode 100644 src/assets/javascripts/helpers/imgur.js delete mode 100644 src/assets/javascripts/helpers/instagram.js delete mode 100644 src/assets/javascripts/helpers/lbry.js delete mode 100644 src/assets/javascripts/helpers/maps.js delete mode 100644 src/assets/javascripts/helpers/medium.js delete mode 100644 src/assets/javascripts/helpers/peertube.js delete mode 100644 src/assets/javascripts/helpers/reddit.js delete mode 100644 src/assets/javascripts/helpers/search.js delete mode 100644 src/assets/javascripts/helpers/sendTargets.js delete mode 100644 src/assets/javascripts/helpers/tiktok.js delete mode 100644 src/assets/javascripts/helpers/translate/get_lingva_preferences.js delete mode 100644 src/assets/javascripts/helpers/translate/set_lingva_preferences.js delete mode 100644 src/assets/javascripts/helpers/translate/translate.js delete mode 100644 src/assets/javascripts/helpers/twitter.js delete mode 100644 src/assets/javascripts/helpers/utils.js delete mode 100644 src/assets/javascripts/helpers/wikipedia.js delete mode 100644 src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js delete mode 100644 src/assets/javascripts/helpers/youtube/get_piped_preferences.js delete mode 100644 src/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js delete mode 100644 src/assets/javascripts/helpers/youtube/set_piped_preferences.js delete mode 100644 src/assets/javascripts/helpers/youtube/youtube.js delete mode 100644 src/assets/javascripts/helpers/youtubeMusic.js create mode 100644 src/assets/javascripts/imgur.js create mode 100644 src/assets/javascripts/instagram.js create mode 100644 src/assets/javascripts/lbry.js create mode 100644 src/assets/javascripts/maps.js create mode 100644 src/assets/javascripts/medium.js create mode 100644 src/assets/javascripts/peertube.js create mode 100644 src/assets/javascripts/reddit.js create mode 100644 src/assets/javascripts/search.js create mode 100644 src/assets/javascripts/sendTargets.js create mode 100644 src/assets/javascripts/tiktok.js create mode 100644 src/assets/javascripts/translate/get_lingva_preferences.js create mode 100644 src/assets/javascripts/translate/set_lingva_preferences.js create mode 100644 src/assets/javascripts/translate/translate.js create mode 100644 src/assets/javascripts/twitter.js create mode 100644 src/assets/javascripts/utils.js create mode 100644 src/assets/javascripts/wikipedia.js create mode 100644 src/assets/javascripts/youtube/get_pipedMaterial_preferences.js create mode 100644 src/assets/javascripts/youtube/get_piped_preferences.js create mode 100644 src/assets/javascripts/youtube/set_pipedMaterial_preferences.js create mode 100644 src/assets/javascripts/youtube/set_piped_preferences.js create mode 100644 src/assets/javascripts/youtube/youtube.js create mode 100644 src/assets/javascripts/youtubeMusic.js (limited to 'src/assets/javascripts') diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js new file mode 100644 index 00000000..199d884c --- /dev/null +++ b/src/assets/javascripts/general.js @@ -0,0 +1,71 @@ +"use strict"; +window.browser = window.browser || window.chrome; + +function isException(url) { + for (const item of exceptions.url) + if (item == `${url.protocol}//${url.host}`) return true; + for (const item of exceptions.regex) + if (new RegExp(item).test(url.href)) return true; + return false; +} + +let exceptions; + +function init() { + browser.storage.local.get( + 'exceptions', + r => { + exceptions = r.exceptions; + } + ) +} + +init(); +browser.storage.onChanged.addListener(init) + +async function initDefaults() { + await browser.storage.local.set({ + exceptions: { + "url": [], + "regex": [], + }, + theme: "DEFAULT", + popupFrontends: [ + "youtube", + "twitter", + "instagram", + "tikTok", + "imgur", + "reddit", + "search", + "medium", + "translate", + "maps", + ], + autoRedirect: false, + }) +} + +const allPopupFrontends = [ + "youtube", + "youtubeMusic", + "twitter", + "instagram", + "tikTok", + "imgur", + "reddit", + "search", + "translate", + "maps", + "wikipedia", + "medium", + "peertube", + "lbry", + "sendTargets" +]; + +export default { + isException, + initDefaults, + allPopupFrontends, +} diff --git a/src/assets/javascripts/helpers/general.js b/src/assets/javascripts/helpers/general.js deleted file mode 100644 index 199d884c..00000000 --- a/src/assets/javascripts/helpers/general.js +++ /dev/null @@ -1,71 +0,0 @@ -"use strict"; -window.browser = window.browser || window.chrome; - -function isException(url) { - for (const item of exceptions.url) - if (item == `${url.protocol}//${url.host}`) return true; - for (const item of exceptions.regex) - if (new RegExp(item).test(url.href)) return true; - return false; -} - -let exceptions; - -function init() { - browser.storage.local.get( - 'exceptions', - r => { - exceptions = r.exceptions; - } - ) -} - -init(); -browser.storage.onChanged.addListener(init) - -async function initDefaults() { - await browser.storage.local.set({ - exceptions: { - "url": [], - "regex": [], - }, - theme: "DEFAULT", - popupFrontends: [ - "youtube", - "twitter", - "instagram", - "tikTok", - "imgur", - "reddit", - "search", - "medium", - "translate", - "maps", - ], - autoRedirect: false, - }) -} - -const allPopupFrontends = [ - "youtube", - "youtubeMusic", - "twitter", - "instagram", - "tikTok", - "imgur", - "reddit", - "search", - "translate", - "maps", - "wikipedia", - "medium", - "peertube", - "lbry", - "sendTargets" -]; - -export default { - isException, - initDefaults, - allPopupFrontends, -} diff --git a/src/assets/javascripts/helpers/imgur.js b/src/assets/javascripts/helpers/imgur.js deleted file mode 100644 index 9f93f362..00000000 --- a/src/assets/javascripts/helpers/imgur.js +++ /dev/null @@ -1,191 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -const targets = /^https?:\/{2}([im]\.)?imgur\.com(\/|$)/ - -let redirects = { - "rimgo": { - "normal": [], - "tor": [], - "i2p": [] - } -} -function setRedirects() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.rimgo = dataJson.rimgo; - - rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]; - rimgoTorRedirectsChecks = [...redirects.rimgo.tor]; - rimgoI2pRedirectsChecks = [...redirects.rimgo.i2p]; - - for (const instance of r.cloudflareList) { - const a = rimgoNormalRedirectsChecks.indexOf(instance); - if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1); - - const b = rimgoTorRedirectsChecks.indexOf(instance); - if (b > -1) rimgoTorRedirectsChecks.splice(b, 1); - - const c = rimgoI2pRedirectsChecks.indexOf(instance); - if (c > -1) rimgoI2pRedirectsChecks.splice(c, 1); - } - - await browser.storage.local.set({ - imgurRedirects: redirects, - rimgoNormalRedirectsChecks, - rimgoTorRedirectsChecks, - rimgoI2pRedirectsChecks, - }); - - resolve(); - }) - }) -} - -let - disableImgur, - imgurRedirects, - imgurProtocol, - rimgoNormalRedirectsChecks, - rimgoNormalCustomRedirects, - rimgoTorRedirectsChecks, - rimgoTorCustomRedirects, - rimgoI2pRedirectsChecks, - rimgoI2pCustomRedirects; - -function init() { - return new Promise(async resolve => { - browser.storage.local.get( - [ - "disableImgur", - "imgurRedirects", - "imgurProtocol", - "rimgoNormalRedirectsChecks", - "rimgoNormalCustomRedirects", - "rimgoTorRedirectsChecks", - "rimgoTorCustomRedirects", - "rimgoI2pRedirectsChecks", - "rimgoI2pCustomRedirects", - ], - r => { - disableImgur = r.disableImgur; - imgurRedirects = r.imgurRedirects; - imgurProtocol = r.imgurProtocol; - rimgoNormalRedirectsChecks = r.rimgoNormalRedirectsChecks; - rimgoNormalCustomRedirects = r.rimgoNormalCustomRedirects; - rimgoTorRedirectsChecks = r.rimgoTorRedirectsChecks; - rimgoTorCustomRedirects = r.rimgoTorCustomRedirects; - rimgoI2pRedirectsChecks = r.rimgoI2pRedirectsChecks; - rimgoI2pCustomRedirects = r.rimgoI2pCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -// https://imgur.com/gallery/s4WXQmn -// https://imgur.com/a/H8M4rcp -// https://imgur.com/gallery/gYiQLWy -// https://imgur.com/gallery/cTRwaJU -// https://i.imgur.com/CFSQArP.jpeg - -function all() { - return [ - ...imgurRedirects.rimgo.normal, - ...imgurRedirects.rimgo.tor, - ...imgurRedirects.rimgo.i2p, - ...rimgoNormalCustomRedirects, - ...rimgoTorCustomRedirects, - ...rimgoI2pCustomRedirects, - ]; -} - -function redirect(url, type, initiator) { - if (disableImgur) return; - if (url.pathname == "/") return; - if (!["main_frame", "sub_frame", "xmlhttprequest", "other", "image", "media",].includes(type)) return; - if (initiator && (all().includes(initiator.origin) || targets.test(initiator.host))) return; - if (!targets.test(url.href)) return; - if (url.pathname.includes("delete/")) return; - - let instancesList; - if (imgurProtocol == 'normal') instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects]; - if (imgurProtocol == 'tor') instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects]; - if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pRedirectsChecks, ...rimgoI2pCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList); - return `${randomInstance}${url.pathname}${url.search}`; -} - -function reverse(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - resolve(`https://imgur.com${url.pathname}${url.search}`); - }) -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - let instancesList; - if (imgurProtocol == 'normal') instancesList = [...rimgoNormalCustomRedirects, ...rimgoNormalRedirectsChecks]; - else if (imgurProtocol == 'tor') instancesList = [...rimgoTorCustomRedirects, ...rimgoTorRedirectsChecks]; - else if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks]; - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.rimgo = dataJson.rimgo; - browser.storage.local.get('cloudflareList', async r => { - rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]; - for (const instance of r.cloudflareList) { - const i = rimgoNormalRedirectsChecks.indexOf(instance); - if (i > -1) rimgoNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableImgur: false, - imgurProtocol: 'normal', - imgurRedirects: redirects, - - rimgoNormalRedirectsChecks: rimgoNormalRedirectsChecks, - rimgoNormalCustomRedirects: [], - - rimgoTorRedirectsChecks: [...redirects.rimgo.tor], - rimgoTorCustomRedirects: [], - - rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p], - rimgoI2pCustomRedirects: [], - }); - resolve(); - }); - }); - }); -} - -export default { - setRedirects, - redirect, - reverse, - initDefaults, - switchInstance, -}; diff --git a/src/assets/javascripts/helpers/instagram.js b/src/assets/javascripts/helpers/instagram.js deleted file mode 100644 index f5c54b3a..00000000 --- a/src/assets/javascripts/helpers/instagram.js +++ /dev/null @@ -1,166 +0,0 @@ -window.browser = window.browser || window.chrome; -import utils from './utils.js' - -const targets = [ - "instagram.com", - "www.instagram.com", -]; -let redirects = { - "bibliogram": { - "normal": [], - "tor": [] - } -}; -function setRedirects(val) { - browser.storage.local.get('cloudflareList', async r => { - redirects.bibliogram = val; - bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]; - for (const instance of r.cloudflareList) { - const a = bibliogramNormalRedirectsChecks.indexOf(instance); - if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1); - } - browser.storage.local.set({ - instagramRedirects: redirects, - bibliogramNormalRedirectsChecks - }) - }) -} - -let - disableInstagram, - instagramProtocol, - instagramRedirects, - bibliogramNormalRedirectsChecks, - bibliogramTorRedirectsChecks, - bibliogramNormalCustomRedirects, - bibliogramTorCustomRedirects; - -function init() { - return new Promise(async resolve => { - browser.storage.local.get( - [ - "disableInstagram", - "instagramProtocol", - "instagramRedirects", - "bibliogramNormalRedirectsChecks", - "bibliogramTorRedirectsChecks", - "bibliogramNormalCustomRedirects", - "bibliogramTorCustomRedirects", - ], - r => { - disableInstagram = r.disableInstagram; - instagramProtocol = r.instagramProtocol; - instagramRedirects = r.instagramRedirects; - bibliogramNormalRedirectsChecks = r.bibliogramNormalRedirectsChecks; - bibliogramTorRedirectsChecks = r.bibliogramTorRedirectsChecks; - bibliogramNormalCustomRedirects = r.bibliogramNormalCustomRedirects; - bibliogramTorCustomRedirects = r.bibliogramTorCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function all() { - return [ - ...instagramRedirects.bibliogram.normal, - ...instagramRedirects.bibliogram.tor, - ...bibliogramNormalCustomRedirects, - ...bibliogramTorCustomRedirects, - ] -} - -function redirect(url, type, initiator) { - if (disableInstagram) return; - if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; - if (!targets.includes(url.host)) return; - if (!["main_frame", "sub_frame", "xmlhttprequest", "other", "image", "media"].includes(type)) return; - - const bypassPaths = [/about/, /explore/, /support/, /press/, /api/, /privacy/, /safety/, /admin/, /\/(accounts\/|embeds?.js)/]; - if (bypassPaths.some(rx => rx.test(url.pathname))) return; - - let instancesList; - if (instagramProtocol == 'normal') instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]; - else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]; - if (instancesList.length === 0) return; - let randomInstance = utils.getRandomInstance(instancesList) - - const reservedPaths = ["u", "p", "privacy",]; - if (url.pathname === "/" || reservedPaths.includes(url.pathname.split("/")[1])) - return `${randomInstance}${url.pathname}${url.search}`; - if (url.pathname.startsWith("/reel") || url.pathname.startsWith("/tv")) - return `${randomInstance}/p${url.pathname.replace(/\/reel|\/tv/i, '')}${url.search}`; - else - return `${randomInstance}/u${url.pathname}${url.search}`; // Likely a user profile, redirect to '/u/...' -} - -function reverse(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - - if (url.pathname.startsWith('/p')) resolve(`https://instagram.com${url.pathname.replace('/p', '')}${url.search}`); - if (url.pathname.startsWith('/u')) resolve(`https://instagram.com${url.pathname.replace('/u', '')}${url.search}`); - resolve(`https://instagram.com${url.pathname}${url.search}`); - }) -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (instagramProtocol == 'normal') instancesList = [...bibliogramNormalCustomRedirects, ...bibliogramNormalRedirectsChecks]; - else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorCustomRedirects, ...bibliogramTorRedirectsChecks]; - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(data => { - let dataJson = JSON.parse(data); - redirects.bibliogram = dataJson.bibliogram; - browser.storage.local.get('cloudflareList', r => { - bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]; - for (const instance of r.cloudflareList) { - const i = bibliogramNormalRedirectsChecks.indexOf(instance); - if (i > -1) bibliogramNormalRedirectsChecks.splice(i, 1); - } - browser.storage.local.set({ - disableInstagram: false, - instagramRedirects: redirects, - - bibliogramNormalRedirectsChecks: bibliogramNormalRedirectsChecks, - bibliogramTorRedirectsChecks: [], - - bibliogramNormalCustomRedirects: [...redirects.bibliogram.tor], - bibliogramTorCustomRedirects: [], - instagramProtocol: "normal", - }) - resolve(); - } - ) - }) - }) -} - -export default { - setRedirects, - reverse, - redirect, - initDefaults, - switchInstance, -}; diff --git a/src/assets/javascripts/helpers/lbry.js b/src/assets/javascripts/helpers/lbry.js deleted file mode 100644 index b44cc738..00000000 --- a/src/assets/javascripts/helpers/lbry.js +++ /dev/null @@ -1,156 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -let targets = ["odysee.com"]; - -let redirects = { - "librarian": { - "normal": [ - "https://lbry.bcow.xyz", - "https://odysee.076.ne.jp", - "https://lbry.ix.tc", - "https://librarian.pussthecat.org", - "https://lbry.mutahar.rocks", - "https://librarian.esmailelbob.xyz", - ], - "tor": [ - "http://ecc5mi5ncdw6mxhjz6re6g2uevtpbzxjvxgrxia2gyvrlnil3srbnhyd.onion", - "http://vrmbc4brkgkaysmi3fenbzkayobxjh24slmhtocambn3ewe62iuqt3yd.onion", - ] - } -} - -function setRedirects(val) { - redirects.librarian = val; - browser.storage.local.set({ lbryTargetsRedirects: redirects }) - for (const item of librarianNormalRedirectsChecks) - if (!redirects.librarian.normal.includes(item)) { - var index = librarianNormalRedirectsChecks.indexOf(item); - if (index !== -1) librarianNormalRedirectsChecks.splice(index, 1); - } - browser.storage.local.set(librarianNormalRedirectsChecks); - - for (const item of librarianTorRedirectsChecks) - if (!redirects.librarian.normal.includes(item)) { - var index = librarianTorRedirectsChecks.indexOf(item); - if (index !== -1) librarianTorRedirectsChecks.splice(index, 1); - } - browser.storage.local.set(librarianTorRedirectsChecks) -} - -let - disableLbryTargets, - lbryTargetsProtocol, - lbryTargetsRedirects, - librarianNormalRedirectsChecks, - librarianNormalCustomRedirects, - librarianTorRedirectsChecks, - librarianTorCustomRedirects; - -function init() { - return new Promise(resolve => { - browser.storage.local.get( - [ - "disableLbryTargets", - "lbryTargetsProtocol", - "lbryTargetsRedirects", - "librarianNormalRedirectsChecks", - "librarianNormalCustomRedirects", - "librarianTorRedirectsChecks", - "librarianTorCustomRedirects", - ], - r => { - disableLbryTargets = r.disableLbryTargets; - lbryTargetsProtocol = r.lbryTargetsProtocol; - lbryTargetsRedirects = r.lbryTargetsRedirects; - librarianNormalRedirectsChecks = r.librarianNormalRedirectsChecks; - librarianNormalCustomRedirects = r.librarianNormalCustomRedirects; - librarianTorRedirectsChecks = r.librarianTorRedirectsChecks; - librarianTorCustomRedirects = r.librarianTorCustomRedirects; - resolve(); - } - ) - }) -} -init(); -browser.storage.onChanged.addListener(init) - -function all() { - return [ - ...redirects.librarian.normal, - ...redirects.librarian.tor, - ...librarianNormalCustomRedirects, - ...librarianTorCustomRedirects, - ]; -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]; - else if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]; - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function redirect(url, type, initiator) { - if (disableLbryTargets) return; - if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return; - if (!targets.includes(url.host)) return; - if (type != "main_frame") return; - - let instancesList; - if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]; - if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList); - return `${randomInstance}${url.pathname}${url.search}`; -} - -function initDefaults() { - return new Promise(resolve => { - browser.storage.local.get('cloudflareList', async r => { - librarianNormalRedirectsChecks = [...redirects.librarian.normal]; - for (const instance of r.cloudflareList) { - let i; - - i = librarianNormalRedirectsChecks.indexOf(instance); - if (i > -1) librarianNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableLbryTargets: true, - lbryTargetsRedirects: { - 'librarian': redirects.librarian - }, - - librarianNormalRedirectsChecks: librarianNormalRedirectsChecks, - librarianNormalCustomRedirects: [], - - librarianTorRedirectsChecks: [...redirects.librarian.tor], - librarianTorCustomRedirects: [], - - lbryTargetsProtocol: "normal", - }) - resolve(); - }) - }) -} - -export default { - setRedirects, - switchInstance, - redirect, - initDefaults, -}; diff --git a/src/assets/javascripts/helpers/maps.js b/src/assets/javascripts/helpers/maps.js deleted file mode 100644 index 3ab5e2b6..00000000 --- a/src/assets/javascripts/helpers/maps.js +++ /dev/null @@ -1,212 +0,0 @@ -"use strict"; - -window.browser = window.browser || window.chrome; -import utils from './utils.js' - -const targets = /^https?:\/{2}(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/; - -let redirects = { - 'osm': { - "normal": [ - "https://openstreetmap.org" - ] - }, - 'facil': { - "normal": [ - "https://facilmap.org" - ] - } -}; - - -let - disableMaps, - mapsFrontend, - facilNormalRedirectsChecks, - facilNormalCustomRedirects; - -function init() { - browser.storage.local.get( - [ - "disableMaps", - "mapsFrontend", - "facilNormalRedirectsChecks", - "facilNormalCustomRedirects", - ], - r => { - disableMaps = r.disableMaps; - mapsFrontend = r.mapsFrontend; - facilNormalRedirectsChecks = r.facilNormalRedirectsChecks; - facilNormalCustomRedirects = r.facilNormalCustomRedirects; - } - ) -} - -init(); -browser.storage.onChanged.addListener(init) - -function redirect(url, initiator) { - const mapCentreRegex = /@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/; - const dataLatLngRegex = /!3d(-?[0-9]{1,}.[0-9]{1,})!4d(-?[0-9]{1,}.[0-9]{1,})/; - 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. - }; - const travelModesFacil = { - driving: "car", - walking: "pedestrian", - bicycling: "bicycle", - transit: "car", // not implemented on Facil, default to car. - }; - const osmLayers = { - none: "S", - transit: "T", - traffic: "S", // not implemented on OSM, default to standard. - bicycling: "C", - }; - - function addressToLatLng(address) { - const xmlhttp = new XMLHttpRequest(); - xmlhttp.open("GET", `https://nominatim.openstreetmap.org/search/${address}?format=json&limit=1`, false); - xmlhttp.send(); - if (xmlhttp.status === 200) { - const json = JSON.parse(xmlhttp.responseText)[0]; - if (json) { - console.log('json', json) - return [ - `${json.lat},${json.lon}`, - `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}`, - ]; - } - } - console.info("Error: Status is " + xmlhttp.status); - } - - if (disableMaps) return; - if (initiator && initiator.host === "earth.google.com") return; - if (!url.href.match(targets)) return; - - let randomInstance; - if (mapsFrontend == 'osm') randomInstance = utils.getRandomInstance(redirects.osm.normal); - if (mapsFrontend == 'facil') randomInstance = utils.getRandomInstance([...facilNormalRedirectsChecks, ...facilNormalCustomRedirects]); - - let mapCentre = "#"; - let prefs = {}; - - if (url.pathname.match(mapCentreRegex)) { // Set map centre if present - var [, lat, lon, zoom] = url.pathname.match(mapCentreRegex); - } else if (url.searchParams.has("center")) { - var [lat, lon] = url.searchParams.get("center").split(","); - var zoom = url.searchParams.get("zoom") ?? "17"; - } - - if (lat && lon && zoom) { - if (mapsFrontend == 'osm') mapCentre = `#map=${zoom}/${lat}/${lon}`; - if (mapsFrontend == 'facil') mapCentre = `#${zoom}/${lat}/${lon}`; - } - - if (url.searchParams.get("layer")) prefs.layers = osmLayers[url.searchParams.get("layer")]; - - if (url.pathname.includes("/embed")) { // Handle Google Maps Embed API - // https://www.google.com/maps/embed/v1/place?key=AIzaSyD4iE2xVSpkLLOXoyqT-RuPwURN3ddScAI&q=Eiffel+Tower,Paris+France - console.log("embed life"); - - 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 [coords, boundingbox] = addressToLatLng(query); - prefs.bbox = boundingbox; - prefs.marker = coords; - prefs.layer = "mapnik"; - let prefsEncoded = new URLSearchParams(prefs).toString(); - if (mapsFrontend == 'osm') { resolve(`${randomInstance}/export/embed.html?${prefsEncoded}`); return; } - - if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${query}`); return; } - - } else if (url.pathname.includes("/dir")) { // Handle Google Maps Directions - // https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling - - let travMod = url.searchParams.get("travelmode"); - if (url.searchParams.has("travelmode")) prefs.engine = travelModes[travMod]; - - let orgVal = url.searchParams.get("origin"); - let destVal = url.searchParams.get("destination"); - - let org; addressToLatLng(orgVal, a => org = a); - let dest; addressToLatLng(destVal, a => dest = a); - prefs.route = `${org};${dest}`; - - let prefsEncoded = new URLSearchParams(prefs).toString(); - if (mapsFrontend == 'osm') { resolve(`${randomInstance}/directions?${prefsEncoded}${mapCentre}`); return; } - if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${orgVal}%20to%20${destVal}%20by%20${travelModesFacil[travMod]}`); return; } - - } else if (url.pathname.includes("data=") && url.pathname.match(dataLatLngRegex)) { // Get marker from data attribute - // https://www.google.com/maps/place/41%C2%B001'58.2%22N+40%C2%B029'18.2%22E/@41.032833,40.4862063,17z/data=!3m1!4b1!4m6!3m5!1s0x0:0xf64286eaf72fc49d!7e2!8m2!3d41.0328329!4d40.4883948 - console.log("data life"); - - let [, mlat, mlon] = url.pathname.match(dataLatLngRegex); - - if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; } - if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; } - - } else if (url.searchParams.has("ll")) { // Get marker from ll param - // https://maps.google.com/?ll=38.882147,-76.99017 - console.log("ll life"); - - const [mlat, mlon] = url.searchParams.get("ll").split(","); - - if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; } - if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; } - } else if (url.searchParams.has("viewpoint")) { // Get marker from viewpoint param. - // https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80 - console.log("viewpoint life"); - - const [mlat, mlon] = url.searchParams.get("viewpoint").split(","); - - if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; } - if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; } - } else { // Use query as search if present. - console.log("normal life"); - - 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(placeRegex)) query = url.pathname.match(placeRegex)[1]; - - let prefsEncoded = new URLSearchParams(prefs).toString(); - if (query) { - if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query="${query}${mapCentre}&${prefsEncoded}`); return; } - if (mapsFrontend == 'facil') { resolve(`${randomInstance}/${mapCentre}/Mpnk/${query}`); return; } - } - } - - let prefsEncoded = new URLSearchParams(prefs).toString(); - console.log("mapCentre", mapCentre); - console.log("prefs", prefs); - console.log("prefsEncoded", prefsEncoded); - if (mapsFrontend == 'osm') { resolve(`${randomInstance}/${mapCentre}&${prefsEncoded}`); return; } - if (mapsFrontend == 'facil') { resolve(`${randomInstance}/${mapCentre}/Mpnk`); return; } -} - -async function initDefaults() { - await browser.storage.local.set({ - disableMaps: false, - mapsFrontend: 'osm', - mapsRedirects: redirects, - facilNormalRedirectsChecks: [...redirects.facil.normal], - facilNormalCustomRedirects: [], - }) -} - -export default { - redirect, - initDefaults, -}; diff --git a/src/assets/javascripts/helpers/medium.js b/src/assets/javascripts/helpers/medium.js deleted file mode 100644 index 7be6b0d1..00000000 --- a/src/assets/javascripts/helpers/medium.js +++ /dev/null @@ -1,174 +0,0 @@ -window.browser = window.browser || window.chrome; -import utils from './utils.js' - - -const targets = [ - // /(?:.*\.)*(? { - redirects.scribe = val; - scribeNormalRedirectsChecks = [...redirects.scribe.normal]; - for (const instance of r.cloudflareList) { - const a = scribeNormalRedirectsChecks.indexOf(instance); - if (a > -1) scribeNormalRedirectsChecks.splice(a, 1); - } - browser.storage.local.set({ - mediumRedirects: redirects, - scribeNormalRedirectsChecks - }) - }) -} - -let - disableMedium, - mediumRedirects, - scribeNormalRedirectsChecks, - scribeNormalCustomRedirects, - scribeTorRedirectsChecks, - scribeTorCustomRedirects, - mediumProtocol; - -function init() { - return new Promise(resolve => { - browser.storage.local.get( - [ - "disableMedium", - "mediumRedirects", - "scribeNormalRedirectsChecks", - "scribeNormalCustomRedirects", - "scribeTorRedirectsChecks", - "scribeTorCustomRedirects", - "mediumProtocol" - ], - r => { - disableMedium = r.disableMedium; - mediumRedirects = r.mediumRedirects; - scribeNormalRedirectsChecks = r.scribeNormalRedirectsChecks; - scribeNormalCustomRedirects = r.scribeNormalCustomRedirects; - scribeTorRedirectsChecks = r.scribeTorRedirectsChecks; - scribeTorCustomRedirects = r.scribeTorCustomRedirects; - mediumProtocol = r.mediumProtocol; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function redirect(url, type, initiator) { - if (disableMedium) return; - if (type != "main_frame" && "sub_frame" && "xmlhttprequest" && "other") return; - if (initiator && ( - [ - ...mediumRedirects.scribe.normal, - ...mediumRedirects.scribe.tor, - ...scribeNormalCustomRedirects, - ...scribeTorCustomRedirects, - ].includes(initiator.origin))) return; - - if (!targets.some(rx => rx.test(url.host))) return; - if (/^\/($|@[a-zA-Z.]{0,}(\/|)$)/.test(url.pathname)) return; - - let instancesList; - if (mediumProtocol == 'normal') instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects]; - else if (mediumProtocol == 'tor') instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList) - return `${randomInstance}${url.pathname}${url.search}`; -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(url); - const all = [ - ...mediumRedirects.scribe.tor, - ...mediumRedirects.scribe.normal, - - ...scribeNormalCustomRedirects, - ...scribeTorCustomRedirects, - ]; - if (!all.includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (mediumProtocol == 'normal') instancesList = [...scribeNormalCustomRedirects, ...scribeNormalRedirectsChecks]; - else if (mediumProtocol == 'tor') instancesList = [...scribeTorCustomRedirects, ...scribeTorRedirectsChecks]; - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(data => { - let dataJson = JSON.parse(data); - redirects.scribe = dataJson.scribe; - browser.storage.local.get('cloudflareList', - async r => { - scribeNormalRedirectsChecks = [...redirects.scribe.normal]; - for (const instance of r.cloudflareList) { - let i = scribeNormalRedirectsChecks.indexOf(instance); - if (i > -1) scribeNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableMedium: false, - mediumRedirects: redirects, - - scribeNormalRedirectsChecks: scribeNormalRedirectsChecks, - scribeNormalCustomRedirects: [], - - scribeTorRedirectsChecks: [...redirects.scribe.tor], - scribeTorCustomRedirects: [], - - mediumProtocol: "normal", - }) - resolve(); - }) - }) - }) -} - -export default { - setRedirects, - redirect, - switchInstance, - initDefaults, -}; diff --git a/src/assets/javascripts/helpers/peertube.js b/src/assets/javascripts/helpers/peertube.js deleted file mode 100644 index ed15bce9..00000000 --- a/src/assets/javascripts/helpers/peertube.js +++ /dev/null @@ -1,155 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -let redirects = { - "simpleertube": { - "normal": [ - "https://tube.simple-web.org", - "https://tube.ftild3.org", - "https://stube.alefvanoon.xyz", - "https://st.phreedom.club", - "https://simpleertube.esmailelbob.xyz", - ], - "tor": [] - } -} -function setRedirects(val) { - redirects.simpleertube = val; - browser.storage.local.set({ peertubeTargetsRedirects: redirects }) - for (const item of simpleertubeNormalRedirectsChecks) - if (!redirects.simpleertube.normal.includes(item)) { - var index = simpleertubeNormalRedirectsChecks.indexOf(item); - if (index !== -1) simpleertubeNormalRedirectsChecks.splice(index, 1); - } - browser.storage.local.set({ simpleertubeNormalRedirectsChecks }) - - for (const item of simpleertubeTorRedirectsChecks) - if (!redirects.simpleertube.normal.includes(item)) { - var index = simpleertubeTorRedirectsChecks.indexOf(item); - if (index !== -1) simpleertubeTorRedirectsChecks.splice(index, 1); - } - browser.storage.local.set({ simpleertubeTorRedirectsChecks }) -} - -let - disablePeertubeTargets, - peertubeRedirects, - simpleertubeNormalRedirectsChecks, - simpleertubeNormalCustomRedirects, - simpleertubeTorRedirectsChecks, - simpleertubeTorCustomRedirects, - peerTubeTargets, - peertubeTargetsProtocol; - -function init() { - return new Promise(resolve => { - browser.storage.local.get( - [ - "disablePeertubeTargets", - "peertubeRedirects", - "simpleertubeNormalRedirectsChecks", - "simpleertubeNormalCustomRedirects", - "simpleertubeTorRedirectsChecks", - "simpleertubeTorCustomRedirects", - "peerTubeTargets", - "peertubeTargetsProtocol" - ], - r => { - disablePeertubeTargets = r.disablePeertubeTargets; - peertubeRedirects = r.peertubeRedirects; - simpleertubeNormalRedirectsChecks = r.simpleertubeNormalRedirectsChecks; - simpleertubeNormalCustomRedirects = r.simpleertubeNormalCustomRedirects; - simpleertubeTorRedirectsChecks = r.simpleertubeTorRedirectsChecks; - simpleertubeTorCustomRedirects = r.simpleertubeTorCustomRedirects; - peerTubeTargets = r.peerTubeTargets; - peertubeTargetsProtocol = r.peertubeTargetsProtocol; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function all() { - return [ - ...redirects.simpleertube.normal, - ...redirects.simpleertube.tor, - ...simpleertubeNormalCustomRedirects, - ...simpleertubeTorCustomRedirects, - ]; -} - -function redirect(url, type, initiator) { - if (disablePeertubeTargets) return; - if (initiator && (all().includes(initiator.origin) || peerTubeTargets.includes(initiator.host))) return; - let protocolHost = utils.protocolHost(url); - if (!peerTubeTargets.includes(protocolHost)) return; - if (type != "main_frame") return; - - let instancesList; - if (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]; - if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList); - if (url.host == 'search.joinpeertube.org' || url.host == 'sepiasearch.org') return randomInstance; - return `${randomInstance}/${url.host}${url.pathname}${url.search}`; -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]; - else if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]; - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - browser.storage.local.get('cloudflareList', async r => { - simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]; - for (const instance of r.cloudflareList) { - let i = simpleertubeNormalRedirectsChecks.indexOf(instance); - if (i > -1) simpleertubeNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - peerTubeTargets: ['https://search.joinpeertube.org', ...dataJson.peertube], - disablePeertubeTargets: true, - peertubeRedirects: redirects, - - simpleertubeNormalRedirectsChecks: simpleertubeNormalRedirectsChecks, - simpleertubeNormalCustomRedirects: [], - - simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor], - simpleertubeTorCustomRedirects: [], - - peertubeTargetsProtocol: "normal", - }) - resolve(); - }) - }) - }) -} - -export default { - setRedirects, - switchInstance, - redirect, - initDefaults, -}; diff --git a/src/assets/javascripts/helpers/reddit.js b/src/assets/javascripts/helpers/reddit.js deleted file mode 100644 index 0735ba64..00000000 --- a/src/assets/javascripts/helpers/reddit.js +++ /dev/null @@ -1,378 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -const targets = [ - /^https?:\/{2}(www\.|old\.|np\.|new\.|amp\.|)reddit\.com/, - /^https?:\/{2}(i\.|preview\.)redd\.it/, -]; -let redirects = { - "libreddit": { - "normal": [], - "tor": [] - }, - "teddit": { - "normal": [], - "tor": [] - }, -}; -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects = val; - libredditNormalRedirectsChecks = [...redirects.libreddit.normal]; - tedditNormalRedirectsChecks = [...redirects.teddit.normal] - for (const instance of r.cloudflareList) { - const a = libredditNormalRedirectsChecks.indexOf(instance); - if (a > -1) libredditNormalRedirectsChecks.splice(a, 1); - - const b = tedditNormalRedirectsChecks.indexOf(instance); - if (b > -1) tedditNormalRedirectsChecks.splice(b, 1); - } - browser.storage.local.set({ - redditRedirects: redirects, - libredditNormalRedirectsChecks, - tedditNormalRedirectsChecks - }) - }) -} - -let - disableReddit, - redditFrontend, - redditRedirects, - redditProtocol, - libredditNormalRedirectsChecks, - libredditNormalCustomRedirects, - libredditTorRedirectsChecks, - libredditTorCustomRedirects, - tedditNormalRedirectsChecks, - tedditNormalCustomRedirects, - tedditTorRedirectsChecks, - tedditTorCustomRedirects; - -function init() { - return new Promise(resolve => { - browser.storage.local.get( - [ - "disableReddit", - "redditFrontend", - "redditRedirects", - "redditProtocol", - "libredditNormalRedirectsChecks", - "libredditNormalCustomRedirects", - "libredditTorRedirectsChecks", - "libredditTorCustomRedirects", - "tedditNormalRedirectsChecks", - "tedditNormalCustomRedirects", - "tedditTorRedirectsChecks", - "tedditTorCustomRedirects", - ], - r => { - disableReddit = r.disableReddit; - redditFrontend = r.redditFrontend; - redditRedirects = r.redditRedirects; - redditProtocol = r.redditProtocol; - libredditNormalRedirectsChecks = r.libredditNormalRedirectsChecks; - libredditNormalCustomRedirects = r.libredditNormalCustomRedirects; - libredditTorRedirectsChecks = r.libredditTorRedirectsChecks; - libredditTorCustomRedirects = r.libredditTorCustomRedirects; - tedditNormalRedirectsChecks = r.tedditNormalRedirectsChecks; - tedditNormalCustomRedirects = r.tedditNormalCustomRedirects; - tedditTorRedirectsChecks = r.tedditTorRedirectsChecks; - tedditTorCustomRedirects = r.tedditTorCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function initLibredditCookies(test, from) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(from); - if (![ - ...libredditNormalRedirectsChecks, - ...libredditTorRedirectsChecks, - ...libredditNormalCustomRedirects, - ...libredditTorCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - if (!test) { - let checkedInstances; - if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]; - else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]; - for (const to of checkedInstances) { - utils.copyCookie('libreddit', from, to, "theme"); - utils.copyCookie('libreddit', from, to, "front_page"); - utils.copyCookie('libreddit', from, to, "layout"); - utils.copyCookie('libreddit', from, to, "wide"); - utils.copyCookie('libreddit', from, to, "post_sort"); - utils.copyCookie('libreddit', from, to, "comment_sort"); - utils.copyCookie('libreddit', from, to, "show_nsfw"); - utils.copyCookie('libreddit', from, to, "autoplay_videos"); - utils.copyCookie('libreddit', from, to, "use_hls"); - utils.copyCookie('libreddit', from, to, "hide_hls_notification"); - } - } - resolve(true); - }) -} - -function setLibredditCookies() { - return new Promise(async resolve => { - await init(); - if (disableReddit || redditFrontend != 'libreddit' || redditProtocol === undefined) { resolve(); return; } - let checkedInstances; - if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects] - else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('libreddit', to, "theme"); - utils.getCookiesFromStorage('libreddit', to, "front_page"); - utils.getCookiesFromStorage('libreddit', to, "layout"); - utils.getCookiesFromStorage('libreddit', to, "wide"); - utils.getCookiesFromStorage('libreddit', to, "post_sort"); - utils.getCookiesFromStorage('libreddit', to, "comment_sort"); - utils.getCookiesFromStorage('libreddit', to, "show_nsfw"); - utils.getCookiesFromStorage('libreddit', to, "autoplay_videos"); - utils.getCookiesFromStorage('libreddit', to, "use_hls"); - utils.getCookiesFromStorage('libreddit', to, "hide_hls_notification"); - } - resolve(); - }) -} - -function initTedditCookies(test, from) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(from); - if (![ - ...tedditNormalRedirectsChecks, - ...tedditTorRedirectsChecks, - ...tedditNormalCustomRedirects, - ...tedditTorCustomRedirects, - ].includes(protocolHost)) resolve(); - - if (!test) { - let checkedInstances; - if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects] - else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects] - for (const to of checkedInstances) { - utils.copyCookie('teddit', from, to, 'collapse_child_comments') - utils.copyCookie('teddit', from, to, 'domain_instagram') - utils.copyCookie('teddit', from, to, 'domain_twitter') - utils.copyCookie('teddit', from, to, 'domain_youtube') - utils.copyCookie('teddit', from, to, 'flairs') - utils.copyCookie('teddit', from, to, 'highlight_controversial') - utils.copyCookie('teddit', from, to, 'nsfw_enabled') - utils.copyCookie('teddit', from, to, 'post_media_max_height') - utils.copyCookie('teddit', from, to, 'show_upvoted_percentage') - utils.copyCookie('teddit', from, to, 'show_upvotes') - utils.copyCookie('teddit', from, to, 'theme') - utils.copyCookie('teddit', from, to, 'videos_muted') - } - } - resolve(true); - }) -} - -function setTedditCookies() { - return new Promise(async resolve => { - await init(); - if (disableReddit || redditFrontend != 'teddit' || redditProtocol === undefined) { resolve(); return; } - let checkedInstances; - if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects] - else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('teddit', to, 'collapse_child_comments') - utils.getCookiesFromStorage('teddit', to, 'domain_instagram') - utils.getCookiesFromStorage('teddit', to, 'domain_twitter') - utils.getCookiesFromStorage('teddit', to, 'domain_youtube') - utils.getCookiesFromStorage('teddit', to, 'flairs') - utils.getCookiesFromStorage('teddit', to, 'highlight_controversial') - utils.getCookiesFromStorage('teddit', to, 'nsfw_enabled') - utils.getCookiesFromStorage('teddit', to, 'post_media_max_height') - utils.getCookiesFromStorage('teddit', to, 'show_upvoted_percentage') - utils.getCookiesFromStorage('teddit', to, 'show_upvotes') - utils.getCookiesFromStorage('teddit', to, 'theme') - utils.getCookiesFromStorage('teddit', to, 'videos_muted') - } - resolve(); - }) -} - -function all() { - return [ - ...redditRedirects.libreddit.normal, - ...redditRedirects.libreddit.tor, - ...redditRedirects.teddit.normal, - ...redditRedirects.teddit.tor, - ...libredditNormalCustomRedirects, - ...libredditTorCustomRedirects, - ...tedditNormalCustomRedirects, - ...tedditTorCustomRedirects, - ]; -} - -// https://libreddit.exonip.de/vid/1mq8d0ma3yk81/720.mp4 -// https://libreddit.exonip.de/img/4v3t1vgvrzk81.png - -// https://teddit.net/vids/1mq8d0ma3yk81.mp4 -// https://teddit.net/pics/w:null_4v3t1vgvrzk81.png - - -// redd.it/t5379n -// https://v.redd.it/z08avb339n801/DASH_1_2_M -// https://i.redd.it/bfkhs659tzk81.jpg -function redirect(url, type, initiator) { - if (disableReddit) return; - if (!targets.some(rx => rx.test(url.href))) return; - if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; - const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/; - if (type !== "main_frame" || url.pathname.match(bypassPaths)) return; - - let libredditInstancesList; - let tedditInstancesList; - if (redditProtocol == 'normal') { - libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]; - tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]; - } else if (redditProtocol == 'tor') { - libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]; - tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]; - } - - if (url.host === "i.redd.it") { - if (redditFrontend == 'teddit') { - if (tedditInstancesList.length === 0) return; - let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList); - return `${tedditRandomInstance}/pics/w:null_${url.pathname.substring(1)}${url.reddit}`; - } - if (redditFrontend == 'libreddit') { - if (libredditInstancesList.length === 0) return; - let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList); - return `${libredditRandomInstance}/img${url.pathname}${url.reddit}` - } - } - else if (url.host === "redd.it") { - if (redditFrontend == 'libreddit' && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) { - if (libredditInstancesList.length === 0) return; - let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList); - // https://redd.it/foo => https://libredd.it/comments/foo - return `${libredditRandomInstance}/comments${url.pathname}${url.reddit}`; - } - if (redditFrontend == 'teddit' && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) { - if (tedditInstancesList.length === 0) return; - let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList); - // https://redd.it/foo => https://teddit.net/comments/foo - return `${tedditRandomInstance}/comments${url.pathname}${url.reddit}` - } - } - else if (url.host === 'preview.redd.it') { - if (redditFrontend == 'teddit') return; - if (redditFrontend == 'libreddit') { - if (libredditInstancesList.length === 0) return; - const libredditRandomInstance = utils.getRandomInstance(libredditInstancesList); - return `${libredditRandomInstance}/preview/pre${url.pathname}${url.reddit}`; - } - } - - let randomInstance; - if (redditFrontend == 'libreddit') { - if (libredditInstancesList.length === 0) return; - randomInstance = utils.getRandomInstance(libredditInstancesList); - } - if (redditFrontend == 'teddit') { - if (tedditInstancesList.length === 0) return; - randomInstance = utils.getRandomInstance(tedditInstancesList); - } - return `${randomInstance}${url.pathname}${url.search}`; -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - let instancesList; - if (redditFrontend == 'libreddit') { - if (redditProtocol == 'normal') instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]; - else if (redditProtocol == 'tor') instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]; - if ([ - ...redditRedirects.teddit.normal, - ...redditRedirects.teddit.tor - ].includes(protocolHost)) url.pathname = url.pathname.replace("/pics/w:null_", "/img/"); - } - else if (redditFrontend == 'teddit') { - if (redditProtocol == 'normal') instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]; - else if (redditProtocol == 'tor') instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]; - if ([ - ...redditRedirects.libreddit.normal, - ...redditRedirects.libreddit.tor - ].includes(protocolHost) - ) url.pathname = url.pathname.replace("/img/", "/pics/w:null_"); - } - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.reddit}`); - }) -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.teddit = dataJson.teddit; - redirects.libreddit = dataJson.libreddit; - browser.storage.local.get('cloudflareList', async r => { - libredditNormalRedirectsChecks = [...redirects.libreddit.normal]; - tedditNormalRedirectsChecks = [...redirects.teddit.normal] - for (const instance of r.cloudflareList) { - let i; - - i = libredditNormalRedirectsChecks.indexOf(instance); - if (i > -1) libredditNormalRedirectsChecks.splice(i, 1); - - i = tedditNormalRedirectsChecks.indexOf(instance); - if (i > -1) tedditNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableReddit: false, - redditProtocol: 'normal', - redditFrontend: 'libreddit', - redditRedirects: redirects, - - libredditNormalRedirectsChecks: libredditNormalRedirectsChecks, - libredditNormalCustomRedirects: [], - - libredditTorRedirectsChecks: [...redirects.libreddit.tor], - libredditTorCustomRedirects: [], - - tedditNormalRedirectsChecks: tedditNormalRedirectsChecks, - tedditNormalCustomRedirects: [], - - tedditTorRedirectsChecks: [...redirects.teddit.tor], - tedditTorCustomRedirects: [], - }); - resolve(); - }); - }); - }); -} - -export default { - setRedirects, - initLibredditCookies, - setLibredditCookies, - initTedditCookies, - setTedditCookies, - - redirect, - initDefaults, - switchInstance, -}; diff --git a/src/assets/javascripts/helpers/search.js b/src/assets/javascripts/helpers/search.js deleted file mode 100644 index b32a8141..00000000 --- a/src/assets/javascripts/helpers/search.js +++ /dev/null @@ -1,470 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -const targets = [ - /^https?:\/{2}(www\.|search\.|)google(\.[a-z]{2,3}){1,2}(\/search(\?.*|$)|\/$)/, - /^https?:\/{2}(www\.|www2\.|)bing\.com/, - /^https?:\/{2}yandex(\.[a-z]{2,3}){1,2}/, - /^https?:\/{2}search\.libredirect\.invalid/, -]; - -let redirects = { - "searx": { - "normal": [], - "tor": [], - "i2p": [] - }, - "searxng": { - "normal": [], - "tor": [], - "i2p": [] - }, - "whoogle": { - "normal": [], - "tor": [], - "i2p": [] - } -}; - -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects = val; - searxNormalRedirectsChecks = [...redirects.searx.normal]; - searxngNormalRedirectsChecks = [...redirects.searxng.normal]; - whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]; - for (const instance of r.cloudflareList) { - const a = searxNormalRedirectsChecks.indexOf(instance); - if (a > -1) searxNormalRedirectsChecks.splice(a, 1); - - const b = searxngNormalRedirectsChecks.indexOf(instance); - if (b > -1) searxngNormalRedirectsChecks.splice(b, 1); - - const c = whoogleNormalRedirectsChecks.indexOf(instance); - if (c > -1) whoogleNormalRedirectsChecks.splice(c, 1); - } - browser.storage.local.set({ - searchRedirects: redirects, - searxNormalRedirectsChecks, - searxngNormalRedirectsChecks, - whoogleNormalRedirectsChecks, - }); - }) -} - -let - disableSearch, - searchFrontend, - searchRedirects, - searchProtocol, - whoogleNormalRedirectsChecks, - whoogleNormalCustomRedirects, - whoogleTorRedirectsChecks, - whoogleTorCustomRedirects, - whoogleI2pRedirectsChecks, - whoogleI2pCustomRedirects, - searxNormalRedirectsChecks, - searxNormalCustomRedirects, - searxTorRedirectsChecks, - searxTorCustomRedirects, - searxI2pRedirectsChecks, - searxI2pCustomRedirects, - searxngNormalRedirectsChecks, - searxngNormalCustomRedirects, - searxngTorRedirectsChecks, - searxngTorCustomRedirects, - searxngI2pRedirectsChecks, - searxngI2pCustomRedirects; - -function init() { - return new Promise(async resolve => { - browser.storage.local.get( - [ - "disableSearch", - "searchFrontend", - "searchRedirects", - "searchProtocol", - "whoogleNormalRedirectsChecks", - "whoogleNormalCustomRedirects", - "whoogleTorRedirectsChecks", - "whoogleTorCustomRedirects", - "whoogleI2pRedirectsChecks", - "whoogleI2pCustomRedirects", - "searxNormalRedirectsChecks", - "searxNormalCustomRedirects", - "searxTorRedirectsChecks", - "searxTorCustomRedirects", - "searxI2pRedirectsChecks", - "searxI2pCustomRedirects", - "searxngNormalRedirectsChecks", - "searxngNormalCustomRedirects", - "searxngTorRedirectsChecks", - "searxngTorCustomRedirects", - "searxngI2pRedirectsChecks", - "searxngI2pCustomRedirects", - ], - r => { - disableSearch = r.disableSearch; - searchFrontend = r.searchFrontend; - searchRedirects = r.searchRedirects; - searchProtocol = r.searchProtocol; - whoogleNormalRedirectsChecks = r.whoogleNormalRedirectsChecks; - whoogleNormalCustomRedirects = r.whoogleNormalCustomRedirects; - whoogleTorRedirectsChecks = r.whoogleTorRedirectsChecks; - whoogleTorCustomRedirects = r.whoogleTorCustomRedirects; - whoogleI2pRedirectsChecks = r.whoogleI2pRedirectsChecks; - whoogleI2pCustomRedirects = r.whoogleI2pCustomRedirects; - searxNormalRedirectsChecks = r.searxNormalRedirectsChecks; - searxNormalCustomRedirects = r.searxNormalCustomRedirects; - searxTorRedirectsChecks = r.searxTorRedirectsChecks; - searxTorCustomRedirects = r.searxTorCustomRedirects; - searxI2pRedirectsChecks = r.searxI2pRedirectsChecks; - searxI2pCustomRedirects = r.searxI2pCustomRedirects; - searxngNormalRedirectsChecks = r.searxngNormalRedirectsChecks; - searxngNormalCustomRedirects = r.searxngNormalCustomRedirects; - searxngTorRedirectsChecks = r.searxngTorRedirectsChecks; - searxngTorCustomRedirects = r.searxngTorCustomRedirects; - searxngI2pRedirectsChecks = r.searxngI2pRedirectsChecks; - searxngI2pCustomRedirects = r.searxngI2pCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function initSearxCookies(test, from) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(from); - if (![ - ...searxNormalRedirectsChecks, - ...searxNormalCustomRedirects, - ...searxTorRedirectsChecks, - ...searxTorCustomRedirects, - ...searxI2pRedirectsChecks, - ...searxI2pCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - if (!test) { - let checkedInstances; - if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]; - else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]; - else if (searchProtocol == 'i2p') checkedInstances = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]; - for (const to of checkedInstances) { - utils.copyCookie('searx', from, to, 'advanced_search'); - utils.copyCookie('searx', from, to, 'autocomplete'); - utils.copyCookie('searx', from, to, 'categories'); - utils.copyCookie('searx', from, to, 'disabled_engines'); - utils.copyCookie('searx', from, to, 'disabled_plugins'); - utils.copyCookie('searx', from, to, 'doi_resolver'); - utils.copyCookie('searx', from, to, 'enabled_engines'); - utils.copyCookie('searx', from, to, 'enabled_plugins'); - utils.copyCookie('searx', from, to, 'image_proxy'); - utils.copyCookie('searx', from, to, 'language'); - utils.copyCookie('searx', from, to, 'locale'); - utils.copyCookie('searx', from, to, 'method'); - utils.copyCookie('searx', from, to, 'oscar-style'); - utils.copyCookie('searx', from, to, 'results_on_new_tab'); - utils.copyCookie('searx', from, to, 'safesearch'); - utils.copyCookie('searx', from, to, 'theme'); - utils.copyCookie('searx', from, to, 'tokens'); - } - } - resolve(true); - }) -} - -function setSearxCookies() { - return new Promise(async resolve => { - await init(); - if (disableSearch || searchFrontend != 'searx') { resolve(); return; } - let checkedInstances; - if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects] - else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('searx', to, 'advanced_search'); - utils.getCookiesFromStorage('searx', to, 'autocomplete'); - utils.getCookiesFromStorage('searx', to, 'categories'); - utils.getCookiesFromStorage('searx', to, 'disabled_engines'); - utils.getCookiesFromStorage('searx', to, 'disabled_plugins'); - utils.getCookiesFromStorage('searx', to, 'doi_resolver'); - utils.getCookiesFromStorage('searx', to, 'enabled_engines'); - utils.getCookiesFromStorage('searx', to, 'enabled_plugins'); - utils.getCookiesFromStorage('searx', to, 'image_proxy'); - utils.getCookiesFromStorage('searx', to, 'language'); - utils.getCookiesFromStorage('searx', to, 'locale'); - utils.getCookiesFromStorage('searx', to, 'method'); - utils.getCookiesFromStorage('searx', to, 'oscar-style'); - utils.getCookiesFromStorage('searx', to, 'results_on_new_tab'); - utils.getCookiesFromStorage('searx', to, 'safesearch'); - utils.getCookiesFromStorage('searx', to, 'theme'); - utils.getCookiesFromStorage('searx', to, 'tokens'); - } - resolve(); - }) -} - -function initSearxngCookies(test, from) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(from); - if (![ - ...searxngNormalRedirectsChecks, - ...searxngNormalCustomRedirects, - ...searxngTorRedirectsChecks, - ...searxngTorCustomRedirects, - ...searxngI2pRedirectsChecks, - ...searxngI2pCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - if (!test) { - let checkedInstances; - if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]; - else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]; - else if (searchProtocol == 'i2p') checkedInstances = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]; - for (const to of checkedInstances) { - utils.copyCookie('searxng', from, to, 'autocomplete'); - utils.copyCookie('searxng', from, to, 'categories'); - utils.copyCookie('searxng', from, to, 'disabled_engines'); - utils.copyCookie('searxng', from, to, 'disabled_plugins'); - utils.copyCookie('searxng', from, to, 'doi_resolver'); - utils.copyCookie('searxng', from, to, 'enabled_plugins'); - utils.copyCookie('searxng', from, to, 'enabled_engines'); - utils.copyCookie('searxng', from, to, 'image_proxy'); - utils.copyCookie('searxng', from, to, 'infinite_scroll'); - utils.copyCookie('searxng', from, to, 'language'); - utils.copyCookie('searxng', from, to, 'locale'); - utils.copyCookie('searxng', from, to, 'maintab'); - utils.copyCookie('searxng', from, to, 'method'); - utils.copyCookie('searxng', from, to, 'query_in_title'); - utils.copyCookie('searxng', from, to, 'results_on_new_tab'); - utils.copyCookie('searxng', from, to, 'safesearch'); - utils.copyCookie('searxng', from, to, 'simple_style'); - utils.copyCookie('searxng', from, to, 'theme'); - utils.copyCookie('searxng', from, to, 'tokens'); - } - } - resolve(true); - }) -} - -function setSearxngCookies() { - return new Promise(async resolve => { - await init(); - if (disableSearch || searchFrontend != 'searxng', searchProtocol === undefined) { resolve(); return; } - let checkedInstances; - if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects] - else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('searxng', to, 'autocomplete'); - utils.getCookiesFromStorage('searxng', to, 'categories'); - utils.getCookiesFromStorage('searxng', to, 'disabled_engines'); - utils.getCookiesFromStorage('searxng', to, 'disabled_plugins'); - utils.getCookiesFromStorage('searxng', to, 'doi_resolver'); - utils.getCookiesFromStorage('searxng', to, 'enabled_plugins'); - utils.getCookiesFromStorage('searxng', to, 'enabled_engines'); - utils.getCookiesFromStorage('searxng', to, 'image_proxy'); - utils.getCookiesFromStorage('searxng', to, 'infinite_scroll'); - utils.getCookiesFromStorage('searxng', to, 'language'); - utils.getCookiesFromStorage('searxng', to, 'locale'); - utils.getCookiesFromStorage('searxng', to, 'maintab'); - utils.getCookiesFromStorage('searxng', to, 'method'); - utils.getCookiesFromStorage('searxng', to, 'query_in_title'); - utils.getCookiesFromStorage('searxng', to, 'results_on_new_tab'); - utils.getCookiesFromStorage('searxng', to, 'safesearch'); - utils.getCookiesFromStorage('searxng', to, 'simple_style'); - utils.getCookiesFromStorage('searxng', to, 'theme'); - utils.getCookiesFromStorage('searxng', to, 'tokens'); - } - resolve(); - }) -} - - -function redirect(url) { - if (disableSearch) return; - if (!targets.some(rx => rx.test(url.href))) return; - if (url.searchParams.has('tbm')) return; - if (url.hostname.includes('google') && !url.searchParams.has('q') && url.pathname != '/') return; - let randomInstance; - let path; - if (searchFrontend == 'searx') { - let instancesList; - if (searchProtocol == 'normal') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]; - else if (searchProtocol == 'tor') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]; - else if (searchProtocol == 'i2p') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]; - if (instancesList.length === 0) return; - randomInstance = utils.getRandomInstance(instancesList) - path = "/"; - } - else if (searchFrontend == 'searxng') { - let instancesList; - if (searchProtocol == 'normal') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]; - else if (searchProtocol == 'tor') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]; - else if (searchProtocol == 'i2p') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]; - if (instancesList.length === 0) return; - randomInstance = utils.getRandomInstance(instancesList) - path = "/"; - } - else if (searchFrontend == 'whoogle') { - let instancesList; - if (searchProtocol == 'normal') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]; - if (searchProtocol == 'tor') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]; - if (searchProtocol == 'i2p') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects]; - if (instancesList.length === 0) return; - randomInstance = utils.getRandomInstance(instancesList) - path = "/search"; - } - - if ( - ((url.hostname.includes('google') || url.hostname.includes('bing')) && !url.searchParams.has('q')) || - (url.hostname.includes('yandex') && !url.searchParams.has('text')) - ) path = '/'; - - let searchQuery = ""; - if ( - ( - url.hostname.includes('google') || - url.hostname.includes('bing') || - url.hostname.includes('search.libredirect.invalid') - ) && - url.searchParams.has('q') - ) searchQuery = `?q=${url.searchParams.get('q')}`; - if (url.hostname.includes('yandex') && url.searchParams.has('text')) searchQuery = `?q=${url.searchParams.get('text')}`; - - return `${randomInstance}${path}${searchQuery}`; -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(url); - if (![ - ...searchRedirects.searx.normal, - ...searchRedirects.searx.tor, - ...searchRedirects.searx.i2p, - - ...searchRedirects.searxng.normal, - ...searchRedirects.searxng.tor, - ...searchRedirects.searxng.i2p, - - ...searchRedirects.whoogle.normal, - ...searchRedirects.whoogle.tor, - ...searchRedirects.whoogle.i2p, - - ...searxNormalCustomRedirects, - ...searxTorCustomRedirects, - ...searxI2pCustomRedirects, - - ...searxngNormalCustomRedirects, - ...searxngTorCustomRedirects, - ...searxngI2pCustomRedirects, - - ...whoogleNormalCustomRedirects, - ...whoogleTorCustomRedirects, - ...whoogleI2pCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (searchProtocol == 'normal') { - if (searchFrontend == 'searx') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]; - else if (searchFrontend == 'searxng') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]; - else if (searchFrontend == 'whoogle') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]; - } - else if (searchProtocol == 'tor') { - if (searchFrontend == 'searx') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]; - else if (searchFrontend == 'searxng') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]; - else if (searchFrontend == 'whoogle') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]; - } - else if (searchProtocol == 'i2p') { - if (searchFrontend == 'searx') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]; - else if (searchFrontend == 'searxng') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]; - else if (searchFrontend == 'whoogle') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects]; - } - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(async resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.searx = dataJson.searx; - redirects.searxng = dataJson.searxng; - redirects.whoogle = dataJson.whoogle; - - browser.storage.local.get('cloudflareList', async r => { - whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]; - searxNormalRedirectsChecks = [...redirects.searx.normal]; - searxngNormalRedirectsChecks = [...redirects.searxng.normal]; - for (const instance of r.cloudflareList) { - let i; - - i = whoogleNormalRedirectsChecks.indexOf(instance); - if (i > -1) whoogleNormalRedirectsChecks.splice(i, 1); - - i = searxNormalRedirectsChecks.indexOf(instance); - if (i > -1) searxNormalRedirectsChecks.splice(i, 1); - - i = searxngNormalRedirectsChecks.indexOf(instance); - if (i > -1) searxngNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableSearch: false, - searchFrontend: 'searxng', - searchRedirects: redirects, - searxngCustomSettings: false, - searchProtocol: 'normal', - - whoogleNormalRedirectsChecks: whoogleNormalRedirectsChecks, - whoogleNormalCustomRedirects: [], - - whoogleTorRedirectsChecks: [...redirects.whoogle.tor], - whoogleTorCustomRedirects: [], - - whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p], - whoogleI2pCustomRedirects: [], - - searxNormalRedirectsChecks: searxNormalRedirectsChecks, - searxNormalCustomRedirects: [], - - searxTorRedirectsChecks: [...redirects.searx.tor], - searxTorCustomRedirects: [], - - searxI2pRedirectsChecks: [...redirects.searx.i2p], - searxI2pCustomRedirects: [], - - searxngNormalRedirectsChecks: searxngNormalRedirectsChecks, - searxngNormalCustomRedirects: [], - - searxngTorRedirectsChecks: [...redirects.searxng.tor], - searxngTorCustomRedirects: [], - - searxngI2pRedirectsChecks: [...redirects.searxng.i2p], - searxngI2pCustomRedirects: [], - }) - resolve(); - }) - }) - }) -} - -export default { - setRedirects, - initSearxCookies, - setSearxCookies, - initSearxngCookies, - setSearxngCookies, - redirect, - initDefaults, - switchInstance, -}; diff --git a/src/assets/javascripts/helpers/sendTargets.js b/src/assets/javascripts/helpers/sendTargets.js deleted file mode 100644 index a3e87268..00000000 --- a/src/assets/javascripts/helpers/sendTargets.js +++ /dev/null @@ -1,149 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -const targets = [ - /^https?:\/{2}send\.libredirect\.invalid\/$/, - /^ https ?: \/\/send\.firefox\.com\/$/, - /^https?:\/{2}sendfiles\.online\/$/ -]; - -let redirects = { - "send": { - "normal": [], - "tor": [] - } -} -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects.send = val; - sendNormalRedirectsChecks = [...redirects.send.normal]; - for (const instance of r.cloudflareList) { - const a = sendNormalRedirectsChecks.indexOf(instance); - if (a > -1) sendNormalRedirectsChecks.splice(a, 1); - } - browser.storage.local.set({ - sendTargetsRedirects: redirects, - sendNormalRedirectsChecks, - }) - }) -} - -let - disableSendTarget, - sendTargetsRedirects, - sendNormalRedirectsChecks, - sendNormalCustomRedirects, - sendTorRedirectsChecks, - sendTorCustomRedirects, - sendTargetsProtocol; - -function init() { - return new Promise(resolve => { - browser.storage.local.get( - [ - "disableSendTarget", - "sendTargetsRedirects", - "sendTargetsProtocol", - "sendNormalRedirectsChecks", - "sendNormalCustomRedirects", - "sendTorRedirectsChecks", - "sendTorCustomRedirects", - ], - r => { - disableSendTarget = r.disableSendTarget; - sendTargetsRedirects = r.sendTargetsRedirects; - sendNormalRedirectsChecks = r.sendNormalRedirectsChecks; - sendNormalCustomRedirects = r.sendNormalCustomRedirects; - sendTorRedirectsChecks = r.sendTorRedirectsChecks; - sendTorCustomRedirects = r.sendTorCustomRedirects; - sendTargetsProtocol = r.sendTargetsProtocol; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function all() { - return [ - ...sendTargetsRedirects.send.normal, - ...sendTargetsRedirects.send.tor, - ...sendNormalCustomRedirects, - ...sendTorRedirectsChecks, - ...sendTorCustomRedirects, - ]; -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - if (url.pathname != '/') { resolve(); return; } - - let instancesList; - if (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]; - else if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]; - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function redirect(url, type, initiator) { - if (disableSendTarget) return; - if (type != "main_frame") return; - if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return; - if (!targets.some(rx => rx.test(url.href))) return; - - let instancesList; - if (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]; - if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList); - return randomInstance; -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.send = dataJson.send; - browser.storage.local.get('cloudflareList', async r => { - sendNormalRedirectsChecks = [...redirects.send.normal]; - for (const instance of r.cloudflareList) { - let i = sendNormalRedirectsChecks.indexOf(instance); - if (i > -1) sendNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableSendTarget: false, - sendTargetsRedirects: redirects, - - sendNormalRedirectsChecks: sendNormalRedirectsChecks, - sendNormalCustomRedirects: [], - - sendTorRedirectsChecks: [...redirects.send.tor], - sendTorCustomRedirects: [], - - sendTargetsProtocol: "normal", - }) - resolve(); - }) - }) - }) -} - -export default { - setRedirects, - redirect, - switchInstance, - initDefaults, -}; diff --git a/src/assets/javascripts/helpers/tiktok.js b/src/assets/javascripts/helpers/tiktok.js deleted file mode 100644 index 750744e6..00000000 --- a/src/assets/javascripts/helpers/tiktok.js +++ /dev/null @@ -1,175 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -const targets = [ - /^https?:\/{2}(www\.|)tiktok\.com.*/ -]; - -let redirects = { - "proxiTok": { - "normal": [], - "tor": [] - } -} -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects.proxiTok = val; - proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]; - for (const instance of r.cloudflareList) { - const a = proxiTokNormalRedirectsChecks.indexOf(instance); - if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1); - } - browser.storage.local.set({ - tiktokRedirects: redirects, - proxiTokNormalRedirectsChecks - }) - }) -} - -function initProxiTokCookies(test, from) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(from); - if (![ - ...proxiTokNormalRedirectsChecks, - ...proxiTokNormalCustomRedirects, - ...proxiTokTorRedirectsChecks, - ...proxiTokTorCustomRedirects, - ].includes(protocolHost)) resolve(); - - if (!test) { - let checkedInstances; - if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects] - else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects] - for (const to of checkedInstances) { - utils.copyCookie('proxitok', from, to, 'theme'); - utils.copyCookie('proxitok', from, to, 'api-legacy'); - } - } - resolve(true); - }) -} - -function setProxiTokCookies() { - return new Promise(resolve => { - if (disableTiktok || tiktokProtocol === undefined) { resolve(); return; } - let checkedInstances; - if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects] - else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('proxitok', to, 'theme'); - utils.getCookiesFromStorage('proxitok', to, 'api-legacy'); - } - resolve(); - }) -} - -let - disableTiktok, - tiktokProtocol, - tiktokRedirects, - proxiTokNormalRedirectsChecks, - proxiTokNormalCustomRedirects, - proxiTokTorRedirectsChecks, - proxiTokTorCustomRedirects; - -function init() { - return new Promise(async resolve => { - browser.storage.local.get( - [ - "disableTiktok", - "tiktokProtocol", - "tiktokRedirects", - "proxiTokNormalRedirectsChecks", - "proxiTokNormalCustomRedirects", - "proxiTokTorRedirectsChecks", - "proxiTokTorCustomRedirects", - ], - r => { - disableTiktok = r.disableTiktok; - tiktokProtocol = r.tiktokProtocol; - tiktokRedirects = r.tiktokRedirects; - proxiTokNormalRedirectsChecks = r.proxiTokNormalRedirectsChecks; - proxiTokNormalCustomRedirects = r.proxiTokNormalCustomRedirects; - proxiTokTorRedirectsChecks = r.proxiTokTorRedirectsChecks; - proxiTokTorCustomRedirects = r.proxiTokTorCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -// https://www.tiktok.com/@keysikaspol/video/7061265241887345946 -// https://www.tiktok.com/@keysikaspol -function redirect(url, type, initiator) { - if (disableTiktok) return; - if (type != "main_frame") return; - const all = [ - ...tiktokRedirects.proxiTok.normal, - ...proxiTokNormalCustomRedirects - ]; - if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return; - if (!targets.some(rx => rx.test(url.href))) return; - - let instancesList; - if (tiktokProtocol == 'normal') instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]; - if (tiktokProtocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList); - return `${randomInstance}${url.pathname}`; -} - -function reverse(url) { - return new Promise(async resolve => { - await init(); - let protocolHost = utils.protocolHost(url); - const all = [ - ...tiktokRedirects.proxiTok.normal, - ...tiktokRedirects.proxiTok.tor, - ...proxiTokNormalCustomRedirects, - ...proxiTokTorCustomRedirects - ]; - if (!all.includes(protocolHost)) { resolve(); return; } - - resolve(`https://tiktok.com${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(async resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.proxiTok = dataJson.proxiTok; - await browser.storage.local.set({ - disableTiktok: false, - tiktokProtocol: "normal", - - tiktokRedirects: redirects, - - proxiTokNormalRedirectsChecks: [...redirects.proxiTok.normal], - proxiTokNormalCustomRedirects: [], - - proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor], - proxiTokTorCustomRedirects: [], - }); - resolve(); - }); - }) -} - -export default { - setRedirects, - - redirect, - reverse, - - initProxiTokCookies, - setProxiTokCookies, - - initDefaults -}; diff --git a/src/assets/javascripts/helpers/translate/get_lingva_preferences.js b/src/assets/javascripts/helpers/translate/get_lingva_preferences.js deleted file mode 100644 index f04ea3dc..00000000 --- a/src/assets/javascripts/helpers/translate/get_lingva_preferences.js +++ /dev/null @@ -1,10 +0,0 @@ -window.browser = window.browser || window.chrome; - -browser.storage.local.set( - { - ['lingva_lingva_chakra-ui-color-mode']: localStorage.getItem('chakra-ui-color-mode'), - lingva_lingva_isauto: localStorage.getItem('isauto'), - lingva_lingva_source: localStorage.getItem('source'), - lingva_lingva_target: localStorage.getItem('target'), - } -) diff --git a/src/assets/javascripts/helpers/translate/set_lingva_preferences.js b/src/assets/javascripts/helpers/translate/set_lingva_preferences.js deleted file mode 100644 index 01a3b85e..00000000 --- a/src/assets/javascripts/helpers/translate/set_lingva_preferences.js +++ /dev/null @@ -1,19 +0,0 @@ -window.browser = window.browser || window.chrome; - -browser.storage.local.get( - [ - "lingva_chakra-ui-color-mode", - "lingva_isauto", - "lingva_source", - "lingva_target", - ], - r => { - if (r['lingva_chakra-ui-color-mode'] !== undefined) localStorage.setItem('chakra-ui-color-mode', r['lingva_chakra-ui-color-mode']); - if (r.lingva_isauto !== undefined) localStorage.setItem('isauto', r.lingva_isauto); - console.log('r.lingva_isauto', r.lingva_isauto, localStorage.getItem('isauto')) - if (r.lingva_source !== undefined) localStorage.setItem('source', r.lingva_source); - if (r.lingva_target !== undefined) localStorage.setItem('target', r.lingva_target); - - window.close(); - } -) diff --git a/src/assets/javascripts/helpers/translate/translate.js b/src/assets/javascripts/helpers/translate/translate.js deleted file mode 100644 index 74400040..00000000 --- a/src/assets/javascripts/helpers/translate/translate.js +++ /dev/null @@ -1,295 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from '../utils.js' - -const targets = [ - /^https?:\/{2}translate\.google(\.[a-z]{2,3}){1,2}\//, -]; - -let redirects = { - "simplyTranslate": { - "normal": [], - "tor": [] - }, - "lingva": { - "normal": [], - "tor": [] - } -}; - -let - translateDisable, - translateFrontend, - translateProtocol, - translateRedirects, - simplyTranslateNormalRedirectsChecks, - simplyTranslateNormalCustomRedirects, - simplyTranslateTorRedirectsChecks, - simplyTranslateTorCustomRedirects, - lingvaNormalRedirectsChecks, - lingvaNormalCustomRedirects, - lingvaTorRedirectsChecks, - lingvaTorCustomRedirects; - -function init() { - return new Promise(resolve => { - browser.storage.local.get( - [ - "translateDisable", - "translateFrontend", - "translateProtocol", - "translateRedirects", - - "simplyTranslateNormalRedirectsChecks", - "simplyTranslateNormalCustomRedirects", - "simplyTranslateTorRedirectsChecks", - "simplyTranslateTorCustomRedirects", - - "lingvaNormalRedirectsChecks", - "lingvaNormalCustomRedirects", - "lingvaTorRedirectsChecks", - "lingvaTorCustomRedirects", - ], - r => { - translateDisable = r.translateDisable; - translateFrontend = r.translateFrontend; - translateProtocol = r.translateProtocol; - translateRedirects = r.translateRedirects; - simplyTranslateNormalRedirectsChecks = r.simplyTranslateNormalRedirectsChecks; - simplyTranslateNormalCustomRedirects = r.simplyTranslateNormalCustomRedirects; - simplyTranslateTorRedirectsChecks = r.simplyTranslateTorRedirectsChecks; - simplyTranslateTorCustomRedirects = r.simplyTranslateTorCustomRedirects; - lingvaNormalRedirectsChecks = r.lingvaNormalRedirectsChecks; - lingvaNormalCustomRedirects = r.lingvaNormalCustomRedirects; - lingvaTorRedirectsChecks = r.lingvaTorRedirectsChecks; - lingvaTorCustomRedirects = r.lingvaTorCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects = val; - simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]; - lingvaNormalRedirectsChecks = [...redirects.lingva.normal] - for (const instance of r.cloudflareList) { - const a = simplyTranslateNormalRedirectsChecks.indexOf(instance); - if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1); - - const b = lingvaNormalRedirectsChecks.indexOf(instance); - if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1); - } - browser.storage.local.set({ - translateRedirects: redirects, - simplyTranslateNormalRedirectsChecks, - simplyTranslateTorRedirectsChecks: redirects.simplyTranslate.tor, - lingvaNormalRedirectsChecks, - lingvaTorRedirectsChecks: redirects.lingva.tor, - }) - }) -} - -function initLingvaLocalStorage(test, url, tabId) { - return new Promise(async resolve => { - await init(); - if (translateDisable || translateFrontend != 'lingva') { resolve(); return; } - const protocolHost = utils.protocolHost(url); - if (![ - ...lingvaNormalRedirectsChecks, - ...lingvaNormalCustomRedirects, - ...lingvaTorRedirectsChecks, - ...lingvaTorCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - if (!test) { - browser.tabs.executeScript( - tabId, - { file: "/assets/javascripts/helpers/translate/get_lingva_preferences.js", runAt: "document_start" } - ); - - let checkedInstances; - if (translateProtocol == 'normal') checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]; - if (translateProtocol == 'tor') checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]; - const i = checkedInstances.indexOf(protocolHost); - if (i !== -1) checkedInstances.splice(i, 1); - if (checkedInstances.length === 0) { resolve(); return; } - for (const to of checkedInstances) - browser.tabs.create( - { url: to }, - tab => browser.tabs.executeScript(tab.id, { file: "/assets/javascripts/helpers/translate/set_lingva_preferences.js", runAt: "document_start" }) - ); - } - resolve(true); - } - ) -} - -function initSimplyTranslateCookies(test, from) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(from); - if (![ - ...simplyTranslateNormalRedirectsChecks, - ...simplyTranslateNormalCustomRedirects, - ...simplyTranslateTorRedirectsChecks, - ...simplyTranslateTorCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - if (!test) { - let checkedInstances; - if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects] - else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects] - for (const to of checkedInstances) { - utils.copyCookie('simplyTranslate', from, to, 'from_lang'); - utils.copyCookie('simplyTranslate', from, to, 'to_lang'); - utils.copyCookie('simplyTranslate', from, to, 'tts_enabled'); - utils.copyCookie('simplyTranslate', from, to, 'use_text_fields'); - } - } - resolve(true); - } - ) -} - -function setSimplyTranslateCookies() { - return new Promise(async resolve => { - await init(); - if (translateDisable || translateFrontend != 'simplyTranslate') { resolve(); return; } - let checkedInstances; - if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects] - else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('simplyTranslate', to, 'from_lang'); - utils.getCookiesFromStorage('simplyTranslate', to, 'to_lang'); - utils.getCookiesFromStorage('simplyTranslate', to, 'tts_enabled'); - utils.getCookiesFromStorage('simplyTranslate', to, 'use_text_fields'); - } - resolve(); - } - ) -} - -function redirect(url) { - if (translateDisable) return; - if (!targets.some(rx => rx.test(url.href))) return; - - if (translateFrontend == 'simplyTranslate') { - let instancesList; - if (translateProtocol == 'normal') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]; - if (translateProtocol == 'tor') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList) - return `${randomInstance}/${url.search}`; - } - else if (translateFrontend == 'lingva') { - let params_arr = url.search.split('&'); - params_arr[0] = params_arr[0].substring(1); - let params = {}; - for (let i = 0; i < params_arr.length; i++) { - let pair = params_arr[i].split('='); - params[pair[0]] = pair[1]; - } - let instancesList; - if (translateProtocol == 'normal') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]; - if (translateProtocol == 'tor') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList) - if (params.sl && params.tl && params.text) { - return `${randomInstance}/${params.sl}/${params.tl}/${params.text}` - } - return randomInstance; - } -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - if (translateDisable) { resolve(); return; } - const protocolHost = utils.protocolHost(url); - if (![ - ...translateRedirects.simplyTranslate.normal, - ...translateRedirects.simplyTranslate.tor, - - ...simplyTranslateNormalCustomRedirects, - ...simplyTranslateTorCustomRedirects, - - ...translateRedirects.lingva.normal, - ...translateRedirects.lingva.tor, - - ...lingvaNormalCustomRedirects, - ...lingvaTorCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (translateProtocol == 'normal') { - if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]; - else if (translateFrontend == 'lingva') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]; - } - else if (translateProtocol == 'tor') { - if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]; - else if (translateFrontend == 'lingva') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]; - } - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(async resolve => { - fetch('/instances/data.json').then(response => response.text()).then(data => { - let dataJson = JSON.parse(data); - redirects.simplyTranslate = dataJson.simplyTranslate; - redirects.lingva = dataJson.lingva; - browser.storage.local.get('cloudflareList', - async r => { - simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]; - lingvaNormalRedirectsChecks = [...redirects.lingva.normal] - for (const instance of r.cloudflareList) { - const a = simplyTranslateNormalRedirectsChecks.indexOf(instance); - if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1); - - const b = lingvaNormalRedirectsChecks.indexOf(instance); - if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1); - } - await browser.storage.local.set({ - translateDisable: false, - translateFrontend: "simplyTranslate", - translateProtocol: 'normal', - translateRedirects: redirects, - - simplyTranslateNormalRedirectsChecks: simplyTranslateNormalRedirectsChecks, - simplyTranslateNormalCustomRedirects: [], - simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor], - simplyTranslateTorCustomRedirects: [], - - lingvaNormalRedirectsChecks: lingvaNormalRedirectsChecks, - lingvaNormalCustomRedirects: [], - lingvaTorRedirectsChecks: [...redirects.lingva.tor], - lingvaTorCustomRedirects: [], - }) - resolve(); - }) - }) - }) -} - -export default { - initSimplyTranslateCookies, - setSimplyTranslateCookies, - initLingvaLocalStorage, - setRedirects, - redirect, - initDefaults, - switchInstance, -}; diff --git a/src/assets/javascripts/helpers/twitter.js b/src/assets/javascripts/helpers/twitter.js deleted file mode 100644 index dc48f9b1..00000000 --- a/src/assets/javascripts/helpers/twitter.js +++ /dev/null @@ -1,241 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -const targets = [ - /^https?:\/{2}(www\.|mobile\.|)twitter\.com/, - /^https?:\/{2}(pbs\.|video\.|)twimg\.com/, - /^https?:\/{2}platform\.twitter\.com\/embed/, - /^https?:\/{2}t\.co/ -]; - -let redirects = { - "nitter": { - "normal": [], - "tor": [] - }, -}; - -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects.nitter = val; - nitterNormalRedirectsChecks = [...redirects.nitter.normal]; - for (const instance of r.cloudflareList) { - let i = nitterNormalRedirectsChecks.indexOf(instance); - if (i > -1) nitterNormalRedirectsChecks.splice(i, 1); - } - browser.storage.local.set({ - twitterRedirects: redirects, - nitterNormalRedirectsChecks, - nitterTorRedirectsChecks: [...redirects.nitter.tor] - }) - }) -} - -let - disableTwitter, - twitterProtocol, - twitterRedirects, - nitterNormalRedirectsChecks, - nitterNormalCustomRedirects, - nitterTorRedirectsChecks, - nitterTorCustomRedirects; - -function init() { - return new Promise(async resolve => { - browser.storage.local.get( - [ - "disableTwitter", - "twitterProtocol", - "twitterRedirects", - "nitterNormalRedirectsChecks", - "nitterNormalCustomRedirects", - "nitterTorRedirectsChecks", - "nitterTorCustomRedirects", - ], - r => { - disableTwitter = r.disableTwitter; - twitterProtocol = r.twitterProtocol; - twitterRedirects = r.twitterRedirects; - nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks; - nitterNormalCustomRedirects = r.nitterNormalCustomRedirects; - nitterTorRedirectsChecks = r.nitterTorRedirectsChecks; - nitterTorCustomRedirects = r.nitterTorCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function all() { - return [ - ...nitterNormalRedirectsChecks, - ...nitterTorRedirectsChecks, - ...nitterNormalCustomRedirects, - ...nitterTorCustomRedirects, - ]; -} - -function redirect(url, initiator) { - if (disableTwitter) return; - if (!targets.some(rx => rx.test(url.href))) return; - if (url.pathname.split("/").includes("home")) return; - if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; - - let instancesList; - if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]; - else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList); - // https://pbs.twimg.com/profile_images/648888480974508032/66_cUYfj_400x400.jpg - if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") - return `${randomInstance}/pic/${encodeURIComponent(`${url.host}${url.pathname}`)}`; - else if (url.pathname.split("/").includes("tweets")) - return `${randomInstance}${url.pathname.replace("/tweets", "")}${url.search}`; - else if (url.host == 't.co') - return `${randomInstance}/t.co${url.pathname}`; - else - return `${randomInstance}${url.pathname}${url.search}`; -} - -function reverse(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve; return; } - resolve(`https://twitter.com${url.pathname}${url.search}`); - }) -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost)) { resolve(); return; } - let instancesList; - if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]; - else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]; - - let index = instancesList.indexOf(protocolHost); - if (index > -1) instancesList.splice(index, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function removeXFrameOptions(e) { - let url = new URL(e.url); - let protocolHost = utils.protocolHost(url); - if (!all().includes(protocolHost) || e.type != 'sub_frame') return; - let isChanged = false; - for (const i in e.responseHeaders) if (e.responseHeaders[i].name == 'x-frame-options') { - e.responseHeaders.splice(i, 1); - isChanged = true; - } - if (isChanged) return { responseHeaders: e.responseHeaders }; -} - -function initNitterCookies(test, from) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(from); - if (!all().includes(protocolHost) - ) { resolve(); return; } - - if (!test) { - let checkedInstances; - if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects] - else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects] - for (const to of checkedInstances) { - utils.copyCookie('nitter', from, to, 'theme'); - utils.copyCookie('nitter', from, to, 'infiniteScroll'); - utils.copyCookie('nitter', from, to, 'stickyProfile'); - utils.copyCookie('nitter', from, to, 'bidiSupport'); - utils.copyCookie('nitter', from, to, 'hideTweetStats'); - utils.copyCookie('nitter', from, to, 'hideBanner'); - utils.copyCookie('nitter', from, to, 'hidePins'); - utils.copyCookie('nitter', from, to, 'hideReplies'); - utils.copyCookie('nitter', from, to, 'squareAvatars'); - utils.copyCookie('nitter', from, to, 'mp4Playback'); - utils.copyCookie('nitter', from, to, 'hlsPlayback'); - utils.copyCookie('nitter', from, to, 'proxyVideos'); - utils.copyCookie('nitter', from, to, 'muteVideos'); - utils.copyCookie('nitter', from, to, 'autoplayGifs'); - } - } - resolve(true); - }) -} - -function setNitterCookies() { - return new Promise(async resolve => { - await init(); - if (disableTwitter || twitterProtocol === undefined) { resolve(); return; } - let checkedInstances; - if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects] - else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('nitter', to, 'theme'); - utils.getCookiesFromStorage('nitter', to, 'infiniteScroll'); - utils.getCookiesFromStorage('nitter', to, 'stickyProfile'); - utils.getCookiesFromStorage('nitter', to, 'bidiSupport'); - utils.getCookiesFromStorage('nitter', to, 'hideTweetStats'); - utils.getCookiesFromStorage('nitter', to, 'hideBanner'); - utils.getCookiesFromStorage('nitter', to, 'hidePins'); - utils.getCookiesFromStorage('nitter', to, 'hideReplies'); - utils.getCookiesFromStorage('nitter', to, 'squareAvatars'); - utils.getCookiesFromStorage('nitter', to, 'mp4Playback'); - utils.getCookiesFromStorage('nitter', to, 'hlsPlayback'); - utils.getCookiesFromStorage('nitter', to, 'proxyVideos'); - utils.getCookiesFromStorage('nitter', to, 'muteVideos'); - utils.getCookiesFromStorage('nitter', to, 'autoplayGifs'); - } - resolve(); - } - ) -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(data => { - let dataJson = JSON.parse(data); - redirects.nitter = dataJson.nitter; - browser.storage.local.get('cloudflareList', async r => { - nitterNormalRedirectsChecks = [...redirects.nitter.normal]; - for (const instance of r.cloudflareList) { - let i = nitterNormalRedirectsChecks.indexOf(instance); - if (i > -1) nitterNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableTwitter: false, - twitterRedirects: redirects, - twitterProtocol: "normal", - - nitterNormalRedirectsChecks, - nitterNormalCustomRedirects: [], - - nitterTorRedirectsChecks: [...redirects.nitter.tor], - nitterTorCustomRedirects: [], - }) - resolve(); - }) - }) - }) -} - -export default { - setRedirects, - redirect, - switchInstance, - reverse, - removeXFrameOptions, - initNitterCookies, - setNitterCookies, - initDefaults, -}; diff --git a/src/assets/javascripts/helpers/utils.js b/src/assets/javascripts/helpers/utils.js deleted file mode 100644 index 16fdaae7..00000000 --- a/src/assets/javascripts/helpers/utils.js +++ /dev/null @@ -1,456 +0,0 @@ -window.browser = window.browser || window.chrome; -import twitterHelper from "./twitter.js"; -import youtubeHelper from "./youtube/youtube.js"; -import instagramHelper from "./instagram.js"; -import mediumHelper from "./medium.js"; -import redditHelper from "./reddit.js"; -import searchHelper from "./search.js"; -import translateHelper from "./translate/translate.js"; -import wikipediaHelper from "./wikipedia.js"; -import peertubeHelper from "./peertube.js"; -import lbryHelper from "./lbry.js"; -import sendTargetsHelper from "./sendTargets.js"; -import tiktokHelper from "./tiktok.js"; -import imgurHelper from "./imgur.js"; -import localise from '../localise.js' - -function getRandomInstance(instances) { - return instances[~~(instances.length * Math.random())]; -} - -let cloudflareList = []; -async function initCloudflareList() { - return new Promise(resolve => { - fetch('/instances/blocklist.json').then(response => response.text()).then(data => { - cloudflareList = JSON.parse(data); - resolve(); - }) - }); -} - -function updateInstances() { - return new Promise(async resolve => { - let http = new XMLHttpRequest(); - http.open('GET', 'https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json', false); - http.send(null); - if (http.status === 200) { - await initCloudflareList(); - const instances = JSON.parse(http.responseText); - - youtubeHelper.setRedirects({ 'invidious': instances.invidious, 'piped': instances.piped, }) - twitterHelper.setRedirects(instances.nitter); - instagramHelper.setRedirects(instances.bibliogram); - redditHelper.setRedirects({ 'libreddit': instances.libreddit, 'teddit': instances.teddit }); - translateHelper.setRedirects({ "simplyTranslate": instances.simplyTranslate, "lingva": instances.lingva }); - searchHelper.setRedirects({ 'searx': instances.searx, 'searxng': instances.searxng, 'whoogle': instances.whoogle }); - wikipediaHelper.setRedirects(instances.wikiless); - mediumHelper.setRedirects(instances.scribe); - sendTargetsHelper.setRedirects(instances.send); - tiktokHelper.setRedirects(instances.proxiTok); - - console.info("Successfully updated Instances"); - resolve(true); return; - } - resolve() - }) -} - -function protocolHost(url) { - if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}`; - return `${url.protocol}//${url.host}`; -} - -async function processDefaultCustomInstances(target, name, protocol, document) { - - function camelCase(str) { - return str.charAt(0).toUpperCase() + str.slice(1); - } - let latencyKey = `${name}Latency`; - let instancesLatency; - await browser.storage.local.get(latencyKey, r => instancesLatency = r[latencyKey] ?? []); - let nameProtocolElement = document.getElementById(name).getElementsByClassName(protocol)[0]; - - let nameCustomInstances = []; - let nameCheckListElement = nameProtocolElement.getElementsByClassName('checklist')[0]; - - await initCloudflareList(); - - - let nameDefaultRedirects; - - let redirectsChecks = `${name}${camelCase(protocol)}RedirectsChecks`; - let customRedirects = `${name}${camelCase(protocol)}CustomRedirects`; - let redirectsKey = `${target}Redirects`; - - let redirects; - - async function getFromStorage() { - return new Promise(async resolve => { - browser.storage.local.get( - [ - redirectsChecks, - customRedirects, - redirectsKey - ], - r => { - nameDefaultRedirects = r[redirectsChecks]; - nameCustomInstances = r[customRedirects]; - redirects = r[redirectsKey]; - resolve(); - } - ) - }) - } - await getFromStorage(); - - function calcNameCheckBoxes() { - let isTrue = true; - for (const item of redirects[name][protocol]) - if (!nameDefaultRedirects.includes(item)) { - isTrue = false; - break; - } - for (const element of nameCheckListElement.getElementsByTagName('input')) - element.checked = nameDefaultRedirects.includes(element.className) - if (nameDefaultRedirects.length == 0) isTrue = false; - nameProtocolElement.getElementsByClassName('toogle-all')[0].checked = isTrue; - } - nameCheckListElement.innerHTML = - [ - `
- Toggle All - -
`, - ...redirects[name][protocol].map( - x => { - let cloudflare = cloudflareList.includes(x) ? ' cloudflare' : ''; - - let ms = instancesLatency[x]; - let latencyColor = (ms <= 1000 ? "green" : ms <= 2000 ? "orange" : "red"); - let latencyLimit; - if (ms == 5000) latencyLimit = '5000ms+'; - else if (ms > 5000) latencyLimit = `ERROR: ${ms - 5000}`; - else latencyLimit = ms + 'ms'; - - let latency = x in instancesLatency ? '' + latencyLimit + '' : ''; - - return `
- ${x}${cloudflare} ${latency} - -
`; - } - ), - ].join('\n
\n'); - - localise.localisePage(); - - calcNameCheckBoxes(); - nameProtocolElement.getElementsByClassName('toogle-all')[0].addEventListener("change", async event => { - if (event.target.checked) - nameDefaultRedirects = [...redirects[name][protocol]]; - else - nameDefaultRedirects = []; - - await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects }); - calcNameCheckBoxes(); - }); - - for (let element of nameCheckListElement.getElementsByTagName('input')) { - if (element.className != 'toogle-all') - nameProtocolElement.getElementsByClassName(element.className)[0].addEventListener("change", async event => { - if (event.target.checked) - nameDefaultRedirects.push(element.className) - else { - let index = nameDefaultRedirects.indexOf(element.className); - if (index > -1) nameDefaultRedirects.splice(index, 1); - } - await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects }); - calcNameCheckBoxes(); - }); - } - - function calcNameCustomInstances() { - nameProtocolElement.getElementsByClassName('custom-checklist')[0].innerHTML = - nameCustomInstances.map( - x => `
- ${x} - -
-
` - ).join('\n'); - - for (const item of nameCustomInstances) { - nameProtocolElement.getElementsByClassName(`clear-${item}`)[0].addEventListener("click", async () => { - let index = nameCustomInstances.indexOf(item); - if (index > -1) nameCustomInstances.splice(index, 1); - await browser.storage.local.set({ [customRedirects]: nameCustomInstances }); - calcNameCustomInstances(); - }); - } - } - calcNameCustomInstances(); - nameProtocolElement.getElementsByClassName('custom-instance-form')[0].addEventListener("submit", async event => { - event.preventDefault(); - let nameCustomInstanceInput = nameProtocolElement.getElementsByClassName('custom-instance')[0]; - let url = new URL(nameCustomInstanceInput.value); - let protocolHostVar = protocolHost(url); - if (nameCustomInstanceInput.validity.valid && !redirects[name][protocol].includes(protocolHostVar)) { - if (!nameCustomInstances.includes(protocolHostVar)) { - nameCustomInstances.push(protocolHostVar) - await browser.storage.local.set({ [customRedirects]: nameCustomInstances }); - nameCustomInstanceInput.value = ''; - } - calcNameCustomInstances(); - } - }) -} - -function isRtl() { - return ["ar", "iw", "ku", "fa", "ur"].includes(browser.i18n.getUILanguage()) -} - -function getIp(href) { - return new Promise(resolve => { - let host = new URL(href).hostname; - let http = new XMLHttpRequest(); - http.open("GET", `https://dns.google/resolve?name=${host}`, /*async*/true); - http.onreadystatechange = () => { - if (http.readyState == 4 && http.status == 200) { - let r = JSON.parse(http.responseText); - resolve(r.Answer[0].data) - } - }; - http.ontimeout = () => resolve() - http.onerror = () => resolve() - try { - http.send(null) - } - catch (exception) { - resolve() - } - }) -} - -async function ping(href) { - return new Promise(async resolve => { - let http = new XMLHttpRequest(); - http.open("GET", `${href}?_=${new Date().getTime()}`, /*async*/true); - http.timeout = 5000; - let started = new Date().getTime(); - http.onreadystatechange = () => { - if (http.readyState == 2) { - if (http.status == 200) { - let ended = new Date().getTime(); - http.abort(); - resolve(ended - started); - } - else - resolve(5000 + http.status) - } - }; - http.ontimeout = () => resolve(5000) - http.onerror = () => resolve() - try { - http.send(null); - } catch (exception) { - resolve() - } - }); -} - -async function testLatency(element, instances) { - return new Promise(async resolve => { - let myList = {}; - for (const href of instances) await ping(href).then(m => { - if (m) { - myList[href] = m; - let color; - if (m <= 1000) color = "green" - else if (m <= 2000) color = "orange" - else color = "red"; - - let text; - if (m == 5000) text = '5000ms+' - else if (m > 5000) text = `ERROR: ${m - 5000}`; - else text = `${m}ms`; - element.innerHTML = `${href}: ${text}`; - } - }) - resolve(myList); - }) -} - -function copyCookie(frontend, targetUrl, url, name) { - browser.cookies.get( - { url: protocolHost(targetUrl), name: name }, - r => { - if (r) { - browser.cookies.set({ url: url, name: name, value: r.value }) - browser.storage.local.set({ [`${frontend}_${name}`]: r.value }) - } - } - ) -} - -function getCookiesFromStorage(frontend, to, name) { - let key = `${frontend}_${name}`; - browser.storage.local.get( - key, - r => { - if (r[key] !== undefined) browser.cookies.set({ url: to, name: name, value: r[key] }) - } - ) -} - -function copyRaw(test, copyRawElement) { - return new Promise(resolve => { - browser.tabs.query( - { active: true, currentWindow: true }, async tabs => { - let currTab = tabs[0]; - if (currTab) { - let url; - try { url = new URL(currTab.url); } - catch { resolve(); return; } - let newUrl = await youtubeHelper.reverse(url); - if (!newUrl) newUrl = await twitterHelper.reverse(url); - if (!newUrl) newUrl = await instagramHelper.reverse(url); - if (!newUrl) newUrl = await tiktokHelper.reverse(url); - if (!newUrl) newUrl = await imgurHelper.reverse(url); - - if (newUrl) { - resolve(true); - if (test) return; - navigator.clipboard.writeText(newUrl); - if (copyRawElement) { - const textElement = copyRawElement.getElementsByTagName('h4')[0] - const oldHtml = textElement.innerHTML; - textElement.innerHTML = 'Copied'; - setTimeout(() => textElement.innerHTML = oldHtml, 1000); - } - } else resolve() - } - } - ) - }) -} - -function unify(test) { - return new Promise(resolve => { - browser.tabs.query( - { active: true, currentWindow: true }, - async tabs => { - let currTab = tabs[0] - if (currTab) { - let url; - try { url = new URL(currTab.url); } - catch { resolve(); return; } - - let result = await youtubeHelper.initInvidiousCookies(test, url); - if (!result) result = await youtubeHelper.initPipedLocalStorage(test, url, currTab.id); - if (!result) result = await youtubeHelper.initPipedMaterialLocalStorage(test, url, currTab.id); - - if (!result) result = await twitterHelper.initNitterCookies(test, url); - - if (!result) result = await redditHelper.initLibredditCookies(test, url); - if (!result) result = await redditHelper.initTedditCookies(test, url); - - if (!result) result = await searchHelper.initSearxCookies(test, url); - if (!result) result = await searchHelper.initSearxngCookies(test, url); - - if (!result) result = await tiktokHelper.initProxiTokCookies(test, url); - - if (!result) result = await wikipediaHelper.initWikilessCookies(test, url); - - if (!result) result = await translateHelper.initSimplyTranslateCookies(test, url); - if (!result) result = await translateHelper.initLingvaLocalStorage(test, url); - - if (result) { - resolve(true); - } else resolve() - } - } - ) - }) -} - -function switchInstance(test) { - return new Promise(resolve => { - browser.tabs.query({ active: true, currentWindow: true }, async tabs => { - let currTab = tabs[0]; - if (currTab) { - let url; - try { url = new URL(currTab.url); } - catch { resolve(); return }; - let newUrl = await youtubeHelper.switchInstance(url); - if (!newUrl) newUrl = await twitterHelper.switchInstance(url); - if (!newUrl) newUrl = await instagramHelper.switchInstance(url); - if (!newUrl) newUrl = await redditHelper.switchInstance(url); - if (!newUrl) newUrl = await searchHelper.switchInstance(url); - if (!newUrl) newUrl = await translateHelper.switchInstance(url); - if (!newUrl) newUrl = await mediumHelper.switchInstance(url); - if (!newUrl) newUrl = await sendTargetsHelper.switchInstance(url); - if (!newUrl) newUrl = await peertubeHelper.switchInstance(url); - if (!newUrl) newUrl = await lbryHelper.switchInstance(url); - if (!newUrl) newUrl = await imgurHelper.switchInstance(url); - if (!newUrl) newUrl = await wikipediaHelper.switchInstance(url); - - if (newUrl) { - if (!test) - browser.tabs.update({ url: newUrl }); - resolve(true) - } else resolve() - } - }) - }) -} - -function latency(name, frontend, document, location, splitNames) { - let latencyElement; - let latencyLabel; - if (splitNames == true) { - latencyElement = document.getElementById(`latency-${frontend}`); - latencyLabel = document.getElementById(`latency-${frontend}-label`); - } else { - latencyElement = document.getElementById("latency"); - latencyLabel = document.getElementById("latency-label"); - } - latencyElement.addEventListener("click", - async () => { - let reloadWindow = () => location.reload(); - latencyElement.addEventListener("click", reloadWindow); - let key = `${name}Redirects` - browser.storage.local.get( - key, - r => { - let redirects = r[key]; - const oldHtml = latencyLabel.innerHTML; - latencyLabel.innerHTML = '...'; - testLatency(latencyLabel, redirects[frontend].normal).then(r => { - browser.storage.local.set({ [`${frontend}Latency`]: r }); - latencyLabel.innerHTML = oldHtml; - processDefaultCustomInstances(name, frontend, 'normal', document); - latencyElement.removeEventListener("click", reloadWindow) - }); - } - ) - } - ); -} - -export default { - getRandomInstance, - updateInstances, - protocolHost, - processDefaultCustomInstances, - isRtl, - latency, - copyCookie, - getCookiesFromStorage, - switchInstance, - copyRaw, - unify, -} diff --git a/src/assets/javascripts/helpers/wikipedia.js b/src/assets/javascripts/helpers/wikipedia.js deleted file mode 100644 index 868bb01c..00000000 --- a/src/assets/javascripts/helpers/wikipedia.js +++ /dev/null @@ -1,220 +0,0 @@ -window.browser = window.browser || window.chrome; - -import utils from './utils.js' - -const targets = /^https?:\/{2}(([a-z]{1,}\.){0,})wikipedia\.org/ - -let redirects = { - "wikiless": { - "normal": [], - "tor": [], - "i2p": [] - } -}; -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects.wikiless = val; - wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]; - for (const instance of r.cloudflareList) { - const a = wikilessNormalRedirectsChecks.indexOf(instance); - if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1); - } - browser.storage.local.set({ - wikipediaRedirects: redirects, - wikilessNormalRedirectsChecks - }) - }) -} - -let - disableWikipedia, - wikipediaRedirects, - wikipediaProtocol, - wikilessNormalRedirectsChecks, - wikilessTorRedirectsChecks, - wikilessI2pRedirectsChecks, - wikilessNormalCustomRedirects, - wikilessTorCustomRedirects, - wikilessI2pCustomRedirects; - -function init() { - return new Promise(async resolve => { - browser.storage.local.get( - [ - "disableWikipedia", - "wikipediaRedirects", - "wikipediaProtocol", - - "wikilessNormalRedirectsChecks", - "wikilessTorRedirectsChecks", - "wikilessI2pRedirectsChecks", - "wikilessNormalCustomRedirects", - "wikilessTorCustomRedirects", - "wikilessI2pCustomRedirects", - ], - r => { - disableWikipedia = r.disableWikipedia; - wikipediaRedirects = r.wikipediaRedirects; - wikipediaProtocol = r.wikipediaProtocol; - wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks; - wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks; - wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks; - wikilessNormalCustomRedirects = r.wikilessNormalCustomRedirects; - wikilessTorCustomRedirects = r.wikilessTorCustomRedirects; - wikilessI2pCustomRedirects = r.wikilessI2pCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function initWikilessCookies(test, from) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(from); - const all = [ - ...wikilessNormalRedirectsChecks, - ...wikilessNormalCustomRedirects, - ...wikilessTorRedirectsChecks, - ...wikilessTorCustomRedirects, - ...wikilessI2pRedirectsChecks, - ...wikilessI2pCustomRedirects, - ]; - if (!all.includes(protocolHost)) { resolve(); return; } - - if (!test) { - let checkedInstances; - if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects] - else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects] - else if (wikipediaProtocol == 'i2p') checkedInstances = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects] - - for (const to of checkedInstances) { - utils.copyCookie('wikiless', from, to, 'theme'); - utils.copyCookie('wikiless', from, to, 'default_lang'); - } - } - resolve(true); - }) -} - -function setWikilessCookies() { - return new Promise(async resolve => { - await init(); - if (disableWikipedia || wikipediaProtocol === undefined) { resolve(); return; } - let checkedInstances; - if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects] - else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects] - for (const to of checkedInstances) { - utils.getCookiesFromStorage('wikiless', to, 'theme'); - utils.getCookiesFromStorage('wikiless', to, 'default_lang'); - } - resolve(); - }) -} - -function redirect(url) { - if (disableWikipedia) return; - if (!targets.test(url.href)) return; - - 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 instancesList; - if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]; - else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]; - else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects]; - if (instancesList.length === 0) return; - const randomInstance = utils.getRandomInstance(instancesList) - - let link = `${randomInstance}${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]; - return link; -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - const wikipediaList = [ - ...wikipediaRedirects.wikiless.normal, - ...wikipediaRedirects.wikiless.tor, - ...wikipediaRedirects.wikiless.i2p, - - ...wikilessNormalCustomRedirects, - ...wikilessTorCustomRedirects, - ...wikilessI2pCustomRedirects - ]; - if (!wikipediaList.includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalCustomRedirects, ...wikilessNormalRedirectsChecks]; - else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorCustomRedirects, ...wikilessTorRedirectsChecks]; - else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]; - - let index = instancesList.indexOf(protocolHost); - if (index > -1) instancesList.splice(index, 1); - if (instancesList.length === 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.wikiless = dataJson.wikiless; - browser.storage.local.get('cloudflareList', async r => { - wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]; - for (const instance of r.cloudflareList) { - let i = wikilessNormalRedirectsChecks.indexOf(instance); - if (i > -1) wikilessNormalRedirectsChecks.splice(i, 1); - } - await browser.storage.local.set({ - disableWikipedia: true, - wikipediaRedirects: redirects, - wikipediaProtocol: "normal", - wikilessNormalRedirectsChecks: wikilessNormalRedirectsChecks, - wikilessTorRedirectsChecks: [...redirects.wikiless.tor], - wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p], - wikilessNormalCustomRedirects: [], - wikilessTorCustomRedirects: [], - wikilessI2pCustomRedirects: [], - }) - resolve(); - }) - }) - }) -} - -export default { - setRedirects, - - initWikilessCookies, - setWikilessCookies, - - redirect, - initDefaults, - switchInstance, -}; diff --git a/src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js b/src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js deleted file mode 100644 index 9d052f62..00000000 --- a/src/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js +++ /dev/null @@ -1,7 +0,0 @@ -window.browser = window.browser || window.chrome; - -browser.storage.local.set( - { - 'pipedMaterial_PREFERENCES': localStorage.getItem("PREFERENCES") - } -) \ No newline at end of file diff --git a/src/assets/javascripts/helpers/youtube/get_piped_preferences.js b/src/assets/javascripts/helpers/youtube/get_piped_preferences.js deleted file mode 100644 index 417d64df..00000000 --- a/src/assets/javascripts/helpers/youtube/get_piped_preferences.js +++ /dev/null @@ -1,24 +0,0 @@ -window.browser = window.browser || window.chrome; - -browser.storage.local.set( - { - 'piped_bufferGoal': localStorage.getItem("bufferGoal"), - 'piped_comments': localStorage.getItem("comments"), - 'piped_disableLBRY': localStorage.getItem("disableLBRY"), - 'piped_enabledCodecs': localStorage.getItem("enabledCodecs"), - 'piped_hl': localStorage.getItem("hl"), - 'piped_homepage': localStorage.getItem("homepage"), - 'piped_instance': localStorage.getItem("instance"), - 'piped_listen': localStorage.getItem("listen"), - 'piped_minimizeDescription': localStorage.getItem("minimizeDescription"), - 'piped_playerAutoPlay': localStorage.getItem("playerAutoPlay"), - 'piped_proxyLBRY': localStorage.getItem("proxyLBRY"), - 'piped_quality': localStorage.getItem("quality"), - 'piped_region': localStorage.getItem("region"), - 'piped_selectedSkip': localStorage.getItem("selectedSkip"), - 'piped_sponsorblock': localStorage.getItem("sponsorblock"), - 'piped_theme': localStorage.getItem("theme"), - 'piped_volume': localStorage.getItem("volume"), - 'piped_watchHistory': localStorage.getItem("watchHistory"), - } -) diff --git a/src/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js b/src/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js deleted file mode 100644 index 7415255a..00000000 --- a/src/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js +++ /dev/null @@ -1,10 +0,0 @@ -window.browser = window.browser || window.chrome; - -browser.storage.local.get( - "pipedMaterial_PREFERENCES", - r => { - if (r.pipedMaterial_PREFERENCES !== undefined) localStorage.setItem("PREFERENCES", r.pipedMaterial_PREFERENCES) - - window.close(); - } -) \ No newline at end of file diff --git a/src/assets/javascripts/helpers/youtube/set_piped_preferences.js b/src/assets/javascripts/helpers/youtube/set_piped_preferences.js deleted file mode 100644 index d5ce49ff..00000000 --- a/src/assets/javascripts/helpers/youtube/set_piped_preferences.js +++ /dev/null @@ -1,44 +0,0 @@ -window.browser = window.browser || window.chrome; - -browser.storage.local.get( - [ - "piped_bufferGoal", - "piped_comments", - "piped_disableLBRY", - "piped_enabledCodecs", - "piped_homepage", - "piped_listen", - "piped_minimizeDescription", - "piped_playerAutoPlay", - "piped_proxyLBRY", - "piped_quality", - "piped_region", - "piped_selectedSkip", - "piped_sponsorblock", - "piped_theme", - "piped_volume", - "piped_watchHistory", - ], - r => { - if (r.piped_bufferGoal !== undefined) localStorage.setItem("bufferGoal", r.piped_bufferGoal); - if (r.piped_comments !== undefined) localStorage.setItem("comments", r.piped_comments); - if (r.piped_disableLBRY !== undefined) localStorage.setItem("disableLBRY", r.piped_disableLBRY); - if (r.piped_hl !== undefined) localStorage.setItem("hl", r.piped_hl); - if (r.piped_enabledCodecs !== undefined) localStorage.setItem("enabledCodecs", r.piped_enabledCodecs); - if (r.piped_homepage !== undefined) localStorage.setItem("homepage", r.piped_homepage); - if (r.piped_instance !== undefined) localStorage.setItem("instance", r.piped_instance); - if (r.piped_listen !== undefined) localStorage.setItem("listen", r.piped_listen); - if (r.piped_minimizeDescription !== undefined) localStorage.setItem("minimizeDescription", r.piped_minimizeDescription); - if (r.piped_playerAutoPlay !== undefined) localStorage.setItem("playerAutoPlay", r.piped_playerAutoPlay); - if (r.piped_proxyLBRY !== undefined) localStorage.setItem("proxyLBRY", r.piped_proxyLBRY); - if (r.piped_quality !== undefined) localStorage.setItem("quality", r.piped_quality); - if (r.piped_region !== undefined) localStorage.setItem("region", r.piped_region); - if (r.piped_selectedSkip !== undefined) localStorage.setItem("selectedSkip", r.piped_selectedSkip); - if (r.piped_sponsorblock !== undefined) localStorage.setItem("sponsorblock", r.piped_sponsorblock); - if (r.piped_theme !== undefined) localStorage.setItem("theme", r.piped_theme); - if (r.piped_volume !== undefined) localStorage.setItem("volume", r.piped_volume); - if (r.piped_watchHistory !== undefined) localStorage.setItem("watchHistory", r.piped_watchHistory); - - window.close(); - } -) \ No newline at end of file diff --git a/src/assets/javascripts/helpers/youtube/youtube.js b/src/assets/javascripts/helpers/youtube/youtube.js deleted file mode 100644 index 564e99c0..00000000 --- a/src/assets/javascripts/helpers/youtube/youtube.js +++ /dev/null @@ -1,453 +0,0 @@ -"use strict"; - -window.browser = window.browser || window.chrome; - -import utils from '../utils.js' - -const targets = [ - /^https?:\/{2}(www\.|music\.|m\.|)youtube\.com(\/.*|$)/, - - /^https?:\/{2}img\.youtube\.com\/vi\/.*\/..*/, // https://stackoverflow.com/questions/2068344/how-do-i-get-a-youtube-video-thumbnail-from-the-youtube-api - /^https?:\/{2}(i|s)\.ytimg\.com\/vi\/.*\/..*/, - - /^https?:\/{2}(www\.|music\.|)youtube\.com\/watch\?v\=..*/, - - /^https?:\/{2}youtu\.be\/..*/, - - /^https?:\/{2}(www\.|)(youtube|youtube-nocookie)\.com\/embed\/..*/, -]; -let redirects = { - "invidious": { - "normal": [], - "tor": [] - }, - "piped": { - "normal": [], - "tor": [] - }, - "pipedMaterial": { - "normal": [ - "https://piped-material.xn--17b.net", - "https://piped-material.ftp.sh", - ], - "tor": [] - } -}; -function setRedirects(val) { - browser.storage.local.get('cloudflareList', r => { - redirects.invidious = val.invidious; - redirects.piped = val.piped; - invidiousNormalRedirectsChecks = [...redirects.invidious.normal]; - pipedNormalRedirectsChecks = [...redirects.piped.normal]; - for (const instance of r.cloudflareList) { - const a = invidiousNormalRedirectsChecks.indexOf(instance); - if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1); - - const b = pipedNormalRedirectsChecks.indexOf(instance); - if (b > -1) pipedNormalRedirectsChecks.splice(b, 1); - } - browser.storage.local.set({ - youtubeRedirects: redirects, - invidiousNormalRedirectsChecks, - invidiousTorRedirectsChecks: redirects.invidious.tor, - pipedNormalRedirectsChecks, - pipedTorRedirectsChecks: redirects.piped.tor, - }) - }) -} - -let - disableYoutube, - OnlyEmbeddedVideo, - youtubeFrontend, - youtubeProtocol, - youtubeEmbedFrontend, - youtubeRedirects, - invidiousNormalRedirectsChecks, - invidiousNormalCustomRedirects, - invidiousTorRedirectsChecks, - invidiousTorCustomRedirects, - pipedNormalRedirectsChecks, - pipedNormalCustomRedirects, - pipedTorRedirectsChecks, - pipedTorCustomRedirects, - pipedMaterialNormalRedirectsChecks, - pipedMaterialNormalCustomRedirects, - pipedMaterialTorRedirectsChecks, - pipedMaterialTorCustomRedirects; - -function init() { - return new Promise(resolve => { - browser.storage.local.get( - [ - "disableYoutube", - "OnlyEmbeddedVideo", - "youtubeFrontend", - "youtubeProtocol", - "youtubeEmbedFrontend", - "youtubeRedirects", - "invidiousNormalRedirectsChecks", - "invidiousNormalCustomRedirects", - "invidiousTorRedirectsChecks", - "invidiousTorCustomRedirects", - "pipedNormalRedirectsChecks", - "pipedNormalCustomRedirects", - "pipedTorRedirectsChecks", - "pipedTorCustomRedirects", - "pipedMaterialNormalRedirectsChecks", - "pipedMaterialNormalCustomRedirects", - "pipedMaterialTorRedirectsChecks", - "pipedMaterialTorCustomRedirects", - ], - r => { - disableYoutube = r.disableYoutube; - OnlyEmbeddedVideo = r.OnlyEmbeddedVideo; - youtubeFrontend = r.youtubeFrontend; - youtubeProtocol = r.youtubeProtocol; - youtubeEmbedFrontend = r.youtubeEmbedFrontend; - youtubeRedirects = r.youtubeRedirects; - invidiousNormalRedirectsChecks = r.invidiousNormalRedirectsChecks; - invidiousNormalCustomRedirects = r.invidiousNormalCustomRedirects; - invidiousTorRedirectsChecks = r.invidiousTorRedirectsChecks; - invidiousTorCustomRedirects = r.invidiousTorCustomRedirects; - pipedNormalRedirectsChecks = r.pipedNormalRedirectsChecks; - pipedNormalCustomRedirects = r.pipedNormalCustomRedirects; - pipedTorRedirectsChecks = r.pipedTorRedirectsChecks; - pipedTorCustomRedirects = r.pipedTorCustomRedirects; - pipedMaterialNormalRedirectsChecks = r.pipedMaterialNormalRedirectsChecks; - pipedMaterialNormalCustomRedirects = r.pipedMaterialNormalCustomRedirects; - pipedMaterialTorRedirectsChecks = r.pipedMaterialTorRedirectsChecks; - pipedMaterialTorCustomRedirects = r.pipedMaterialTorCustomRedirects; - resolve(); - } - ) - }) -} - -init(); -browser.storage.onChanged.addListener(init) - -function all() { - return [ - ...youtubeRedirects.invidious.normal, - ...youtubeRedirects.invidious.tor, - - ...youtubeRedirects.piped.normal, - ...youtubeRedirects.piped.tor, - - ...youtubeRedirects.pipedMaterial.normal, - ...youtubeRedirects.pipedMaterial.tor, - - ...invidiousNormalCustomRedirects, - ...invidiousTorCustomRedirects, - - ...pipedNormalCustomRedirects, - ...pipedTorCustomRedirects, - - ...pipedMaterialNormalCustomRedirects, - ...pipedMaterialTorCustomRedirects, - ]; -} - -function redirect(url, details, initiator) { - if (disableYoutube) return; - if (!targets.some(rx => rx.test(url.href))) return; - if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; - - const isInvidious = youtubeFrontend == 'invidious'; - const isPiped = youtubeFrontend == 'piped'; - const isPipedMaterial = youtubeFrontend == 'pipedMaterial' - const isFreetube = youtubeFrontend == 'freetube'; - const isYatte = youtubeFrontend == 'yatte'; - - const isFrontendYoutube = youtubeEmbedFrontend == "youtube"; - const isFrontendInvidious = youtubeEmbedFrontend == 'invidious'; - const isFrontendPiped = youtubeEmbedFrontend == 'piped'; - const isFrontendPipedMaterial = youtubeEmbedFrontend == 'pipedMaterial'; - - const isOnlyEmbeddedVideo = OnlyEmbeddedVideo == 'onlyNotEmbedded'; - const isOnlyNotEmbedded = OnlyEmbeddedVideo == 'onlyNotEmbedded' - - const is_main_frame = details.type === "main_frame"; - const is_sub_frame = details.type === "sub_frame"; - - if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) return; // Don't redirect YouTube Player API. - - if (youtubeFrontend == 'yatte' && is_main_frame) - return url.href.replace(/^https?:\/{2}/, 'yattee://'); - - else if (isFreetube && is_main_frame) - return `freetube://https:${url.pathname}${url.search}`; - - else if (isFreetube && params && isFrontendYoutube) - return; - - else if (isInvidious || ((isFreetube || isYatte) && isFrontendInvidious && is_sub_frame)) { - - if (isOnlyEmbeddedVideo && !is_sub_frame) return; - if (isOnlyNotEmbedded && params && !((isFreetube || isYatte) && isFrontendInvidious && is_sub_frame)) return; - - let instancesList; - if (youtubeProtocol == 'normal') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]; - else if (youtubeProtocol == 'tor') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]; - if (instancesList.length === 0) return; - let randomInstance = utils.getRandomInstance(instancesList); - - return `${randomInstance}${url.pathname}${url.search}`; - } else if (isPiped || ((isFreetube || isYatte) && isFrontendPiped && is_sub_frame)) { - - if (isOnlyEmbeddedVideo && !is_sub_frame) return; - if ( - isOnlyNotEmbedded && params && - !((isFreetube || isYatte) && isFrontendPiped && is_sub_frame) - ) return; - - let instancesList; - if (youtubeProtocol == 'normal') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]; - else if (youtubeProtocol == 'tor') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]; - if (instancesList.length === 0) return; - - const randomInstance = utils.getRandomInstance(instancesList); - return `${randomInstance}${url.pathname}${url.search}`; - } - else if (isPipedMaterial || ((isFreetube || isYatte) && isFrontendPipedMaterial && is_sub_frame)) { - if (isOnlyEmbeddedVideo && details.type !== "sub_frame") return; - if ( - isOnlyNotEmbedded && params && - !((isFreetube || isYatte) && isFrontendPipedMaterial && is_sub_frame) - ) return; - - let instancesList; - if (youtubeProtocol == 'normal') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]; - else if (youtubeProtocol == 'tor') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]; - - const randomInstance = utils.getRandomInstance(instancesList); - return `${randomInstance}${url.pathname}${url.search}`; - } - else return 'CANCEL'; -} - -function reverse(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - const instances = all(); - if (!instances.includes(protocolHost)) { resolve(); return; } - - resolve(`https://youtube.com${url.pathname}${url.search}`); - }) -} - -function switchInstance(url) { - return new Promise(async resolve => { - await init(); - const protocolHost = utils.protocolHost(url); - const instances = all(); - if (!instances.includes(protocolHost)) { resolve(); return; } - - let instancesList; - if (youtubeProtocol == 'normal') { - if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]; - else if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]; - else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]; - } - else if (youtubeProtocol == 'tor') { - if (youtubeFrontend == 'invidious') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]; - else if (youtubeFrontend == 'piped') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]; - else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]; - } - - const i = instancesList.indexOf(protocolHost); - if (i > -1) instancesList.splice(i, 1); - if (instancesList.length == 0) { resolve(); return; } - - const randomInstance = utils.getRandomInstance(instancesList); - resolve(`${randomInstance}${url.pathname}${url.search}`); - }) -} - -function initDefaults() { - return new Promise(async resolve => { - fetch('/instances/data.json').then(response => response.text()).then(async data => { - let dataJson = JSON.parse(data); - redirects.invidious = dataJson.invidious; - redirects.piped = dataJson.piped; - browser.storage.local.get('cloudflareList', async r => { - - invidiousNormalRedirectsChecks = [...redirects.invidious.normal]; - pipedNormalRedirectsChecks = [...redirects.piped.normal]; - pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]; - - for (const instance of r.cloudflareList) { - let i; - - i = invidiousNormalRedirectsChecks.indexOf(instance); - if (i > -1) invidiousNormalRedirectsChecks.splice(i, 1); - - i = pipedNormalRedirectsChecks.indexOf(instance); - if (i > -1) pipedNormalRedirectsChecks.splice(i, 1); - - i = pipedMaterialNormalRedirectsChecks.indexOf(instance); - if (i > -1) pipedMaterialNormalRedirectsChecks.splice(i, 1); - } - - await browser.storage.local.set({ - disableYoutube: false, - enableYoutubeCustomSettings: false, - OnlyEmbeddedVideo: 'both', - - youtubeRedirects: redirects, - - youtubeFrontend: 'invidious', - - invidiousNormalRedirectsChecks: invidiousNormalRedirectsChecks, - invidiousNormalCustomRedirects: [], - - invidiousTorRedirectsChecks: [...redirects.invidious.tor], - invidiousTorCustomRedirects: [], - - pipedNormalRedirectsChecks: pipedNormalRedirectsChecks, - pipedNormalCustomRedirects: [], - - pipedTorRedirectsChecks: [...redirects.piped.tor], - pipedTorCustomRedirects: [], - - pipedMaterialNormalRedirectsChecks: pipedMaterialNormalRedirectsChecks, - pipedMaterialNormalCustomRedirects: [], - - pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor], - pipedMaterialTorCustomRedirects: [], - - youtubeEmbedFrontend: 'invidious', - youtubeProtocol: 'normal', - }) - resolve(); - }) - }) - }) -} - -function initInvidiousCookies(test, from) { - return new Promise(async resolve => { - await init(); - if (disableYoutube || youtubeFrontend != 'invidious') { resolve(); return; } - const protocolHost = utils.protocolHost(from); - if (![ - ...invidiousNormalRedirectsChecks, - ...invidiousTorRedirectsChecks, - ...invidiousNormalCustomRedirects, - ...invidiousTorCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - if (!test) { - let checkedInstances; - if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects] - else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects] - const i = checkedInstances.indexOf(protocolHost); - if (i !== -1) checkedInstances.splice(i, 1); - for (const to of checkedInstances) - utils.copyCookie('invidious', from, to, 'PREFS'); - } - resolve(true); - }) -} - -function setInvidiousCookies() { - return new Promise(async resolve => { - await init(); - if (disableYoutube || youtubeFrontend != 'invidious') { resolve(); return; } - let checkedInstances; - if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects] - else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects] - for (const to of checkedInstances) - utils.getCookiesFromStorage('invidious', to, 'PREFS'); - resolve(); - }) -} - -function initPipedLocalStorage(test, url, tabId) { - return new Promise(async resolve => { - await init(); - if (disableYoutube || youtubeFrontend != 'piped') { resolve(); return; } - const protocolHost = utils.protocolHost(url); - if (![ - ...pipedNormalCustomRedirects, - ...pipedNormalRedirectsChecks, - ...pipedTorRedirectsChecks, - ...pipedTorCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - if (!test) { - - browser.tabs.executeScript(tabId, { file: "/assets/javascripts/helpers/youtube/get_piped_preferences.js", runAt: "document_start" }); - - let checkedInstances; - if (youtubeProtocol == 'normal') checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks] - else if (youtubeProtocol == 'tor') checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects] - const i = checkedInstances.indexOf(protocolHost); - if (i !== -1) checkedInstances.splice(i, 1); - for (const to of checkedInstances) { - browser.tabs.create({ url: to }, - tab => browser.tabs.executeScript(tab.id, { file: "/assets/javascripts/helpers/youtube/set_piped_preferences.js", runAt: "document_start" })) - } - } - resolve(true); - }) -} - -function initPipedMaterialLocalStorage(test, url, tabId,) { - return new Promise(async resolve => { - await init(); - if (disableYoutube || youtubeFrontend != 'pipedMaterial') { resolve(); return; } - const protocolHost = utils.protocolHost(url); - if (![ - ...pipedMaterialNormalRedirectsChecks, - ...pipedMaterialNormalCustomRedirects, - ...pipedMaterialTorRedirectsChecks, - ...pipedMaterialTorCustomRedirects, - ].includes(protocolHost)) { resolve(); return; } - - if (!test) { - browser.tabs.executeScript(tabId, { file: "/assets/javascripts/helpers/youtube/get_pipedMaterial_preferences.js", runAt: "document_start" }); - - let checkedInstances; - if (youtubeProtocol == 'normal') checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects] - else if (youtubeProtocol == 'tor') checkedInstances = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects] - const i = checkedInstances.indexOf(protocolHost); - if (i !== -1) checkedInstances.splice(i, 1); - for (const to of checkedInstances) - browser.tabs.create( - { url: to }, - tab => browser.tabs.executeScript(tab.id, { file: "/assets/javascripts/helpers/youtube/set_pipedMaterial_preferences.js", runAt: "document_start" }) - ); - } - resolve(true); - }) -} - -function removeXFrameOptions(e) { - const url = new URL(e.url); - let protocolHost = utils.protocolHost(url); - const instances = all(); - if (!instances.includes(protocolHost) || e.type != 'sub_frame') return; - - let isChanged = false; - for (const i in e.responseHeaders) - if (e.responseHeaders[i].name == 'x-frame-options') { - e.responseHeaders.splice(i, 1); - isChanged = true; - } - if (isChanged) return { responseHeaders: e.responseHeaders }; -} - -export default { - setRedirects, - initPipedLocalStorage, - initPipedMaterialLocalStorage, - initInvidiousCookies, - setInvidiousCookies, - redirect, - reverse, - switchInstance, - initDefaults, - removeXFrameOptions, -}; diff --git a/src/assets/javascripts/helpers/youtubeMusic.js b/src/assets/javascripts/helpers/youtubeMusic.js deleted file mode 100644 index 68fa4f24..00000000 --- a/src/assets/javascripts/helpers/youtubeMusic.js +++ /dev/null @@ -1,97 +0,0 @@ -"use strict"; - -import utils from './utils.js' - -window.browser = window.browser || window.chrome; - -const targets = [ - /^https?:\/{2}music\.youtube\.com(\/.*|$)/, -]; -let redirects = { - "beatbump": { - "normal": [ - "https://beatbump.ml" - ], - "tor": [] - }, -}; - -let - disableYoutubeMusic, - beatbumpNormalRedirectsChecks, - beatbumpNormalCustomRedirects; - -function init() { - browser.storage.local.get( - [ - "disableYoutubeMusic", - "beatbumpNormalRedirectsChecks", - "beatbumpNormalCustomRedirects", - ], - r => { - disableYoutubeMusic = r.disableYoutubeMusic; - beatbumpNormalRedirectsChecks = r.beatbumpNormalRedirectsChecks; - beatbumpNormalCustomRedirects = r.beatbumpNormalCustomRedirects; - } - ) -} - -init(); -browser.storage.onChanged.addListener(init) - -/* -Video -https://music.youtube.com/watch?v=_PkGiKBW-DA&list=RDAMVM_PkGiKBW-DA -https://beatbump.ml/listen?id=_PkGiKBW-DA&list=RDAMVM_PkGiKBW-DA - -Playlist -https://music.youtube.com/playlist?list=PLqxd0OMLeWy64zlwhjouj92ISc38FbOns -https://music.youtube.com/playlist?list=PLqxd0OMLeWy7lrJSzt9LnOJjbC1IaruPM -https://music.youtube.com/playlist?list=PLQod4DlD72ZMJmOrSNbmEmK_iZ1oXPzKd -https://beatbump.ml/playlist/VLPLqxd0OMLeWy64zlwhjouj92ISc38FbOns - -Channel -https://music.youtube.com/channel/UCfgmMDI7T5tOQqjnOBRe_wg -https://beatbump.ml/artist/UCfgmMDI7T5tOQqjnOBRe_wg - -Albums -https://music.youtube.com/playlist?list=OLAK5uy_n-9HVh3cryV2gREZM9Sc0JwEKYjjfi0dU -https://music.youtube.com/playlist?list=OLAK5uy_lcr5O1zS8f6WIFI_yxqVp2RK9Dyy2bbw0 -https://beatbump.ml/release?id=MPREb_3DURc4yEUtD -https://beatbump.ml/release?id=MPREb_evaZrV1WNdS - -https://music.youtube.com/playlist?list=OLAK5uy_n6OHVllUZUCnlIY1m-gUaH8uqkN3Y-Ca8 -https://music.youtube.com/playlist?list=OLAK5uy_nBOTxAc3_RGB82-Z54jdARGxGaCYlpngY -https://beatbump.ml/release?id=MPREb_QygdC0wEoLe - -https://music.youtube.com/watch?v=R6gSMSYKhKU&list=OLAK5uy_n-9HVh3cryV2gREZM9Sc0JwEKYjjfi0dU -*/ -function redirect(url, type, initiator) { - if (disableYoutubeMusic) return; - if (!targets.some(rx => rx.test(url.href))) return; - - let instancesList = [...beatbumpNormalRedirectsChecks, ...beatbumpNormalCustomRedirects]; - if (instancesList.length === 0) return; - const randomInstance = utils.getRandomInstance(instancesList); - resolve( - `${randomInstance}${url.pathname}${url.search}` - .replace("/watch?v=", "/listen?id=") - .replace("/channel/", "/artist/") - .replace("/playlist?list=", "/playlist/VL") - ); -} - -async function initDefaults() { - await browser.storage.local.set({ - disableYoutubeMusic: true, - youtubeMusicRedirects: redirects, - - beatbumpNormalRedirectsChecks: [...redirects.beatbump.normal], - beatbumpNormalCustomRedirects: [], - }) -} - -export default { - redirect, - initDefaults, -}; diff --git a/src/assets/javascripts/imgur.js b/src/assets/javascripts/imgur.js new file mode 100644 index 00000000..9f93f362 --- /dev/null +++ b/src/assets/javascripts/imgur.js @@ -0,0 +1,191 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = /^https?:\/{2}([im]\.)?imgur\.com(\/|$)/ + +let redirects = { + "rimgo": { + "normal": [], + "tor": [], + "i2p": [] + } +} +function setRedirects() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.rimgo = dataJson.rimgo; + + rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]; + rimgoTorRedirectsChecks = [...redirects.rimgo.tor]; + rimgoI2pRedirectsChecks = [...redirects.rimgo.i2p]; + + for (const instance of r.cloudflareList) { + const a = rimgoNormalRedirectsChecks.indexOf(instance); + if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1); + + const b = rimgoTorRedirectsChecks.indexOf(instance); + if (b > -1) rimgoTorRedirectsChecks.splice(b, 1); + + const c = rimgoI2pRedirectsChecks.indexOf(instance); + if (c > -1) rimgoI2pRedirectsChecks.splice(c, 1); + } + + await browser.storage.local.set({ + imgurRedirects: redirects, + rimgoNormalRedirectsChecks, + rimgoTorRedirectsChecks, + rimgoI2pRedirectsChecks, + }); + + resolve(); + }) + }) +} + +let + disableImgur, + imgurRedirects, + imgurProtocol, + rimgoNormalRedirectsChecks, + rimgoNormalCustomRedirects, + rimgoTorRedirectsChecks, + rimgoTorCustomRedirects, + rimgoI2pRedirectsChecks, + rimgoI2pCustomRedirects; + +function init() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + "disableImgur", + "imgurRedirects", + "imgurProtocol", + "rimgoNormalRedirectsChecks", + "rimgoNormalCustomRedirects", + "rimgoTorRedirectsChecks", + "rimgoTorCustomRedirects", + "rimgoI2pRedirectsChecks", + "rimgoI2pCustomRedirects", + ], + r => { + disableImgur = r.disableImgur; + imgurRedirects = r.imgurRedirects; + imgurProtocol = r.imgurProtocol; + rimgoNormalRedirectsChecks = r.rimgoNormalRedirectsChecks; + rimgoNormalCustomRedirects = r.rimgoNormalCustomRedirects; + rimgoTorRedirectsChecks = r.rimgoTorRedirectsChecks; + rimgoTorCustomRedirects = r.rimgoTorCustomRedirects; + rimgoI2pRedirectsChecks = r.rimgoI2pRedirectsChecks; + rimgoI2pCustomRedirects = r.rimgoI2pCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +// https://imgur.com/gallery/s4WXQmn +// https://imgur.com/a/H8M4rcp +// https://imgur.com/gallery/gYiQLWy +// https://imgur.com/gallery/cTRwaJU +// https://i.imgur.com/CFSQArP.jpeg + +function all() { + return [ + ...imgurRedirects.rimgo.normal, + ...imgurRedirects.rimgo.tor, + ...imgurRedirects.rimgo.i2p, + ...rimgoNormalCustomRedirects, + ...rimgoTorCustomRedirects, + ...rimgoI2pCustomRedirects, + ]; +} + +function redirect(url, type, initiator) { + if (disableImgur) return; + if (url.pathname == "/") return; + if (!["main_frame", "sub_frame", "xmlhttprequest", "other", "image", "media",].includes(type)) return; + if (initiator && (all().includes(initiator.origin) || targets.test(initiator.host))) return; + if (!targets.test(url.href)) return; + if (url.pathname.includes("delete/")) return; + + let instancesList; + if (imgurProtocol == 'normal') instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects]; + if (imgurProtocol == 'tor') instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects]; + if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pRedirectsChecks, ...rimgoI2pCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + return `${randomInstance}${url.pathname}${url.search}`; +} + +function reverse(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + resolve(`https://imgur.com${url.pathname}${url.search}`); + }) +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + let instancesList; + if (imgurProtocol == 'normal') instancesList = [...rimgoNormalCustomRedirects, ...rimgoNormalRedirectsChecks]; + else if (imgurProtocol == 'tor') instancesList = [...rimgoTorCustomRedirects, ...rimgoTorRedirectsChecks]; + else if (imgurProtocol == 'i2p') instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks]; + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.rimgo = dataJson.rimgo; + browser.storage.local.get('cloudflareList', async r => { + rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]; + for (const instance of r.cloudflareList) { + const i = rimgoNormalRedirectsChecks.indexOf(instance); + if (i > -1) rimgoNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableImgur: false, + imgurProtocol: 'normal', + imgurRedirects: redirects, + + rimgoNormalRedirectsChecks: rimgoNormalRedirectsChecks, + rimgoNormalCustomRedirects: [], + + rimgoTorRedirectsChecks: [...redirects.rimgo.tor], + rimgoTorCustomRedirects: [], + + rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p], + rimgoI2pCustomRedirects: [], + }); + resolve(); + }); + }); + }); +} + +export default { + setRedirects, + redirect, + reverse, + initDefaults, + switchInstance, +}; diff --git a/src/assets/javascripts/instagram.js b/src/assets/javascripts/instagram.js new file mode 100644 index 00000000..f5c54b3a --- /dev/null +++ b/src/assets/javascripts/instagram.js @@ -0,0 +1,166 @@ +window.browser = window.browser || window.chrome; +import utils from './utils.js' + +const targets = [ + "instagram.com", + "www.instagram.com", +]; +let redirects = { + "bibliogram": { + "normal": [], + "tor": [] + } +}; +function setRedirects(val) { + browser.storage.local.get('cloudflareList', async r => { + redirects.bibliogram = val; + bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]; + for (const instance of r.cloudflareList) { + const a = bibliogramNormalRedirectsChecks.indexOf(instance); + if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1); + } + browser.storage.local.set({ + instagramRedirects: redirects, + bibliogramNormalRedirectsChecks + }) + }) +} + +let + disableInstagram, + instagramProtocol, + instagramRedirects, + bibliogramNormalRedirectsChecks, + bibliogramTorRedirectsChecks, + bibliogramNormalCustomRedirects, + bibliogramTorCustomRedirects; + +function init() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + "disableInstagram", + "instagramProtocol", + "instagramRedirects", + "bibliogramNormalRedirectsChecks", + "bibliogramTorRedirectsChecks", + "bibliogramNormalCustomRedirects", + "bibliogramTorCustomRedirects", + ], + r => { + disableInstagram = r.disableInstagram; + instagramProtocol = r.instagramProtocol; + instagramRedirects = r.instagramRedirects; + bibliogramNormalRedirectsChecks = r.bibliogramNormalRedirectsChecks; + bibliogramTorRedirectsChecks = r.bibliogramTorRedirectsChecks; + bibliogramNormalCustomRedirects = r.bibliogramNormalCustomRedirects; + bibliogramTorCustomRedirects = r.bibliogramTorCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function all() { + return [ + ...instagramRedirects.bibliogram.normal, + ...instagramRedirects.bibliogram.tor, + ...bibliogramNormalCustomRedirects, + ...bibliogramTorCustomRedirects, + ] +} + +function redirect(url, type, initiator) { + if (disableInstagram) return; + if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; + if (!targets.includes(url.host)) return; + if (!["main_frame", "sub_frame", "xmlhttprequest", "other", "image", "media"].includes(type)) return; + + const bypassPaths = [/about/, /explore/, /support/, /press/, /api/, /privacy/, /safety/, /admin/, /\/(accounts\/|embeds?.js)/]; + if (bypassPaths.some(rx => rx.test(url.pathname))) return; + + let instancesList; + if (instagramProtocol == 'normal') instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]; + else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]; + if (instancesList.length === 0) return; + let randomInstance = utils.getRandomInstance(instancesList) + + const reservedPaths = ["u", "p", "privacy",]; + if (url.pathname === "/" || reservedPaths.includes(url.pathname.split("/")[1])) + return `${randomInstance}${url.pathname}${url.search}`; + if (url.pathname.startsWith("/reel") || url.pathname.startsWith("/tv")) + return `${randomInstance}/p${url.pathname.replace(/\/reel|\/tv/i, '')}${url.search}`; + else + return `${randomInstance}/u${url.pathname}${url.search}`; // Likely a user profile, redirect to '/u/...' +} + +function reverse(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + + if (url.pathname.startsWith('/p')) resolve(`https://instagram.com${url.pathname.replace('/p', '')}${url.search}`); + if (url.pathname.startsWith('/u')) resolve(`https://instagram.com${url.pathname.replace('/u', '')}${url.search}`); + resolve(`https://instagram.com${url.pathname}${url.search}`); + }) +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (instagramProtocol == 'normal') instancesList = [...bibliogramNormalCustomRedirects, ...bibliogramNormalRedirectsChecks]; + else if (instagramProtocol == 'tor') instancesList = [...bibliogramTorCustomRedirects, ...bibliogramTorRedirectsChecks]; + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(data => { + let dataJson = JSON.parse(data); + redirects.bibliogram = dataJson.bibliogram; + browser.storage.local.get('cloudflareList', r => { + bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]; + for (const instance of r.cloudflareList) { + const i = bibliogramNormalRedirectsChecks.indexOf(instance); + if (i > -1) bibliogramNormalRedirectsChecks.splice(i, 1); + } + browser.storage.local.set({ + disableInstagram: false, + instagramRedirects: redirects, + + bibliogramNormalRedirectsChecks: bibliogramNormalRedirectsChecks, + bibliogramTorRedirectsChecks: [], + + bibliogramNormalCustomRedirects: [...redirects.bibliogram.tor], + bibliogramTorCustomRedirects: [], + instagramProtocol: "normal", + }) + resolve(); + } + ) + }) + }) +} + +export default { + setRedirects, + reverse, + redirect, + initDefaults, + switchInstance, +}; diff --git a/src/assets/javascripts/lbry.js b/src/assets/javascripts/lbry.js new file mode 100644 index 00000000..b44cc738 --- /dev/null +++ b/src/assets/javascripts/lbry.js @@ -0,0 +1,156 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +let targets = ["odysee.com"]; + +let redirects = { + "librarian": { + "normal": [ + "https://lbry.bcow.xyz", + "https://odysee.076.ne.jp", + "https://lbry.ix.tc", + "https://librarian.pussthecat.org", + "https://lbry.mutahar.rocks", + "https://librarian.esmailelbob.xyz", + ], + "tor": [ + "http://ecc5mi5ncdw6mxhjz6re6g2uevtpbzxjvxgrxia2gyvrlnil3srbnhyd.onion", + "http://vrmbc4brkgkaysmi3fenbzkayobxjh24slmhtocambn3ewe62iuqt3yd.onion", + ] + } +} + +function setRedirects(val) { + redirects.librarian = val; + browser.storage.local.set({ lbryTargetsRedirects: redirects }) + for (const item of librarianNormalRedirectsChecks) + if (!redirects.librarian.normal.includes(item)) { + var index = librarianNormalRedirectsChecks.indexOf(item); + if (index !== -1) librarianNormalRedirectsChecks.splice(index, 1); + } + browser.storage.local.set(librarianNormalRedirectsChecks); + + for (const item of librarianTorRedirectsChecks) + if (!redirects.librarian.normal.includes(item)) { + var index = librarianTorRedirectsChecks.indexOf(item); + if (index !== -1) librarianTorRedirectsChecks.splice(index, 1); + } + browser.storage.local.set(librarianTorRedirectsChecks) +} + +let + disableLbryTargets, + lbryTargetsProtocol, + lbryTargetsRedirects, + librarianNormalRedirectsChecks, + librarianNormalCustomRedirects, + librarianTorRedirectsChecks, + librarianTorCustomRedirects; + +function init() { + return new Promise(resolve => { + browser.storage.local.get( + [ + "disableLbryTargets", + "lbryTargetsProtocol", + "lbryTargetsRedirects", + "librarianNormalRedirectsChecks", + "librarianNormalCustomRedirects", + "librarianTorRedirectsChecks", + "librarianTorCustomRedirects", + ], + r => { + disableLbryTargets = r.disableLbryTargets; + lbryTargetsProtocol = r.lbryTargetsProtocol; + lbryTargetsRedirects = r.lbryTargetsRedirects; + librarianNormalRedirectsChecks = r.librarianNormalRedirectsChecks; + librarianNormalCustomRedirects = r.librarianNormalCustomRedirects; + librarianTorRedirectsChecks = r.librarianTorRedirectsChecks; + librarianTorCustomRedirects = r.librarianTorCustomRedirects; + resolve(); + } + ) + }) +} +init(); +browser.storage.onChanged.addListener(init) + +function all() { + return [ + ...redirects.librarian.normal, + ...redirects.librarian.tor, + ...librarianNormalCustomRedirects, + ...librarianTorCustomRedirects, + ]; +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]; + else if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]; + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function redirect(url, type, initiator) { + if (disableLbryTargets) return; + if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return; + if (!targets.includes(url.host)) return; + if (type != "main_frame") return; + + let instancesList; + if (lbryTargetsProtocol == 'normal') instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]; + if (lbryTargetsProtocol == 'tor') instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + return `${randomInstance}${url.pathname}${url.search}`; +} + +function initDefaults() { + return new Promise(resolve => { + browser.storage.local.get('cloudflareList', async r => { + librarianNormalRedirectsChecks = [...redirects.librarian.normal]; + for (const instance of r.cloudflareList) { + let i; + + i = librarianNormalRedirectsChecks.indexOf(instance); + if (i > -1) librarianNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableLbryTargets: true, + lbryTargetsRedirects: { + 'librarian': redirects.librarian + }, + + librarianNormalRedirectsChecks: librarianNormalRedirectsChecks, + librarianNormalCustomRedirects: [], + + librarianTorRedirectsChecks: [...redirects.librarian.tor], + librarianTorCustomRedirects: [], + + lbryTargetsProtocol: "normal", + }) + resolve(); + }) + }) +} + +export default { + setRedirects, + switchInstance, + redirect, + initDefaults, +}; diff --git a/src/assets/javascripts/localise.js b/src/assets/javascripts/localise.js index 752a6dd3..a4bbca92 100644 --- a/src/assets/javascripts/localise.js +++ b/src/assets/javascripts/localise.js @@ -1,39 +1,31 @@ window.browser = window.browser || window.chrome; -function getMessage(tag) { - return tag.replace(/__MSG_(\w+)__/g, function (_match, v1) { - return v1 ? browser.i18n.getMessage(v1) : null; - }); -} - function localisePage() { - let elements = document.querySelectorAll("[data-localise]"); + function getMessage(tag) { + return tag.replace(/__MSG_(\w+)__/g, (_match, v1) => { + return v1 ? browser.i18n.getMessage(v1) : null; + }); + } + const elements = document.querySelectorAll("[data-localise]"); for (let i in elements) if (elements.hasOwnProperty(i)) { - let obj = elements[i]; - let tag = obj.getAttribute("data-localise").toString(); - - let msg = getMessage(tag); - + const obj = elements[i]; + const tag = obj.getAttribute("data-localise").toString(); + const msg = getMessage(tag); if (msg && msg !== tag) obj.textContent = msg; } - let placeholders = document.querySelectorAll("[data-localise-placeholder]"); - + const placeholders = document.querySelectorAll("[data-localise-placeholder]"); for (let i in placeholders) if (placeholders.hasOwnProperty(i)) { - let obj = placeholders[i]; - let tag = obj.getAttribute("data-localise-placeholder").toString(); - - let msg = getMessage(tag); - + const obj = placeholders[i]; + const tag = obj.getAttribute("data-localise-placeholder").toString(); + const msg = getMessage(tag); if (msg && msg !== tag) obj.placeholder = msg; } } -localisePage(); - export default { localisePage } diff --git a/src/assets/javascripts/maps.js b/src/assets/javascripts/maps.js new file mode 100644 index 00000000..3ab5e2b6 --- /dev/null +++ b/src/assets/javascripts/maps.js @@ -0,0 +1,212 @@ +"use strict"; + +window.browser = window.browser || window.chrome; +import utils from './utils.js' + +const targets = /^https?:\/{2}(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/; + +let redirects = { + 'osm': { + "normal": [ + "https://openstreetmap.org" + ] + }, + 'facil': { + "normal": [ + "https://facilmap.org" + ] + } +}; + + +let + disableMaps, + mapsFrontend, + facilNormalRedirectsChecks, + facilNormalCustomRedirects; + +function init() { + browser.storage.local.get( + [ + "disableMaps", + "mapsFrontend", + "facilNormalRedirectsChecks", + "facilNormalCustomRedirects", + ], + r => { + disableMaps = r.disableMaps; + mapsFrontend = r.mapsFrontend; + facilNormalRedirectsChecks = r.facilNormalRedirectsChecks; + facilNormalCustomRedirects = r.facilNormalCustomRedirects; + } + ) +} + +init(); +browser.storage.onChanged.addListener(init) + +function redirect(url, initiator) { + const mapCentreRegex = /@(-?\d[0-9.]*),(-?\d[0-9.]*),(\d{1,2})[.z]/; + const dataLatLngRegex = /!3d(-?[0-9]{1,}.[0-9]{1,})!4d(-?[0-9]{1,}.[0-9]{1,})/; + 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. + }; + const travelModesFacil = { + driving: "car", + walking: "pedestrian", + bicycling: "bicycle", + transit: "car", // not implemented on Facil, default to car. + }; + const osmLayers = { + none: "S", + transit: "T", + traffic: "S", // not implemented on OSM, default to standard. + bicycling: "C", + }; + + function addressToLatLng(address) { + const xmlhttp = new XMLHttpRequest(); + xmlhttp.open("GET", `https://nominatim.openstreetmap.org/search/${address}?format=json&limit=1`, false); + xmlhttp.send(); + if (xmlhttp.status === 200) { + const json = JSON.parse(xmlhttp.responseText)[0]; + if (json) { + console.log('json', json) + return [ + `${json.lat},${json.lon}`, + `${json.boundingbox[2]},${json.boundingbox[1]},${json.boundingbox[3]},${json.boundingbox[0]}`, + ]; + } + } + console.info("Error: Status is " + xmlhttp.status); + } + + if (disableMaps) return; + if (initiator && initiator.host === "earth.google.com") return; + if (!url.href.match(targets)) return; + + let randomInstance; + if (mapsFrontend == 'osm') randomInstance = utils.getRandomInstance(redirects.osm.normal); + if (mapsFrontend == 'facil') randomInstance = utils.getRandomInstance([...facilNormalRedirectsChecks, ...facilNormalCustomRedirects]); + + let mapCentre = "#"; + let prefs = {}; + + if (url.pathname.match(mapCentreRegex)) { // Set map centre if present + var [, lat, lon, zoom] = url.pathname.match(mapCentreRegex); + } else if (url.searchParams.has("center")) { + var [lat, lon] = url.searchParams.get("center").split(","); + var zoom = url.searchParams.get("zoom") ?? "17"; + } + + if (lat && lon && zoom) { + if (mapsFrontend == 'osm') mapCentre = `#map=${zoom}/${lat}/${lon}`; + if (mapsFrontend == 'facil') mapCentre = `#${zoom}/${lat}/${lon}`; + } + + if (url.searchParams.get("layer")) prefs.layers = osmLayers[url.searchParams.get("layer")]; + + if (url.pathname.includes("/embed")) { // Handle Google Maps Embed API + // https://www.google.com/maps/embed/v1/place?key=AIzaSyD4iE2xVSpkLLOXoyqT-RuPwURN3ddScAI&q=Eiffel+Tower,Paris+France + console.log("embed life"); + + 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 [coords, boundingbox] = addressToLatLng(query); + prefs.bbox = boundingbox; + prefs.marker = coords; + prefs.layer = "mapnik"; + let prefsEncoded = new URLSearchParams(prefs).toString(); + if (mapsFrontend == 'osm') { resolve(`${randomInstance}/export/embed.html?${prefsEncoded}`); return; } + + if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${query}`); return; } + + } else if (url.pathname.includes("/dir")) { // Handle Google Maps Directions + // https://www.google.com/maps/dir/?api=1&origin=Space+Needle+Seattle+WA&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling + + let travMod = url.searchParams.get("travelmode"); + if (url.searchParams.has("travelmode")) prefs.engine = travelModes[travMod]; + + let orgVal = url.searchParams.get("origin"); + let destVal = url.searchParams.get("destination"); + + let org; addressToLatLng(orgVal, a => org = a); + let dest; addressToLatLng(destVal, a => dest = a); + prefs.route = `${org};${dest}`; + + let prefsEncoded = new URLSearchParams(prefs).toString(); + if (mapsFrontend == 'osm') { resolve(`${randomInstance}/directions?${prefsEncoded}${mapCentre}`); return; } + if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${orgVal}%20to%20${destVal}%20by%20${travelModesFacil[travMod]}`); return; } + + } else if (url.pathname.includes("data=") && url.pathname.match(dataLatLngRegex)) { // Get marker from data attribute + // https://www.google.com/maps/place/41%C2%B001'58.2%22N+40%C2%B029'18.2%22E/@41.032833,40.4862063,17z/data=!3m1!4b1!4m6!3m5!1s0x0:0xf64286eaf72fc49d!7e2!8m2!3d41.0328329!4d40.4883948 + console.log("data life"); + + let [, mlat, mlon] = url.pathname.match(dataLatLngRegex); + + if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; } + if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; } + + } else if (url.searchParams.has("ll")) { // Get marker from ll param + // https://maps.google.com/?ll=38.882147,-76.99017 + console.log("ll life"); + + const [mlat, mlon] = url.searchParams.get("ll").split(","); + + if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; } + if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; } + } else if (url.searchParams.has("viewpoint")) { // Get marker from viewpoint param. + // https://www.google.com/maps/@?api=1&map_action=pano&viewpoint=48.857832,2.295226&heading=-45&pitch=38&fov=80 + console.log("viewpoint life"); + + const [mlat, mlon] = url.searchParams.get("viewpoint").split(","); + + if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query=${mlat}%2C${mlon}`); return; } + if (mapsFrontend == 'facil') { resolve(`${randomInstance}/#q=${mlat}%2C${mlon}`); return; } + } else { // Use query as search if present. + console.log("normal life"); + + 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(placeRegex)) query = url.pathname.match(placeRegex)[1]; + + let prefsEncoded = new URLSearchParams(prefs).toString(); + if (query) { + if (mapsFrontend == 'osm') { resolve(`${randomInstance}/search?query="${query}${mapCentre}&${prefsEncoded}`); return; } + if (mapsFrontend == 'facil') { resolve(`${randomInstance}/${mapCentre}/Mpnk/${query}`); return; } + } + } + + let prefsEncoded = new URLSearchParams(prefs).toString(); + console.log("mapCentre", mapCentre); + console.log("prefs", prefs); + console.log("prefsEncoded", prefsEncoded); + if (mapsFrontend == 'osm') { resolve(`${randomInstance}/${mapCentre}&${prefsEncoded}`); return; } + if (mapsFrontend == 'facil') { resolve(`${randomInstance}/${mapCentre}/Mpnk`); return; } +} + +async function initDefaults() { + await browser.storage.local.set({ + disableMaps: false, + mapsFrontend: 'osm', + mapsRedirects: redirects, + facilNormalRedirectsChecks: [...redirects.facil.normal], + facilNormalCustomRedirects: [], + }) +} + +export default { + redirect, + initDefaults, +}; diff --git a/src/assets/javascripts/medium.js b/src/assets/javascripts/medium.js new file mode 100644 index 00000000..7be6b0d1 --- /dev/null +++ b/src/assets/javascripts/medium.js @@ -0,0 +1,174 @@ +window.browser = window.browser || window.chrome; +import utils from './utils.js' + + +const targets = [ + // /(?:.*\.)*(? { + redirects.scribe = val; + scribeNormalRedirectsChecks = [...redirects.scribe.normal]; + for (const instance of r.cloudflareList) { + const a = scribeNormalRedirectsChecks.indexOf(instance); + if (a > -1) scribeNormalRedirectsChecks.splice(a, 1); + } + browser.storage.local.set({ + mediumRedirects: redirects, + scribeNormalRedirectsChecks + }) + }) +} + +let + disableMedium, + mediumRedirects, + scribeNormalRedirectsChecks, + scribeNormalCustomRedirects, + scribeTorRedirectsChecks, + scribeTorCustomRedirects, + mediumProtocol; + +function init() { + return new Promise(resolve => { + browser.storage.local.get( + [ + "disableMedium", + "mediumRedirects", + "scribeNormalRedirectsChecks", + "scribeNormalCustomRedirects", + "scribeTorRedirectsChecks", + "scribeTorCustomRedirects", + "mediumProtocol" + ], + r => { + disableMedium = r.disableMedium; + mediumRedirects = r.mediumRedirects; + scribeNormalRedirectsChecks = r.scribeNormalRedirectsChecks; + scribeNormalCustomRedirects = r.scribeNormalCustomRedirects; + scribeTorRedirectsChecks = r.scribeTorRedirectsChecks; + scribeTorCustomRedirects = r.scribeTorCustomRedirects; + mediumProtocol = r.mediumProtocol; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function redirect(url, type, initiator) { + if (disableMedium) return; + if (type != "main_frame" && "sub_frame" && "xmlhttprequest" && "other") return; + if (initiator && ( + [ + ...mediumRedirects.scribe.normal, + ...mediumRedirects.scribe.tor, + ...scribeNormalCustomRedirects, + ...scribeTorCustomRedirects, + ].includes(initiator.origin))) return; + + if (!targets.some(rx => rx.test(url.host))) return; + if (/^\/($|@[a-zA-Z.]{0,}(\/|)$)/.test(url.pathname)) return; + + let instancesList; + if (mediumProtocol == 'normal') instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects]; + else if (mediumProtocol == 'tor') instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList) + return `${randomInstance}${url.pathname}${url.search}`; +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(url); + const all = [ + ...mediumRedirects.scribe.tor, + ...mediumRedirects.scribe.normal, + + ...scribeNormalCustomRedirects, + ...scribeTorCustomRedirects, + ]; + if (!all.includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (mediumProtocol == 'normal') instancesList = [...scribeNormalCustomRedirects, ...scribeNormalRedirectsChecks]; + else if (mediumProtocol == 'tor') instancesList = [...scribeTorCustomRedirects, ...scribeTorRedirectsChecks]; + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(data => { + let dataJson = JSON.parse(data); + redirects.scribe = dataJson.scribe; + browser.storage.local.get('cloudflareList', + async r => { + scribeNormalRedirectsChecks = [...redirects.scribe.normal]; + for (const instance of r.cloudflareList) { + let i = scribeNormalRedirectsChecks.indexOf(instance); + if (i > -1) scribeNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableMedium: false, + mediumRedirects: redirects, + + scribeNormalRedirectsChecks: scribeNormalRedirectsChecks, + scribeNormalCustomRedirects: [], + + scribeTorRedirectsChecks: [...redirects.scribe.tor], + scribeTorCustomRedirects: [], + + mediumProtocol: "normal", + }) + resolve(); + }) + }) + }) +} + +export default { + setRedirects, + redirect, + switchInstance, + initDefaults, +}; diff --git a/src/assets/javascripts/peertube.js b/src/assets/javascripts/peertube.js new file mode 100644 index 00000000..ed15bce9 --- /dev/null +++ b/src/assets/javascripts/peertube.js @@ -0,0 +1,155 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +let redirects = { + "simpleertube": { + "normal": [ + "https://tube.simple-web.org", + "https://tube.ftild3.org", + "https://stube.alefvanoon.xyz", + "https://st.phreedom.club", + "https://simpleertube.esmailelbob.xyz", + ], + "tor": [] + } +} +function setRedirects(val) { + redirects.simpleertube = val; + browser.storage.local.set({ peertubeTargetsRedirects: redirects }) + for (const item of simpleertubeNormalRedirectsChecks) + if (!redirects.simpleertube.normal.includes(item)) { + var index = simpleertubeNormalRedirectsChecks.indexOf(item); + if (index !== -1) simpleertubeNormalRedirectsChecks.splice(index, 1); + } + browser.storage.local.set({ simpleertubeNormalRedirectsChecks }) + + for (const item of simpleertubeTorRedirectsChecks) + if (!redirects.simpleertube.normal.includes(item)) { + var index = simpleertubeTorRedirectsChecks.indexOf(item); + if (index !== -1) simpleertubeTorRedirectsChecks.splice(index, 1); + } + browser.storage.local.set({ simpleertubeTorRedirectsChecks }) +} + +let + disablePeertubeTargets, + peertubeRedirects, + simpleertubeNormalRedirectsChecks, + simpleertubeNormalCustomRedirects, + simpleertubeTorRedirectsChecks, + simpleertubeTorCustomRedirects, + peerTubeTargets, + peertubeTargetsProtocol; + +function init() { + return new Promise(resolve => { + browser.storage.local.get( + [ + "disablePeertubeTargets", + "peertubeRedirects", + "simpleertubeNormalRedirectsChecks", + "simpleertubeNormalCustomRedirects", + "simpleertubeTorRedirectsChecks", + "simpleertubeTorCustomRedirects", + "peerTubeTargets", + "peertubeTargetsProtocol" + ], + r => { + disablePeertubeTargets = r.disablePeertubeTargets; + peertubeRedirects = r.peertubeRedirects; + simpleertubeNormalRedirectsChecks = r.simpleertubeNormalRedirectsChecks; + simpleertubeNormalCustomRedirects = r.simpleertubeNormalCustomRedirects; + simpleertubeTorRedirectsChecks = r.simpleertubeTorRedirectsChecks; + simpleertubeTorCustomRedirects = r.simpleertubeTorCustomRedirects; + peerTubeTargets = r.peerTubeTargets; + peertubeTargetsProtocol = r.peertubeTargetsProtocol; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function all() { + return [ + ...redirects.simpleertube.normal, + ...redirects.simpleertube.tor, + ...simpleertubeNormalCustomRedirects, + ...simpleertubeTorCustomRedirects, + ]; +} + +function redirect(url, type, initiator) { + if (disablePeertubeTargets) return; + if (initiator && (all().includes(initiator.origin) || peerTubeTargets.includes(initiator.host))) return; + let protocolHost = utils.protocolHost(url); + if (!peerTubeTargets.includes(protocolHost)) return; + if (type != "main_frame") return; + + let instancesList; + if (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]; + if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + if (url.host == 'search.joinpeertube.org' || url.host == 'sepiasearch.org') return randomInstance; + return `${randomInstance}/${url.host}${url.pathname}${url.search}`; +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (peertubeTargetsProtocol == 'normal') instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]; + else if (peertubeTargetsProtocol == 'tor') instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]; + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + browser.storage.local.get('cloudflareList', async r => { + simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]; + for (const instance of r.cloudflareList) { + let i = simpleertubeNormalRedirectsChecks.indexOf(instance); + if (i > -1) simpleertubeNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + peerTubeTargets: ['https://search.joinpeertube.org', ...dataJson.peertube], + disablePeertubeTargets: true, + peertubeRedirects: redirects, + + simpleertubeNormalRedirectsChecks: simpleertubeNormalRedirectsChecks, + simpleertubeNormalCustomRedirects: [], + + simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor], + simpleertubeTorCustomRedirects: [], + + peertubeTargetsProtocol: "normal", + }) + resolve(); + }) + }) + }) +} + +export default { + setRedirects, + switchInstance, + redirect, + initDefaults, +}; diff --git a/src/assets/javascripts/reddit.js b/src/assets/javascripts/reddit.js new file mode 100644 index 00000000..0735ba64 --- /dev/null +++ b/src/assets/javascripts/reddit.js @@ -0,0 +1,378 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = [ + /^https?:\/{2}(www\.|old\.|np\.|new\.|amp\.|)reddit\.com/, + /^https?:\/{2}(i\.|preview\.)redd\.it/, +]; +let redirects = { + "libreddit": { + "normal": [], + "tor": [] + }, + "teddit": { + "normal": [], + "tor": [] + }, +}; +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects = val; + libredditNormalRedirectsChecks = [...redirects.libreddit.normal]; + tedditNormalRedirectsChecks = [...redirects.teddit.normal] + for (const instance of r.cloudflareList) { + const a = libredditNormalRedirectsChecks.indexOf(instance); + if (a > -1) libredditNormalRedirectsChecks.splice(a, 1); + + const b = tedditNormalRedirectsChecks.indexOf(instance); + if (b > -1) tedditNormalRedirectsChecks.splice(b, 1); + } + browser.storage.local.set({ + redditRedirects: redirects, + libredditNormalRedirectsChecks, + tedditNormalRedirectsChecks + }) + }) +} + +let + disableReddit, + redditFrontend, + redditRedirects, + redditProtocol, + libredditNormalRedirectsChecks, + libredditNormalCustomRedirects, + libredditTorRedirectsChecks, + libredditTorCustomRedirects, + tedditNormalRedirectsChecks, + tedditNormalCustomRedirects, + tedditTorRedirectsChecks, + tedditTorCustomRedirects; + +function init() { + return new Promise(resolve => { + browser.storage.local.get( + [ + "disableReddit", + "redditFrontend", + "redditRedirects", + "redditProtocol", + "libredditNormalRedirectsChecks", + "libredditNormalCustomRedirects", + "libredditTorRedirectsChecks", + "libredditTorCustomRedirects", + "tedditNormalRedirectsChecks", + "tedditNormalCustomRedirects", + "tedditTorRedirectsChecks", + "tedditTorCustomRedirects", + ], + r => { + disableReddit = r.disableReddit; + redditFrontend = r.redditFrontend; + redditRedirects = r.redditRedirects; + redditProtocol = r.redditProtocol; + libredditNormalRedirectsChecks = r.libredditNormalRedirectsChecks; + libredditNormalCustomRedirects = r.libredditNormalCustomRedirects; + libredditTorRedirectsChecks = r.libredditTorRedirectsChecks; + libredditTorCustomRedirects = r.libredditTorCustomRedirects; + tedditNormalRedirectsChecks = r.tedditNormalRedirectsChecks; + tedditNormalCustomRedirects = r.tedditNormalCustomRedirects; + tedditTorRedirectsChecks = r.tedditTorRedirectsChecks; + tedditTorCustomRedirects = r.tedditTorCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function initLibredditCookies(test, from) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(from); + if (![ + ...libredditNormalRedirectsChecks, + ...libredditTorRedirectsChecks, + ...libredditNormalCustomRedirects, + ...libredditTorCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + if (!test) { + let checkedInstances; + if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]; + else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]; + for (const to of checkedInstances) { + utils.copyCookie('libreddit', from, to, "theme"); + utils.copyCookie('libreddit', from, to, "front_page"); + utils.copyCookie('libreddit', from, to, "layout"); + utils.copyCookie('libreddit', from, to, "wide"); + utils.copyCookie('libreddit', from, to, "post_sort"); + utils.copyCookie('libreddit', from, to, "comment_sort"); + utils.copyCookie('libreddit', from, to, "show_nsfw"); + utils.copyCookie('libreddit', from, to, "autoplay_videos"); + utils.copyCookie('libreddit', from, to, "use_hls"); + utils.copyCookie('libreddit', from, to, "hide_hls_notification"); + } + } + resolve(true); + }) +} + +function setLibredditCookies() { + return new Promise(async resolve => { + await init(); + if (disableReddit || redditFrontend != 'libreddit' || redditProtocol === undefined) { resolve(); return; } + let checkedInstances; + if (redditProtocol == 'normal') checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects] + else if (redditProtocol == 'tor') checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('libreddit', to, "theme"); + utils.getCookiesFromStorage('libreddit', to, "front_page"); + utils.getCookiesFromStorage('libreddit', to, "layout"); + utils.getCookiesFromStorage('libreddit', to, "wide"); + utils.getCookiesFromStorage('libreddit', to, "post_sort"); + utils.getCookiesFromStorage('libreddit', to, "comment_sort"); + utils.getCookiesFromStorage('libreddit', to, "show_nsfw"); + utils.getCookiesFromStorage('libreddit', to, "autoplay_videos"); + utils.getCookiesFromStorage('libreddit', to, "use_hls"); + utils.getCookiesFromStorage('libreddit', to, "hide_hls_notification"); + } + resolve(); + }) +} + +function initTedditCookies(test, from) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(from); + if (![ + ...tedditNormalRedirectsChecks, + ...tedditTorRedirectsChecks, + ...tedditNormalCustomRedirects, + ...tedditTorCustomRedirects, + ].includes(protocolHost)) resolve(); + + if (!test) { + let checkedInstances; + if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects] + else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects] + for (const to of checkedInstances) { + utils.copyCookie('teddit', from, to, 'collapse_child_comments') + utils.copyCookie('teddit', from, to, 'domain_instagram') + utils.copyCookie('teddit', from, to, 'domain_twitter') + utils.copyCookie('teddit', from, to, 'domain_youtube') + utils.copyCookie('teddit', from, to, 'flairs') + utils.copyCookie('teddit', from, to, 'highlight_controversial') + utils.copyCookie('teddit', from, to, 'nsfw_enabled') + utils.copyCookie('teddit', from, to, 'post_media_max_height') + utils.copyCookie('teddit', from, to, 'show_upvoted_percentage') + utils.copyCookie('teddit', from, to, 'show_upvotes') + utils.copyCookie('teddit', from, to, 'theme') + utils.copyCookie('teddit', from, to, 'videos_muted') + } + } + resolve(true); + }) +} + +function setTedditCookies() { + return new Promise(async resolve => { + await init(); + if (disableReddit || redditFrontend != 'teddit' || redditProtocol === undefined) { resolve(); return; } + let checkedInstances; + if (redditProtocol == 'normal') checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects] + else if (redditProtocol == 'tor') checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('teddit', to, 'collapse_child_comments') + utils.getCookiesFromStorage('teddit', to, 'domain_instagram') + utils.getCookiesFromStorage('teddit', to, 'domain_twitter') + utils.getCookiesFromStorage('teddit', to, 'domain_youtube') + utils.getCookiesFromStorage('teddit', to, 'flairs') + utils.getCookiesFromStorage('teddit', to, 'highlight_controversial') + utils.getCookiesFromStorage('teddit', to, 'nsfw_enabled') + utils.getCookiesFromStorage('teddit', to, 'post_media_max_height') + utils.getCookiesFromStorage('teddit', to, 'show_upvoted_percentage') + utils.getCookiesFromStorage('teddit', to, 'show_upvotes') + utils.getCookiesFromStorage('teddit', to, 'theme') + utils.getCookiesFromStorage('teddit', to, 'videos_muted') + } + resolve(); + }) +} + +function all() { + return [ + ...redditRedirects.libreddit.normal, + ...redditRedirects.libreddit.tor, + ...redditRedirects.teddit.normal, + ...redditRedirects.teddit.tor, + ...libredditNormalCustomRedirects, + ...libredditTorCustomRedirects, + ...tedditNormalCustomRedirects, + ...tedditTorCustomRedirects, + ]; +} + +// https://libreddit.exonip.de/vid/1mq8d0ma3yk81/720.mp4 +// https://libreddit.exonip.de/img/4v3t1vgvrzk81.png + +// https://teddit.net/vids/1mq8d0ma3yk81.mp4 +// https://teddit.net/pics/w:null_4v3t1vgvrzk81.png + + +// redd.it/t5379n +// https://v.redd.it/z08avb339n801/DASH_1_2_M +// https://i.redd.it/bfkhs659tzk81.jpg +function redirect(url, type, initiator) { + if (disableReddit) return; + if (!targets.some(rx => rx.test(url.href))) return; + if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; + const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/; + if (type !== "main_frame" || url.pathname.match(bypassPaths)) return; + + let libredditInstancesList; + let tedditInstancesList; + if (redditProtocol == 'normal') { + libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]; + tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]; + } else if (redditProtocol == 'tor') { + libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]; + tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]; + } + + if (url.host === "i.redd.it") { + if (redditFrontend == 'teddit') { + if (tedditInstancesList.length === 0) return; + let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList); + return `${tedditRandomInstance}/pics/w:null_${url.pathname.substring(1)}${url.reddit}`; + } + if (redditFrontend == 'libreddit') { + if (libredditInstancesList.length === 0) return; + let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList); + return `${libredditRandomInstance}/img${url.pathname}${url.reddit}` + } + } + else if (url.host === "redd.it") { + if (redditFrontend == 'libreddit' && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) { + if (libredditInstancesList.length === 0) return; + let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList); + // https://redd.it/foo => https://libredd.it/comments/foo + return `${libredditRandomInstance}/comments${url.pathname}${url.reddit}`; + } + if (redditFrontend == 'teddit' && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) { + if (tedditInstancesList.length === 0) return; + let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList); + // https://redd.it/foo => https://teddit.net/comments/foo + return `${tedditRandomInstance}/comments${url.pathname}${url.reddit}` + } + } + else if (url.host === 'preview.redd.it') { + if (redditFrontend == 'teddit') return; + if (redditFrontend == 'libreddit') { + if (libredditInstancesList.length === 0) return; + const libredditRandomInstance = utils.getRandomInstance(libredditInstancesList); + return `${libredditRandomInstance}/preview/pre${url.pathname}${url.reddit}`; + } + } + + let randomInstance; + if (redditFrontend == 'libreddit') { + if (libredditInstancesList.length === 0) return; + randomInstance = utils.getRandomInstance(libredditInstancesList); + } + if (redditFrontend == 'teddit') { + if (tedditInstancesList.length === 0) return; + randomInstance = utils.getRandomInstance(tedditInstancesList); + } + return `${randomInstance}${url.pathname}${url.search}`; +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + let instancesList; + if (redditFrontend == 'libreddit') { + if (redditProtocol == 'normal') instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]; + else if (redditProtocol == 'tor') instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]; + if ([ + ...redditRedirects.teddit.normal, + ...redditRedirects.teddit.tor + ].includes(protocolHost)) url.pathname = url.pathname.replace("/pics/w:null_", "/img/"); + } + else if (redditFrontend == 'teddit') { + if (redditProtocol == 'normal') instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]; + else if (redditProtocol == 'tor') instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]; + if ([ + ...redditRedirects.libreddit.normal, + ...redditRedirects.libreddit.tor + ].includes(protocolHost) + ) url.pathname = url.pathname.replace("/img/", "/pics/w:null_"); + } + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.reddit}`); + }) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.teddit = dataJson.teddit; + redirects.libreddit = dataJson.libreddit; + browser.storage.local.get('cloudflareList', async r => { + libredditNormalRedirectsChecks = [...redirects.libreddit.normal]; + tedditNormalRedirectsChecks = [...redirects.teddit.normal] + for (const instance of r.cloudflareList) { + let i; + + i = libredditNormalRedirectsChecks.indexOf(instance); + if (i > -1) libredditNormalRedirectsChecks.splice(i, 1); + + i = tedditNormalRedirectsChecks.indexOf(instance); + if (i > -1) tedditNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableReddit: false, + redditProtocol: 'normal', + redditFrontend: 'libreddit', + redditRedirects: redirects, + + libredditNormalRedirectsChecks: libredditNormalRedirectsChecks, + libredditNormalCustomRedirects: [], + + libredditTorRedirectsChecks: [...redirects.libreddit.tor], + libredditTorCustomRedirects: [], + + tedditNormalRedirectsChecks: tedditNormalRedirectsChecks, + tedditNormalCustomRedirects: [], + + tedditTorRedirectsChecks: [...redirects.teddit.tor], + tedditTorCustomRedirects: [], + }); + resolve(); + }); + }); + }); +} + +export default { + setRedirects, + initLibredditCookies, + setLibredditCookies, + initTedditCookies, + setTedditCookies, + + redirect, + initDefaults, + switchInstance, +}; diff --git a/src/assets/javascripts/search.js b/src/assets/javascripts/search.js new file mode 100644 index 00000000..b32a8141 --- /dev/null +++ b/src/assets/javascripts/search.js @@ -0,0 +1,470 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = [ + /^https?:\/{2}(www\.|search\.|)google(\.[a-z]{2,3}){1,2}(\/search(\?.*|$)|\/$)/, + /^https?:\/{2}(www\.|www2\.|)bing\.com/, + /^https?:\/{2}yandex(\.[a-z]{2,3}){1,2}/, + /^https?:\/{2}search\.libredirect\.invalid/, +]; + +let redirects = { + "searx": { + "normal": [], + "tor": [], + "i2p": [] + }, + "searxng": { + "normal": [], + "tor": [], + "i2p": [] + }, + "whoogle": { + "normal": [], + "tor": [], + "i2p": [] + } +}; + +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects = val; + searxNormalRedirectsChecks = [...redirects.searx.normal]; + searxngNormalRedirectsChecks = [...redirects.searxng.normal]; + whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]; + for (const instance of r.cloudflareList) { + const a = searxNormalRedirectsChecks.indexOf(instance); + if (a > -1) searxNormalRedirectsChecks.splice(a, 1); + + const b = searxngNormalRedirectsChecks.indexOf(instance); + if (b > -1) searxngNormalRedirectsChecks.splice(b, 1); + + const c = whoogleNormalRedirectsChecks.indexOf(instance); + if (c > -1) whoogleNormalRedirectsChecks.splice(c, 1); + } + browser.storage.local.set({ + searchRedirects: redirects, + searxNormalRedirectsChecks, + searxngNormalRedirectsChecks, + whoogleNormalRedirectsChecks, + }); + }) +} + +let + disableSearch, + searchFrontend, + searchRedirects, + searchProtocol, + whoogleNormalRedirectsChecks, + whoogleNormalCustomRedirects, + whoogleTorRedirectsChecks, + whoogleTorCustomRedirects, + whoogleI2pRedirectsChecks, + whoogleI2pCustomRedirects, + searxNormalRedirectsChecks, + searxNormalCustomRedirects, + searxTorRedirectsChecks, + searxTorCustomRedirects, + searxI2pRedirectsChecks, + searxI2pCustomRedirects, + searxngNormalRedirectsChecks, + searxngNormalCustomRedirects, + searxngTorRedirectsChecks, + searxngTorCustomRedirects, + searxngI2pRedirectsChecks, + searxngI2pCustomRedirects; + +function init() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + "disableSearch", + "searchFrontend", + "searchRedirects", + "searchProtocol", + "whoogleNormalRedirectsChecks", + "whoogleNormalCustomRedirects", + "whoogleTorRedirectsChecks", + "whoogleTorCustomRedirects", + "whoogleI2pRedirectsChecks", + "whoogleI2pCustomRedirects", + "searxNormalRedirectsChecks", + "searxNormalCustomRedirects", + "searxTorRedirectsChecks", + "searxTorCustomRedirects", + "searxI2pRedirectsChecks", + "searxI2pCustomRedirects", + "searxngNormalRedirectsChecks", + "searxngNormalCustomRedirects", + "searxngTorRedirectsChecks", + "searxngTorCustomRedirects", + "searxngI2pRedirectsChecks", + "searxngI2pCustomRedirects", + ], + r => { + disableSearch = r.disableSearch; + searchFrontend = r.searchFrontend; + searchRedirects = r.searchRedirects; + searchProtocol = r.searchProtocol; + whoogleNormalRedirectsChecks = r.whoogleNormalRedirectsChecks; + whoogleNormalCustomRedirects = r.whoogleNormalCustomRedirects; + whoogleTorRedirectsChecks = r.whoogleTorRedirectsChecks; + whoogleTorCustomRedirects = r.whoogleTorCustomRedirects; + whoogleI2pRedirectsChecks = r.whoogleI2pRedirectsChecks; + whoogleI2pCustomRedirects = r.whoogleI2pCustomRedirects; + searxNormalRedirectsChecks = r.searxNormalRedirectsChecks; + searxNormalCustomRedirects = r.searxNormalCustomRedirects; + searxTorRedirectsChecks = r.searxTorRedirectsChecks; + searxTorCustomRedirects = r.searxTorCustomRedirects; + searxI2pRedirectsChecks = r.searxI2pRedirectsChecks; + searxI2pCustomRedirects = r.searxI2pCustomRedirects; + searxngNormalRedirectsChecks = r.searxngNormalRedirectsChecks; + searxngNormalCustomRedirects = r.searxngNormalCustomRedirects; + searxngTorRedirectsChecks = r.searxngTorRedirectsChecks; + searxngTorCustomRedirects = r.searxngTorCustomRedirects; + searxngI2pRedirectsChecks = r.searxngI2pRedirectsChecks; + searxngI2pCustomRedirects = r.searxngI2pCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function initSearxCookies(test, from) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(from); + if (![ + ...searxNormalRedirectsChecks, + ...searxNormalCustomRedirects, + ...searxTorRedirectsChecks, + ...searxTorCustomRedirects, + ...searxI2pRedirectsChecks, + ...searxI2pCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + if (!test) { + let checkedInstances; + if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]; + else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]; + else if (searchProtocol == 'i2p') checkedInstances = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]; + for (const to of checkedInstances) { + utils.copyCookie('searx', from, to, 'advanced_search'); + utils.copyCookie('searx', from, to, 'autocomplete'); + utils.copyCookie('searx', from, to, 'categories'); + utils.copyCookie('searx', from, to, 'disabled_engines'); + utils.copyCookie('searx', from, to, 'disabled_plugins'); + utils.copyCookie('searx', from, to, 'doi_resolver'); + utils.copyCookie('searx', from, to, 'enabled_engines'); + utils.copyCookie('searx', from, to, 'enabled_plugins'); + utils.copyCookie('searx', from, to, 'image_proxy'); + utils.copyCookie('searx', from, to, 'language'); + utils.copyCookie('searx', from, to, 'locale'); + utils.copyCookie('searx', from, to, 'method'); + utils.copyCookie('searx', from, to, 'oscar-style'); + utils.copyCookie('searx', from, to, 'results_on_new_tab'); + utils.copyCookie('searx', from, to, 'safesearch'); + utils.copyCookie('searx', from, to, 'theme'); + utils.copyCookie('searx', from, to, 'tokens'); + } + } + resolve(true); + }) +} + +function setSearxCookies() { + return new Promise(async resolve => { + await init(); + if (disableSearch || searchFrontend != 'searx') { resolve(); return; } + let checkedInstances; + if (searchProtocol == 'normal') checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects] + else if (searchProtocol == 'tor') checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('searx', to, 'advanced_search'); + utils.getCookiesFromStorage('searx', to, 'autocomplete'); + utils.getCookiesFromStorage('searx', to, 'categories'); + utils.getCookiesFromStorage('searx', to, 'disabled_engines'); + utils.getCookiesFromStorage('searx', to, 'disabled_plugins'); + utils.getCookiesFromStorage('searx', to, 'doi_resolver'); + utils.getCookiesFromStorage('searx', to, 'enabled_engines'); + utils.getCookiesFromStorage('searx', to, 'enabled_plugins'); + utils.getCookiesFromStorage('searx', to, 'image_proxy'); + utils.getCookiesFromStorage('searx', to, 'language'); + utils.getCookiesFromStorage('searx', to, 'locale'); + utils.getCookiesFromStorage('searx', to, 'method'); + utils.getCookiesFromStorage('searx', to, 'oscar-style'); + utils.getCookiesFromStorage('searx', to, 'results_on_new_tab'); + utils.getCookiesFromStorage('searx', to, 'safesearch'); + utils.getCookiesFromStorage('searx', to, 'theme'); + utils.getCookiesFromStorage('searx', to, 'tokens'); + } + resolve(); + }) +} + +function initSearxngCookies(test, from) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(from); + if (![ + ...searxngNormalRedirectsChecks, + ...searxngNormalCustomRedirects, + ...searxngTorRedirectsChecks, + ...searxngTorCustomRedirects, + ...searxngI2pRedirectsChecks, + ...searxngI2pCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + if (!test) { + let checkedInstances; + if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]; + else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]; + else if (searchProtocol == 'i2p') checkedInstances = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]; + for (const to of checkedInstances) { + utils.copyCookie('searxng', from, to, 'autocomplete'); + utils.copyCookie('searxng', from, to, 'categories'); + utils.copyCookie('searxng', from, to, 'disabled_engines'); + utils.copyCookie('searxng', from, to, 'disabled_plugins'); + utils.copyCookie('searxng', from, to, 'doi_resolver'); + utils.copyCookie('searxng', from, to, 'enabled_plugins'); + utils.copyCookie('searxng', from, to, 'enabled_engines'); + utils.copyCookie('searxng', from, to, 'image_proxy'); + utils.copyCookie('searxng', from, to, 'infinite_scroll'); + utils.copyCookie('searxng', from, to, 'language'); + utils.copyCookie('searxng', from, to, 'locale'); + utils.copyCookie('searxng', from, to, 'maintab'); + utils.copyCookie('searxng', from, to, 'method'); + utils.copyCookie('searxng', from, to, 'query_in_title'); + utils.copyCookie('searxng', from, to, 'results_on_new_tab'); + utils.copyCookie('searxng', from, to, 'safesearch'); + utils.copyCookie('searxng', from, to, 'simple_style'); + utils.copyCookie('searxng', from, to, 'theme'); + utils.copyCookie('searxng', from, to, 'tokens'); + } + } + resolve(true); + }) +} + +function setSearxngCookies() { + return new Promise(async resolve => { + await init(); + if (disableSearch || searchFrontend != 'searxng', searchProtocol === undefined) { resolve(); return; } + let checkedInstances; + if (searchProtocol == 'normal') checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects] + else if (searchProtocol == 'tor') checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('searxng', to, 'autocomplete'); + utils.getCookiesFromStorage('searxng', to, 'categories'); + utils.getCookiesFromStorage('searxng', to, 'disabled_engines'); + utils.getCookiesFromStorage('searxng', to, 'disabled_plugins'); + utils.getCookiesFromStorage('searxng', to, 'doi_resolver'); + utils.getCookiesFromStorage('searxng', to, 'enabled_plugins'); + utils.getCookiesFromStorage('searxng', to, 'enabled_engines'); + utils.getCookiesFromStorage('searxng', to, 'image_proxy'); + utils.getCookiesFromStorage('searxng', to, 'infinite_scroll'); + utils.getCookiesFromStorage('searxng', to, 'language'); + utils.getCookiesFromStorage('searxng', to, 'locale'); + utils.getCookiesFromStorage('searxng', to, 'maintab'); + utils.getCookiesFromStorage('searxng', to, 'method'); + utils.getCookiesFromStorage('searxng', to, 'query_in_title'); + utils.getCookiesFromStorage('searxng', to, 'results_on_new_tab'); + utils.getCookiesFromStorage('searxng', to, 'safesearch'); + utils.getCookiesFromStorage('searxng', to, 'simple_style'); + utils.getCookiesFromStorage('searxng', to, 'theme'); + utils.getCookiesFromStorage('searxng', to, 'tokens'); + } + resolve(); + }) +} + + +function redirect(url) { + if (disableSearch) return; + if (!targets.some(rx => rx.test(url.href))) return; + if (url.searchParams.has('tbm')) return; + if (url.hostname.includes('google') && !url.searchParams.has('q') && url.pathname != '/') return; + let randomInstance; + let path; + if (searchFrontend == 'searx') { + let instancesList; + if (searchProtocol == 'normal') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]; + else if (searchProtocol == 'tor') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]; + else if (searchProtocol == 'i2p') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]; + if (instancesList.length === 0) return; + randomInstance = utils.getRandomInstance(instancesList) + path = "/"; + } + else if (searchFrontend == 'searxng') { + let instancesList; + if (searchProtocol == 'normal') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]; + else if (searchProtocol == 'tor') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]; + else if (searchProtocol == 'i2p') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]; + if (instancesList.length === 0) return; + randomInstance = utils.getRandomInstance(instancesList) + path = "/"; + } + else if (searchFrontend == 'whoogle') { + let instancesList; + if (searchProtocol == 'normal') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]; + if (searchProtocol == 'tor') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]; + if (searchProtocol == 'i2p') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects]; + if (instancesList.length === 0) return; + randomInstance = utils.getRandomInstance(instancesList) + path = "/search"; + } + + if ( + ((url.hostname.includes('google') || url.hostname.includes('bing')) && !url.searchParams.has('q')) || + (url.hostname.includes('yandex') && !url.searchParams.has('text')) + ) path = '/'; + + let searchQuery = ""; + if ( + ( + url.hostname.includes('google') || + url.hostname.includes('bing') || + url.hostname.includes('search.libredirect.invalid') + ) && + url.searchParams.has('q') + ) searchQuery = `?q=${url.searchParams.get('q')}`; + if (url.hostname.includes('yandex') && url.searchParams.has('text')) searchQuery = `?q=${url.searchParams.get('text')}`; + + return `${randomInstance}${path}${searchQuery}`; +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(url); + if (![ + ...searchRedirects.searx.normal, + ...searchRedirects.searx.tor, + ...searchRedirects.searx.i2p, + + ...searchRedirects.searxng.normal, + ...searchRedirects.searxng.tor, + ...searchRedirects.searxng.i2p, + + ...searchRedirects.whoogle.normal, + ...searchRedirects.whoogle.tor, + ...searchRedirects.whoogle.i2p, + + ...searxNormalCustomRedirects, + ...searxTorCustomRedirects, + ...searxI2pCustomRedirects, + + ...searxngNormalCustomRedirects, + ...searxngTorCustomRedirects, + ...searxngI2pCustomRedirects, + + ...whoogleNormalCustomRedirects, + ...whoogleTorCustomRedirects, + ...whoogleI2pCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (searchProtocol == 'normal') { + if (searchFrontend == 'searx') instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]; + else if (searchFrontend == 'searxng') instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]; + else if (searchFrontend == 'whoogle') instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]; + } + else if (searchProtocol == 'tor') { + if (searchFrontend == 'searx') instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]; + else if (searchFrontend == 'searxng') instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]; + else if (searchFrontend == 'whoogle') instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]; + } + else if (searchProtocol == 'i2p') { + if (searchFrontend == 'searx') instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]; + else if (searchFrontend == 'searxng') instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]; + else if (searchFrontend == 'whoogle') instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects]; + } + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(async resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.searx = dataJson.searx; + redirects.searxng = dataJson.searxng; + redirects.whoogle = dataJson.whoogle; + + browser.storage.local.get('cloudflareList', async r => { + whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]; + searxNormalRedirectsChecks = [...redirects.searx.normal]; + searxngNormalRedirectsChecks = [...redirects.searxng.normal]; + for (const instance of r.cloudflareList) { + let i; + + i = whoogleNormalRedirectsChecks.indexOf(instance); + if (i > -1) whoogleNormalRedirectsChecks.splice(i, 1); + + i = searxNormalRedirectsChecks.indexOf(instance); + if (i > -1) searxNormalRedirectsChecks.splice(i, 1); + + i = searxngNormalRedirectsChecks.indexOf(instance); + if (i > -1) searxngNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableSearch: false, + searchFrontend: 'searxng', + searchRedirects: redirects, + searxngCustomSettings: false, + searchProtocol: 'normal', + + whoogleNormalRedirectsChecks: whoogleNormalRedirectsChecks, + whoogleNormalCustomRedirects: [], + + whoogleTorRedirectsChecks: [...redirects.whoogle.tor], + whoogleTorCustomRedirects: [], + + whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p], + whoogleI2pCustomRedirects: [], + + searxNormalRedirectsChecks: searxNormalRedirectsChecks, + searxNormalCustomRedirects: [], + + searxTorRedirectsChecks: [...redirects.searx.tor], + searxTorCustomRedirects: [], + + searxI2pRedirectsChecks: [...redirects.searx.i2p], + searxI2pCustomRedirects: [], + + searxngNormalRedirectsChecks: searxngNormalRedirectsChecks, + searxngNormalCustomRedirects: [], + + searxngTorRedirectsChecks: [...redirects.searxng.tor], + searxngTorCustomRedirects: [], + + searxngI2pRedirectsChecks: [...redirects.searxng.i2p], + searxngI2pCustomRedirects: [], + }) + resolve(); + }) + }) + }) +} + +export default { + setRedirects, + initSearxCookies, + setSearxCookies, + initSearxngCookies, + setSearxngCookies, + redirect, + initDefaults, + switchInstance, +}; diff --git a/src/assets/javascripts/sendTargets.js b/src/assets/javascripts/sendTargets.js new file mode 100644 index 00000000..a3e87268 --- /dev/null +++ b/src/assets/javascripts/sendTargets.js @@ -0,0 +1,149 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = [ + /^https?:\/{2}send\.libredirect\.invalid\/$/, + /^ https ?: \/\/send\.firefox\.com\/$/, + /^https?:\/{2}sendfiles\.online\/$/ +]; + +let redirects = { + "send": { + "normal": [], + "tor": [] + } +} +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects.send = val; + sendNormalRedirectsChecks = [...redirects.send.normal]; + for (const instance of r.cloudflareList) { + const a = sendNormalRedirectsChecks.indexOf(instance); + if (a > -1) sendNormalRedirectsChecks.splice(a, 1); + } + browser.storage.local.set({ + sendTargetsRedirects: redirects, + sendNormalRedirectsChecks, + }) + }) +} + +let + disableSendTarget, + sendTargetsRedirects, + sendNormalRedirectsChecks, + sendNormalCustomRedirects, + sendTorRedirectsChecks, + sendTorCustomRedirects, + sendTargetsProtocol; + +function init() { + return new Promise(resolve => { + browser.storage.local.get( + [ + "disableSendTarget", + "sendTargetsRedirects", + "sendTargetsProtocol", + "sendNormalRedirectsChecks", + "sendNormalCustomRedirects", + "sendTorRedirectsChecks", + "sendTorCustomRedirects", + ], + r => { + disableSendTarget = r.disableSendTarget; + sendTargetsRedirects = r.sendTargetsRedirects; + sendNormalRedirectsChecks = r.sendNormalRedirectsChecks; + sendNormalCustomRedirects = r.sendNormalCustomRedirects; + sendTorRedirectsChecks = r.sendTorRedirectsChecks; + sendTorCustomRedirects = r.sendTorCustomRedirects; + sendTargetsProtocol = r.sendTargetsProtocol; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function all() { + return [ + ...sendTargetsRedirects.send.normal, + ...sendTargetsRedirects.send.tor, + ...sendNormalCustomRedirects, + ...sendTorRedirectsChecks, + ...sendTorCustomRedirects, + ]; +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + if (url.pathname != '/') { resolve(); return; } + + let instancesList; + if (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]; + else if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]; + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function redirect(url, type, initiator) { + if (disableSendTarget) return; + if (type != "main_frame") return; + if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return; + if (!targets.some(rx => rx.test(url.href))) return; + + let instancesList; + if (sendTargetsProtocol == 'normal') instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]; + if (sendTargetsProtocol == 'tor') instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + return randomInstance; +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.send = dataJson.send; + browser.storage.local.get('cloudflareList', async r => { + sendNormalRedirectsChecks = [...redirects.send.normal]; + for (const instance of r.cloudflareList) { + let i = sendNormalRedirectsChecks.indexOf(instance); + if (i > -1) sendNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableSendTarget: false, + sendTargetsRedirects: redirects, + + sendNormalRedirectsChecks: sendNormalRedirectsChecks, + sendNormalCustomRedirects: [], + + sendTorRedirectsChecks: [...redirects.send.tor], + sendTorCustomRedirects: [], + + sendTargetsProtocol: "normal", + }) + resolve(); + }) + }) + }) +} + +export default { + setRedirects, + redirect, + switchInstance, + initDefaults, +}; diff --git a/src/assets/javascripts/tiktok.js b/src/assets/javascripts/tiktok.js new file mode 100644 index 00000000..750744e6 --- /dev/null +++ b/src/assets/javascripts/tiktok.js @@ -0,0 +1,175 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = [ + /^https?:\/{2}(www\.|)tiktok\.com.*/ +]; + +let redirects = { + "proxiTok": { + "normal": [], + "tor": [] + } +} +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects.proxiTok = val; + proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]; + for (const instance of r.cloudflareList) { + const a = proxiTokNormalRedirectsChecks.indexOf(instance); + if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1); + } + browser.storage.local.set({ + tiktokRedirects: redirects, + proxiTokNormalRedirectsChecks + }) + }) +} + +function initProxiTokCookies(test, from) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(from); + if (![ + ...proxiTokNormalRedirectsChecks, + ...proxiTokNormalCustomRedirects, + ...proxiTokTorRedirectsChecks, + ...proxiTokTorCustomRedirects, + ].includes(protocolHost)) resolve(); + + if (!test) { + let checkedInstances; + if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects] + else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects] + for (const to of checkedInstances) { + utils.copyCookie('proxitok', from, to, 'theme'); + utils.copyCookie('proxitok', from, to, 'api-legacy'); + } + } + resolve(true); + }) +} + +function setProxiTokCookies() { + return new Promise(resolve => { + if (disableTiktok || tiktokProtocol === undefined) { resolve(); return; } + let checkedInstances; + if (tiktokProtocol == 'normal') checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects] + else if (tiktokProtocol == 'tor') checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('proxitok', to, 'theme'); + utils.getCookiesFromStorage('proxitok', to, 'api-legacy'); + } + resolve(); + }) +} + +let + disableTiktok, + tiktokProtocol, + tiktokRedirects, + proxiTokNormalRedirectsChecks, + proxiTokNormalCustomRedirects, + proxiTokTorRedirectsChecks, + proxiTokTorCustomRedirects; + +function init() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + "disableTiktok", + "tiktokProtocol", + "tiktokRedirects", + "proxiTokNormalRedirectsChecks", + "proxiTokNormalCustomRedirects", + "proxiTokTorRedirectsChecks", + "proxiTokTorCustomRedirects", + ], + r => { + disableTiktok = r.disableTiktok; + tiktokProtocol = r.tiktokProtocol; + tiktokRedirects = r.tiktokRedirects; + proxiTokNormalRedirectsChecks = r.proxiTokNormalRedirectsChecks; + proxiTokNormalCustomRedirects = r.proxiTokNormalCustomRedirects; + proxiTokTorRedirectsChecks = r.proxiTokTorRedirectsChecks; + proxiTokTorCustomRedirects = r.proxiTokTorCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +// https://www.tiktok.com/@keysikaspol/video/7061265241887345946 +// https://www.tiktok.com/@keysikaspol +function redirect(url, type, initiator) { + if (disableTiktok) return; + if (type != "main_frame") return; + const all = [ + ...tiktokRedirects.proxiTok.normal, + ...proxiTokNormalCustomRedirects + ]; + if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return; + if (!targets.some(rx => rx.test(url.href))) return; + + let instancesList; + if (tiktokProtocol == 'normal') instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]; + if (tiktokProtocol == 'tor') instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + return `${randomInstance}${url.pathname}`; +} + +function reverse(url) { + return new Promise(async resolve => { + await init(); + let protocolHost = utils.protocolHost(url); + const all = [ + ...tiktokRedirects.proxiTok.normal, + ...tiktokRedirects.proxiTok.tor, + ...proxiTokNormalCustomRedirects, + ...proxiTokTorCustomRedirects + ]; + if (!all.includes(protocolHost)) { resolve(); return; } + + resolve(`https://tiktok.com${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(async resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.proxiTok = dataJson.proxiTok; + await browser.storage.local.set({ + disableTiktok: false, + tiktokProtocol: "normal", + + tiktokRedirects: redirects, + + proxiTokNormalRedirectsChecks: [...redirects.proxiTok.normal], + proxiTokNormalCustomRedirects: [], + + proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor], + proxiTokTorCustomRedirects: [], + }); + resolve(); + }); + }) +} + +export default { + setRedirects, + + redirect, + reverse, + + initProxiTokCookies, + setProxiTokCookies, + + initDefaults +}; diff --git a/src/assets/javascripts/translate/get_lingva_preferences.js b/src/assets/javascripts/translate/get_lingva_preferences.js new file mode 100644 index 00000000..f04ea3dc --- /dev/null +++ b/src/assets/javascripts/translate/get_lingva_preferences.js @@ -0,0 +1,10 @@ +window.browser = window.browser || window.chrome; + +browser.storage.local.set( + { + ['lingva_lingva_chakra-ui-color-mode']: localStorage.getItem('chakra-ui-color-mode'), + lingva_lingva_isauto: localStorage.getItem('isauto'), + lingva_lingva_source: localStorage.getItem('source'), + lingva_lingva_target: localStorage.getItem('target'), + } +) diff --git a/src/assets/javascripts/translate/set_lingva_preferences.js b/src/assets/javascripts/translate/set_lingva_preferences.js new file mode 100644 index 00000000..01a3b85e --- /dev/null +++ b/src/assets/javascripts/translate/set_lingva_preferences.js @@ -0,0 +1,19 @@ +window.browser = window.browser || window.chrome; + +browser.storage.local.get( + [ + "lingva_chakra-ui-color-mode", + "lingva_isauto", + "lingva_source", + "lingva_target", + ], + r => { + if (r['lingva_chakra-ui-color-mode'] !== undefined) localStorage.setItem('chakra-ui-color-mode', r['lingva_chakra-ui-color-mode']); + if (r.lingva_isauto !== undefined) localStorage.setItem('isauto', r.lingva_isauto); + console.log('r.lingva_isauto', r.lingva_isauto, localStorage.getItem('isauto')) + if (r.lingva_source !== undefined) localStorage.setItem('source', r.lingva_source); + if (r.lingva_target !== undefined) localStorage.setItem('target', r.lingva_target); + + window.close(); + } +) diff --git a/src/assets/javascripts/translate/translate.js b/src/assets/javascripts/translate/translate.js new file mode 100644 index 00000000..3c8f9222 --- /dev/null +++ b/src/assets/javascripts/translate/translate.js @@ -0,0 +1,295 @@ +window.browser = window.browser || window.chrome; + +import utils from '../utils.js' + +const targets = [ + /^https?:\/{2}translate\.google(\.[a-z]{2,3}){1,2}\//, +]; + +let redirects = { + "simplyTranslate": { + "normal": [], + "tor": [] + }, + "lingva": { + "normal": [], + "tor": [] + } +}; + +let + translateDisable, + translateFrontend, + translateProtocol, + translateRedirects, + simplyTranslateNormalRedirectsChecks, + simplyTranslateNormalCustomRedirects, + simplyTranslateTorRedirectsChecks, + simplyTranslateTorCustomRedirects, + lingvaNormalRedirectsChecks, + lingvaNormalCustomRedirects, + lingvaTorRedirectsChecks, + lingvaTorCustomRedirects; + +function init() { + return new Promise(resolve => { + browser.storage.local.get( + [ + "translateDisable", + "translateFrontend", + "translateProtocol", + "translateRedirects", + + "simplyTranslateNormalRedirectsChecks", + "simplyTranslateNormalCustomRedirects", + "simplyTranslateTorRedirectsChecks", + "simplyTranslateTorCustomRedirects", + + "lingvaNormalRedirectsChecks", + "lingvaNormalCustomRedirects", + "lingvaTorRedirectsChecks", + "lingvaTorCustomRedirects", + ], + r => { + translateDisable = r.translateDisable; + translateFrontend = r.translateFrontend; + translateProtocol = r.translateProtocol; + translateRedirects = r.translateRedirects; + simplyTranslateNormalRedirectsChecks = r.simplyTranslateNormalRedirectsChecks; + simplyTranslateNormalCustomRedirects = r.simplyTranslateNormalCustomRedirects; + simplyTranslateTorRedirectsChecks = r.simplyTranslateTorRedirectsChecks; + simplyTranslateTorCustomRedirects = r.simplyTranslateTorCustomRedirects; + lingvaNormalRedirectsChecks = r.lingvaNormalRedirectsChecks; + lingvaNormalCustomRedirects = r.lingvaNormalCustomRedirects; + lingvaTorRedirectsChecks = r.lingvaTorRedirectsChecks; + lingvaTorCustomRedirects = r.lingvaTorCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects = val; + simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]; + lingvaNormalRedirectsChecks = [...redirects.lingva.normal] + for (const instance of r.cloudflareList) { + const a = simplyTranslateNormalRedirectsChecks.indexOf(instance); + if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1); + + const b = lingvaNormalRedirectsChecks.indexOf(instance); + if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1); + } + browser.storage.local.set({ + translateRedirects: redirects, + simplyTranslateNormalRedirectsChecks, + simplyTranslateTorRedirectsChecks: redirects.simplyTranslate.tor, + lingvaNormalRedirectsChecks, + lingvaTorRedirectsChecks: redirects.lingva.tor, + }) + }) +} + +function initLingvaLocalStorage(test, url, tabId) { + return new Promise(async resolve => { + await init(); + if (translateDisable || translateFrontend != 'lingva') { resolve(); return; } + const protocolHost = utils.protocolHost(url); + if (![ + ...lingvaNormalRedirectsChecks, + ...lingvaNormalCustomRedirects, + ...lingvaTorRedirectsChecks, + ...lingvaTorCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + if (!test) { + browser.tabs.executeScript( + tabId, + { file: "/assets/javascripts/translate/get_lingva_preferences.js", runAt: "document_start" } + ); + + let checkedInstances; + if (translateProtocol == 'normal') checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]; + if (translateProtocol == 'tor') checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]; + const i = checkedInstances.indexOf(protocolHost); + if (i !== -1) checkedInstances.splice(i, 1); + if (checkedInstances.length === 0) { resolve(); return; } + for (const to of checkedInstances) + browser.tabs.create( + { url: to }, + tab => browser.tabs.executeScript(tab.id, { file: "/assets/javascripts/translate/set_lingva_preferences.js", runAt: "document_start" }) + ); + } + resolve(true); + } + ) +} + +function initSimplyTranslateCookies(test, from) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(from); + if (![ + ...simplyTranslateNormalRedirectsChecks, + ...simplyTranslateNormalCustomRedirects, + ...simplyTranslateTorRedirectsChecks, + ...simplyTranslateTorCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + if (!test) { + let checkedInstances; + if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects] + else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects] + for (const to of checkedInstances) { + utils.copyCookie('simplyTranslate', from, to, 'from_lang'); + utils.copyCookie('simplyTranslate', from, to, 'to_lang'); + utils.copyCookie('simplyTranslate', from, to, 'tts_enabled'); + utils.copyCookie('simplyTranslate', from, to, 'use_text_fields'); + } + } + resolve(true); + } + ) +} + +function setSimplyTranslateCookies() { + return new Promise(async resolve => { + await init(); + if (translateDisable || translateFrontend != 'simplyTranslate') { resolve(); return; } + let checkedInstances; + if (translateProtocol == 'normal') checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects] + else if (translateProtocol == 'tor') checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('simplyTranslate', to, 'from_lang'); + utils.getCookiesFromStorage('simplyTranslate', to, 'to_lang'); + utils.getCookiesFromStorage('simplyTranslate', to, 'tts_enabled'); + utils.getCookiesFromStorage('simplyTranslate', to, 'use_text_fields'); + } + resolve(); + } + ) +} + +function redirect(url) { + if (translateDisable) return; + if (!targets.some(rx => rx.test(url.href))) return; + + if (translateFrontend == 'simplyTranslate') { + let instancesList; + if (translateProtocol == 'normal') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]; + if (translateProtocol == 'tor') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList) + return `${randomInstance}/${url.search}`; + } + else if (translateFrontend == 'lingva') { + let params_arr = url.search.split('&'); + params_arr[0] = params_arr[0].substring(1); + let params = {}; + for (let i = 0; i < params_arr.length; i++) { + let pair = params_arr[i].split('='); + params[pair[0]] = pair[1]; + } + let instancesList; + if (translateProtocol == 'normal') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]; + if (translateProtocol == 'tor') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList) + if (params.sl && params.tl && params.text) { + return `${randomInstance}/${params.sl}/${params.tl}/${params.text}` + } + return randomInstance; + } +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + if (translateDisable) { resolve(); return; } + const protocolHost = utils.protocolHost(url); + if (![ + ...translateRedirects.simplyTranslate.normal, + ...translateRedirects.simplyTranslate.tor, + + ...simplyTranslateNormalCustomRedirects, + ...simplyTranslateTorCustomRedirects, + + ...translateRedirects.lingva.normal, + ...translateRedirects.lingva.tor, + + ...lingvaNormalCustomRedirects, + ...lingvaTorCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (translateProtocol == 'normal') { + if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]; + else if (translateFrontend == 'lingva') instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]; + } + else if (translateProtocol == 'tor') { + if (translateFrontend == 'simplyTranslate') instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]; + else if (translateFrontend == 'lingva') instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]; + } + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(async resolve => { + fetch('/instances/data.json').then(response => response.text()).then(data => { + let dataJson = JSON.parse(data); + redirects.simplyTranslate = dataJson.simplyTranslate; + redirects.lingva = dataJson.lingva; + browser.storage.local.get('cloudflareList', + async r => { + simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]; + lingvaNormalRedirectsChecks = [...redirects.lingva.normal] + for (const instance of r.cloudflareList) { + const a = simplyTranslateNormalRedirectsChecks.indexOf(instance); + if (a > -1) simplyTranslateNormalRedirectsChecks.splice(a, 1); + + const b = lingvaNormalRedirectsChecks.indexOf(instance); + if (b > -1) lingvaNormalRedirectsChecks.splice(b, 1); + } + await browser.storage.local.set({ + translateDisable: false, + translateFrontend: "simplyTranslate", + translateProtocol: 'normal', + translateRedirects: redirects, + + simplyTranslateNormalRedirectsChecks: simplyTranslateNormalRedirectsChecks, + simplyTranslateNormalCustomRedirects: [], + simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor], + simplyTranslateTorCustomRedirects: [], + + lingvaNormalRedirectsChecks: lingvaNormalRedirectsChecks, + lingvaNormalCustomRedirects: [], + lingvaTorRedirectsChecks: [...redirects.lingva.tor], + lingvaTorCustomRedirects: [], + }) + resolve(); + }) + }) + }) +} + +export default { + initSimplyTranslateCookies, + setSimplyTranslateCookies, + initLingvaLocalStorage, + setRedirects, + redirect, + initDefaults, + switchInstance, +}; diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js new file mode 100644 index 00000000..d03c269f --- /dev/null +++ b/src/assets/javascripts/twitter.js @@ -0,0 +1,241 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = [ + /^https?:\/{2}(www\.|mobile\.|)twitter\.com/, + /^https?:\/{2}(pbs\.|video\.|)twimg\.com/, + /^https?:\/{2}platform\.twitter\.com\/embed/, + /^https?:\/{2}t\.co/ +]; + +let redirects = { + "nitter": { + "normal": [], + "tor": [] + }, +}; + +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects.nitter = val; + nitterNormalRedirectsChecks = [...redirects.nitter.normal]; + for (const instance of r.cloudflareList) { + let i = nitterNormalRedirectsChecks.indexOf(instance); + if (i > -1) nitterNormalRedirectsChecks.splice(i, 1); + } + browser.storage.local.set({ + twitterRedirects: redirects, + nitterNormalRedirectsChecks, + nitterTorRedirectsChecks: [...redirects.nitter.tor] + }) + }) +} + +let + disableTwitter, + twitterProtocol, + twitterRedirects, + nitterNormalRedirectsChecks, + nitterNormalCustomRedirects, + nitterTorRedirectsChecks, + nitterTorCustomRedirects; + +function init() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + "disableTwitter", + "twitterProtocol", + "twitterRedirects", + "nitterNormalRedirectsChecks", + "nitterNormalCustomRedirects", + "nitterTorRedirectsChecks", + "nitterTorCustomRedirects", + ], + r => { + disableTwitter = r.disableTwitter; + twitterProtocol = r.twitterProtocol; + twitterRedirects = r.twitterRedirects; + nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks; + nitterNormalCustomRedirects = r.nitterNormalCustomRedirects; + nitterTorRedirectsChecks = r.nitterTorRedirectsChecks; + nitterTorCustomRedirects = r.nitterTorCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function all() { + return [ + ...nitterNormalRedirectsChecks, + ...nitterTorRedirectsChecks, + ...nitterNormalCustomRedirects, + ...nitterTorCustomRedirects, + ]; +} + +function redirect(url, initiator) { + if (disableTwitter) return; + if (!targets.some(rx => rx.test(url.href))) return; + if (url.pathname.split("/").includes("home")) return; + if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; + + let instancesList; + if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]; + else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + // https://pbs.twimg.com/profile_images/648888480974508032/66_cUYfj_400x400.jpg + if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") + return `${randomInstance}/pic/${encodeURIComponent(`${url.host}${url.pathname}`)}`; + else if (url.pathname.split("/").includes("tweets")) + return `${randomInstance}${url.pathname.replace("/tweets", "")}${url.search}`; + else if (url.host == 't.co') + return `${randomInstance}/t.co${url.pathname}`; + else + return `${randomInstance}${url.pathname}${url.search}`; +} + +function reverse(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + resolve(`https://twitter.com${url.pathname}${url.search}`); + }) +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + let instancesList; + if (twitterProtocol == 'normal') instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]; + else if (twitterProtocol == 'tor') instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]; + + let index = instancesList.indexOf(protocolHost); + if (index > -1) instancesList.splice(index, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function removeXFrameOptions(e) { + let url = new URL(e.url); + let protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost) || e.type != 'sub_frame') return; + let isChanged = false; + for (const i in e.responseHeaders) if (e.responseHeaders[i].name == 'x-frame-options') { + e.responseHeaders.splice(i, 1); + isChanged = true; + } + if (isChanged) return { responseHeaders: e.responseHeaders }; +} + +function initNitterCookies(test, from) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(from); + if (!all().includes(protocolHost) + ) { resolve(); return; } + + if (!test) { + let checkedInstances; + if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects] + else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects] + for (const to of checkedInstances) { + utils.copyCookie('nitter', from, to, 'theme'); + utils.copyCookie('nitter', from, to, 'infiniteScroll'); + utils.copyCookie('nitter', from, to, 'stickyProfile'); + utils.copyCookie('nitter', from, to, 'bidiSupport'); + utils.copyCookie('nitter', from, to, 'hideTweetStats'); + utils.copyCookie('nitter', from, to, 'hideBanner'); + utils.copyCookie('nitter', from, to, 'hidePins'); + utils.copyCookie('nitter', from, to, 'hideReplies'); + utils.copyCookie('nitter', from, to, 'squareAvatars'); + utils.copyCookie('nitter', from, to, 'mp4Playback'); + utils.copyCookie('nitter', from, to, 'hlsPlayback'); + utils.copyCookie('nitter', from, to, 'proxyVideos'); + utils.copyCookie('nitter', from, to, 'muteVideos'); + utils.copyCookie('nitter', from, to, 'autoplayGifs'); + } + } + resolve(true); + }) +} + +function setNitterCookies() { + return new Promise(async resolve => { + await init(); + if (disableTwitter || twitterProtocol === undefined) { resolve(); return; } + let checkedInstances; + if (twitterProtocol == 'normal') checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects] + else if (twitterProtocol == 'tor') checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('nitter', to, 'theme'); + utils.getCookiesFromStorage('nitter', to, 'infiniteScroll'); + utils.getCookiesFromStorage('nitter', to, 'stickyProfile'); + utils.getCookiesFromStorage('nitter', to, 'bidiSupport'); + utils.getCookiesFromStorage('nitter', to, 'hideTweetStats'); + utils.getCookiesFromStorage('nitter', to, 'hideBanner'); + utils.getCookiesFromStorage('nitter', to, 'hidePins'); + utils.getCookiesFromStorage('nitter', to, 'hideReplies'); + utils.getCookiesFromStorage('nitter', to, 'squareAvatars'); + utils.getCookiesFromStorage('nitter', to, 'mp4Playback'); + utils.getCookiesFromStorage('nitter', to, 'hlsPlayback'); + utils.getCookiesFromStorage('nitter', to, 'proxyVideos'); + utils.getCookiesFromStorage('nitter', to, 'muteVideos'); + utils.getCookiesFromStorage('nitter', to, 'autoplayGifs'); + } + resolve(); + } + ) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(data => { + let dataJson = JSON.parse(data); + redirects.nitter = dataJson.nitter; + browser.storage.local.get('cloudflareList', async r => { + nitterNormalRedirectsChecks = [...redirects.nitter.normal]; + for (const instance of r.cloudflareList) { + let i = nitterNormalRedirectsChecks.indexOf(instance); + if (i > -1) nitterNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableTwitter: false, + twitterRedirects: redirects, + twitterProtocol: "normal", + + nitterNormalRedirectsChecks, + nitterNormalCustomRedirects: [], + + nitterTorRedirectsChecks: [...redirects.nitter.tor], + nitterTorCustomRedirects: [], + }) + resolve(); + }) + }) + }) +} + +export default { + setRedirects, + redirect, + switchInstance, + reverse, + removeXFrameOptions, + initNitterCookies, + setNitterCookies, + initDefaults, +}; diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js new file mode 100644 index 00000000..f1f18d9f --- /dev/null +++ b/src/assets/javascripts/utils.js @@ -0,0 +1,452 @@ +window.browser = window.browser || window.chrome; +import twitterHelper from "./twitter.js"; +import youtubeHelper from "./youtube/youtube.js"; +import instagramHelper from "./instagram.js"; +import mediumHelper from "./medium.js"; +import redditHelper from "./reddit.js"; +import searchHelper from "./search.js"; +import translateHelper from "./translate/translate.js"; +import wikipediaHelper from "./wikipedia.js"; +import peertubeHelper from "./peertube.js"; +import lbryHelper from "./lbry.js"; +import sendTargetsHelper from "./sendTargets.js"; +import tiktokHelper from "./tiktok.js"; +import imgurHelper from "./imgur.js"; +import localise from './localise.js' + +function getRandomInstance(instances) { + return instances[~~(instances.length * Math.random())]; +} + +let cloudflareList = []; +async function initCloudflareList() { + return new Promise(resolve => { + fetch('/instances/blocklist.json').then(response => response.text()).then(data => { + cloudflareList = JSON.parse(data); + resolve(); + }) + }); +} + +function updateInstances() { + return new Promise(async resolve => { + let http = new XMLHttpRequest(); + http.open('GET', 'https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json', false); + http.send(null); + if (http.status === 200) { + await initCloudflareList(); + const instances = JSON.parse(http.responseText); + + youtubeHelper.setRedirects({ 'invidious': instances.invidious, 'piped': instances.piped, }) + twitterHelper.setRedirects(instances.nitter); + instagramHelper.setRedirects(instances.bibliogram); + redditHelper.setRedirects({ 'libreddit': instances.libreddit, 'teddit': instances.teddit }); + translateHelper.setRedirects({ "simplyTranslate": instances.simplyTranslate, "lingva": instances.lingva }); + searchHelper.setRedirects({ 'searx': instances.searx, 'searxng': instances.searxng, 'whoogle': instances.whoogle }); + wikipediaHelper.setRedirects(instances.wikiless); + mediumHelper.setRedirects(instances.scribe); + sendTargetsHelper.setRedirects(instances.send); + tiktokHelper.setRedirects(instances.proxiTok); + + console.info("Successfully updated Instances"); + resolve(true); return; + } + resolve() + }) +} + +function protocolHost(url) { + if (url.username && url.password) return `${url.protocol}//${url.username}:${url.password}@${url.host}`; + return `${url.protocol}//${url.host}`; +} + +async function processDefaultCustomInstances(target, name, protocol, document) { + + function camelCase(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + let latencyKey = `${name}Latency`; + let instancesLatency; + await browser.storage.local.get(latencyKey, r => instancesLatency = r[latencyKey] ?? []); + let nameProtocolElement = document.getElementById(name).getElementsByClassName(protocol)[0]; + + let nameCustomInstances = []; + let nameCheckListElement = nameProtocolElement.getElementsByClassName('checklist')[0]; + + await initCloudflareList(); + + + let nameDefaultRedirects; + + let redirectsChecks = `${name}${camelCase(protocol)}RedirectsChecks`; + let customRedirects = `${name}${camelCase(protocol)}CustomRedirects`; + let redirectsKey = `${target}Redirects`; + + let redirects; + + async function getFromStorage() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + redirectsChecks, + customRedirects, + redirectsKey + ], + r => { + nameDefaultRedirects = r[redirectsChecks]; + nameCustomInstances = r[customRedirects]; + redirects = r[redirectsKey]; + resolve(); + } + ) + }) + } + await getFromStorage(); + + function calcNameCheckBoxes() { + let isTrue = true; + for (const item of redirects[name][protocol]) + if (!nameDefaultRedirects.includes(item)) { + isTrue = false; + break; + } + for (const element of nameCheckListElement.getElementsByTagName('input')) + element.checked = nameDefaultRedirects.includes(element.className) + if (nameDefaultRedirects.length == 0) isTrue = false; + nameProtocolElement.getElementsByClassName('toogle-all')[0].checked = isTrue; + } + nameCheckListElement.innerHTML = + [ + `
+ Toggle All + +
`, + ...redirects[name][protocol].map( + x => { + let cloudflare = cloudflareList.includes(x) ? ' cloudflare' : ''; + + let ms = instancesLatency[x]; + let latencyColor = (ms <= 1000 ? "green" : ms <= 2000 ? "orange" : "red"); + let latencyLimit; + if (ms == 5000) latencyLimit = '5000ms+'; + else if (ms > 5000) latencyLimit = `ERROR: ${ms - 5000}`; + else latencyLimit = ms + 'ms'; + + let latency = x in instancesLatency ? '' + latencyLimit + '' : ''; + + return `
+ ${x}${cloudflare} ${latency} + +
`; + } + ), + ].join('\n
\n'); + + localise.localisePage(); + + calcNameCheckBoxes(); + nameProtocolElement.getElementsByClassName('toogle-all')[0].addEventListener("change", async event => { + if (event.target.checked) + nameDefaultRedirects = [...redirects[name][protocol]]; + else + nameDefaultRedirects = []; + + await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects }); + calcNameCheckBoxes(); + }); + + for (let element of nameCheckListElement.getElementsByTagName('input')) { + if (element.className != 'toogle-all') + nameProtocolElement.getElementsByClassName(element.className)[0].addEventListener("change", async event => { + if (event.target.checked) + nameDefaultRedirects.push(element.className) + else { + let index = nameDefaultRedirects.indexOf(element.className); + if (index > -1) nameDefaultRedirects.splice(index, 1); + } + await browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects }); + calcNameCheckBoxes(); + }); + } + + function calcNameCustomInstances() { + nameProtocolElement.getElementsByClassName('custom-checklist')[0].innerHTML = + nameCustomInstances.map( + x => `
+ ${x} + +
+
` + ).join('\n'); + + for (const item of nameCustomInstances) { + nameProtocolElement.getElementsByClassName(`clear-${item}`)[0].addEventListener("click", async () => { + let index = nameCustomInstances.indexOf(item); + if (index > -1) nameCustomInstances.splice(index, 1); + await browser.storage.local.set({ [customRedirects]: nameCustomInstances }); + calcNameCustomInstances(); + }); + } + } + calcNameCustomInstances(); + nameProtocolElement.getElementsByClassName('custom-instance-form')[0].addEventListener("submit", async event => { + event.preventDefault(); + let nameCustomInstanceInput = nameProtocolElement.getElementsByClassName('custom-instance')[0]; + let url = new URL(nameCustomInstanceInput.value); + let protocolHostVar = protocolHost(url); + if (nameCustomInstanceInput.validity.valid && !redirects[name][protocol].includes(protocolHostVar)) { + if (!nameCustomInstances.includes(protocolHostVar)) { + nameCustomInstances.push(protocolHostVar) + await browser.storage.local.set({ [customRedirects]: nameCustomInstances }); + nameCustomInstanceInput.value = ''; + } + calcNameCustomInstances(); + } + }) +} + +function getIp(href) { + return new Promise(resolve => { + let host = new URL(href).hostname; + let http = new XMLHttpRequest(); + http.open("GET", `https://dns.google/resolve?name=${host}`, /*async*/true); + http.onreadystatechange = () => { + if (http.readyState == 4 && http.status == 200) { + let r = JSON.parse(http.responseText); + resolve(r.Answer[0].data) + } + }; + http.ontimeout = () => resolve() + http.onerror = () => resolve() + try { + http.send(null) + } + catch (exception) { + resolve() + } + }) +} + +async function ping(href) { + return new Promise(async resolve => { + let http = new XMLHttpRequest(); + http.open("GET", `${href}?_=${new Date().getTime()}`, /*async*/true); + http.timeout = 5000; + let started = new Date().getTime(); + http.onreadystatechange = () => { + if (http.readyState == 2) { + if (http.status == 200) { + let ended = new Date().getTime(); + http.abort(); + resolve(ended - started); + } + else + resolve(5000 + http.status) + } + }; + http.ontimeout = () => resolve(5000) + http.onerror = () => resolve() + try { + http.send(null); + } catch (exception) { + resolve() + } + }); +} + +async function testLatency(element, instances) { + return new Promise(async resolve => { + let myList = {}; + for (const href of instances) await ping(href).then(m => { + if (m) { + myList[href] = m; + let color; + if (m <= 1000) color = "green" + else if (m <= 2000) color = "orange" + else color = "red"; + + let text; + if (m == 5000) text = '5000ms+' + else if (m > 5000) text = `ERROR: ${m - 5000}`; + else text = `${m}ms`; + element.innerHTML = `${href}: ${text}`; + } + }) + resolve(myList); + }) +} + +function copyCookie(frontend, targetUrl, url, name) { + browser.cookies.get( + { url: protocolHost(targetUrl), name: name }, + r => { + if (r) { + browser.cookies.set({ url: url, name: name, value: r.value }) + browser.storage.local.set({ [`${frontend}_${name}`]: r.value }) + } + } + ) +} + +function getCookiesFromStorage(frontend, to, name) { + let key = `${frontend}_${name}`; + browser.storage.local.get( + key, + r => { + if (r[key] !== undefined) browser.cookies.set({ url: to, name: name, value: r[key] }) + } + ) +} + +function copyRaw(test, copyRawElement) { + return new Promise(resolve => { + browser.tabs.query( + { active: true, currentWindow: true }, async tabs => { + let currTab = tabs[0]; + if (currTab) { + let url; + try { url = new URL(currTab.url); } + catch { resolve(); return; } + + let newUrl = await youtubeHelper.reverse(url); + if (!newUrl) newUrl = await twitterHelper.reverse(url); + if (!newUrl) newUrl = await instagramHelper.reverse(url); + if (!newUrl) newUrl = await tiktokHelper.reverse(url); + if (!newUrl) newUrl = await imgurHelper.reverse(url); + + if (newUrl) { + resolve(true); + if (test) return; + navigator.clipboard.writeText(newUrl); + if (copyRawElement) { + const textElement = copyRawElement.getElementsByTagName('h4')[0] + const oldHtml = textElement.innerHTML; + textElement.innerHTML = browser.i18n.getMessage('copied'); + setTimeout(() => textElement.innerHTML = oldHtml, 1000); + } + } else resolve() + } + } + ) + }) +} + +function unify(test) { + return new Promise(resolve => { + browser.tabs.query( + { active: true, currentWindow: true }, + async tabs => { + let currTab = tabs[0] + if (currTab) { + let url; + try { url = new URL(currTab.url); } + catch { resolve(); return; } + + let result = await youtubeHelper.initInvidiousCookies(test, url); + if (!result) result = await youtubeHelper.initPipedLocalStorage(test, url, currTab.id); + if (!result) result = await youtubeHelper.initPipedMaterialLocalStorage(test, url, currTab.id); + + if (!result) result = await twitterHelper.initNitterCookies(test, url); + + if (!result) result = await redditHelper.initLibredditCookies(test, url); + if (!result) result = await redditHelper.initTedditCookies(test, url); + + if (!result) result = await searchHelper.initSearxCookies(test, url); + if (!result) result = await searchHelper.initSearxngCookies(test, url); + + if (!result) result = await tiktokHelper.initProxiTokCookies(test, url); + + if (!result) result = await wikipediaHelper.initWikilessCookies(test, url); + + if (!result) result = await translateHelper.initSimplyTranslateCookies(test, url); + if (!result) result = await translateHelper.initLingvaLocalStorage(test, url); + + if (result) { + resolve(true); + } else resolve() + } + } + ) + }) +} + +function switchInstance(test) { + return new Promise(resolve => { + browser.tabs.query({ active: true, currentWindow: true }, async tabs => { + let currTab = tabs[0]; + if (currTab) { + let url; + try { url = new URL(currTab.url); } + catch { resolve(); return }; + let newUrl = await youtubeHelper.switchInstance(url); + if (!newUrl) newUrl = await twitterHelper.switchInstance(url); + if (!newUrl) newUrl = await instagramHelper.switchInstance(url); + if (!newUrl) newUrl = await redditHelper.switchInstance(url); + if (!newUrl) newUrl = await searchHelper.switchInstance(url); + if (!newUrl) newUrl = await translateHelper.switchInstance(url); + if (!newUrl) newUrl = await mediumHelper.switchInstance(url); + if (!newUrl) newUrl = await sendTargetsHelper.switchInstance(url); + if (!newUrl) newUrl = await peertubeHelper.switchInstance(url); + if (!newUrl) newUrl = await lbryHelper.switchInstance(url); + if (!newUrl) newUrl = await imgurHelper.switchInstance(url); + if (!newUrl) newUrl = await wikipediaHelper.switchInstance(url); + + if (newUrl) { + if (!test) + browser.tabs.update({ url: newUrl }); + resolve(true) + } else resolve() + } + }) + }) +} + +function latency(name, frontend, document, location, splitNames) { + let latencyElement; + let latencyLabel; + if (splitNames == true) { + latencyElement = document.getElementById(`latency-${frontend}`); + latencyLabel = document.getElementById(`latency-${frontend}-label`); + } else { + latencyElement = document.getElementById("latency"); + latencyLabel = document.getElementById("latency-label"); + } + latencyElement.addEventListener("click", + async () => { + let reloadWindow = () => location.reload(); + latencyElement.addEventListener("click", reloadWindow); + let key = `${name}Redirects` + browser.storage.local.get( + key, + r => { + let redirects = r[key]; + const oldHtml = latencyLabel.innerHTML; + latencyLabel.innerHTML = '...'; + testLatency(latencyLabel, redirects[frontend].normal).then(r => { + browser.storage.local.set({ [`${frontend}Latency`]: r }); + latencyLabel.innerHTML = oldHtml; + processDefaultCustomInstances(name, frontend, 'normal', document); + latencyElement.removeEventListener("click", reloadWindow) + }); + } + ) + } + ); +} + +export default { + getRandomInstance, + updateInstances, + protocolHost, + processDefaultCustomInstances, + latency, + copyCookie, + getCookiesFromStorage, + switchInstance, + copyRaw, + unify, +} diff --git a/src/assets/javascripts/wikipedia.js b/src/assets/javascripts/wikipedia.js new file mode 100644 index 00000000..868bb01c --- /dev/null +++ b/src/assets/javascripts/wikipedia.js @@ -0,0 +1,220 @@ +window.browser = window.browser || window.chrome; + +import utils from './utils.js' + +const targets = /^https?:\/{2}(([a-z]{1,}\.){0,})wikipedia\.org/ + +let redirects = { + "wikiless": { + "normal": [], + "tor": [], + "i2p": [] + } +}; +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects.wikiless = val; + wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]; + for (const instance of r.cloudflareList) { + const a = wikilessNormalRedirectsChecks.indexOf(instance); + if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1); + } + browser.storage.local.set({ + wikipediaRedirects: redirects, + wikilessNormalRedirectsChecks + }) + }) +} + +let + disableWikipedia, + wikipediaRedirects, + wikipediaProtocol, + wikilessNormalRedirectsChecks, + wikilessTorRedirectsChecks, + wikilessI2pRedirectsChecks, + wikilessNormalCustomRedirects, + wikilessTorCustomRedirects, + wikilessI2pCustomRedirects; + +function init() { + return new Promise(async resolve => { + browser.storage.local.get( + [ + "disableWikipedia", + "wikipediaRedirects", + "wikipediaProtocol", + + "wikilessNormalRedirectsChecks", + "wikilessTorRedirectsChecks", + "wikilessI2pRedirectsChecks", + "wikilessNormalCustomRedirects", + "wikilessTorCustomRedirects", + "wikilessI2pCustomRedirects", + ], + r => { + disableWikipedia = r.disableWikipedia; + wikipediaRedirects = r.wikipediaRedirects; + wikipediaProtocol = r.wikipediaProtocol; + wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks; + wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks; + wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks; + wikilessNormalCustomRedirects = r.wikilessNormalCustomRedirects; + wikilessTorCustomRedirects = r.wikilessTorCustomRedirects; + wikilessI2pCustomRedirects = r.wikilessI2pCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function initWikilessCookies(test, from) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(from); + const all = [ + ...wikilessNormalRedirectsChecks, + ...wikilessNormalCustomRedirects, + ...wikilessTorRedirectsChecks, + ...wikilessTorCustomRedirects, + ...wikilessI2pRedirectsChecks, + ...wikilessI2pCustomRedirects, + ]; + if (!all.includes(protocolHost)) { resolve(); return; } + + if (!test) { + let checkedInstances; + if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects] + else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects] + else if (wikipediaProtocol == 'i2p') checkedInstances = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects] + + for (const to of checkedInstances) { + utils.copyCookie('wikiless', from, to, 'theme'); + utils.copyCookie('wikiless', from, to, 'default_lang'); + } + } + resolve(true); + }) +} + +function setWikilessCookies() { + return new Promise(async resolve => { + await init(); + if (disableWikipedia || wikipediaProtocol === undefined) { resolve(); return; } + let checkedInstances; + if (wikipediaProtocol == 'normal') checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects] + else if (wikipediaProtocol == 'tor') checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects] + for (const to of checkedInstances) { + utils.getCookiesFromStorage('wikiless', to, 'theme'); + utils.getCookiesFromStorage('wikiless', to, 'default_lang'); + } + resolve(); + }) +} + +function redirect(url) { + if (disableWikipedia) return; + if (!targets.test(url.href)) return; + + 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 instancesList; + if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]; + else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]; + else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pRedirectsChecks, ...wikilessI2pCustomRedirects]; + if (instancesList.length === 0) return; + const randomInstance = utils.getRandomInstance(instancesList) + + let link = `${randomInstance}${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]; + return link; +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + const wikipediaList = [ + ...wikipediaRedirects.wikiless.normal, + ...wikipediaRedirects.wikiless.tor, + ...wikipediaRedirects.wikiless.i2p, + + ...wikilessNormalCustomRedirects, + ...wikilessTorCustomRedirects, + ...wikilessI2pCustomRedirects + ]; + if (!wikipediaList.includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (wikipediaProtocol == 'normal') instancesList = [...wikilessNormalCustomRedirects, ...wikilessNormalRedirectsChecks]; + else if (wikipediaProtocol == 'tor') instancesList = [...wikilessTorCustomRedirects, ...wikilessTorRedirectsChecks]; + else if (wikipediaProtocol == 'i2p') instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]; + + let index = instancesList.indexOf(protocolHost); + if (index > -1) instancesList.splice(index, 1); + if (instancesList.length === 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.wikiless = dataJson.wikiless; + browser.storage.local.get('cloudflareList', async r => { + wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]; + for (const instance of r.cloudflareList) { + let i = wikilessNormalRedirectsChecks.indexOf(instance); + if (i > -1) wikilessNormalRedirectsChecks.splice(i, 1); + } + await browser.storage.local.set({ + disableWikipedia: true, + wikipediaRedirects: redirects, + wikipediaProtocol: "normal", + wikilessNormalRedirectsChecks: wikilessNormalRedirectsChecks, + wikilessTorRedirectsChecks: [...redirects.wikiless.tor], + wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p], + wikilessNormalCustomRedirects: [], + wikilessTorCustomRedirects: [], + wikilessI2pCustomRedirects: [], + }) + resolve(); + }) + }) + }) +} + +export default { + setRedirects, + + initWikilessCookies, + setWikilessCookies, + + redirect, + initDefaults, + switchInstance, +}; diff --git a/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js b/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js new file mode 100644 index 00000000..9d052f62 --- /dev/null +++ b/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js @@ -0,0 +1,7 @@ +window.browser = window.browser || window.chrome; + +browser.storage.local.set( + { + 'pipedMaterial_PREFERENCES': localStorage.getItem("PREFERENCES") + } +) \ No newline at end of file diff --git a/src/assets/javascripts/youtube/get_piped_preferences.js b/src/assets/javascripts/youtube/get_piped_preferences.js new file mode 100644 index 00000000..417d64df --- /dev/null +++ b/src/assets/javascripts/youtube/get_piped_preferences.js @@ -0,0 +1,24 @@ +window.browser = window.browser || window.chrome; + +browser.storage.local.set( + { + 'piped_bufferGoal': localStorage.getItem("bufferGoal"), + 'piped_comments': localStorage.getItem("comments"), + 'piped_disableLBRY': localStorage.getItem("disableLBRY"), + 'piped_enabledCodecs': localStorage.getItem("enabledCodecs"), + 'piped_hl': localStorage.getItem("hl"), + 'piped_homepage': localStorage.getItem("homepage"), + 'piped_instance': localStorage.getItem("instance"), + 'piped_listen': localStorage.getItem("listen"), + 'piped_minimizeDescription': localStorage.getItem("minimizeDescription"), + 'piped_playerAutoPlay': localStorage.getItem("playerAutoPlay"), + 'piped_proxyLBRY': localStorage.getItem("proxyLBRY"), + 'piped_quality': localStorage.getItem("quality"), + 'piped_region': localStorage.getItem("region"), + 'piped_selectedSkip': localStorage.getItem("selectedSkip"), + 'piped_sponsorblock': localStorage.getItem("sponsorblock"), + 'piped_theme': localStorage.getItem("theme"), + 'piped_volume': localStorage.getItem("volume"), + 'piped_watchHistory': localStorage.getItem("watchHistory"), + } +) diff --git a/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js b/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js new file mode 100644 index 00000000..7415255a --- /dev/null +++ b/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js @@ -0,0 +1,10 @@ +window.browser = window.browser || window.chrome; + +browser.storage.local.get( + "pipedMaterial_PREFERENCES", + r => { + if (r.pipedMaterial_PREFERENCES !== undefined) localStorage.setItem("PREFERENCES", r.pipedMaterial_PREFERENCES) + + window.close(); + } +) \ No newline at end of file diff --git a/src/assets/javascripts/youtube/set_piped_preferences.js b/src/assets/javascripts/youtube/set_piped_preferences.js new file mode 100644 index 00000000..d5ce49ff --- /dev/null +++ b/src/assets/javascripts/youtube/set_piped_preferences.js @@ -0,0 +1,44 @@ +window.browser = window.browser || window.chrome; + +browser.storage.local.get( + [ + "piped_bufferGoal", + "piped_comments", + "piped_disableLBRY", + "piped_enabledCodecs", + "piped_homepage", + "piped_listen", + "piped_minimizeDescription", + "piped_playerAutoPlay", + "piped_proxyLBRY", + "piped_quality", + "piped_region", + "piped_selectedSkip", + "piped_sponsorblock", + "piped_theme", + "piped_volume", + "piped_watchHistory", + ], + r => { + if (r.piped_bufferGoal !== undefined) localStorage.setItem("bufferGoal", r.piped_bufferGoal); + if (r.piped_comments !== undefined) localStorage.setItem("comments", r.piped_comments); + if (r.piped_disableLBRY !== undefined) localStorage.setItem("disableLBRY", r.piped_disableLBRY); + if (r.piped_hl !== undefined) localStorage.setItem("hl", r.piped_hl); + if (r.piped_enabledCodecs !== undefined) localStorage.setItem("enabledCodecs", r.piped_enabledCodecs); + if (r.piped_homepage !== undefined) localStorage.setItem("homepage", r.piped_homepage); + if (r.piped_instance !== undefined) localStorage.setItem("instance", r.piped_instance); + if (r.piped_listen !== undefined) localStorage.setItem("listen", r.piped_listen); + if (r.piped_minimizeDescription !== undefined) localStorage.setItem("minimizeDescription", r.piped_minimizeDescription); + if (r.piped_playerAutoPlay !== undefined) localStorage.setItem("playerAutoPlay", r.piped_playerAutoPlay); + if (r.piped_proxyLBRY !== undefined) localStorage.setItem("proxyLBRY", r.piped_proxyLBRY); + if (r.piped_quality !== undefined) localStorage.setItem("quality", r.piped_quality); + if (r.piped_region !== undefined) localStorage.setItem("region", r.piped_region); + if (r.piped_selectedSkip !== undefined) localStorage.setItem("selectedSkip", r.piped_selectedSkip); + if (r.piped_sponsorblock !== undefined) localStorage.setItem("sponsorblock", r.piped_sponsorblock); + if (r.piped_theme !== undefined) localStorage.setItem("theme", r.piped_theme); + if (r.piped_volume !== undefined) localStorage.setItem("volume", r.piped_volume); + if (r.piped_watchHistory !== undefined) localStorage.setItem("watchHistory", r.piped_watchHistory); + + window.close(); + } +) \ No newline at end of file diff --git a/src/assets/javascripts/youtube/youtube.js b/src/assets/javascripts/youtube/youtube.js new file mode 100644 index 00000000..f8227e90 --- /dev/null +++ b/src/assets/javascripts/youtube/youtube.js @@ -0,0 +1,451 @@ +"use strict"; + +window.browser = window.browser || window.chrome; + +import utils from '../utils.js' + +const targets = [ + /^https?:\/{2}(www\.|music\.|m\.|)youtube\.com(\/.*|$)/, + + /^https?:\/{2}img\.youtube\.com\/vi\/.*\/..*/, // https://stackoverflow.com/questions/2068344/how-do-i-get-a-youtube-video-thumbnail-from-the-youtube-api + /^https?:\/{2}(i|s)\.ytimg\.com\/vi\/.*\/..*/, + + /^https?:\/{2}(www\.|music\.|)youtube\.com\/watch\?v\=..*/, + + /^https?:\/{2}youtu\.be\/..*/, + + /^https?:\/{2}(www\.|)(youtube|youtube-nocookie)\.com\/embed\/..*/, +]; +let redirects = { + "invidious": { + "normal": [], + "tor": [] + }, + "piped": { + "normal": [], + "tor": [] + }, + "pipedMaterial": { + "normal": [ + "https://piped-material.xn--17b.net", + "https://piped-material.ftp.sh", + ], + "tor": [] + } +}; +function setRedirects(val) { + browser.storage.local.get('cloudflareList', r => { + redirects.invidious = val.invidious; + redirects.piped = val.piped; + invidiousNormalRedirectsChecks = [...redirects.invidious.normal]; + pipedNormalRedirectsChecks = [...redirects.piped.normal]; + for (const instance of r.cloudflareList) { + const a = invidiousNormalRedirectsChecks.indexOf(instance); + if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1); + + const b = pipedNormalRedirectsChecks.indexOf(instance); + if (b > -1) pipedNormalRedirectsChecks.splice(b, 1); + } + browser.storage.local.set({ + youtubeRedirects: redirects, + invidiousNormalRedirectsChecks, + invidiousTorRedirectsChecks: redirects.invidious.tor, + pipedNormalRedirectsChecks, + pipedTorRedirectsChecks: redirects.piped.tor, + }) + }) +} + +let + disableYoutube, + OnlyEmbeddedVideo, + youtubeFrontend, + youtubeProtocol, + youtubeEmbedFrontend, + youtubeRedirects, + invidiousNormalRedirectsChecks, + invidiousNormalCustomRedirects, + invidiousTorRedirectsChecks, + invidiousTorCustomRedirects, + pipedNormalRedirectsChecks, + pipedNormalCustomRedirects, + pipedTorRedirectsChecks, + pipedTorCustomRedirects, + pipedMaterialNormalRedirectsChecks, + pipedMaterialNormalCustomRedirects, + pipedMaterialTorRedirectsChecks, + pipedMaterialTorCustomRedirects; + +function init() { + return new Promise(resolve => { + browser.storage.local.get( + [ + "disableYoutube", + "OnlyEmbeddedVideo", + "youtubeFrontend", + "youtubeProtocol", + "youtubeEmbedFrontend", + "youtubeRedirects", + "invidiousNormalRedirectsChecks", + "invidiousNormalCustomRedirects", + "invidiousTorRedirectsChecks", + "invidiousTorCustomRedirects", + "pipedNormalRedirectsChecks", + "pipedNormalCustomRedirects", + "pipedTorRedirectsChecks", + "pipedTorCustomRedirects", + "pipedMaterialNormalRedirectsChecks", + "pipedMaterialNormalCustomRedirects", + "pipedMaterialTorRedirectsChecks", + "pipedMaterialTorCustomRedirects", + ], + r => { + disableYoutube = r.disableYoutube; + OnlyEmbeddedVideo = r.OnlyEmbeddedVideo; + youtubeFrontend = r.youtubeFrontend; + youtubeProtocol = r.youtubeProtocol; + youtubeEmbedFrontend = r.youtubeEmbedFrontend; + youtubeRedirects = r.youtubeRedirects; + invidiousNormalRedirectsChecks = r.invidiousNormalRedirectsChecks; + invidiousNormalCustomRedirects = r.invidiousNormalCustomRedirects; + invidiousTorRedirectsChecks = r.invidiousTorRedirectsChecks; + invidiousTorCustomRedirects = r.invidiousTorCustomRedirects; + pipedNormalRedirectsChecks = r.pipedNormalRedirectsChecks; + pipedNormalCustomRedirects = r.pipedNormalCustomRedirects; + pipedTorRedirectsChecks = r.pipedTorRedirectsChecks; + pipedTorCustomRedirects = r.pipedTorCustomRedirects; + pipedMaterialNormalRedirectsChecks = r.pipedMaterialNormalRedirectsChecks; + pipedMaterialNormalCustomRedirects = r.pipedMaterialNormalCustomRedirects; + pipedMaterialTorRedirectsChecks = r.pipedMaterialTorRedirectsChecks; + pipedMaterialTorCustomRedirects = r.pipedMaterialTorCustomRedirects; + resolve(); + } + ) + }) +} + +init(); +browser.storage.onChanged.addListener(init) + +function all() { + return [ + ...youtubeRedirects.invidious.normal, + ...youtubeRedirects.invidious.tor, + + ...youtubeRedirects.piped.normal, + ...youtubeRedirects.piped.tor, + + ...youtubeRedirects.pipedMaterial.normal, + ...youtubeRedirects.pipedMaterial.tor, + + ...invidiousNormalCustomRedirects, + ...invidiousTorCustomRedirects, + + ...pipedNormalCustomRedirects, + ...pipedTorCustomRedirects, + + ...pipedMaterialNormalCustomRedirects, + ...pipedMaterialTorCustomRedirects, + ]; +} + +function redirect(url, details, initiator) { + if (disableYoutube) return; + if (!targets.some(rx => rx.test(url.href))) return; + if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB'; + + const isInvidious = youtubeFrontend == 'invidious'; + const isPiped = youtubeFrontend == 'piped'; + const isPipedMaterial = youtubeFrontend == 'pipedMaterial' + const isFreetube = youtubeFrontend == 'freetube'; + const isYatte = youtubeFrontend == 'yatte'; + + const isFrontendYoutube = youtubeEmbedFrontend == "youtube"; + const isFrontendInvidious = youtubeEmbedFrontend == 'invidious'; + const isFrontendPiped = youtubeEmbedFrontend == 'piped'; + const isFrontendPipedMaterial = youtubeEmbedFrontend == 'pipedMaterial'; + + const isOnlyEmbeddedVideo = OnlyEmbeddedVideo == 'onlyNotEmbedded'; + const isOnlyNotEmbedded = OnlyEmbeddedVideo == 'onlyNotEmbedded' + + const is_main_frame = details.type === "main_frame"; + const is_sub_frame = details.type === "sub_frame"; + + if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) return; // Don't redirect YouTube Player API. + + if (youtubeFrontend == 'yatte' && is_main_frame) + return url.href.replace(/^https?:\/{2}/, 'yattee://'); + + else if (isFreetube && is_main_frame) + return `freetube://https:${url.pathname}${url.search}`; + + else if (isFreetube && params && isFrontendYoutube) + return; + + else if (isInvidious || ((isFreetube || isYatte) && isFrontendInvidious && is_sub_frame)) { + + if (isOnlyEmbeddedVideo && !is_sub_frame) return; + if (isOnlyNotEmbedded && params && !((isFreetube || isYatte) && isFrontendInvidious && is_sub_frame)) return; + + let instancesList; + if (youtubeProtocol == 'normal') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]; + else if (youtubeProtocol == 'tor') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]; + if (instancesList.length === 0) return; + let randomInstance = utils.getRandomInstance(instancesList); + + return `${randomInstance}${url.pathname}${url.search}`; + } else if (isPiped || ((isFreetube || isYatte) && isFrontendPiped && is_sub_frame)) { + + if (isOnlyEmbeddedVideo && !is_sub_frame) return; + if ( + isOnlyNotEmbedded && params && + !((isFreetube || isYatte) && isFrontendPiped && is_sub_frame) + ) return; + + let instancesList; + if (youtubeProtocol == 'normal') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]; + else if (youtubeProtocol == 'tor') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]; + if (instancesList.length === 0) return; + + const randomInstance = utils.getRandomInstance(instancesList); + return `${randomInstance}${url.pathname}${url.search}`; + } + else if (isPipedMaterial || ((isFreetube || isYatte) && isFrontendPipedMaterial && is_sub_frame)) { + if (isOnlyEmbeddedVideo && details.type !== "sub_frame") return; + if ( + isOnlyNotEmbedded && params && + !((isFreetube || isYatte) && isFrontendPipedMaterial && is_sub_frame) + ) return; + + let instancesList; + if (youtubeProtocol == 'normal') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]; + else if (youtubeProtocol == 'tor') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]; + + const randomInstance = utils.getRandomInstance(instancesList); + return `${randomInstance}${url.pathname}${url.search}`; + } + else return 'CANCEL'; +} + +function reverse(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + if (!all().includes(protocolHost)) { resolve(); return; } + resolve(`https://youtube.com${url.pathname}${url.search}`); + }) +} + +function switchInstance(url) { + return new Promise(async resolve => { + await init(); + const protocolHost = utils.protocolHost(url); + const instances = all(); + if (!instances.includes(protocolHost)) { resolve(); return; } + + let instancesList; + if (youtubeProtocol == 'normal') { + if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]; + else if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]; + else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]; + } + else if (youtubeProtocol == 'tor') { + if (youtubeFrontend == 'invidious') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]; + else if (youtubeFrontend == 'piped') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]; + else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]; + } + + const i = instancesList.indexOf(protocolHost); + if (i > -1) instancesList.splice(i, 1); + if (instancesList.length == 0) { resolve(); return; } + + const randomInstance = utils.getRandomInstance(instancesList); + resolve(`${randomInstance}${url.pathname}${url.search}`); + }) +} + +function initDefaults() { + return new Promise(async resolve => { + fetch('/instances/data.json').then(response => response.text()).then(async data => { + let dataJson = JSON.parse(data); + redirects.invidious = dataJson.invidious; + redirects.piped = dataJson.piped; + browser.storage.local.get('cloudflareList', async r => { + + invidiousNormalRedirectsChecks = [...redirects.invidious.normal]; + pipedNormalRedirectsChecks = [...redirects.piped.normal]; + pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]; + + for (const instance of r.cloudflareList) { + let i; + + i = invidiousNormalRedirectsChecks.indexOf(instance); + if (i > -1) invidiousNormalRedirectsChecks.splice(i, 1); + + i = pipedNormalRedirectsChecks.indexOf(instance); + if (i > -1) pipedNormalRedirectsChecks.splice(i, 1); + + i = pipedMaterialNormalRedirectsChecks.indexOf(instance); + if (i > -1) pipedMaterialNormalRedirectsChecks.splice(i, 1); + } + + await browser.storage.local.set({ + disableYoutube: false, + enableYoutubeCustomSettings: false, + OnlyEmbeddedVideo: 'both', + + youtubeRedirects: redirects, + + youtubeFrontend: 'invidious', + + invidiousNormalRedirectsChecks: invidiousNormalRedirectsChecks, + invidiousNormalCustomRedirects: [], + + invidiousTorRedirectsChecks: [...redirects.invidious.tor], + invidiousTorCustomRedirects: [], + + pipedNormalRedirectsChecks: pipedNormalRedirectsChecks, + pipedNormalCustomRedirects: [], + + pipedTorRedirectsChecks: [...redirects.piped.tor], + pipedTorCustomRedirects: [], + + pipedMaterialNormalRedirectsChecks: pipedMaterialNormalRedirectsChecks, + pipedMaterialNormalCustomRedirects: [], + + pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor], + pipedMaterialTorCustomRedirects: [], + + youtubeEmbedFrontend: 'invidious', + youtubeProtocol: 'normal', + }) + resolve(); + }) + }) + }) +} + +function initInvidiousCookies(test, from) { + return new Promise(async resolve => { + await init(); + if (disableYoutube || youtubeFrontend != 'invidious') { resolve(); return; } + const protocolHost = utils.protocolHost(from); + if (![ + ...invidiousNormalRedirectsChecks, + ...invidiousTorRedirectsChecks, + ...invidiousNormalCustomRedirects, + ...invidiousTorCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + if (!test) { + let checkedInstances; + if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects] + else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects] + const i = checkedInstances.indexOf(protocolHost); + if (i !== -1) checkedInstances.splice(i, 1); + for (const to of checkedInstances) + utils.copyCookie('invidious', from, to, 'PREFS'); + } + resolve(true); + }) +} + +function setInvidiousCookies() { + return new Promise(async resolve => { + await init(); + if (disableYoutube || youtubeFrontend != 'invidious') { resolve(); return; } + let checkedInstances; + if (youtubeProtocol == 'normal') checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects] + else if (youtubeProtocol == 'tor') checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects] + for (const to of checkedInstances) + utils.getCookiesFromStorage('invidious', to, 'PREFS'); + resolve(); + }) +} + +function initPipedLocalStorage(test, url, tabId) { + return new Promise(async resolve => { + await init(); + if (disableYoutube || youtubeFrontend != 'piped') { resolve(); return; } + const protocolHost = utils.protocolHost(url); + if (![ + ...pipedNormalCustomRedirects, + ...pipedNormalRedirectsChecks, + ...pipedTorRedirectsChecks, + ...pipedTorCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + if (!test) { + + browser.tabs.executeScript(tabId, { file: "/assets/javascripts/youtube/get_piped_preferences.js", runAt: "document_start" }); + + let checkedInstances; + if (youtubeProtocol == 'normal') checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks] + else if (youtubeProtocol == 'tor') checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects] + const i = checkedInstances.indexOf(protocolHost); + if (i !== -1) checkedInstances.splice(i, 1); + for (const to of checkedInstances) { + browser.tabs.create({ url: to }, + tab => browser.tabs.executeScript(tab.id, { file: "/assets/javascripts/youtube/set_piped_preferences.js", runAt: "document_start" })) + } + } + resolve(true); + }) +} + +function initPipedMaterialLocalStorage(test, url, tabId,) { + return new Promise(async resolve => { + await init(); + if (disableYoutube || youtubeFrontend != 'pipedMaterial') { resolve(); return; } + const protocolHost = utils.protocolHost(url); + if (![ + ...pipedMaterialNormalRedirectsChecks, + ...pipedMaterialNormalCustomRedirects, + ...pipedMaterialTorRedirectsChecks, + ...pipedMaterialTorCustomRedirects, + ].includes(protocolHost)) { resolve(); return; } + + if (!test) { + browser.tabs.executeScript(tabId, { file: "/assets/javascripts/youtube/get_pipedMaterial_preferences.js", runAt: "document_start" }); + + let checkedInstances; + if (youtubeProtocol == 'normal') checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects] + else if (youtubeProtocol == 'tor') checkedInstances = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects] + const i = checkedInstances.indexOf(protocolHost); + if (i !== -1) checkedInstances.splice(i, 1); + for (const to of checkedInstances) + browser.tabs.create( + { url: to }, + tab => browser.tabs.executeScript(tab.id, { file: "/assets/javascripts/youtube/set_pipedMaterial_preferences.js", runAt: "document_start" }) + ); + } + resolve(true); + }) +} + +function removeXFrameOptions(e) { + const url = new URL(e.url); + let protocolHost = utils.protocolHost(url); + const instances = all(); + if (!instances.includes(protocolHost) || e.type != 'sub_frame') return; + + let isChanged = false; + for (const i in e.responseHeaders) + if (e.responseHeaders[i].name == 'x-frame-options') { + e.responseHeaders.splice(i, 1); + isChanged = true; + } + if (isChanged) return { responseHeaders: e.responseHeaders }; +} + +export default { + setRedirects, + initPipedLocalStorage, + initPipedMaterialLocalStorage, + initInvidiousCookies, + setInvidiousCookies, + redirect, + reverse, + switchInstance, + initDefaults, + removeXFrameOptions, +}; diff --git a/src/assets/javascripts/youtubeMusic.js b/src/assets/javascripts/youtubeMusic.js new file mode 100644 index 00000000..68fa4f24 --- /dev/null +++ b/src/assets/javascripts/youtubeMusic.js @@ -0,0 +1,97 @@ +"use strict"; + +import utils from './utils.js' + +window.browser = window.browser || window.chrome; + +const targets = [ + /^https?:\/{2}music\.youtube\.com(\/.*|$)/, +]; +let redirects = { + "beatbump": { + "normal": [ + "https://beatbump.ml" + ], + "tor": [] + }, +}; + +let + disableYoutubeMusic, + beatbumpNormalRedirectsChecks, + beatbumpNormalCustomRedirects; + +function init() { + browser.storage.local.get( + [ + "disableYoutubeMusic", + "beatbumpNormalRedirectsChecks", + "beatbumpNormalCustomRedirects", + ], + r => { + disableYoutubeMusic = r.disableYoutubeMusic; + beatbumpNormalRedirectsChecks = r.beatbumpNormalRedirectsChecks; + beatbumpNormalCustomRedirects = r.beatbumpNormalCustomRedirects; + } + ) +} + +init(); +browser.storage.onChanged.addListener(init) + +/* +Video +https://music.youtube.com/watch?v=_PkGiKBW-DA&list=RDAMVM_PkGiKBW-DA +https://beatbump.ml/listen?id=_PkGiKBW-DA&list=RDAMVM_PkGiKBW-DA + +Playlist +https://music.youtube.com/playlist?list=PLqxd0OMLeWy64zlwhjouj92ISc38FbOns +https://music.youtube.com/playlist?list=PLqxd0OMLeWy7lrJSzt9LnOJjbC1IaruPM +https://music.youtube.com/playlist?list=PLQod4DlD72ZMJmOrSNbmEmK_iZ1oXPzKd +https://beatbump.ml/playlist/VLPLqxd0OMLeWy64zlwhjouj92ISc38FbOns + +Channel +https://music.youtube.com/channel/UCfgmMDI7T5tOQqjnOBRe_wg +https://beatbump.ml/artist/UCfgmMDI7T5tOQqjnOBRe_wg + +Albums +https://music.youtube.com/playlist?list=OLAK5uy_n-9HVh3cryV2gREZM9Sc0JwEKYjjfi0dU +https://music.youtube.com/playlist?list=OLAK5uy_lcr5O1zS8f6WIFI_yxqVp2RK9Dyy2bbw0 +https://beatbump.ml/release?id=MPREb_3DURc4yEUtD +https://beatbump.ml/release?id=MPREb_evaZrV1WNdS + +https://music.youtube.com/playlist?list=OLAK5uy_n6OHVllUZUCnlIY1m-gUaH8uqkN3Y-Ca8 +https://music.youtube.com/playlist?list=OLAK5uy_nBOTxAc3_RGB82-Z54jdARGxGaCYlpngY +https://beatbump.ml/release?id=MPREb_QygdC0wEoLe + +https://music.youtube.com/watch?v=R6gSMSYKhKU&list=OLAK5uy_n-9HVh3cryV2gREZM9Sc0JwEKYjjfi0dU +*/ +function redirect(url, type, initiator) { + if (disableYoutubeMusic) return; + if (!targets.some(rx => rx.test(url.href))) return; + + let instancesList = [...beatbumpNormalRedirectsChecks, ...beatbumpNormalCustomRedirects]; + if (instancesList.length === 0) return; + const randomInstance = utils.getRandomInstance(instancesList); + resolve( + `${randomInstance}${url.pathname}${url.search}` + .replace("/watch?v=", "/listen?id=") + .replace("/channel/", "/artist/") + .replace("/playlist?list=", "/playlist/VL") + ); +} + +async function initDefaults() { + await browser.storage.local.set({ + disableYoutubeMusic: true, + youtubeMusicRedirects: redirects, + + beatbumpNormalRedirectsChecks: [...redirects.beatbump.normal], + beatbumpNormalCustomRedirects: [], + }) +} + +export default { + redirect, + initDefaults, +}; -- cgit 1.4.1