diff --git a/README.md b/README.md index f22e037..6424a2e 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,51 @@ -A web extension that redirects YouTube, Twitter, TikTok... requests to alternative privacy friendly frontends and backends. +A browser extension that redirects YouTube, Twitter, TikTok... requests to alternative privacy friendly frontends and backends. -[![Firefox Add-on](./img/badge-amo.png)](https://addons.mozilla.org/firefox/addon/libredirect/)  + + + - + ## Translate - -[![Weblate](./img/weblate.svg)](https://hosted.weblate.org/projects/libredirect/extension) + + + ## Development -Requirements: [Node.js LTS](https://nodejs.org/) +Install [Node.js](https://nodejs.org/) ```bash git clone https://github.com/libredirect/browser_extension cd browser_extension npm install -npm run html # Generates html files using Pug -npm run start # Runs in debug mode in firefox using Web-ext +npm run html # Generates html using Pug +npm run start # Runs in firefox in debug mode using Web-ext ``` -### Run on Chromium manually +### Build and Run on Chromium manually 1. Open `chrome://extensions` 2. Enable `dev mode` 3. Select `load unpacked extension` 4. Select `src` folder -### Build zip package (Firefox) +### Build a zip package for Firefox ```bash npm run build ``` -### Install zip package on Firefox (temporarily) +### Install the zip package on Firefox (temporarily) 3. Type in the address bar: `about:debugging#/runtime/this-firefox` 4. Press `Load Temporary Add-on...` 5. Select `libredirect-VERSION.zip` from `web-ext-artifacts` folder -### Install zip package on Firefox ESR, Developer Edition, Nightly +### Install the zip package on Firefox ESR, Developer Edition, Nightly 3. Type in the address bar: `about:config` 4. Set `xpinstall.signatures.required` to `false` 5. Type in the address bar: `about:addons` 6. Click on the gear shaped `settings` button and select `Install Add-on From File...` 7. Select `libredirect-VERSION.zip` from `web-ext-artifacts` folder - --- Forked from [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect) diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js index aa16345..61d033c 100644 --- a/src/assets/javascripts/services.js +++ b/src/assets/javascripts/services.js @@ -56,7 +56,7 @@ function redirect(url, type, initiator, forceRedirection) { for (const service in config.services) { if (!forceRedirection && !options[service].enabled) continue - frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0] + frontend = options[service].frontend if (!regexArray(service, url, config, frontend)) { frontend = null @@ -210,7 +210,6 @@ function redirect(url, type, initiator, forceRedirection) { .replace("tl", "target") .replace("text", "q") return `${randomInstance}/${search}` - } case "lingva": { let params_arr = url.search.split("&") @@ -623,7 +622,7 @@ function switchInstance(url) { const protocolHost = utils.protocolHost(url) for (const service in config.services) { - let frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0] + let frontend = options[service].frontend let instancesList = options[frontend] if (instancesList === undefined) continue if (!instancesList.includes(protocolHost)) continue @@ -650,7 +649,7 @@ function reverse(url) { let protocolHost = utils.protocolHost(url) for (const service in config.services) { - let frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0] + let frontend = options[service].frontend if (options[frontend] == undefined) continue if (!options[frontend].includes(protocolHost)) continue diff --git a/src/config.json b/src/config.json index b68321b..32dec36 100644 --- a/src/config.json +++ b/src/config.json @@ -150,6 +150,7 @@ "enabled": false, "redirectType": "main_frame", "unsupportedUrls": "bypass", + "frontend": "nitter", "instance": "public" }, "imageType": "png", @@ -171,7 +172,9 @@ "name": "TikTok", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "proxiTok", + "instance": "public" }, "imageType": "png", "embeddable": false, @@ -224,6 +227,7 @@ "enabled": false, "redirectType": "main_frame", "unsupportedUrls": "bypass", + "frontend": "rimgo", "instance": "public" }, "imageType": "png", @@ -289,7 +293,9 @@ "name": "Quora", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "quetre", + "instance": "public" }, "imageType": "png", "embeddable": false, @@ -310,7 +316,9 @@ "name": "IMDb", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "libremdb", + "instance": "public" }, "imageType": "svg", "embeddable": false, @@ -331,7 +339,8 @@ "options": { "enabled": false, "unsupportedUrls": "bypass", - "instance": "public" + "instance": "public", + "frontend": "breezeWiki" }, "imageType": "svg", "embeddable": false, @@ -354,7 +363,8 @@ "options": { "enabled": false, "redirectType": "main_frame", - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "lbryDesktop" }, "imageType": "png", "embeddable": true, @@ -391,7 +401,8 @@ "options": { "enabled": false, "frontend": "searxng", - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "instance": "public" }, "imageType": "svgMono", "embeddable": false, @@ -475,7 +486,8 @@ "name": "Send Files", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "send" }, "imageType": "svgMono", "embeddable": false, @@ -495,7 +507,8 @@ "name": "Paste Text", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "privateBin" }, "imageType": "svgMono", "embeddable": false, @@ -515,7 +528,8 @@ "name": "Reuters", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "neuters" }, "imageType": "svg", "embeddable": false, @@ -536,7 +550,9 @@ "name": "Genius", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "dumb", + "instance": "public" }, "imageType": "svg", "embeddable": false, @@ -556,7 +572,8 @@ "name": "Urban Dictionary", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "ruralDictionary" }, "imageType": "svg", "embeddable": false, @@ -578,7 +595,9 @@ "name": "Stack Overflow", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "anonymousOverflow", + "instance": "public" }, "imageType": "svgMono", "embeddable": false, @@ -599,7 +618,9 @@ "name": "Goodreads", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "biblioReads", + "instance": "public" }, "imageType": "svgMono", "embeddable": false, @@ -619,7 +640,8 @@ "name": "Wikipedia", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "wikiless" }, "imageType": "svg", "embeddable": false, @@ -639,7 +661,8 @@ "name": "Snopes", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "suds" }, "imageType": "svg", "embeddable": false, @@ -659,7 +682,8 @@ "name": "Wayback Machine", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "waybackClassic" }, "imageType": "svgMono", "embeddable": false, @@ -679,7 +703,8 @@ "name": "GitHub", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "gothub" }, "imageType": "svgMono", "embeddable": false, @@ -700,7 +725,8 @@ "name": "Bilibili", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "mikuInvidious" }, "imageType": "svgMono", "embeddable": false, @@ -721,7 +747,8 @@ "name": "Bandcamp", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "tent" }, "imageType": "svg", "embeddable": false, @@ -741,7 +768,8 @@ "name": "WolframAlpha", "options": { "enabled": false, - "unsupportedUrls": "bypass" + "unsupportedUrls": "bypass", + "frontend": "wolfreeAlpha" }, "imageType": "svg", "embeddable": false, diff --git a/src/pages/background/background.js b/src/pages/background/background.js index 8e42776..cb92560 100644 --- a/src/pages/background/background.js +++ b/src/pages/background/background.js @@ -53,8 +53,8 @@ browser.webRequest.onBeforeRequest.addListener( } if (!newUrl) { - const match = url.href.match(/^https?:\/{2}(.*)\.libredirect\.invalid.*/) - if (match[1]) { + const match = url.href.match(/^https?:\/{2}.*\.libredirect\.invalid.*/) + if (match) { browser.tabs.update({ url: browser.runtime.getURL(`/pages/messages/no_instance.html`) }); diff --git a/src/pages/options/index.js b/src/pages/options/index.js index 5b22965..c8eb500 100644 --- a/src/pages/options/index.js +++ b/src/pages/options/index.js @@ -35,8 +35,10 @@ async function changeFrontendsSettings(service) { if (typeof divs[service].frontend !== "undefined") { if (frontend == divs[service].frontend.value) { frontendDiv.style.display = "" - if (config.services[service].frontends[frontend].localhost == true) { + console.log(config.services[service].frontends[frontend].localhost) + if (config.services[service].frontends[frontend].localhost === true) { document.getElementById(`${service}-instance-div`).style.display = "" + if (options[service].instance == "localhost") { frontendDiv.style.display = "none" } @@ -50,7 +52,8 @@ async function changeFrontendsSettings(service) { } } if (document.getElementById(`${service}-redirectType`)) { - const frontend = options[service].frontend ?? Object.keys(config.services[service].frontends)[0] + const frontend = options[service].frontend + console.log(frontend) if (config.services[service].frontends[frontend].embeddable) { document.getElementById(`${service}-redirectType`).innerHTML = ` - ` + document.getElementById(`${service}-redirectType`).innerHTML = + '' options[service].redirectType = "main_frame" browser.storage.local.set({ options }) } } const frontend_name_element = document.getElementById(`${service}_page`).getElementsByClassName("frontend_name")[0] - if (divs[service].frontend) { - frontend_name_element.href = config.services[service].frontends[divs[service].frontend.value].url - } else { - frontend_name_element.href = Object.values(config.services[service].frontends)[0].url - } + frontend_name_element.href = config.services[service].frontends[divs[service].frontend.value].url } async function loadPage(path) { diff --git a/src/pages/options/widgets/services.pug b/src/pages/options/widgets/services.pug index 6530bac..7154050 100644 --- a/src/pages/options/widgets/services.pug +++ b/src/pages/options/widgets/services.pug @@ -20,11 +20,8 @@ each val, service in services h4 a(class="frontend_name" target="_blank" data-localise="__MSG_frontend__") Frontend select(id=service+"-frontend") - if Object.keys(services[service].frontends).length> 1 - each val, frontend in services[service].frontends - option(value=frontend)=services[service].frontends[frontend].name - else - option(value=frontend)=Object.values(services[service].frontends)[0].name + each val, frontend in services[service].frontends + option(value=frontend)=services[service].frontends[frontend].name div(class="some-block option-block" id=service+"-instance-div") h4() Instance @@ -47,11 +44,11 @@ each val, service in services div(class="some-block option-block") h4 Set LibRedirect as Default Search Engine - hr each val, frontend in services[service].frontends if services[service].frontends[frontend].instanceList div(id=frontend dir="ltr") + hr div(dir="auto" class="some-block option-block") h4(data-localise="__MSG_addYourFavoriteInstances__") Add your favorite instances