aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHygna <hygna@proton.me>2022-10-04 19:00:06 +0100
committerHygna <hygna@proton.me>2022-10-04 19:00:06 +0100
commitaa408a4c9b3fd61d355328490e20048f77d0c647 (patch)
tree841ec358fbab402b625b860d83432b10e2a1d32a
parentupdated instances (diff)
parentDisplay if server is not found, made images in settings clickable (diff)
downloadlibredirect-aa408a4c9b3fd61d355328490e20048f77d0c647.zip
Merge branch 'optimizations'
-rw-r--r--.woodpecker/instances.yml5
-rw-r--r--README.md14
-rw-r--r--package.json13
-rw-r--r--src/_locales/filter.py8
-rw-r--r--src/assets/images/about-icon.svg3
-rw-r--r--src/assets/images/general-icon.svg3
-rw-r--r--src/assets/images/imdb-icon.svg (renamed from src/assets/images/imdb.svg)0
-rw-r--r--src/assets/images/imgur-icon.png (renamed from src/assets/images/imgur.png)bin26675 -> 26675 bytes
-rw-r--r--src/assets/images/maps-icon.svg3
-rw-r--r--src/assets/images/medium-icon.svg5
-rw-r--r--src/assets/images/quora-icon.png (renamed from src/assets/images/quora.png)bin5499 -> 5499 bytes
-rw-r--r--src/assets/images/reuters-icon.svg (renamed from src/assets/images/reuters.svg)0
-rw-r--r--src/assets/images/search-icon.svg3
-rw-r--r--src/assets/images/send-icon.svg51
-rw-r--r--src/assets/images/sendFiles-icon.svg3
-rw-r--r--src/assets/images/translate-icon.svg3
-rw-r--r--src/assets/images/youtubeMusic-icon.png (renamed from src/assets/images/youtube-music-icon.png)bin25903 -> 25903 bytes
-rw-r--r--src/assets/javascripts/general.js55
-rw-r--r--src/assets/javascripts/get-localstorage.js15
-rw-r--r--src/assets/javascripts/imdb.js221
-rw-r--r--src/assets/javascripts/imgur.js221
-rw-r--r--src/assets/javascripts/instagram.js249
-rw-r--r--src/assets/javascripts/lbry.js223
-rw-r--r--src/assets/javascripts/maps.js309
-rw-r--r--src/assets/javascripts/medium.js227
-rw-r--r--src/assets/javascripts/peertube.js209
-rw-r--r--src/assets/javascripts/quora.js205
-rw-r--r--src/assets/javascripts/reddit.js402
-rw-r--r--src/assets/javascripts/reuters.js155
-rw-r--r--src/assets/javascripts/search.js581
-rw-r--r--src/assets/javascripts/sendTargets.js200
-rw-r--r--src/assets/javascripts/services.js682
-rw-r--r--src/assets/javascripts/set-localstorage.js13
-rw-r--r--src/assets/javascripts/tiktok.js251
-rw-r--r--src/assets/javascripts/translate/get_lingva_preferences.js10
-rw-r--r--src/assets/javascripts/translate/set_lingva_preferences.js9
-rw-r--r--src/assets/javascripts/translate/translate.js377
-rw-r--r--src/assets/javascripts/twitter.js286
-rw-r--r--src/assets/javascripts/utils.js574
-rw-r--r--src/assets/javascripts/wikipedia.js247
-rw-r--r--src/assets/javascripts/youtube/get_pipedMaterial_preferences.js5
-rw-r--r--src/assets/javascripts/youtube/get_piped_preferences.js22
-rw-r--r--src/assets/javascripts/youtube/set_pipedMaterial_preferences.js7
-rw-r--r--src/assets/javascripts/youtube/set_piped_preferences.js45
-rw-r--r--src/assets/javascripts/youtube/youtube.js797
-rw-r--r--src/assets/javascripts/youtubeMusic.js332
-rw-r--r--src/config/config.json553
-rw-r--r--src/instances/beatbump.json4
-rw-r--r--src/instances/bibliogram.json2
-rw-r--r--src/instances/blacklist.json13
-rw-r--r--src/instances/cloudtube.json2
-rw-r--r--src/instances/data.json205
-rw-r--r--src/instances/facil.json2
-rw-r--r--src/instances/get_instances.py614
-rw-r--r--src/instances/neuters.json2
-rw-r--r--src/manifest.json2
-rw-r--r--src/pages/background/background.js194
-rw-r--r--src/pages/options/index.ejs13
-rw-r--r--src/pages/options/index.html6084
-rw-r--r--src/pages/options/index.pug36
-rw-r--r--src/pages/options/init.js4
-rw-r--r--src/pages/options/widgets/about.ejs24
-rw-r--r--src/pages/options/widgets/about.pug17
-rw-r--r--src/pages/options/widgets/general.ejs102
-rw-r--r--src/pages/options/widgets/general.js297
-rw-r--r--src/pages/options/widgets/general.pug210
-rw-r--r--src/pages/options/widgets/imdb.js55
-rw-r--r--src/pages/options/widgets/imdb.pug26
-rw-r--r--src/pages/options/widgets/imgur.js55
-rw-r--r--src/pages/options/widgets/imgur.pug27
-rw-r--r--src/pages/options/widgets/instagram.js55
-rw-r--r--src/pages/options/widgets/instagram.pug27
-rw-r--r--src/pages/options/widgets/lbry.js60
-rw-r--r--src/pages/options/widgets/lbry.pug38
-rw-r--r--src/pages/options/widgets/maps.js57
-rw-r--r--src/pages/options/widgets/maps.pug32
-rw-r--r--src/pages/options/widgets/medium.js55
-rw-r--r--src/pages/options/widgets/medium.pug26
-rw-r--r--src/pages/options/widgets/peertube.js55
-rw-r--r--src/pages/options/widgets/peertube.pug26
-rw-r--r--src/pages/options/widgets/quora.js55
-rw-r--r--src/pages/options/widgets/quora.pug26
-rw-r--r--src/pages/options/widgets/reddit.js57
-rw-r--r--src/pages/options/widgets/reddit.pug48
-rw-r--r--src/pages/options/widgets/reuters.js55
-rw-r--r--src/pages/options/widgets/reuters.pug26
-rw-r--r--src/pages/options/widgets/search.js204
-rw-r--r--src/pages/options/widgets/search.pug85
-rw-r--r--src/pages/options/widgets/sendTargets.js55
-rw-r--r--src/pages/options/widgets/sendTargets.pug26
-rw-r--r--src/pages/options/widgets/services.ejs86
-rw-r--r--src/pages/options/widgets/services.js107
-rw-r--r--src/pages/options/widgets/tiktok.js55
-rw-r--r--src/pages/options/widgets/tiktok.pug26
-rw-r--r--src/pages/options/widgets/translate.js57
-rw-r--r--src/pages/options/widgets/translate.pug48
-rw-r--r--src/pages/options/widgets/twitter.js60
-rw-r--r--src/pages/options/widgets/twitter.pug32
-rw-r--r--src/pages/options/widgets/wikipedia.js55
-rw-r--r--src/pages/options/widgets/wikipedia.pug26
-rw-r--r--src/pages/options/widgets/youtube.js92
-rw-r--r--src/pages/options/widgets/youtube.pug102
-rw-r--r--src/pages/options/widgets/youtubeMusic.js57
-rw-r--r--src/pages/options/widgets/youtubeMusic.pug49
-rw-r--r--src/pages/popup/popup.ejs49
-rw-r--r--src/pages/popup/popup.html398
-rw-r--r--src/pages/popup/popup.js489
-rw-r--r--src/pages/popup/popup.pug155
-rw-r--r--src/pages/stylesheets/styles.css13
-rw-r--r--src/pages/widgets/head.ejs8
-rw-r--r--src/pages/widgets/head.pug5
-rw-r--r--src/pages/widgets/icons.pug46
-rw-r--r--src/pages/widgets/instances.pug15
-rw-r--r--src/pages/widgets/latency.pug14
-rw-r--r--src/pages/widgets/links.ejs23
-rw-r--r--src/pages/widgets/links.pug83
-rw-r--r--src/pages/widgets/switches.ejs11
117 files changed, 5857 insertions, 12958 deletions
diff --git a/.woodpecker/instances.yml b/.woodpecker/instances.yml
index 96fe59f6..72fdd6e7 100644
--- a/.woodpecker/instances.yml
+++ b/.woodpecker/instances.yml
@@ -6,7 +6,7 @@ pipeline:
event: cron
commands:
- python -m pip install --upgrade pip
- - pip install requests bs4 colorama
+ - pip install requests colorama
- python src/instances/get_instances.py
# Git configuration
- git config --global user.email $MAIL
@@ -15,9 +15,6 @@ pipeline:
- mkdir ~/.ssh
- ssh-keyscan -t ed25519 codeberg.org >> ~/.ssh/known_hosts
- git remote set-url origin git@codeberg.org:libredirect/libredirect.git
- #- echo $TOKEN > key
- #- chmod 0600 key
- eval `ssh-agent`
- echo "$TOKEN" | tr -d '\r' | ssh-add -
- #- ssh-add key
- git push --set-upstream origin master
diff --git a/README.md b/README.md
index c97a20ff..d55dd37b 100644
--- a/README.md
+++ b/README.md
@@ -26,7 +26,7 @@ Imgur => [Rimgo](https://codeberg.org/video-prize-ranch/rimgo)\
Wikipedia => [Wikiless](https://codeberg.org/orenom/wikiless)\
Medium => [Scribe](https://sr.ht/~edwardloveall/scribe/)\
Quora => [Quetre](https://github.com/zyachel/quetre)\
-IMDb => [Libremdb](https://github.com/zyachel/libremdb)\
+IMDb => [libremdb](https://github.com/zyachel/libremdb)\
PeerTube => [SimpleerTube](https://git.sr.ht/~metalune/simpleweb_peertube)\
LBRY/Odysee => [Librarian](https://codeberg.org/librarian/librarian), [LBRY Desktop](https://lbry.com/get)\
Search => [SearXNG](https://github.com/searxng/searxng), [SearX](https://searx.github.io/searx/), [Whoogle](https://benbusby.com/projects/whoogle-search/), [LibreX](https://github.com/hnhx/librex/)\
@@ -69,21 +69,19 @@ npm update
npm install
```
-If you are modifying any files ending with .pug, the pug cli needs to be installed with the following command (with root privileges):
+If you are modifying any files ending with .ejs, you need to run the following command to render html:
```
-npm install -g pug-cli
+npm run ejs
```
-and then run `npm run pug` to generate pages in the background.
-
-### Build
+### Build the extention zip archive:
```
npm run build
```
-### Test
+### Run automated tests
```
npm run test
@@ -117,4 +115,4 @@ select `load unpacked extension`\
select `src` folder
[Privacy Policy](Privacy-Policy.md)\
-Credits: [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect)
+Forked from [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect)
diff --git a/package.json b/package.json
index 50872aac..74bb60b3 100644
--- a/package.json
+++ b/package.json
@@ -9,23 +9,22 @@
"start": "web-ext run --browser-console --source-dir ./src/",
"build": "web-ext build --overwrite-dest --source-dir ./src/",
"test": "web-ext lint --source-dir ./src/ || true",
- "pug": "pug ./src/pages/options/*.pug ./src/pages/popup/ -P -w",
- "prettier": "npx prettier --write .",
- "instances": "python3 src/instances/get_instances.py; git update-index --assume-unchanged src/instances/blacklist.json src/instances/data.json"
+ "instances": "python3 src/instances/get_instances.py; git update-index --assume-unchanged src/instances/blacklist.json src/instances/data.json",
+ "ejs": "npx ejs src/pages/options/index.ejs -f src/config/config.json -o src/pages/options/index.html; npx ejs src/pages/popup/popup.ejs -f src/config/config.json -o src/pages/popup/popup.html"
},
"repository": {
"type": "git",
- "url": "git+https://github.com/LibRedirect/LibRedirect.git"
+ "url": "git+https://codeberg.org/LibRedirect/LibRedirect.git"
},
"author": "LibRedirect",
"license": "GPL-3.0-only",
"bugs": {
- "url": "https://github.com/LibRedirect/LibRedirect/issues"
+ "url": "https://codeberg.org/LibRedirect/LibRedirect/issues"
},
- "homepage": "https://libredirect.github.io",
+ "homepage": "https://libredirect.codeberg.page",
"devDependencies": {
"prettier": "2.7.1",
- "web-ext": "^6.7.0"
+ "web-ext": "^7.2.0"
},
"dependencies": {
"buffer": "^6.0.3",
diff --git a/src/_locales/filter.py b/src/_locales/filter.py
index 581bb36c..0d5fb44d 100644
--- a/src/_locales/filter.py
+++ b/src/_locales/filter.py
@@ -1,12 +1,4 @@
-import requests
import json
-from urllib.parse import urlparse
-from bs4 import BeautifulSoup
-import re
-from colorama import Fore, Back, Style
-from urllib.parse import urlparse
-import socket
-import subprocess
ar_json = {}
diff --git a/src/assets/images/about-icon.svg b/src/assets/images/about-icon.svg
new file mode 100644
index 00000000..551255e6
--- /dev/null
+++ b/src/assets/images/about-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
+ <path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
+</svg>
diff --git a/src/assets/images/general-icon.svg b/src/assets/images/general-icon.svg
new file mode 100644
index 00000000..55c5f8bc
--- /dev/null
+++ b/src/assets/images/general-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
+ <path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path>
+</svg>
diff --git a/src/assets/images/imdb.svg b/src/assets/images/imdb-icon.svg
index a3f4103c..a3f4103c 100644
--- a/src/assets/images/imdb.svg
+++ b/src/assets/images/imdb-icon.svg
diff --git a/src/assets/images/imgur.png b/src/assets/images/imgur-icon.png
index c23a45b2..c23a45b2 100644
--- a/src/assets/images/imgur.png
+++ b/src/assets/images/imgur-icon.png
Binary files differ
diff --git a/src/assets/images/maps-icon.svg b/src/assets/images/maps-icon.svg
new file mode 100644
index 00000000..c66a89d1
--- /dev/null
+++ b/src/assets/images/maps-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
+</svg>
diff --git a/src/assets/images/medium-icon.svg b/src/assets/images/medium-icon.svg
new file mode 100644
index 00000000..72612486
--- /dev/null
+++ b/src/assets/images/medium-icon.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
+ <circle cx="500" cy="500" r="500"></circle>
+ <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
+ <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
+</svg>
diff --git a/src/assets/images/quora.png b/src/assets/images/quora-icon.png
index d2a06954..d2a06954 100644
--- a/src/assets/images/quora.png
+++ b/src/assets/images/quora-icon.png
Binary files differ
diff --git a/src/assets/images/reuters.svg b/src/assets/images/reuters-icon.svg
index aab389c3..aab389c3 100644
--- a/src/assets/images/reuters.svg
+++ b/src/assets/images/reuters-icon.svg
diff --git a/src/assets/images/search-icon.svg b/src/assets/images/search-icon.svg
new file mode 100644
index 00000000..cb73ff15
--- /dev/null
+++ b/src/assets/images/search-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+ <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
+</svg>
diff --git a/src/assets/images/send-icon.svg b/src/assets/images/send-icon.svg
deleted file mode 100644
index 2ed80a06..00000000
--- a/src/assets/images/send-icon.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
- width="33.866665mm"
- height="33.866665mm"
- viewBox="0 0 33.866665 33.866665"
- version="1.1"
- id="svg898"
- sodipodi:docname="send-icon.svg"
- inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:svg="http://www.w3.org/2000/svg">
- <defs
- id="defs7" />
- <sodipodi:namedview
- id="namedview5"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageshadow="2"
- inkscape:pageopacity="0.0"
- inkscape:pagecheckerboard="0"
- inkscape:document-units="mm"
- showgrid="false"
- inkscape:zoom="2.6623698"
- inkscape:cx="46.950653"
- inkscape:cy="88.079425"
- inkscape:window-width="1888"
- inkscape:window-height="1060"
- inkscape:window-x="32"
- inkscape:window-y="0"
- inkscape:window-maximized="1"
- inkscape:current-layer="svg898" />
- <circle
- style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.17791"
- id="path1168"
- cx="16.933332"
- cy="16.933332"
- r="16.933332" />
- <g
- id="layer1"
- transform="matrix(0.36395732,0,0,0.36395732,5.286709,5.2870656)">
- <path
- id="cloud-upload"
- d="m 64,34.286 a 17.033,17.033 0 0 1 -4.406,11.428 14.857,14.857 0 0 1 -10.558,4.572 h -2.179 v -6.857 h 2.179 a 8.004,8.004 0 0 0 5.468,-2.31 10.184,10.184 0 0 0 2.639,-6.833 11.442,11.442 0 0 0 -11.429,-11.429 c -0.377,0 -2.312,0.242 -3.49,0.394 A 1.136,1.136 0 0 1 41.003,22.487 L 40.537,21.13 A 14.103,14.103 0 0 0 28.821,11.498 13.666,13.666 0 0 0 14.091,28.277 l 0.489,2.087 a 1.143,1.143 0 0 1 -0.783,1.355 l -2.054,0.62 a 6.794,6.794 0 0 0 -4.886,6.518 4.604,4.604 0 0 0 0.947,2.808 5.539,5.539 0 0 0 4.089,1.764 h 5.25 v 6.857 h -5.25 A 12.236,12.236 0 0 1 2.213,45.634 11.506,11.506 0 0 1 0,38.857 13.573,13.573 0 0 1 6.944,26.973 19.51,19.51 0 0 1 6.857,25.143 20.563,20.563 0 0 1 45.844,16 18.307,18.307 0 0 1 64,34.286 Z M 32.923,32.123 a 1.143,1.143 0 0 0 -1.846,0 l -8.592,11.775 a 1.143,1.143 0 0 0 0.923,1.816 h 5.163 v 12.572 a 1.143,1.143 0 0 0 1.143,1.143 h 4.572 a 1.143,1.143 0 0 0 1.143,-1.143 V 45.714 h 5.163 a 1.143,1.143 0 0 0 0.923,-1.816 z"
- stroke-width="2.286"
- fill="#45a1ff"
- fill-opacity="1" />
- </g>
-</svg>
diff --git a/src/assets/images/sendFiles-icon.svg b/src/assets/images/sendFiles-icon.svg
new file mode 100644
index 00000000..5557664e
--- /dev/null
+++ b/src/assets/images/sendFiles-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
+</svg>
diff --git a/src/assets/images/translate-icon.svg b/src/assets/images/translate-icon.svg
new file mode 100644
index 00000000..30f9c1b7
--- /dev/null
+++ b/src/assets/images/translate-icon.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
+</svg>
diff --git a/src/assets/images/youtube-music-icon.png b/src/assets/images/youtubeMusic-icon.png
index a33df696..a33df696 100644
--- a/src/assets/images/youtube-music-icon.png
+++ b/src/assets/images/youtubeMusic-icon.png
Binary files differ
diff --git a/src/assets/javascripts/general.js b/src/assets/javascripts/general.js
index a8360bd5..6eb0a454 100644
--- a/src/assets/javascripts/general.js
+++ b/src/assets/javascripts/general.js
@@ -1,17 +1,20 @@
"use strict"
window.browser = window.browser || window.chrome
+let exceptions
+
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
+ return new Promise(resolve => {
+ browser.storage.local.get("options", r => {
+ if (r.options) exceptions = r.options.exceptions
+ resolve()
+ })
})
}
@@ -22,46 +25,26 @@ async function initDefaults() {
return new Promise(resolve =>
browser.storage.local.set(
{
- exceptions: {
- url: [],
- regex: [],
+ options: {
+ exceptions: {
+ url: [],
+ regex: [],
+ },
+ theme: "detect",
+ popupServices: ["youtube", "twitter", "instagram", "tiktok", "imgur", "reddit", "quora", "translate", "maps"],
+ autoRedirect: false,
+ firstPartyIsolate: false,
+ network: "clearnet",
+ networkFallback: true,
+ latencyThreshold: 1000,
},
- theme: "DEFAULT",
- popupFrontends: ["youtube", "twitter", "instagram", "tiktok", "imgur", "reddit", "quora", "translate", "maps"],
- autoRedirect: false,
- firstPartyIsolate: false,
- protocol: "normal",
- protocolFallback: true,
- latencyThreshold: 1000,
},
() => resolve()
)
)
}
-const allPopupFrontends = [
- "youtube",
- "youtubeMusic",
- "twitter",
- "instagram",
- "tiktok",
- "imgur",
- "reddit",
- "search",
- "translate",
- "maps",
- "wikipedia",
- "medium",
- "quora",
- "imdb",
- "reuters",
- "peertube",
- "lbry",
- "sendTargets",
-]
-
export default {
isException,
initDefaults,
- allPopupFrontends,
}
diff --git a/src/assets/javascripts/get-localstorage.js b/src/assets/javascripts/get-localstorage.js
new file mode 100644
index 00000000..66740408
--- /dev/null
+++ b/src/assets/javascripts/get-localstorage.js
@@ -0,0 +1,15 @@
+window.browser = window.browser || window.chrome
+
+browser.storage.local.get(["localstorage", "tmp"], r => {
+ let localstorageJson = r.localstorage
+ const frontend = r.tmp[0]
+ const items = r.tmp[1]
+ localstorageJson[frontend] = {}
+
+ for (const item of items) {
+ let tmp = localStorage.getItem(item)
+ if (tmp) localstorageJson[frontend][item] = tmp
+ }
+
+ browser.storage.local.set({ localstorage: localstorageJson })
+})
diff --git a/src/assets/javascripts/imdb.js b/src/assets/javascripts/imdb.js
deleted file mode 100644
index 604e9a9e..00000000
--- a/src/assets/javascripts/imdb.js
+++ /dev/null
@@ -1,221 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(?:www\.|)imdb\.com.*/]
-
-const frontends = new Array("libremdb")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.libremdb = val
- libremdbNormalRedirectsChecks = [...redirects.libremdb.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = libremdbNormalRedirectsChecks.indexOf(instance)
- if (a > -1) libremdbNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- imdbRedirects: redirects,
- libremdbNormalRedirectsChecks,
- libremdbTorRedirectsChecks: [...redirects.libremdb.tor],
- libremdbI2pRedirectsChecks: [...redirects.libremdb.i2p],
- libremdbLokiRedirectsChecks: [...redirects.libremdb.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableImdb,
- protocol,
- protocolFallback,
- imdbRedirects,
- libremdbNormalRedirectsChecks,
- libremdbNormalCustomRedirects,
- libremdbTorRedirectsChecks,
- libremdbTorCustomRedirects,
- libremdbI2pCustomRedirects,
- libremdbLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableImdb",
- "protocol",
- "protocolFallback",
- "imdbRedirects",
- "libremdbNormalRedirectsChecks",
- "libremdbNormalCustomRedirects",
- "libremdbTorRedirectsChecks",
- "libremdbTorCustomRedirects",
- "libremdbI2pCustomRedirects",
- "libremdbLokiCustomRedirects",
- ],
- r => {
- disableImdb = r.disableImdb
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- imdbRedirects = r.imdbRedirects
- libremdbNormalRedirectsChecks = r.libremdbNormalRedirectsChecks
- libremdbNormalCustomRedirects = r.libremdbNormalCustomRedirects
- libremdbTorRedirectsChecks = r.libremdbTorRedirectsChecks
- libremdbTorCustomRedirects = r.libremdbTorCustomRedirects
- libremdbI2pCustomRedirects = r.libremdbI2pCustomRedirects
- libremdbLokiCustomRedirects = r.libremdbLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
- if (disableImdb && !disableOverride) return
- if (url.pathname == "/") return
- if (type != "main_frame") return
- const all = [...imdbRedirects.libremdb.normal, ...libremdbNormalCustomRedirects]
- if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return
- if (!targets.some(rx => rx.test(url.href))) return
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...libremdbLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...libremdbI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...libremdbTorRedirectsChecks, ...libremdbTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...libremdbNormalRedirectsChecks, ...libremdbNormalCustomRedirects]
- }
- 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 = [
- ...imdbRedirects.libremdb.normal,
- ...imdbRedirects.libremdb.tor,
- ...libremdbNormalCustomRedirects,
- ...libremdbTorCustomRedirects,
- ...libremdbI2pCustomRedirects,
- ...libremdbLokiCustomRedirects,
- ]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- resolve(`https://imdb.com${url.pathname}${url.search}`)
- })
-}
-
-function switchInstance(url, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableImdb && !disableOverride) {
- resolve()
- return
- }
- let protocolHost = utils.protocolHost(url)
- const all = [
- ...imdbRedirects.libremdb.tor,
- ...imdbRedirects.libremdb.normal,
-
- ...libremdbNormalCustomRedirects,
- ...libremdbTorCustomRedirects,
- ...libremdbI2pCustomRedirects,
- ...libremdbLokiCustomRedirects,
- ]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...libremdbLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...libremdbI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...libremdbTorRedirectsChecks, ...libremdbTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...libremdbNormalRedirectsChecks, ...libremdbNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- libremdbNormalRedirectsChecks = [...redirects.libremdb.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = libremdbNormalRedirectsChecks.indexOf(instance)
- if (a > -1) libremdbNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableImdb: true,
- imdbRedirects: redirects,
-
- libremdbNormalRedirectsChecks,
- libremdbNormalCustomRedirects: [],
-
- libremdbTorRedirectsChecks: [...redirects.libremdb.tor],
- libremdbTorCustomRedirects: [],
-
- libremdbI2pRedirectsChecks: [],
- libremdbI2pCustomRedirects: [],
-
- libremdbLokiRedirectsChecks: [],
- libremdbLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
-
- redirect,
- reverse,
- switchInstance,
-
- initDefaults,
-}
diff --git a/src/assets/javascripts/imgur.js b/src/assets/javascripts/imgur.js
deleted file mode 100644
index 24e8cb8d..00000000
--- a/src/assets/javascripts/imgur.js
+++ /dev/null
@@ -1,221 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = /^https?:\/{2}([im]\.)?imgur\.(com|io)(\/|$)/
-
-const frontends = new Array("rimgo")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.rimgo = val
- rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = rimgoNormalRedirectsChecks.indexOf(instance)
- if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- imgurRedirects: redirects,
- rimgoNormalRedirectsChecks,
- rimgoTorRedirectsChecks: [...redirects.rimgo.tor],
- rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p],
- rimgoLokiRedirectsChecks: [...redirects.rimgo.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableImgur,
- imgurRedirects,
- protocol,
- protocolFallback,
- rimgoNormalRedirectsChecks,
- rimgoNormalCustomRedirects,
- rimgoTorRedirectsChecks,
- rimgoTorCustomRedirects,
- rimgoI2pRedirectsChecks,
- rimgoI2pCustomRedirects,
- rimgoLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableImgur",
- "imgurRedirects",
- "protocol",
- "protocolFallback",
- "rimgoNormalRedirectsChecks",
- "rimgoNormalCustomRedirects",
- "rimgoTorRedirectsChecks",
- "rimgoTorCustomRedirects",
- "rimgoI2pRedirectsChecks",
- "rimgoI2pCustomRedirects",
- "rimgoLokiCustomRedirects",
- ],
- r => {
- disableImgur = r.disableImgur
- imgurRedirects = r.imgurRedirects
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- rimgoNormalRedirectsChecks = r.rimgoNormalRedirectsChecks
- rimgoNormalCustomRedirects = r.rimgoNormalCustomRedirects
- rimgoTorRedirectsChecks = r.rimgoTorRedirectsChecks
- rimgoTorCustomRedirects = r.rimgoTorCustomRedirects
- rimgoI2pRedirectsChecks = r.rimgoI2pRedirectsChecks
- rimgoI2pCustomRedirects = r.rimgoI2pCustomRedirects
- rimgoLokiCustomRedirects = r.rimgoLokiCustomRedirects
- 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,
- ...rimgoLokiCustomRedirects,
- ]
-}
-
-function redirect(url, type, initiator, disableOverride) {
- if (disableImgur && !disableOverride) return
- if (url.pathname == "/" && !disableOverride) 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 (protocol == "loki") instancesList = [...rimgoLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects]
- }
- 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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableImgur && !disableOverride) {
- resolve()
- return
- }
- let protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
- let instancesList = []
- if (protocol == "loki") instancesList = [...rimgoLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...rimgoI2pCustomRedirects, ...rimgoI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...rimgoTorRedirectsChecks, ...rimgoTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...rimgoNormalRedirectsChecks, ...rimgoNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- rimgoNormalRedirectsChecks = [...redirects.rimgo.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = rimgoNormalRedirectsChecks.indexOf(instance)
- if (a > -1) rimgoNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableImgur: false,
- imgurRedirects: redirects,
-
- rimgoNormalRedirectsChecks: rimgoNormalRedirectsChecks,
- rimgoNormalCustomRedirects: [],
-
- rimgoTorRedirectsChecks: [...redirects.rimgo.tor],
- rimgoTorCustomRedirects: [],
-
- rimgoI2pRedirectsChecks: [...redirects.rimgo.i2p],
- rimgoI2pCustomRedirects: [],
-
- rimgoLokiRedirectsChecks: [...redirects.rimgo.loki],
- rimgoLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- redirect,
- reverse,
- initDefaults,
- switchInstance,
-}
diff --git a/src/assets/javascripts/instagram.js b/src/assets/javascripts/instagram.js
deleted file mode 100644
index bc580de7..00000000
--- a/src/assets/javascripts/instagram.js
+++ /dev/null
@@ -1,249 +0,0 @@
-window.browser = window.browser || window.chrome
-import utils from "./utils.js"
-
-const targets = ["instagram.com", "www.instagram.com"]
-
-const frontends = new Array("bibliogram")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- redirects.bibliogram = val
- bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = bibliogramNormalRedirectsChecks.indexOf(instance)
- if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- instagramRedirects: redirects,
- bibliogramNormalRedirectsChecks,
- bibliogramTorRedirectsChecks: [...redirects.bibliogram.tor],
- bibliogramI2pRedirectsChecks: [...redirects.bibliogram.i2p],
- bibliogramLokiRedirectsChecks: [...redirects.bibliogram.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableInstagram,
- protocol,
- protocolFallback,
- instagramRedirects,
- bibliogramNormalRedirectsChecks,
- bibliogramTorRedirectsChecks,
- bibliogramNormalCustomRedirects,
- bibliogramTorCustomRedirects,
- bibliogramI2pCustomRedirects,
- bibliogramLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableInstagram",
- "protocol",
- "protocolFallback",
- "instagramRedirects",
- "bibliogramNormalRedirectsChecks",
- "bibliogramTorRedirectsChecks",
- "bibliogramNormalCustomRedirects",
- "bibliogramTorCustomRedirects",
- "bibliogramI2pCustomRedirects",
- "bibliogramLokiCustomRedirects",
- ],
- r => {
- disableInstagram = r.disableInstagram
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- instagramRedirects = r.instagramRedirects
- bibliogramNormalRedirectsChecks = r.bibliogramNormalRedirectsChecks
- bibliogramTorRedirectsChecks = r.bibliogramTorRedirectsChecks
- bibliogramNormalCustomRedirects = r.bibliogramNormalCustomRedirects
- bibliogramTorCustomRedirects = r.bibliogramTorCustomRedirects
- bibliogramI2pCustomRedirects = r.bibliogramI2pCustomRedirects
- bibliogramLokiCustomRedirects = r.bibliogramLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function initBibliogramPreferences(test, from) {
- return new Promise(async resolve => {
- await init()
- const protocolHost = utils.protocolHost(from)
- if (
- ![
- ...bibliogramNormalRedirectsChecks,
- ...bibliogramTorRedirectsChecks,
- ...bibliogramNormalCustomRedirects,
- ...bibliogramTorCustomRedirects,
- ...bibliogramI2pCustomRedirects,
- ...bibliogramLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...bibliogramLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...bibliogramI2pCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]
- }
- await utils.getPreferencesFromToken("bibliogram", from, checkedInstances, "settings", "settings.json")
- }
- resolve(true)
- })
-}
-
-function all() {
- return [
- ...bibliogramNormalRedirectsChecks,
- ...bibliogramTorRedirectsChecks,
- ...bibliogramNormalCustomRedirects,
- ...bibliogramTorCustomRedirects,
- ...bibliogramI2pCustomRedirects,
- ...bibliogramLokiCustomRedirects,
- ]
-}
-
-function redirect(url, type, initiator, disableOverride) {
- if (disableInstagram && !disableOverride) return
- if (!targets.includes(url.host)) return
- if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
- 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 (protocol == "loki") instancesList = [...bibliogramLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...bibliogramI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]
- }
- 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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableInstagram && !disableOverride) {
- resolve()
- return
- }
- let protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...bibliogramLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...bibliogramI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...bibliogramTorRedirectsChecks, ...bibliogramTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...bibliogramNormalRedirectsChecks, ...bibliogramNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- bibliogramNormalRedirectsChecks = [...redirects.bibliogram.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = bibliogramNormalRedirectsChecks.indexOf(instance)
- if (a > -1) bibliogramNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set({
- disableInstagram: false,
- instagramRedirects: redirects,
-
- bibliogramNormalRedirectsChecks,
- bibliogramNormalCustomRedirects: [],
-
- bibliogramTorRedirectsChecks: [...redirects.bibliogram.tor],
- bibliogramTorCustomRedirects: [],
-
- bibliogramI2pRedirectsChecks: [...redirects.bibliogram.i2p],
- bibliogramI2pCustomRedirects: [],
-
- bibliogramLokiRedirectsChecks: [...redirects.bibliogram.loki],
- bibliogramLokiCustomRedirects: [],
- })
- resolve()
- })
- })
- })
-}
-
-export default {
- setRedirects,
- initBibliogramPreferences,
- reverse,
- redirect,
- initDefaults,
- switchInstance,
-}
diff --git a/src/assets/javascripts/lbry.js b/src/assets/javascripts/lbry.js
deleted file mode 100644
index 698517a9..00000000
--- a/src/assets/javascripts/lbry.js
+++ /dev/null
@@ -1,223 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}odysee\.com/]
-
-const frontends = new Array("librarian")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.librarian = val
- librarianNormalRedirectsChecks = [...redirects.librarian.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = librarianNormalRedirectsChecks.indexOf(instance)
- if (a > -1) librarianNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- lbryTargetsRedirects: redirects,
- librarianNormalRedirectsChecks,
- librarianTorRedirectsChecks: [...redirects.librarian.tor],
- librarianI2pRedirectsChecks: [...redirects.librarian.i2p],
- librarianLokiRedirectsChecks: [...redirects.librarian.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableLbryTargets,
- lbryFrontend,
- protocol,
- protocolFallback,
- lbryTargetsRedirects,
- lbryRedirectType,
- librarianNormalRedirectsChecks,
- librarianNormalCustomRedirects,
- librarianTorRedirectsChecks,
- librarianTorCustomRedirects,
- librarianI2pRedirectsChecks,
- librarianI2pCustomRedirects,
- librarianLokiCustomRedirects
-
-function init() {
- return new Promise(resolve => {
- browser.storage.local.get(
- [
- "disableLbryTargets",
- "lbryFrontend",
- "protocol",
- "protocolFallback",
- "lbryTargetsRedirects",
- "lbryRedirectType",
- "librarianNormalRedirectsChecks",
- "librarianNormalCustomRedirects",
- "librarianTorRedirectsChecks",
- "librarianTorCustomRedirects",
- "librarianI2pRedirectsChecks",
- "librarianI2pCustomRedirects",
- "librarianLokiCustomRedirects",
- ],
- r => {
- disableLbryTargets = r.disableLbryTargets
- lbryFrontend = r.lbryFrontend
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- lbryTargetsRedirects = r.lbryTargetsRedirects
- lbryRedirectType = r.lbryRedirectType
- librarianNormalRedirectsChecks = r.librarianNormalRedirectsChecks
- librarianNormalCustomRedirects = r.librarianNormalCustomRedirects
- librarianTorRedirectsChecks = r.librarianTorRedirectsChecks
- librarianTorCustomRedirects = r.librarianTorCustomRedirects
- librarianI2pRedirectsChecks = r.librarianI2pRedirectsChecks
- librarianI2pCustomRedirects = r.librarianI2pCustomRedirects
- librarianLokiCustomRedirects = r.librarianLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
- return [...redirects.librarian.normal, ...redirects.librarian.tor, ...librarianNormalCustomRedirects, ...librarianTorCustomRedirects, ...librarianI2pCustomRedirects, ...librarianLokiCustomRedirects]
-}
-
-function getInstancesList() {
- let tmpList = []
- switch (protocol) {
- case "loki":
- tmpList = [...librarianLokiCustomRedirects]
- break
- case "i2p":
- tmpList = [...librarianI2pRedirectsChecks, ...librarianI2pCustomRedirects]
- break
- case "tor":
- tmpList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]
- }
- if ((tmpList.length === 0 && protocolFallback) || protocol == "normal") {
- tmpList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]
- }
- return tmpList
-}
-
-function switchInstance(url, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableLbryTargets && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...librarianLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...librarianI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...librarianTorRedirectsChecks, ...librarianTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...librarianNormalRedirectsChecks, ...librarianNormalCustomRedirects]
- }
-
- 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, disableOverride) {
- if (disableLbryTargets && !disableOverride) return
- if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) return
- if (!targets.some(rx => rx.test(url.href))) return
- if (type == "sub_frame" && lbryRedirectType == "main_frame") return
-
- const instancesList = getInstancesList()
- switch (type) {
- case "main_frame":
- switch (lbryFrontend) {
- case "librarian":
- if (instancesList.length === 0) return
- const randomInstance = utils.getRandomInstance(instancesList)
- return `${randomInstance}${url.pathname}${url.search}`
- case "lbryDesktop":
- if (type == "main_frame") {
- return url.href.replace(/^https?:\/{2}odysee\.com\//, "lbry://").replace(/:(?=[a-zA-Z0-9])/g, "#")
- }
- }
- case "sub_frame":
- if (instancesList.length === 0) return
- const randomInstance = utils.getRandomInstance(instancesList)
- return `${randomInstance}${url.pathname}${url.search}`.replace(/\/(?=[a-f0-9]{40})/, ":")
- }
-}
-
-function initDefaults() {
- return new Promise(async resolve => {
- fetch("/instances/data.json")
- .then(response => response.text())
- .then(async data => {
- let dataJson = JSON.parse(data)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- librarianNormalRedirectsChecks = [...redirects.librarian.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = librarianNormalRedirectsChecks.indexOf(instance)
- if (a > -1) librarianNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableLbryTargets: true,
- lbryFrontend: "librarian",
- lbryTargetsRedirects: redirects,
- lbryRedirectType: "both",
-
- librarianNormalRedirectsChecks,
- librarianNormalCustomRedirects: [],
-
- librarianTorRedirectsChecks: [...redirects.librarian.tor],
- librarianTorCustomRedirects: [],
-
- librarianI2pRedirectsChecks: [...redirects.librarian.i2p],
- librarianI2pCustomRedirects: [],
-
- librarianLokiRedirectsChecks: [...redirects.librarian.loki],
- librarianLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- switchInstance,
- redirect,
- initDefaults,
-}
diff --git a/src/assets/javascripts/maps.js b/src/assets/javascripts/maps.js
deleted file mode 100644
index 6911c9ba..00000000
--- a/src/assets/javascripts/maps.js
+++ /dev/null
@@ -1,309 +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\.).*)/
-
-const frontends = new Array("facil")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-redirects.osm = {}
-redirects.osm.normal = ["https://www.openstreetmap.org"]
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.facil = val
- facilNormalRedirectsChecks = [...redirects.facil.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = facilNormalRedirectsChecks.indexOf(instance)
- if (a > -1) facilNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- mapsRedirects: redirects,
- facilNormalRedirectsChecks,
- facilTorRedirectsChecks: [...redirects.facil.tor],
- facilI2pRedirectsChecks: [...redirects.facil.i2p],
- facilLokiRedirectsChecks: [...redirects.facil.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableMaps,
- mapsFrontend,
- protocol,
- protocolFallback,
- facilNormalRedirectsChecks,
- facilNormalCustomRedirects,
- facilTorRedirectsChecks,
- facilTorCustomRedirects,
- facilI2pRedirectsChecks,
- facilI2pCustomRedirects,
- facilLokiRedirectsChecks,
- facilLokiCustomRedirects
-
-function init() {
- browser.storage.local.get(
- [
- "disableMaps",
- "mapsFrontend",
- "protocol",
- "protocolFallback",
- "facilNormalRedirectsChecks",
- "facilNormalCustomRedirects",
- "facilTorRedirectsChecks",
- "facilTorCustomRedirects",
- "facilI2pRedirectsChecks",
- "facilI2pCustomRedirects",
- "facilLokiRedirectsChecks",
- "facilLokiCustomRedirects",
- ],
- r => {
- disableMaps = r.disableMaps
- mapsFrontend = r.mapsFrontend
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- facilNormalRedirectsChecks = r.facilNormalRedirectsChecks
- facilNormalCustomRedirects = r.facilNormalCustomRedirects
- facilTorRedirectsChecks = r.facilTorRedirectsChecks
- facilTorCustomRedirects = r.facilTorCustomRedirects
- facilI2pRedirectsChecks = r.facilI2pRedirectsChecks
- facilI2pCustomRedirects = r.facilI2pCustomRedirects
- facilLokiRedirectsChecks = r.facilLokiRedirectsChecks
- facilLokiCustomRedirects = r.facilLokiCustomRedirects
- }
- )
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, initiator) {
- if (disableMaps) return
- if (initiator && initiator.host === "earth.google.com") return
- if (!url.href.match(targets)) return
- 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)
- }
-
- let instancesList
- switch (mapsFrontend) {
- case "osm":
- instancesList = [...redirects.osm.normal]
- break
- case "facil":
- switch (protocol) {
- case "loki":
- instancesList = [...facilLokiRedirectsChecks, ...facilLokiCustomRedirects]
- break
- case "i2p":
- instancesList = [...facilI2pRedirectsChecks, ...facilI2pCustomRedirects]
- break
- case "tor":
- instancesList = [...facilTorRedirectsChecks, ...facilTorCustomRedirects]
- }
- if ((instancesList == "" && protocolFallback) || protocol == "normal") {
- instancesList = [...facilNormalRedirectsChecks, ...facilNormalCustomRedirects]
- }
- }
- const randomInstance = utils.getRandomInstance(instancesList)
-
- 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") return `${randomInstance}/export/embed.html?${prefsEncoded}`
- if (mapsFrontend == "facil") return `${randomInstance}/#q=${query}`
- } 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") return `${randomInstance}/directions?${prefsEncoded}${mapCentre}`
- if (mapsFrontend == "facil") return `${randomInstance}/#q=${orgVal}%20to%20${destVal}%20by%20${travelModesFacil[travMod]}`
- } 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") return `${randomInstance}/search?query=${mlat}%2C${mlon}`
- if (mapsFrontend == "facil") return `${randomInstance}/#q=${mlat}%2C${mlon}`
- } 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") return `${randomInstance}/search?query=${mlat}%2C${mlon}`
- if (mapsFrontend == "facil") return `${randomInstance}/#q=${mlat}%2C${mlon}`
- } 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") return `${randomInstance}/search?query=${mlat}%2C${mlon}`
- if (mapsFrontend == "facil") return `${randomInstance}/#q=${mlat}%2C${mlon}`
- } 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") return `${randomInstance}/search?query="${query}${mapCentre}&${prefsEncoded}`
- if (mapsFrontend == "facil") return `${randomInstance}/${mapCentre}/Mpnk/${query}`
- }
- }
-
- let prefsEncoded = new URLSearchParams(prefs).toString()
- console.log("mapCentre", mapCentre)
- console.log("prefs", prefs)
- console.log("prefsEncoded", prefsEncoded)
- if (mapsFrontend == "osm") return `${randomInstance}/${mapCentre}&${prefsEncoded}`
- if (mapsFrontend == "facil") return `${randomInstance}/${mapCentre}/Mpnk`
-}
-
-function initDefaults() {
- return new Promise(async resolve => {
- fetch("/instances/data.json")
- .then(response => response.text())
- .then(async data => {
- let dataJson = JSON.parse(data)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- facilNormalRedirectsChecks = [...redirects.facil.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = facilNormalRedirectsChecks.indexOf(instance)
- if (a > -1) facilNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableMaps: false,
- mapsFrontend: "osm",
- mapsRedirects: redirects,
- facilNormalRedirectsChecks,
- facilNormalCustomRedirects: [],
-
- facilTorRedirectsChecks: [...redirects.facil.tor],
- facilTorCustomRedirects: [],
-
- facilI2pRedirectsChecks: [...redirects.facil.i2p],
- facilI2pCustomRedirects: [],
-
- facilLokiRedirectsChecks: [...redirects.facil.loki],
- facilLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- redirect,
- initDefaults,
-}
diff --git a/src/assets/javascripts/medium.js b/src/assets/javascripts/medium.js
deleted file mode 100644
index 386d234c..00000000
--- a/src/assets/javascripts/medium.js
+++ /dev/null
@@ -1,227 +0,0 @@
-window.browser = window.browser || window.chrome
-import utils from "./utils.js"
-
-const targets = [
- // /(?:.*\.)*(?<!(link\.|cdn\-images\-\d+\.))medium\.com(\/.*)?$/,
- /^medium\.com/,
- /.*\.medium\.com/,
- // // Other domains of medium blogs, source(s): https://findingtom.com/best-medium-blogs-to-follow/#1-forge
-
- /^towardsdatascience\.com/,
- /^uxdesign\.cc/,
- /^uxplanet\.org/,
- /^betterprogramming\.pub/,
- /^aninjusticemag\.com/,
- /^betterhumans\.pub/,
- /^psiloveyou\.xyz/,
- /^entrepreneurshandbook\.co/,
- /^blog\.coinbase\.com/,
-
- /^ levelup\.gitconnected\.com /,
- /^javascript\.plainenglish\.io /,
- /^blog\.bitsrc\.io /,
- /^ itnext\.io /,
- /^codeburst\.io /,
- /^infosecwriteups\.com /,
- /^ blog\.devgenius.io /,
- /^ writingcooperative\.com /,
-]
-
-const frontends = new Array("scribe")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.scribe = val
- scribeNormalRedirectsChecks = [...redirects.scribe.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = scribeNormalRedirectsChecks.indexOf(instance)
- if (a > -1) scribeNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- mediumRedirects: redirects,
- scribeNormalRedirectsChecks,
- scribeTorRedirectsChecks: [...redirects.scribe.tor],
- scribeI2pRedirectsChecks: [...redirects.scribe.i2p],
- scribeLokiRedirectsChecks: [...redirects.scribe.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableMedium,
- mediumRedirects,
- scribeNormalRedirectsChecks,
- scribeNormalCustomRedirects,
- scribeTorRedirectsChecks,
- scribeTorCustomRedirects,
- scribeI2pCustomRedirects,
- scribeLokiCustomRedirects,
- protocol,
- protocolFallback
-
-function init() {
- return new Promise(resolve => {
- browser.storage.local.get(
- [
- "disableMedium",
- "mediumRedirects",
- "scribeNormalRedirectsChecks",
- "scribeNormalCustomRedirects",
- "scribeTorRedirectsChecks",
- "scribeTorCustomRedirects",
- "scribeI2pCustomRedirects",
- "scribeLokiCustomRedirects",
- "protocol",
- "protocolFallback",
- ],
- r => {
- disableMedium = r.disableMedium
- mediumRedirects = r.mediumRedirects
- scribeNormalRedirectsChecks = r.scribeNormalRedirectsChecks
- scribeNormalCustomRedirects = r.scribeNormalCustomRedirects
- scribeTorRedirectsChecks = r.scribeTorRedirectsChecks
- scribeTorCustomRedirects = r.scribeTorCustomRedirects
- scribeI2pCustomRedirects = r.scribeI2pCustomRedirects
- scribeLokiCustomRedirects = r.scribeLokiCustomRedirects
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
- if (disableMedium && !disableOverride) return
- if (url.pathname == "/" && !disableOverride) return
- if (type != "main_frame" && "sub_frame" && "xmlhttprequest" && "other") return
- if (
- initiator &&
- [...mediumRedirects.scribe.normal, ...mediumRedirects.scribe.tor, ...scribeNormalCustomRedirects, ...scribeTorCustomRedirects, ...scribeI2pCustomRedirects, ...scribeLokiCustomRedirects].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 (protocol == "loki") instancesList = [...scribeLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...scribeI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects]
- }
- if (instancesList.length === 0) {
- return
- }
-
- const randomInstance = utils.getRandomInstance(instancesList)
- return `${randomInstance}${url.pathname}${url.search}`
-}
-
-function switchInstance(url, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableMedium && !disableOverride) {
- resolve()
- return
- }
- let protocolHost = utils.protocolHost(url)
- const all = [
- ...mediumRedirects.scribe.tor,
- ...mediumRedirects.scribe.normal,
-
- ...scribeNormalCustomRedirects,
- ...scribeTorCustomRedirects,
- ...scribeI2pCustomRedirects,
- ...scribeLokiCustomRedirects,
- ]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...scribeLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...scribeI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...scribeTorRedirectsChecks, ...scribeTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...scribeNormalRedirectsChecks, ...scribeNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- scribeNormalRedirectsChecks = [...redirects.scribe.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = scribeNormalRedirectsChecks.indexOf(instance)
- if (a > -1) scribeNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableMedium: false,
- mediumRedirects: redirects,
-
- scribeNormalRedirectsChecks,
- scribeNormalCustomRedirects: [],
-
- scribeTorRedirectsChecks: [...redirects.scribe.tor],
- scribeTorCustomRedirects: [],
-
- scribeI2pRedirectsChecks: [...redirects.scribe.i2p],
- scribeI2pCustomRedirects: [],
-
- scribeLokiRedirectsChecks: [...redirects.scribe.loki],
- scribeLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- redirect,
- switchInstance,
- initDefaults,
-}
diff --git a/src/assets/javascripts/peertube.js b/src/assets/javascripts/peertube.js
deleted file mode 100644
index e1ff406f..00000000
--- a/src/assets/javascripts/peertube.js
+++ /dev/null
@@ -1,209 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const frontends = new Array("simpleertube")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.simpleertube = val
- simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = simpleertubeNormalRedirectsChecks.indexOf(instance)
- if (a > -1) simpleertubeNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- peertubeRedirects: redirects,
- simpleertubeNormalRedirectsChecks,
- simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
- simpleertubeI2pRedirectsChecks: [...redirects.simpleertube.i2p],
- simpleertubeLokiRedirectsChecks: [...redirects.simpleertube.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disablePeertubeTargets,
- peertubeRedirects,
- simpleertubeNormalRedirectsChecks,
- simpleertubeNormalCustomRedirects,
- simpleertubeTorRedirectsChecks,
- simpleertubeTorCustomRedirects,
- simpleertubeI2pRedirectsChecks,
- simpleertubeI2pCustomRedirects,
- simpleertubeLokiRedirectsChecks,
- simpleertubeLokiCustomRedirects,
- peerTubeTargets,
- protocol,
- protocolFallback
-
-function init() {
- return new Promise(resolve => {
- browser.storage.local.get(
- [
- "disablePeertubeTargets",
- "peertubeRedirects",
- "simpleertubeNormalRedirectsChecks",
- "simpleertubeNormalCustomRedirects",
- "simpleertubeTorRedirectsChecks",
- "simpleertubeTorCustomRedirects",
- "simpleertubeI2pRedirectsChecks",
- "simpleertubeI2pCustomRedirects",
- "simpleertubeLokiRedirectsChecks",
- "simpleertubeLokiCustomRedirects",
- "peerTubeTargets",
- "protocol",
- "protocolFallback",
- ],
- r => {
- disablePeertubeTargets = r.disablePeertubeTargets
- peertubeRedirects = r.peertubeRedirects
- simpleertubeNormalRedirectsChecks = r.simpleertubeNormalRedirectsChecks
- simpleertubeNormalCustomRedirects = r.simpleertubeNormalCustomRedirects
- simpleertubeTorRedirectsChecks = r.simpleertubeTorRedirectsChecks
- simpleertubeTorCustomRedirects = r.simpleertubeTorCustomRedirects
- simpleertubeI2pRedirectsChecks = r.simpleertubeI2pRedirectsChecks
- simpleertubeI2pCustomRedirects = r.simpleertubeI2pCustomRedirects
- simpleertubeLokiRedirectsChecks = r.simpleertubeLokiRedirectsChecks
- simpleertubeLokiCustomRedirects = r.simpleertubeLokiCustomRedirects
- peerTubeTargets = r.peerTubeTargets
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
- return [
- ...simpleertubeNormalRedirectsChecks,
- ...simpleertubeTorRedirectsChecks,
- ...simpleertubeI2pRedirectsChecks,
- ...simpleertubeLokiRedirectsChecks,
- ...simpleertubeNormalCustomRedirects,
- ...simpleertubeTorCustomRedirects,
- ...simpleertubeI2pCustomRedirects,
- ...simpleertubeLokiCustomRedirects,
- ]
-}
-
-function redirect(url, type, initiator, disableOverride) {
- if (disablePeertubeTargets && !disableOverride) 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 (protocol == "loki") instancesList = [...simpleertubeLokiRedirectsChecks, ...simpleertubeLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...simpleertubeI2pRedirectsChecks, ...simpleertubeI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]
- }
- 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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disablePeertubeTargets && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...simpleertubeLokiRedirectsChecks, ...simpleertubeLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...simpleertubeI2pRedirectsChecks, ...simpleertubeI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...simpleertubeTorRedirectsChecks, ...simpleertubeTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...simpleertubeNormalRedirectsChecks, ...simpleertubeNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- simpleertubeNormalRedirectsChecks = [...redirects.simpleertube.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = simpleertubeNormalRedirectsChecks.indexOf(instance)
- if (a > -1) simpleertubeNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- peerTubeTargets: ["https://search.joinpeertube.org", ...dataJson.peertube],
- disablePeertubeTargets: true,
- peertubeRedirects: redirects,
-
- simpleertubeNormalRedirectsChecks,
- simpleertubeNormalCustomRedirects: [],
-
- simpleertubeTorRedirectsChecks: [...redirects.simpleertube.tor],
- simpleertubeTorCustomRedirects: [],
-
- simpleertubeI2pRedirectsChecks: [...redirects.simpleertube.i2p],
- simpleertubeI2pCustomRedirects: [],
-
- simpleertubeLokiRedirectsChecks: [...redirects.simpleertube.loki],
- simpleertubeLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- switchInstance,
- redirect,
- initDefaults,
-}
diff --git a/src/assets/javascripts/quora.js b/src/assets/javascripts/quora.js
deleted file mode 100644
index 4473c3d7..00000000
--- a/src/assets/javascripts/quora.js
+++ /dev/null
@@ -1,205 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|)quora\.com.*/]
-
-let redirects = {}
-
-const frontends = new Array("quetre")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.quetre = val
- quetreNormalRedirectsChecks = [...redirects.quetre.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = quetreNormalRedirectsChecks.indexOf(instance)
- if (a > -1) quetreNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- quoraRedirects: redirects,
- quetreNormalRedirectsChecks,
- quetreTorRedirectsChecks: [...redirects.quetre.tor],
- quetreI2pRedirectsChecks: [...redirects.quetre.i2p],
- quetreLokiRedirectsChecks: [...redirects.quetre.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableQuora,
- protocol,
- protocolFallback,
- quoraRedirects,
- quetreNormalRedirectsChecks,
- quetreNormalCustomRedirects,
- quetreTorRedirectsChecks,
- quetreTorCustomRedirects,
- quetreI2pCustomRedirects,
- quetreLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableQuora",
- "protocol",
- "protocolFallback",
- "quoraRedirects",
- "quetreNormalRedirectsChecks",
- "quetreNormalCustomRedirects",
- "quetreTorRedirectsChecks",
- "quetreTorCustomRedirects",
- "quetreI2pCustomRedirects",
- "quetreLokiCustomRedirects",
- ],
- r => {
- disableQuora = r.disableQuora
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- quoraRedirects = r.quoraRedirects
- quetreNormalRedirectsChecks = r.quetreNormalRedirectsChecks
- quetreNormalCustomRedirects = r.quetreNormalCustomRedirects
- quetreTorRedirectsChecks = r.quetreTorRedirectsChecks
- quetreTorCustomRedirects = r.quetreTorCustomRedirects
- quetreI2pCustomRedirects = r.quetreI2pCustomRedirects
- quetreLokiCustomRedirects = r.quetreLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
- if (disableQuora && !disableOverride) return
- if (url.pathname == "/" && !disableOverride) return
- if (type != "main_frame") return
- const all = [...quoraRedirects.quetre.normal, ...quetreNormalCustomRedirects]
- if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return
- if (!targets.some(rx => rx.test(url.href))) return
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...quetreLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...quetreI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...quetreTorRedirectsChecks, ...quetreTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...quetreNormalRedirectsChecks, ...quetreNormalCustomRedirects]
- }
- 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 = [...quoraRedirects.quetre.normal, ...quoraRedirects.quetre.tor, ...quetreNormalCustomRedirects, ...quetreTorCustomRedirects, ...quetreI2pCustomRedirects, ...quetreLokiCustomRedirects]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- resolve(`https://quora.com${url.pathname}${url.search}`)
- })
-}
-
-function switchInstance(url, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableQuora && !disableOverride) {
- resolve()
- return
- }
- let protocolHost = utils.protocolHost(url)
- const all = [...quoraRedirects.quetre.tor, ...quoraRedirects.quetre.normal, ...quetreNormalCustomRedirects, ...quetreTorCustomRedirects, ...quetreI2pCustomRedirects, ...quetreLokiCustomRedirects]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...quetreLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...quetreI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...quetreTorRedirectsChecks, ...quetreTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...quetreNormalRedirectsChecks, ...quetreNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- quetreNormalRedirectsChecks = [...redirects.quetre.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = quetreNormalRedirectsChecks.indexOf(instance)
- if (a > -1) quetreNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableQuora: false,
-
- quoraRedirects: redirects,
-
- quetreNormalRedirectsChecks,
- quetreNormalCustomRedirects: [],
-
- quetreTorRedirectsChecks: [...redirects.quetre.tor],
- quetreTorCustomRedirects: [],
-
- quetreI2pRedirectsChecks: [...redirects.quetre.i2p],
- quetreI2pCustomRedirects: [],
-
- quetreLokiRedirectsChecks: [...redirects.quetre.loki],
- quetreLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
-
- redirect,
- reverse,
- switchInstance,
-
- initDefaults,
-}
diff --git a/src/assets/javascripts/reddit.js b/src/assets/javascripts/reddit.js
deleted file mode 100644
index 209ee7e3..00000000
--- a/src/assets/javascripts/reddit.js
+++ /dev/null
@@ -1,402 +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 = {}
-
-const frontends = new Array("libreddit", "teddit")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects = val
- libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
- tedditNormalRedirectsChecks = [...redirects.teddit.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- 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,
- libredditTorRedirectsChecks: [...redirects.libreddit.tor],
- libredditI2pRedirectsChecks: [...redirects.libreddit.i2p],
- libredditLokiRedirectsChecks: [...redirects.libreddit.loki],
- tedditNormalRedirectsChecks,
- tedditTorRedirectsChecks: [...redirects.teddit.tor],
- tedditI2pRedirectsChecks: [...redirects.teddit.i2p],
- tedditLokiRedirectsChecks: [...redirects.teddit.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableReddit,
- redditFrontend,
- redditRedirects,
- protocol,
- protocolFallback,
- libredditNormalRedirectsChecks,
- libredditNormalCustomRedirects,
- libredditTorRedirectsChecks,
- libredditTorCustomRedirects,
- libredditI2pCustomRedirects,
- libredditLokiCustomRedirects,
- tedditNormalRedirectsChecks,
- tedditNormalCustomRedirects,
- tedditTorRedirectsChecks,
- tedditTorCustomRedirects,
- tedditI2pCustomRedirects,
- tedditLokiCustomRedirects
-
-function init() {
- return new Promise(resolve => {
- browser.storage.local.get(
- [
- "disableReddit",
- "redditFrontend",
- "redditRedirects",
- "protocol",
- "protocolFallback",
- "libredditNormalRedirectsChecks",
- "libredditNormalCustomRedirects",
- "libredditTorRedirectsChecks",
- "libredditTorCustomRedirects",
- "libredditI2pCustomRedirects",
- "libredditLokiCustomRedirects",
- "tedditNormalRedirectsChecks",
- "tedditNormalCustomRedirects",
- "tedditTorRedirectsChecks",
- "tedditTorCustomRedirects",
- "tedditI2pCustomRedirects",
- "tedditLokiCustomRedirects",
- ],
- r => {
- disableReddit = r.disableReddit
- redditFrontend = r.redditFrontend
- redditRedirects = r.redditRedirects
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- libredditNormalRedirectsChecks = r.libredditNormalRedirectsChecks
- libredditNormalCustomRedirects = r.libredditNormalCustomRedirects
- libredditTorRedirectsChecks = r.libredditTorRedirectsChecks
- libredditTorCustomRedirects = r.libredditTorCustomRedirects
- libredditI2pCustomRedirects = r.libredditI2pCustomRedirects
- libredditLokiCustomRedirects = r.libredditLokiCustomRedirects
- tedditNormalRedirectsChecks = r.tedditNormalRedirectsChecks
- tedditNormalCustomRedirects = r.tedditNormalCustomRedirects
- tedditTorRedirectsChecks = r.tedditTorRedirectsChecks
- tedditTorCustomRedirects = r.tedditTorCustomRedirects
- tedditI2pCustomRedirects = r.tedditI2pCustomRedirects
- tedditLokiCustomRedirects = r.tedditLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function initLibredditCookies(test, from) {
- return new Promise(async resolve => {
- await init()
- const protocolHost = utils.protocolHost(from)
- if (
- ![
- ...libredditNormalRedirectsChecks,
- ...libredditTorRedirectsChecks,
- ...libredditNormalCustomRedirects,
- ...libredditTorCustomRedirects,
- ...libredditI2pCustomRedirects,
- ...libredditLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...libredditLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...libredditI2pCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
- }
- await utils.copyCookie("libreddit", from, checkedInstances, "theme")
- await utils.copyCookie("libreddit", from, checkedInstances, "front_page")
- await utils.copyCookie("libreddit", from, checkedInstances, "layout")
- await utils.copyCookie("libreddit", from, checkedInstances, "wide")
- await utils.copyCookie("libreddit", from, checkedInstances, "post_sort")
- await utils.copyCookie("libreddit", from, checkedInstances, "comment_sort")
- await utils.copyCookie("libreddit", from, checkedInstances, "show_nsfw")
- await utils.copyCookie("libreddit", from, checkedInstances, "autoplay_videos")
- await utils.copyCookie("libreddit", from, checkedInstances, "use_hls")
- await utils.copyCookie("libreddit", from, checkedInstances, "hide_hls_notification")
- await utils.copyCookie("libreddit", from, checkedInstances, "subscriptions")
- await utils.copyCookie("libreddit", from, checkedInstances, "filters")
- }
- resolve(true)
- })
-}
-
-function initTedditCookies(test, from) {
- return new Promise(async resolve => {
- await init()
- let protocolHost = utils.protocolHost(from)
- if (
- ![...tedditNormalRedirectsChecks, ...tedditTorRedirectsChecks, ...tedditNormalCustomRedirects, ...tedditTorCustomRedirects, ...tedditI2pCustomRedirects, ...tedditI2pCustomRedirects].includes(
- protocolHost
- )
- )
- resolve()
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...tedditLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...tedditI2pCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
- }
- await utils.copyCookie("teddit", from, checkedInstances, "collapse_child_comments")
- await utils.copyCookie("teddit", from, checkedInstances, "domain_instagram")
- await utils.copyCookie("teddit", from, checkedInstances, "domain_twitter")
- await utils.copyCookie("teddit", from, checkedInstances, "domain_youtube")
- await utils.copyCookie("teddit", from, checkedInstances, "flairs")
- await utils.copyCookie("teddit", from, checkedInstances, "highlight_controversial")
- await utils.copyCookie("teddit", from, checkedInstances, "nsfw_enabled")
- await utils.copyCookie("teddit", from, checkedInstances, "post_media_max_height")
- await utils.copyCookie("teddit", from, checkedInstances, "show_upvoted_percentage")
- await utils.copyCookie("teddit", from, checkedInstances, "show_upvotes")
- await utils.copyCookie("teddit", from, checkedInstances, "theme")
- await utils.copyCookie("teddit", from, checkedInstances, "videos_muted")
- }
- resolve(true)
- })
-}
-
-function all() {
- return [
- ...redditRedirects.libreddit.normal,
- ...redditRedirects.libreddit.tor,
- ...redditRedirects.teddit.normal,
- ...redditRedirects.teddit.tor,
- ...libredditNormalCustomRedirects,
- ...libredditTorCustomRedirects,
- ...libredditI2pCustomRedirects,
- ...libredditLokiCustomRedirects,
- ...tedditNormalCustomRedirects,
- ...tedditTorCustomRedirects,
- ...tedditI2pCustomRedirects,
- ...tedditLokiCustomRedirects,
- ]
-}
-
-// 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, disableOverride) {
- if (disableReddit && !disableOverride) return
- if (!targets.some(rx => rx.test(url.href))) return
- if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
- if (!["main_frame", "xmlhttprequest", "other", "image", "media"].includes(type)) return
- const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/
- if (url.pathname.match(bypassPaths)) return
-
- let libredditInstancesList = []
- let tedditInstancesList = []
-
- if (protocol == "loki") {
- libredditInstancesList = [...libredditLokiCustomRedirects]
- tedditInstancesList = [...tedditLokiCustomRedirects]
- } else if (protocol == "i2p") {
- libredditInstancesList = [...libredditI2pCustomRedirects]
- tedditInstancesList = [...tedditI2pCustomRedirects]
- } else if (protocol == "tor") {
- libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
- tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
- tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
- }
-
- 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.search}`
- }
- if (redditFrontend == "libreddit") {
- if (libredditInstancesList.length === 0) return
- let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList)
- return `${libredditRandomInstance}/img${url.pathname}${url.search}`
- }
- } 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.search}`
- }
- 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.search}`
- }
- } 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.search}`
- }
- }
-
- 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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableReddit && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
- let instancesList = []
- if (redditFrontend == "libreddit") {
- if (protocol == "loki") instancesList = [...libredditLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...libredditI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
- }
- if ([...redditRedirects.teddit.normal, ...redditRedirects.teddit.tor].includes(protocolHost)) {
- url.pathname = url.pathname.replace("/pics/w:null_", "/img/")
- }
- } else if (redditFrontend == "teddit") {
- if (protocol == "loki") instancesList = [...tedditLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...tedditI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
- }
- 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.search}`)
- })
-}
-
-function initDefaults() {
- return new Promise(resolve => {
- fetch("/instances/data.json")
- .then(response => response.text())
- .then(async data => {
- let dataJson = JSON.parse(data)
- for (const frontend of frontends) redirects[frontend] = dataJson[frontend]
-
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
- tedditNormalRedirectsChecks = [...redirects.teddit.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- 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(
- {
- disableReddit: false,
- redditFrontend: "libreddit",
- redditRedirects: redirects,
-
- libredditNormalRedirectsChecks,
- libredditNormalCustomRedirects: [],
-
- libredditTorRedirectsChecks: [...redirects.libreddit.tor],
- libredditTorCustomRedirects: [],
-
- libredditI2pRedirectsChecks: [...redirects.libreddit.i2p],
- libredditI2pCustomRedirects: [],
-
- libredditLokiRedirectsChecks: [...redirects.libreddit.loki],
- libredditLokiCustomRedirects: [],
-
- tedditNormalRedirectsChecks,
- tedditNormalCustomRedirects: [],
-
- tedditTorRedirectsChecks: [...redirects.teddit.tor],
- tedditTorCustomRedirects: [],
-
- tedditI2pRedirectsChecks: [...redirects.teddit.i2p],
- tedditI2pCustomRedirects: [],
-
- tedditLokiRedirectsChecks: [...redirects.teddit.loki],
- tedditLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- initLibredditCookies,
- initTedditCookies,
-
- redirect,
- initDefaults,
- switchInstance,
-}
diff --git a/src/assets/javascripts/reuters.js b/src/assets/javascripts/reuters.js
deleted file mode 100644
index 16459b4a..00000000
--- a/src/assets/javascripts/reuters.js
+++ /dev/null
@@ -1,155 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|)reuters\.com.*/]
-
-const frontends = new Array("neuters")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.neuters = val
- neutersNormalRedirectsChecks = [...redirects.neuters.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = neutersNormalRedirectsChecks.indexOf(instance)
- if (a > -1) neutersNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- neutersRedirects: redirects,
- neutersNormalRedirectsChecks,
- neutersTorRedirectsChecks: [...redirects.neuters.tor],
- neutersI2pRedirectsChecks: [...redirects.neuters.i2p],
- neutersLokiRedirectsChecks: [...redirects.neuters.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableReuters,
- protocol,
- protocolFallback,
- reutersRedirects,
- neutersNormalRedirectsChecks,
- neutersNormalCustomRedirects,
- neutersTorRedirectsChecks,
- neutersTorCustomRedirects,
- neutersI2pCustomRedirects,
- neutersLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableReuters",
- "protocol",
- "protocolFallback",
- "reutersRedirects",
- "neutersNormalRedirectsChecks",
- "neutersNormalCustomRedirects",
- "neutersTorRedirectsChecks",
- "neutersTorCustomRedirects",
- "neutersI2pCustomRedirects",
- "neutersLokiCustomRedirects",
- ],
- r => {
- disableReuters = r.disableReuters
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- reutersRedirects = r.reutersRedirects
- neutersNormalRedirectsChecks = r.neutersNormalRedirectsChecks
- neutersNormalCustomRedirects = r.neutersNormalCustomRedirects
- neutersTorRedirectsChecks = r.neutersTorRedirectsChecks
- neutersTorCustomRedirects = r.neutersTorCustomRedirects
- neutersI2pCustomRedirects = r.neutersI2pCustomRedirects
- neutersLokiCustomRedirects = r.neutersLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function redirect(url, type, initiator, disableOverride) {
- if (disableReuters && !disableOverride) return
- if (type != "main_frame") return
- const all = [...reutersRedirects.neuters.normal, ...neutersNormalCustomRedirects]
- if (initiator && (all.includes(initiator.origin) || targets.includes(initiator.host))) return
- if (!targets.some(rx => rx.test(url.href))) return
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...neutersLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...neutersI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...neutersTorRedirectsChecks, ...neutersTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...neutersNormalRedirectsChecks, ...neutersNormalCustomRedirects]
- }
- if (instancesList.length === 0) return
-
- const randomInstance = utils.getRandomInstance(instancesList)
- // stolen from https://addons.mozilla.org/en-US/firefox/addon/reuters-redirect/
- if (url.pathname.startsWith("/article/") || url.pathname.startsWith("/pf/") || url.pathname.startsWith("/arc/") || url.pathname.startsWith("/resizer/")) return null
- else if (url.pathname.endsWith("/")) return `${randomInstance}${url.pathname}`
- else return `${randomInstance}${url.pathname}/`
-}
-
-function initDefaults() {
- return new Promise(async resolve => {
- fetch("/instances/data.json")
- .then(response => response.text())
- .then(async data => {
- let dataJson = JSON.parse(data)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- neutersNormalRedirectsChecks = [...redirects.neuters.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = neutersNormalRedirectsChecks.indexOf(instance)
- if (a > -1) neutersNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableReuters: true,
-
- reutersRedirects: redirects,
-
- neutersNormalRedirectsChecks,
- neutersNormalCustomRedirects: [],
-
- neutersTorRedirectsChecks: [...redirects.neuters.tor],
- neutersTorCustomRedirects: [],
-
- neutersI2pRedirectsChecks: [...redirects.neuters.i2p],
- neutersI2pCustomRedirects: [],
-
- neutersLokiRedirectsChecks: [...redirects.neuters.loki],
- neutersLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- redirect,
- initDefaults,
-}
diff --git a/src/assets/javascripts/search.js b/src/assets/javascripts/search.js
deleted file mode 100644
index 548e7629..00000000
--- a/src/assets/javascripts/search.js
+++ /dev/null
@@ -1,581 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}search\.libredirect\.invalid/]
-// Ill optimise all of assets/javascripts at a later date. For now, I'll just add librex and optimse options javascript
-const frontends = new Array("searx", "searxng", "whoogle", "librex")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects = val
- searxNormalRedirectsChecks = [...redirects.searx.normal]
- searxngNormalRedirectsChecks = [...redirects.searxng.normal]
- whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]
- librexNormalRedirectsChecks = [...redirects.librex.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- 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)
-
- const d = librexNormalRedirectsChecks.indexOf(instance)
- if (d > -1) librexNormalRedirectsChecks.splice(d, 1)
- }
- browser.storage.local.set(
- {
- searchRedirects: redirects,
- searxNormalRedirectsChecks,
- searxTorRedirectsChecks: [...redirects.searx.tor],
- searxI2pRedirectsChecks: [...redirects.searx.i2p],
- searxLokiRedirectsChecks: [...redirects.searx.loki],
- searxngNormalRedirectsChecks,
- searxngTorRedirectsChecks: [...redirects.searxng.tor],
- searxngI2pRedirectsChecks: [...redirects.searxng.i2p],
- searxngLokiRedirectsChecks: [...redirects.searxng.loki],
- whoogleNormalRedirectsChecks,
- whoogleTorRedirectsChecks: [...redirects.whoogle.tor],
- whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p],
- whoogleLokiRedirectsChecks: [...redirects.whoogle.loki],
- librexNormalRedirectsChecks,
- librexTorRedirectsChecks: [...redirects.librex.tor],
- librexI2pRedirectsChecks: [...redirects.librex.i2p],
- librexLokiRedirectsChecks: [...redirects.librex.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableSearch,
- searchFrontend,
- searchRedirects,
- protocol,
- protocolFallback,
- whoogleNormalRedirectsChecks,
- whoogleNormalCustomRedirects,
- whoogleTorRedirectsChecks,
- whoogleTorCustomRedirects,
- whoogleI2pRedirectsChecks,
- whoogleI2pCustomRedirects,
- whoogleLokiCustomRedirects,
- searxNormalRedirectsChecks,
- searxNormalCustomRedirects,
- searxTorRedirectsChecks,
- searxTorCustomRedirects,
- searxI2pRedirectsChecks,
- searxI2pCustomRedirects,
- searxLokiCustomRedirects,
- searxngNormalRedirectsChecks,
- searxngNormalCustomRedirects,
- searxngTorRedirectsChecks,
- searxngTorCustomRedirects,
- searxngI2pRedirectsChecks,
- searxngI2pCustomRedirects,
- searxngLokiCustomRedirects,
- librexNormalRedirectsChecks,
- librexNormalCustomRedirects,
- librexTorRedirectsChecks,
- librexTorCustomRedirects,
- librexI2pRedirectsChecks,
- librexI2pCustomRedirects,
- librexLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableSearch",
- "searchFrontend",
- "searchRedirects",
- "protocol",
- "protocolFallback",
- "whoogleNormalRedirectsChecks",
- "whoogleNormalCustomRedirects",
- "whoogleTorRedirectsChecks",
- "whoogleTorCustomRedirects",
- "whoogleI2pRedirectsChecks",
- "whoogleI2pCustomRedirects",
- "whoogleLokiCustomRedirects",
- "searxNormalRedirectsChecks",
- "searxNormalCustomRedirects",
- "searxTorRedirectsChecks",
- "searxTorCustomRedirects",
- "searxI2pRedirectsChecks",
- "searxI2pCustomRedirects",
- "searxLokiCustomRedirects",
- "searxngNormalRedirectsChecks",
- "searxngNormalCustomRedirects",
- "searxngTorRedirectsChecks",
- "searxngTorCustomRedirects",
- "searxngI2pRedirectsChecks",
- "searxngI2pCustomRedirects",
- "searxngLokiCustomRedirects",
- "librexNormalRedirectsChecks",
- "librexNormalCustomRedirects",
- "librexTorRedirectsChecks",
- "librexTorCustomRedirects",
- "librexI2pRedirectsChecks",
- "librexI2pCustomRedirects",
- "librexLokiCustomRedirects",
- ],
- r => {
- disableSearch = r.disableSearch
- searchFrontend = r.searchFrontend
- searchRedirects = r.searchRedirects
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- whoogleNormalRedirectsChecks = r.whoogleNormalRedirectsChecks
- whoogleNormalCustomRedirects = r.whoogleNormalCustomRedirects
- whoogleTorRedirectsChecks = r.whoogleTorRedirectsChecks
- whoogleTorCustomRedirects = r.whoogleTorCustomRedirects
- whoogleI2pRedirectsChecks = r.whoogleI2pRedirectsChecks
- whoogleI2pCustomRedirects = r.whoogleI2pCustomRedirects
- whoogleLokiCustomRedirects = r.whoogleLokiCustomRedirects
- searxNormalRedirectsChecks = r.searxNormalRedirectsChecks
- searxNormalCustomRedirects = r.searxNormalCustomRedirects
- searxTorRedirectsChecks = r.searxTorRedirectsChecks
- searxTorCustomRedirects = r.searxTorCustomRedirects
- searxI2pRedirectsChecks = r.searxI2pRedirectsChecks
- searxI2pCustomRedirects = r.searxI2pCustomRedirects
- searxLokiCustomRedirects = r.searxLokiCustomRedirects
- searxngNormalRedirectsChecks = r.searxngNormalRedirectsChecks
- searxngNormalCustomRedirects = r.searxngNormalCustomRedirects
- searxngTorRedirectsChecks = r.searxngTorRedirectsChecks
- searxngTorCustomRedirects = r.searxngTorCustomRedirects
- searxngI2pRedirectsChecks = r.searxngI2pRedirectsChecks
- searxngI2pCustomRedirects = r.searxngI2pCustomRedirects
- searxngLokiCustomRedirects = r.searxngLokiCustomRedirects
- librexNormalRedirectsChecks = r.librexNormalRedirectsChecks
- librexNormalCustomRedirects = r.librexNormalCustomRedirects
- librexTorRedirectsChecks = r.librexTorRedirectsChecks
- librexTorCustomRedirects = r.librexTorCustomRedirects
- librexI2pRedirectsChecks = r.librexI2pRedirectsChecks
- librexI2pCustomRedirects = r.librexI2pCustomRedirects
- librexLokiCustomRedirects = r.librexLokiCustomRedirects
- 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,
- ...searxLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...searxLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks]
- else if (protocol == "tor") checkedInstances = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
- }
- await utils.copyCookie("searx", from, checkedInstances, "advanced_search")
- await utils.copyCookie("searx", from, checkedInstances, "autocomplete")
- await utils.copyCookie("searx", from, checkedInstances, "categories")
- await utils.copyCookie("searx", from, checkedInstances, "disabled_engines")
- await utils.copyCookie("searx", from, checkedInstances, "disabled_plugins")
- await utils.copyCookie("searx", from, checkedInstances, "doi_resolver")
- await utils.copyCookie("searx", from, checkedInstances, "enabled_engines")
- await utils.copyCookie("searx", from, checkedInstances, "enabled_plugins")
- await utils.copyCookie("searx", from, checkedInstances, "image_proxy")
- await utils.copyCookie("searx", from, checkedInstances, "language")
- await utils.copyCookie("searx", from, checkedInstances, "locale")
- await utils.copyCookie("searx", from, checkedInstances, "method")
- await utils.copyCookie("searx", from, checkedInstances, "oscar-style")
- await utils.copyCookie("searx", from, checkedInstances, "results_on_new_tab")
- await utils.copyCookie("searx", from, checkedInstances, "safesearch")
- await utils.copyCookie("searx", from, checkedInstances, "theme")
- await utils.copyCookie("searx", from, checkedInstances, "tokens")
- }
- resolve(true)
- })
-}
-
-function initSearxngCookies(test, from) {
- return new Promise(async resolve => {
- await init()
- let protocolHost = utils.protocolHost(from)
- if (
- ![
- ...searxngNormalRedirectsChecks,
- ...searxngNormalCustomRedirects,
- ...searxngTorRedirectsChecks,
- ...searxngTorCustomRedirects,
- ...searxngI2pRedirectsChecks,
- ...searxngI2pCustomRedirects,
- ...searxngLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...searxngLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks]
- else if (protocol == "tor") checkedInstances = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
- }
- await utils.copyCookie("searxng", from, checkedInstances, "autocomplete")
- await utils.copyCookie("searxng", from, checkedInstances, "categories")
- await utils.copyCookie("searxng", from, checkedInstances, "disabled_engines")
- await utils.copyCookie("searxng", from, checkedInstances, "disabled_plugins")
- await utils.copyCookie("searxng", from, checkedInstances, "doi_resolver")
- await utils.copyCookie("searxng", from, checkedInstances, "enabled_plugins")
- await utils.copyCookie("searxng", from, checkedInstances, "enabled_engines")
- await utils.copyCookie("searxng", from, checkedInstances, "image_proxy")
- await utils.copyCookie("searxng", from, checkedInstances, "infinite_scroll")
- await utils.copyCookie("searxng", from, checkedInstances, "language")
- await utils.copyCookie("searxng", from, checkedInstances, "locale")
- await utils.copyCookie("searxng", from, checkedInstances, "maintab")
- await utils.copyCookie("searxng", from, checkedInstances, "method")
- await utils.copyCookie("searxng", from, checkedInstances, "query_in_title")
- await utils.copyCookie("searxng", from, checkedInstances, "results_on_new_tab")
- await utils.copyCookie("searxng", from, checkedInstances, "safesearch")
- await utils.copyCookie("searxng", from, checkedInstances, "simple_style")
- await utils.copyCookie("searxng", from, checkedInstances, "theme")
- await utils.copyCookie("searxng", from, checkedInstances, "tokens")
- }
- resolve(true)
- })
-}
-
-function initLibrexCookies(test, from) {
- return new Promise(async resolve => {
- await init()
- let protocolHost = utils.protocolHost(from)
- if (
- ![
- ...librexNormalRedirectsChecks,
- ...librexNormalCustomRedirects,
- ...librexTorRedirectsChecks,
- ...librexTorCustomRedirects,
- ...librexI2pRedirectsChecks,
- ...librexI2pCustomRedirects,
- ...librexLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...librexLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks]
- else if (protocol == "tor") checkedInstances = [...librexTorRedirectsChecks, ...librexTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects]
- }
- await utils.copyCookie("librex", from, checkedInstances, "bibliogram")
- await utils.copyCookie("librex", from, checkedInstances, "disable_special")
- await utils.copyCookie("librex", from, checkedInstances, "invidious")
- await utils.copyCookie("librex", from, checkedInstances, "libreddit")
- await utils.copyCookie("librex", from, checkedInstances, "nitter")
- await utils.copyCookie("librex", from, checkedInstances, "proxitok")
- await utils.copyCookie("librex", from, checkedInstances, "theme")
- await utils.copyCookie("librex", from, checkedInstances, "wikiless")
- }
- resolve(true)
- })
-}
-
-function redirect(url, disableOverride) {
- if (disableSearch && !disableOverride) 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 (protocol == "loki") instancesList = [...searxLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...searxI2pCustomRedirects, ...searxI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
- }
- if (instancesList.length === 0) {
- return
- }
-
- randomInstance = utils.getRandomInstance(instancesList)
- path = "/"
- } else if (searchFrontend == "searxng") {
- let instancesList = []
- if (protocol == "loki") instancesList = [...searxngLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...searxngI2pCustomRedirects, ...searxngI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
- }
- if (instancesList.length === 0) {
- return
- }
-
- randomInstance = utils.getRandomInstance(instancesList)
- path = "/"
- } else if (searchFrontend == "whoogle") {
- let instancesList = []
- if (protocol == "loki") instancesList = [...whoogleLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...whoogleI2pCustomRedirects, ...whoogleI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]
- }
- if (instancesList.length === 0) {
- return
- }
-
- randomInstance = utils.getRandomInstance(instancesList)
- path = "/search"
- } else if (searchFrontend == "librex") {
- let instancesList = []
- if (protocol == "loki") instancesList = [...librexLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...librexI2pCustomRedirects, ...librexI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...librexTorRedirectsChecks, ...librexTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects]
- }
- if (instancesList.length === 0) {
- return
- }
-
- randomInstance = utils.getRandomInstance(instancesList)
- path = "/search.php"
- }
-
- 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=${encodeURIComponent(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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableSearch && !disableOverride) {
- resolve()
- return
- }
- 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,
-
- ...searchRedirects.librex.normal,
- ...searchRedirects.librex.tor,
- ...searchRedirects.librex.i2p,
-
- ...searxNormalCustomRedirects,
- ...searxTorCustomRedirects,
- ...searxI2pCustomRedirects,
- ...searxLokiCustomRedirects,
-
- ...searxngNormalCustomRedirects,
- ...searxngTorCustomRedirects,
- ...searxngI2pCustomRedirects,
- ...searxngLokiCustomRedirects,
-
- ...whoogleNormalCustomRedirects,
- ...whoogleTorCustomRedirects,
- ...whoogleI2pCustomRedirects,
- ...whoogleLokiCustomRedirects,
-
- ...librexNormalCustomRedirects,
- ...librexTorCustomRedirects,
- ...librexI2pCustomRedirects,
- ...librexLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- let instancesList = []
-
- if (protocol == "loki") {
- if (searchFrontend == "searx") instancesList = [...searxLokiCustomRedirects]
- else if (searchFrontend == "searxng") instancesList = [...searxngLokiCustomRedirects]
- else if (searchFrontend == "whoogle") instancesList = [...whoogleLokiCustomRedirects]
- else if (searchFrontend == "librex") instancesList = [...librexLokiCustomRedirects]
- } else if (protocol == "tor") {
- if (searchFrontend == "searx") instancesList = [...searxTorRedirectsChecks, ...searxTorCustomRedirects]
- else if (searchFrontend == "searxng") instancesList = [...searxngTorRedirectsChecks, ...searxngTorCustomRedirects]
- else if (searchFrontend == "whoogle") instancesList = [...whoogleTorRedirectsChecks, ...whoogleTorCustomRedirects]
- else if (searchFrontend == "librex") instancesList = [...librexTorRedirectsChecks, ...librexTorCustomRedirects]
- } else if (protocol == "i2p") {
- if (searchFrontend == "searx") instancesList = [...searxI2pRedirectsChecks, ...searxI2pCustomRedirects]
- else if (searchFrontend == "searxng") instancesList = [...searxngI2pRedirectsChecks, ...searxngI2pCustomRedirects]
- else if (searchFrontend == "whoogle") instancesList = [...whoogleI2pRedirectsChecks, ...whoogleI2pCustomRedirects]
- else if (searchFrontend == "librex") instancesList = [...librexI2pRedirectsChecks, ...librexI2pCustomRedirects]
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- if (searchFrontend == "searx") instancesList = [...searxNormalRedirectsChecks, ...searxNormalCustomRedirects]
- else if (searchFrontend == "searxng") instancesList = [...searxngNormalRedirectsChecks, ...searxngNormalCustomRedirects]
- else if (searchFrontend == "whoogle") instancesList = [...whoogleNormalRedirectsChecks, ...whoogleNormalCustomRedirects]
- else if (searchFrontend == "librex") instancesList = [...librexNormalRedirectsChecks, ...librexNormalCustomRedirects]
- }
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
-
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- searxNormalRedirectsChecks = [...redirects.searx.normal]
- searxngNormalRedirectsChecks = [...redirects.searxng.normal]
- whoogleNormalRedirectsChecks = [...redirects.whoogle.normal]
- librexNormalRedirectsChecks = [...redirects.librex.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- 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)
-
- const d = librexNormalRedirectsChecks.indexOf(instance)
- if (d > -1) librexNormalRedirectsChecks.splice(d, 1)
- }
- browser.storage.local.set(
- {
- disableSearch: false,
- searchFrontend: "searxng",
- searchRedirects: redirects,
- searxngCustomSettings: false,
-
- whoogleNormalRedirectsChecks,
- whoogleNormalCustomRedirects: [],
-
- whoogleTorRedirectsChecks: [...redirects.whoogle.tor],
- whoogleTorCustomRedirects: [],
-
- whoogleI2pRedirectsChecks: [...redirects.whoogle.i2p],
- whoogleI2pCustomRedirects: [],
-
- whoogleLokiRedirectsChecks: [...redirects.whoogle.loki],
- whoogleLokiCustomRedirects: [],
-
- searxNormalRedirectsChecks,
- searxNormalCustomRedirects: [],
-
- searxTorRedirectsChecks: [...redirects.searx.tor],
- searxTorCustomRedirects: [],
-
- searxI2pRedirectsChecks: [...redirects.searx.i2p],
- searxI2pCustomRedirects: [],
-
- searxLokiRedirectsChecks: [...redirects.searx.loki],
- searxLokiCustomRedirects: [],
-
- searxngNormalRedirectsChecks,
- searxngNormalCustomRedirects: [],
-
- searxngTorRedirectsChecks: [...redirects.searxng.tor],
- searxngTorCustomRedirects: [],
-
- searxngI2pRedirectsChecks: [...redirects.searxng.i2p],
- searxngI2pCustomRedirects: [],
-
- searxngLokiRedirectsChecks: [...redirects.searxng.loki],
- searxngLokiCustomRedirects: [],
-
- librexNormalRedirectsChecks,
- librexNormalCustomRedirects: [],
-
- librexTorRedirectsChecks: [...redirects.librex.tor],
- librexTorCustomRedirects: [],
-
- librexI2pRedirectsChecks: [...redirects.librex.i2p],
- librexI2pCustomRedirects: [],
-
- librexLokiRedirectsChecks: [...redirects.librex.loki],
- librexLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- initSearxCookies,
- initSearxngCookies,
- initLibrexCookies,
- redirect,
- initDefaults,
- switchInstance,
-}
diff --git a/src/assets/javascripts/sendTargets.js b/src/assets/javascripts/sendTargets.js
deleted file mode 100644
index a7b5f20b..00000000
--- a/src/assets/javascripts/sendTargets.js
+++ /dev/null
@@ -1,200 +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\/$/]
-
-const frontends = new Array("send")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.send = val
- sendNormalRedirectsChecks = [...redirects.send.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = sendNormalRedirectsChecks.indexOf(instance)
- if (a > -1) sendNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- sendTargetsRedirects: redirects,
- sendNormalRedirectsChecks,
- sendTorRedirectsChecks: [...redirects.send.tor],
- sendI2pRedirectsChecks: [...redirects.send.i2p],
- sendLokiRedirectsChecks: [...redirects.send.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableSendTarget,
- sendTargetsRedirects,
- sendNormalRedirectsChecks,
- sendNormalCustomRedirects,
- sendTorRedirectsChecks,
- sendTorCustomRedirects,
- sendI2pCustomRedirects,
- sendLokiCustomRedirects,
- protocol,
- protocolFallback
-
-function init() {
- return new Promise(resolve => {
- browser.storage.local.get(
- [
- "disableSendTarget",
- "sendTargetsRedirects",
- "protocol",
- "protocolFallback",
- "sendNormalRedirectsChecks",
- "sendNormalCustomRedirects",
- "sendTorRedirectsChecks",
- "sendTorCustomRedirects",
- "sendI2pCustomRedirects",
- "sendLokiCustomRedirects",
- ],
- r => {
- disableSendTarget = r.disableSendTarget
- sendTargetsRedirects = r.sendTargetsRedirects
- sendNormalRedirectsChecks = r.sendNormalRedirectsChecks
- sendNormalCustomRedirects = r.sendNormalCustomRedirects
- sendTorRedirectsChecks = r.sendTorRedirectsChecks
- sendTorCustomRedirects = r.sendTorCustomRedirects
- sendI2pCustomRedirects = r.sendI2pCustomRedirects
- sendLokiCustomRedirects = r.sendLokiCustomRedirects
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
- return [
- ...sendTargetsRedirects.send.normal,
- ...sendTargetsRedirects.send.tor,
- ...sendNormalCustomRedirects,
- ...sendTorRedirectsChecks,
- ...sendTorCustomRedirects,
- ...sendI2pCustomRedirects,
- ...sendLokiCustomRedirects,
- ]
-}
-
-function switchInstance(url, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableSendTarget && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
- if (url.pathname != "/") {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...sendLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...sendI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]
- }
-
- 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, disableOverride) {
- if (disableSendTarget && !disableOverride) 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 (protocol == "loki") instancesList = [...sendLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...sendI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...sendTorRedirectsChecks, ...sendTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...sendNormalRedirectsChecks, ...sendNormalCustomRedirects]
- }
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- sendNormalRedirectsChecks = [...redirects.send.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = sendNormalRedirectsChecks.indexOf(instance)
- if (a > -1) sendNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableSendTarget: false,
- sendTargetsRedirects: redirects,
-
- sendNormalRedirectsChecks,
- sendNormalCustomRedirects: [],
-
- sendTorRedirectsChecks: [...redirects.send.tor],
- sendTorCustomRedirects: [],
-
- sendI2pRedirectsChecks: [...redirects.send.i2p],
- sendI2pCustomRedirects: [],
-
- sendLokiRedirectsChecks: [...redirects.send.loki],
- sendLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- redirect,
- switchInstance,
- initDefaults,
-}
diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js
new file mode 100644
index 00000000..afd7906f
--- /dev/null
+++ b/src/assets/javascripts/services.js
@@ -0,0 +1,682 @@
+window.browser = window.browser || window.chrome
+
+import utils from "./utils.js"
+
+let config, options, redirects
+
+function init() {
+ return new Promise(async resolve => {
+ browser.storage.local.get(["options", "redirects"], r => {
+ options = r.options
+ redirects = r.redirects
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(configData => {
+ config = JSON.parse(configData)
+ resolve()
+ })
+ })
+ })
+}
+
+init()
+browser.storage.onChanged.addListener(init)
+
+function fetchFrontendInstanceList(service, frontend, redirects, options, config) {
+ let tmp = []
+ if (config.services[service].frontends[frontend].instanceList) {
+ for (const network in config.networks) {
+ tmp.push(...redirects[network], ...options[frontend][network].custom)
+ }
+ } else if (config.services[service].frontends[frontend].singleInstance) tmp = config.services[service].frontends[frontend].singleInstance
+ return tmp
+}
+
+function all(service, frontend, options, config, redirects) {
+ let instances = []
+ if (!frontend) {
+ for (const frontend in config.services[service].frontends) {
+ instances.push(...fetchFrontendInstanceList(service, frontend, redirects[frontend], options, config))
+ }
+ } else {
+ instances.push(...fetchFrontendInstanceList(service, frontend, redirects[frontend], options, config))
+ }
+ return instances
+}
+
+function regexArray(service, url, config) {
+ let targets
+ if (config.services[service].targets == "datajson") {
+ browser.storage.local.get("targets", r => {
+ targets = r.targets[service]
+ })
+ } else {
+ targets = config.services[service].targets
+ }
+ for (const targetString in targets) {
+ const target = new RegExp(targets[targetString])
+ if (target.test(url.href)) return true
+ }
+ return false
+}
+
+function redirect(url, type, initiator) {
+ let randomInstance
+ let frontend
+ for (const service in config.services) {
+ if (!options[service].enabled) continue
+ if (config.services[service].embeddable && type != options[service].redirectType && options[service].redirectType != "both") continue
+ if (!config.services[service].embeddable && type != "main_frame") continue
+ let targets = new RegExp(config.services[service].targets.join("|"), "i")
+
+ if (!regexArray(service, url, config)) continue
+ if (initiator) {
+ if (targets.test(initiator.host)) continue
+ if (all(service, null, options, config, redirects).includes(initiator.origin)) return "BYPASSTAB"
+ }
+
+ if (Object.keys(config.services[service].frontends).length > 1) {
+ if (type == "sub_frame" && config.services[service].embeddable && !config.services[service].frontends[options[service].frontend].embeddable) frontend = options[service].embedFrontend
+ else frontend = options[service].frontend
+ } else frontend = Object.keys(config.services[service].frontends)[0]
+
+ if (config.services[service].frontends[frontend].instanceList) {
+ let instanceList = [...options[frontend][options.network].enabled, ...options[frontend][options.network].custom]
+ if (instanceList.length === 0 && options.networkFallback) instanceList = [...options[frontend].clearnet.enabled, ...options[frontend].clearnet.custom]
+ if (instanceList.length === 0) return
+ randomInstance = utils.getRandomInstance(instanceList)
+ } else if (config.services[service].frontends[frontend].singleInstance) randomInstance = config.services[service].frontends[frontend].singleInstance
+ break
+ }
+ if (!frontend) return
+
+ // Here is a (temperory) space for defining constants required in 2 or more switch cases.
+ // When possible, try have the two switch cases share all their code as done with searx and searxng.
+ // Do not do that when they do not share 100% of their code.
+
+ 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\/(.*)\//
+ function convertMapCentre() {
+ let [lat, lon, zoom] = [null, null, null]
+ if (url.pathname.match(mapCentreRegex)) {
+ // Set map centre if present
+ ;[lat, lon, zoom] = url.pathname.match(mapCentreRegex)
+ } else if (url.searchParams.has("center")) {
+ ;[lat, lon] = url.searchParams.get("center").split(",")
+ zoom = url.searchParams.get("zoom") ?? "17"
+ }
+ return [zoom, lon, lat]
+ }
+
+ switch (frontend) {
+ // This is where all instance-specific code must be ran to convert the service url to one that can be understood by the frontend.
+ case "beatbump":
+ return `${randomInstance}${url.pathname}${url.search}`
+ .replace("/watch?v=", "/listen?id=")
+ .replace("/channel/", "/artist/")
+ .replace("/playlist?list=", "/playlist/VL")
+ .replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=all")
+ case "hyperpipe":
+ return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/"))
+ case "bibliogram":
+ 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/...'
+ case "lbryDesktop":
+ return url.href.replace(/^https?:\/{2}odysee\.com\//, "lbry://").replace(/:(?=[a-zA-Z0-9])/g, "#")
+ case "neuters":
+ if (url.pathname.startsWith("/article/") || url.pathname.startsWith("/pf/") || url.pathname.startsWith("/arc/") || url.pathname.startsWith("/resizer/")) return null
+ else if (url.pathname.endsWith("/")) return `${randomInstance}${url.pathname}`
+ else return `${randomInstance}${url.pathname}/`
+ case "searx":
+ case "searxng":
+ return `${randomInstance}/?q=${encodeURIComponent(url.searchParams.get("q"))}`
+ case "whoogle":
+ return `${randomInstance}/search${encodeURIComponent(url.searchParams.get("q"))}`
+ case "librex":
+ return `${randomInstance}/search.php?q=${encodeURIComponent(url.searchParams.get("q"))}`
+ case "send":
+ return randomInstance
+ case "nitter":
+ if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") {
+ const [, id, format, extra] = url.search.match(/(.*)\?format=(.*)&(.*)/)
+ const query = encodeURIComponent(`${id}.${format}?${extra}`)
+ return `${randomInstance}/pic${url.pathname}${query}`
+ } 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}`
+ case "yattee":
+ return url.href.replace(/^https?:\/{2}/, "yattee://")
+ case "freetube":
+ return `freetube://https://youtu.be${url.pathname}${url.search}`.replace(/watch\?v=/, "")
+ case "simplyTranslate":
+ return `${randomInstance}/${url.search}`
+ case "osm": {
+ if (initiator && initiator.host === "earth.google.com") return
+ 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.
+ }
+
+ 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)
+ }
+
+ let mapCentre = "#"
+ let prefs = {}
+
+ const mapCentreData = convertMapCentre()
+ if (mapCentreData[0] && mapCentreData[1] && mapCentreData[2]) mapCentre = `#map=${mapCentreData[0]}/${mapCentreData[1]}/${mapCentreData[2]}`
+ 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()
+ return `${randomInstance}/export/embed.html?${prefsEncoded}`
+ } 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)
+ let dest = addressToLatLng(destVal)
+ prefs.route = `${org};${dest}`
+
+ let prefsEncoded = new URLSearchParams(prefs).toString()
+ return `${randomInstance}/directions?${prefsEncoded}${mapCentre}`
+ } 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)
+
+ return `${randomInstance}/search?query=${mlat}%2C${mlon}`
+ } 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(",")
+
+ return `${randomInstance}/search?query=${mlat}%2C${mlon}`
+ } 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(",")
+
+ return `${randomInstance}/search?query=${mlat}%2C${mlon}`
+ } 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) return `${randomInstance}/search?query="${query}${mapCentre}&${prefsEncoded}`
+ }
+
+ let prefsEncoded = new URLSearchParams(prefs).toString()
+ console.log("mapCentre", mapCentre)
+ console.log("prefs", prefs)
+ console.log("prefsEncoded", prefsEncoded)
+ return `${randomInstance}/${mapCentre}&${prefsEncoded}`
+ }
+ case "facil": {
+ if (initiator && initiator.host === "earth.google.com") return
+ const travelModes = {
+ driving: "car",
+ walking: "pedestrian",
+ bicycling: "bicycle",
+ transit: "car", // not implemented on Facil, default to car.
+ }
+ const mapCentreData = convertMapCentre()
+ let mapCentre = "#"
+ if (mapCentreData[0] && mapCentreData[1] && mapCentreData[2]) mapCentre = `#${mapCentreData[0]}/${mapCentreData[1]}/${mapCentreData[2]}`
+
+ 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.
+
+ return `${randomInstance}/#q=${query}`
+ } 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")
+
+ let orgVal = url.searchParams.get("origin")
+ let destVal = url.searchParams.get("destination")
+
+ return `${randomInstance}/#q=${orgVal}%20to%20${destVal}%20by%20${travelModes[travMod]}`
+ } 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)
+
+ return `${randomInstance}/#q=${mlat}%2C${mlon}`
+ } 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(",")
+
+ return `${randomInstance}/#q=${mlat}%2C${mlon}`
+ } 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(",")
+
+ return `${randomInstance}/#q=${mlat}%2C${mlon}`
+ } 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]
+
+ if (query) return `${randomInstance}/${mapCentre}/Mpnk/${query}`
+ }
+ }
+ case "wikiless":
+ let GETArguments = []
+ if (url.search.length > 0) {
+ let search = url.search.substring(1) //get rid of '?'
+ let argstrings = search.split("&")
+ for (let i = 0; i < argstrings.length; i++) {
+ let args = argstrings[i].split("=")
+ GETArguments.push([args[0], args[1]])
+ }
+ }
+
+ let link = `${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
+
+ case "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]
+ }
+ if (params.sl && params.tl && params.text) {
+ return `${randomInstance}/${params.sl}/${params.tl}/${params.text}`
+ }
+ return randomInstance
+ default:
+ return `${randomInstance}${url.pathname}${url.search}`
+ }
+}
+
+function computeService(url, returnFrontend) {
+ return new Promise(resolve => {
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(configData => {
+ const config = JSON.parse(configData)
+ browser.storage.local.get(["redirects", "options"], r => {
+ const redirects = r.redirects
+ const options = r.options
+ for (const service in config.services) {
+ if (regexArray(service, url, config)) {
+ if (returnFrontend) {
+ resolve([service, null])
+ } else {
+ resolve(service)
+ }
+ return
+ } else {
+ for (const frontend in config.services[service].frontends) {
+ if (all(service, frontend, options, config, redirects).includes(utils.protocolHost(url))) {
+ if (returnFrontend) {
+ resolve([service, frontend])
+ } else {
+ resolve(service)
+ }
+ return
+ }
+ }
+ }
+ }
+ resolve()
+ })
+ })
+ })
+}
+
+function switchInstance(url) {
+ return new Promise(async resolve => {
+ await init()
+ const protocolHost = utils.protocolHost(url)
+ for (const service in config.services) {
+ if (!all(service, null, options, config, redirects).includes(protocolHost)) continue
+
+ let instancesList = [...options[options[service].frontend][options.network].enabled, ...options[options[service].frontend][options.network].custom]
+ if (instancesList.length === 0 && options.networkFallback) instancesList = [...options[options[service].frontend].clearnet.enabled, ...options[options[service].frontend].clearnet.custom]
+
+ let oldInstance
+ const i = instancesList.indexOf(protocolHost)
+ if (i > -1) {
+ oldInstance = instancesList[i]
+ instancesList.splice(i, 1)
+ }
+ if (instancesList.length === 0) {
+ resolve()
+ return
+ }
+ const randomInstance = utils.getRandomInstance(instancesList)
+ const oldUrl = `${oldInstance}${url.pathname}${url.search}`
+ // This is to make instance switching work when the instance depends on the pathname, eg https://darmarit.org/searx
+ // Doesn't work because of .includes array method, not a top priotiry atm
+ resolve(oldUrl.replace(oldInstance, randomInstance))
+ return
+ }
+ resolve()
+ })
+}
+
+function reverse(url) {
+ return new Promise(async resolve => {
+ await init()
+ let protocolHost = utils.protocolHost(url)
+ for (const service in config.services) {
+ if (!all(service, null, options, config, redirects).includes(protocolHost)) continue
+
+ switch (service) {
+ case "instagram":
+ 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(config.services[service].url + url.pathname + url.search)
+ return
+ case "youtube":
+ case "imdb":
+ case "imgur":
+ case "tiktok":
+ case "twitter":
+ case "reddit":
+ resolve(config.services[service].url + url.pathname + url.search)
+ return
+ default:
+ resolve()
+ return
+ }
+ }
+ resolve()
+ })
+}
+
+function unifyPreferences(url, tabId) {
+ return new Promise(async resolve => {
+ await init()
+ const protocolHost = utils.protocolHost(url)
+ for (const service in config.services) {
+ for (const frontend in config.services[service].frontends) {
+ if (all(service, frontend, options, config, redirects).includes(protocolHost)) {
+ let instancesList = [...options[frontend][options.network].enabled, ...options[frontend][options.network].custom]
+ if (options.networkFallback && options.network != "clearnet") instancesList.push(...options[frontend].clearnet.enabled, ...options[frontend].clearnet.custom)
+
+ const frontendObject = config.services[service].frontends[frontend]
+ if ("cookies" in frontendObject.preferences) {
+ for (const cookie of frontendObject.preferences.cookies) {
+ utils.copyCookie(frontendObject, url, instancesList, cookie)
+ }
+ }
+ if ("localstorage" in frontendObject.preferences) {
+ browser.storage.local.set({ tmp: [frontend, frontendObject.preferences.localstorage] })
+ browser.tabs.executeScript(tabId, {
+ file: "/assets/javascripts/get-localstorage.js",
+ runAt: "document_start",
+ })
+ for (const instance of instancesList)
+ browser.tabs.create({ url: instance }, tab =>
+ browser.tabs.executeScript(tab.id, {
+ file: "/assets/javascripts/set-localstorage.js",
+ runAt: "document_start",
+ })
+ )
+ }
+ /*
+ if ("indexeddb" in frontendObject.preferences) {
+ }
+ if ("token" in frontendObject.preferences) {
+ }
+ */
+ resolve(true)
+ return
+ }
+ }
+ }
+ })
+}
+
+async function setRedirects(redirects) {
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(configData => {
+ //browser.storage.local.get(["options", "blacklists"], async r => {
+ //const options = r.options
+ const config = JSON.parse(configData)
+ let targets = {}
+ for (const service in config.services) {
+ if (config.services[service].targets == "datajson") {
+ targets[service] = redirects[service]
+ }
+ /*
+ for (const frontend in config.services[service].frontends) {
+ if (config.services[service].frontends[frontend].instanceList) {
+ for (const network in config.networks) {
+ options[frontend][network].enabled = redirects[frontend][network]
+ }
+ for (const blacklist in r.blacklists) {
+ for (const instance of blacklist) {
+ let i = options[frontend].clearnet.enabled.indexOf(instance)
+ if (i > -1) options[frontend].clearnet.enabled.splice(i, 1)
+ }
+ }
+ }
+ }
+ */
+ // The above will be implemented with https://github.com/libredirect/libredirect/issues/334
+ }
+ browser.storage.local.set({ redirects, targets /*, options*/ })
+ //})
+ })
+}
+
+function initDefaults() {
+ return new Promise(resolve => {
+ fetch("/instances/data.json")
+ .then(response => response.text())
+ .then(data => {
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(configData => {
+ browser.storage.local.get(["options", "blacklists"], r => {
+ let redirects = JSON.parse(data)
+ let options = r.options
+ let targets = {}
+ let config = JSON.parse(configData)
+ const localstorage = {}
+ const latency = {}
+ for (const service in config.services) {
+ options[service] = {}
+ if (config.services[service].targets == "datajson") {
+ targets[service] = redirects[service]
+ }
+ for (const defaultOption in config.services[service].options) {
+ options[service][defaultOption] = config.services[service].options[defaultOption]
+ }
+ for (const frontend in config.services[service].frontends) {
+ if (config.services[service].frontends[frontend].instanceList) {
+ options[frontend] = {}
+ for (const network in config.networks) {
+ options[frontend][network] = {}
+ options[frontend][network].enabled = JSON.parse(data)[frontend][network]
+ options[frontend][network].custom = []
+ }
+ for (const blacklist in r.blacklists) {
+ for (const instance of r.blacklists[blacklist]) {
+ let i = options[frontend].clearnet.enabled.indexOf(instance)
+ if (i > -1) options[frontend].clearnet.enabled.splice(i, 1)
+ }
+ }
+ }
+ }
+ }
+ browser.storage.local.set({ redirects, options, targets, latency, localstorage })
+ resolve()
+ })
+ })
+ })
+ })
+}
+
+function upgradeOptions() {
+ return new Promise(resolve => {
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(configData => {
+ browser.storage.local.get(null, r => {
+ let options = r.options
+ let latency = {}
+ const config = JSON.parse(configData)
+ options.exceptions = r.exceptions
+ if (r.theme != "DEFAULT") options.theme = r.theme
+ options.popupServices = r.popupFrontends
+ let tmp = options.popupServices.indexOf("tikTok")
+ if (tmp > -1) {
+ options.popupServices.splice(tmp, 1)
+ options.popupServices.push("tiktok")
+ }
+ tmp = options.popupServices.indexOf("sendTarget")
+ if (tmp > -1) {
+ options.popupServices.splice(tmp, 1)
+ options.popupServices.push("sendFiles")
+ }
+ options.firstPartyIsolate = r.firstPartyIsolate
+ options.autoRedirect = r.autoRedirect
+ switch (r.onlyEmbeddedVideo) {
+ case "onlyNotEmbedded":
+ options.youtube.redirectType = "main_frame"
+ case "onlyEmbedded":
+ options.youtube.redirectType = "sub_frame"
+ case "both":
+ options.youtube.redirectType = "both"
+ }
+ for (const service in config.services) {
+ let oldService
+ switch (service) {
+ case "tiktok":
+ oldService = "tikTok"
+ break
+ case "sendFiles":
+ oldService = "sendTarget"
+ break
+ default:
+ oldService = service
+ }
+ options[service].enabled = !r["disable" + utils.camelCase(oldService)]
+ if (r[oldService + "Frontend"]) {
+ if (r[oldService + "Frontend"] == "yatte") options[service].frontend = "yattee"
+ else options[service].frontend = r[oldService + "Frontend"]
+ }
+ if (r[oldService + "RedirectType"]) options[service].redirectType = r[oldService + "RedirectType"]
+ if (r[oldService + "EmbedFrontend"] && (service != "youtube" || r[oldService + "EmbedFrontend"] == "invidious" || r[oldService + "EmbedFrontend"] == "piped"))
+ options[service].embedFrontend = r[oldService + "EmbedFrontend"]
+ for (const frontend in config.services[service].frontends) {
+ if (r[frontend + "Latency"]) latency[frontend] = r[frontend + "Latency"]
+ for (const network in config.networks) {
+ let protocol
+ if (network == "clearnet") protocol = "normal"
+ else protocol = network
+ if (r[frontend + utils.camelCase(protocol) + "RedirectsChecks"]) {
+ options[frontend][network].enabled = r[frontend + utils.camelCase(protocol) + "RedirectsChecks"]
+ options[frontend][network].custom = r[frontend + utils.camelCase(protocol) + "CustomRedirects"]
+ }
+ }
+ }
+ }
+ browser.storage.local.set({ options, latency }, () => resolve())
+ })
+ })
+ })
+}
+
+export default {
+ redirect,
+ computeService,
+ switchInstance,
+ reverse,
+ unifyPreferences,
+ setRedirects,
+ initDefaults,
+ upgradeOptions,
+}
diff --git a/src/assets/javascripts/set-localstorage.js b/src/assets/javascripts/set-localstorage.js
new file mode 100644
index 00000000..8dbfcad7
--- /dev/null
+++ b/src/assets/javascripts/set-localstorage.js
@@ -0,0 +1,13 @@
+window.browser = window.browser || window.chrome
+
+browser.storage.local.get(["localstorage", "tmp"], r => {
+ const localstorageJson = r.localstorage
+ const frontend = r.tmp[0]
+ const items = localstorageJson[frontend]
+
+ for (const item in items) {
+ localStorage.setItem(item, items[item])
+ }
+
+ window.close()
+})
diff --git a/src/assets/javascripts/tiktok.js b/src/assets/javascripts/tiktok.js
deleted file mode 100644
index 78106a15..00000000
--- a/src/assets/javascripts/tiktok.js
+++ /dev/null
@@ -1,251 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = [/^https?:\/{2}(www\.|)tiktok\.com.*/]
-
-const frontends = new Array("proxiTok")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.proxiTok = val
- proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = proxiTokNormalRedirectsChecks.indexOf(instance)
- if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- tiktokRedirects: redirects,
- proxiTokNormalRedirectsChecks,
- proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
- proxiTokI2pRedirectsChecks: [...redirects.proxiTok.i2p],
- proxiTokLokiRedirectsChecks: [...redirects.proxiTok.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-function initProxiTokCookies(test, from) {
- return new Promise(async resolve => {
- await init()
- let protocolHost = utils.protocolHost(from)
- if (
- ![
- ...proxiTokNormalRedirectsChecks,
- ...proxiTokNormalCustomRedirects,
- ...proxiTokTorRedirectsChecks,
- ...proxiTokTorCustomRedirects,
- ...proxiTokI2pCustomRedirects,
- ...proxiTokLokiCustomRedirects,
- ].includes(protocolHost)
- )
- resolve()
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...proxiTokI2pCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...proxiTokLokiCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
- }
- await utils.copyCookie("proxitok", from, checkedInstances, "theme")
- await utils.copyCookie("proxitok", from, checkedInstances, "api-legacy")
- }
- resolve(true)
- })
-}
-
-let disableTiktok,
- protocol,
- protocolFallback,
- tiktokRedirects,
- proxiTokNormalRedirectsChecks,
- proxiTokNormalCustomRedirects,
- proxiTokTorRedirectsChecks,
- proxiTokTorCustomRedirects,
- proxiTokI2pCustomRedirects,
- proxiTokLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableTiktok",
- "protocol",
- "protocolFallback",
- "tiktokRedirects",
- "proxiTokNormalRedirectsChecks",
- "proxiTokNormalCustomRedirects",
- "proxiTokTorRedirectsChecks",
- "proxiTokTorCustomRedirects",
- "proxiTokI2pCustomRedirects",
- "proxiTokLokiCustomRedirects",
- ],
- r => {
- disableTiktok = r.disableTiktok
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- tiktokRedirects = r.tiktokRedirects
- proxiTokNormalRedirectsChecks = r.proxiTokNormalRedirectsChecks
- proxiTokNormalCustomRedirects = r.proxiTokNormalCustomRedirects
- proxiTokTorRedirectsChecks = r.proxiTokTorRedirectsChecks
- proxiTokTorCustomRedirects = r.proxiTokTorCustomRedirects
- proxiTokI2pCustomRedirects = r.proxiTokI2pCustomRedirects
- proxiTokLokiCustomRedirects = r.proxiTokLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-// https://www.tiktok.com/@keysikaspol/video/7061265241887345946
-// https://www.tiktok.com/@keysikaspol
-function redirect(url, type, initiator, disableOverride) {
- if (disableTiktok && !disableOverride) 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 (protocol == "loki") instancesList = [...proxiTokI2pCustomRedirects]
- else if (protocol == "i2p") instancesList = [...proxiTokLokiCustomRedirects]
- else if (protocol == "tor") instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
- }
- 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,
- ...proxiTokI2pCustomRedirects,
- ...proxiTokLokiCustomRedirects,
- ]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- resolve(`https://tiktok.com${url.pathname}${url.search}`)
- })
-}
-
-function switchInstance(url, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableTiktok && !disableOverride) {
- resolve()
- return
- }
- let protocolHost = utils.protocolHost(url)
- const all = [
- ...tiktokRedirects.proxiTok.tor,
- ...tiktokRedirects.proxiTok.normal,
-
- ...proxiTokNormalCustomRedirects,
- ...proxiTokTorCustomRedirects,
- ...proxiTokI2pCustomRedirects,
- ...proxiTokLokiCustomRedirects,
- ]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...proxiTokI2pCustomRedirects]
- else if (protocol == "i2p") instancesList = [...proxiTokLokiCustomRedirects]
- else if (protocol == "tor") instancesList = [...proxiTokTorRedirectsChecks, ...proxiTokTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...proxiTokNormalRedirectsChecks, ...proxiTokNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- proxiTokNormalRedirectsChecks = [...redirects.proxiTok.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = proxiTokNormalRedirectsChecks.indexOf(instance)
- if (a > -1) proxiTokNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableTiktok: false,
-
- tiktokRedirects: redirects,
-
- proxiTokNormalRedirectsChecks,
- proxiTokNormalCustomRedirects: [],
-
- proxiTokTorRedirectsChecks: [...redirects.proxiTok.tor],
- proxiTokTorCustomRedirects: [],
-
- proxiTokI2pRedirectsChecks: [...redirects.proxiTok.i2p],
- proxiTokI2pCustomRedirects: [],
-
- proxiTokLokiRedirectsChecks: [...redirects.proxiTok.loki],
- proxiTokLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- redirect,
- reverse,
- switchInstance,
- initProxiTokCookies,
- initDefaults,
-}
diff --git a/src/assets/javascripts/translate/get_lingva_preferences.js b/src/assets/javascripts/translate/get_lingva_preferences.js
deleted file mode 100644
index 0d6ff6ec..00000000
--- a/src/assets/javascripts/translate/get_lingva_preferences.js
+++ /dev/null
@@ -1,10 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.set({
- ["lingva_chakra-ui-color-mode"]: localStorage.getItem("chakra-ui-color-mode"),
- lingva_isauto: localStorage.getItem("isauto"),
- lingva_source: localStorage.getItem("source"),
- lingva_target: localStorage.getItem("target"),
-})
-
-console.log(localStorage.getItem("target"))
diff --git a/src/assets/javascripts/translate/set_lingva_preferences.js b/src/assets/javascripts/translate/set_lingva_preferences.js
deleted file mode 100644
index 04a36e1b..00000000
--- a/src/assets/javascripts/translate/set_lingva_preferences.js
+++ /dev/null
@@ -1,9 +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)
- 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
deleted file mode 100644
index fa103169..00000000
--- a/src/assets/javascripts/translate/translate.js
+++ /dev/null
@@ -1,377 +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}\//]
-
-const frontends = new Array("simplyTranslate", "lingva")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-let translateDisable,
- translateFrontend,
- protocol,
- protocolFallback,
- translateRedirects,
- simplyTranslateNormalRedirectsChecks,
- simplyTranslateNormalCustomRedirects,
- simplyTranslateTorRedirectsChecks,
- simplyTranslateTorCustomRedirects,
- simplyTranslateI2pRedirectsChecks,
- simplyTranslateI2pCustomRedirects,
- simplyTranslateLokiRedirectsChecks,
- simplyTranslateLokiCustomRedirects,
- lingvaNormalRedirectsChecks,
- lingvaNormalCustomRedirects,
- lingvaTorRedirectsChecks,
- lingvaTorCustomRedirects,
- lingvaI2pCustomRedirects,
- lingvaLokiCustomRedirects
-
-function init() {
- return new Promise(resolve => {
- browser.storage.local.get(
- [
- "translateDisable",
- "translateFrontend",
- "protocol",
- "protocolFallback",
- "translateRedirects",
- "simplyTranslateNormalRedirectsChecks",
- "simplyTranslateNormalCustomRedirects",
- "simplyTranslateTorRedirectsChecks",
- "simplyTranslateTorCustomRedirects",
- "simplyTranslateI2pRedirectsChecks",
- "simplyTranslateI2pCustomRedirects",
- "simplyTranslateLokiRedirectsChecks",
- "simplyTranslateLokiCustomRedirects",
-
- "lingvaNormalRedirectsChecks",
- "lingvaNormalCustomRedirects",
- "lingvaTorRedirectsChecks",
- "lingvaTorCustomRedirects",
- "lingvaI2pCustomRedirects",
- "lingvaLokiCustomRedirects",
- ],
- r => {
- translateDisable = r.translateDisable
- translateFrontend = r.translateFrontend
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- translateRedirects = r.translateRedirects
- simplyTranslateNormalRedirectsChecks = r.simplyTranslateNormalRedirectsChecks
- simplyTranslateNormalCustomRedirects = r.simplyTranslateNormalCustomRedirects
- simplyTranslateTorRedirectsChecks = r.simplyTranslateTorRedirectsChecks
- simplyTranslateTorCustomRedirects = r.simplyTranslateTorCustomRedirects
- simplyTranslateI2pRedirectsChecks = r.simplyTranslateI2pRedirectsChecks
- simplyTranslateI2pCustomRedirects = r.simplyTranslateI2pCustomRedirects
- simplyTranslateLokiRedirectsChecks = r.simplyTranslateLokiRedirectsChecks
- simplyTranslateLokiCustomRedirects = r.simplyTranslateLokiCustomRedirects
- lingvaNormalRedirectsChecks = r.lingvaNormalRedirectsChecks
- lingvaNormalCustomRedirects = r.lingvaNormalCustomRedirects
- lingvaTorRedirectsChecks = r.lingvaTorRedirectsChecks
- lingvaTorCustomRedirects = r.lingvaTorCustomRedirects
- lingvaI2pCustomRedirects = r.lingvaI2pCustomRedirects
- lingvaLokiCustomRedirects = r.lingvaLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects = val
- simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]
- lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = simplyTranslateNormalCustomRedirects.indexOf(instance)
- if (a > -1) simplyTranslateNormalCustomRedirects.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],
- simplyTranslateI2pRedirectsChecks: [...redirects.simplyTranslate.i2p],
- simplyTranslateLokiRedirectsChecks: [...redirects.simplyTranslate.loki],
- lingvaNormalRedirectsChecks,
- lingvaTorRedirectsChecks: [...redirects.lingva.tor],
- lingvaI2pRedirectsChecks: [...redirects.lingva.i2p],
- lingvaLokiRedirectsChecks: [...redirects.lingva.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-function copyPasteLingvaLocalStorage(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, ...lingvaI2pCustomRedirects, ...lingvaLokiCustomRedirects].includes(
- protocolHost
- )
- ) {
- resolve()
- return
- }
-
- if (!test) {
- browser.tabs.executeScript(tabId, {
- file: "/assets/javascripts/translate/get_lingva_preferences.js",
- runAt: "document_start",
- })
-
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...lingvaLokiCustomRedirects]
- //...lingvaLokiRedirectsChecks,
- else if (protocol == "i2p") checkedInstances = [...lingvaI2pCustomRedirects]
- //...lingvaI2pRedirectsChecks,
- else if (protocol == "tor") checkedInstances = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]
- }
- 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 copyPasteSimplyTranslateCookies(test, from) {
- return new Promise(async resolve => {
- await init()
- const protocolHost = utils.protocolHost(from)
- if (
- ![
- ...simplyTranslateNormalRedirectsChecks,
- ...simplyTranslateNormalCustomRedirects,
- ...simplyTranslateTorRedirectsChecks,
- ...simplyTranslateTorCustomRedirects,
- ...simplyTranslateI2pRedirectsChecks,
- ...simplyTranslateI2pCustomRedirects,
- ...simplyTranslateLokiRedirectsChecks,
- ...simplyTranslateLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...simplyTranslateI2pCustomRedirects, ...simplyTranslateI2pRedirectsChecks]
- else if (protocol == "tor") checkedInstances = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
- }
- await utils.copyCookie("simplyTranslate", from, checkedInstances, "from_lang")
- await utils.copyCookie("simplyTranslate", from, checkedInstances, "to_lang")
- await utils.copyCookie("simplyTranslate", from, checkedInstances, "tts_enabled")
- await utils.copyCookie("simplyTranslate", from, checkedInstances, "use_text_fields")
- }
- resolve(true)
- })
-}
-
-function redirect(url, disableOverride) {
- if (translateDisable && !disableOverride) return
- if (!targets.some(rx => rx.test(url.href))) return
-
- if (translateFrontend == "simplyTranslate") {
- let instancesList = []
- if (protocol == "loki") instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...simplyTranslateI2pRedirectsChecks, ...simplyTranslateI2pCustomRedirects]
- else if (protocol == "tor") instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
- }
- 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 (protocol == "loki") instancesList = [...lingvaLokiCustomRedirects]
- //...lingvaLokiRedirectsChecks,
- else if (protocol == "i2p") instancesList = [...lingvaI2pCustomRedirects] //...lingvaI2pRedirectsChecks,
- if (protocol == "tor") instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]
- }
- 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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (translateDisable && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (
- ![
- ...translateRedirects.simplyTranslate.normal,
- ...translateRedirects.simplyTranslate.tor,
- ...translateRedirects.simplyTranslate.i2p,
- ...translateRedirects.simplyTranslate.loki,
-
- ...simplyTranslateNormalCustomRedirects,
- ...simplyTranslateTorCustomRedirects,
- ...simplyTranslateI2pCustomRedirects,
- ...simplyTranslateLokiCustomRedirects,
-
- ...translateRedirects.lingva.normal,
- ...translateRedirects.lingva.tor,
-
- ...lingvaNormalCustomRedirects,
- ...lingvaTorCustomRedirects,
- ...lingvaI2pCustomRedirects,
- ...lingvaLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- let instancesList = []
-
- if (protocol == "loki") {
- if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateLokiRedirectsChecks, ...simplyTranslateLokiCustomRedirects]
- else if (translateFrontend == "lingva") instancesList = [...lingvaLokiCustomRedirects] //...lingvaLokiRedirectsChecks,
- } else if (protocol == "i2p") {
- if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateI2pRedirectsChecks, ...simplyTranslateI2pCustomRedirects]
- else if (translateFrontend == "lingva") instancesList = [...lingvaI2pCustomRedirects] //...lingvaI2pRedirectsChecks,
- } else if (protocol == "tor") {
- if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateTorRedirectsChecks, ...simplyTranslateTorCustomRedirects]
- else if (translateFrontend == "lingva") instancesList = [...lingvaTorRedirectsChecks, ...lingvaTorCustomRedirects]
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- if (translateFrontend == "simplyTranslate") instancesList = [...simplyTranslateNormalRedirectsChecks, ...simplyTranslateNormalCustomRedirects]
- else if (translateFrontend == "lingva") instancesList = [...lingvaNormalRedirectsChecks, ...lingvaNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- simplyTranslateNormalRedirectsChecks = [...redirects.simplyTranslate.normal]
- lingvaNormalRedirectsChecks = [...redirects.lingva.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- 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(
- {
- translateDisable: false,
- translateFrontend: "simplyTranslate",
- translateRedirects: redirects,
-
- simplyTranslateNormalRedirectsChecks,
- simplyTranslateNormalCustomRedirects: [],
-
- simplyTranslateTorRedirectsChecks: [...redirects.simplyTranslate.tor],
- simplyTranslateTorCustomRedirects: [],
-
- simplyTranslateI2pRedirectsChecks: [...redirects.simplyTranslate.i2p],
- simplyTranslateI2pCustomRedirects: [],
-
- simplyTranslateLokiRedirectsChecks: [...redirects.simplyTranslate.loki],
- simplyTranslateLokiCustomRedirects: [],
-
- lingvaNormalRedirectsChecks,
- lingvaNormalCustomRedirects: [],
-
- lingvaTorRedirectsChecks: [...redirects.lingva.tor],
- lingvaTorCustomRedirects: [],
-
- lingvaI2pRedirectsChecks: [...redirects.lingva.i2p],
- lingvaI2pCustomRedirects: [],
-
- lingvaLokiRedirectsChecks: [...redirects.lingva.loki],
- lingvaLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- copyPasteSimplyTranslateCookies,
- copyPasteLingvaLocalStorage,
- setRedirects,
- redirect,
- initDefaults,
- switchInstance,
-}
diff --git a/src/assets/javascripts/twitter.js b/src/assets/javascripts/twitter.js
deleted file mode 100644
index eca8219f..00000000
--- a/src/assets/javascripts/twitter.js
+++ /dev/null
@@ -1,286 +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/]
-
-const frontends = new Array("nitter")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], r => {
- redirects.nitter = val
- nitterNormalRedirectsChecks = [...redirects.nitter.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
- let i = nitterNormalRedirectsChecks.indexOf(instance)
- if (i > -1) nitterNormalRedirectsChecks.splice(i, 1)
- }
- browser.storage.local.set(
- {
- twitterRedirects: redirects,
- nitterNormalRedirectsChecks,
- nitterTorRedirectsChecks: [...redirects.nitter.tor],
- nitterI2pRedirectsChecks: [...redirects.nitter.i2p],
- nitterLokiRedirectsChecks: [...redirects.nitter.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableTwitter,
- protocol,
- protocolFallback,
- twitterRedirects,
- twitterRedirectType,
- nitterNormalRedirectsChecks,
- nitterNormalCustomRedirects,
- nitterTorRedirectsChecks,
- nitterTorCustomRedirects,
- nitterI2pCustomRedirects,
- nitterLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableTwitter",
- "protocol",
- "protocolFallback",
- "twitterRedirects",
- "twitterRedirectType",
- "nitterNormalRedirectsChecks",
- "nitterNormalCustomRedirects",
- "nitterTorRedirectsChecks",
- "nitterTorCustomRedirects",
- "nitterI2pCustomRedirects",
- "nitterLokiCustomRedirects",
- ],
- r => {
- disableTwitter = r.disableTwitter
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- twitterRedirects = r.twitterRedirects
- twitterRedirectType = r.twitterRedirectType
- nitterNormalRedirectsChecks = r.nitterNormalRedirectsChecks
- nitterNormalCustomRedirects = r.nitterNormalCustomRedirects
- nitterTorRedirectsChecks = r.nitterTorRedirectsChecks
- nitterTorCustomRedirects = r.nitterTorCustomRedirects
- nitterI2pCustomRedirects = r.nitterI2pCustomRedirects
- nitterLokiCustomRedirects = r.nitterLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
- return [...nitterNormalRedirectsChecks, ...nitterTorRedirectsChecks, ...nitterNormalCustomRedirects, ...nitterTorCustomRedirects, ...nitterI2pCustomRedirects, ...nitterLokiCustomRedirects]
-}
-
-function redirect(url, type, initiator, disableOverride) {
- if (disableTwitter && !disableOverride) 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"
- if (twitterRedirectType == "main_frame" && type != "main_frame") return
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...nitterI2pCustomRedirects]
- else if (protocol == "i2p") instancesList = [...nitterLokiCustomRedirects]
- else if (protocol == "tor") instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
- }
- if (instancesList.length === 0) return
-
- const randomInstance = utils.getRandomInstance(instancesList)
- // https://pbs.twimg.com/profile_images/648888480974508032/66_cUYfj_400x400.jpg
-
- let search = new URLSearchParams(url.search)
-
- search.delete("ref_src")
- search.delete("ref_url")
-
- search = search.toString()
- if (search !== "") search = `?${search}`
-
- if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") {
- const [, id, format, extra] = search.match(/(.*)\?format=(.*)&(.*)/)
- const query = encodeURIComponent(`${id}.${format}?${extra}`)
- return `${randomInstance}/pic${search}${query}`
- }
- if (url.pathname.split("/").includes("tweets")) {
- return `${randomInstance}${url.pathname.replace("/tweets", "")}${search}`
- }
- if (url.host == "t.co") {
- return `${randomInstance}/t.co${url.pathname}`
- }
- return `${randomInstance}${url.pathname}${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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableTwitter && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
- let instancesList = []
- if (protocol == "loki") instancesList = [...nitterI2pCustomRedirects]
- else if (protocol == "i2p") instancesList = [...nitterLokiCustomRedirects]
- else if (protocol == "tor") instancesList = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
- }
-
- 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) {
- if (e.type != "sub_frame") return
- let url = new URL(e.url)
- let protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) 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
- } else if (e.responseHeaders[i].name == "content-security-policy") {
- 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 (protocol == "loki") checkedInstances = [...nitterI2pCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...nitterLokiCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...nitterTorRedirectsChecks, ...nitterTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...nitterNormalRedirectsChecks, ...nitterNormalCustomRedirects]
- }
- await utils.copyCookie("nitter", from, checkedInstances, "theme")
- await utils.copyCookie("nitter", from, checkedInstances, "infiniteScroll")
- await utils.copyCookie("nitter", from, checkedInstances, "stickyProfile")
- await utils.copyCookie("nitter", from, checkedInstances, "bidiSupport")
- await utils.copyCookie("nitter", from, checkedInstances, "hideTweetStats")
- await utils.copyCookie("nitter", from, checkedInstances, "hideBanner")
- await utils.copyCookie("nitter", from, checkedInstances, "hidePins")
- await utils.copyCookie("nitter", from, checkedInstances, "hideReplies")
- await utils.copyCookie("nitter", from, checkedInstances, "squareAvatars")
- await utils.copyCookie("nitter", from, checkedInstances, "mp4Playback")
- await utils.copyCookie("nitter", from, checkedInstances, "hlsPlayback")
- await utils.copyCookie("nitter", from, checkedInstances, "proxyVideos")
- await utils.copyCookie("nitter", from, checkedInstances, "muteVideos")
- await utils.copyCookie("nitter", from, checkedInstances, "autoplayGifs")
-
- await utils.copyCookie("nitter", from, checkedInstances, "replaceInstagram")
- await utils.copyCookie("nitter", from, checkedInstances, "replaceReddit")
- await utils.copyCookie("nitter", from, checkedInstances, "replaceTwitter")
- await utils.copyCookie("nitter", from, checkedInstances, "replaceYouTube")
- }
- resolve(true)
- })
-}
-
-function initDefaults() {
- return new Promise(resolve => {
- fetch("/instances/data.json")
- .then(response => response.text())
- .then(data => {
- let dataJson = JSON.parse(data)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], async r => {
- nitterNormalRedirectsChecks = [...redirects.nitter.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
- let i = nitterNormalRedirectsChecks.indexOf(instance)
- if (i > -1) nitterNormalRedirectsChecks.splice(i, 1)
- }
- browser.storage.local.set(
- {
- disableTwitter: false,
- twitterRedirects: redirects,
- twitterRedirectType: "both",
-
- nitterNormalRedirectsChecks,
- nitterNormalCustomRedirects: [],
-
- nitterTorRedirectsChecks: [...redirects.nitter.tor],
- nitterTorCustomRedirects: [],
-
- nitterI2pRedirectsChecks: [...redirects.nitter.i2p],
- nitterI2pCustomRedirects: [],
-
- nitterLokiRedirectsChecks: [...redirects.nitter.loki],
- nitterLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- redirect,
- switchInstance,
- reverse,
- removeXFrameOptions,
- initNitterCookies,
- initDefaults,
-}
diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
deleted file mode 100644
index 5ca5c30b..00000000
--- a/src/assets/javascripts/utils.js
+++ /dev/null
@@ -1,574 +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 quoraHelper from "./quora.js"
-import libremdbHelper from "./imdb.js"
-import imgurHelper from "./imgur.js"
-import reutersHelper from "./reuters.js"
-import youtubeMusicHelper from "./youtubeMusic.js"
-import mapsHelper from "./maps.js"
-import localise from "./localise.js"
-
-function getRandomInstance(instances) {
- return instances[~~(instances.length * Math.random())]
-}
-
-let cloudflareBlackList = []
-let authenticateBlackList = []
-let offlineBlackList = []
-async function initBlackList() {
- return new Promise(resolve => {
- browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], r => {
- cloudflareBlackList = r.cloudflareBlackList
- authenticateBlackList = r.authenticateBlackList
- offlineBlackList = r.offlineBlackList
- })
- if (cloudflareBlackList.length == 0) {
- fetch("/instances/blacklist.json")
- .then(response => response.text())
- .then(data => {
- cloudflareBlackList = JSON.parse(data).cloudflare
- authenticateBlackList = JSON.parse(data).authenticate
- offlineBlackList = JSON.parse(data).offline
- })
- }
- resolve()
- })
-}
-
-function updateBlackList() {
- return new Promise(async resolve => {
- let http = new XMLHttpRequest()
- let fallback = new XMLHttpRequest()
- http.open("GET", "https://codeberg.org/LibRedirect/libredirect/raw/branch/master/src/instances/blacklist.json", false)
- http.send(null)
- if (http.status != 200) {
- fallback.open("GET", "https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/blacklist.json", false)
- fallback.send(null)
- if (fallback.status === 200) {
- http = fallback
- } else {
- resolve()
- return
- }
- }
- const blackList = JSON.parse(http.responseText)
- browser.storage.local.set({
- cloudflareBlackList: blackList.cloudflare,
- authenticateBlackList: blackList.authenticate,
- offlineBlackList: blackList.offline,
- })
- ;(cloudflareBlackList = blackList.cloudflare), (authenticateBlackList = blackList.authenticate), (offlineBlackList = blackList.offline)
- resolve()
- })
-}
-
-function updateInstances() {
- return new Promise(async resolve => {
- let http = new XMLHttpRequest()
- let fallback = new XMLHttpRequest()
- http.open("GET", "https://raw.githubusercontent.com/libredirect/libredirect/master/src/instances/data.json", false)
- http.send(null)
- if (http.status != 200) {
- fallback.open("GET", "https://codeberg.org/LibRedirect/libredirect/raw/branch/master/src/instances/data.json", false)
- fallback.send(null)
- if (fallback.status === 200) {
- http = fallback
- } else {
- resolve()
- return
- }
- }
- await updateBlackList()
- const instances = JSON.parse(http.responseText)
-
- await youtubeHelper.setRedirects({
- invidious: instances.invidious,
- piped: instances.piped,
- pipedMaterial: instances.pipedMaterial,
- cloudtube: instances.cloudtube,
- })
- await twitterHelper.setRedirects(instances.nitter)
- await instagramHelper.setRedirects(instances.bibliogram)
- await redditHelper.setRedirects({
- libreddit: instances.libreddit,
- teddit: instances.teddit,
- })
- await translateHelper.setRedirects({
- simplyTranslate: instances.simplyTranslate,
- lingva: instances.lingva,
- })
- await searchHelper.setRedirects({
- searx: instances.searx,
- searxng: instances.searxng,
- whoogle: instances.whoogle,
- librex: instances.librex,
- })
- await wikipediaHelper.setRedirects(instances.wikiless)
- await mediumHelper.setRedirects(instances.scribe)
- await quoraHelper.setRedirects(instances.quetre)
- await libremdbHelper.setRedirects(instances.libremdb)
- await sendTargetsHelper.setRedirects(instances.send)
- await tiktokHelper.setRedirects(instances.proxiTok)
- await lbryHelper.setRedirects(instances.librarian)
- await reutersHelper.setRedirects(instances.neuters)
- await youtubeMusicHelper.setRedirects({
- beatbump: instances.beatbump,
- hyperpipe: instances.hyperpipe,
- })
- await mapsHelper.setRedirects(instances.facil)
- await peertubeHelper.setRedirects(instances.simpleertube)
-
- console.info("Successfully updated Instances")
- resolve(true)
- return
- })
-}
-
-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
- let nameProtocolElement = document.getElementById(name).getElementsByClassName(protocol)[0]
-
- let nameCustomInstances = []
- let nameCheckListElement = nameProtocolElement.getElementsByClassName("checklist")[0]
-
- await initBlackList()
-
- 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, latencyKey], r => {
- nameDefaultRedirects = r[redirectsChecks]
- nameCustomInstances = r[customRedirects]
- instancesLatency = r[latencyKey] ?? []
- redirects = r[redirectsKey]
- resolve()
- })
- )
- }
-
- await getFromStorage()
- if (nameCustomInstances === undefined) console.log(customRedirects)
-
- function calcNameCheckBoxes() {
- let isTrue = true
- for (const item of redirects[name][protocol]) {
- if (nameDefaultRedirects === undefined) console.log(name + protocol + " is undefined")
- 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("toggle-all")[0].checked = isTrue
- }
- nameCheckListElement.innerHTML = [
- `<div>
- <x data-localise="__MSG_toggleAll__">Toggle All</x>
- <input type="checkbox" class="toggle-all"/>
- </div>`,
- ...redirects[name][protocol].map(x => {
- const cloudflare = cloudflareBlackList.includes(x) ? ' <span style="color:red;">cloudflare</span>' : ""
- const authenticate = authenticateBlackList.includes(x) ? ' <span style="color:orange;">authenticate</span>' : ""
- const offline = offlineBlackList.includes(x) ? ' <span style="color:grey;">offline</span>' : ""
-
- 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"
-
- const latency = x in instancesLatency ? '<span style="color:' + latencyColor + ';">' + latencyLimit + "</span>" : ""
-
- let warnings = [cloudflare, authenticate, offline, latency].join(" ")
- return `<div>
- <x><a href="${x}" target="_blank">${x}</a>${warnings}</x>
- <input type="checkbox" class="${x}"/>
- </div>`
- }),
- ].join("\n<hr>\n")
-
- localise.localisePage()
-
- calcNameCheckBoxes()
- nameProtocolElement.getElementsByClassName("toggle-all")[0].addEventListener("change", async event => {
- if (event.target.checked) nameDefaultRedirects = [...redirects[name][protocol]]
- else nameDefaultRedirects = []
-
- browser.storage.local.set({ [redirectsChecks]: nameDefaultRedirects })
- calcNameCheckBoxes()
- })
-
- for (let element of nameCheckListElement.getElementsByTagName("input")) {
- if (element.className != "toggle-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)
- }
- browser.storage.local.set({
- [redirectsChecks]: nameDefaultRedirects,
- })
- calcNameCheckBoxes()
- })
- }
-
- function calcNameCustomInstances() {
- nameProtocolElement.getElementsByClassName("custom-checklist")[0].innerHTML = nameCustomInstances
- .map(
- x => `<div>
- ${x}
- <button class="add clear-${x}">
- <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" />
- </svg>
- </button>
- </div>
- <hr>`
- )
- .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)
- 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)
- browser.storage.local.set({ [customRedirects]: nameCustomInstances })
- nameCustomInstanceInput.value = ""
- }
- calcNameCustomInstances()
- }
- })
-}
-
-function ping(href) {
- return new Promise(async resolve => {
- let average = 0
- let time
- for (let i = 0; i < 3; i++) {
- time = await pingOnce(href)
- if (i == 0) continue
- if (time >= 5000) {
- resolve(time)
- return
- }
- average += time
- }
- average = parseInt(average / 3)
- resolve(average)
- })
-}
-
-function pingOnce(href) {
- return new Promise(async resolve => {
- let started
- let http = new XMLHttpRequest()
- http.timeout = 5000
- http.ontimeout = () => resolve(5000)
- http.onerror = () => resolve()
- 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.open("GET", `${href}?_=${new Date().getTime()}`, true)
- started = new Date().getTime()
- http.send(null)
- })
-}
-
-async function testLatency(element, instances, frontend) {
- return new Promise(async resolve => {
- let myList = {}
- let latencyThreshold
- let redirectsChecks = []
- browser.storage.local.get(["latencyThreshold", `${frontend}NormalRedirectsChecks`], r => {
- latencyThreshold = r.latencyThreshold
- redirectsChecks = r[`${frontend}NormalRedirectsChecks`]
- })
- for (const href of instances)
- await ping(href).then(time => {
- if (time) {
- myList[href] = time
- let color
- if (time <= 1000) color = "green"
- else if (time <= 2000) color = "orange"
- else color = "red"
-
- if (time > latencyThreshold) {
- redirectsChecks.splice(redirectsChecks.indexOf(href), 1)
- }
-
- browser.storage.local.set({ [`${frontend}NormalRedirectsChecks`]: redirectsChecks })
-
- let text
- if (time == 5000) text = "5000ms+"
- else if (time > 5000) text = `ERROR: ${time - 5000}`
- else text = `${time}ms`
- element.innerHTML = `${href}:&nbsp;<span style="color:${color};">${text}</span>`
- }
- })
- resolve(myList)
- })
-}
-
-function copyCookie(frontend, targetUrl, urls, name) {
- return new Promise(resolve => {
- browser.storage.local.get("firstPartyIsolate", r => {
- let query
- if (!r.firstPartyIsolate)
- query = {
- url: protocolHost(targetUrl),
- name: name,
- }
- else
- query = {
- url: protocolHost(targetUrl),
- name: name,
- firstPartyDomain: null,
- }
- browser.cookies.getAll(query, async cookies => {
- for (const cookie of cookies)
- if (cookie.name == name) {
- for (const url of urls) {
- const setQuery = r.firstPartyIsolate
- ? {
- url: url,
- name: name,
- value: cookie.value,
- secure: true,
- firstPartyDomain: new URL(url).hostname,
- }
- : {
- url: url,
- name: name,
- value: cookie.value,
- secure: true,
- expirationDate: cookie.expirationDate,
- }
- browser.cookies.set(setQuery)
- }
- break
- }
- resolve()
- })
- })
- })
-}
-
-function getPreferencesFromToken(frontend, targetUrl, urls, name, endpoint) {
- return new Promise(resolve => {
- browser.storage.local.get("firstPartyIsolate", r => {
- const http = new XMLHttpRequest()
- const url = `${targetUrl}${endpoint}`
- http.open("GET", url, false)
- http.setRequestHeader("Cookie", `${name}=${cookie.value}`)
- http.send(null)
- const preferences = JSON.parse(http.responseText)
- let formdata = new FormData()
- for (var key in preferences) formdata.append(key, preferences[key])
- for (const url of urls) {
- const http = new XMLHttpRequest()
- http.open("POST", `${url}/settings/stay`, false)
- http.send(null)
- }
- resolve()
- return
- })
- })
-}
-
-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 quoraHelper.reverse(url)
- if (!newUrl) newUrl = await libremdbHelper.reverse(url)
- if (!newUrl) newUrl = await imgurHelper.reverse(url)
-
- if (newUrl) {
- resolve(newUrl)
- 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)
- }
- }
- }
- 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.copyPasteInvidiousCookies(test, url)
- if (!result) result = await youtubeHelper.copyPastePipedLocalStorage(test, url, currTab.id)
- if (!result) result = await youtubeHelper.copyPastePipedMaterialLocalStorage(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 searchHelper.initLibrexCookies(test, url)
- if (!result) result = await tiktokHelper.initProxiTokCookies(test, url)
- if (!result) result = await wikipediaHelper.initWikilessCookies(test, url)
- if (!result) result = await translateHelper.copyPasteSimplyTranslateCookies(test, url)
- if (!result) result = await translateHelper.copyPasteLingvaLocalStorage(test, url)
- if (!result) result = await instagramHelper.initBibliogramPreferences(test, url)
-
- resolve(result)
- }
- })
- })
-}
-
-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, true)
- if (!newUrl) newUrl = await twitterHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await instagramHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await redditHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await searchHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await translateHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await mediumHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await quoraHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await libremdbHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await tiktokHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await sendTargetsHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await peertubeHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await lbryHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await imgurHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await wikipediaHelper.switchInstance(url, true)
- if (!newUrl) newUrl = await youtubeMusicHelper.switchInstance(url, true)
-
- if (newUrl) {
- if (!test) browser.tabs.update({ url: newUrl })
- resolve(true)
- } else resolve()
- }
- })
- })
-}
-
-function latency(name, frontend, document, location) {
- let latencyElement = document.getElementById(`latency-${frontend}`)
- let latencyLabel = document.getElementById(`latency-${frontend}-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, frontend).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,
- getPreferencesFromToken,
- switchInstance,
- copyRaw,
- unify,
-}
diff --git a/src/assets/javascripts/wikipedia.js b/src/assets/javascripts/wikipedia.js
deleted file mode 100644
index 1e06ed44..00000000
--- a/src/assets/javascripts/wikipedia.js
+++ /dev/null
@@ -1,247 +0,0 @@
-window.browser = window.browser || window.chrome
-
-import utils from "./utils.js"
-
-const targets = /^https?:\/{2}([a-z]+\.)*wikipedia\.org/
-
-const frontends = new Array("wikiless")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects.wikiless = val
- wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = wikilessNormalRedirectsChecks.indexOf(instance)
- if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- wikipediaRedirects: redirects,
- wikilessNormalRedirectsChecks,
- wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
- wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
- wikilessLokiRedirectsChecks: [...redirects.wikiless.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableWikipedia,
- wikipediaRedirects,
- protocol,
- protocolFallback,
- wikilessNormalRedirectsChecks,
- wikilessTorRedirectsChecks,
- wikilessI2pRedirectsChecks,
- wikilessNormalCustomRedirects,
- wikilessTorCustomRedirects,
- wikilessI2pCustomRedirects,
- wikilessLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableWikipedia",
- "wikipediaRedirects",
- "protocol",
- "protocolFallback",
- "wikilessNormalRedirectsChecks",
- "wikilessTorRedirectsChecks",
- "wikilessI2pRedirectsChecks",
- "wikilessNormalCustomRedirects",
- "wikilessTorCustomRedirects",
- "wikilessI2pCustomRedirects",
- "wikilessLokiCustomRedirects",
- ],
- r => {
- disableWikipedia = r.disableWikipedia
- wikipediaRedirects = r.wikipediaRedirects
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- wikilessNormalRedirectsChecks = r.wikilessNormalRedirectsChecks
- wikilessTorRedirectsChecks = r.wikilessTorRedirectsChecks
- wikilessI2pRedirectsChecks = r.wikilessI2pRedirectsChecks
- wikilessNormalCustomRedirects = r.wikilessNormalCustomRedirects
- wikilessTorCustomRedirects = r.wikilessTorCustomRedirects
- wikilessI2pCustomRedirects = r.wikilessI2pCustomRedirects
- wikilessLokiCustomRedirects = r.wikilessLokiCustomRedirects
- 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,
- ...wikilessLokiCustomRedirects,
- ]
- if (!all.includes(protocolHost)) {
- resolve()
- return
- }
-
- if (!test) {
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...wikilessLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
- else if (protocol == "tor") checkedInstances = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
- }
- await utils.copyCookie("wikiless", from, checkedInstances, "theme")
- await utils.copyCookie("wikiless", from, checkedInstances, "default_lang")
- }
- resolve(true)
- })
-}
-
-function redirect(url, disableOverride) {
- if (disableWikipedia && !disableOverride) 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 (protocol == "loki") instancesList = [...wikilessLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
- }
- 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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableWikipedia && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- const wikipediaList = [
- ...wikipediaRedirects.wikiless.normal,
- ...wikipediaRedirects.wikiless.tor,
- ...wikipediaRedirects.wikiless.i2p,
-
- ...wikilessNormalCustomRedirects,
- ...wikilessTorCustomRedirects,
- ...wikilessI2pCustomRedirects,
- ...wikilessLokiCustomRedirects,
- ]
- if (!wikipediaList.includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- if (protocol == "loki") instancesList = [...wikilessLokiCustomRedirects]
- else if (protocol == "i2p") instancesList = [...wikilessI2pCustomRedirects, ...wikilessI2pRedirectsChecks]
- else if (protocol == "tor") instancesList = [...wikilessTorRedirectsChecks, ...wikilessTorCustomRedirects]
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...wikilessNormalRedirectsChecks, ...wikilessNormalCustomRedirects]
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- wikilessNormalRedirectsChecks = [...redirects.wikiless.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = wikilessNormalRedirectsChecks.indexOf(instance)
- if (a > -1) wikilessNormalRedirectsChecks.splice(a, 1)
- }
- browser.storage.local.set(
- {
- disableWikipedia: true,
- wikipediaRedirects: redirects,
-
- wikilessNormalRedirectsChecks,
- wikilessNormalCustomRedirects: [],
-
- wikilessTorRedirectsChecks: [...redirects.wikiless.tor],
- wikilessTorCustomRedirects: [],
-
- wikilessI2pRedirectsChecks: [...redirects.wikiless.i2p],
- wikilessI2pCustomRedirects: [],
-
- wikilessLokiRedirectsChecks: [...redirects.wikiless.loki],
- wikilessLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- initWikilessCookies,
- redirect,
- initDefaults,
- switchInstance,
-}
diff --git a/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js b/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js
deleted file mode 100644
index df79e13c..00000000
--- a/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js
+++ /dev/null
@@ -1,5 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.set({
- pipedMaterial_PREFERENCES: localStorage.getItem("PREFERENCES"),
-})
diff --git a/src/assets/javascripts/youtube/get_piped_preferences.js b/src/assets/javascripts/youtube/get_piped_preferences.js
deleted file mode 100644
index 388ecd19..00000000
--- a/src/assets/javascripts/youtube/get_piped_preferences.js
+++ /dev/null
@@ -1,22 +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/youtube/set_pipedMaterial_preferences.js b/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js
deleted file mode 100644
index 59d6dcc4..00000000
--- a/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js
+++ /dev/null
@@ -1,7 +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()
-})
diff --git a/src/assets/javascripts/youtube/set_piped_preferences.js b/src/assets/javascripts/youtube/set_piped_preferences.js
deleted file mode 100644
index 374f2d61..00000000
--- a/src/assets/javascripts/youtube/set_piped_preferences.js
+++ /dev/null
@@ -1,45 +0,0 @@
-window.browser = window.browser || window.chrome
-
-browser.storage.local.get(
- [
- "piped_bufferGoal",
- "piped_comments",
- "piped_disableLBRY",
- "piped_enabledCodecs",
- "piped_homepage",
- "piped_instance",
- "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()
- }
-)
diff --git a/src/assets/javascripts/youtube/youtube.js b/src/assets/javascripts/youtube/youtube.js
deleted file mode 100644
index 7b215704..00000000
--- a/src/assets/javascripts/youtube/youtube.js
+++ /dev/null
@@ -1,797 +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\/..*/,
-]
-
-const frontends = new Array("invidious", "piped", "pipedMaterial", "cloudtube")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects = val
- invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
- pipedNormalRedirectsChecks = [...redirects.piped.normal]
- pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
- cloudtubeNormalRedirectsChecks = [...redirects.cloudtube.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = invidiousNormalRedirectsChecks.indexOf(instance)
- if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1)
-
- const b = pipedNormalRedirectsChecks.indexOf(instance)
- if (b > -1) pipedNormalRedirectsChecks.splice(b, 1)
-
- const c = pipedMaterialNormalRedirectsChecks.indexOf(instance)
- if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1)
-
- const d = cloudtubeNormalRedirectsChecks.indexOf(instance)
- if (c > -1) cloudtubeNormalRedirectsChecks.splice(d, 1)
- }
- browser.storage.local.set(
- {
- youtubeRedirects: redirects,
- invidiousNormalRedirectsChecks,
- invidiousTorRedirectsChecks: [...redirects.invidious.tor],
- invidiousI2pRedirectsChecks: [...redirects.invidious.i2p],
- invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
- pipedNormalRedirectsChecks,
- pipedTorRedirectsChecks: [...redirects.piped.tor],
- pipedI2pRedirectsChecks: [...redirects.piped.i2p],
- pipedLokiRedirectsChecks: [...redirects.piped.loki],
- pipedMaterialNormalRedirectsChecks,
- pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
- pipedMaterialI2pRedirectsChecks: [...redirects.pipedMaterial.i2p],
- pipedMaterialLokiRedirectsChecks: [...redirects.pipedMaterial.loki],
- cloudtubeNormalRedirectsChecks,
- cloudtubeTorRedirectsChecks: [...redirects.cloudtube.tor],
- cloudtubeI2pRedirectsChecks: [...redirects.cloudtube.i2p],
- cloudtubeLokiRedirectsChecks: [...redirects.cloudtube.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableYoutube,
- onlyEmbeddedVideo,
- youtubeFrontend,
- protocol,
- protocolFallback,
- youtubeEmbedFrontend,
- youtubeRedirects,
- invidiousNormalRedirectsChecks,
- invidiousNormalCustomRedirects,
- invidiousTorRedirectsChecks,
- invidiousTorCustomRedirects,
- invidiousI2pRedirectsChecks,
- invidiousI2pCustomRedirects,
- invidiousLokiRedirectsChecks,
- invidiousLokiCustomRedirects,
- pipedNormalRedirectsChecks,
- pipedNormalCustomRedirects,
- pipedTorRedirectsChecks,
- pipedTorCustomRedirects,
- pipedI2pRedirectsChecks,
- pipedI2pCustomRedirects,
- pipedLokiRedirectsChecks,
- pipedLokiCustomRedirects,
- pipedMaterialNormalRedirectsChecks,
- pipedMaterialNormalCustomRedirects,
- pipedMaterialTorRedirectsChecks,
- pipedMaterialTorCustomRedirects,
- pipedMaterialI2pRedirectsChecks,
- pipedMaterialI2pCustomRedirects,
- pipedMaterialLokiRedirectsChecks,
- pipedMaterialLokiCustomRedirects,
- cloudtubeNormalRedirectsChecks,
- cloudtubeNormalCustomRedirects,
- cloudtubeTorRedirectsChecks,
- cloudtubeTorCustomRedirects,
- cloudtubeI2pRedirectsChecks,
- cloudtubeI2pCustomRedirects,
- cloudtubeLokiRedirectsChecks,
- cloudtubeLokiCustomRedirects
-
-function init() {
- return new Promise(resolve => {
- browser.storage.local.get(
- [
- "disableYoutube",
- "onlyEmbeddedVideo",
- "youtubeFrontend",
- "protocol",
- "protocolFallback",
- "youtubeEmbedFrontend",
- "youtubeRedirects",
- "invidiousNormalRedirectsChecks",
- "invidiousNormalCustomRedirects",
- "invidiousTorRedirectsChecks",
- "invidiousTorCustomRedirects",
- "invidiousI2pRedirectsChecks",
- "invidiousI2pCustomRedirects",
- "invidiousLokiRedirectsChecks",
- "invidiousLokiCustomRedirects",
- "pipedNormalRedirectsChecks",
- "pipedNormalCustomRedirects",
- "pipedTorRedirectsChecks",
- "pipedTorCustomRedirects",
- "pipedI2pRedirectsChecks",
- "pipedI2pCustomRedirects",
- "pipedLokiRedirectsChecks",
- "pipedLokiCustomRedirects",
- "pipedMaterialNormalRedirectsChecks",
- "pipedMaterialNormalCustomRedirects",
- "pipedMaterialTorRedirectsChecks",
- "pipedMaterialTorCustomRedirects",
- "pipedMaterialI2pRedirectsChecks",
- "pipedMaterialI2pCustomRedirects",
- "pipedMaterialLokiRedirectsChecks",
- "pipedMaterialLokiCustomRedirects",
- "cloudtubeNormalRedirectsChecks",
- "cloudtubeNormalCustomRedirects",
- "cloudtubeTorRedirectsChecks",
- "cloudtubeTorCustomRedirects",
- "cloudtubeI2pRedirectsChecks",
- "cloudtubeI2pCustomRedirects",
- "cloudtubeLokiRedirectsChecks",
- "cloudtubeLokiCustomRedirects",
- ],
- r => {
- disableYoutube = r.disableYoutube
- onlyEmbeddedVideo = r.onlyEmbeddedVideo
- youtubeFrontend = r.youtubeFrontend
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- youtubeEmbedFrontend = r.youtubeEmbedFrontend
- youtubeRedirects = r.youtubeRedirects
- invidiousNormalRedirectsChecks = r.invidiousNormalRedirectsChecks
- invidiousNormalCustomRedirects = r.invidiousNormalCustomRedirects
- invidiousTorRedirectsChecks = r.invidiousTorRedirectsChecks
- invidiousTorCustomRedirects = r.invidiousTorCustomRedirects
- invidiousI2pRedirectsChecks = r.invidiousI2pRedirectsChecks
- invidiousI2pCustomRedirects = r.invidiousI2pCustomRedirects
- invidiousLokiRedirectsChecks = r.invidiousLokiRedirectsChecks
- invidiousLokiCustomRedirects = r.invidiousLokiCustomRedirects
- pipedNormalRedirectsChecks = r.pipedNormalRedirectsChecks
- pipedNormalCustomRedirects = r.pipedNormalCustomRedirects
- pipedTorRedirectsChecks = r.pipedTorRedirectsChecks
- pipedTorCustomRedirects = r.pipedTorCustomRedirects
- pipedI2pRedirectsChecks = r.pipedI2pRedirectsChecks
- pipedI2pCustomRedirects = r.pipedI2pCustomRedirects
- pipedLokiRedirectsChecks = r.pipedLokiRedirectsChecks
- pipedLokiCustomRedirects = r.pipedLokiCustomRedirects
- pipedMaterialNormalRedirectsChecks = r.pipedMaterialNormalRedirectsChecks
- pipedMaterialNormalCustomRedirects = r.pipedMaterialNormalCustomRedirects
- pipedMaterialTorRedirectsChecks = r.pipedMaterialTorRedirectsChecks
- pipedMaterialTorCustomRedirects = r.pipedMaterialTorCustomRedirects
- pipedMaterialI2pRedirectsChecks = r.pipedMaterialI2pRedirectsChecks
- pipedMaterialI2pCustomRedirects = r.pipedMaterialI2pCustomRedirects
- pipedMaterialLokiRedirectsChecks = r.pipedMaterialLokiRedirectsChecks
- pipedMaterialLokiCustomRedirects = r.pipedMaterialLokiCustomRedirects
- cloudtubeNormalRedirectsChecks = r.cloudtubeNormalRedirectsChecks
- cloudtubeNormalCustomRedirects = r.cloudtubeNormalCustomRedirects
- cloudtubeTorRedirectsChecks = r.cloudtubeTorRedirectsChecks
- cloudtubeTorCustomRedirects = r.cloudtubeTorCustomRedirects
- cloudtubeI2pRedirectsChecks = r.cloudtubeI2pRedirectsChecks
- cloudtubeI2pCustomRedirects = r.cloudtubeI2pCustomRedirects
- cloudtubeLokiRedirectsChecks = r.cloudtubeLokiRedirectsChecks
- cloudtubeLokiCustomRedirects = r.cloudtubeLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
- return [
- ...youtubeRedirects.invidious.normal,
- ...youtubeRedirects.invidious.tor,
- ...youtubeRedirects.invidious.i2p,
- ...youtubeRedirects.invidious.loki,
-
- ...youtubeRedirects.piped.normal,
- ...youtubeRedirects.piped.tor,
- ...youtubeRedirects.piped.i2p,
- ...youtubeRedirects.piped.loki,
-
- ...youtubeRedirects.pipedMaterial.normal,
- ...youtubeRedirects.pipedMaterial.tor,
- ...youtubeRedirects.pipedMaterial.i2p,
- ...youtubeRedirects.pipedMaterial.loki,
-
- ...youtubeRedirects.cloudtube.normal,
- ...youtubeRedirects.cloudtube.tor,
- ...youtubeRedirects.cloudtube.i2p,
- ...youtubeRedirects.cloudtube.loki,
-
- ...invidiousNormalCustomRedirects,
- ...invidiousTorCustomRedirects,
- ...invidiousI2pCustomRedirects,
- ...invidiousLokiCustomRedirects,
-
- ...pipedNormalCustomRedirects,
- ...pipedTorCustomRedirects,
- ...pipedI2pCustomRedirects,
- ...pipedLokiCustomRedirects,
-
- ...pipedMaterialNormalCustomRedirects,
- ...pipedMaterialTorCustomRedirects,
- ...pipedMaterialI2pCustomRedirects,
- ...pipedMaterialLokiCustomRedirects,
-
- ...cloudtubeNormalCustomRedirects,
- ...cloudtubeTorCustomRedirects,
- ...cloudtubeI2pCustomRedirects,
- ...cloudtubeLokiCustomRedirects,
- ]
-}
-
-function calculateFrontend(type) {
- switch (type) {
- case "main_frame":
- return youtubeFrontend
- case "sub_frame":
- return youtubeEmbedFrontend
- }
-}
-
-function getInstanceList(type) {
- let instancesList = []
- switch (calculateFrontend(type)) {
- case "invidious":
- switch (protocol) {
- case "loki":
- instancesList = [...invidiousLokiRedirectsChecks, ...invidiousLokiCustomRedirects]
- break
- case "i2p":
- instancesList = [...invidiousI2pRedirectsChecks, ...invidiousI2pCustomRedirects]
- break
- case "tor":
- instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
- }
- break
- case "piped":
- switch (protocol) {
- case "loki":
- instancesList = [...pipedLokiRedirectsChecks, ...pipedLokiCustomRedirects]
- break
- case "i2p":
- instancesList = [...pipedI2pRedirectsChecks, ...pipedI2pCustomRedirects]
- break
- case "tor":
- instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]
- }
- break
- case "pipedMaterial":
- switch (protocol) {
- case "loki":
- instancesList = [...pipedMaterialLokiRedirectsChecks, ...pipedMaterialLokiCustomRedirects]
- break
- case "i2p":
- instancesList = [...pipedMaterialI2pRedirectsChecks, ...pipedMaterialI2pCustomRedirects]
- break
- case "tor":
- instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
- }
- case "cloudtube":
- switch (protocol) {
- case "loki":
- instancesList = [...cloudtubeLokiRedirectsChecks, ...cloudtubeLokiCustomRedirects]
- break
- case "i2p":
- instancesList = [...cloudtubeI2pRedirectsChecks, ...cloudtubeI2pCustomRedirects]
- break
- case "tor":
- instancesList = [...cloudtubeTorRedirectsChecks, ...cloudtubeTorCustomRedirects]
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- instancesList = [...cloudtubeNormalRedirectsChecks, ...cloudtubeNormalCustomRedirects]
- }
- }
- return instancesList
-}
-
-function redirect(url, type, tabId, initiator, disableOverride) {
- if (disableYoutube && !disableOverride) return
- if (!targets.some(rx => rx.test(url.href))) return
- if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
-
- if (type != ("main_frame" || "sub_frame")) return
- if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) return // Don't redirect YouTube Player API.
- if (onlyEmbeddedVideo == "onlyNotEmbedded" && type == "sub_frame") return
-
- if (type == "main_frame") {
- switch (youtubeFrontend) {
- case "yatte":
- return url.href.replace(/^https?:\/{2}/, "yattee://")
- case "freetube":
- if (url.host === "youtu.be") return `freetube://https://youtube.com/watch?v=${url.pathname.slice(1)}&${url.search.slice(1)}`
- return `freetube://https://youtube.com${url.pathname}${url.search}`
- }
- }
-
- const instanceList = getInstanceList(type)
- try {
- if (instanceList.length >= 1) {
- const randomInstance = utils.getRandomInstance(instanceList)
- return `${randomInstance}${url.pathname}${url.search}`
- }
- } catch {
- return
- }
-}
-
-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, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableYoutube && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = []
- switch (protocol) {
- case "loki":
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousLokiRedirectsChecks, ...invidiousLokiCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedLokiRedirectsChecks, ...pipedLokiCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialLokiRedirectsChecks, ...pipedMaterialLokiCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeLokiRedirectsChecks, ...cloudtubeLokiCustomRedirects]
- }
- break
- case "i2p":
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousI2pRedirectsChecks, ...invidiousI2pCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedI2pRedirectsChecks, ...pipedI2pCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialI2pRedirectsChecks, ...pipedMaterialI2pCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeI2pRedirectsChecks, ...cloudtubeI2pCustomRedirects]
- }
- break
- case "tor":
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeTorRedirectsChecks, ...cloudtubeTorCustomRedirects]
- }
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeNormalRedirectsChecks, ...cloudtubeNormalCustomRedirects]
- }
- }
-
- 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)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
- pipedNormalRedirectsChecks = [...redirects.piped.normal]
- pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
- cloudtubeNormalRedirectsChecks = [...redirects.cloudtube.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = invidiousNormalRedirectsChecks.indexOf(instance)
- if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1)
-
- const b = pipedNormalRedirectsChecks.indexOf(instance)
- if (b > -1) pipedNormalRedirectsChecks.splice(b, 1)
-
- const c = pipedMaterialNormalRedirectsChecks.indexOf(instance)
- if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1)
-
- const d = cloudtubeNormalRedirectsChecks.indexOf(instance)
- if (c > -1) cloudtubeNormalRedirectsChecks.splice(d, 1)
- }
- browser.storage.local.set(
- {
- disableYoutube: false,
- enableYoutubeCustomSettings: false,
- onlyEmbeddedVideo: "both",
- youtubeRedirects: redirects,
- youtubeFrontend: "invidious",
-
- invidiousNormalRedirectsChecks,
- invidiousNormalCustomRedirects: [],
-
- invidiousTorRedirectsChecks: [...redirects.invidious.tor],
- invidiousTorCustomRedirects: [],
-
- invidiousI2pRedirectsChecks: [...redirects.invidious.i2p],
- invidiousI2pCustomRedirects: [],
-
- invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
- invidiousLokiCustomRedirects: [],
-
- pipedNormalRedirectsChecks,
- pipedNormalCustomRedirects: [],
-
- pipedTorRedirectsChecks: [...redirects.piped.tor],
- pipedTorCustomRedirects: [],
-
- pipedI2pRedirectsChecks: [...redirects.piped.i2p],
- pipedI2pCustomRedirects: [],
-
- pipedLokiRedirectsChecks: [...redirects.piped.loki],
- pipedLokiCustomRedirects: [],
-
- pipedMaterialNormalRedirectsChecks: pipedMaterialNormalRedirectsChecks,
- pipedMaterialNormalCustomRedirects: [],
-
- pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
- pipedMaterialTorCustomRedirects: [],
-
- pipedMaterialI2pRedirectsChecks: [...redirects.pipedMaterial.i2p],
- pipedMaterialI2pCustomRedirects: [],
-
- pipedMaterialLokiRedirectsChecks: [...redirects.pipedMaterial.loki],
- pipedMaterialLokiCustomRedirects: [],
-
- cloudtubeNormalRedirectsChecks: cloudtubeNormalRedirectsChecks,
- cloudtubeNormalCustomRedirects: [],
-
- cloudtubeTorRedirectsChecks: [...redirects.cloudtube.tor],
- cloudtubeTorCustomRedirects: [],
-
- cloudtubeI2pRedirectsChecks: [...redirects.cloudtube.i2p],
- cloudtubeI2pCustomRedirects: [],
-
- cloudtubeLokiRedirectsChecks: [...redirects.cloudtube.loki],
- cloudtubeLokiCustomRedirects: [],
-
- youtubeEmbedFrontend: "invidious",
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-function copyPasteInvidiousCookies(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,
- ...invidiousI2pCustomRedirects,
- ...invidiousLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
- if (!test) {
- let checkedInstances = []
-
- if (protocol == "loki") checkedInstances = [...invidiousLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...invidiousI2pCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
- }
- const i = checkedInstances.indexOf(protocolHost)
- if (i !== -1) checkedInstances.splice(i, 1)
- await utils.copyCookie("invidious", from, checkedInstances, "PREFS")
- }
- resolve(true)
- })
-}
-
-function copyPastePipedLocalStorage(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, ...pipedI2pCustomRedirects, ...pipedLokiCustomRedirects].includes(
- protocolHost
- )
- ) {
- resolve()
- return
- }
-
- if (!test) {
- browser.tabs.executeScript(tabId, {
- file: "/assets/javascripts/youtube/get_piped_preferences.js",
- runAt: "document_start",
- })
-
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...pipedLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...pipedI2pCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
- if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
- }
- 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 copyPastePipedMaterialLocalStorage(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,
- ...pipedMaterialI2pCustomRedirects,
- ...pipedMaterialLokiCustomRedirects,
- ].includes(protocolHost)
- ) {
- resolve()
- return
- }
-
- if (!test) {
- browser.tabs.executeScript(tabId, {
- file: "/assets/javascripts/youtube/get_pipedMaterial_preferences.js",
- runAt: "document_start",
- })
-
- let checkedInstances = []
- if (protocol == "loki") checkedInstances = [...pipedMaterialLokiCustomRedirects]
- else if (protocol == "i2p") checkedInstances = [...pipedMaterialI2pCustomRedirects]
- else if (protocol == "tor") checkedInstances = [...pipedMaterialTorCustomRedirects] //...pipedMaterialTorRedirectsChecks,
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- checkedInstances = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
- }
- 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) {
- let isChanged = false
-
- if (e.type == "main_frame") {
- for (const i in e.responseHeaders) {
- if (e.responseHeaders[i].name == "content-security-policy") {
- let instancesList = []
- switch (protocol) {
- case "loki":
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousLokiRedirectsChecks, ...invidiousLokiCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedLokiRedirectsChecks, ...pipedLokiCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialLokiRedirectsChecks, ...pipedMaterialLokiCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeLokiRedirectsChecks, ...cloudtubeLokiCustomRedirects]
- }
- break
- case "i2p":
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousI2pRedirectsChecks, ...invidiousI2pCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedI2pRedirectsChecks, ...pipedI2pCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialI2pRedirectsChecks, ...pipedMaterialI2pCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeI2pRedirectsChecks, ...cloudtubeI2pCustomRedirects]
- }
- break
- case "tor":
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialTorRedirectsChecks, ...pipedMaterialTorCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeTorRedirectsChecks, ...cloudtubeTorCustomRedirects]
- }
- }
- if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
- switch (youtubeFrontend) {
- case "invidious":
- instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects]
- break
- case "piped":
- instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects]
- break
- case "pipedMaterial":
- instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects]
- break
- case "cloudtube":
- instancesList = [...cloudtubeNormalRedirectsChecks, ...cloudtubeNormalCustomRedirects]
- }
- }
- let securityPolicyList = e.responseHeaders[i].value.split(";")
- for (const i in securityPolicyList) securityPolicyList[i] = securityPolicyList[i].trim()
-
- let newSecurity = ""
- for (const item of securityPolicyList) {
- if (item.trim() == "") continue
- let regex = item.match(/([a-z-]{0,}) (.*)/)
- if (regex == null) continue
- let [, key, vals] = regex
- if (key == "frame-src") vals = vals + " " + instancesList.join(" ")
- newSecurity += key + " " + vals + "; "
- }
-
- e.responseHeaders[i].value = newSecurity
- isChanged = true
- }
- }
- } else if (e.type == "sub_frame") {
- const url = new URL(e.url)
- const protocolHost = utils.protocolHost(url)
- if (all().includes(protocolHost)) {
- for (const i in e.responseHeaders) {
- if (e.responseHeaders[i].name == "x-frame-options") {
- e.responseHeaders.splice(i, 1)
- isChanged = true
- } else if (e.responseHeaders[i].name == "content-security-policy") {
- e.responseHeaders.splice(i, 1)
- isChanged = true
- }
- }
- }
- }
- if (isChanged) return { responseHeaders: e.responseHeaders }
-}
-
-export default {
- setRedirects,
- copyPastePipedLocalStorage,
- copyPastePipedMaterialLocalStorage,
- copyPasteInvidiousCookies,
- redirect,
- reverse,
- switchInstance,
- initDefaults,
- removeXFrameOptions,
-}
diff --git a/src/assets/javascripts/youtubeMusic.js b/src/assets/javascripts/youtubeMusic.js
deleted file mode 100644
index 757378f4..00000000
--- a/src/assets/javascripts/youtubeMusic.js
+++ /dev/null
@@ -1,332 +0,0 @@
-"use strict"
-
-import utils from "./utils.js"
-
-window.browser = window.browser || window.chrome
-
-const targets = [/^https?:\/{2}music\.youtube\.com(\/.*|$)/]
-
-const frontends = new Array("beatbump", "hyperpipe")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let redirects = {}
-
-for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = {}
- for (let x = 0; x < protocols.length; x++) {
- redirects[frontends[i]][protocols[x]] = []
- }
-}
-
-function setRedirects(val) {
- return new Promise(resolve =>
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], r => {
- redirects = val
- beatbumpNormalRedirectsChecks = [...redirects.beatbump.normal]
- hyperpipeNormalRedirectsChecks = [...redirects.hyperpipe.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = beatbumpNormalRedirectsChecks.indexOf(instance)
- if (a > -1) beatbumpNormalRedirectsChecks.splice(a, 1)
-
- const b = hyperpipeNormalRedirectsChecks.indexOf(instance)
- if (b > -1) hyperpipeNormalRedirectsChecks.splice(b, 1)
- }
- browser.storage.local.set(
- {
- youtubeMusicRedirects: redirects,
- beatbumpNormalRedirectsChecks,
- beatbumpTorRedirectsChecks: [...redirects.beatbump.tor],
- beatbumpI2pRedirectsChecks: [...redirects.beatbump.i2p],
- beatbumpLokiRedirectsChecks: [...redirects.beatbump.loki],
- hyperpipeNormalRedirectsChecks,
- hyperpipeTorRedirectsChecks: [...redirects.hyperpipe.tor],
- hyperpipeI2pRedirectsChecks: [...redirects.hyperpipe.i2p],
- hyperpipeLokiRedirectsChecks: [...redirects.hyperpipe.loki],
- },
- () => resolve()
- )
- })
- )
-}
-
-let disableYoutubeMusic,
- youtubeMusicFrontend,
- youtubeMusicRedirects,
- protocol,
- protocolFallback,
- beatbumpNormalRedirectsChecks,
- beatbumpNormalCustomRedirects,
- beatbumpTorRedirectsChecks,
- beatbumpTorCustomRedirects,
- beatbumpI2pRedirectsChecks,
- beatbumpI2pCustomRedirects,
- beatbumpLokiRedirectsChecks,
- beatbumpLokiCustomRedirects,
- hyperpipeNormalRedirectsChecks,
- hyperpipeNormalCustomRedirects,
- hyperpipeTorRedirectsChecks,
- hyperpipeTorCustomRedirects,
- hyperpipeI2pRedirectsChecks,
- hyperpipeI2pCustomRedirects,
- hyperpipeLokiRedirectsChecks,
- hyperpipeLokiCustomRedirects
-
-function init() {
- return new Promise(async resolve => {
- browser.storage.local.get(
- [
- "disableYoutubeMusic",
- "youtubeMusicFrontend",
- "youtubeMusicRedirects",
- "protocol",
- "protocolFallback",
- "beatbumpNormalRedirectsChecks",
- "beatbumpNormalCustomRedirects",
- "beatbumpTorRedirectsChecks",
- "beatbumpTorCustomRedirects",
- "beatbumpI2pRedirectsChecks",
- "beatbumpI2pCustomRedirects",
- "beatbumpLokiRedirectsChecks",
- "beatbumpLokiCustomRedirects",
- "hyperpipeNormalRedirectsChecks",
- "hyperpipeNormalCustomRedirects",
- "hyperpipeTorRedirectsChecks",
- "hyperpipeTorCustomRedirects",
- "hyperpipeI2pRedirectsChecks",
- "hyperpipeI2pCustomRedirects",
- "hyperpipeLokiRedirectsChecks",
- "hyperpipeLokiCustomRedirects",
- ],
- r => {
- disableYoutubeMusic = r.disableYoutubeMusic
- youtubeMusicFrontend = r.youtubeMusicFrontend
- youtubeMusicRedirects = r.youtubeMusicRedirects
- protocol = r.protocol
- protocolFallback = r.protocolFallback
- beatbumpNormalRedirectsChecks = r.beatbumpNormalRedirectsChecks
- beatbumpNormalCustomRedirects = r.beatbumpNormalCustomRedirects
- beatbumpTorRedirectsChecks = r.beatbumpTorRedirectsChecks
- beatbumpTorCustomRedirects = r.beatbumpTorCustomRedirects
- beatbumpI2pRedirectsChecks = r.beatbumpI2pRedirectsChecks
- beatbumpI2pCustomRedirects = r.beatbumpI2pCustomRedirects
- beatbumpLokiRedirectsChecks = r.beatbumpLokiRedirectsChecks
- beatbumpLokiCustomRedirects = r.beatbumpLokiCustomRedirects
- hyperpipeNormalRedirectsChecks = r.hyperpipeNormalRedirectsChecks
- hyperpipeNormalCustomRedirects = r.hyperpipeNormalCustomRedirects
- hyperpipeTorRedirectsChecks = r.hyperpipeTorRedirectsChecks
- hyperpipeTorCustomRedirects = r.hyperpipeTorCustomRedirects
- hyperpipeI2pRedirectsChecks = r.hyperpipeI2pRedirectsChecks
- hyperpipeI2pCustomRedirects = r.hyperpipeI2pCustomRedirects
- hyperpipeLokiRedirectsChecks = r.hyperpipeLokiRedirectsChecks
- hyperpipeLokiCustomRedirects = r.hyperpipeLokiCustomRedirects
- resolve()
- }
- )
- })
-}
-
-init()
-browser.storage.onChanged.addListener(init)
-
-function all() {
- return [
- ...beatbumpNormalRedirectsChecks,
- ...beatbumpNormalCustomRedirects,
- ...beatbumpTorRedirectsChecks,
- ...beatbumpTorCustomRedirects,
- ...beatbumpI2pRedirectsChecks,
- ...beatbumpI2pCustomRedirects,
- ...beatbumpLokiRedirectsChecks,
- ...beatbumpLokiCustomRedirects,
- ...hyperpipeNormalRedirectsChecks,
- ...hyperpipeNormalCustomRedirects,
- ...hyperpipeTorRedirectsChecks,
- ...hyperpipeTorCustomRedirects,
- ...hyperpipeI2pRedirectsChecks,
- ...hyperpipeI2pCustomRedirects,
- ...hyperpipeLokiRedirectsChecks,
- ...hyperpipeLokiCustomRedirects,
- ]
-}
-
-function getInstanceList() {
- let tmpList = []
- switch (youtubeMusicFrontend) {
- case "beatbump":
- switch (protocol) {
- case "loki":
- tmpList = [...beatbumpLokiRedirectsChecks, ...beatbumpLokiCustomRedirects]
- break
- case "i2p":
- tmpList = [...beatbumpI2pRedirectsChecks, ...beatbumpI2pCustomRedirects]
- break
- case "tor":
- tmpList = [...beatbumpTorRedirectsChecks, ...beatbumpTorCustomRedirects]
- }
- if ((tmpList.length === 0 && protocolFallback) || protocol == "normal") {
- tmpList = [...beatbumpNormalRedirectsChecks, ...beatbumpNormalCustomRedirects]
- }
- break
- case "hyperpipe":
- switch (protocol) {
- case "loki":
- tmpList = [...hyperpipeLokiRedirectsChecks, ...hyperpipeLokiCustomRedirects]
- break
- case "i2p":
- tmpList = [...hyperpipeI2pRedirectsChecks, ...hyperpipeI2pCustomRedirects]
- break
- case "tor":
- tmpList = [...hyperpipeTorRedirectsChecks, ...hyperpipeTorCustomRedirects]
- }
- if ((tmpList.length === 0 && protocolFallback) || protocol == "normal") {
- tmpList = [...hyperpipeNormalRedirectsChecks, ...hyperpipeNormalCustomRedirects]
- }
- }
- return tmpList
-}
-
-function getUrl(randomInstance, url) {
- switch (youtubeMusicFrontend) {
- case "beatbump":
- return `${randomInstance}${url.pathname}${url.search}`
- .replace("/watch?v=", "/listen?id=")
- .replace("/channel/", "/artist/")
- .replace("/playlist?list=", "/playlist/VL")
- .replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=song")
- case "hyperpipe":
- return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/"))
- }
-}
-
-/*
-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
-
-Search
-https://music.youtube.com/search?q=test
-https://beatbump.ml/search/test?filter=EgWKAQIIAWoKEAMQBBAKEAkQBQ%3D%3D
-
-*/
-function redirect(url, type, initiator, disableOverride) {
- if (disableYoutubeMusic && !disableOverride) return
- if (!targets.some(rx => rx.test(url.href))) return
-
- let instancesList = getInstanceList()
-
- if (instancesList.length === 0) return
- const randomInstance = utils.getRandomInstance(instancesList)
- return getUrl(randomInstance, url)
-}
-
-function switchInstance(url, disableOverride) {
- return new Promise(async resolve => {
- await init()
- if (disableYoutubeMusic && !disableOverride) {
- resolve()
- return
- }
- const protocolHost = utils.protocolHost(url)
- if (!all().includes(protocolHost)) {
- resolve()
- return
- }
-
- let instancesList = getInstanceList()
-
- const i = instancesList.indexOf(protocolHost)
- if (i > -1) instancesList.splice(i, 1)
- if (instancesList.length === 0) {
- resolve()
- return
- }
-
- const randomInstance = utils.getRandomInstance(instancesList)
- return getUrl(randomInstance, url)
- })
-}
-
-function initDefaults() {
- return new Promise(resolve => {
- fetch("/instances/data.json")
- .then(response => response.text())
- .then(async data => {
- let dataJson = JSON.parse(data)
- for (let i = 0; i < frontends.length; i++) {
- redirects[frontends[i]] = dataJson[frontends[i]]
- }
- browser.storage.local.get(["cloudflareBlackList", "offlineBlackList"], async r => {
- beatbumpNormalRedirectsChecks = [...redirects.beatbump.normal]
- hyperpipeNormalRedirectsChecks = [...redirects.hyperpipe.normal]
- for (const instance of [...r.cloudflareBlackList, ...r.offlineBlackList]) {
- const a = beatbumpNormalRedirectsChecks.indexOf(instance)
- if (a > -1) beatbumpNormalRedirectsChecks.splice(a, 1)
-
- const b = hyperpipeNormalRedirectsChecks.indexOf(instance)
- if (b > -1) hyperpipeNormalRedirectsChecks.splice(b, 1)
- }
- browser.storage.local.set(
- {
- disableYoutubeMusic: false,
- youtubeMusicFrontend: "hyperpipe",
- youtubeMusicRedirects: redirects,
-
- beatbumpNormalRedirectsChecks,
- beatbumpNormalCustomRedirects: [],
-
- beatbumpTorRedirectsChecks: [...redirects.beatbump.tor],
- beatbumpTorCustomRedirects: [],
-
- beatbumpI2pRedirectsChecks: [...redirects.beatbump.i2p],
- beatbumpI2pCustomRedirects: [],
-
- beatbumpLokiRedirectsChecks: [...redirects.beatbump.loki],
- beatbumpLokiCustomRedirects: [],
-
- hyperpipeNormalRedirectsChecks,
- hyperpipeNormalCustomRedirects: [],
-
- hyperpipeTorRedirectsChecks: [...redirects.hyperpipe.tor],
- hyperpipeTorCustomRedirects: [],
-
- hyperpipeI2pRedirectsChecks: [...redirects.hyperpipe.i2p],
- hyperpipeI2pCustomRedirects: [],
-
- hyperpipeLokiRedirectsChecks: [...redirects.hyperpipe.loki],
- hyperpipeLokiCustomRedirects: [],
- },
- () => resolve()
- )
- })
- })
- })
-}
-
-export default {
- setRedirects,
- switchInstance,
- redirect,
- initDefaults,
-}
diff --git a/src/config/config.json b/src/config/config.json
new file mode 100644
index 00000000..09c95bbb
--- /dev/null
+++ b/src/config/config.json
@@ -0,0 +1,553 @@
+{
+ "networks": {
+ "clearnet": {
+ "tld": "org",
+ "name": "Clearnet"
+ },
+ "tor": {
+ "tld": "onion",
+ "name": "Tor"
+ },
+ "i2p": {
+ "tld": "i2p",
+ "name": "I2P"
+ },
+ "loki": {
+ "tld": "loki",
+ "name": "Lokinet"
+ }
+ },
+ "services": {
+ "youtube": {
+ "frontends": {
+ "invidious": {
+ "preferences": {
+ "cookies": ["PREFS"],
+ "localstorage": ["dark_mode"]
+ },
+ "name": "Invidious",
+ "embeddable": true,
+ "instanceList": true
+ },
+ "piped": {
+ "preferences": {
+ "localstorage": [
+ "bufferGoal",
+ "comments",
+ "disableLBRY",
+ "enabledCodecs",
+ "hl",
+ "homepage",
+ "instance",
+ "listen",
+ "minimizeDescription",
+ "playerAutoPlay",
+ "proxyLBRY",
+ "quality",
+ "region",
+ "selectedSkip",
+ "sponsorblock",
+ "theme",
+ "volume",
+ "watchHistory",
+ "localSubscriptions"
+ ]
+ },
+ "name": "Piped",
+ "embeddable": true,
+ "instanceList": true
+ },
+ "pipedMaterial": {
+ "preferences": {
+ "localstorage": ["PREFERENCES"]
+ },
+ "name": "Piped-Material",
+ "embeddable": false,
+ "instanceList": true
+ },
+ "cloudtube": {
+ "preferences": {
+ "token": "token",
+ "fetchEndpoint": "/api/settings",
+ "setEndpoint": "/settings"
+ },
+ "name": "CloudTube",
+ "embeddable": false,
+ "instanceList": true
+ },
+ "freetube": {
+ "name": "FreeTube",
+ "embeddable": false,
+ "instanceList": false
+ },
+ "yattee": {
+ "name": "Yattee",
+ "embeddable": false,
+ "instanceList": false
+ }
+ },
+ "targets": [
+ "^https?:\\/{2}(?:www\\.|m\\.|)youtube.com(?!iframe_api\\/.*)",
+ "^https?:\\/{2}img\\.youtube.com\\/vi\\/.*\\/..*",
+ "^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\\/..*"
+ ],
+ "name": "Youtube",
+ "options": {
+ "enabled": true,
+ "redirectType": "both",
+ "frontend": "invidious",
+ "embedFrontend": "invidious"
+ },
+ "imageType": "png",
+ "embeddable": true,
+ "url": "https://youtube.com"
+ },
+ "youtubeMusic": {
+ "frontends": {
+ "beatbump": {
+ "preferences": {
+ "localstorage": ["settings"],
+ "indexeddb": "beatbump"
+ },
+ "name": "Beatbump",
+ "instanceList": true
+ },
+ "hyperpipe": {
+ "preferences": {
+ "localstorage": ["api", "authapi", "codec", "locale", "next", "pipedapi", "quality", "theme", "vol"],
+ "indexeddb": "hyperpipedb"
+ },
+ "name": "HyperPipe",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}music\\.youtube\\.com(\\/.*|$)"],
+ "name": "YT Music",
+ "options": {
+ "enabled": true,
+ "frontend": "beatbump"
+ },
+ "imageType": "png",
+ "embeddable": false,
+ "url": "https://music.youtube.com"
+ },
+ "twitter": {
+ "frontends": {
+ "nitter": {
+ "preferences": {
+ "cookies": [
+ "theme",
+ "infiniteScroll",
+ "stickyProfile",
+ "bidiSupport",
+ "hideTweetStats",
+ "hideBanner",
+ "hidePins",
+ "hideReplies",
+ "squareAvatars",
+ "mp4Playback",
+ "hlsPlayback",
+ "proxyVideos",
+ "muteVideos",
+ "autoplayGifs",
+ "replaceInstagram",
+ "replaceReddit",
+ "replaceTwitter",
+ "replaceYouTube"
+ ]
+ },
+ "name": "Nitter",
+ "embeddable": true,
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}(www\\.|mobile\\.|)twitter\\.com", "^https?:\\/{2}(pbs\\.|video\\.|)twimg\\.com", "^https?:\\/{2}platform\\.twitter\\.com/embed", "^https?:\\/{2}t\\.co"],
+ "name": "Twitter",
+ "options": {
+ "enabled": true,
+ "redirectType": "both"
+ },
+ "imageType": "png",
+ "embeddable": true,
+ "url": "https://twitter.com"
+ },
+ "instagram": {
+ "frontends": {
+ "bibliogram": {
+ "preferences": {
+ "token": "token",
+ "fetchEndpoint": "/settings.json",
+ "setEndpoint": "/applysettings"
+ },
+ "name": "Bibliogram",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}(www\\.)?instagram\\.com\\/p\\/"],
+ "name": "Instagram",
+ "options": { "enabled": true },
+ "imageType": "png",
+ "embeddable": false,
+ "url": "https://instagram.com"
+ },
+ "tiktok": {
+ "frontends": {
+ "proxiTok": {
+ "preferences": {
+ "cookies": ["api-test_endpoints", "theme"]
+ },
+ "name": "ProxiTok",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}(www\\.|)tiktok\\.com.*"],
+ "name": "TikTok",
+ "options": { "enabled": true },
+ "imageType": "png",
+ "embeddable": false,
+ "url": "https://tiktok.com"
+ },
+ "reddit": {
+ "frontends": {
+ "libreddit": {
+ "preferences": {
+ "cookies": ["theme", "front_page", "layout", "wide", "post_sort", "comment_sort", "show_nsfw", "autoplay_videos", "use_hls", "hide_hls_notification", "subscriptions", "filters"]
+ },
+ "name": "Libreddit",
+ "instanceList": true
+ },
+ "teddit": {
+ "preferences": {
+ "cookies": [
+ "collapse_child_comments",
+ "domain_instagram",
+ "domain_twitter",
+ "domain_youtube",
+ "flairs",
+ "highlight_controversial",
+ "nsfw_enabled",
+ "post_media_max_height",
+ "show_upvoted_percentage",
+ "show_upvotes",
+ "theme",
+ "videos_muted"
+ ]
+ },
+ "name": "Teddit",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}(www\\.|old\\.|np\\.|new\\.|amp\\.|)reddit\\.com", "^https?:\\/{2}(i\\.|preview\\.)redd\\.it"],
+ "name": "Reddit",
+ "options": {
+ "enabled": true,
+ "frontend": "libreddit"
+ },
+ "imageType": "png",
+ "embeddable": false,
+ "url": "https://reddit.com"
+ },
+ "imgur": {
+ "frontends": {
+ "rimgo": {
+ "name": "rimgo",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}([im]\\.)?imgur\\.(com|io)(\\/|$)"],
+ "name": "Imgur",
+ "options": { "enabled": true },
+ "imageType": "png",
+ "embeddable": false,
+ "url": "https://imgur.com"
+ },
+ "wikipedia": {
+ "frontends": {
+ "wikiless": {
+ "preferences": {
+ "cookies": ["theme", "default_lang"]
+ },
+ "name": "Wikiless",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}(?:[a-z]+\\.)*wikipedia\\.org"],
+ "name": "Wikipedia",
+ "options": { "enabled": false },
+ "imageType": "svg",
+ "embeddable": false,
+ "url": "https://wikipedia.org"
+ },
+ "medium": {
+ "frontends": {
+ "scribe": {
+ "name": "Scribe",
+ "instanceList": true
+ }
+ },
+ "targets": [
+ "(?:.*\\.)*(?<!(link\\.|cdn\\-images\\-\\d+\\.))medium\\.com(\\/.*)?$",
+ "^towardsdatascience\\.com",
+ "^uxdesign\\.cc",
+ "^uxplanet\\.org",
+ "^betterprogramming\\.pub",
+ "^aninjusticemag\\.com",
+ "^betterhumans\\.pub",
+ "^psiloveyou\\.xyz",
+ "^entrepreneurshandbook\\.co",
+ "^blog\\.coinbase\\.com",
+ "^levelup\\.gitconnected\\.com",
+ "^javascript\\.plainenglish\\.io",
+ "^blog\\.bitsrc\\.io",
+ "^itnext\\.io",
+ "^codeburst\\.io",
+ "^infosecwriteups\\.com",
+ "^blog\\.devgenius\\.io",
+ "^writingcooperative\\.com"
+ ],
+ "name": "Medium",
+ "options": { "enabled": true },
+ "imageType": "svgMono",
+ "embeddable": false,
+ "url": "https://medium.com"
+ },
+ "quora": {
+ "frontends": {
+ "quetre": {
+ "preferences": {
+ "localstorage": ["theme"]
+ },
+ "name": "Quetre",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}([a-z]+\\.)*quora\\.com.*"],
+ "name": "Quora",
+ "options": { "enabled": true },
+ "imageType": "png",
+ "embeddable": false,
+ "url": "https://quora.com"
+ },
+ "imdb": {
+ "frontends": {
+ "libremdb": {
+ "preferences": {
+ "localstorage": ["theme"]
+ },
+ "name": "libremdb",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}(?:www\\.|)imdb\\.com.*"],
+ "name": "IMDb",
+ "options": { "enabled": false },
+ "imageType": "svg",
+ "embeddable": false,
+ "url": "https://imdb.com"
+ },
+ "reuters": {
+ "frontends": {
+ "neuters": {
+ "name": "Neuters",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}(www\\.|)reuters\\.com.*"],
+ "name": "Reuters",
+ "options": { "enabled": false },
+ "imageType": "svg",
+ "embeddable": false,
+ "url": "https://reuters.com"
+ },
+ "peertube": {
+ "frontends": {
+ "simpleertube": {
+ "name": "SimpleerTube",
+ "instanceList": true
+ }
+ },
+ "targets": "datajson",
+ "name": "PeerTube",
+ "options": { "enabled": false },
+ "imageType": "svg",
+ "embeddable": false,
+ "url": "https://search.joinpeertube.org"
+ },
+ "lbry": {
+ "frontends": {
+ "librarian": {
+ "preferences": {
+ "cookies": ["nsfw", "theme"],
+ "localstorage": ["autoplay", "autoplayNextVid", "collapseComments", "plyr", "sb_categories", "showRelated"]
+ },
+ "name": "Librarian",
+ "embeddable": true,
+ "instanceList": true
+ },
+ "lbryDesktop": {
+ "name": "LBRY Desktop",
+ "embeddable": false,
+ "instanceList": false
+ }
+ },
+ "targets": ["^https?:\\/{2}odysee\\.com", "^https?:\\/{2}lbry\\.tv"],
+ "name": "LBRY",
+ "options": {
+ "enabled": false,
+ "frontend": "librarian",
+ "redirectType": "both",
+ "embedFrontend": "librarian"
+ },
+ "imageType": "png",
+ "embeddable": true,
+ "url": "https://odysee.com"
+ },
+ "search": {
+ "frontends": {
+ "searx": {
+ "preferences": {
+ "cookies": [
+ "advanced_search",
+ "autocomplete",
+ "categories",
+ "disabled_engines",
+ "disabled_plugins",
+ "doi_resolver",
+ "enabled_engines",
+ "enabled_plugins",
+ "image_proxy",
+ "language",
+ "locale",
+ "method",
+ "oscar-style",
+ "results_on_new_tab",
+ "safesearch",
+ "theme",
+ "tokens"
+ ]
+ },
+ "name": "SearX",
+ "instanceList": true
+ },
+ "searxng": {
+ "preferences": {
+ "cookies": [
+ "autocomplete",
+ "categories",
+ "disabled_engines",
+ "disabled_plugins",
+ "doi_resolver",
+ "enabled_plugins",
+ "enabled_engines",
+ "image_proxy",
+ "infinite_scroll",
+ "language",
+ "locale",
+ "maintab",
+ "method",
+ "query_in_title",
+ "results_on_new_tab",
+ "safesearch",
+ "simple_style",
+ "theme",
+ "tokens"
+ ]
+ },
+ "name": "SearXNG",
+ "instanceList": true
+ },
+ "whoogle": {
+ "name": "Whoogle",
+ "instanceList": true
+ },
+ "librex": {
+ "preferences": {
+ "cookies": ["bibliogram", "disable_frontends", " disable_special", "invidious", "libreddit", "nitter", "proxitok", "save", "theme", "wikiless"]
+ },
+ "name": "LibreX",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}search\\.libredirect\\.invalid"],
+ "name": "Search",
+ "options": {
+ "enabled": true,
+ "frontend": "searxng"
+ },
+ "imageType": "svgMono",
+ "embeddable": false,
+ "url": "https://search.libredirect.invalid"
+ },
+ "translate": {
+ "frontends": {
+ "simplyTranslate": {
+ "preferences": {
+ "cookies": ["from_lang", "to_lang", "tts_enabled", "use_text_fields"]
+ },
+ "name": "SimplyTranslate",
+ "instanceList": true
+ },
+ "lingva": {
+ "preferences": {
+ "localstorage": ["isauto", "source", "target", "chakra-ui-color-mode"]
+ },
+ "name": "Lingva Translate",
+ "instanceList": true
+ }
+ },
+ "targets": ["^https?:\\/{2}translate\\.google(\\.[a-z]{2,3}){1,2}\\/", "^https?:\\/{2}translate\\.libredirect\\.invalid"],
+ "name": "Translate",
+ "options": {
+ "enabled": true,
+ "frontend": "simplyTranslate"
+ },
+ "imageType": "svgMono",
+ "embeddable": false,
+ "url": "https://translate.libredirect.invalid"
+ },
+ "maps": {
+ "frontends": {
+ "facil": {
+ "name": "FacilMap",
+ "instanceList": true
+ },
+ "osm": {
+ "name": "OpenStreetMap",
+ "instanceList": false,
+ "singleInstance": "https://www.openstreetmap.org"
+ }
+ },
+ "targets": ["^https?:\\/{2}maps\\.libredirect\\.invalid", "^https?:\\/{2}(((www|maps)\\.)?(google\\.).*(\\/maps)|maps\\.(google\\.).*)"],
+ "name": "Maps",
+ "options": {
+ "enabled": true,
+ "frontend": "osm"
+ },
+ "imageType": "svgMono",
+ "embeddable": false,
+ "url": "https://maps.libredirect.invalid"
+ },
+ "sendFiles": {
+ "frontends": {
+ "send": {
+ "name": "Send",
+ "instanceList": "true"
+ }
+ },
+ "targets": ["^https?:\\/{2}send\\.libredirect\\.invalid", "^https?:\\/{2}send\\.firefox\\.com\\/?$", "^https?:\\/{2}sendfiles\\.online\\/?$"],
+ "name": "Send Files",
+ "options": { "enabled": true },
+ "imageType": "svgMono",
+ "embeddable": false,
+ "url": "https://send.libredirect.invalid"
+ }
+ },
+ "blacklist": {
+ "cloudflare": { "color": "red" },
+ "authenticate": { "color": "orange" },
+ "offline": { "color": "grey" }
+ }
+}
diff --git a/src/instances/beatbump.json b/src/instances/beatbump.json
index e09273dd..c5c78123 100644
--- a/src/instances/beatbump.json
+++ b/src/instances/beatbump.json
@@ -1,6 +1,6 @@
{
- "normal": ["https://beatbump.ml", "https://beatbump.esmailelbob.xyz"],
- "tor": ["http://beatbump.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd.onion"],
+ "clearnet": ["https://beatbump.ml", "https://beatbump.esmailelbob.xyz"],
+ "tor": ["http://beatbump.lqs5fjmajyp7rvp4qvyubwofzi6d4imua7vs237rkc4m5qogitqwrgyd.onion"],
"i2p": [],
"loki": []
}
diff --git a/src/instances/bibliogram.json b/src/instances/bibliogram.json
index d72f2129..b08aa7a0 100644
--- a/src/instances/bibliogram.json
+++ b/src/instances/bibliogram.json
@@ -1,5 +1,5 @@
{
- "normal": ["https://bibliogram.1d4.us", "https://bibliogram.froth.zone", "https://ig.tokhmi.xyz", "https://ig.beparanoid.de", "https://bibliogram.priv.pw"],
+ "clearnet": ["https://bibliogram.1d4.us", "https://bibliogram.froth.zone", "https://ig.tokhmi.xyz", "https://ig.beparanoid.de", "https://bibliogram.priv.pw"],
"tor": [],
"i2p": [],
"loki": []
diff --git a/src/instances/blacklist.json b/src/instances/blacklist.json
index cbbb3b24..edce1958 100644
--- a/src/instances/blacklist.json
+++ b/src/instances/blacklist.json
@@ -5,14 +5,12 @@
"https://piped.kavin.rocks",
"https://piped.tokhmi.xyz",
"https://piped.moomoo.me",
- "https://piped.syncpundit.com",
"https://piped.mha.fi",
"https://de-piped.shimul.me",
"https://pipedus.palash.dev",
"https://watch.whatever.social",
"https://piped.garudalinux.org",
"https://y.rivo.lol",
- "https://cringe.whatever.social",
"https://nitter.domain.glass",
"https://birdsite.xanny.family",
"https://notabird.site",
@@ -33,15 +31,15 @@
"https://libreddit.domain.glass",
"https://r.nf",
"https://libreddit.hu",
+ "https://lr.stilic.ml",
"https://reddi.tk",
"https://r.walkx.org",
+ "https://libreddit.yonalee.eu",
"https://libreddit.winscloud.net",
"https://r.ahwx.org",
"https://reddit.dr460nf1r3.org",
"https://libreddit.encrypted-data.xyz",
"https://libreddit.eu.org",
- "https://libreddit.cachyos.org",
- "https://futureddit.gq",
"https://teddit.domain.glass",
"https://teddit.httpjames.space",
"https://teddit.encrypted-data.xyz",
@@ -70,17 +68,16 @@
],
"offline": [
"https://invidious.rhyshl.live",
- "https://invidious.esmailelbob.xyz",
- "https://cringe.whatever.social",
"https://proxitok.odyssey346.dev",
"https://nhanh.cloud",
"https://nitter.winscloud.net",
"https://ntr.odyssey346.dev",
+ "https://libreddit.yonalee.eu",
"https://libreddit.winscloud.net",
+ "https://libreddit.notyourcomputer.net",
"https://teddit.ggc-project.de",
"https://teddit.tokhmi.xyz",
"https://quetre.odyssey346.dev",
- "https://translate.northboot.xyz",
"https://st.odyssey346.dev",
"https://jsearch.pw",
"https://searx.gnu.style",
@@ -93,8 +90,6 @@
"https://whoogle.esmailelbob.xyz",
"https://search.wef.lol",
"https://i.bcow.xyz",
- "https://i.actionsack.com",
- "https://rimgo.mha.fi",
"https://lbry.bcow.xyz",
"https://beatbump.ml"
]
diff --git a/src/instances/cloudtube.json b/src/instances/cloudtube.json
index 2c55b083..8742d09c 100644
--- a/src/instances/cloudtube.json
+++ b/src/instances/cloudtube.json
@@ -1,5 +1,5 @@
{
- "normal": ["https://tube.cadence.moe"],
+ "clearnet": ["https://tube.cadence.moe"],
"tor": [],
"i2p": [],
"loki": []
diff --git a/src/instances/data.json b/src/instances/data.json
index 3a8e721d..839b155b 100644
--- a/src/instances/data.json
+++ b/src/instances/data.json
@@ -1,15 +1,14 @@
{
"invidious": {
- "normal": [
+ "clearnet": [
"https://yewtu.be",
"https://vid.puffyan.us",
"https://invidious.snopyta.org",
"https://invidious.kavin.rocks",
"https://inv.riverside.rocks",
- "https://invidio.xamh.de",
"https://y.com.sb",
"https://yt.artemislena.eu",
- "https://invidious.sethforprivacy.com",
+ "https://invidious.tiekoetter.com",
"https://invidious.flokinet.to",
"https://inv.bp.projectsegfau.lt",
"https://inv.vern.cc",
@@ -20,31 +19,31 @@
"https://invidious.slipfox.xyz",
"https://invidious.esmailelbob.xyz",
"https://youtube.076.ne.jp",
- "https://invidious.tiekoetter.com",
- "https://invidious.namazso.eu"
+ "https://invidious.sethforprivacy.com",
+ "https://invidious.namazso.eu",
+ "https://invidio.xamh.de"
],
"tor": [
- "http://am74vkcrjp2d5v36lcdqgsj2m6x36tbrkhsruoegwfcizzabnfgf5zyd.onion",
- "http://inv.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion",
- "http://invidious.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd.onion",
- "http://euxxcnhsynwmfidvhjf6uzptsmh4dipkmgdmcmxxuo7tunp3ad2jrwyd.onion",
- "http://u2cvlit75owumwpy4dj2hsmvkq7nvrclkpht7xgyye2pyoxhpmclkrad.onion",
- "http://osbivz6guyeahrwp2lnwyjk2xos342h4ocsxyqrlaopqjuhwn2djiiyd.onion",
- "http://grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion",
- "http://kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion",
- "http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion",
"http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion",
- "http://ng27owmagn5amdm7l5s3rsqxwscl5ynppnis5dqcasogkyxcfqn7psid.onion"
+ "http://kbjggqkzv65ivcqj6bumvp337z6264huv5kpkwuv6gu5yjiskvan7fad.onion",
+ "http://grwp24hodrefzvjjuccrkw3mjq4tzhaaq32amf33dzpmuxe7ilepcmad.onion",
+ "http://osbivz6guyeahrwp2lnwyjk2xos342h4ocsxyqrlaopqjuhwn2djiiyd.onion",
+ "http://u2cvlit75owumwpy4dj2hsmvkq7nvrclkpht7xgyye2pyoxhpmclkrad.onion",
+ "http://euxxcnhsynwmfidvhjf6uzptsmh4dipkmgdmcmxxuo7tunp3ad2jrwyd.onion",
+ "http://invidious.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd.onion",
+ "http://inv.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion",
+ "http://am74vkcrjp2d5v36lcdqgsj2m6x36tbrkhsruoegwfcizzabnfgf5zyd.onion",
+ "http://ng27owmagn5amdm7l5s3rsqxwscl5ynppnis5dqcasogkyxcfqn7psid.onion",
+ "http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion"
],
"i2p": [],
"loki": []
},
"piped": {
- "normal": [
+ "clearnet": [
"https://piped.kavin.rocks",
"https://piped.tokhmi.xyz",
"https://piped.moomoo.me",
- "https://piped.syncpundit.com",
"https://piped.mha.fi",
"https://de-piped.shimul.me",
"https://pipedus.palash.dev",
@@ -54,9 +53,9 @@
"https://yt.jae.fi",
"https://piped.mint.lgbt",
"https://il.ax",
+ "https://piped.esmailelbob.xyz",
"https://piped.projectsegfau.lt",
"https://piped.privacydev.net",
- "https://piped.palveluntarjoaja.eu",
"https://piped.smnz.de",
"https://piped.adminforge.de",
"https://watch.whatevertinfoil.de",
@@ -67,19 +66,16 @@
"loki": []
},
"pipedMaterial": {
- "normal": [
- "https://piped-material.১.net",
- "https://piped-material.ftp.sh",
- "https://piped-staging.ftp.sh",
- "https://ui.piped.১.net",
- "https://ng.piped.১.net"
+ "clearnet": [
+ "https://piped-material.xn--17b.net",
+ "https://piped-material.ftp.sh"
],
"tor": [],
"i2p": [],
"loki": []
},
"cloudtube": {
- "normal": [
+ "clearnet": [
"https://tube.cadence.moe"
],
"tor": [],
@@ -87,12 +83,11 @@
"loki": []
},
"proxiTok": {
- "normal": [
+ "clearnet": [
"https://proxitok.pabloferreiro.es",
"https://proxitok.pussthecat.org",
"https://tok.habedieeh.re",
"https://proxitok.esmailelbob.xyz",
- "https://cringe.whatever.social",
"https://proxitok.dhusch.de",
"https://proxitok.privacydev.net",
"https://proxitok.odyssey346.dev",
@@ -100,12 +95,14 @@
"https://tok.adminforge.de",
"https://proxitok.manasiwibi.com"
],
- "tor": [],
+ "tor": [
+ "http://vywqfflneajejuhg7o5iklqvzemu2fcdrb3gtkvnyqsho6qin5svdsad.onion"
+ ],
"i2p": [],
"loki": []
},
"send": {
- "normal": [
+ "clearnet": [
"https://send.vis.ee",
"https://send.zcyph.cc",
"https://send.turingpoint.de",
@@ -129,7 +126,7 @@
"loki": []
},
"nitter": {
- "normal": [
+ "clearnet": [
"https://nitter.net",
"https://nitter.lacontrevoie.fr",
"https://nitter.pussthecat.org",
@@ -237,6 +234,7 @@
"http://wiio4sgs4247brk7hj6qck2jxnvldwfdbguigc5ivpxrsegnliyfvuqd.onion",
"http://qwikxx2erhx6qrymued6ox2qkf2yeogjwypqvzoif4fqkljixasr6oid.onion",
"http://4g47cxugkohbweao2x66nnxxfoe3k7gdfzxej537nhdbwr522sbjxeqd.onion",
+ "http://nt.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion",
"http://tw.lpoaj7z2zkajuhgnlltpeqh3zyq7wk2iyeggqaduhgxhyajtdt2j7wad.onion"
],
"i2p": [
@@ -251,7 +249,7 @@
]
},
"bibliogram": {
- "normal": [
+ "clearnet": [
"https://bibliogram.1d4.us",
"https://bibliogram.froth.zone",
"https://ig.tokhmi.xyz",
@@ -263,61 +261,92 @@
"loki": []
},
"libreddit": {
- "normal": [
+ "clearnet": [
+ "https://libredd.it",
"https://libreddit.spike.codes",
+ "https://libreddit.dothq.co",
"https://libreddit.kavin.rocks",
"https://reddit.invak.id",
+ "https://reddit.phii.me",
"https://lr.riverside.rocks",
"https://libreddit.strongthany.cc",
+ "https://libreddit.database.red",
"https://libreddit.privacy.com.de",
"https://libreddit.domain.glass",
+ "https://libreddit.sugoma.tk",
+ "https://libreddit.jamiethalacker.dev",
+ "https://reddit.artemislena.eu",
"https://r.nf",
+ "https://libreddit.some-things.org",
"https://reddit.stuehieyr.com",
"https://lr.mint.lgbt",
+ "https://libreddit.igna.rocks",
+ "https://libreddit.autarkic.org",
+ "https://libreddit.flux.industries",
"https://libreddit.drivet.xyz",
+ "https://lr.oversold.host",
"https://libreddit.de",
"https://libreddit.pussthecat.org",
+ "https://libreddit.mutahar.rocks",
"https://libreddit.northboot.xyz",
"https://leddit.xyz",
+ "https://de.leddit.xyz",
+ "https://lr.cowfee.moe",
"https://libreddit.hu",
"https://libreddit.totaldarkness.net",
"https://libreddit.esmailelbob.xyz",
"https://lr.vern.cc",
"https://libreddit.nl",
+ "https://lr.stilic.ml",
"https://reddi.tk",
+ "https://libreddit.bus-hit.me",
+ "https://libreddit.datatunnel.xyz",
+ "https://libreddit.crewz.me",
"https://r.walkx.org",
"https://libreddit.kylrth.com",
+ "https://libreddit.yonalee.eu",
"https://libreddit.winscloud.net",
"https://libreddit.tiekoetter.com",
"https://reddit.rtrace.io",
+ "https://libreddit.lunar.icu",
"https://libreddit.privacydev.net",
+ "https://libreddit.notyourcomputer.net",
"https://r.ahwx.org",
"https://bob.fr.to",
+ "https://reddit.beparanoid.de",
"https://libreddit.dcs0.hu",
"https://reddit.dr460nf1r3.org",
"https://rd.jae.su",
+ "https://libreddit.mha.fi",
"https://libreddit.foss.wtf",
"https://libreddit.encrypted-data.xyz",
"https://libreddit.eu.org",
- "https://l.opnxng.com",
- "https://libreddit.cachyos.org",
- "https://rd.funami.tech",
- "https://libreddit.projectsegfau.lt",
- "https://futureddit.gq",
- "https://lr.slipfox.xyz",
- "https://libreddit.oxymagnesium.com"
+ "https://l.opnxng.com"
],
"tor": [
+ "http://spjmllawtheisznfs7uryhxumin26ssv2draj7oope3ok3wuhy43eoyd.onion",
+ "http://fwhhsbrbltmrct5hshrnqlqygqvcgmnek3cnka55zj4y7nuus5muwyyd.onion",
+ "http://kphht2jcflojtqte4b4kyx7p2ahagv4debjj32nre67dxz7y57seqwyd.onion",
+ "http://inytumdgnri7xsqtvpntjevaelxtgbjqkuqhtf6txxhwbll2fwqtakqd.onion",
+ "http://liredejj74h5xjqr2dylnl5howb2bpikfowqoveub55ru27x43357iid.onion",
"http://kzhfp3nvb4qp575vy23ccbrgfocezjtl5dx66uthgrhu7nscu6rcwjyd.onion",
"http://ecue64ybzvn6vjzl37kcsnwt4ycmbsyf74nbttyg7rkc3t3qwnj7mcyd.onion",
- "http://libreddit.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd.onion",
- "http://ojwp2gtj7dq7scd7gnbac6wp53tklgsicteabrnx2pr7zai64wriiaad.onion"
+ "http://ledditqo2mxfvlgobxnlhrkq4dh34jss6evfkdkb2thlvy6dn4f4gpyd.onion",
+ "http://libredoxhxwnmsb6dvzzd35hmgzmawsq5i764es7witwhddvpc2razid.onion",
+ "http://libreddit.2syis2nnyytz6jnusnjurva4swlaizlnleiks5mjp46phuwjbdjqwgqd.onion",
+ "http://ol5begilptoou34emq2sshf3may3hlblvipdjtybbovpb7c7zodxmtqd.onion",
+ "http://lbrdtjaj7567ptdd4rv74lv27qhxfkraabnyphgcvptl64ijx2tijwid.onion",
+ "http://libreddit.lqs5fjmajyp7rvp4qvyubwofzi6d4imua7vs237rkc4m5qogitqwrgyd.onion",
+ "http://reddit.prnoid54e44a4bduq5due64jkk7wcnkxcp5kv3juncm7veptjcqudgyd.onion",
+ "http://inz6tbezfwzexva6dize4cqraj2tjdhygxabmcgysccesvw2pybzhbyd.onion",
+ "http://libreddit.micohauwkjbyw5meacrb4ipicwvwg4xtzl7y7viv53kig2mdcsvwkyyd.onion",
+ "http://lr.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion"
],
"i2p": [],
"loki": []
},
"teddit": {
- "normal": [
+ "clearnet": [
"https://teddit.net",
"https://teddit.ggc-project.de",
"https://teddit.zaggy.nl",
@@ -359,11 +388,16 @@
"http://teddit.lpoaj7z2zkajuhgnlltpeqh3zyq7wk2iyeggqaduhgxhyajtdt2j7wad.onion",
"http://24fympskbrdgbf4afuvhqwwl2tv3y2vwxg5t2ktozd4j5b3fob5ntzyd.onion"
],
- "i2p": [],
+ "i2p": [
+ "http://xugoqcf2pftm76vbznx4xuhrzyb5b6zwpizpnw2hysexjdn5l2tq.b32.i2p",
+ "http://teddit.i2p",
+ "https://codeberg.org/teddit/teddit/src/branch/main/vzeiwzi7ogwl3ijrfek4fbtwhvamxcpyqoc3s4vcgnhlp54s5clq.b32.i2p",
+ "http://verncco2oaxjikammz4pi7umzp673cme6zuemx7yeeewspwrw3va.b32.i2p"
+ ],
"loki": []
},
"wikiless": {
- "normal": [
+ "clearnet": [
"https://wikiless.org",
"https://wikiless.sethforprivacy.com",
"https://wiki.604kph.xyz",
@@ -396,7 +430,7 @@
"loki": []
},
"scribe": {
- "normal": [
+ "clearnet": [
"https://scribe.rip",
"https://scribe.nixnet.services",
"https://scribe.citizen4.eu",
@@ -412,7 +446,7 @@
"loki": []
},
"quetre": {
- "normal": [
+ "clearnet": [
"https://quetre.iket.me",
"https://qr.vern.cc",
"https://quetre.pussthecat.org",
@@ -433,7 +467,7 @@
"loki": []
},
"libremdb": {
- "normal": [
+ "clearnet": [
"https://libremdb.iket.me",
"https://libremdb.pussthecat.org",
"https://libremdbeu.herokuapp.com",
@@ -451,7 +485,7 @@
"loki": []
},
"simplyTranslate": {
- "normal": [
+ "clearnet": [
"https://simplytranslate.org",
"https://st.tokhmi.xyz",
"https://translate.josias.dev",
@@ -486,7 +520,7 @@
]
},
"lingva": {
- "normal": [
+ "clearnet": [
"https://lingva.ml",
"https://translate.igna.ooo",
"https://lingva.pussthecat.org",
@@ -502,21 +536,20 @@
"loki": []
},
"searx": {
- "normal": [
+ "clearnet": [
"https://dynabyte.ca",
+ "https://icanfindit.online",
"https://jsearch.pw",
"https://search.ethibox.fr",
"https://search.snopyta.org",
"https://search.stinpriza.org",
"https://search.trom.tf",
"https://searx.bissisoft.com",
- "https://searx.chocoflan.net",
"https://searx.divided-by-zero.eu",
"https://searx.dresden.network",
"https://searx.fossencdi.org",
"https://searx.gnu.style",
"https://searx.mastodontech.de",
- "https://searx.mistli.net",
"https://searx.mxchange.org",
"https://searx.nakhan.net",
"https://searx.netzspielplatz.de",
@@ -539,19 +572,17 @@
"https://suche.uferwerk.org",
"https://sx.catgirl.cloud",
"https://timdor.noip.me/searx",
+ "https://xo.wtf",
"https://searx.roflcopter.fr"
],
"tor": [
"http://3afisqjw2rxm6z7mmstyt5rx75qfqrgxnkzftknbp2vhipr2nrmrjdyd.onion",
- "http://b2c7fvbhnfvwnl6oh2tydhzfx4i37kmmrycq42heqbbe7wovq3uzenid.onion",
+ "http://w5rl6wsd7mzj4bdkbuqvzidet5osdsm5jhg2f7nvfidakfq5exda5wid.onion",
"http://yra4tke2pwcnatxjkufpw6kvebu3h3ti2jca2lcdpgx3mpwol326lzid.onion",
"http://z5vawdol25vrmorm4yydmohsd4u6rdoj2sylvoi3e3nqvxkvpqul7bqd.onion",
"http://zbuc3bbzbfdqqo2x46repx2ddajbha6fpsjeeptjhhhhzji3zopxdqyd.onion",
"http://f4qfqajszpx5b7itzxt6mb7kj4ktpgbdq7lq6xaiqyqx6a7de3epptad.onion",
- "http://searxfilowxokbogygrigir4wqxfxqzuxofxgdon7dg6rsii4yxzytyd.onion",
- "http://searx.micohauwkjbyw5meacrb4ipicwvwg4xtzl7y7viv53kig2mdcsvwkyyd.onion",
- "http://4tz2vlnwk2apf2rpinkqv6uxvfgo5xjx6vl5vp7lxgaiooumetjpstqd.onion",
- "http://lgmekfnpealdqhnctyg3p5fuelpdwnbqbwnl2ickpdoodzatzgz27ryd.onion"
+ "http://searx.micohauwkjbyw5meacrb4ipicwvwg4xtzl7y7viv53kig2mdcsvwkyyd.onion"
],
"i2p": [
"http://ransack.i2p",
@@ -560,11 +591,10 @@
"loki": []
},
"searxng": {
- "normal": [
+ "clearnet": [
"https://darmarit.org/searx",
"https://de.xcxc.ml",
"https://etsi.me",
- "https://icanfindit.online",
"https://jackgoss.xyz",
"https://metasearch.nl",
"https://northboot.xyz",
@@ -605,6 +635,7 @@
"https://searx.baczek.me",
"https://searx.be",
"https://searx.becomesovran.com",
+ "https://searx.chocoflan.net",
"https://searx.ebnar.xyz",
"https://searx.ericaftereric.top",
"https://searx.esmailelbob.xyz",
@@ -613,6 +644,7 @@
"https://searx.gnous.eu",
"https://searx.kujonello.cf",
"https://searx.mha.fi",
+ "https://searx.mistli.net",
"https://searx.namejeff.xyz",
"https://searx.org",
"https://searx.orion-hub.fr",
@@ -635,28 +667,30 @@
"https://trydex.tk/searxng",
"https://www.gruble.de",
"https://www.webrats.xyz",
- "https://xcxc.ml",
- "https://xo.wtf"
+ "https://xcxc.ml"
],
"tor": [
- "http://w5rl6wsd7mzj4bdkbuqvzidet5osdsm5jhg2f7nvfidakfq5exda5wid.onion",
"http://4n53nafyi77iplnbrpmxnp3x4exbswwxigujaxy3b37fvr7bvlopxeyd.onion",
"http://privateoz3u5utrimal2edr56j3r5caakektxxgixigdkycuxigvquid.onion",
"http://b6sxmon57qza6dt36li7huabie5ntrvjr4q5rc2vvbn4hqvzd4phrvyd.onion",
"http://searxngg6zleq6ceboe5ltkyo4hyrb3aaycrgzmrljv3jjlb5vcytead.onion",
"http://gbat2pbpg7ys3fi3pbp64667tt5x66mg45xok35bxdw7v55brm7a27yd.onion",
+ "http://b2c7fvbhnfvwnl6oh2tydhzfx4i37kmmrycq42heqbbe7wovq3uzenid.onion",
"http://searxdr3pqz4nydgnqocsia2xbywptxbkympa2emn7zlgggrir4bkfad.onion",
"http://searx.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd.onion",
+ "http://searxfilowxokbogygrigir4wqxfxqzuxofxgdon7dg6rsii4yxzytyd.onion",
"http://searx.privpw3tndpkw6pnp3g727zfgfdzbu3k6a7chv226s3xymv2p4eiuqyd.onion",
"http://rq2w52kyrif3xpfihkgjnhqm3a5aqhoikpv72z3drpjglfzc2wr5z4yd.onion",
"http://fub6vgedgeadlu3ctskrpkcqjruh76tckwtj5swfhyblgml2tzgzckqd.onion/searx",
- "http://searx3aolosaf3urwnhpynlhuokqsgz47si4pzz5hvb7uuzyjncl2tid.onion"
+ "http://searx3aolosaf3urwnhpynlhuokqsgz47si4pzz5hvb7uuzyjncl2tid.onion",
+ "http://4tz2vlnwk2apf2rpinkqv6uxvfgo5xjx6vl5vp7lxgaiooumetjpstqd.onion",
+ "https://lgmekfnpealdqhnctyg3p5fuelpdwnbqbwnl2ickpdoodzatzgz27ryd.onion"
],
"i2p": [],
"loki": []
},
"whoogle": {
- "normal": [
+ "clearnet": [
"https://gowogle.voring.me",
"https://s.tokhmi.xyz",
"https://search.albony.xyz",
@@ -676,31 +710,13 @@
"loki": []
},
"librex": {
- "normal": [
- "https://librex.beparanoid.de",
- "https://librex.extravi.dev",
- "https://lx.vern.cc",
- "https://search.davidovski.xyz",
- "https://librex.kitscomputer.tk",
- "https://search.funami.tech",
- "https://librex.catalyst.sx",
- "https://search.madreyk.xyz",
- "https://search.pabloferreiro.es",
- "https://buscar.weblibre.org"
- ],
- "tor": [
- "http://librex.2356uhnbpv5nk3bni5bv6jg2cd6lgj664kwx3lhyelstpttpyv4kk2qd.onion",
- "http://ncblhz7q4sfbf755bdbhebfzxcpypz7ewafgi4agatecojz7pln4i3id.onion",
- "http://lx.vernccvbvyi5qhfzyqengccj7lkove6bjot2xhh5kajhwvidqafczrad.onion"
- ],
- "i2p": [
- "http://rra33hiaf6nmby7jfpqe2gqmng3jnzkvbu2n7jgce7vbhoyuhzya.b32.i2p",
- "http://vernziqfqvweijfaacmwazohgpdo2bt2ib2jlupt2pwwu27bhgxq.b32.i2p"
- ],
+ "clearnet": [],
+ "tor": [],
+ "i2p": [],
"loki": []
},
"rimgo": {
- "normal": [
+ "clearnet": [
"https://i.bcow.xyz",
"https://rimgo.pussthecat.org",
"https://rimgo.totaldarkness.net",
@@ -722,7 +738,7 @@
"loki": []
},
"librarian": {
- "normal": [
+ "clearnet": [
"https://lbry.bcow.xyz",
"https://odysee.076.ne.jp",
"https://librarian.pussthecat.org",
@@ -745,7 +761,7 @@
"loki": []
},
"neuters": {
- "normal": [
+ "clearnet": [
"https://neuters.de"
],
"tor": [],
@@ -753,18 +769,18 @@
"loki": []
},
"beatbump": {
- "normal": [
+ "clearnet": [
"https://beatbump.ml",
"https://beatbump.esmailelbob.xyz"
],
"tor": [
- "http://beatbump.esmail5pdn24shtvieloeedh7ehz3nrwcdivnfhfcedl7gf4kwddhkqd.onion"
+ "http://beatbump.lqs5fjmajyp7rvp4qvyubwofzi6d4imua7vs237rkc4m5qogitqwrgyd.onion"
],
"i2p": [],
"loki": []
},
"hyperpipe": {
- "normal": [
+ "clearnet": [
"https://hyperpipe.surge.sh",
"https://hyperpipe.esmailelbob.xyz",
"https://listen.whatever.social",
@@ -777,7 +793,7 @@
"loki": []
},
"facil": {
- "normal": [
+ "clearnet": [
"https://facilmap.org"
],
"tor": [],
@@ -785,7 +801,7 @@
"loki": []
},
"simpleertube": {
- "normal": [
+ "clearnet": [
"https://tube.simple-web.org",
"https://simpleertube.esmailelbob.xyz",
"https://stube.tokhmi.xyz",
@@ -796,6 +812,7 @@
"loki": []
},
"peertube": [
+ "https://search.joinpeertube.org",
"https://tbh.co-shaoghal.net",
"https://tube.kansanvalta.org",
"https://duanrra.cf",
@@ -973,7 +990,6 @@
"https://vidz.dou.bet",
"https://video.hostpath.de",
"https://free-streams.com",
- "https://tube.pawelko.net",
"https://video.livecchi.cloud",
"https://peertube.gsugambit.com",
"https://pt.nospy.net",
@@ -992,7 +1008,6 @@
"https://yt.x1337x.fr",
"https://videos.rabbit-company.com",
"https://video.paradigmthreat.net",
- "https://video.lincolncyber.com",
"https://vid.twhtv.club",
"https://video.retroedge.tech",
"https://truvitv.com",
diff --git a/src/instances/facil.json b/src/instances/facil.json
index 798a9cfb..6c89eb17 100644
--- a/src/instances/facil.json
+++ b/src/instances/facil.json
@@ -1,5 +1,5 @@
{
- "normal": ["https://facilmap.org"],
+ "clearnet": ["https://facilmap.org"],
"tor": [],
"i2p": [],
"loki": []
diff --git a/src/instances/get_instances.py b/src/instances/get_instances.py
index 36d49122..96902feb 100644
--- a/src/instances/get_instances.py
+++ b/src/instances/get_instances.py
@@ -1,36 +1,57 @@
# Note: Run this script from the root of the repo
+import traceback
+import logging
import requests
import json
from urllib.parse import urlparse
-from bs4 import BeautifulSoup
import re
-from colorama import Fore, Back, Style
-from urllib.parse import urlparse
+from colorama import Fore, Style
import socket
-import subprocess
mightyList = {}
+config = {}
-startRegex = "https?:\/{2}(?:[^\s\/]+\.)+"
+startRegex = r"https?:\/{2}(?:[^\s\/]+\.)+"
endRegex = "(?:\/[^\s\/]+)*\/?"
torRegex = startRegex + "onion" + endRegex
i2pRegex = startRegex + "i2p" + endRegex
lokiRegex = startRegex + "loki" + endRegex
-authRegex = "https?:\/{2}\S+:\S+@(?:[^\s\/]+\.)+[a-zA-Z0-9]+" + endRegex
+authRegex = r"https?:\/{2}\S+:\S+@(?:[^\s\/]+\.)+[a-zA-Z0-9]+" + endRegex
+
+with open('./src/config/config.json', 'rt') as tmp:
+ config['networks'] = json.load(tmp)['networks']
+
def filterLastSlash(urlList):
tmp = {}
- for x in urlList:
- tmp[x] = {}
- for y in urlList[x]:
- tmp[x][y] = []
- for z in urlList[x][y]:
- if z.endswith('/'):
- tmp[x][y].append(z[:-1])
- print(Fore.YELLOW + "Fixed " + Style.RESET_ALL + z)
+ for frontend in urlList:
+ tmp[frontend] = {}
+ for network in urlList[frontend]:
+ tmp[frontend][network] = []
+ for url in urlList[frontend][network]:
+ if url.endswith('/'):
+ tmp[frontend][network].append(url[:-1])
+ print(Fore.YELLOW + "Fixed " + Style.RESET_ALL + url)
else:
- tmp[x][y].append(z)
+ tmp[frontend][network].append(url)
+ return tmp
+
+
+def idnaEncode(urlList):
+ tmp = {}
+ for frontend in urlList:
+ tmp[frontend] = {}
+ for network in urlList[frontend]:
+ tmp[frontend][network] = []
+ for url in urlList[frontend][network]:
+ try:
+ encodedUrl = url.encode("idna").decode("utf8")
+ tmp[frontend][network].append(encodedUrl)
+ if (encodedUrl != url):
+ print(Fore.YELLOW + "Fixed " + Style.RESET_ALL + url)
+ except Exception:
+ tmp[frontend][network].append(url)
return tmp
@@ -58,7 +79,7 @@ def is_cloudflare(url):
instance_ip = socket.gethostbyname(urlparse(url).hostname)
if instance_ip is None:
return False
- except:
+ except Exception:
return False
instance_bin = ip2bin(instance_ip)
@@ -85,10 +106,11 @@ def is_authenticate(url):
if 'www-authenticate' in r.headers:
print(url + ' requires ' + Fore.RED + 'authentication' + Style.RESET_ALL)
return True
- except:
+ except Exception:
return False
return False
+
def is_offline(url):
try:
r = requests.get(url, timeout=5)
@@ -99,303 +121,227 @@ def is_offline(url):
return True
else:
return False
- except:
+ except Exception:
return False
+def fetchCache(frontend, name):
+ with open('./src/instances/data.json') as file:
+ mightyList[frontend] = json.load(file)[frontend]
+ print(Fore.YELLOW + 'Failed' + Style.RESET_ALL + ' to fetch ' + name)
+
+
+def fetchFromFile(frontend, name):
+ with open('./src/instances/' + frontend + '.json') as file:
+ mightyList[frontend] = json.load(file)
+ print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
+
+
+def fetchJsonList(frontend, name, url, urlItem, jsonObject):
+ try:
+ r = requests.get(url)
+ rJson = json.loads(r.text)
+ _list = {}
+ for network in config['networks']:
+ _list[network] = []
+ if type(urlItem) == dict:
+ for item in rJson:
+ for network in config['networks']:
+ if urlItem[network] is not None:
+ if urlItem[network] in item:
+ if item[urlItem[network]].strip() != '':
+ _list[network].append(item[urlItem[network]])
+ else:
+ if jsonObject:
+ rJson = rJson['instances']
+ for item in rJson:
+ tmpItem = item
+ if urlItem is not None:
+ tmpItem = item[urlItem]
+ if tmpItem.strip() == '':
+ continue
+ elif re.search(torRegex, tmpItem):
+ _list['tor'].append(tmpItem)
+ elif re.search(i2pRegex, tmpItem):
+ _list['i2p'].append(tmpItem)
+ elif re.search(lokiRegex, tmpItem):
+ _list['loki'].append(tmpItem)
+ else:
+ _list['clearnet'].append(tmpItem)
+
+ mightyList[frontend] = _list
+ print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
+ except Exception:
+ fetchCache(frontend, name)
+ logging.error(traceback.format_exc())
+
+
+def fetchRegexList(frontend, name, url, regex):
+ try:
+ r = requests.get(url)
+ _list = {}
+ for network in config['networks']:
+ _list[network] = []
+
+ tmp = re.findall(regex, r.text)
+
+ for item in tmp:
+ if item.strip() == "":
+ continue
+ elif re.search(torRegex, item):
+ _list['tor'].append(item)
+ elif re.search(i2pRegex, item):
+ _list['i2p'].append(item)
+ elif re.search(lokiRegex, item):
+ _list['loki'].append(item)
+ else:
+ _list['clearnet'].append(item)
+ mightyList[frontend] = _list
+ print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
+ except Exception:
+ fetchCache(frontend, name)
+ logging.error(traceback.format_exc())
+
+
+def fetchTextList(frontend, name, url, prepend):
+ try:
+ r = requests.get(url)
+ tmp = r.text.strip().split('\n')
+
+ _list = {}
+ for network in config['networks']:
+ _list[network] = []
+
+ for item in tmp:
+ item = prepend + item
+ if re.search(torRegex, item):
+ _list['tor'].append(item)
+ elif re.search(i2pRegex, item):
+ _list['i2p'].append(item)
+ elif re.search(lokiRegex, item):
+ _list['loki'].append(item)
+ else:
+ _list['clearnet'].append(item)
+ mightyList[frontend] = _list
+ print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
+ except Exception:
+ fetchCache(frontend, name)
+ logging.error(traceback.format_exc())
+
+
def invidious():
- r = requests.get('https://api.invidious.io/instances.json')
- rJson = json.loads(r.text)
- invidiousList = {}
- invidiousList['normal'] = []
- invidiousList['tor'] = []
- invidiousList['i2p'] = []
- invidiousList['loki'] = []
- for instance in rJson:
- if instance[1]['type'] == 'https':
- invidiousList['normal'].append(instance[1]['uri'])
- elif instance[1]['type'] == 'onion':
- invidiousList['tor'].append(instance[1]['uri'])
- mightyList['invidious'] = invidiousList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Invidious')
+ name = 'Invidious'
+ frontend = 'invidious'
+ url = 'https://api.invidious.io/instances.json'
+ try:
+ _list = {}
+ _list['clearnet'] = []
+ _list['tor'] = []
+ _list['i2p'] = []
+ _list['loki'] = []
+ r = requests.get(url)
+ rJson = json.loads(r.text)
+ for instance in rJson:
+ if instance[1]['type'] == 'https':
+ _list['clearnet'].append(instance[1]['uri'])
+ elif instance[1]['type'] == 'onion':
+ _list['tor'].append(instance[1]['uri'])
+ mightyList[frontend] = _list
+ print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
+ except Exception:
+ fetchCache(frontend, name)
+ logging.error(traceback.format_exc())
def piped():
- r = requests.get(
- 'https://raw.githubusercontent.com/wiki/TeamPiped/Piped/Instances.md')
+ frontend = 'piped'
+ name = 'Piped'
+ try:
+ _list = {}
+ _list['clearnet'] = []
+ _list['tor'] = []
+ _list['i2p'] = []
+ _list['loki'] = []
+ r = requests.get(
+ 'https://raw.githubusercontent.com/wiki/TeamPiped/Piped/Instances.md')
- tmp = re.findall(
- '(?:[^\s\/]+\.)+[a-zA-Z]+ (?:\(Official\) )?\| (https:\/{2}(?:[^\s\/]+\.)+[a-zA-Z]+) \| ', r.text)
- _list = {}
- _list['normal'] = []
- _list['tor'] = []
- _list['i2p'] = []
- _list['loki'] = []
- for item in tmp:
- try:
- url = requests.get(item, timeout=5).url
- if url.strip("/") == item:
+ tmp = re.findall(
+ r'(?:[^\s\/]+\.)+[a-zA-Z]+ (?:\(Official\) )?\| (https:\/{2}(?:[^\s\/]+\.)+[a-zA-Z]+) \| ', r.text)
+ for item in tmp:
+ try:
+ url = requests.get(item, timeout=5).url
+ if url.strip("/") == item:
+ continue
+ else:
+ _list['clearnet'].append(url)
+ except Exception:
+ logging.error(traceback.format_exc())
continue
- else:
- _list['normal'].append(url)
- except:
- continue
- mightyList['piped'] = _list
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Piped')
+ mightyList[frontend] = _list
+ print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + name)
+ except Exception:
+ fetchCache(frontend, name)
+ logging.error(traceback.format_exc())
def pipedMaterial():
- r = requests.get(
- 'https://raw.githubusercontent.com/mmjee/Piped-Material/master/README.md')
-
- tmp = re.findall(
- r"\| (https?:\/{2}(?:\S+\.)+[a-zA-Z0-9]*) +\|", r.text)
- pipedMaterialList = {}
- pipedMaterialList['normal'] = []
- pipedMaterialList['tor'] = []
- pipedMaterialList['i2p'] = []
- pipedMaterialList['loki'] = []
- for item in tmp:
- pipedMaterialList['normal'].append(item)
- mightyList['pipedMaterial'] = pipedMaterialList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'pipedMaterial')
+ fetchRegexList('pipedMaterial', 'Piped-Material', 'https://raw.githubusercontent.com/mmjee/Piped-Material/master/README.md', r"\| (https?:\/{2}(?:\S+\.)+[a-zA-Z0-9]*) +\| Production")
def cloudtube():
- json_object = json.dumps(mightyList, ensure_ascii=False, indent=2)
- with open('./src/instances/cloudtube.json') as file:
- mightyList['cloudtube'] = json.load(file)
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'CloudTube')
+ fetchFromFile('cloudtube', 'Cloudtube')
def proxitok():
- r = requests.get(
- 'https://raw.githubusercontent.com/wiki/pablouser1/ProxiTok/Public-instances.md')
-
- tmp = re.findall(
- r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|", r.text)
- proxiTokList = {}
- proxiTokList['normal'] = []
- proxiTokList['tor'] = []
- proxiTokList['i2p'] = []
- proxiTokList['loki'] = []
- for item in tmp:
- proxiTokList['normal'].append(re.sub(r'/$', '', item))
- mightyList['proxiTok'] = proxiTokList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'ProxiTok')
+ fetchRegexList('proxiTok', 'ProxiTok', 'https://raw.githubusercontent.com/wiki/pablouser1/ProxiTok/Public-instances.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)(?: \(Official\))? +\|(?:(?: [A-Z]*.*\|.*\|)|(?:$))")
def send():
- r = requests.get(
- 'https://gitlab.com/timvisee/send-instances/-/raw/master/README.md')
- tmp = re.findall(
- r"- ([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}", r.text)
- sendList = {}
- sendList['normal'] = []
- sendList['tor'] = []
- sendList['i2p'] = []
- sendList['loki'] = []
- for item in tmp:
- sendList['normal'].append(item)
- mightyList['send'] = sendList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Send')
+ fetchRegexList('send', 'Send', 'https://gitlab.com/timvisee/send-instances/-/raw/master/README.md', r"- ([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}")
def nitter():
- r = requests.get('https://raw.githubusercontent.com/wiki/zedeus/nitter/Instances.md')
- tmp = re.findall(
- r"(?:(?:\| \[(?:\S+\.)+[a-zA-Z]+\]\((https?:\/{2}(?:\S+\.)+[a-zA-Z]+)\/?\) (?:\((?:\S+ ?\S*)\) )? *\| [^❌]{1,3} +\|(?:(?:\n)|(?: (?:❌)|(?: ✅)|(?: ❓)|(?: \[))))|(?:- \[(?:\S+\.)+(?:(?:i2p)|(?:loki))\]\((https?:\/{2}(?:\S+\.)(?:(?:i2p)|(?:loki)))\/?\)))", r.text)
-
- nitterList = {}
- nitterList['normal'] = []
- nitterList['tor'] = []
- nitterList['i2p'] = []
- nitterList['loki'] = []
- for item in tmp:
- for i in item:
- if i == '':
- continue
- else:
- item = i
- if re.search(torRegex, item):
- nitterList['tor'].append(item)
- elif re.search(i2pRegex, item):
- nitterList['i2p'].append(item)
- elif re.search(lokiRegex, item):
- nitterList['loki'].append(item)
- else:
- nitterList['normal'].append(item)
- mightyList['nitter'] = nitterList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Nitter')
+ fetchRegexList('nitter', 'Nitter', 'https://raw.githubusercontent.com/wiki/zedeus/nitter/Instances.md', r"(?:(?:\| )|(?:- ))\[(?:(?:\S+\.)+[a-zA-Z0-9]+)\/?\]\((https?:\/{2}(?:\S+\.)+[a-zA-Z0-9]+)\/?\)(?:(?: (?:\((?:\S+ ?\S*)\) )? *\| [^❌]{1,4} +\|(?:(?:\n)|(?: ❌)|(?: ✅)|(?: ❓)|(?: \[)))|(?:\n))")
def bibliogram():
- json_object = json.dumps(mightyList, ensure_ascii=False, indent=2)
- with open('./src/instances/bibliogram.json') as file:
- mightyList['bibliogram'] = json.load(file)
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Bibliogram')
+ fetchFromFile('bibliogram', 'Bibliogram')
def libreddit():
- r = requests.get(
- 'https://github.com/libbacon/libreddit-instances/raw/master/instances.json')
- rJson = json.loads(r.text)
- libredditList = {}
- libredditList['normal'] = []
- libredditList['tor'] = []
- libredditList['i2p'] = []
- libredditList['loki'] = []
-
- if 'instances' not in rJson:
- mightyList['libreddit'] = libredditList
- print(Fore.RED + 'Failed to fetch ' + Style.RESET_ALL + 'LibReddit')
- return
-
- for item in rJson['instances']:
- if 'url' in item:
- url = item['url']
- libredditList['normal'].append(url)
- elif 'onion' in item:
- onion = item['onion']
- libredditList['tor'].append(onion)
- elif 'i2p' in item:
- i2p = item['i2p']
- libredditList['i2p'].append(i2p)
-
- mightyList['libreddit'] = libredditList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'LibReddit')
+ fetchRegexList('libreddit', 'Libreddit', 'https://raw.githubusercontent.com/spikecodes/libreddit/master/README.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|")
def teddit():
- r = requests.get(
- 'https://codeberg.org/teddit/teddit/raw/branch/main/instances.json')
- rJson = json.loads(r.text)
- tedditList = {}
- tedditList['normal'] = []
- tedditList['tor'] = []
- tedditList['i2p'] = []
- tedditList['loki'] = []
- for item in rJson:
- url = item['url']
- if url != '':
- tedditList['normal'].append(url)
- if 'onion' in item:
- onion = item['onion']
- if onion != '':
- tedditList['tor'].append(onion)
-
- mightyList['teddit'] = tedditList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Teddit')
+ fetchJsonList('teddit', 'Teddit', 'https://codeberg.org/teddit/teddit/raw/branch/main/instances.json', {'clearnet': 'url', 'tor': 'onion', 'i2p': 'i2p', 'loki': None}, False)
def wikiless():
- r = requests.get('https://wikiless.org/instances.json')
- rJson = json.loads(r.text)
- wikilessList = {}
- wikilessList['normal'] = []
- wikilessList['tor'] = []
- wikilessList['i2p'] = []
- wikilessList['loki'] = []
- for item in rJson:
- if 'url' in item:
- if item['url'].strip() != "":
- wikilessList['normal'].append(item['url'])
- if 'onion' in item:
- if item['onion'].strip() != "":
- wikilessList['tor'].append(item['onion'])
- if 'i2p' in item:
- if item['i2p'].strip() != "":
- wikilessList['i2p'].append(item['i2p'])
- mightyList['wikiless'] = wikilessList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Wikiless')
+ fetchJsonList('wikiless', 'Wikiless', 'https://wikiless.org/instances.json', {'clearnet': 'url', 'tor': 'onion', 'i2p': 'i2p', 'loki': None}, False)
def scribe():
- r = requests.get(
- 'https://git.sr.ht/~edwardloveall/scribe/blob/main/docs/instances.json')
- rJson = json.loads(r.text)
- scribeList = {}
- scribeList['normal'] = []
- scribeList['tor'] = []
- scribeList['i2p'] = []
- scribeList['loki'] = []
- for item in rJson:
- scribeList['normal'].append(item)
- mightyList['scribe'] = scribeList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Scribe')
+ fetchJsonList('scribe', 'Scribe', 'https://git.sr.ht/~edwardloveall/scribe/blob/main/docs/instances.json', None, False)
def quetre():
- r = requests.get(
- 'https://raw.githubusercontent.com/zyachel/quetre/main/README.md')
- _list = {}
- _list['normal'] = []
- _list['tor'] = []
- _list['i2p'] = []
- _list['loki'] = []
-
- tmp = re.findall(
- r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|", r.text)
-
-
- for item in tmp:
- if re.search(torRegex, item):
- _list['tor'].append(item)
- elif re.search(i2pRegex, item):
- _list['i2p'].append(item)
- else:
- _list['normal'].append(item)
- mightyList['quetre'] = _list
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Quetre')
+ fetchRegexList('quetre', 'Quetre', 'https://raw.githubusercontent.com/zyachel/quetre/main/README.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|")
def libremdb():
- r = requests.get(
- 'https://raw.githubusercontent.com/zyachel/libremdb/main/README.md')
- _list = {}
- _list['normal'] = []
- _list['tor'] = []
- _list['i2p'] = []
- _list['loki'] = []
-
- tmp = re.findall(
- r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|", r.text)
-
+ fetchRegexList('libremdb', 'libremdb', 'https://raw.githubusercontent.com/zyachel/libremdb/main/README.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|")
- for item in tmp:
- if item.strip() == "":
- continue
- if re.search(torRegex, item):
- _list['tor'].append(item)
- elif re.search(i2pRegex, item):
- _list['i2p'].append(item)
- else:
- _list['normal'].append(item)
-
-
- mightyList['libremdb'] = _list
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Libremdb')
def simpleertube():
- r = requests.get('https://simple-web.org/instances/simpleertube')
- _list = {}
- _list['normal'] = []
- _list['tor'] = []
- _list['i2p'] = []
- _list['loki'] = []
- for item in r.text.strip().split('\n'):
- _list['normal'].append('https://' + item)
-
- mightyList['simpleertube'] = _list
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'SimpleerTube')
+ fetchTextList('simpleertube', 'SimpleerTube', 'https://simple-web.org/instances/simpleertube', 'https://')
def simplytranslate():
r = requests.get('https://simple-web.org/instances/simplytranslate')
simplyTranslateList = {}
- simplyTranslateList['normal'] = []
+ simplyTranslateList['clearnet'] = []
for item in r.text.strip().split('\n'):
- simplyTranslateList['normal'].append('https://' + item)
+ simplyTranslateList['clearnet'].append('https://' + item)
r = requests.get('https://simple-web.org/instances/simplytranslate_onion')
simplyTranslateList['tor'] = []
@@ -417,31 +363,19 @@ def simplytranslate():
def linvgatranslate():
- r = requests.get(
- 'https://raw.githubusercontent.com/TheDavidDelta/lingva-translate/main/instances.json')
- rJson = json.loads(r.text)
- lingvaList = {}
- lingvaList['normal'] = []
- lingvaList['tor'] = []
- lingvaList['i2p'] = []
- lingvaList['loki'] = []
- for item in rJson:
- lingvaList['normal'].append(item)
-
- mightyList['lingva'] = lingvaList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'LinvgaTranslate')
+ fetchJsonList('lingva', 'LingvaTranslate', 'https://raw.githubusercontent.com/TheDavidDelta/lingva-translate/main/instances.json', None, False)
def searx_searxng():
r = requests.get('https://searx.space/data/instances.json')
rJson = json.loads(r.text)
searxList = {}
- searxList['normal'] = []
+ searxList['clearnet'] = []
searxList['tor'] = []
searxList['i2p'] = []
searxList['loki'] = []
searxngList = {}
- searxngList['normal'] = []
+ searxngList['clearnet'] = []
searxngList['tor'] = []
searxngList['i2p'] = []
searxngList['loki'] = []
@@ -458,9 +392,9 @@ def searx_searxng():
searxList['i2p'].append(item[:-1])
else:
if (rJson['instances'][item].get('generator') == 'searxng'):
- searxngList['normal'].append(item[:-1])
+ searxngList['clearnet'].append(item[:-1])
else:
- searxList['normal'].append(item[:-1])
+ searxList['clearnet'].append(item[:-1])
mightyList['searx'] = searxList
mightyList['searxng'] = searxngList
@@ -468,140 +402,35 @@ def searx_searxng():
def whoogle():
- r = requests.get(
- 'https://raw.githubusercontent.com/benbusby/whoogle-search/main/misc/instances.txt')
- tmpList = r.text.strip().split('\n')
- whoogleList = {}
- whoogleList['normal'] = []
- whoogleList['tor'] = []
- whoogleList['i2p'] = []
- whoogleList['loki'] = []
- for item in tmpList:
- if re.search(torRegex, item):
- whoogleList['tor'].append(item)
- elif re.search(torRegex, item):
- whoogleList['i2p'].append(item)
- else:
- whoogleList['normal'].append(item)
- mightyList['whoogle'] = whoogleList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Whoogle')
+ fetchTextList('whoogle', 'Whoogle', 'https://raw.githubusercontent.com/benbusby/whoogle-search/main/misc/instances.txt', '')
def librex():
- r = requests.get(
- 'https://raw.githubusercontent.com/hnhx/librex/main/README.md')
- _list = {}
- _list['normal'] = []
- _list['tor'] = []
- _list['i2p'] = []
- _list['loki'] = []
-
- tmp = re.findall(
- r"\| {1,2}\[(?:(?:[a-zA-Z0-9]+\.)+[a-zA-Z]{2,}|✅)\]\((https?:\/{2}(?:[a-zA-Z0-9]+\.)+[a-zA-Z0-9]{2,})", r.text)
-
- for item in tmp:
- if item.strip() == "":
- continue
- elif re.search(torRegex, item):
- _list['tor'].append(item)
- elif re.search(i2pRegex, item):
- _list['i2p'].append(item)
- else:
- _list['normal'].append(item)
- mightyList['librex'] = _list
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Librex')
+ fetchJsonList('librex', 'LibreX', 'https://raw.githubusercontent.com/hnhx/librex/main/instances.json', {'clearnet': 'clearnet', 'tor': 'tor', 'i2p': 'i2p', 'loki': None}, True)
def rimgo():
- r = requests.get(
- 'https://codeberg.org/video-prize-ranch/rimgo/raw/branch/main/instances.json')
- rJson = json.loads(r.text)
- rimgoList = {}
- rimgoList['normal'] = []
- rimgoList['tor'] = []
- rimgoList['i2p'] = []
- rimgoList['loki'] = []
- for item in rJson:
- if 'url' in item:
- rimgoList['normal'].append(item['url'])
- if 'onion' in item:
- rimgoList['tor'].append(item['onion'])
- if 'i2p' in item:
- rimgoList['i2p'].append(item['i2p'])
- mightyList['rimgo'] = rimgoList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Rimgo')
+ fetchJsonList('rimgo', 'rimgo', 'https://codeberg.org/video-prize-ranch/rimgo/raw/branch/main/instances.json', {'clearnet': 'url', 'tor': 'onion', 'i2p': 'i2p', 'loki': None}, False)
def librarian():
- r = requests.get(
- 'https://codeberg.org/librarian/librarian/raw/branch/main/instances.json')
- rJson = json.loads(r.text)
- librarianList = {}
- librarianList['normal'] = []
- librarianList['tor'] = []
- librarianList['i2p'] = []
- librarianList['loki'] = []
- instances = rJson['instances']
- for item in instances:
- url = item['url']
- if url.strip() == "":
- continue
- elif re.search(torRegex, url):
- librarianList['tor'].append(url)
- elif re.search(i2pRegex, url):
- librarianList['i2p'].append(url)
- elif re.search(lokiRegex, url):
- librarianList['loki'].append(url)
- else:
- librarianList['normal'].append(url)
- mightyList['librarian'] = librarianList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Librarian')
+ fetchJsonList('librarian', 'Librarian', 'https://codeberg.org/librarian/librarian/raw/branch/main/instances.json', 'url', True)
def neuters():
- json_object = json.dumps(mightyList, ensure_ascii=False, indent=2)
- with open('./src/instances/neuters.json') as file:
- mightyList['neuters'] = json.load(file)
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Neuters')
+ fetchFromFile('neuters', 'Neuters')
def beatbump():
- json_object = json.dumps(mightyList, ensure_ascii=False, indent=2)
- with open('./src/instances/beatbump.json') as file:
- mightyList['beatbump'] = json.load(file)
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Beatbump')
+ fetchFromFile('beatbump', 'Beatbump')
def hyperpipe():
- r = requests.get(
- 'https://codeberg.org/Hyperpipe/pages/raw/branch/main/api/frontend.json')
- rJson = json.loads(r.text)
- hyperpipeList = {}
- hyperpipeList['normal'] = []
- hyperpipeList['tor'] = []
- hyperpipeList['i2p'] = []
- hyperpipeList['loki'] = []
- for item in rJson:
- url = item['url']
- if url.strip() == "":
- continue
- elif re.search(torRegex, url):
- hyperpipeList['tor'].append(url)
- elif re.search(i2pRegex, url):
- hyperpipeList['i2p'].append(url)
- elif re.search(lokiRegex, url):
- hyperpipeList['loki'].append(url)
- else:
- hyperpipeList['normal'].append(url)
- mightyList['hyperpipe'] = hyperpipeList
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Hyperpipe')
+ fetchJsonList('hyperpipe', 'Hyperpipe', 'https://codeberg.org/Hyperpipe/pages/raw/branch/main/api/frontend.json', 'url', False)
def facil():
- json_object = json.dumps(mightyList, ensure_ascii=False, indent=2)
- with open('./src/instances/facil.json') as file:
- mightyList['facil'] = json.load(file)
- print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'FacilMap')
+ fetchFromFile('facil', 'FacilMap')
def peertube():
@@ -609,7 +438,7 @@ def peertube():
'https://instances.joinpeertube.org/api/v1/instances?start=0&count=1045&sort=-createdAt')
rJson = json.loads(r.text)
- myList = []
+ myList = ['https://search.joinpeertube.org']
for k in rJson['data']:
myList.append('https://'+k['host'])
@@ -621,7 +450,7 @@ def isValid(url): # This code is contributed by avanitrachhadiya2155
try:
result = urlparse(url)
return all([result.scheme, result.netloc])
- except:
+ except Exception:
return False
@@ -652,6 +481,7 @@ hyperpipe()
facil()
simpleertube()
mightyList = filterLastSlash(mightyList)
+mightyList = idnaEncode(mightyList)
cloudflare = []
authenticate = []
diff --git a/src/instances/neuters.json b/src/instances/neuters.json
index 9e224a52..8023079b 100644
--- a/src/instances/neuters.json
+++ b/src/instances/neuters.json
@@ -1,5 +1,5 @@
{
- "normal": ["https://neuters.de"],
+ "clearnet": ["https://neuters.de"],
"tor": [],
"i2p": [],
"loki": []
diff --git a/src/manifest.json b/src/manifest.json
index cc804f9d..5674b8f6 100644
--- a/src/manifest.json
+++ b/src/manifest.json
@@ -1,7 +1,7 @@
{
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__",
- "version": "2.2.1",
+ "version": "2.3.0",
"manifest_version": 2,
"browser_specific_settings": {
"gecko": {
diff --git a/src/pages/background/background.js b/src/pages/background/background.js
index 7e37bade..7186144b 100644
--- a/src/pages/background/background.js
+++ b/src/pages/background/background.js
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
"use strict"
import generalHelper from "../../assets/javascripts/general.js"
@@ -243,3 +244,196 @@ browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
})
browser.storage.local.set({ version: browser.runtime.getManifest().version })
+=======
+"use strict"
+
+import generalHelper from "../../assets/javascripts/general.js"
+import utils from "../../assets/javascripts/utils.js"
+import servicesHelper from "../../assets/javascripts/services.js"
+
+window.browser = window.browser || window.chrome
+
+function initDefaults() {
+ browser.storage.local.clear(() => {
+ fetch("/instances/blacklist.json")
+ .then(response => response.text())
+ .then(async data => {
+ browser.storage.local.set({ blacklists: JSON.parse(data) }, async () => {
+ await generalHelper.initDefaults()
+ await servicesHelper.initDefaults()
+ })
+ })
+ })
+}
+
+browser.runtime.onInstalled.addListener(details => {
+ // if (details.reason == 'install' || (details.reason == "update" && details.previousVersion != browser.runtime.getManifest().version)) {
+ // if (details.reason == "update")
+ // browser.storage.local.get(null, r => {
+ // if (r.theme) {
+ // const old = encodeURIComponent(JSON.stringify(r))
+ // browser.tabs.create({ url: browser.runtime.getURL(`/pages/background/reset_warning.html?data=${old}`) });
+ // }
+ // initDefaults();
+ // })
+ // else initDefaults();
+ // }
+ switch (details.reason) {
+ case "install":
+ initDefaults()
+ break
+ case "update":
+ fetch("/instances/blacklist.json")
+ .then(response => response.text())
+ .then(async data => {
+ browser.storage.local.set({ blacklists: JSON.parse(data) }, async () => {
+ switch (details.previousVersion) {
+ case "2.2.1":
+ await generalHelper.initDefaults()
+ await servicesHelper.initDefaults()
+ await servicesHelper.upgradeOptions()
+ break
+ }
+ })
+ })
+ }
+})
+
+let BYPASSTABs = []
+browser.webRequest.onBeforeRequest.addListener(
+ details => {
+ const url = new URL(details.url)
+ if (new RegExp(/^chrome-extension:\/{2}.*\/instances\/.*.json$/).test(url.href) && details.type == "xmlhttprequest") return
+ let initiator
+ try {
+ if (details.originUrl) initiator = new URL(details.originUrl)
+ else if (details.initiator) initiator = new URL(details.initiator)
+ } catch {
+ return null
+ }
+
+ let newUrl = servicesHelper.redirect(url, details.type, initiator)
+
+ if (details.frameAncestors && details.frameAncestors.length > 0 && generalHelper.isException(new URL(details.frameAncestors[0].url))) newUrl = null
+
+ if (generalHelper.isException(url)) newUrl = "BYPASSTAB"
+ if (BYPASSTABs.includes(details.tabId)) newUrl = null
+
+ if (newUrl) {
+ if (newUrl === "CANCEL") {
+ console.log(`Canceled ${url}`)
+ return { cancel: true }
+ }
+ if (newUrl === "BYPASSTAB") {
+ console.log(`Bypassed ${details.tabId} ${url}`)
+ if (!BYPASSTABs.includes(details.tabId)) BYPASSTABs.push(details.tabId)
+ return null
+ }
+ console.info("Redirecting", url.href, "=>", newUrl)
+ return { redirectUrl: newUrl }
+ }
+ return null
+ },
+ { urls: ["<all_urls>"] },
+ ["blocking"]
+)
+
+browser.tabs.onRemoved.addListener(tabId => {
+ const i = BYPASSTABs.indexOf(tabId)
+ if (i > -1) {
+ BYPASSTABs.splice(i, 1)
+ console.log("Removed BYPASSTABs", tabId)
+ }
+})
+
+/*
+browser.webRequest.onHeadersReceived.addListener(
+ e => {
+ let response = youtubeHelper.removeXFrameOptions(e)
+ if (!response) response = twitterHelper.removeXFrameOptions(e)
+ return response
+ },
+ { urls: ["<all_urls>"] },
+ ["blocking", "responseHeaders"]
+)
+*/
+
+async function redirectOfflineInstance(url, tabId) {
+ let newUrl = await servicesHelper.switchInstance(url, true)
+
+ if (newUrl) {
+ if (counter >= 5) {
+ browser.tabs.update(tabId, {
+ url: `/pages/errors/instance_offline.html?url=${encodeURIComponent(newUrl)}`,
+ })
+ counter = 0
+ } else {
+ browser.tabs.update(tabId, { url: newUrl })
+ counter++
+ }
+ }
+}
+let counter = 0
+
+function isAutoRedirect() {
+ return new Promise(resolve => browser.storage.local.get("options", r => resolve(r.options.autoRedirect == true)))
+}
+
+browser.webRequest.onResponseStarted.addListener(
+ async details => {
+ if (!(await isAutoRedirect())) return null
+ if (details.type == "main_frame" && details.statusCode >= 500) redirectOfflineInstance(new URL(details.url), details.tabId)
+ },
+ { urls: ["<all_urls>"] }
+)
+
+browser.webRequest.onErrorOccurred.addListener(
+ async details => {
+ if (!(await isAutoRedirect())) return
+ if (details.type == "main_frame") redirectOfflineInstance(new URL(details.url), details.tabId)
+ },
+ { urls: ["<all_urls>"] }
+)
+
+browser.commands.onCommand.addListener(command => {
+ if (command === "switchInstance") utils.switchInstance()
+ else if (command == "copyRaw") utils.copyRaw()
+ else if (command == "unify") utils.unify()
+})
+
+browser.contextMenus.create({
+ id: "settings",
+ title: browser.i18n.getMessage("Settings"),
+ contexts: ["browser_action"],
+})
+
+browser.contextMenus.create({
+ id: "switchInstance",
+ title: browser.i18n.getMessage("switchInstance"),
+ contexts: ["browser_action"],
+})
+
+browser.contextMenus.create({
+ id: "copyRaw",
+ title: browser.i18n.getMessage("copyRaw"),
+ contexts: ["browser_action"],
+})
+
+browser.contextMenus.create({
+ id: "unify",
+ title: browser.i18n.getMessage("unifySettings"),
+ contexts: ["browser_action"],
+})
+
+browser.contextMenus.onClicked.addListener(info => {
+ if (info.menuItemId == "switchInstance") utils.switchInstance()
+ else if (info.menuItemId == "settings") browser.runtime.openOptionsPage()
+ else if (info.menuItemId == "copyRaw") utils.copyRaw()
+ else if (info.menuItemId == "unify") utils.unify()
+})
+
+browser.runtime.onMessage.addListener((message, sender, sendResponse) => {
+ if (message.function === "unify") utils.unify(false).then(r => sendResponse({ response: r }))
+ return true
+})
+>>>>>>> optimizations
diff --git a/src/pages/options/index.ejs b/src/pages/options/index.ejs
new file mode 100644
index 00000000..7f09e6da
--- /dev/null
+++ b/src/pages/options/index.ejs
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html id="elementToShowWithJavaScript" lang="en">
+ <%- include('src/pages/widgets/head') -%>
+ <body class="option" dir="auto">
+ <%- include('src/pages/widgets/links', {services: services}) -%>
+ <div id="pages">
+ <%- include('src/pages/options/widgets/general', {config: {networks, services}}) -%>
+ <%- include('src/pages/options/widgets/services', {config: {networks, services}}) -%>
+ <%- include('src/pages/options/widgets/about') -%>
+ </div>
+ </body>
+ <script type="module" src="./index.js"></script>
+</html>
diff --git a/src/pages/options/index.html b/src/pages/options/index.html
index af417403..53ee562e 100644
--- a/src/pages/options/index.html
+++ b/src/pages/options/index.html
@@ -1,3186 +1,3318 @@
<!DOCTYPE html>
<html id="elementToShowWithJavaScript" lang="en">
<head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg">
- <link href="../stylesheets/styles.css" rel="stylesheet">
- <title>General</title>
- <script type="module" src="./init.js"></script>
- </head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg">
+ <link href="../stylesheets/styles.css" rel="stylesheet">
+ <title>General</title>
+ <script type="module" src="./init.js"></script>
+</head>
<body class="option" dir="auto">
- <section class="links" id="links">
- <div class="title">
- <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
- <path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path>
- </svg><a href="#general" data-localise="__MSG_general__">General</a>
- </div>
- <div class="title"> <img src="../../../assets/images/youtube-icon.png"><a href="#youtube" data-localise="__MSG_youtube__">YouTube </a></div>
- <div class="title"> <img src="../../../assets/images/youtube-music-icon.png"><a href="#youtubeMusic" data-localise="__MSG_ytmusic__">YT Music</a></div>
- <div class="title"> <img src="../../../assets/images/twitter-icon.png"><a href="#twitter" data-localise="__MSG_twitter__">Twitter</a></div>
- <div class="title"> <img src="../../../assets/images/instagram-icon.png"><a href="#instagram" data-localise="__MSG_instagram__">Instagram</a></div>
- <div class="title"> <img src="../../../assets/images/tiktok-icon.png"><a href="#tiktok" data-localise="__MSG_tiktok__">TikTok</a></div>
- <div class="title"> <img src="../../../assets/images/reddit-icon.png"><a href="#reddit" data-localise="__MSG_reddit__">Reddit</a></div>
- <div class="title"> <img src="../../../assets/images/imgur.png"><a href="#imgur" data-localise="__MSG_imgur__">Imgur</a></div>
- <div class="title"> <img src="../../../assets/images/wikipedia-icon.svg"><a href="#wikipedia" data-localise="__MSG_wikipedia__">Wikipedia</a></div>
- <div class="title">
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
- <circle cx="500" cy="500" r="500"></circle>
- <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
- <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
- </svg><a href="#medium" data-localise="__MSG_medium__">Medium</a>
- </div>
- <div class="title"><img src="../../../assets/images/quora.png"><a href="#quora">Quora</a></div>
- <div class="title"><img src="../../../assets/images/imdb.svg"><a href="#imdb">IMDb</a></div>
- <div class="title"><img src="../../../assets/images/reuters.svg"><a href="#reuters">Reuters</a></div>
- <div class="title"> <img src="../../../assets/images/peertube-icon.svg"><a href="#peertube" data-localise="__MSG_peertube__">PeerTube</a></div>
- <div class="title"> <img src="../../../assets/images/lbry-icon.png"><a href="#lbry" data-localise="__MSG_lbry__">LBRY</a></div>
- <div class="title">
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
- <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
- </svg><a href="#search" data-localise="__MSG_search__">Search</a>
- </div>
- <div class="title">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
- </svg><a href="#translate" data-localise="__MSG_translate__">Translate</a>
- </div>
- <div class="title">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
- </svg><a href="#maps" data-localise="__MSG_maps__">Maps</a>
- </div>
- <div class="title">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
- </svg><a href="#sendTargets" data-localise="__MSG_sendFiles__">Send Files</a>
- </div>
- <div class="title">
- <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
- <path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
- </svg><a href="#about" data-localise="__MSG_about">About</a>
- </div>
- </section>
+ <section class="links" id="links">
+ <div class="title">
+ <a href="#general">
+ <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
+ <path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path>
+</svg>
+
+ <span data-localise="__MSG_general__">General</span>
+ </a></div>
+ <div class="title">
+ <a href="#youtube">
+ <img src="../../../assets/images/youtube-icon.png">
+ <span data-localise="__MSG_youtube__">Youtube</span>
+ </a></div>
+ <div class="title">
+ <a href="#youtubeMusic">
+ <img src="../../../assets/images/youtubeMusic-icon.png">
+ <span data-localise="__MSG_youtubeMusic__">YT Music</span>
+ </a></div>
+ <div class="title">
+ <a href="#twitter">
+ <img src="../../../assets/images/twitter-icon.png">
+ <span data-localise="__MSG_twitter__">Twitter</span>
+ </a></div>
+ <div class="title">
+ <a href="#instagram">
+ <img src="../../../assets/images/instagram-icon.png">
+ <span data-localise="__MSG_instagram__">Instagram</span>
+ </a></div>
+ <div class="title">
+ <a href="#tiktok">
+ <img src="../../../assets/images/tiktok-icon.png">
+ <span data-localise="__MSG_tiktok__">TikTok</span>
+ </a></div>
+ <div class="title">
+ <a href="#reddit">
+ <img src="../../../assets/images/reddit-icon.png">
+ <span data-localise="__MSG_reddit__">Reddit</span>
+ </a></div>
+ <div class="title">
+ <a href="#imgur">
+ <img src="../../../assets/images/imgur-icon.png">
+ <span data-localise="__MSG_imgur__">Imgur</span>
+ </a></div>
+ <div class="title">
+ <a href="#wikipedia">
+ <img src="../../../assets/images/wikipedia-icon.svg">
+ <span data-localise="__MSG_wikipedia__">Wikipedia</span>
+ </a></div>
+ <div class="title">
+ <a href="#medium">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
+ <circle cx="500" cy="500" r="500"></circle>
+ <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
+ <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
+</svg>
+
+ <span data-localise="__MSG_medium__">Medium</span>
+ </a></div>
+ <div class="title">
+ <a href="#quora">
+ <img src="../../../assets/images/quora-icon.png">
+ <span data-localise="__MSG_quora__">Quora</span>
+ </a></div>
+ <div class="title">
+ <a href="#imdb">
+ <img src="../../../assets/images/imdb-icon.svg">
+ <span data-localise="__MSG_imdb__">IMDb</span>
+ </a></div>
+ <div class="title">
+ <a href="#reuters">
+ <img src="../../../assets/images/reuters-icon.svg">
+ <span data-localise="__MSG_reuters__">Reuters</span>
+ </a></div>
+ <div class="title">
+ <a href="#peertube">
+ <img src="../../../assets/images/peertube-icon.svg">
+ <span data-localise="__MSG_peertube__">PeerTube</span>
+ </a></div>
+ <div class="title">
+ <a href="#lbry">
+ <img src="../../../assets/images/lbry-icon.png">
+ <span data-localise="__MSG_lbry__">LBRY</span>
+ </a></div>
+ <div class="title">
+ <a href="#search">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+ <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
+</svg>
+
+ <span data-localise="__MSG_search__">Search</span>
+ </a></div>
+ <div class="title">
+ <a href="#translate">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
+</svg>
+
+ <span data-localise="__MSG_translate__">Translate</span>
+ </a></div>
+ <div class="title">
+ <a href="#maps">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
+</svg>
+
+ <span data-localise="__MSG_maps__">Maps</span>
+ </a></div>
+ <div class="title">
+ <a href="#sendFiles">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
+</svg>
+
+ <span data-localise="__MSG_sendFiles__">Send Files</span>
+ </a></div>
+ <div class="title">
+ <a href="#about">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
+ <path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
+</svg>
+
+ <span data-localise="__MSG_about__">About</span>
+ </a></div>
+</section>
<div id="pages">
<section class="option-block" id="general_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_general__">General</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_theme__">Theme</h4>
+ <select id="theme">
+ <option value="detect" data-localise="__MSG_detect__">Detect</option>
+ <option value="light" data-localise="__MSG_light__">Light</option>
+ <option value="dark" data-localise="__MSG_dark__">Dark</option>
+ </select>
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_network__">Network</h4>
+ <select id="network">
+ <option value="clearnet">Clearnet</option>
+ <option value="tor">Tor</option>
+ <option value="i2p">I2P</option>
+ <option value="loki">Lokinet</option>
+
+</select>
+ </div>
+ <div id="network-fallback">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_networkFallback__">Fallback to clearnet if no instances are available for the current network</h4>
+ <input id="network-fallback-checkbox" type="checkbox">
+ </div>
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_autoRedirect__"></h4>
+ <input id="auto-redirect" type="checkbox">
+ </div>
+ <form>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_latencyThreshold">Latency Threshold</h4>
+ <output id="latency-output" for="latencyInput" name="latencyOutput"></output>
+ <input id="latency-input" type="range" min="50" max="5000" value="1000" name="latencyInput" step="50">
+ </div>
+ </form>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_exceptions__"></h4>
+ </div>
+ <form id="custom-exceptions-instance-form">
+ <div class="some-block option-block">
+ <div class="some-block" style="padding:0;">
+ <input id="exceptions-custom-instance" placeholder="https://www.google.com" type="url">&nbsp;
+ <select id="exceptions-custom-instance-type">
+ <option value="url">URL</option>
+ <option value="regex">Regex</option>
+ </select>&nbsp;
+ </div>
+ <button class="add" id="exceptions-add-instance" type="submit">
+ <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist" id="exceptions-custom-checklist"></div>
+ <div class="buttons buttons-inline"><a class="button button-inline" id="update-instances">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path>
+ </svg>
+ <x data-localise="__MSG_updateInstances__">Update Instances</x></a>&nbsp; &nbsp;</div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="import_settings_text" for="import-settings">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_importSettings__">Import Settings</x>
+ </label>
+ <input class="button button-inline" id="import-settings" type="file" style="display:none;">&nbsp; &nbsp;<a class="button button-inline" id="export-settings">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_exportSettings__">Export Settings</x></a>&nbsp; &nbsp;<a class="button button-inline" id="reset-settings">
+ <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M12,5V2L8,6l4,4V7c3.31,0,6,2.69,6,6c0,2.97-2.17,5.43-5,5.91v2.02c3.95-0.49,7-3.85,7-7.93C20,8.58,16.42,5,12,5z"></path>
+ <path d="M6,13c0-1.65,0.67-3.15,1.76-4.24L6.34,7.34C4.9,8.79,4,10.79,4,13c0,4.08,3.05,7.44,7,7.93v-2.02 C8.17,18.43,6,15.97,6,13z"></path>
+ </svg>
+ <x data-localise="__MSG_resetSettings__">Reset Settings</x></a>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customPopup__">Customize Popup</h4>
+ </div>
+ <div class="checklist-popup" id="popup-frontends-checklist">
+ <div>
+ <div>
+ <img src="../../../assets/images/youtube-icon.png">
+ <label data-localise="__MSG_youtube__" for="youtube">Youtube</label>
+ </div>
+ <input id="youtube" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/youtubeMusic-icon.png">
+ <label data-localise="__MSG_youtubeMusic__" for="youtubeMusic">YT Music</label>
+ </div>
+ <input id="youtubeMusic" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/twitter-icon.png">
+ <label data-localise="__MSG_twitter__" for="twitter">Twitter</label>
+ </div>
+ <input id="twitter" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/instagram-icon.png">
+ <label data-localise="__MSG_instagram__" for="instagram">Instagram</label>
+ </div>
+ <input id="instagram" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/tiktok-icon.png">
+ <label data-localise="__MSG_tiktok__" for="tiktok">TikTok</label>
+ </div>
+ <input id="tiktok" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/reddit-icon.png">
+ <label data-localise="__MSG_reddit__" for="reddit">Reddit</label>
+ </div>
+ <input id="reddit" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/imgur-icon.png">
+ <label data-localise="__MSG_imgur__" for="imgur">Imgur</label>
+ </div>
+ <input id="imgur" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/wikipedia-icon.svg">
+ <label data-localise="__MSG_wikipedia__" for="wikipedia">Wikipedia</label>
+ </div>
+ <input id="wikipedia" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
+ <circle cx="500" cy="500" r="500"></circle>
+ <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
+ <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
+</svg>
+
+ <label data-localise="__MSG_medium__" for="medium">Medium</label>
+ </div>
+ <input id="medium" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/quora-icon.png">
+ <label data-localise="__MSG_quora__" for="quora">Quora</label>
+ </div>
+ <input id="quora" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/imdb-icon.svg">
+ <label data-localise="__MSG_imdb__" for="imdb">IMDb</label>
+ </div>
+ <input id="imdb" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/reuters-icon.svg">
+ <label data-localise="__MSG_reuters__" for="reuters">Reuters</label>
+ </div>
+ <input id="reuters" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/peertube-icon.svg">
+ <label data-localise="__MSG_peertube__" for="peertube">PeerTube</label>
+ </div>
+ <input id="peertube" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <img src="../../../assets/images/lbry-icon.png">
+ <label data-localise="__MSG_lbry__" for="lbry">LBRY</label>
+ </div>
+ <input id="lbry" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+ <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
+</svg>
+
+ <label data-localise="__MSG_search__" for="search">Search</label>
+ </div>
+ <input id="search" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
+</svg>
+
+ <label data-localise="__MSG_translate__" for="translate">Translate</label>
+ </div>
+ <input id="translate" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
+</svg>
+
+ <label data-localise="__MSG_maps__" for="maps">Maps</label>
+ </div>
+ <input id="maps" type="checkbox">
+ </div>
+ <div>
+ <div>
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
+</svg>
+
+ <label data-localise="__MSG_sendFiles__" for="sendFiles">Send Files</label>
+ </div>
+ <input id="sendFiles" type="checkbox">
+ </div>
+
+</div>
+ <script type="module" src="./widgets/general.js"></script>
+</section>
+ <section class="option-block" id="youtube_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_youtube__">Youtube</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="youtube-enabled" type="checkbox">
+ </div>
+
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="youtube-frontend">
+ <option value="invidious">Invidious</option>
+ <option value="piped">Piped</option>
+ <option value="pipedMaterial">Piped-Material</option>
+ <option value="cloudtube">CloudTube</option>
+ <option value="freetube">FreeTube</option>
+ <option value="yattee">Yattee</option>
+
+ </select>
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_embed_frontend__">Embed Frontend</h4>
+ <select id="youtube-embedFrontend">
+ <option value="invidious">Invidious</option>
+ <option value="piped">Piped</option>
+
+ </select>
+ </div>
<div class="some-block option-block">
- <h1 data-localise="__MSG_general__">General</h1>
- </div>
- <hr>
+ <h4 data-localise="__MSG_redirectType__">Redirect Type</h4>
+ <select id="youtube-redirectType">
+ <option value="both" data-localise="__MSG_both__">both</option>
+ <option value="sub_frame" data-localise="__MSG_onlyEmbedded__">Only Embedded</option>
+ <option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
+ </select>
+ </div>
+ <hr>
+ <div id="invidious">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_theme__">Theme</h4>
- <select id="theme">
- <option value="DEFAULT" data-localise="__MSG_system__">System</option>
- <option value="light" data-localise="__MSG_light__">Light</option>
- <option value="dark" data-localise="__MSG_dark__">Dark</option>
- </select>
+ <input class="custom-instance" placeholder="http://invidious.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-invidious-label" for="latency-invidious">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-invidious" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_protocol__"></h4>
- <select id="protocol">
- <option value="normal" data-localise="__MSG_normal__">Normal</option>
- <option value="tor">Tor</option>
- <option value="i2p">I2P</option>
- <option value="loki">Lokinet</option>
- </select>
+ <input class="custom-instance" placeholder="http://invidious.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="protocol-fallback">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_protocolFallback__">Fallback to normal if no instances are available for the current protocol</h4>
- <input id="protocol-fallback-checkbox" type="checkbox">
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- </div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_autoRedirect__"></h4>
- <input id="auto-redirect" type="checkbox">
+ <input class="custom-instance" placeholder="http://invidious.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <form>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_latencyThreshold">Latency Threshold</h4>
- <output id="latency-output" for="latencyInput" name="latencyOutput"></output>
- <input id="latency-input" type="range" min="50" max="5000" value="1000" name="latencyInput" step="50">
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- </form>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_exceptions__"></h4>
+ <input class="custom-instance" placeholder="http://invidious.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <form id="custom-exceptions-instance-form">
- <div class="some-block option-block">
- <div class="some-block" style="padding:0;">
- <input id="exceptions-custom-instance" placeholder="https://www.google.com" type="url">&nbsp;
- <select id="exceptions-custom-instance-type">
- <option value="url">URL</option>
- <option value="regex">Regex</option>
- </select>&nbsp;
- </div>
- <button class="add" id="exceptions-add-instance" type="submit">
- <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- </form>
- <div class="checklist" id="exceptions-custom-checklist"></div>
- <div class="buttons buttons-inline"><a class="button button-inline" id="update-instances">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path>
- </svg>
- <x data-localise="__MSG_updateInstances__">Update Instances</x></a>&nbsp; &nbsp;</div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="import_settings_text" for="import-settings">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_importSettings__">Import Settings</x>
- </label>
- <input class="button button-inline" id="import-settings" type="file" style="display:none;">&nbsp; &nbsp;<a class="button button-inline" id="export-settings">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_exportSettings__">Export Settings</x></a>&nbsp; &nbsp;<a class="button button-inline" id="reset-settings">
- <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M12,5V2L8,6l4,4V7c3.31,0,6,2.69,6,6c0,2.97-2.17,5.43-5,5.91v2.02c3.95-0.49,7-3.85,7-7.93C20,8.58,16.42,5,12,5z"></path>
- <path d="M6,13c0-1.65,0.67-3.15,1.76-4.24L6.34,7.34C4.9,8.79,4,10.79,4,13c0,4.08,3.05,7.44,7,7.93v-2.02 C8.17,18.43,6,15.97,6,13z"></path>
+
+ </div>
+ <div id="piped">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://piped.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
</svg>
- <x data-localise="__MSG_resetSettings__">Reset Settings</x></a>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-piped-label" for="latency-piped">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-piped" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_customPopup__">Customize Popup</h4>
+ <input class="custom-instance" placeholder="http://piped.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div class="checklist-popup" id="popup-frontends-checklist">
- <div>
- <div><img src="../../../assets/images/youtube-icon.png">
- <x data-localise="__MSG_youtube__">YouTube</x>
- </div>
- <input id="youtube" type="checkbox">
- </div>
- <div>
- <div><img src="../../../assets/images/youtube-music-icon.png">
- <x data-localise="__MSG_ytmusic__">YoutubeMusic</x>
- </div>
- <input id="youtubeMusic" type="checkbox">
- </div>
- <div>
- <div><img src="../../../assets/images/twitter-icon.png">
- <x data-localise="__MSG_twitter__">Twitter</x>
- </div>
- <input id="twitter" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/instagram-icon.png">
- <x data-localise="__MSG_instagram__">Instagram</x>
- </div>
- <input id="instagram" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/tiktok-icon.png">
- <x data-localise="__MSG_tiktok__">TikTok</x>
- </div>
- <input id="tiktok" type="checkbox">
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div>
- <div> <img src="../../../assets/images/imgur.png">
- <x data-localise="__MSG_imgur__">Imgur</x>
- </div>
- <input id="imgur" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/reddit-icon.png">
- <x data-localise="__MSG_reddit__">Reddit</x>
- </div>
- <input id="reddit" type="checkbox">
- </div>
- <div>
- <div>
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
- <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
- </svg>
- <x data-localise="__MSG_search__">Search</x>
- </div>
- <input id="search" type="checkbox">
- </div>
- <div>
- <div>
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
- <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
- </svg>
- <x data-localise="__MSG_translate__">Translate</x>
- </div>
- <input id="translate" type="checkbox">
- </div>
- <div>
- <div>
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
- <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
- </svg>
- <x data-localise="__MSG_maps__">Maps</x>
- </div>
- <input id="maps" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/wikipedia-icon.svg">
- <x data-localise="__MSG_wikipedia__">Wikipedia</x>
- </div>
- <input id="wikipedia" type="checkbox">
- </div>
- <div>
- <div>
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
- <circle cx="500" cy="500" r="500"></circle>
- <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
- <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
- </svg>
- <x data-localise="__MSG_medium__">Medium</x>
- </div>
- <input id="medium" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/quora.png">
- <x>Quora</x>
- </div>
- <input id="quora" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/imdb.svg">
- <x>IMDb</x>
- </div>
- <input id="imdb" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/reuters.svg">
- <x>Reuters</x>
- </div>
- <input id="reuters" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/peertube-icon.svg">
- <x data-localise="__MSG_peertube__">PeerTube</x>
- </div>
- <input id="peertube" type="checkbox">
- </div>
- <div>
- <div> <img src="../../../assets/images/lbry-icon.png">
- <x data-localise="__MSG_lbry__">LBRY</x>
- </div>
- <input id="lbry" type="checkbox">
- </div>
- <div>
- <div>
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
- </svg>
- <x data-localise="__MSG_sendFiles__">Send Files</x>
- </div>
- <input id="sendTargets" type="checkbox">
- </div>
- </div>
- <script type="module" src="./widgets/general.js"></script>
- </section>
- <section class="option-block" id="youtube_page">
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_youtube__">YouTube</h1>
+ <input class="custom-instance" placeholder="http://piped.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="youtube-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://piped.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+ <div id="pipedMaterial">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_frontend__">Frontend</h4>
- <select id="youtube-frontend">
- <option value="invidious">Invidious</option>
- <option value="piped">Piped</option>
- <option value="pipedMaterial">Piped-Material</option>
- <option value="cloudtube">CloudTube</option>
- <option value="freetube">FreeTube</option>
- <option value="yatte">Yattee</option>
- </select>
+ <input class="custom-instance" placeholder="http://pipedMaterial.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="youtube-embedded_frontend">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_embeddedVids__">Embedded Videos Frontend</h4>
- <select id="youtube-embed_frontend">
- <option value="invidious">Invidious</option>
- <option value="piped">Piped</option>
- <option value="pipedMaterial">Piped-Material</option>
- <option value="cloudtube">CloudTube</option>
- </select>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-pipedMaterial-label" for="latency-pipedMaterial">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-pipedMaterial" style="display:none;">
+ </div>
</div>
- </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_redirectType__">Redirect Type</h4>
- <select id="youtube-redirect_type">
- <option value="both" data-localise="__MSG_both__">both</option>
- <option value="onlyNotEmbedded" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
- </select>
+ <input class="custom-instance" placeholder="http://pipedMaterial.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="invidious">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://invidious.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-invidious-label" for="latency-invidious">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-invidious" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://invidious.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://invidious.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://invidious.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://pipedMaterial.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="piped">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://piped.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-piped-label" for="latency-piped">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-piped" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://piped.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://piped.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://piped.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://pipedMaterial.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="pipedMaterial">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://piped-material.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-pipedMaterial-label" for="latency-pipedMaterial">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-pipedMaterial" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://piped-material.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://piped-material.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://piped-material.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- </div>
+
+ </div>
<div id="cloudtube">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://cloudtube.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-cloudtube-label" for="latency-cloudtube">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-cloudtube" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://cloudtube.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://cloudtube.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://cloudtube.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-cloudtube-label" for="latency-cloudtube">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-cloudtube" style="display:none;">
+ </div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://cloudtube.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://cloudtube.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://cloudtube.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/youtube.js"></script>
- </section>
- <section class="option-block" id="youtubeMusic_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_ytmusic__">YouTube Music</h1>
+ <input class="custom-instance" placeholder="http://cloudtube.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="youtubeMusic_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_youtubeMusic__">YT Music</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="youtubeMusic-enabled" type="checkbox">
+ </div>
+
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="youtubeMusic-frontend">
+ <option value="beatbump">Beatbump</option>
+ <option value="hyperpipe">HyperPipe</option>
+
+ </select>
+ </div>
<hr>
+ <div id="beatbump">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="youtubeMusic-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://beatbump.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-beatbump-label" for="latency-beatbump">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-beatbump" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_frontend__">Frontend</h4>
- <select id="youtubeMusic-frontend">
- <option value="beatbump">Beatbump</option>
- <option value="hyperpipe">Hyperpipe</option>
- </select>
+ <input class="custom-instance" placeholder="http://beatbump.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="beatbump">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://beatbump.org" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-beatbump-label" for="latency-beatbump">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-beatbump" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://beatbump.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://beatbump.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://beatbump.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://beatbump.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="hyperpipe">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://hyperpipe.org" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-hyperpipe-label" for="latency-hyperpipe">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-hyperpipe" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://hyperpipe.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://hyperpipe.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://hyperpipe.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- </div>
- <script type="module" src="./widgets/youtubeMusic.js"></script>
- </section>
- <section class="option-block" id="twitter_page">
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_twitter__">Twitter</h1>
+ <input class="custom-instance" placeholder="http://beatbump.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+ <div id="hyperpipe">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="twitter-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://hyperpipe.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-hyperpipe-label" for="latency-hyperpipe">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-hyperpipe" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_redirectType__">Redirect Type</h4>
- <select id="twitter-redirect_type">
- <option value="both" data-localise="__MSG_both__">both</option>
- <option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
- </select>
+ <input class="custom-instance" placeholder="http://hyperpipe.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="nitter">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://nitter.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-nitter-label" for="latency-nitter">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-nitter" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://nitter.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://nitter.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://nitter.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- </div>
- <script type="module" src="./widgets/twitter.js"></script>
- </section>
- <section class="option-block" id="instagram_page">
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_instagram__">Instagram</h1>
+ <input class="custom-instance" placeholder="http://hyperpipe.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="instagram-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://hyperpipe.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="bibliogram">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://bibliogram.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-bibliogram-label" for="latency-bibliogram">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-bibliogram" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://bibliogram.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://bibliogram.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://bibliogram.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- </div>
- <script type="module" src="./widgets/instagram.js"></script>
- </section>
- <section class="option-block" id="tiktok_page">
+
+ </div>
+
+</section>
+<section class="option-block" id="twitter_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_twitter__">Twitter</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="twitter-enabled" type="checkbox">
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_redirectType__">Redirect Type</h4>
+ <select id="twitter-redirectType">
+ <option value="both" data-localise="__MSG_both__">both</option>
+ <option value="sub_frame" data-localise="__MSG_onlyEmbedded__">Only Embedded</option>
+ <option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
+ </select>
+ </div>
+ <hr>
+ <div id="nitter">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_tiktok__">TikTok</h1>
+ <input class="custom-instance" placeholder="http://nitter.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-nitter-label" for="latency-nitter">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-nitter" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="tiktok-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://nitter.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="proxiTok">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://proxitok.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-proxiTok-label" for="latency-proxiTok">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-proxiTok" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://proxitok.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://proxitok.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://proxitok.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- </div>
- <script type="module" src="./widgets/tiktok.js"></script>
- </section>
- <section class="option-block" id="reddit_page">
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_reddit__">Reddit</h1>
+ <input class="custom-instance" placeholder="http://nitter.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="reddit-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://nitter.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="instagram_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_instagram__">Instagram</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="instagram-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="bibliogram">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 id="frontend" data-localise="__MSG_frontend__">Frontend</h4>
- <select id="reddit-frontend">
- <option value="libreddit">Libreddit</option>
- <option value="teddit">Teddit</option>
- </select>
+ <input class="custom-instance" placeholder="http://bibliogram.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="libreddit">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://libreddit.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-libreddit-label" for="latency-libreddit">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-libreddit" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://libreddit.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://libreddit.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://libreddit.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-bibliogram-label" for="latency-bibliogram">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-bibliogram" style="display:none;">
+ </div>
</div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://bibliogram.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="teddit">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://teddit.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-teddit-label" for="latency-teddit">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-teddit" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://teddit.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://teddit.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://teddit.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- </div>
- <script type="module" src="./widgets/reddit.js"></script>
- </section>
- <section class="option-block" id="imgur_page">
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_imgur__">Imgur</h1>
+ <input class="custom-instance" placeholder="http://bibliogram.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="imgur-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://bibliogram.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="rimgo">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://rimgo.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-rimgo-label" for="latency-rimgo">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-rimgo" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://rimgo.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://rimgo.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://rimgo.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- </div>
- <script type="module" src="./widgets/imgur.js"></script>
- </section>
- <section class="option-block" id="wikipedia_page">
+
+ </div>
+
+</section>
+<section class="option-block" id="tiktok_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_tiktok__">TikTok</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="tiktok-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="proxiTok">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_wikipedia__">Wikipedia</h1>
+ <input class="custom-instance" placeholder="http://proxiTok.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-proxiTok-label" for="latency-proxiTok">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-proxiTok" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="wikipedia-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://proxiTok.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="wikiless">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://wikiless.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-wikiless-label" for="latency-wikiless">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-wikiless" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://wikiless.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://wikiless.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://wikiless.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://proxiTok.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/wikipedia.js"></script>
- </section>
- <section class="option-block" id="medium_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_medium__">Medium</h1>
+ <input class="custom-instance" placeholder="http://proxiTok.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="reddit_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_reddit__">Reddit</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="reddit-enabled" type="checkbox">
+ </div>
+
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="reddit-frontend">
+ <option value="libreddit">Libreddit</option>
+ <option value="teddit">Teddit</option>
+
+ </select>
+ </div>
<hr>
+ <div id="libreddit">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="medium-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://libreddit.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="scribe">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://scribe.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-scribe-label" for="latency-scribe">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-scribe" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-libreddit-label" for="latency-libreddit">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-libreddit" style="display:none;">
+ </div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://scribe.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://libreddit.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://scribe.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://libreddit.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://scribe.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://libreddit.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+
+ </div>
+ <div id="teddit">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://teddit.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/medium.js"></script>
- </section>
- <section class="option-block" id="quora_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-teddit-label" for="latency-teddit">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-teddit" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1>Quora</h1>
+ <input class="custom-instance" placeholder="http://teddit.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="quora-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://teddit.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="quetre">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://quetre.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-quetre-label" for="latency-quetre">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-quetre" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://quetre.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://teddit.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://quetre.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+
+ </div>
+
+</section>
+<section class="option-block" id="imgur_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_imgur__">Imgur</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="imgur-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="rimgo">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://rimgo.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-rimgo-label" for="latency-rimgo">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-rimgo" style="display:none;">
+ </div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://quetre.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://rimgo.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://rimgo.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/quora.js"></script>
- </section>
- <section class="option-block" id="imdb_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1>IMDb</h1>
+ <input class="custom-instance" placeholder="http://rimgo.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="wikipedia_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_wikipedia__">Wikipedia</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="wikipedia-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="wikiless">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="imdb-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://wikiless.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="libremdb">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://libremdb.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-libremdb-label" for="latency-libremdb">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-libremdb" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-wikiless-label" for="latency-wikiless">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-wikiless" style="display:none;">
+ </div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://libremdb.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://wikiless.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://libremdb.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://wikiless.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://libremdb.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://wikiless.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+
+ </div>
+
+</section>
+<section class="option-block" id="medium_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_medium__">Medium</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="medium-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="scribe">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://scribe.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/imdb.js"></script>
- </section>
- <section class="option-block" id="reuters_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-scribe-label" for="latency-scribe">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-scribe" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1>Reuters</h1>
+ <input class="custom-instance" placeholder="http://scribe.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="reuters-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://scribe.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="neuters">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://neuters.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-neuters-label" for="latency-neuters">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-neuters" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://neuters.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://scribe.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://neuters.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+
+ </div>
+
+</section>
+<section class="option-block" id="quora_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_quora__">Quora</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="quora-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="quetre">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://quetre.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-quetre-label" for="latency-quetre">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-quetre" style="display:none;">
+ </div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://neuters.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://quetre.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://quetre.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/reuters.js"></script>
- </section>
- <section class="option-block" id="peertube_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_peertube__">PeerTube</h1>
+ <input class="custom-instance" placeholder="http://quetre.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="imdb_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_imdb__">IMDb</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="imdb-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="libremdb">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="peertube-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://libremdb.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="simpleertube">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://simpleertube.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-simpleertube-label" for="latency-simpleertube">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-simpleertube" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-libremdb-label" for="latency-libremdb">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-libremdb" style="display:none;">
+ </div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://simpleertube.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://libremdb.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://simpleertube.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://libremdb.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://simpleertube.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://libremdb.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+
+ </div>
+
+</section>
+<section class="option-block" id="reuters_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_reuters__">Reuters</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="reuters-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="neuters">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://neuters.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/peertube.js"></script>
- </section>
- <section class="option-block" id="lbry_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-neuters-label" for="latency-neuters">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-neuters" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_lbry__">LBRY</h1>
+ <input class="custom-instance" placeholder="http://neuters.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="lbry-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://neuters.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_frontend__">Frontend</h4>
- <select id="lbry-frontend">
- <option value="librarian">Librarian</option>
- <option value="lbryDesktop" data-localise="__MSG_lbryDesktop__">LBRY Desktop</option>
- </select>
+ <input class="custom-instance" placeholder="http://neuters.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="peertube_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_peertube__">PeerTube</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="peertube-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="simpleertube">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_redirectType__">Redirect Type</h4>
- <select id="lbry-redirect_type">
- <option value="both" data-localise="__MSG_both__">both</option>
- <option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
- </select>
+ <input class="custom-instance" placeholder="http://simpleertube.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="librarian">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://librarian.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-librarian-label" for="latency-librarian">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-librarian" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-simpleertube-label" for="latency-simpleertube">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-simpleertube" style="display:none;">
+ </div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://librarian.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://simpleertube.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://librarian.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://simpleertube.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://librarian.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://simpleertube.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+
+ </div>
+
+</section>
+<section class="option-block" id="lbry_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_lbry__">LBRY</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="lbry-enabled" type="checkbox">
+ </div>
+
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="lbry-frontend">
+ <option value="librarian">Librarian</option>
+ <option value="lbryDesktop">LBRY Desktop</option>
+
+ </select>
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_embed_frontend__">Embed Frontend</h4>
+ <select id="lbry-embedFrontend">
+ <option value="librarian">Librarian</option>
+
+ </select>
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_redirectType__">Redirect Type</h4>
+ <select id="lbry-redirectType">
+ <option value="both" data-localise="__MSG_both__">both</option>
+ <option value="sub_frame" data-localise="__MSG_onlyEmbedded__">Only Embedded</option>
+ <option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
+ </select>
+ </div>
+ <hr>
+ <div id="librarian">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://librarian.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/lbry.js"></script>
- </section>
- <section class="option-block" id="search_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-librarian-label" for="latency-librarian">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-librarian" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_search__">Search</h1>
+ <input class="custom-instance" placeholder="http://librarian.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="search-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://librarian.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_frontend__">Frontend</h4>
- <select id="search-frontend">
- <option value="searxng">SearXNG</option>
+ <input class="custom-instance" placeholder="http://librarian.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="search_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_search__">Search</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="search-enabled" type="checkbox">
+ </div>
+
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="search-frontend">
<option value="searx">SearX</option>
+ <option value="searxng">SearXNG</option>
<option value="whoogle">Whoogle</option>
<option value="librex">LibreX</option>
- </select>
- </div>
- <div class="some-block">
- <h4 data-localise="__MSG_searchNote__">Note: To use Search, make LibRedirect the Default Search Engine</h4>
+
+ </select>
+ </div>
+ <hr>
+ <div id="searx">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searx.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="searx">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://searx.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-searx-label" for="latency-searx">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-searx" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://searx.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-searx-label" for="latency-searx">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-searx" style="display:none;">
+ </div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://searx.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://searx.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searx.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searx.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="searxng">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://searxng.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-searxng-label" for="latency-searxng">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-searxng" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://searxng.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searx.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://searxng.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+
+ </div>
+ <div id="searxng">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searxng.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-searxng-label" for="latency-searxng">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-searxng" style="display:none;">
+ </div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://searxng.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searxng.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searxng.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="whoogle">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://whoogle.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-whoogle-label" for="latency-whoogle">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-whoogle" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://whoogle.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://searxng.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://whoogle.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+
+ </div>
+ <div id="whoogle">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://whoogle.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-whoogle-label" for="latency-whoogle">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-whoogle" style="display:none;">
+ </div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://whoogle.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://whoogle.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://whoogle.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="librex">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://librex.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-librex-label" for="latency-librex">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-librex" style="display:none;">
- </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://librex.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://whoogle.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://librex.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+
+ </div>
+ <div id="librex">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://librex.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-librex-label" for="latency-librex">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-librex" style="display:none;">
+ </div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://librex.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://librex.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://librex.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/search.js"></script>
- </section>
- <section class="option-block" id="translate_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_translate__">Translate</h1>
+ <input class="custom-instance" placeholder="http://librex.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="translate_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_translate__">Translate</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="translate-enabled" type="checkbox">
+ </div>
+
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="translate-frontend">
+ <option value="simplyTranslate">SimplyTranslate</option>
+ <option value="lingva">Lingva Translate</option>
+
+ </select>
+ </div>
<hr>
+ <div id="simplyTranslate">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="translate-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://simplyTranslate.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-simplyTranslate-label" for="latency-simplyTranslate">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-simplyTranslate" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_frontend__">Frontend</h4>
- <select id="translate-frontend">
- <option value="simplyTranslate">SimplyTranslate</option>
- <option value="lingva">Lingva</option>
- </select>
+ <input class="custom-instance" placeholder="http://simplyTranslate.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
- <div id="simplyTranslate">
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://simplytranslate.org" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-simplyTranslate-label" for="latency-simplyTranslate">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-simplyTranslate" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://hxecvvetgrznmprg.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://simplytranslate.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://simplytranslate.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://simplyTranslate.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="lingva">
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://lingvatranslate.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-lingva-label" for="latency-lingva">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-lingva" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://lingvatranslate.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://lingvatranslate.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://lingvatranslate.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- </div>
- <script type="module" src="./widgets/translate.js"></script>
- </section>
- <section class="option-block" id="maps_page">
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_maps__">Maps</h1>
+ <input class="custom-instance" placeholder="http://simplyTranslate.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+ <div id="lingva">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="maps-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://lingva.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-lingva-label" for="latency-lingva">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-lingva" style="display:none;">
+ </div>
+ </div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_frontend__">Frontend</h4>
- <select id="maps-frontend">
- <option value="osm">OpenStreetMap</option>
- <option value="facil">Facil Map</option>
- </select>
+ <input class="custom-instance" placeholder="http://lingva.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="facil">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://facilmap.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-facil-label" for="latency-facil">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-facil" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://facilmap.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://facilmap.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://facilmap.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://lingva.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/maps.js"></script>
- </section>
- <section class="option-block" id="sendTargets_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_sendFiles__">Send Files</h1>
+ <input class="custom-instance" placeholder="http://lingva.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+<section class="option-block" id="maps_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_maps__">Maps</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="maps-enabled" type="checkbox">
+ </div>
+
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="maps-frontend">
+ <option value="facil">FacilMap</option>
+ <option value="osm">OpenStreetMap</option>
+
+ </select>
+ </div>
<hr>
+ <div id="facil">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h4 data-localise="__MSG_enable__">Enable</h4>
- <input id="sendTargets-enable" type="checkbox">
+ <input class="custom-instance" placeholder="http://facil.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <div id="send">
- <hr>
- <div class="normal">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="https://send.com" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- <div class="buttons buttons-inline">
- <label class="button button-inline" id="latency-send-label" for="latency-send">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
- </svg>&nbsp;
- <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
- </label>
- <input class="button button-inline" id="latency-send" style="display:none;">
- </div>
- </div>
- <div class="tor">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://send.onion" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-facil-label" for="latency-facil">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-facil" style="display:none;">
+ </div>
</div>
- <div class="i2p">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://send.i2p" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
- </div>
- <div class="loki">
- <div class="some-block option-block">
- <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
- </div>
- <div class="checklist"></div>
- <hr>
- <div class="some-block option-block">
- <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
- </div>
- <form class="custom-instance-form">
- <div class="some-block option-block">
- <input class="custom-instance" placeholder="http://send.loki" type="url">
- <button class="add add-instance" type="submit">
- <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
- <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
- </svg>
- </button>
- </div>
- </form>
- <div class="checklist custom-checklist"></div>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://facil.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://facil.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <script type="module" src="./widgets/sendTargets.js"></script>
- </section>
- <section class="option-block" id="about_page">
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
<div class="some-block option-block">
- <h1 data-localise="__MSG_about__">About</h1>
+ <input class="custom-instance" placeholder="http://facil.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- <hr>
- <div class="about">
- <div class="some-block option-block">
- <h4>Donate: ♥️</h4>
- <h4><a href='https://libredirect.github.io/donate'>https://libredirect.github.io/donate</a> </h4>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="some-block option-block">
- <h4>FAQ:</h4>
- <h4><a href='https://libredirect.github.io/faq'>https://libredirect.github.io/faq</a></h4>
+
+ </div>
+
+</section>
+<section class="option-block" id="sendFiles_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_sendFiles__">Send Files</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="sendFiles-enabled" type="checkbox">
+ </div>
+ <hr>
+ <div id="send">
+ <div class="clearnet">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://send.org" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-send-label" for="latency-send">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-send" style="display:none;">
+ </div>
</div>
- <div class="some-block option-block">
- <h4>Docs:</h4>
- <h4><a href='https://libredirect.github.io/docs'>https://libredirect.github.io/docs</a></h4>
+ <div class="tor">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://send.onion" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
- <div class="some-block option-block">
- <h4>Source Code:</h4>
- <h4><a href='https://libredirect.github.io/source_code'>https://libredirect.github.io/source_code</a></h4>
+ <div class="i2p">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://send.i2p" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
</div>
+ <div class="loki">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://send.loki" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
</div>
- </section>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ </div>
+
+ </div>
+
+</section>
+
+<script type="module" src="./widgets/services.js"></script>
+ <section class="option-block" id="about_page">
+<div class="some-block option-block">
+ <h1 data-localise="__MSG_about__">About</h1>
+</div>
+<hr>
+<div class="about">
+ <div class="some-block option-block">
+ <h4>Donate: ♥️</h4>
+ <h4><a href='https://libredirect.codeberg.page/donate'>https://libredirect.codeberg.page/donate</a> </h4>
+ </div>
+ <div class="some-block option-block">
+ <h4>FAQ:</h4>
+ <h4><a href='https://libredirect.codeberg.page/faq'>https://libredirect.codeberg.page/faq</a></h4>
+ </div>
+ <div class="some-block option-block">
+ <h4>Docs:</h4>
+ <h4><a href='https://libredirect.codeberg.page/docs'>https://libredirect.codeberg.page/docs</a></h4>
+ </div>
+ <div class="some-block option-block">
+ <h4>Source Code:</h4>
+ <h4><a href='https://libredirect.codeberg.page/source_code'>https://libredirect.codeberg.page/source_code</a></h4>
+ </div>
+</div>
+</section>
</div>
</body>
<script type="module" src="./index.js"></script>
-</html> \ No newline at end of file
+</html>
diff --git a/src/pages/options/index.pug b/src/pages/options/index.pug
deleted file mode 100644
index 3711fdac..00000000
--- a/src/pages/options/index.pug
+++ /dev/null
@@ -1,36 +0,0 @@
-doctype html
-html#elementToShowWithJavaScript(lang="en")
- head
- meta(charset='utf-8')
- meta(name="viewport" content="width=device-width, initial-scale=1")
- link(rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg")
- link(href="../stylesheets/styles.css" rel="stylesheet")
- title General
-
- script(type="module" src="./init.js")
- body.option(dir="auto")
- include ../widgets/links.pug
- +links('general')
- div#pages
- include ./widgets/general.pug
- include ./widgets/youtube.pug
- include ./widgets/youtubeMusic.pug
- include ./widgets/twitter.pug
- include ./widgets/instagram.pug
- include ./widgets/tiktok.pug
- include ./widgets/reddit.pug
- include ./widgets/imgur.pug
- include ./widgets/wikipedia.pug
- include ./widgets/medium.pug
- include ./widgets/quora.pug
- include ./widgets/imdb.pug
- include ./widgets/reuters.pug
- include ./widgets/peertube.pug
- include ./widgets/lbry.pug
- include ./widgets/search.pug
- include ./widgets/translate.pug
- include ./widgets/maps.pug
- include ./widgets/sendTargets.pug
- include ./widgets/about.pug
-
- script(type="module" src="./index.js")
diff --git a/src/pages/options/init.js b/src/pages/options/init.js
index 5b679da4..cac23748 100644
--- a/src/pages/options/init.js
+++ b/src/pages/options/init.js
@@ -4,8 +4,8 @@ import localise from "../../assets/javascripts/localise.js"
function changeTheme() {
return new Promise(resolve => {
- browser.storage.local.get("theme", r => {
- switch (r.theme) {
+ browser.storage.local.get("options", r => {
+ switch (r.options.theme) {
case "dark":
document.body.classList.add("dark-theme")
document.body.classList.remove("light-theme")
diff --git a/src/pages/options/widgets/about.ejs b/src/pages/options/widgets/about.ejs
new file mode 100644
index 00000000..63c5b027
--- /dev/null
+++ b/src/pages/options/widgets/about.ejs
@@ -0,0 +1,24 @@
+<section class="option-block" id="about_page">
+<div class="some-block option-block">
+ <h1 data-localise="__MSG_about__">About</h1>
+</div>
+<hr>
+<div class="about">
+ <div class="some-block option-block">
+ <h4>Donate: ♥️</h4>
+ <h4><a href='https://libredirect.codeberg.page/donate'>https://libredirect.codeberg.page/donate</a> </h4>
+ </div>
+ <div class="some-block option-block">
+ <h4>FAQ:</h4>
+ <h4><a href='https://libredirect.codeberg.page/faq'>https://libredirect.codeberg.page/faq</a></h4>
+ </div>
+ <div class="some-block option-block">
+ <h4>Docs:</h4>
+ <h4><a href='https://libredirect.codeberg.page/docs'>https://libredirect.codeberg.page/docs</a></h4>
+ </div>
+ <div class="some-block option-block">
+ <h4>Source Code:</h4>
+ <h4><a href='https://libredirect.codeberg.page/source_code'>https://libredirect.codeberg.page/source_code</a></h4>
+ </div>
+</div>
+</section>
diff --git a/src/pages/options/widgets/about.pug b/src/pages/options/widgets/about.pug
deleted file mode 100644
index 954522bb..00000000
--- a/src/pages/options/widgets/about.pug
+++ /dev/null
@@ -1,17 +0,0 @@
-section#about_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_about__") About
- hr
- .about
- .some-block.option-block
- h4 Donate: ♥️
- h4 <a href='https://libredirect.github.io/donate'>https://libredirect.github.io/donate</a>
- .some-block.option-block
- h4 FAQ:
- h4 <a href='https://libredirect.github.io/faq'>https://libredirect.github.io/faq</a>
- .some-block.option-block
- h4 Docs:
- h4 <a href='https://libredirect.github.io/docs'>https://libredirect.github.io/docs</a>
- .some-block.option-block
- h4 Source Code:
- h4 <a href='https://libredirect.github.io/source_code'>https://libredirect.github.io/source_code</a> \ No newline at end of file
diff --git a/src/pages/options/widgets/general.ejs b/src/pages/options/widgets/general.ejs
new file mode 100644
index 00000000..e24046db
--- /dev/null
+++ b/src/pages/options/widgets/general.ejs
@@ -0,0 +1,102 @@
+<section class="option-block" id="general_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_general__">General</h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_theme__">Theme</h4>
+ <select id="theme">
+ <option value="detect" data-localise="__MSG_detect__">Detect</option>
+ <option value="light" data-localise="__MSG_light__">Light</option>
+ <option value="dark" data-localise="__MSG_dark__">Dark</option>
+ </select>
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_network__">Network</h4>
+ <select id="network">
+ <% for (const network in config.networks) { -%>
+<option value="<%= network %>"><%= config.networks[network].name %></option>
+ <% }; %>
+</select>
+ </div>
+ <div id="network-fallback">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_networkFallback__">Fallback to clearnet if no instances are available for the current network</h4>
+ <input id="network-fallback-checkbox" type="checkbox">
+ </div>
+ </div>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_autoRedirect__"></h4>
+ <input id="auto-redirect" type="checkbox">
+ </div>
+ <form>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_latencyThreshold">Latency Threshold</h4>
+ <output id="latency-output" for="latencyInput" name="latencyOutput"></output>
+ <input id="latency-input" type="range" min="50" max="5000" value="1000" name="latencyInput" step="50">
+ </div>
+ </form>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_exceptions__"></h4>
+ </div>
+ <form id="custom-exceptions-instance-form">
+ <div class="some-block option-block">
+ <div class="some-block" style="padding:0;">
+ <input id="exceptions-custom-instance" placeholder="https://www.google.com" type="url">&nbsp;
+ <select id="exceptions-custom-instance-type">
+ <option value="url">URL</option>
+ <option value="regex">Regex</option>
+ </select>&nbsp;
+ </div>
+ <button class="add" id="exceptions-add-instance" type="submit">
+ <svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist" id="exceptions-custom-checklist"></div>
+ <div class="buttons buttons-inline"><a class="button button-inline" id="update-instances">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"></path>
+ </svg>
+ <x data-localise="__MSG_updateInstances__">Update Instances</x></a>&nbsp; &nbsp;</div>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="import_settings_text" for="import-settings">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_importSettings__">Import Settings</x>
+ </label>
+ <input class="button button-inline" id="import-settings" type="file" style="display:none;">&nbsp; &nbsp;<a class="button button-inline" id="export-settings">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_exportSettings__">Export Settings</x></a>&nbsp; &nbsp;<a class="button button-inline" id="reset-settings">
+ <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M12,5V2L8,6l4,4V7c3.31,0,6,2.69,6,6c0,2.97-2.17,5.43-5,5.91v2.02c3.95-0.49,7-3.85,7-7.93C20,8.58,16.42,5,12,5z"></path>
+ <path d="M6,13c0-1.65,0.67-3.15,1.76-4.24L6.34,7.34C4.9,8.79,4,10.79,4,13c0,4.08,3.05,7.44,7,7.93v-2.02 C8.17,18.43,6,15.97,6,13z"></path>
+ </svg>
+ <x data-localise="__MSG_resetSettings__">Reset Settings</x></a>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customPopup__">Customize Popup</h4>
+ </div>
+ <div class="checklist-popup" id="popup-frontends-checklist">
+ <% for (const service in config.services) { -%>
+<div>
+ <div>
+ <% if (config.services[service].imageType != "svgMono") { _%>
+ <img src="../../../assets/images/<%= service %>-icon.<%= config.services[service].imageType %>">
+ <% } else { _%>
+ <%- include ('src/assets/images/' + service + '-icon.svg') %>
+ <% } _%>
+ <label data-localise="__MSG_<%= service %>__" for="<%= service %>"><%= config.services[service].name %></label>
+ </div>
+ <input id="<%= service %>" type="checkbox">
+ </div>
+ <% }; %>
+</div>
+ <script type="module" src="./widgets/general.js"></script>
+</section>
diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js
index 61b422f4..cba46de2 100644
--- a/src/pages/options/widgets/general.js
+++ b/src/pages/options/widgets/general.js
@@ -3,25 +3,7 @@ window.browser = window.browser || window.chrome
import utils from "../../../assets/javascripts/utils.js"
import generalHelper from "../../../assets/javascripts/general.js"
-
-import youtubeHelper from "../../../assets/javascripts/youtube/youtube.js"
-import youtubeMusicHelper from "../../../assets/javascripts/youtubeMusic.js"
-import twitterHelper from "../../../assets/javascripts/twitter.js"
-import instagramHelper from "../../../assets/javascripts/instagram.js"
-import redditHelper from "../../../assets/javascripts/reddit.js"
-import searchHelper from "../../../assets/javascripts/search.js"
-import translateHelper from "../../../assets/javascripts/translate/translate.js"
-import mapsHelper from "../../../assets/javascripts/maps.js"
-import wikipediaHelper from "../../../assets/javascripts/wikipedia.js"
-import mediumHelper from "../../../assets/javascripts/medium.js"
-import quoraHelper from "../../../assets/javascripts/quora.js"
-import libremdbHelper from "../../../assets/javascripts/imdb.js"
-import reutersHelper from "../../../assets/javascripts/reuters.js"
-import imgurHelper from "../../../assets/javascripts/imgur.js"
-import tiktokHelper from "../../../assets/javascripts/tiktok.js"
-import sendTargetsHelper from "../../../assets/javascripts/sendTargets.js"
-import peertubeHelper from "../../../assets/javascripts/peertube.js"
-import lbryHelper from "../../../assets/javascripts/lbry.js"
+import servicesHelper from "../../../assets/javascripts/services.js"
let updateInstancesElement = document.getElementById("update-instances")
updateInstancesElement.addEventListener("click", async () => {
@@ -33,12 +15,46 @@ updateInstancesElement.addEventListener("click", async () => {
} else updateInstancesElement.innerHTML = "Failed Miserabely"
})
+let config
+
+async function getConfig() {
+ return new Promise(resolve => {
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(data => {
+ config = JSON.parse(data)
+ resolve()
+ })
+ })
+}
+
+function setOption(option, type, event) {
+ browser.storage.local.get("options", r => {
+ let options = r.options
+ browser.storage.local.set({ options })
+ })
+
+ browser.storage.local.get("options", r => {
+ let options = r.options
+ if (type == "select") {
+ options[option] = event.target.options[event.target.options.selectedIndex].value
+ } else if (type == "checkbox") {
+ options[option] = event.target.checked
+ } else if (type == "range") {
+ options[option] = event.target.value
+ }
+
+ browser.storage.local.set({ options })
+ })
+}
+
let exportSettingsElement = document.getElementById("export-settings")
function exportSettings() {
- return browser.storage.local.get(null, result => {
- let resultString = JSON.stringify(result, null, " ")
- exportSettingsElement.href = "data:application/json;base64," + btoa(encodeURI(resultString))
+ browser.storage.local.get("options", result => {
+ result.options.version = browser.runtime.getManifest().version
+ let resultString = JSON.stringify(result.options, null, " ")
+ exportSettingsElement.href = "data:application/json;base64," + btoa(resultString)
exportSettingsElement.download = "libredirect-settings.json"
return
})
@@ -57,7 +73,22 @@ importSettingsElement.addEventListener("change", () => {
reader.onload = async () => {
const data = JSON.parse(reader.result)
if ("theme" in data && "disableImgur" in data && "imgurRedirects" in data) {
- browser.storage.local.clear(() => browser.storage.local.set({ ...data }, () => location.reload()))
+ browser.storage.local.clear(() =>
+ browser.storage.local.set({ ...data }, () => {
+ fetch("/instances/blacklist.json")
+ .then(response => response.text())
+ .then(async data => {
+ browser.storage.local.set({ blacklists: JSON.parse(data) }, async () => {
+ await generalHelper.initDefaults()
+ await servicesHelper.initDefaults()
+ await servicesHelper.upgradeOptions()
+ location.reload()
+ })
+ })
+ })
+ )
+ } else if ("version" in data) {
+ browser.storage.local.clear(() => browser.storage.local.set({ options: data }, () => location.reload()))
} else {
console.log("incompatible settings")
importError()
@@ -81,31 +112,10 @@ resetSettings.addEventListener("click", async () => {
fetch("/instances/blacklist.json")
.then(response => response.text())
.then(async data => {
- browser.storage.local.set({ cloudflareBlackList: JSON.parse(data).cloudflare }, () => {
- browser.storage.local.set({ offlineBlackList: JSON.parse(data).offline }, () => {
- browser.storage.local.set({ authenticateBlackList: JSON.parse(data).authenticate }, async () => {
- await generalHelper.initDefaults()
- await youtubeHelper.initDefaults()
- await youtubeMusicHelper.initDefaults()
- await twitterHelper.initDefaults()
- await instagramHelper.initDefaults()
- await mapsHelper.initDefaults()
- await searchHelper.initDefaults()
- await translateHelper.initDefaults()
- await mediumHelper.initDefaults()
- await quoraHelper.initDefaults()
- await libremdbHelper.initDefaults()
- await reutersHelper.initDefaults()
- await redditHelper.initDefaults()
- await wikipediaHelper.initDefaults()
- await imgurHelper.initDefaults()
- await tiktokHelper.initDefaults()
- await sendTargetsHelper.initDefaults()
- await peertubeHelper.initDefaults()
- await lbryHelper.initDefaults()
- location.reload()
- })
- })
+ browser.storage.local.set({ blacklists: JSON.parse(data) }, async () => {
+ await generalHelper.initDefaults()
+ await servicesHelper.initDefaults()
+ location.reload()
})
})
})
@@ -113,32 +123,30 @@ resetSettings.addEventListener("click", async () => {
let autoRedirectElement = document.getElementById("auto-redirect")
autoRedirectElement.addEventListener("change", event => {
- browser.storage.local.set({ autoRedirect: event.target.checked })
+ setOption("autoRedirect", "checkbox", event)
})
let themeElement = document.getElementById("theme")
themeElement.addEventListener("change", event => {
- const value = event.target.options[theme.selectedIndex].value
- browser.storage.local.set({ theme: value })
+ setOption("theme", "select", event)
location.reload()
})
-let protocolElement = document.getElementById("protocol")
-protocolElement.addEventListener("change", event => {
- const value = event.target.options[protocol.selectedIndex].value
- browser.storage.local.set({ protocol: value })
+let networkElement = document.getElementById("network")
+networkElement.addEventListener("change", event => {
+ setOption("network", "select", event)
location.reload()
})
-let protocolFallbackCheckbox = document.getElementById("protocol-fallback-checkbox")
-protocolFallbackCheckbox.addEventListener("change", event => {
- browser.storage.local.set({ protocolFallback: event.target.checked })
+let networkFallbackCheckbox = document.getElementById("network-fallback-checkbox")
+networkFallbackCheckbox.addEventListener("change", event => {
+ setOption("networkFallback", "checkbox", event)
})
let latencyOutput = document.getElementById("latency-output")
let latencyInput = document.getElementById("latency-input")
latencyInput.addEventListener("change", event => {
- browser.storage.local.set({ latencyThreshold: event.target.value })
+ setOption("latencyThreshold", "range", event)
})
latencyInput.addEventListener("input", event => {
latencyOutput.value = event.target.value
@@ -148,60 +156,55 @@ let nameCustomInstanceInput = document.getElementById("exceptions-custom-instanc
let instanceTypeElement = document.getElementById("exceptions-custom-instance-type")
let instanceType = "url"
-let popupFrontends
-for (const frontend of generalHelper.allPopupFrontends)
- document.getElementById(frontend).addEventListener("change", event => {
- if (event.target.checked && !popupFrontends.includes(frontend)) popupFrontends.push(frontend)
- else if (popupFrontends.includes(frontend)) {
- var index = popupFrontends.indexOf(frontend)
- if (index !== -1) popupFrontends.splice(index, 1)
- }
- browser.storage.local.set({ popupFrontends })
- })
+await getConfig()
+for (const service in config.services) {
+ document.getElementById(service).addEventListener("change", event => {
+ browser.storage.local.get("options", r => {
+ let options = r.options
+ if (event.target.checked && !options.popupServices.includes(service)) options.popupServices.push(service)
+ else if (options.popupServices.includes(service)) {
+ var index = options.popupServices.indexOf(service)
+ if (index !== -1) options.popupServices.splice(index, 1)
+ }
+ browser.storage.local.set({ options })
+ })
+ })
+}
// const firstPartyIsolate = document.getElementById('firstPartyIsolate');
// firstPartyIsolate.addEventListener("change", () => browser.storage.local.set({ firstPartyIsolate: firstPartyIsolate.checked }))
-browser.storage.local.get(
- [
- "theme",
- "autoRedirect",
- "exceptions",
- "protocol",
- "protocolFallback",
- "latencyThreshold",
- // 'firstPartyIsolate'
- ],
- r => {
- autoRedirectElement.checked = r.autoRedirect
- themeElement.value = r.theme
- protocolElement.value = r.protocol
- protocolFallbackCheckbox.checked = r.protocolFallback
- latencyOutput.value = r.latencyThreshold
- // firstPartyIsolate.checked = r.firstPartyIsolate;
+browser.storage.local.get("options", r => {
+ autoRedirectElement.checked = r.options.autoRedirect
+ themeElement.value = r.options.theme
+ networkElement.value = r.options.network
+ networkFallbackCheckbox.checked = r.options.networkFallback
+ latencyOutput.value = r.options.latencyThreshold
+ let options = r.options
+ // firstPartyIsolate.checked = r.firstPartyIsolate;
- let protocolFallbackElement = document.getElementById("protocol-fallback")
- if (protocolElement.value == "normal") {
- protocolFallbackElement.style.display = "none"
- } else {
- protocolFallbackElement.style.display = "block"
- }
+ //let networkFallbackElement = document.getElementById("network-fallback")
+ if (networkElement.value == "clearnet") {
+ networkFallbackCheckbox.disabled = true
+ } else {
+ networkFallbackCheckbox.disabled = false
+ }
- instanceTypeElement.addEventListener("change", event => {
- instanceType = event.target.options[instanceTypeElement.selectedIndex].value
- if (instanceType == "url") {
- nameCustomInstanceInput.setAttribute("type", "url")
- nameCustomInstanceInput.setAttribute("placeholder", "https://www.google.com")
- } else if (instanceType == "regex") {
- nameCustomInstanceInput.setAttribute("type", "text")
- nameCustomInstanceInput.setAttribute("placeholder", "https?://(www.|)youtube.com/")
- }
- })
- let exceptionsCustomInstances = r.exceptions
- function calcExceptionsCustomInstances() {
- document.getElementById("exceptions-custom-checklist").innerHTML = [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]
- .map(
- x => `<div>
+ instanceTypeElement.addEventListener("change", event => {
+ instanceType = event.target.options[instanceTypeElement.selectedIndex].value
+ if (instanceType == "url") {
+ nameCustomInstanceInput.setAttribute("type", "url")
+ nameCustomInstanceInput.setAttribute("placeholder", "https://www.google.com")
+ } else if (instanceType == "regex") {
+ nameCustomInstanceInput.setAttribute("type", "text")
+ nameCustomInstanceInput.setAttribute("placeholder", "https?://(www.|)youtube.com/")
+ }
+ })
+ let exceptionsCustomInstances = r.options.exceptions
+ function calcExceptionsCustomInstances() {
+ document.getElementById("exceptions-custom-checklist").innerHTML = [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]
+ .map(
+ x => `<div>
${x}
<button class="add" id="clear-${x}">
<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px"
@@ -211,49 +214,47 @@ browser.storage.local.get(
</button>
</div>
<hr>`
- )
- .join("\n")
+ )
+ .join("\n")
- for (const x of [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]) {
- document.getElementById(`clear-${x}`).addEventListener("click", () => {
- console.log(x)
- let index
- index = exceptionsCustomInstances.url.indexOf(x)
- if (index > -1) exceptionsCustomInstances.url.splice(index, 1)
- else {
- index = exceptionsCustomInstances.regex.indexOf(x)
- if (index > -1) exceptionsCustomInstances.regex.splice(index, 1)
- }
- browser.storage.local.set({ exceptions: exceptionsCustomInstances })
- calcExceptionsCustomInstances()
- })
- }
+ for (const x of [...exceptionsCustomInstances.url, ...exceptionsCustomInstances.regex]) {
+ document.getElementById(`clear-${x}`).addEventListener("click", () => {
+ console.log(x)
+ let index
+ index = exceptionsCustomInstances.url.indexOf(x)
+ if (index > -1) exceptionsCustomInstances.url.splice(index, 1)
+ else {
+ index = exceptionsCustomInstances.regex.indexOf(x)
+ if (index > -1) exceptionsCustomInstances.regex.splice(index, 1)
+ }
+ options.exceptions = exceptionsCustomInstances
+ browser.storage.local.set({ options })
+ calcExceptionsCustomInstances()
+ })
}
- calcExceptionsCustomInstances()
- document.getElementById("custom-exceptions-instance-form").addEventListener("submit", event => {
- event.preventDefault()
+ }
+ calcExceptionsCustomInstances()
+ document.getElementById("custom-exceptions-instance-form").addEventListener("submit", event => {
+ event.preventDefault()
- let val
- if (instanceType == "url") {
- if (nameCustomInstanceInput.validity.valid) {
- let url = new URL(nameCustomInstanceInput.value)
- val = `${url.protocol}//${url.host}`
- if (!exceptionsCustomInstances.url.includes(val)) exceptionsCustomInstances.url.push(val)
- }
- } else if (instanceType == "regex") {
- val = nameCustomInstanceInput.value
- if (val.trim() != "" && !exceptionsCustomInstances.regex.includes(val)) exceptionsCustomInstances.regex.push(val)
- }
- if (val) {
- browser.storage.local.set({ exceptions: exceptionsCustomInstances })
- nameCustomInstanceInput.value = ""
+ let val
+ if (instanceType == "url") {
+ if (nameCustomInstanceInput.validity.valid) {
+ let url = new URL(nameCustomInstanceInput.value)
+ val = `${url.network}//${url.host}`
+ if (!exceptionsCustomInstances.url.includes(val)) exceptionsCustomInstances.url.push(val)
}
- calcExceptionsCustomInstances()
- })
+ } else if (instanceType == "regex") {
+ val = nameCustomInstanceInput.value
+ if (val.trim() != "" && !exceptionsCustomInstances.regex.includes(val)) exceptionsCustomInstances.regex.push(val)
+ }
+ if (val) {
+ options.exceptions = exceptionsCustomInstances
+ browser.storage.local.set({ options })
+ nameCustomInstanceInput.value = ""
+ }
+ calcExceptionsCustomInstances()
+ })
- browser.storage.local.get("popupFrontends", r => {
- popupFrontends = r.popupFrontends
- for (const frontend of generalHelper.allPopupFrontends) document.getElementById(frontend).checked = popupFrontends.includes(frontend)
- })
- }
-)
+ for (const service in config.services) document.getElementById(service).checked = options.popupServices.includes(service)
+})
diff --git a/src/pages/options/widgets/general.pug b/src/pages/options/widgets/general.pug
deleted file mode 100644
index 891217ca..00000000
--- a/src/pages/options/widgets/general.pug
+++ /dev/null
@@ -1,210 +0,0 @@
-section#general_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_general__") General
- hr
-
- .some-block.option-block
- h4(data-localise="__MSG_theme__") Theme
- select#theme
- option(value="DEFAULT" data-localise="__MSG_system__") System
- option(value="light" data-localise="__MSG_light__") Light
- option(value="dark" data-localise="__MSG_dark__") Dark
-
- //- .some-block.option-block
- h4 Tor Browser
- input#firstPartyIsolate(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_protocol__")
- select#protocol
- option(value="normal" data-localise="__MSG_normal__") Normal
- option(value="tor") Tor
- option(value="i2p") I2P
- option(value="loki") Lokinet
-
- #protocol-fallback
- .some-block.option-block
- h4(data-localise="__MSG_protocolFallback__") Fallback to normal if no instances are available for the current protocol
- input#protocol-fallback-checkbox(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_autoRedirect__")
- input#auto-redirect(type="checkbox")
-
- form
- .some-block.option-block
- h4(data-localise="__MSG_latencyThreshold") Latency Threshold
- output#latency-output(for="latencyInput" name="latencyOutput")
- input#latency-input(type="range" min="50" max="5000" value="1000" name="latencyInput" step="50")
-
- .some-block.option-block
- h4(data-localise="__MSG_exceptions__")
-
- form#custom-exceptions-instance-form
- .some-block.option-block
- .some-block(style="padding:0;")
- input#exceptions-custom-instance(placeholder="https://www.google.com" type="url")
- |&nbsp;
- select#exceptions-custom-instance-type
- option(value="url") URL
- option(value="regex") Regex
- |&nbsp;
- button#exceptions-add-instance.add(type="submit")
- svg(xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor")
- path(d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z")
-
- #exceptions-custom-checklist.checklist
-
- .buttons.buttons-inline
- a#update-instances.button.button-inline
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z")
- x(data-localise="__MSG_updateInstances__") Update Instances
-
- |&nbsp; &nbsp;
-
- .buttons.buttons-inline
-
- label#import_settings_text.button.button-inline(for="import-settings")
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z")
- |&nbsp;
- x(data-localise="__MSG_importSettings__") Import Settings
- input#import-settings.button.button-inline(type="file" style="display:none;")
-
- |&nbsp; &nbsp;
-
- a#export-settings.button.button-inline
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z")
- |&nbsp;
- x(data-localise="__MSG_exportSettings__") Export Settings
-
- |&nbsp; &nbsp;
-
- a#reset-settings.button.button-inline
- svg(xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M12,5V2L8,6l4,4V7c3.31,0,6,2.69,6,6c0,2.97-2.17,5.43-5,5.91v2.02c3.95-0.49,7-3.85,7-7.93C20,8.58,16.42,5,12,5z")
- path(d="M6,13c0-1.65,0.67-3.15,1.76-4.24L6.34,7.34C4.9,8.79,4,10.79,4,13c0,4.08,3.05,7.44,7,7.93v-2.02 C8.17,18.43,6,15.97,6,13z")
- x(data-localise="__MSG_resetSettings__") Reset Settings
- hr
-
- .some-block.option-block
- h4(data-localise="__MSG_customPopup__") Customize Popup
-
- #popup-frontends-checklist.checklist-popup
- div
- div
- img(src="../../../assets/images/youtube-icon.png")
- x(data-localise="__MSG_youtube__") YouTube
- input#youtube(type="checkbox")
- div
- div
- img(src="../../../assets/images/youtube-music-icon.png")
- x(data-localise="__MSG_ytmusic__") YoutubeMusic
- input#youtubeMusic(type="checkbox")
- div
- div
- img(src="../../../assets/images/twitter-icon.png")
- x(data-localise="__MSG_twitter__") Twitter
- input#twitter(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/instagram-icon.png")
- x(data-localise="__MSG_instagram__") Instagram
- input#instagram(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/tiktok-icon.png")
- x(data-localise="__MSG_tiktok__") TikTok
- input#tiktok(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/imgur.png")
- x(data-localise="__MSG_imgur__") Imgur
- input#imgur(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/reddit-icon.png")
- x(data-localise="__MSG_reddit__") Reddit
- input#reddit(type="checkbox")
-
- div
- div
- svg(xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor")
- path(d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z")
- x(data-localise="__MSG_search__") Search
- input#search(type="checkbox")
-
- div
- div
- svg(xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor")
- path(d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z")
- x(data-localise="__MSG_translate__") Translate
- input#translate(type="checkbox")
-
- div
- div
- svg(xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor")
- path(d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z")
- x(data-localise="__MSG_maps__") Maps
- input#maps(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/wikipedia-icon.svg")
- x(data-localise="__MSG_wikipedia__") Wikipedia
- input#wikipedia(type="checkbox")
-
- div
- div
- svg(xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor")
- circle(cx="500" cy="500" r="500")
- ellipse(ry="475" rx="250" cy="501" cx="1296")
- ellipse(cx="1682" cy="502" rx="88" ry="424")
- x(data-localise="__MSG_medium__") Medium
- input#medium(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/quora.png")
- x() Quora
- input#quora(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/imdb.svg")
- x IMDb
- input#imdb(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/reuters.svg")
- x Reuters
- input#reuters(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/peertube-icon.svg")
- x(data-localise="__MSG_peertube__") PeerTube
- input#peertube(type="checkbox")
-
- div
- div
- img(src="../../../assets/images/lbry-icon.png")
- x(data-localise="__MSG_lbry__") LBRY
- input#lbry(type="checkbox")
-
- div
- div
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z")
- x(data-localise="__MSG_sendFiles__") Send Files
- input#sendTargets(type="checkbox")
-
-
- script(type="module" src="./widgets/general.js")
diff --git a/src/pages/options/widgets/imdb.js b/src/pages/options/widgets/imdb.js
deleted file mode 100644
index 094c5672..00000000
--- a/src/pages/options/widgets/imdb.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("libremdb")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("imdb-enable")
-const imdb = document.getElementById("imdb_page")
-//const frontend = document.getElementById("imdb-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableImdb", "protocol"], r => {
- enable.checked = !r.disableImdb
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-imdb.addEventListener("change", () => {
- browser.storage.local.set({ disableImdb: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("imdb", frontends[i], protocols[x], document)
- }
- utils.latency("imdb", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/imdb.pug b/src/pages/options/widgets/imdb.pug
deleted file mode 100644
index 257d2c1a..00000000
--- a/src/pages/options/widgets/imdb.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#imdb_page.option-block
- .some-block.option-block
- h1() IMDb
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#imdb-enable(type="checkbox")
-
- #libremdb
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://libremdb.com')
- include ../../widgets/latency.pug
- +latency('libremdb')
- .tor
- include ../../widgets/instances.pug
- +instances('http://libremdb.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://libremdb.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://libremdb.loki')
-
- script(type="module" src="./widgets/imdb.js")
diff --git a/src/pages/options/widgets/imgur.js b/src/pages/options/widgets/imgur.js
deleted file mode 100644
index 236e809d..00000000
--- a/src/pages/options/widgets/imgur.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("rimgo")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("imgur-enable")
-const imgur = document.getElementById("imgur_page")
-//const frontend = document.getElementById("imgur-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableImgur", "protocol"], r => {
- enable.checked = !r.disableImgur
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-imgur.addEventListener("change", () => {
- browser.storage.local.set({ disableImgur: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("imgur", frontends[i], protocols[x], document)
- }
- utils.latency("imgur", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/imgur.pug b/src/pages/options/widgets/imgur.pug
deleted file mode 100644
index eacd066e..00000000
--- a/src/pages/options/widgets/imgur.pug
+++ /dev/null
@@ -1,27 +0,0 @@
-section#imgur_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_imgur__") Imgur
- hr
-
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#imgur-enable(type="checkbox")
-
- #rimgo
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://rimgo.com')
- include ../../widgets/latency.pug
- +latency('rimgo')
- .tor
- include ../../widgets/instances.pug
- +instances('http://rimgo.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://rimgo.onion')
- .loki
- include ../../widgets/instances.pug
- +instances('http://rimgo.loki')
-
- script(type="module" src="./widgets/imgur.js")
diff --git a/src/pages/options/widgets/instagram.js b/src/pages/options/widgets/instagram.js
deleted file mode 100644
index e22f720f..00000000
--- a/src/pages/options/widgets/instagram.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("bibliogram")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("instagram-enable")
-const instagram = document.getElementById("instagram_page")
-//const frontend = document.getElementById("instagram-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableInstagram", "protocol"], r => {
- enable.checked = !r.disableInstagram
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-instagram.addEventListener("change", () => {
- browser.storage.local.set({ disableInstagram: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("instagram", frontends[i], protocols[x], document)
- }
- utils.latency("instagram", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/instagram.pug b/src/pages/options/widgets/instagram.pug
deleted file mode 100644
index cc72f787..00000000
--- a/src/pages/options/widgets/instagram.pug
+++ /dev/null
@@ -1,27 +0,0 @@
-section#instagram_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_instagram__") Instagram
- hr
-
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#instagram-enable(type="checkbox")
-
- #bibliogram
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://bibliogram.com')
- include ../../widgets/latency.pug
- +latency('bibliogram')
- .tor
- include ../../widgets/instances.pug
- +instances('https://bibliogram.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://bibliogram.onion')
- .loki
- include ../../widgets/instances.pug
- +instances('http://bibliogram.loki')
-
- script(type="module" src="./widgets/instagram.js")
diff --git a/src/pages/options/widgets/lbry.js b/src/pages/options/widgets/lbry.js
deleted file mode 100644
index d50de843..00000000
--- a/src/pages/options/widgets/lbry.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-const frontends = new Array("librarian")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("lbry-enable")
-const lbry = document.getElementById("lbry_page")
-const redirectType = document.getElementById("lbry-redirect_type")
-const frontend = document.getElementById("lbry-frontend")
-let protocol
-
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = "block"
- } else {
- frontendDiv.style.display = "none"
- }
- }
-}
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableLbryTargets", "protocol", "lbryFrontend", "lbryRedirectType"], r => {
- enable.checked = !r.disableLbryTargets
- protocol = r.protocol
- redirectType.value = r.lbryRedirectType
- frontend.value = r.lbryFrontend
- changeFrontendsSettings()
- changeProtocolSettings()
-})
-
-lbry.addEventListener("change", () => {
- browser.storage.local.set({
- disableLbryTargets: !enable.checked,
- lbryRedirectType: redirectType.value,
- lbryFrontend: frontend.value,
- })
- changeFrontendsSettings()
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("lbryTargets", frontends[i], protocols[x], document)
- }
- utils.latency("lbryTargets", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/lbry.pug b/src/pages/options/widgets/lbry.pug
deleted file mode 100644
index 327c938b..00000000
--- a/src/pages/options/widgets/lbry.pug
+++ /dev/null
@@ -1,38 +0,0 @@
-section#lbry_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_lbry__") LBRY
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#lbry-enable(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_frontend__") Frontend
- select#lbry-frontend
- option(value="librarian") Librarian
- option(value="lbryDesktop" data-localise="__MSG_lbryDesktop__") LBRY Desktop
-
- .some-block.option-block
- h4(data-localise="__MSG_redirectType__") Redirect Type
- select#lbry-redirect_type
- option(value="both" data-localise="__MSG_both__") both
- option(value="main_frame" data-localise="__MSG_onlyNotEmbedded__") Only Not Embedded
-
- #librarian
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://librarian.com')
- include ../../widgets/latency.pug
- +latency('librarian')
- .tor
- include ../../widgets/instances.pug
- +instances('https://librarian.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://librarian.onion')
- .loki
- include ../../widgets/instances.pug
- +instances('http://librarian.loki')
-
- script(type="module" src="./widgets/lbry.js")
diff --git a/src/pages/options/widgets/maps.js b/src/pages/options/widgets/maps.js
deleted file mode 100644
index acc8aca8..00000000
--- a/src/pages/options/widgets/maps.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-const frontends = new Array("facil")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("maps-enable")
-const maps = document.getElementById("maps_page")
-const frontend = document.getElementById("maps-frontend")
-let protocol
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = "block"
- } else {
- frontendDiv.style.display = "none"
- }
- }
-}
-
-browser.storage.local.get(["disableMaps", "protocol", "mapsFrontend"], r => {
- enable.checked = !r.disableMaps
- protocol = r.protocol
- frontend.value = r.mapsFrontend
- changeFrontendsSettings()
- changeProtocolSettings()
-})
-
-maps.addEventListener("change", () => {
- browser.storage.local.set({
- disableMaps: !enable.checked,
- mapsFrontend: frontend.value,
- })
- changeFrontendsSettings()
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("maps", frontends[i], protocols[x], document)
- }
- utils.latency("maps", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/maps.pug b/src/pages/options/widgets/maps.pug
deleted file mode 100644
index 166e6494..00000000
--- a/src/pages/options/widgets/maps.pug
+++ /dev/null
@@ -1,32 +0,0 @@
-section#maps_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_maps__") Maps
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#maps-enable(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_frontend__") Frontend
- select#maps-frontend
- option(value="osm") OpenStreetMap
- option(value="facil") Facil Map
-
- #facil
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://facilmap.com')
- include ../../widgets/latency.pug
- +latency('facil')
- .tor
- +instances('http://facilmap.onion')
- include ../../widgets/instances.pug
- .i2p
- include ../../widgets/instances.pug
- +instances('http://facilmap.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://facilmap.loki')
-
- script(type="module" src="./widgets/maps.js")
diff --git a/src/pages/options/widgets/medium.js b/src/pages/options/widgets/medium.js
deleted file mode 100644
index 8db5c0f0..00000000
--- a/src/pages/options/widgets/medium.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("scribe")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("medium-enable")
-const medium = document.getElementById("medium_page")
-//const frontend = document.getElementById("medium-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableMedium", "protocol"], r => {
- enable.checked = !r.disableMedium
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-medium.addEventListener("change", () => {
- browser.storage.local.set({ disableMedium: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("medium", frontends[i], protocols[x], document)
- }
- utils.latency("medium", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/medium.pug b/src/pages/options/widgets/medium.pug
deleted file mode 100644
index 4eef0511..00000000
--- a/src/pages/options/widgets/medium.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#medium_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_medium__") Medium
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#medium-enable(type="checkbox")
-
- #scribe
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://scribe.com')
- include ../../widgets/latency.pug
- +latency('scribe')
- .tor
- include ../../widgets/instances.pug
- +instances('http://scribe.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://scribe.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://scribe.loki')
-
- script(type="module" src="./widgets/medium.js")
diff --git a/src/pages/options/widgets/peertube.js b/src/pages/options/widgets/peertube.js
deleted file mode 100644
index e3b8dcc5..00000000
--- a/src/pages/options/widgets/peertube.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("simpleertube")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("peertube-enable")
-const peertube = document.getElementById("peertube_page")
-//const frontend = document.getElementById("peertube-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disablePeertubeTargets", "protocol"], r => {
- enable.checked = !r.disablePeertubeTargets
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-peertube.addEventListener("change", () => {
- browser.storage.local.set({ disablePeertubeTargets: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("peertube", frontends[i], protocols[x], document)
- }
- utils.latency("peertube", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/peertube.pug b/src/pages/options/widgets/peertube.pug
deleted file mode 100644
index 38690d04..00000000
--- a/src/pages/options/widgets/peertube.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#peertube_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_peertube__") PeerTube
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#peertube-enable(type="checkbox")
-
- #simpleertube
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://simpleertube.com')
- include ../../widgets/latency.pug
- +latency('simpleertube')
- .tor
- include ../../widgets/instances.pug
- +instances('http://simpleertube.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://simpleertube.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://simpleertube.loki')
-
- script(type="module" src="./widgets/peertube.js")
diff --git a/src/pages/options/widgets/quora.js b/src/pages/options/widgets/quora.js
deleted file mode 100644
index f3e361c3..00000000
--- a/src/pages/options/widgets/quora.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("quetre")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("quora-enable")
-const quora = document.getElementById("quora_page")
-//const frontend = document.getElementById("quora-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableQuora", "protocol"], r => {
- enable.checked = !r.disableQuora
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-quora.addEventListener("change", () => {
- browser.storage.local.set({ disableQuora: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("quora", frontends[i], protocols[x], document)
- }
- utils.latency("quora", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/quora.pug b/src/pages/options/widgets/quora.pug
deleted file mode 100644
index addfe280..00000000
--- a/src/pages/options/widgets/quora.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#quora_page.option-block
- .some-block.option-block
- h1() Quora
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#quora-enable(type="checkbox")
-
- #quetre
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://quetre.com')
- include ../../widgets/latency.pug
- +latency('quetre')
- .tor
- include ../../widgets/instances.pug
- +instances('http://quetre.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://quetre.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://quetre.loki')
-
- script(type="module" src="./widgets/quora.js")
diff --git a/src/pages/options/widgets/reddit.js b/src/pages/options/widgets/reddit.js
deleted file mode 100644
index c2d16fa3..00000000
--- a/src/pages/options/widgets/reddit.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-const frontends = new Array("libreddit", "teddit")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("reddit-enable")
-const reddit = document.getElementById("reddit_page")
-const frontend = document.getElementById("reddit-frontend")
-let protocol
-
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = "block"
- } else {
- frontendDiv.style.display = "none"
- }
- }
-}
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableReddit", "protocol", "redditFrontend"], r => {
- enable.checked = !r.disableReddit
- protocol = r.protocol
- frontend.value = r.redditFrontend
- changeFrontendsSettings()
- changeProtocolSettings()
-})
-
-reddit.addEventListener("change", () => {
- browser.storage.local.set({
- disableReddit: !enable.checked,
- redditFrontend: frontend.value,
- })
- changeFrontendsSettings()
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("reddit", frontends[i], protocols[x], document)
- }
- utils.latency("reddit", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/reddit.pug b/src/pages/options/widgets/reddit.pug
deleted file mode 100644
index 1726f9ce..00000000
--- a/src/pages/options/widgets/reddit.pug
+++ /dev/null
@@ -1,48 +0,0 @@
-section#reddit_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_reddit__") Reddit
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#reddit-enable(type="checkbox")
-
- .some-block.option-block
- h4#frontend(data-localise="__MSG_frontend__") Frontend
- select#reddit-frontend
- option(value="libreddit") Libreddit
- option(value="teddit") Teddit
-
- #libreddit
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://libreddit.com')
- include ../../widgets/latency.pug
- +latency('libreddit')
- .tor
- include ../../widgets/instances.pug
- +instances('http://libreddit.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://libreddit.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://libreddit.loki')
-
- #teddit
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://teddit.com')
- +latency('teddit')
- .tor
- include ../../widgets/instances.pug
- +instances('http://teddit.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://teddit.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://teddit.loki')
-
- script(type="module" src="./widgets/reddit.js")
diff --git a/src/pages/options/widgets/reuters.js b/src/pages/options/widgets/reuters.js
deleted file mode 100644
index d8c937e4..00000000
--- a/src/pages/options/widgets/reuters.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("neuters")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("reuters-enable")
-const reuters = document.getElementById("reuters_page")
-//const frontend = document.getElementById("reuters-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableReuters", "protocol"], r => {
- enable.checked = !r.disableReuters
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-reuters.addEventListener("change", () => {
- browser.storage.local.set({ disableReuters: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("reuters", frontends[i], protocols[x], document)
- }
- utils.latency("reuters", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/reuters.pug b/src/pages/options/widgets/reuters.pug
deleted file mode 100644
index 9ed6b3b9..00000000
--- a/src/pages/options/widgets/reuters.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#reuters_page.option-block
- .some-block.option-block
- h1() Reuters
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#reuters-enable(type="checkbox")
-
- #neuters
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://neuters.com')
- include ../../widgets/latency.pug
- +latency('neuters')
- .tor
- include ../../widgets/instances.pug
- +instances('http://neuters.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://neuters.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://neuters.loki')
-
- script(type="module" src="./widgets/reuters.js")
diff --git a/src/pages/options/widgets/search.js b/src/pages/options/widgets/search.js
deleted file mode 100644
index 3301cd70..00000000
--- a/src/pages/options/widgets/search.js
+++ /dev/null
@@ -1,204 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// GOAL: to never mention frontends/protocls outside these two arrays, so that adding a new frontend/protocol is as easy as adding it here.
-// This may be expanded across the whole project, where almost everything becomes a template, and the frontend/protocol parts just become a JSON file.
-
-// ONCE FINISHED: add librex and see if it works
-const frontends = new Array("searx", "searxng", "whoogle", "librex") // Add librex once /javascripts/search.js is made agnostic
-const protocols = new Array("normal", "tor", "i2p", "loki")
-//let frontendProtocols = (frontends.length)
-
-// I will leave comments of my privious attemps so that people can learn from my mistakes. :)
-
-/*
-for (let i = 0; i < frontends.length; i++) {
- this.frontends[i] = frontends[i].getElementsByClassName(protocol)
-}
-*/
-// There was a class here, but I deleted a bit of it
-/*
- this.searxDiv = searxDiv.getElementsByClassName(protocol)[0];
- this.searxngDiv = searxngDiv.getElementsByClassName(protocol)[0];
- this.librexDiv = librexDiv.getElementsByClassName(protocol)[0];
- */
-
-/*
- * Here I was trying to solve the issue by making a 2D array, but I later realised I was overcomplicating things
-for (var i = 0; i < frontends.length; i++) {
- frontendProtocols[i] = new Array(protocols.length)
-}
-*/
-
-/*
-const searxDiv = document.getElementById("searx");
-const searxngDiv = document.getElementById("searxng");
-const whoogleDiv = document.getElementById("whoogle");
-*/
-
-const enable = document.getElementById("search-enable")
-const search = document.getElementById("search_page")
-const frontend = document.getElementById("search-frontend")
-let protocol
-
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = "block"
- } else {
- frontendDiv.style.display = "none"
- }
- }
-
- /*
- if (frontend.value == 'searx') {
- searxDiv.style.display = 'block';
- searxngDiv.style.display = 'none';
- whoogleDiv.style.display = 'none';
- librexDiv.style.display = 'none';
- }
- else if (frontend.value == 'searxng') {
- searxDiv.style.display = 'none';
- searxngDiv.style.display = 'block';
- whoogleDiv.style.display = 'none';
- librexDiv.style.display = 'none';
- }
- else if (frontend.value == 'whoogle') {
- searxDiv.style.display = 'none';
- searxngDiv.style.display = 'none';
- whoogleDiv.style.display = 'block';
- librexDiv.style.display = 'none';
- }
- else if (frontend.value == 'librex') {
- searxDiv.style.display = 'none';
- searxDiv.style.display = 'none';
- searxngDiv.style.display = 'none';
- librexDiv.style.display = 'block';
- }
- */
-}
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- //if (frontends[i] == frontend.value) { // Here we are checking if the frontend matches the current one. This skips the protocol checking for that frontend, speeding things up. I no longer do this as protocol setting is only set once in the ui so every frontend needs to get their protocols setup immidiately.
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- //if the frontend value equals the selected one, it will show. Otherwise, it will be hidden
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- /*
- } else {
- continue
- }
- */
- }
-
- /*
- * "Legacy" code
- const normalsearxDiv = searxDiv.getElementsByClassName("normal")[0];
- const torsearxDiv = searxDiv.getElementsByClassName("tor")[0];
- const i2psearxDiv = searxDiv.getElementsByClassName("i2p")[0];
-
- const normalsearxngDiv = searxngDiv.getElementsByClassName("normal")[0];
- const torsearxngDiv = searxngDiv.getElementsByClassName("tor")[0];
- const i2psearxngDiv = searxngDiv.getElementsByClassName("i2p")[0];
-
- const torwhoogleDiv = whoogleDiv.getElementsByClassName("tor")[0];
- const i2pwhoogleDiv = whoogleDiv.getElementsByClassName("i2p")[0];
- const normalwhoogleDiv = whoogleDiv.getElementsByClassName("normal")[0];
-
-
- function protocolDisplay(proto) {
- proto.searxngDiv = 'block'
- }
-
- protocolDisplay(protocol.value)
-
-
- if (protocol.value == 'normal') {
- normalsearxDiv.style.display = 'block';
- normalsearxngDiv.style.display = 'block';
- normalwhoogleDiv.style.display = 'block';
-
- torsearxDiv.style.display = 'none';
- torsearxngDiv.style.display = 'none';
- torwhoogleDiv.style.display = 'none';
-
- i2psearxDiv.style.display = 'none';
- i2psearxngDiv.style.display = 'none';
- i2pwhoogleDiv.style.display = 'none';
- }
- else if (protocol.value == 'tor') {
- normalsearxDiv.style.display = 'none';
- normalsearxngDiv.style.display = 'none';
- normalwhoogleDiv.style.display = 'none';
-
- torsearxDiv.style.display = 'block';
- torsearxngDiv.style.display = 'block';
- torwhoogleDiv.style.display = 'block';
-
- i2psearxDiv.style.display = 'none';
- i2psearxngDiv.style.display = 'none';
- i2pwhoogleDiv.style.display = 'none';
- }
- else if (protocol.value == 'i2p') {
- normalsearxDiv.style.display = 'none';
- normalsearxngDiv.style.display = 'none';
- normalwhoogleDiv.style.display = 'none';
-
- torsearxDiv.style.display = 'none';
- torsearxngDiv.style.display = 'none';
- torwhoogleDiv.style.display = 'none';
-
- i2psearxDiv.style.display = 'block';
- i2psearxngDiv.style.display = 'block';
- i2pwhoogleDiv.style.display = 'block';
- }
- */
-}
-
-browser.storage.local.get(["disableSearch", "searchFrontend", "protocol"], r => {
- enable.checked = !r.disableSearch
- frontend.value = r.searchFrontend
- protocol = r.protocol
-
- changeFrontendsSettings()
- changeProtocolSettings()
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("search", frontends[i], protocols[x], document)
- }
- utils.latency("search", frontends[i], document, location)
-}
-
-search.addEventListener("change", () => {
- browser.storage.local.set({
- disableSearch: !enable.checked,
- searchFrontend: frontend.value,
- })
- changeFrontendsSettings()
-})
-
-/*
- * more "legacy" code
-utils.processDefaultCustomInstances('search', 'searx', 'normal', document);
-utils.processDefaultCustomInstances('search', 'searx', 'tor', document);
-utils.processDefaultCustomInstances('search', 'searx', 'i2p', document);
-utils.processDefaultCustomInstances('search', 'searxng', 'normal', document);
-utils.processDefaultCustomInstances('search', 'searxng', 'tor', document);
-utils.processDefaultCustomInstances('search', 'searxng', 'i2p', document);
-utils.processDefaultCustomInstances('search', 'whoogle', 'normal', document);
-utils.processDefaultCustomInstances('search', 'whoogle', 'tor', document);
-utils.processDefaultCustomInstances('search', 'whoogle', 'i2p', document);
-
-utils.latency('search', 'searx', document, location, true)
-utils.latency('search', 'searxng', document, location, true)
-utils.latency('search', 'whoogle', document, location, true)
-*/
diff --git a/src/pages/options/widgets/search.pug b/src/pages/options/widgets/search.pug
deleted file mode 100644
index 8f23350e..00000000
--- a/src/pages/options/widgets/search.pug
+++ /dev/null
@@ -1,85 +0,0 @@
-section#search_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_search__") Search
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#search-enable(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_frontend__") Frontend
- select#search-frontend
- option(value="searxng") SearXNG
- option(value="searx") SearX
- option(value="whoogle") Whoogle
- option(value="librex") LibreX
-
- .some-block
- h4(data-localise="__MSG_searchNote__") Note: To use Search, make LibRedirect the Default Search Engine
-
- #searx
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://searx.com')
- include ../../widgets/latency.pug
- +latency('searx')
- .tor
- include ../../widgets/instances.pug
- +instances('http://searx.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://searx.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://searx.loki')
-
- #searxng
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://searxng.com')
- +latency('searxng')
- .tor
- include ../../widgets/instances.pug
- +instances('http://searxng.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://searxng.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://searxng.loki')
-
- #whoogle
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://whoogle.com')
- +latency('whoogle')
- .tor
- include ../../widgets/instances.pug
- +instances('http://whoogle.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://whoogle.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://whoogle.loki')
-
- #librex
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://librex.com')
- +latency('librex')
- .tor
- include ../../widgets/instances.pug
- +instances('http://librex.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://librex.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://librex.loki')
-
- script(type="module" src="./widgets/search.js")
diff --git a/src/pages/options/widgets/sendTargets.js b/src/pages/options/widgets/sendTargets.js
deleted file mode 100644
index 9380a72f..00000000
--- a/src/pages/options/widgets/sendTargets.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("send")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("sendTargets-enable")
-const sendTargets = document.getElementById("sendTargets_page")
-//const frontend = document.getElementById("sendTargets-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableSendTarget", "protocol"], r => {
- enable.checked = !r.disableSendTarget
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-sendTargets.addEventListener("change", () => {
- browser.storage.local.set({ disableSendTarget: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("sendTargets", frontends[i], protocols[x], document)
- }
- utils.latency("sendTargets", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/sendTargets.pug b/src/pages/options/widgets/sendTargets.pug
deleted file mode 100644
index fc2e9e73..00000000
--- a/src/pages/options/widgets/sendTargets.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#sendTargets_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_sendFiles__") Send Files
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#sendTargets-enable(type="checkbox")
-
- #send
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://send.com')
- include ../../widgets/latency.pug
- +latency('send')
- .tor
- include ../../widgets/instances.pug
- +instances('http://send.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://send.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://send.loki')
-
- script(type="module" src="./widgets/sendTargets.js")
diff --git a/src/pages/options/widgets/services.ejs b/src/pages/options/widgets/services.ejs
new file mode 100644
index 00000000..44c6a9f3
--- /dev/null
+++ b/src/pages/options/widgets/services.ejs
@@ -0,0 +1,86 @@
+<% for (const service in config.services) { -%>
+<section class="option-block" id="<%= service %>_page">
+ <div class="some-block option-block">
+ <h1 data-localise="__MSG_<%= service %>__"><%= config.services[service].name %></h1>
+ </div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_enable__">Enable</h4>
+ <input id="<%= service %>-enabled" type="checkbox">
+ </div>
+ <% if (Object.keys(config.services[service].frontends).length > 1) { %>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_frontend__">Frontend</h4>
+ <select id="<%= service %>-frontend">
+ <% for (const frontend in config.services[service].frontends) { -%>
+ <option value="<%= frontend %>"><%= config.services[service].frontends[frontend].name %></option>
+ <% } %>
+ </select>
+ </div>
+ <% if (config.services[service].embeddable) { _%>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_embed_frontend__">Embed Frontend</h4>
+ <select id="<%= service %>-embedFrontend">
+ <% for (const frontend in config.services[service].frontends) { -%>
+ <% if (config.services[service].frontends[frontend].embeddable) { _%>
+ <option value="<%= frontend %>"><%= config.services[service].frontends[frontend].name %></option>
+ <% } _%>
+ <% } %>
+ </select>
+ </div>
+ <% } _%>
+ <% } _%>
+ <% if (config.services[service].embeddable) { _%>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_redirectType__">Redirect Type</h4>
+ <select id="<%= service %>-redirectType">
+ <option value="both" data-localise="__MSG_both__">both</option>
+ <option value="sub_frame" data-localise="__MSG_onlyEmbedded__">Only Embedded</option>
+ <option value="main_frame" data-localise="__MSG_onlyNotEmbedded__">Only Not Embedded</option>
+ </select>
+ </div>
+ <% } _%>
+ <hr>
+ <% for (const frontend in config.services[service].frontends) { -%>
+ <% if (config.services[service].frontends[frontend].instanceList) { _%>
+ <div id="<%= frontend %>">
+ <% for (const network in config.networks) { -%>
+ <div class="<%= network %>">
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_defaultInstances__">Default Instances</h4>
+ </div>
+ <div class="checklist"></div>
+ <hr>
+ <div class="some-block option-block">
+ <h4 data-localise="__MSG_customInstances__">Custom Instances</h4>
+ </div>
+ <form class="custom-instance-form">
+ <div class="some-block option-block">
+ <input class="custom-instance" placeholder="http://<%= frontend %>.<%= config.networks[network].tld %>" type="url">
+ <button class="add add-instance" type="submit">
+ <svg xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor">
+ <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path>
+ </svg>
+ </button>
+ </div>
+ </form>
+ <div class="checklist custom-checklist"></div>
+ <% if (network == "clearnet") { _%>
+ <div class="buttons buttons-inline">
+ <label class="button button-inline" id="latency-<%= frontend %>-label" for="latency-<%= frontend %>">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"></path>
+ </svg>&nbsp;
+ <x data-localise="__MSG_testInstancesLatency__">Test Instances Latency</x>
+ </label>
+ <input class="button button-inline" id="latency-<%= frontend %>" style="display:none;">
+ </div>
+ <% } _%>
+ </div>
+ <% } %>
+ </div>
+ <% } _%>
+ <% } %>
+</section>
+<% } %>
+<script type="module" src="./widgets/services.js"></script>
diff --git a/src/pages/options/widgets/services.js b/src/pages/options/widgets/services.js
new file mode 100644
index 00000000..eb7f1ba7
--- /dev/null
+++ b/src/pages/options/widgets/services.js
@@ -0,0 +1,107 @@
+import utils from "../../../assets/javascripts/utils.js"
+
+let config,
+ options,
+ divs = {}
+
+function getConfig() {
+ return new Promise(resolve => {
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(data => {
+ config = JSON.parse(data)
+ resolve()
+ })
+ })
+}
+
+function getOptions() {
+ return new Promise(resolve => {
+ browser.storage.local.get("options", r => {
+ options = r.options
+ resolve()
+ })
+ })
+}
+
+await getConfig()
+await getOptions()
+
+function changeFrontendsSettings(service) {
+ for (const frontend in config.services[service].frontends) {
+ if (config.services[service].frontends[frontend].instanceList) {
+ const frontendDiv = document.getElementById(frontend)
+ if (frontend == divs[service].frontend.value) {
+ frontendDiv.style.display = "block"
+ } else {
+ frontendDiv.style.display = "none"
+ }
+ }
+ }
+
+ if (config.services[service].embeddable) {
+ if (!config.services[service].frontends[divs[service].frontend.value].embeddable) {
+ divs[service].embedFrontend.disabled = false
+ for (const frontend in config.services[service].frontends) {
+ if (config.services[service].frontends[frontend].embeddable) {
+ const frontendDiv = document.getElementById(frontend)
+ if (frontend == divs[service].embedFrontend.value) {
+ frontendDiv.style.display = "block"
+ } else {
+ frontendDiv.style.display = "none"
+ }
+ }
+ }
+ } else if (Object.keys(config.services[service].frontends).length > 1) divs[service].embedFrontend.disabled = true
+ }
+}
+
+function changeNetworkSettings() {
+ for (const service in config.services) {
+ for (const frontend in config.services[service].frontends) {
+ if (config.services[service].frontends[frontend].instanceList) {
+ const frontendDiv = document.getElementById(frontend)
+ for (const network in config.networks) {
+ const networkDiv = frontendDiv.getElementsByClassName(network)[0]
+ if (network == options.network) {
+ networkDiv.style.display = "block"
+ } else {
+ networkDiv.style.display = "none"
+ }
+ }
+ }
+ }
+ }
+}
+
+changeNetworkSettings()
+for (const service in config.services) {
+ divs[service] = {}
+ //divs[service].page = document.getElementById(`${service}_page`)
+ for (const option in config.services[service].options) {
+ divs[service][option] = document.getElementById(`${service}-${option}`)
+
+ if (typeof config.services[service].options[option] == "boolean") divs[service][option].checked = options[service][option]
+ else divs[service][option].value = options[service][option]
+
+ divs[service][option].addEventListener("change", () => {
+ if (typeof config.services[service].options[option] == "boolean") options[service][option] = divs[service][option].checked
+ else options[service][option] = divs[service][option].value
+ browser.storage.local.set({ options })
+ changeFrontendsSettings(service)
+ })
+ }
+
+ if (Object.keys(config.services[service].frontends).length > 1) {
+ changeFrontendsSettings(service)
+ }
+
+ for (const frontend in config.services[service].frontends) {
+ if (config.services[service].frontends[frontend].instanceList) {
+ for (const network in config.networks) {
+ utils.processDefaultCustomInstances(service, frontend, network, document)
+ }
+ utils.latency(service, frontend, document, location)
+ }
+ }
+}
diff --git a/src/pages/options/widgets/tiktok.js b/src/pages/options/widgets/tiktok.js
deleted file mode 100644
index 38ec9ea0..00000000
--- a/src/pages/options/widgets/tiktok.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("proxiTok")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("tiktok-enable")
-const tiktok = document.getElementById("tiktok_page")
-//const frontend = document.getElementById("tiktok-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableTiktok", "protocol"], r => {
- enable.checked = !r.disableTiktok
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-tiktok.addEventListener("change", () => {
- browser.storage.local.set({ disableTiktok: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("tiktok", frontends[i], protocols[x], document)
- }
- utils.latency("tiktok", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/tiktok.pug b/src/pages/options/widgets/tiktok.pug
deleted file mode 100644
index 29ab5e2a..00000000
--- a/src/pages/options/widgets/tiktok.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#tiktok_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_tiktok__") TikTok
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#tiktok-enable(type="checkbox")
-
- #proxiTok
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://proxitok.com')
- include ../../widgets/latency.pug
- +latency('proxiTok')
- .tor
- include ../../widgets/instances.pug
- +instances('http://proxitok.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://proxitok.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://proxitok.loki')
-
- script(type="module" src="./widgets/tiktok.js")
diff --git a/src/pages/options/widgets/translate.js b/src/pages/options/widgets/translate.js
deleted file mode 100644
index e1008139..00000000
--- a/src/pages/options/widgets/translate.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-const frontends = new Array("simplyTranslate", "lingva")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("translate-enable")
-const translate = document.getElementById("translate_page")
-const frontend = document.getElementById("translate-frontend")
-let protocol
-
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = "block"
- } else {
- frontendDiv.style.display = "none"
- }
- }
-}
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["translateDisable", "translateFrontend", "protocol"], r => {
- enable.checked = !r.translateDisable
- frontend.value = r.translateFrontend
- protocol = r.protocol
- changeFrontendsSettings()
- changeProtocolSettings()
-})
-
-translate.addEventListener("change", () => {
- browser.storage.local.set({
- translateDisable: !enable.checked,
- translateFrontend: frontend.value,
- })
- changeFrontendsSettings()
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("translate", frontends[i], protocols[x], document)
- }
- utils.latency("translate", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/translate.pug b/src/pages/options/widgets/translate.pug
deleted file mode 100644
index 4836c0f3..00000000
--- a/src/pages/options/widgets/translate.pug
+++ /dev/null
@@ -1,48 +0,0 @@
-section#translate_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_translate__") Translate
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#translate-enable(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_frontend__") Frontend
- select#translate-frontend
- option(value="simplyTranslate") SimplyTranslate
- option(value="lingva") Lingva
-
- hr
- #simplyTranslate
- .normal
- include ../../widgets/instances.pug
- +instances('https://simplytranslate.org')
- include ../../widgets/latency.pug
- +latency('simplyTranslate')
- .tor
- include ../../widgets/instances.pug
- +instances('http://hxecvvetgrznmprg.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://simplytranslate.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://simplytranslate.loki')
-
- #lingva
- .normal
- include ../../widgets/instances.pug
- +instances('https://lingvatranslate.com')
- +latency('lingva')
- .tor
- include ../../widgets/instances.pug
- +instances('http://lingvatranslate.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://lingvatranslate.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://lingvatranslate.loki')
-
-
- script(type="module" src="./widgets/translate.js")
diff --git a/src/pages/options/widgets/twitter.js b/src/pages/options/widgets/twitter.js
deleted file mode 100644
index 5ad760b3..00000000
--- a/src/pages/options/widgets/twitter.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("nitter")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("twitter-enable")
-const twitter = document.getElementById("twitter_page")
-const redirectType = document.getElementById("twitter-redirect_type")
-//const frontend = document.getElementById("twitter-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableTwitter", "protocol", "twitterRedirectType"], r => {
- enable.checked = !r.disableTwitter
- protocol = r.protocol
- redirectType.value = r.twitterRedirectType
- changeProtocolSettings()
-})
-
-twitter.addEventListener("change", () => {
- browser.storage.local.set({
- disableTwitter: !enable.checked,
- twitterRedirectType: redirectType.value,
- })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("twitter", frontends[i], protocols[x], document)
- }
- utils.latency("twitter", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/twitter.pug b/src/pages/options/widgets/twitter.pug
deleted file mode 100644
index 137e1efb..00000000
--- a/src/pages/options/widgets/twitter.pug
+++ /dev/null
@@ -1,32 +0,0 @@
-section#twitter_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_twitter__") Twitter
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#twitter-enable(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_redirectType__") Redirect Type
- select#twitter-redirect_type
- option(value="both" data-localise="__MSG_both__") both
- option(value="main_frame" data-localise="__MSG_onlyNotEmbedded__") Only Not Embedded
-
- #nitter
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://nitter.com')
- include ../../widgets/latency.pug
- +latency('nitter')
- .tor
- include ../../widgets/instances.pug
- +instances('http://nitter.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://nitter.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://nitter.loki')
-
- script(type="module" src="./widgets/twitter.js")
diff --git a/src/pages/options/widgets/wikipedia.js b/src/pages/options/widgets/wikipedia.js
deleted file mode 100644
index 9d06488b..00000000
--- a/src/pages/options/widgets/wikipedia.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-// UNCOMMENT ALL COMMENTS ONCE OTHER FRONTENDS EXIST
-
-const frontends = new Array("wikiless")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-const enable = document.getElementById("wikipedia-enable")
-const wikipedia = document.getElementById("wikipedia_page")
-//const frontend = document.getElementById("wikipedia-frontend");
-let protocol
-
-/*
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = 'block'
- } else {
- frontendDiv.style.display = 'none'
- }
- }
-}
-*/
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableWikipedia", "protocol"], r => {
- enable.checked = !r.disableWikipedia
- protocol = r.protocol
- changeProtocolSettings()
-})
-
-wikipedia.addEventListener("change", () => {
- browser.storage.local.set({ disableWikipedia: !enable.checked })
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("wikipedia", frontends[i], protocols[x], document)
- }
- utils.latency("wikipedia", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/wikipedia.pug b/src/pages/options/widgets/wikipedia.pug
deleted file mode 100644
index c9aee64c..00000000
--- a/src/pages/options/widgets/wikipedia.pug
+++ /dev/null
@@ -1,26 +0,0 @@
-section#wikipedia_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_wikipedia__") Wikipedia
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#wikipedia-enable(type="checkbox")
-
- #wikiless
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://wikiless.com')
- include ../../widgets/latency.pug
- +latency('wikiless')
- .tor
- include ../../widgets/instances.pug
- +instances('http://wikiless.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('https://wikiless.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://wikiless.loki')
-
- script(type="module" src="./widgets/wikipedia.js")
diff --git a/src/pages/options/widgets/youtube.js b/src/pages/options/widgets/youtube.js
deleted file mode 100644
index 065a195b..00000000
--- a/src/pages/options/widgets/youtube.js
+++ /dev/null
@@ -1,92 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-const frontends = new Array("invidious", "piped", "pipedMaterial", "cloudtube")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-const singleInstanceFrontends = new Array("freetube", "yatte")
-
-const enable = document.getElementById("youtube-enable")
-const youtube = document.getElementById("youtube_page")
-const youtubeEmbedFrontend = document.getElementById("youtube-embed_frontend")
-const onlyEmbeddedVideo = document.getElementById("youtube-redirect_type")
-const embeddedFrontendDiv = document.getElementById("youtube-embedded_frontend")
-const frontend = document.getElementById("youtube-frontend")
-let protocol
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-function changeEmbedFrontendsSettings() {
- if (embeddedFrontendDiv.style.display == "block") {
- for (let i = 0; i < frontends.length; i++) {
- const embeddedFrontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == youtubeEmbedFrontend.value) {
- embeddedFrontendDiv.style.display = "block"
- } else {
- embeddedFrontendDiv.style.display = "none"
- }
- }
- }
-}
-
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = "block"
- } else {
- frontendDiv.style.display = "none"
- }
- }
- let singleInstanceFrontend = false
- for (let i = 0; i < singleInstanceFrontends.length; i++) {
- if (singleInstanceFrontends[i] == frontend.value) {
- singleInstanceFrontend = true
- }
- }
- if (singleInstanceFrontend == true) {
- embeddedFrontendDiv.style.display = "block"
- } else {
- embeddedFrontendDiv.style.display = "none"
- }
-}
-
-browser.storage.local.get(["disableYoutube", "onlyEmbeddedVideo", "youtubeRedirects", "youtubeFrontend", "youtubeEmbedFrontend", "protocol"], r => {
- enable.checked = !r.disableYoutube
- onlyEmbeddedVideo.value = r.onlyEmbeddedVideo
- youtubeEmbedFrontend.value = r.youtubeEmbedFrontend
- frontend.value = r.youtubeFrontend
- protocol = r.protocol
-
- changeFrontendsSettings()
- changeProtocolSettings()
- changeEmbedFrontendsSettings()
-})
-
-youtube.addEventListener("change", () => {
- browser.storage.local.set({
- disableYoutube: !enable.checked,
- youtubeEmbedFrontend: youtubeEmbedFrontend.value,
- youtubeFrontend: frontend.value,
- onlyEmbeddedVideo: onlyEmbeddedVideo.value,
- })
- changeFrontendsSettings()
- changeEmbedFrontendsSettings()
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("youtube", frontends[i], protocols[x], document)
- }
- utils.latency("youtube", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/youtube.pug b/src/pages/options/widgets/youtube.pug
deleted file mode 100644
index 66faa60a..00000000
--- a/src/pages/options/widgets/youtube.pug
+++ /dev/null
@@ -1,102 +0,0 @@
-section#youtube_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_youtube__") YouTube
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#youtube-enable(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_frontend__") Frontend
- select#youtube-frontend
- option(value="invidious") Invidious
- option(value="piped") Piped
- option(value="pipedMaterial") Piped-Material
- option(value="cloudtube") CloudTube
- option(value="freetube") FreeTube
- option(value="yatte") Yattee
-
- #youtube-embedded_frontend
- .some-block.option-block
- h4(data-localise="__MSG_embeddedVids__") Embedded Videos Frontend
- select#youtube-embed_frontend
- option(value="invidious") Invidious
- option(value="piped") Piped
- option(value="pipedMaterial") Piped-Material
- option(value="cloudtube") CloudTube
-
- .some-block.option-block
- h4(data-localise="__MSG_redirectType__") Redirect Type
- select#youtube-redirect_type
- option(value="both" data-localise="__MSG_both__") both
- option(value="onlyNotEmbedded" data-localise="__MSG_onlyNotEmbedded__") Only Not Embedded
-
- #invidious
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('http://invidious.com')
- include ../../widgets/latency.pug
- +latency('invidious')
- .tor
- include ../../widgets/instances.pug
- +instances('http://invidious.onion')
- .i2p
- include ../../widgets/instances.pug
- +instances('http://invidious.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://invidious.loki')
-
- #piped
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://piped.com')
- include ../../widgets/latency.pug
- +latency('piped')
- .tor
- +instances('http://piped.onion')
- include ../../widgets/instances.pug
- .i2p
- include ../../widgets/instances.pug
- +instances('http://piped.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://piped.loki')
-
- #pipedMaterial
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://piped-material.com')
- include ../../widgets/latency.pug
- +latency('pipedMaterial')
- .tor
- +instances('http://piped-material.onion')
- include ../../widgets/instances.pug
- .i2p
- include ../../widgets/instances.pug
- +instances('http://piped-material.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://piped-material.loki')
-
- #cloudtube
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://cloudtube.com')
- include ../../widgets/latency.pug
- +latency('cloudtube')
- .tor
- +instances('http://cloudtube.onion')
- include ../../widgets/instances.pug
- .i2p
- include ../../widgets/instances.pug
- +instances('http://cloudtube.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://cloudtube.loki')
-
- script(type="module" src="./widgets/youtube.js")
diff --git a/src/pages/options/widgets/youtubeMusic.js b/src/pages/options/widgets/youtubeMusic.js
deleted file mode 100644
index ad51ce7c..00000000
--- a/src/pages/options/widgets/youtubeMusic.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import utils from "../../../assets/javascripts/utils.js"
-
-const frontends = new Array("beatbump", "hyperpipe")
-const protocols = new Array("normal", "tor", "i2p", "loki")
-
-let enable = document.getElementById("youtubeMusic-enable")
-const youtubeMusic = document.getElementById("youtubeMusic_page")
-const frontend = document.getElementById("youtubeMusic-frontend")
-let protocol
-
-function changeFrontendsSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- if (frontends[i] == frontend.value) {
- frontendDiv.style.display = "block"
- } else {
- frontendDiv.style.display = "none"
- }
- }
-}
-
-function changeProtocolSettings() {
- for (let i = 0; i < frontends.length; i++) {
- const frontendDiv = document.getElementById(frontends[i])
- for (let x = 0; x < protocols.length; x++) {
- const protocolDiv = frontendDiv.getElementsByClassName(protocols[x])[0]
- if (protocols[x] == protocol) {
- protocolDiv.style.display = "block"
- } else {
- protocolDiv.style.display = "none"
- }
- }
- }
-}
-
-browser.storage.local.get(["disableYoutubeMusic", "youtubeMusicFrontend", "protocol"], r => {
- enable.checked = !r.disableYoutubeMusic
- frontend.value = r.youtubeMusicFrontend
- protocol = r.protocol
- changeFrontendsSettings()
- changeProtocolSettings()
-})
-
-youtubeMusic.addEventListener("change", () => {
- browser.storage.local.set({
- disableYoutubeMusic: !enable.checked,
- youtubeMusicFrontend: frontend.value,
- })
- changeFrontendsSettings()
-})
-
-for (let i = 0; i < frontends.length; i++) {
- for (let x = 0; x < protocols.length; x++) {
- utils.processDefaultCustomInstances("youtubeMusic", frontends[i], protocols[x], document)
- }
- utils.latency("youtubeMusic", frontends[i], document, location)
-}
diff --git a/src/pages/options/widgets/youtubeMusic.pug b/src/pages/options/widgets/youtubeMusic.pug
deleted file mode 100644
index bcba3d2d..00000000
--- a/src/pages/options/widgets/youtubeMusic.pug
+++ /dev/null
@@ -1,49 +0,0 @@
-section#youtubeMusic_page.option-block
- .some-block.option-block
- h1(data-localise="__MSG_ytmusic__") YouTube Music
- hr
- .some-block.option-block
- h4(data-localise="__MSG_enable__") Enable
- input#youtubeMusic-enable(type="checkbox")
-
- .some-block.option-block
- h4(data-localise="__MSG_frontend__") Frontend
- select#youtubeMusic-frontend
- option(value="beatbump") Beatbump
- option(value="hyperpipe") Hyperpipe
-
- #beatbump
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://beatbump.org')
- include ../../widgets/latency.pug
- +latency('beatbump')
- .tor
- +instances('http://beatbump.onion')
- include ../../widgets/instances.pug
- .i2p
- include ../../widgets/instances.pug
- +instances('http://beatbump.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://beatbump.loki')
-
- #hyperpipe
- hr
- .normal
- include ../../widgets/instances.pug
- +instances('https://hyperpipe.org')
- include ../../widgets/latency.pug
- +latency('hyperpipe')
- .tor
- +instances('http://hyperpipe.onion')
- include ../../widgets/instances.pug
- .i2p
- include ../../widgets/instances.pug
- +instances('http://hyperpipe.i2p')
- .loki
- include ../../widgets/instances.pug
- +instances('http://hyperpipe.loki')
-
- script(type="module" src="./widgets/youtubeMusic.js")
diff --git a/src/pages/popup/popup.ejs b/src/pages/popup/popup.ejs
new file mode 100644
index 00000000..e862e0cb
--- /dev/null
+++ b/src/pages/popup/popup.ejs
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link href="../stylesheets/styles.css" rel="stylesheet">
+ <link href="./style.css" rel="stylesheet">
+ </head>
+ <body dir="auto">
+ <div class="current_site">
+ <%- include('src/pages/widgets/switches', {services: services}) -%>
+ <div id="current_site_divider">
+ <hr>
+ </div>
+ </div>
+ <div class="all_sites">
+ <%- include('src/pages/widgets/switches', {services: services}) -%>
+ </div>
+ <hr>
+ <div class="some-block" id="change_instance_div"><a class="title button prevent" id="change_instance">
+ <h4 data-localise="__MSG_switchInstance__">Change Instance</h4>
+ <svg xmlns="http://www.w3.org/2000/svg" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
+ <path d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z"></path>
+ </svg></a></div>
+ <div class="some-block" id="copy_raw_div" title="Copy the original redirected link"> <a class="title button prevent" id="copy_raw">
+ <h4 data-localise="__MSG_copyRaw__">Copy Raw</h4>
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path>
+ </svg></a></div>
+ <div class="some-block" id="unify_div" title="Unify preferences across all selected instances"><a class="title button prevent" id="unify">
+ <h4 data-localise="__MSG_unifySettings__">Unify Settings</h4>
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path>
+ </svg></a></div>
+ <div class="some-block"><a class="title button prevent" id="more-options">
+ <h4 data-localise="__MSG_settings__">Settings</h4>
+ <svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor">
+ <path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"></path>
+ </svg></a></div>
+ <div class="some-block"><a class="title button" id="about" href="/pages/options/index.html#about">
+ <h4 data-localise="__MSG_about__">About</h4>
+ <svg xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor">
+ <path d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z"></path>
+ </svg></a></div>
+ <div class="space"></div>
+ <script type="module" src="../options/init.js"></script>
+ <script type="module" src="./popup.js"></script>
+ </body>
+</html>
diff --git a/src/pages/popup/popup.html b/src/pages/popup/popup.html
index 1c3f6ea2..54c4fefa 100644
--- a/src/pages/popup/popup.html
+++ b/src/pages/popup/popup.html
@@ -8,189 +8,227 @@
</head>
<body dir="auto">
<div class="current_site">
- <div class="youtube some-block"><a class="title" href="https://youtube.com"><img src="../../assets/images/youtube-icon.png"/>
- <h4 data-localise="__MSG_youtube__">YouTube</h4></a>
- <input class="disable-youtube" type="checkbox"/>
- </div>
- <div class="youtubeMusic some-block"><a class="title" href="https://music.youtube.com"><img src="../../assets/images/youtube-music-icon.png"/>
- <h4 data-localise="__MSG_ytmusic__">YT Music</h4></a>
- <input class="disable-youtubeMusic" type="checkbox"/>
- </div>
- <div class="twitter some-block"><a class="title" href="https://twitter.com"><img src="../../assets/images/twitter-icon.png"/>
- <h4 data-localise="__MSG_twitter__">Twitter</h4></a>
- <input class="disable-nitter" type="checkbox"/>
- </div>
- <div class="instagram some-block"><a class="title" href="https://instagram.com"><img src="../../assets/images/instagram-icon.png"/>
- <h4 data-localise="__MSG_instagram__">Instagram</h4></a>
- <input class="disable-bibliogram" type="checkbox"/>
- </div>
- <div class="tiktok some-block"><a class="title" href="https://tiktok.com"><img src="../../assets/images/tiktok-icon.png"/>
- <h4 data-localise="__MSG_tiktok__">TikTok</h4></a>
- <input class="disable-tiktok" type="checkbox"/>
- </div>
- <div class="imgur some-block"><a class="title" href="https://imgur.com"><img src="../../assets/images/imgur.png"/>
- <h4 data-localise="__MSG_imgur__">Imgur</h4></a>
- <input class="disable-imgur" type="checkbox"/>
- </div>
- <div class="reddit some-block"><a class="title" href="https://reddit.com"><img src="../../assets/images/reddit-icon.png"/>
- <h4 data-localise="__MSG_reddit__">Reddit</h4></a>
- <input class="disable-reddit" type="checkbox"/>
- </div>
- <div class="wikipedia some-block"><a class="title" href="https://wikipedia.com"><img src="../../assets/images/wikipedia-icon.svg"/>
- <h4 data-localise="__MSG_wikipedia__">Wikipedia</h4></a>
- <input class="disable-wikipedia" type="checkbox"/>
- </div>
- <div class="medium some-block"><a class="title" href="https://medium.com">
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
- <circle cx="500" cy="500" r="500"></circle>
- <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
- <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
- </svg>
- <h4 data-localise="__MSG_medium__">Medium</h4></a>
- <input class="disable-medium" type="checkbox"/>
- </div>
- <div class="quora some-block"><a class="title" href="https://quora.com"><img src="../../assets/images/quora.png"/>
- <h4>Quora</h4></a>
- <input class="disable-quora" type="checkbox"/>
- </div>
- <div class="imdb some-block"><a class="title" href="https://imdb.com"><img src="../../assets/images/imdb.svg"/>
- <h4>IMDb</h4></a>
- <input class="disable-imdb" type="checkbox"/>
- </div>
- <div class="reuters some-block"><a class="title" href="https://reuters.com"><img src="../../assets/images/reuters.svg"/>
- <h4>Reuters</h4></a>
- <input class="disable-reuters" type="checkbox"/>
- </div>
- <div class="peertube some-block"><a class="title" href="https://search.joinpeertube.org"><img src="../../assets/images/peertube-icon.svg"/>
- <h4 data-localise="__MSG_peertube__">PeerTube</h4></a>
- <input class="disable-peertube" type="checkbox"/>
- </div>
- <div class="lbry some-block"><a class="title" href="https://odysee.com/"><img src="../../assets/images/lbry-icon.png"/>
- <h4 data-localise="__MSG_lbry__">LBRY</h4></a>
- <input class="disable-lbry" type="checkbox"/>
- </div>
- <div class="search some-block"><a class="title" href="https://search.libredirect.invalid">
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
- <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
- </svg>
- <h4 data-localise="__MSG_search__">Search</h4></a>
- <input class="disable-search" type="checkbox"/>
- </div>
- <div class="translate some-block"><a class="title" href="https://translate.google.com">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
- </svg>
- <h4 data-localise="__MSG_translate__">Translate</h4></a>
- <input class="disable-translate" type="checkbox"/>
- </div>
- <div class="maps some-block"><a class="title" href="https://www.openstreetmap.org">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
- </svg>
- <h4 data-localise="__MSG_maps__">Maps</h4></a>
- <input class="disable-osm" type="checkbox"/>
- </div>
- <div class="sendTargets some-block"><a class="title" href="https://send.libredirect.invalid">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
- </svg>
- <h4 data-localise="__MSG_sendFiles__">Send Files</h4></a>
- <input class="disable-sendTargets" type="checkbox"/>
- </div>
+ <div class="youtube some-block"><a class="title" href="https://youtube.com">
+ <img src="../../assets/images/youtube-icon.png"/>
+ <h4 data-localise="__MSG_youtube__">Youtube</h4></a>
+ <input class="youtube-enabled" type="checkbox"/>
+</div>
+<div class="youtubeMusic some-block"><a class="title" href="https://music.youtube.com">
+ <img src="../../assets/images/youtubeMusic-icon.png"/>
+ <h4 data-localise="__MSG_youtubeMusic__">YT Music</h4></a>
+ <input class="youtubeMusic-enabled" type="checkbox"/>
+</div>
+<div class="twitter some-block"><a class="title" href="https://twitter.com">
+ <img src="../../assets/images/twitter-icon.png"/>
+ <h4 data-localise="__MSG_twitter__">Twitter</h4></a>
+ <input class="twitter-enabled" type="checkbox"/>
+</div>
+<div class="instagram some-block"><a class="title" href="https://instagram.com">
+ <img src="../../assets/images/instagram-icon.png"/>
+ <h4 data-localise="__MSG_instagram__">Instagram</h4></a>
+ <input class="instagram-enabled" type="checkbox"/>
+</div>
+<div class="tiktok some-block"><a class="title" href="https://tiktok.com">
+ <img src="../../assets/images/tiktok-icon.png"/>
+ <h4 data-localise="__MSG_tiktok__">TikTok</h4></a>
+ <input class="tiktok-enabled" type="checkbox"/>
+</div>
+<div class="reddit some-block"><a class="title" href="https://reddit.com">
+ <img src="../../assets/images/reddit-icon.png"/>
+ <h4 data-localise="__MSG_reddit__">Reddit</h4></a>
+ <input class="reddit-enabled" type="checkbox"/>
+</div>
+<div class="imgur some-block"><a class="title" href="https://imgur.com">
+ <img src="../../assets/images/imgur-icon.png"/>
+ <h4 data-localise="__MSG_imgur__">Imgur</h4></a>
+ <input class="imgur-enabled" type="checkbox"/>
+</div>
+<div class="wikipedia some-block"><a class="title" href="https://wikipedia.org">
+ <img src="../../assets/images/wikipedia-icon.svg"/>
+ <h4 data-localise="__MSG_wikipedia__">Wikipedia</h4></a>
+ <input class="wikipedia-enabled" type="checkbox"/>
+</div>
+<div class="medium some-block"><a class="title" href="https://medium.com">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
+ <circle cx="500" cy="500" r="500"></circle>
+ <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
+ <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
+</svg>
+
+ <h4 data-localise="__MSG_medium__">Medium</h4></a>
+ <input class="medium-enabled" type="checkbox"/>
+</div>
+<div class="quora some-block"><a class="title" href="https://quora.com">
+ <img src="../../assets/images/quora-icon.png"/>
+ <h4 data-localise="__MSG_quora__">Quora</h4></a>
+ <input class="quora-enabled" type="checkbox"/>
+</div>
+<div class="imdb some-block"><a class="title" href="https://imdb.com">
+ <img src="../../assets/images/imdb-icon.svg"/>
+ <h4 data-localise="__MSG_imdb__">IMDb</h4></a>
+ <input class="imdb-enabled" type="checkbox"/>
+</div>
+<div class="reuters some-block"><a class="title" href="https://reuters.com">
+ <img src="../../assets/images/reuters-icon.svg"/>
+ <h4 data-localise="__MSG_reuters__">Reuters</h4></a>
+ <input class="reuters-enabled" type="checkbox"/>
+</div>
+<div class="peertube some-block"><a class="title" href="https://search.joinpeertube.org">
+ <img src="../../assets/images/peertube-icon.svg"/>
+ <h4 data-localise="__MSG_peertube__">PeerTube</h4></a>
+ <input class="peertube-enabled" type="checkbox"/>
+</div>
+<div class="lbry some-block"><a class="title" href="https://odysee.com">
+ <img src="../../assets/images/lbry-icon.png"/>
+ <h4 data-localise="__MSG_lbry__">LBRY</h4></a>
+ <input class="lbry-enabled" type="checkbox"/>
+</div>
+<div class="search some-block"><a class="title" href="https://search.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+ <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_search__">Search</h4></a>
+ <input class="search-enabled" type="checkbox"/>
+</div>
+<div class="translate some-block"><a class="title" href="https://translate.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_translate__">Translate</h4></a>
+ <input class="translate-enabled" type="checkbox"/>
+</div>
+<div class="maps some-block"><a class="title" href="https://maps.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_maps__">Maps</h4></a>
+ <input class="maps-enabled" type="checkbox"/>
+</div>
+<div class="sendFiles some-block"><a class="title" href="https://send.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_sendFiles__">Send Files</h4></a>
+ <input class="sendFiles-enabled" type="checkbox"/>
+</div>
+
<div id="current_site_divider">
<hr>
</div>
</div>
<div class="all_sites">
- <div class="youtube some-block"><a class="title" href="https://youtube.com"><img src="../../assets/images/youtube-icon.png"/>
- <h4 data-localise="__MSG_youtube__">YouTube</h4></a>
- <input class="disable-youtube" type="checkbox"/>
- </div>
- <div class="youtubeMusic some-block"><a class="title" href="https://music.youtube.com"><img src="../../assets/images/youtube-music-icon.png"/>
- <h4 data-localise="__MSG_ytmusic__">YT Music</h4></a>
- <input class="disable-youtubeMusic" type="checkbox"/>
- </div>
- <div class="twitter some-block"><a class="title" href="https://twitter.com"><img src="../../assets/images/twitter-icon.png"/>
- <h4 data-localise="__MSG_twitter__">Twitter</h4></a>
- <input class="disable-nitter" type="checkbox"/>
- </div>
- <div class="instagram some-block"><a class="title" href="https://instagram.com"><img src="../../assets/images/instagram-icon.png"/>
- <h4 data-localise="__MSG_instagram__">Instagram</h4></a>
- <input class="disable-bibliogram" type="checkbox"/>
- </div>
- <div class="tiktok some-block"><a class="title" href="https://tiktok.com"><img src="../../assets/images/tiktok-icon.png"/>
- <h4 data-localise="__MSG_tiktok__">TikTok</h4></a>
- <input class="disable-tiktok" type="checkbox"/>
- </div>
- <div class="imgur some-block"><a class="title" href="https://imgur.com"><img src="../../assets/images/imgur.png"/>
- <h4 data-localise="__MSG_imgur__">Imgur</h4></a>
- <input class="disable-imgur" type="checkbox"/>
- </div>
- <div class="reddit some-block"><a class="title" href="https://reddit.com"><img src="../../assets/images/reddit-icon.png"/>
- <h4 data-localise="__MSG_reddit__">Reddit</h4></a>
- <input class="disable-reddit" type="checkbox"/>
- </div>
- <div class="wikipedia some-block"><a class="title" href="https://wikipedia.com"><img src="../../assets/images/wikipedia-icon.svg"/>
- <h4 data-localise="__MSG_wikipedia__">Wikipedia</h4></a>
- <input class="disable-wikipedia" type="checkbox"/>
- </div>
- <div class="medium some-block"><a class="title" href="https://medium.com">
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
- <circle cx="500" cy="500" r="500"></circle>
- <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
- <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
- </svg>
- <h4 data-localise="__MSG_medium__">Medium</h4></a>
- <input class="disable-medium" type="checkbox"/>
- </div>
- <div class="quora some-block"><a class="title" href="https://quora.com"><img src="../../assets/images/quora.png"/>
- <h4>Quora</h4></a>
- <input class="disable-quora" type="checkbox"/>
- </div>
- <div class="imdb some-block"><a class="title" href="https://imdb.com"><img src="../../assets/images/imdb.svg"/>
- <h4>IMDb</h4></a>
- <input class="disable-imdb" type="checkbox"/>
- </div>
- <div class="reuters some-block"><a class="title" href="https://reuters.com"><img src="../../assets/images/reuters.svg"/>
- <h4>Reuters</h4></a>
- <input class="disable-reuters" type="checkbox"/>
- </div>
- <div class="peertube some-block"><a class="title" href="https://search.joinpeertube.org"><img src="../../assets/images/peertube-icon.svg"/>
- <h4 data-localise="__MSG_peertube__">PeerTube</h4></a>
- <input class="disable-peertube" type="checkbox"/>
- </div>
- <div class="lbry some-block"><a class="title" href="https://odysee.com/"><img src="../../assets/images/lbry-icon.png"/>
- <h4 data-localise="__MSG_lbry__">LBRY</h4></a>
- <input class="disable-lbry" type="checkbox"/>
- </div>
- <div class="search some-block"><a class="title" href="https://search.libredirect.invalid">
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
- <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
- </svg>
- <h4 data-localise="__MSG_search__">Search</h4></a>
- <input class="disable-search" type="checkbox"/>
- </div>
- <div class="translate some-block"><a class="title" href="https://translate.google.com">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
- </svg>
- <h4 data-localise="__MSG_translate__">Translate</h4></a>
- <input class="disable-translate" type="checkbox"/>
- </div>
- <div class="maps some-block"><a class="title" href="https://www.openstreetmap.org">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
- </svg>
- <h4 data-localise="__MSG_maps__">Maps</h4></a>
- <input class="disable-osm" type="checkbox"/>
- </div>
- <div class="sendTargets some-block"><a class="title" href="https://send.libredirect.invalid">
- <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
- <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
- </svg>
- <h4 data-localise="__MSG_sendFiles__">Send Files</h4></a>
- <input class="disable-sendTargets" type="checkbox"/>
- </div>
+ <div class="youtube some-block"><a class="title" href="https://youtube.com">
+ <img src="../../assets/images/youtube-icon.png"/>
+ <h4 data-localise="__MSG_youtube__">Youtube</h4></a>
+ <input class="youtube-enabled" type="checkbox"/>
+</div>
+<div class="youtubeMusic some-block"><a class="title" href="https://music.youtube.com">
+ <img src="../../assets/images/youtubeMusic-icon.png"/>
+ <h4 data-localise="__MSG_youtubeMusic__">YT Music</h4></a>
+ <input class="youtubeMusic-enabled" type="checkbox"/>
+</div>
+<div class="twitter some-block"><a class="title" href="https://twitter.com">
+ <img src="../../assets/images/twitter-icon.png"/>
+ <h4 data-localise="__MSG_twitter__">Twitter</h4></a>
+ <input class="twitter-enabled" type="checkbox"/>
+</div>
+<div class="instagram some-block"><a class="title" href="https://instagram.com">
+ <img src="../../assets/images/instagram-icon.png"/>
+ <h4 data-localise="__MSG_instagram__">Instagram</h4></a>
+ <input class="instagram-enabled" type="checkbox"/>
+</div>
+<div class="tiktok some-block"><a class="title" href="https://tiktok.com">
+ <img src="../../assets/images/tiktok-icon.png"/>
+ <h4 data-localise="__MSG_tiktok__">TikTok</h4></a>
+ <input class="tiktok-enabled" type="checkbox"/>
+</div>
+<div class="reddit some-block"><a class="title" href="https://reddit.com">
+ <img src="../../assets/images/reddit-icon.png"/>
+ <h4 data-localise="__MSG_reddit__">Reddit</h4></a>
+ <input class="reddit-enabled" type="checkbox"/>
+</div>
+<div class="imgur some-block"><a class="title" href="https://imgur.com">
+ <img src="../../assets/images/imgur-icon.png"/>
+ <h4 data-localise="__MSG_imgur__">Imgur</h4></a>
+ <input class="imgur-enabled" type="checkbox"/>
+</div>
+<div class="wikipedia some-block"><a class="title" href="https://wikipedia.org">
+ <img src="../../assets/images/wikipedia-icon.svg"/>
+ <h4 data-localise="__MSG_wikipedia__">Wikipedia</h4></a>
+ <input class="wikipedia-enabled" type="checkbox"/>
+</div>
+<div class="medium some-block"><a class="title" href="https://medium.com">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor">
+ <circle cx="500" cy="500" r="500"></circle>
+ <ellipse ry="475" rx="250" cy="501" cx="1296"></ellipse>
+ <ellipse cx="1682" cy="502" rx="88" ry="424"></ellipse>
+</svg>
+
+ <h4 data-localise="__MSG_medium__">Medium</h4></a>
+ <input class="medium-enabled" type="checkbox"/>
+</div>
+<div class="quora some-block"><a class="title" href="https://quora.com">
+ <img src="../../assets/images/quora-icon.png"/>
+ <h4 data-localise="__MSG_quora__">Quora</h4></a>
+ <input class="quora-enabled" type="checkbox"/>
+</div>
+<div class="imdb some-block"><a class="title" href="https://imdb.com">
+ <img src="../../assets/images/imdb-icon.svg"/>
+ <h4 data-localise="__MSG_imdb__">IMDb</h4></a>
+ <input class="imdb-enabled" type="checkbox"/>
+</div>
+<div class="reuters some-block"><a class="title" href="https://reuters.com">
+ <img src="../../assets/images/reuters-icon.svg"/>
+ <h4 data-localise="__MSG_reuters__">Reuters</h4></a>
+ <input class="reuters-enabled" type="checkbox"/>
+</div>
+<div class="peertube some-block"><a class="title" href="https://search.joinpeertube.org">
+ <img src="../../assets/images/peertube-icon.svg"/>
+ <h4 data-localise="__MSG_peertube__">PeerTube</h4></a>
+ <input class="peertube-enabled" type="checkbox"/>
+</div>
+<div class="lbry some-block"><a class="title" href="https://odysee.com">
+ <img src="../../assets/images/lbry-icon.png"/>
+ <h4 data-localise="__MSG_lbry__">LBRY</h4></a>
+ <input class="lbry-enabled" type="checkbox"/>
+</div>
+<div class="search some-block"><a class="title" href="https://search.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+ <path d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_search__">Search</h4></a>
+ <input class="search-enabled" type="checkbox"/>
+</div>
+<div class="translate some-block"><a class="title" href="https://translate.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_translate__">Translate</h4></a>
+ <input class="translate-enabled" type="checkbox"/>
+</div>
+<div class="maps some-block"><a class="title" href="https://maps.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_maps__">Maps</h4></a>
+ <input class="maps-enabled" type="checkbox"/>
+</div>
+<div class="sendFiles some-block"><a class="title" href="https://send.libredirect.invalid">
+ <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
+ <path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z"></path>
+</svg>
+
+ <h4 data-localise="__MSG_sendFiles__">Send Files</h4></a>
+ <input class="sendFiles-enabled" type="checkbox"/>
+</div>
+
</div>
<hr>
<div class="some-block" id="change_instance_div"><a class="title button prevent" id="change_instance">
@@ -203,7 +241,7 @@
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
<path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"></path>
</svg></a></div>
- <div class="some-block" id="unify_div" title="Unify cookies across all selected instances"><a class="title button prevent" id="unify">
+ <div class="some-block" id="unify_div" title="Unify preferences across all selected instances"><a class="title button prevent" id="unify">
<h4 data-localise="__MSG_unifySettings__">Unify Settings</h4>
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor">
<path d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z"></path>
@@ -222,4 +260,4 @@
<script type="module" src="../options/init.js"></script>
<script type="module" src="./popup.js"></script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/src/pages/popup/popup.js b/src/pages/popup/popup.js
index 465080c5..ed1546c7 100644
--- a/src/pages/popup/popup.js
+++ b/src/pages/popup/popup.js
@@ -2,41 +2,24 @@
window.browser = window.browser || window.chrome
import utils from "../../assets/javascripts/utils.js"
-import generalHelper from "../../assets/javascripts/general.js"
+// import generalHelper from "../../assets/javascripts/general.js"
+import serviceHelper from "../../assets/javascripts/services.js"
-import youtubeHelper from "../../assets/javascripts/youtube/youtube.js"
-import youtubeMusicHelper from "../../assets/javascripts/youtubeMusic.js"
-import twitterHelper from "../../assets/javascripts/twitter.js"
-import instagramHelper from "../../assets/javascripts/instagram.js"
-import redditHelper from "../../assets/javascripts/reddit.js"
-import searchHelper from "../../assets/javascripts/search.js"
-import translateHelper from "../../assets/javascripts/translate/translate.js"
-import mapsHelper from "../../assets/javascripts/maps.js"
-import wikipediaHelper from "../../assets/javascripts/wikipedia.js"
-import mediumHelper from "../../assets/javascripts/medium.js"
-import quoraHelper from "../../assets/javascripts/quora.js"
-import libremdbHelper from "../../assets/javascripts/imdb.js"
-import reutersHelper from "../../assets/javascripts/reuters.js"
-import imgurHelper from "../../assets/javascripts/imgur.js"
-import tiktokHelper from "../../assets/javascripts/tiktok.js"
-import sendTargetsHelper from "../../assets/javascripts/sendTargets.js"
-import peertubeHelper from "../../assets/javascripts/peertube.js"
-import lbryHelper from "../../assets/javascripts/lbry.js"
+let config,
+ divs = {}
-utils.unify(true).then(r => {
- if (!r) document.getElementById("unify_div").style.display = "none"
- else {
- const unify = document.getElementById("unify")
- const textElement = document.getElementById("unify").getElementsByTagName("h4")[0]
- unify.addEventListener("click", () => {
- const oldHtml = textElement.innerHTML
- textElement.innerHTML = "..."
- browser.runtime.sendMessage({ function: "unify" }, response => {
- if (response && response.response) textElement.innerHTML = oldHtml
+async function getConfig() {
+ return new Promise(resolve => {
+ fetch("/config/config.json")
+ .then(response => response.text())
+ .then(data => {
+ config = JSON.parse(data)
+ resolve()
})
- })
- }
-})
+ })
+}
+
+await getConfig()
utils.switchInstance(true).then(r => {
if (!r) document.getElementById("change_instance_div").style.display = "none"
@@ -55,386 +38,92 @@ document.getElementById("more-options").addEventListener("click", () => browser.
const allSites = document.getElementsByClassName("all_sites")[0]
const currSite = document.getElementsByClassName("current_site")[0]
-const disableTwitterCurrentSite = currSite.getElementsByClassName("disable-nitter")[0]
-const disableTwitterAllSites = allSites.getElementsByClassName("disable-nitter")[0]
-
-const disableYoutubeCurrentSite = currSite.getElementsByClassName("disable-youtube")[0]
-const disableYoutubeAllSites = allSites.getElementsByClassName("disable-youtube")[0]
-
-const disableYoutubeMusicCurrentSite = currSite.getElementsByClassName("disable-youtubeMusic")[0]
-const disableYoutubeMusicAllSites = allSites.getElementsByClassName("disable-youtubeMusic")[0]
-
-const disableInstagramCurrentSite = currSite.getElementsByClassName("disable-bibliogram")[0]
-const disableInstagramAllSites = allSites.getElementsByClassName("disable-bibliogram")[0]
-
-const disableMapsCurrentSite = currSite.getElementsByClassName("disable-osm")[0]
-const disableMapsAllSites = allSites.getElementsByClassName("disable-osm")[0]
-
-const disableRedditCurrentSite = currSite.getElementsByClassName("disable-reddit")[0]
-const disableRedditAllSites = allSites.getElementsByClassName("disable-reddit")[0]
-
-const disableSearchCurrentSite = currSite.getElementsByClassName("disable-search")[0]
-const disableSearchAllSites = allSites.getElementsByClassName("disable-search")[0]
-
-const disableTranslateCurrentSite = currSite.getElementsByClassName("disable-translate")[0]
-const disableTranslateAllSites = allSites.getElementsByClassName("disable-translate")[0]
-
-const disableWikipediaCurrentSite = currSite.getElementsByClassName("disable-wikipedia")[0]
-const disableWikipediaAllSites = allSites.getElementsByClassName("disable-wikipedia")[0]
-
-const disableMediumCurrentSite = currSite.getElementsByClassName("disable-medium")[0]
-const disableMediumAllSites = allSites.getElementsByClassName("disable-medium")[0]
-
-const disableQuoraCurrentSite = currSite.getElementsByClassName("disable-quora")[0]
-const disableQuoraAllSites = allSites.getElementsByClassName("disable-quora")[0]
-
-const disableImdbCurrentSite = currSite.getElementsByClassName("disable-imdb")[0]
-const disableImdbAllSites = allSites.getElementsByClassName("disable-imdb")[0]
-
-const disableReutersCurrentSite = currSite.getElementsByClassName("disable-reuters")[0]
-const disableReutersAllSites = allSites.getElementsByClassName("disable-reuters")[0]
-
-const disablePeertubeTargetsCurrentSite = currSite.getElementsByClassName("disable-peertube")[0]
-const disablePeertubeTargetsAllSites = allSites.getElementsByClassName("disable-peertube")[0]
-
-const disableLbryTargetsCurrentSite = currSite.getElementsByClassName("disable-lbry")[0]
-const disableLbryTargetsAllSites = allSites.getElementsByClassName("disable-lbry")[0]
-
-const disableSendTargetsCurrentSite = currSite.getElementsByClassName("disable-sendTargets")[0]
-const disableSendTargetsAllSites = allSites.getElementsByClassName("disable-sendTargets")[0]
-
-const disableImgurCurrentSite = currSite.getElementsByClassName("disable-imgur")[0]
-const disableImgurAllSites = allSites.getElementsByClassName("disable-imgur")[0]
+function setDivs() {
+ return new Promise(resolve => {
+ for (const service in config.services) {
+ divs[service] = {}
+ divs[service].toggle = {}
+ divs[service].current = currSite.getElementsByClassName(service)[0]
+ divs[service].all = allSites.getElementsByClassName(service)[0]
+ divs[service].toggle.current = currSite.getElementsByClassName(service + "-enabled")[0]
+ divs[service].toggle.all = allSites.getElementsByClassName(service + "-enabled")[0]
+ }
+ resolve()
+ })
+}
-const disableTiktokCurrentSite = currSite.getElementsByClassName("disable-tiktok")[0]
-const disableTiktokAllSites = allSites.getElementsByClassName("disable-tiktok")[0]
+await setDivs()
const currentSiteIsFrontend = document.getElementById("current_site_divider")
-browser.storage.local.get(
- [
- "disableTwitter",
- "disableYoutube",
- "disableYoutubeMusic",
- "disableInstagram",
- "disableMaps",
- "disableReddit",
- "disableSearch",
- "translateDisable",
- "disableWikipedia",
- "disableImgur",
- "disableTiktok",
- "disableMedium",
- "disableQuora",
- "disableImdb",
- "disableReuters",
- "disablePeertubeTargets",
- "disableLbryTargets",
- "disableSendTarget",
- "popupFrontends",
- ],
- r => {
- disableTwitterCurrentSite.checked = !r.disableTwitter
- disableTwitterAllSites.checked = !r.disableTwitter
- disableYoutubeCurrentSite.checked = !r.disableYoutube
- disableYoutubeAllSites.checked = !r.disableYoutube
- disableYoutubeMusicCurrentSite.checked = !r.disableYoutubeMusic
- disableYoutubeMusicAllSites.checked = !r.disableYoutubeMusic
- disableInstagramCurrentSite.checked = !r.disableInstagram
- disableInstagramAllSites.checked = !r.disableInstagram
- disableMapsCurrentSite.checked = !r.disableMaps
- disableMapsAllSites.checked = !r.disableMaps
- disableRedditCurrentSite.checked = !r.disableReddit
- disableRedditAllSites.checked = !r.disableReddit
- disableSearchCurrentSite.checked = !r.disableSearch
- disableSearchAllSites.checked = !r.disableSearch
- disableTranslateCurrentSite.checked = !r.translateDisable
- disableTranslateAllSites.checked = !r.translateDisable
- disableWikipediaCurrentSite.checked = !r.disableWikipedia
- disableWikipediaAllSites.checked = !r.disableWikipedia
- disableImgurCurrentSite.checked = !r.disableImgur
- disableImgurAllSites.checked = !r.disableImgur
- disableTiktokCurrentSite.checked = !r.disableTiktok
- disableTiktokAllSites.checked = !r.disableTiktok
- disableMediumCurrentSite.checked = !r.disableMedium
- disableMediumAllSites.checked = !r.disableMedium
- disableQuoraCurrentSite.checked = !r.disableQuora
- disableQuoraAllSites.checked = !r.disableQuora
- disableImdbCurrentSite.checked = !r.disableImdb
- disableImdbAllSites.checked = !r.disableImdb
- disableReutersCurrentSite.checked = !r.disableReuters
- disableReutersAllSites.checked = !r.disableReuters
- disablePeertubeTargetsCurrentSite.checked = !r.disablePeertubeTargets
- disablePeertubeTargetsAllSites.checked = !r.disablePeertubeTargets
- disableLbryTargetsCurrentSite.checked = !r.disableLbryTargets
- disableLbryTargetsAllSites.checked = !r.disableLbryTargets
- disableSendTargetsCurrentSite.checked = !r.disableSendTarget
- disableSendTargetsAllSites.checked = !r.disableSendTarget
+browser.storage.local.get("options", r => {
+ browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
+ for (const service in config.services) {
+ if (!r.options.popupServices.includes(service)) allSites.getElementsByClassName(service)[0].classList.add("hide")
+ else allSites.getElementsByClassName(service)[0].classList.remove("hide")
+ currSite.getElementsByClassName(service)[0].classList.add("hide")
+ }
- browser.tabs.query({ active: true, currentWindow: true }, async tabs => {
- for (const frontend of generalHelper.allPopupFrontends) {
- if (!r.popupFrontends.includes(frontend)) allSites.getElementsByClassName(frontend)[0].classList.add("hide")
- else allSites.getElementsByClassName(frontend)[0].classList.remove("hide")
- currSite.getElementsByClassName(frontend)[0].classList.add("hide")
- }
+ for (const service in config.services) {
+ divs[service].toggle.all.checked = r.options[service].enabled
+ divs[service].toggle.current.checked = r.options[service].enabled
+ }
- let url
- try {
- url = new URL(tabs[0].url)
- } catch {
- currentSiteIsFrontend.classList.add("hide")
- return
- }
+ let url
+ try {
+ url = new URL(tabs[0].url)
+ } catch {
+ currentSiteIsFrontend.classList.add("hide")
+ document.getElementById("unify_div").style.display = "none"
+ return
+ }
- if (youtubeMusicHelper.redirect(url, "main_frame", false, true) || (await youtubeMusicHelper.switchInstance(url, true))) {
- currSite.getElementsByClassName("youtubeMusic")[0].classList.remove("hide")
- allSites.getElementsByClassName("youtubeMusic")[0].classList.add("hide")
- } else if (twitterHelper.redirect(url, "main_frame", false, true) || (await twitterHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("twitter")[0].classList.remove("hide")
- allSites.getElementsByClassName("twitter")[0].classList.add("hide")
- } else if (instagramHelper.redirect(url, "main_frame", false, true) || (await instagramHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("instagram")[0].classList.remove("hide")
- allSites.getElementsByClassName("instagram")[0].classList.add("hide")
- } else if (mapsHelper.redirect(url, false)) {
- currSite.getElementsByClassName("maps")[0].classList.remove("hide")
- allSites.getElementsByClassName("maps")[0].classList.add("hide")
- } else if (redditHelper.redirect(url, "main_frame", false, true) || (await redditHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("reddit")[0].classList.remove("hide")
- allSites.getElementsByClassName("reddit")[0].classList.add("hide")
- } else if (mediumHelper.redirect(url, "main_frame", false, true) || (await mediumHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("medium")[0].classList.remove("hide")
- allSites.getElementsByClassName("medium")[0].classList.add("hide")
- } else if (quoraHelper.redirect(url, "main_frame", false, true) || (await quoraHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("quora")[0].classList.remove("hide")
- allSites.getElementsByClassName("quora")[0].classList.add("hide")
- } else if (libremdbHelper.redirect(url, "main_frame", false, true) || (await libremdbHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("imdb")[0].classList.remove("hide")
- allSites.getElementsByClassName("imdb")[0].classList.add("hide")
- } else if (reutersHelper.redirect(url, "main_frame", false, true)) {
- currSite.getElementsByClassName("reuters")[0].classList.remove("hide")
- allSites.getElementsByClassName("reuters")[0].classList.add("hide")
- } else if (imgurHelper.redirect(url, "main_frame", false, true) || (await imgurHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("imgur")[0].classList.remove("hide")
- allSites.getElementsByClassName("imgur")[0].classList.add("hide")
- } else if (tiktokHelper.redirect(url, "main_frame", false, true) || (await tiktokHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("tiktok")[0].classList.remove("hide")
- allSites.getElementsByClassName("tiktok")[0].classList.add("hide")
- } else if (sendTargetsHelper.redirect(url, "main_frame", false, true) || (await sendTargetsHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("sendTargets")[0].classList.remove("hide")
- allSites.getElementsByClassName("sendTargets")[0].classList.add("hide")
- } else if (peertubeHelper.redirect(url, "main_frame", false, true) || (await peertubeHelper.switchInstance(url, true))) {
- currSite.getElementsByClassName("peertube")[0].classList.remove("hide")
- allSites.getElementsByClassName("peertube")[0].classList.add("hide")
- } else if (lbryHelper.redirect(url, "main_frame", false, true) || (await lbryHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("lbry")[0].classList.remove("hide")
- allSites.getElementsByClassName("lbry")[0].classList.add("hide")
- } else if (translateHelper.redirect(url, true) || (await translateHelper.switchInstance(url, true))) {
- currSite.getElementsByClassName("translate")[0].classList.remove("hide")
- allSites.getElementsByClassName("translate")[0].classList.add("hide")
- } else if (searchHelper.redirect(url, true) || (await searchHelper.switchInstance(url, true))) {
- currSite.getElementsByClassName("search")[0].classList.remove("hide")
- allSites.getElementsByClassName("search")[0].classList.add("hide")
- } else if (wikipediaHelper.redirect(url, true) || (await wikipediaHelper.switchInstance(url, true))) {
- currSite.getElementsByClassName("wikipedia")[0].classList.remove("hide")
- allSites.getElementsByClassName("wikipedia")[0].classList.add("hide")
- } else if (youtubeHelper.redirect(url, "main_frame", false, true) || (await youtubeHelper.switchInstance(url, "main_frame", false, true))) {
- currSite.getElementsByClassName("youtube")[0].classList.remove("hide")
- allSites.getElementsByClassName("youtube")[0].classList.add("hide")
- } else {
- currentSiteIsFrontend.classList.add("hide")
+ let service = await serviceHelper.computeService(url, true)
+ let frontend
+ if (service) {
+ if (service[0]) {
+ frontend = service[1]
+ service = service[0]
}
- })
- }
-)
-
-document.addEventListener("change", () => {
- browser.storage.local.get(
- [
- "disableTwitter",
- "disableYoutube",
- "disableYoutubeMusic",
- "disableInstagram",
- "disableMaps",
- "disableReddit",
- "disableSearch",
- "translateDisable",
- "disableWikipedia",
- "disableImgur",
- "disableTiktok",
- "disableMedium",
- "disableQuora",
- "disableImdb",
- "disableReuters",
- "disablePeertubeTargets",
- "disableLbryTargets",
- "disableSendTarget",
- ],
- r => {
- if (!r.disableTwitter != disableTwitterCurrentSite.checked)
- browser.storage.local.set({
- disableTwitter: !disableTwitterCurrentSite.checked,
- })
- else if (!r.disableTwitter != disableTwitterAllSites.checked)
- browser.storage.local.set({
- disableTwitter: !disableTwitterAllSites.checked,
- })
-
- if (!r.disableYoutube != disableYoutubeCurrentSite.checked)
- browser.storage.local.set({
- disableYoutube: !disableYoutubeCurrentSite.checked,
- })
- else if (!r.disableYoutube != disableYoutubeAllSites.checked)
- browser.storage.local.set({
- disableYoutube: !disableYoutubeAllSites.checked,
- })
-
- if (!r.disableYoutubeMusic != disableYoutubeMusicCurrentSite.checked)
- browser.storage.local.set({
- disableYoutubeMusic: !disableYoutubeMusicCurrentSite.checked,
- })
- else if (!r.disableYoutubeMusic != disableYoutubeMusicAllSites.checked)
- browser.storage.local.set({
- disableYoutubeMusic: !disableYoutubeMusicAllSites.checked,
- })
-
- if (!r.disableInstagram != disableInstagramCurrentSite.checked)
- browser.storage.local.set({
- disableInstagram: !disableInstagramCurrentSite.checked,
- })
- else if (!r.disableInstagram != disableInstagramAllSites.checked)
- browser.storage.local.set({
- disableInstagram: !disableInstagramAllSites.checked,
- })
-
- if (!r.disableMaps != disableMapsCurrentSite.checked)
- browser.storage.local.set({
- disableMaps: !disableMapsCurrentSite.checked,
- })
- else if (!r.disableMaps != disableMapsAllSites.checked)
- browser.storage.local.set({
- disableMaps: !disableMapsAllSites.checked,
- })
-
- if (!r.disableReddit != disableRedditCurrentSite.checked)
- browser.storage.local.set({
- disableReddit: !disableRedditCurrentSite.checked,
- })
- else if (!r.disableReddit != disableRedditAllSites.checked)
- browser.storage.local.set({
- disableReddit: !disableRedditAllSites.checked,
- })
-
- if (!r.disableSearch != disableSearchCurrentSite.checked)
- browser.storage.local.set({
- disableSearch: !disableSearchCurrentSite.checked,
- })
- else if (!r.disableSearch != disableSearchAllSites.checked)
- browser.storage.local.set({
- disableSearch: !disableSearchAllSites.checked,
- })
-
- if (!r.translateDisable != disableTranslateCurrentSite.checked)
- browser.storage.local.set({
- translateDisable: !disableTranslateCurrentSite.checked,
- })
- else if (!r.translateDisable != disableTranslateAllSites.checked)
- browser.storage.local.set({
- translateDisable: !disableTranslateAllSites.checked,
- })
-
- if (!r.disableWikipedia != disableWikipediaCurrentSite.checked)
- browser.storage.local.set({
- disableWikipedia: !disableWikipediaCurrentSite.checked,
- })
- else if (!r.disableWikipedia != disableWikipediaAllSites.checked)
- browser.storage.local.set({
- disableWikipedia: !disableWikipediaAllSites.checked,
- })
-
- if (!r.disableImgur != disableImgurCurrentSite.checked)
- browser.storage.local.set({
- disableImgur: !disableImgurCurrentSite.checked,
- })
- else if (!r.disableImgur != disableImgurAllSites.checked)
- browser.storage.local.set({
- disableImgur: !disableImgurAllSites.checked,
- })
-
- if (!r.disableTiktok != disableTiktokCurrentSite.checked)
- browser.storage.local.set({
- disableTiktok: !disableTiktokCurrentSite.checked,
- })
- else if (!r.disableTiktok != disableTiktokAllSites.checked)
- browser.storage.local.set({
- disableTiktok: !disableTiktokAllSites.checked,
- })
-
- if (!r.disableMedium != disableMediumCurrentSite.checked)
- browser.storage.local.set({
- disableMedium: !disableMediumCurrentSite.checked,
- })
- else if (!r.disableMedium != disableMediumAllSites.checked)
- browser.storage.local.set({
- disableMedium: !disableMediumAllSites.checked,
- })
-
- if (!r.disableQuora != disableQuoraCurrentSite.checked)
- browser.storage.local.set({
- disableQuora: !disableQuoraCurrentSite.checked,
- })
- else if (!r.disableQuora != disableQuoraAllSites.checked)
- browser.storage.local.set({
- disableQuora: !disableQuoraAllSites.checked,
- })
-
- if (!r.disableImdb != disableImdbCurrentSite.checked)
- browser.storage.local.set({
- disableImdb: !disableImdbCurrentSite.checked,
- })
- else if (!r.disableImdb != disableImdbAllSites.checked)
- browser.storage.local.set({
- disableImdb: !disableImdbAllSites.checked,
- })
-
- if (!r.disableReuters != disableReutersCurrentSite.checked)
- browser.storage.local.set({
- disableReuters: !disableReutersCurrentSite.checked,
- })
- else if (!r.disableReuters != disableReutersAllSites.checked)
- browser.storage.local.set({
- disableReuters: !disableReutersAllSites.checked,
- })
-
- if (!r.disablePeertubeTargets != disablePeertubeTargetsCurrentSite.checked)
- browser.storage.local.set({
- disablePeertubeTargets: !disablePeertubeTargetsCurrentSite.checked,
- })
- else if (!r.disablePeertubeTargets != disablePeertubeTargetsAllSites.checked)
- browser.storage.local.set({
- disablePeertubeTargets: !disablePeertubeTargetsAllSites.checked,
- })
-
- if (!r.disableLbryTargets != disableLbryTargetsCurrentSite.checked)
- browser.storage.local.set({
- disableLbryTargets: !disableLbryTargetsCurrentSite.checked,
- })
- else if (!r.disableLbryTargets != disableLbryTargetsAllSites.checked)
- browser.storage.local.set({
- disableLbryTargets: !disableLbryTargetsAllSites.checked,
- })
-
- if (!r.disableSendTarget != disableSendTargetsCurrentSite.checked)
- browser.storage.local.set({
- disableSendTarget: !disableSendTargetsCurrentSite.checked,
- })
- else if (!r.disableSendTarget != disableSendTargetsAllSites.checked)
- browser.storage.local.set({
- disableSendTarget: !disableSendTargetsAllSites.checked,
+ divs[service].current.classList.remove("hide")
+ divs[service].all.classList.add("hide")
+ if (frontend && config.services[service].frontends[frontend].preferences && !config.services[service].frontends[frontend].preferences.token) {
+ const unify = document.getElementById("unify")
+ const textElement = document.getElementById("unify").getElementsByTagName("h4")[0]
+ unify.addEventListener("click", () => {
+ const oldHtml = textElement.innerHTML
+ textElement.innerHTML = "..."
+ browser.runtime.sendMessage({ function: "unify" }, response => {
+ if (response && response.response) textElement.innerHTML = oldHtml
+ })
})
+ } else {
+ document.getElementById("unify_div").style.display = "none"
+ }
+ } else {
+ currentSiteIsFrontend.classList.add("hide")
+ document.getElementById("unify_div").style.display = "none"
}
- )
+ })
})
+for (const service in config.services) {
+ divs[service].toggle.all.addEventListener("change", () => {
+ browser.storage.local.get("options", r => {
+ let options = r.options
+ options[service].enabled = divs[service].toggle.all.checked
+ browser.storage.local.set({ options })
+ })
+ })
+ divs[service].toggle.current.addEventListener("change", () => {
+ browser.storage.local.get("options", r => {
+ let options = r.options
+ options[service].enabled = divs[service].toggle.current.checked
+ browser.storage.local.set({ options })
+ })
+ })
+}
+
for (const a of document.getElementsByTagName("a")) {
a.addEventListener("click", e => {
if (!a.classList.contains("prevent")) {
diff --git a/src/pages/popup/popup.pug b/src/pages/popup/popup.pug
deleted file mode 100644
index cc7fc7a2..00000000
--- a/src/pages/popup/popup.pug
+++ /dev/null
@@ -1,155 +0,0 @@
-include ../widgets/icons.pug
-
-mixin services
- .youtube.some-block
- a.title(href="https://youtube.com")
- img(src="../../assets/images/youtube-icon.png")
- h4(data-localise="__MSG_youtube__") YouTube
- input.disable-youtube(type="checkbox")
-
- .youtubeMusic.some-block
- a.title(href="https://music.youtube.com")
- img(src="../../assets/images/youtube-music-icon.png")
- h4(data-localise="__MSG_ytmusic__") YT Music
- input.disable-youtubeMusic(type="checkbox")
-
- .twitter.some-block
- a.title(href="https://twitter.com")
- img(src="../../assets/images/twitter-icon.png")
- h4(data-localise="__MSG_twitter__") Twitter
- input.disable-nitter(type="checkbox")
-
- .instagram.some-block
- a.title(href="https://instagram.com")
- img(src="../../assets/images/instagram-icon.png")
- h4(data-localise="__MSG_instagram__") Instagram
- input.disable-bibliogram(type="checkbox")
-
- .tiktok.some-block
- a.title(href="https://tiktok.com")
- img(src="../../assets/images/tiktok-icon.png")
- h4(data-localise="__MSG_tiktok__") TikTok
- input.disable-tiktok(type="checkbox")
-
- .imgur.some-block
- a.title(href="https://imgur.com")
- img(src="../../assets/images/imgur.png")
- h4(data-localise="__MSG_imgur__") Imgur
- input.disable-imgur(type="checkbox")
-
- .reddit.some-block
- a.title(href="https://reddit.com")
- img(src="../../assets/images/reddit-icon.png")
- h4(data-localise="__MSG_reddit__") Reddit
- input.disable-reddit(type="checkbox")
-
- .wikipedia.some-block
- a.title(href="https://wikipedia.com")
- img(src="../../assets/images/wikipedia-icon.svg")
- h4(data-localise="__MSG_wikipedia__") Wikipedia
- input.disable-wikipedia(type="checkbox")
-
- .medium.some-block
- a.title(href="https://medium.com")
- +medium
- h4(data-localise="__MSG_medium__") Medium
- input.disable-medium(type="checkbox")
-
- .quora.some-block
- a.title(href="https://quora.com")
- img(src="../../assets/images/quora.png")
- h4() Quora
- input.disable-quora(type="checkbox")
-
- .imdb.some-block
- a.title(href="https://imdb.com")
- img(src="../../assets/images/imdb.svg")
- h4() IMDb
- input.disable-imdb(type="checkbox")
-
- .reuters.some-block
- a.title(href="https://reuters.com")
- img(src="../../assets/images/reuters.svg")
- h4() Reuters
- input.disable-reuters(type="checkbox")
-
- .peertube.some-block
- a.title(href="https://search.joinpeertube.org")
- img(src="../../assets/images/peertube-icon.svg")
- h4(data-localise="__MSG_peertube__") PeerTube
- input.disable-peertube(type="checkbox")
-
- .lbry.some-block
- a.title(href="https://odysee.com/")
- img(src="../../assets/images/lbry-icon.png")
- h4(data-localise="__MSG_lbry__") LBRY
- input.disable-lbry(type="checkbox")
-
- .search.some-block
- a.title(href="https://search.libredirect.invalid")
- +search
- h4(data-localise="__MSG_search__") Search
- input.disable-search(type="checkbox")
-
- .translate.some-block
- a.title(href="https://translate.google.com")
- +translate
- h4(data-localise="__MSG_translate__") Translate
- input.disable-translate(type="checkbox")
-
- .maps.some-block
- a.title(href="https://www.openstreetmap.org")
- +maps
- h4(data-localise="__MSG_maps__") Maps
- input.disable-osm(type="checkbox")
-
- .sendTargets.some-block
- a.title(href="https://send.libredirect.invalid")
- +send
- h4(data-localise="__MSG_sendFiles__") Send Files
- input.disable-sendTargets(type="checkbox")
-
-doctype html
-html(lang="en")
- head
- meta(charset="utf-8")
- meta(name="viewport" content="width=device-width, initial-scale=1")
- link(href="../stylesheets/styles.css" rel="stylesheet")
- link(href="./style.css" rel="stylesheet")
- body(dir="auto")
- .current_site
- +services
- #current_site_divider
- hr
- .all_sites
- +services
- hr
- #change_instance_div.some-block
- a#change_instance.title.button.prevent
- h4(data-localise="__MSG_switchInstance__") Change Instance
- +change_instance
-
- #copy_raw_div.some-block(title="Copy the original redirected link")
- a#copy_raw.title.button.prevent
- h4(data-localise="__MSG_copyRaw__") Copy Raw
- +copy_raw
-
- #unify_div.some-block(title="Unify cookies across all selected instances")
- a#unify.title.button.prevent
- h4(data-localise="__MSG_unifySettings__") Unify Settings
- +unify
-
- .some-block
- a#more-options.title.button.prevent
- h4(data-localise="__MSG_settings__") Settings
- +settings
-
- .some-block
- a#about.title.button(href="/pages/options/index.html#about")
- h4(data-localise="__MSG_about__") About
- +about
-
- .space
-
- script(type="module" src="../options/init.js")
- script(type="module" src="./popup.js")
diff --git a/src/pages/stylesheets/styles.css b/src/pages/stylesheets/styles.css
index 06abab3a..eb599656 100644
--- a/src/pages/stylesheets/styles.css
+++ b/src/pages/stylesheets/styles.css
@@ -80,11 +80,13 @@ select {
margin: 0;
max-width: 500px;
border-radius: 3px;
+ cursor: pointer;
}
input[type="url"],
input[type="text"] {
width: 400px;
+ cursor: text;
}
input:invalid {
@@ -141,6 +143,7 @@ input[type="range"] {
height: 7px;
border-radius: 50px;
background: var(--text);
+ cursor: ew-resize;
}
input[type="range"]:hover {
@@ -464,3 +467,13 @@ div.about > div {
div.about h4 {
width: auto;
}
+
+select:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+}
+
+input:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+}
diff --git a/src/pages/widgets/head.ejs b/src/pages/widgets/head.ejs
new file mode 100644
index 00000000..d9e3802a
--- /dev/null
+++ b/src/pages/widgets/head.ejs
@@ -0,0 +1,8 @@
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg">
+ <link href="../stylesheets/styles.css" rel="stylesheet">
+ <title>General</title>
+ <script type="module" src="./init.js"></script>
+</head>
diff --git a/src/pages/widgets/head.pug b/src/pages/widgets/head.pug
deleted file mode 100644
index 53de42d3..00000000
--- a/src/pages/widgets/head.pug
+++ /dev/null
@@ -1,5 +0,0 @@
-head
- meta(charset='utf-8')
- meta(name="viewport" content="width=device-width, initial-scale=1")
- link(rel="icon" type="image/x-icon" href="../../../assets/images/libredirect.svg")
- link(href="../../stylesheets/styles.css" rel="stylesheet") \ No newline at end of file
diff --git a/src/pages/widgets/icons.pug b/src/pages/widgets/icons.pug
deleted file mode 100644
index cc77ad16..00000000
--- a/src/pages/widgets/icons.pug
+++ /dev/null
@@ -1,46 +0,0 @@
-mixin medium
- svg(xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1770 1000" fill="currentColor")
- circle(cx="500" cy="500" r="500")
- ellipse(ry="475" rx="250" cy="501" cx="1296")
- ellipse(cx="1682" cy="502" rx="88" ry="424")
-
-mixin search
- svg(xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor")
- path(d="M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z")
-
-mixin translate
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z")
-
-mixin maps
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path( d="M20.5 3l-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5zM10 5.47l4 1.4v11.66l-4-1.4V5.47zm-5 .99l3-1.01v11.7l-3 1.16V6.46zm14 11.08l-3 1.01V6.86l3-1.16v11.84z")
-
-mixin send
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96zM14 13v4h-4v-4H7l5-5 5 5h-3z")
-
-mixin change_instance
- svg(xmlns="http://www.w3.org/2000/svg" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor")
- path(d="M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z")
-
-mixin settings
- svg(xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24"
- width="26px" fill="currentColor")
- path(d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z")
-
-mixin copy_raw
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z")
-
-mixin general
- svg(xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="26px" viewBox="0 0 24 24" width="26px" fill="currentColor")
- path(d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z")
-
-mixin unify
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M3.9 12c0-1.71 1.39-3.1 3.1-3.1h4V7H7c-2.76 0-5 2.24-5 5s2.24 5 5 5h4v-1.9H7c-1.71 0-3.1-1.39-3.1-3.1zM8 13h8v-2H8v2zm9-6h-4v1.9h4c1.71 0 3.1 1.39 3.1 3.1s-1.39 3.1-3.1 3.1h-4V17h4c2.76 0 5-2.24 5-5s-2.24-5-5-5z")
-
-mixin about
- svg( xmlns="http://www.w3.org/2000/svg" height="24" width="24" fill="currentColor")
- path( d="M11 17h2v-6h-2Zm1-8q.425 0 .713-.288Q13 8.425 13 8t-.287-.713Q12.425 7 12 7t-.712.287Q11 7.575 11 8t.288.712Q11.575 9 12 9Zm0 13q-2.075 0-3.9-.788-1.825-.787-3.175-2.137-1.35-1.35-2.137-3.175Q2 14.075 2 12t.788-3.9q.787-1.825 2.137-3.175 1.35-1.35 3.175-2.138Q9.925 2 12 2t3.9.787q1.825.788 3.175 2.138 1.35 1.35 2.137 3.175Q22 9.925 22 12t-.788 3.9q-.787 1.825-2.137 3.175-1.35 1.35-3.175 2.137Q14.075 22 12 22Zm0-2q3.35 0 5.675-2.325Q20 15.35 20 12q0-3.35-2.325-5.675Q15.35 4 12 4 8.65 4 6.325 6.325 4 8.65 4 12q0 3a.35 2.325 5.675Q8.65 20 12 20Zm0-8Z") \ No newline at end of file
diff --git a/src/pages/widgets/instances.pug b/src/pages/widgets/instances.pug
deleted file mode 100644
index 950bd46b..00000000
--- a/src/pages/widgets/instances.pug
+++ /dev/null
@@ -1,15 +0,0 @@
-mixin instances(myPlaceholder)
- .some-block.option-block
- h4(data-localise="__MSG_defaultInstances__") Default Instances
-
- .checklist
- hr
- .some-block.option-block
- h4(data-localise="__MSG_customInstances__") Custom Instances
- form.custom-instance-form
- .some-block.option-block
- input.custom-instance(placeholder=myPlaceholder type="url")
- button.add.add-instance(type="submit")
- svg(xmlns="https://www.w3.org/2000/svg" height="20px" viewBox="0 0 24 24" width="20px" fill="currentColor")
- path(d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z")
- .checklist.custom-checklist \ No newline at end of file
diff --git a/src/pages/widgets/latency.pug b/src/pages/widgets/latency.pug
deleted file mode 100644
index e5bf53b2..00000000
--- a/src/pages/widgets/latency.pug
+++ /dev/null
@@ -1,14 +0,0 @@
-mixin latency(service)
- - var latencyVal
- if (service)
- - latencyVal = `latency-${service}`
- else
- - latencyVal = `latency`
-
- .buttons.buttons-inline
- label.button.button-inline(id=`${latencyVal}-label` for=latencyVal)
- svg(xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor")
- path(d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z")
- |&nbsp;
- x(data-localise="__MSG_testInstancesLatency__") Test Instances Latency
- input.button.button-inline(id=latencyVal style="display:none;") \ No newline at end of file
diff --git a/src/pages/widgets/links.ejs b/src/pages/widgets/links.ejs
new file mode 100644
index 00000000..2373a101
--- /dev/null
+++ b/src/pages/widgets/links.ejs
@@ -0,0 +1,23 @@
+<section class="links" id="links">
+ <div class="title">
+ <a href="#general">
+ <%- include ('src/assets/images/general-icon.svg') %>
+ <span data-localise="__MSG_general__">General</span>
+ </a></div>
+ <% for (const service in services) { -%>
+ <div class="title">
+ <a href="#<%= service %>">
+ <% if (services[service].imageType != "svgMono") { _%>
+ <img src="../../../assets/images/<%= service %>-icon.<%= services[service].imageType %>">
+ <% } else { _%>
+ <%- include ('src/assets/images/' + service + '-icon.svg') %>
+ <% } _%>
+ <span data-localise="__MSG_<%= service %>__"><%= services[service].name %></span>
+ </a></div>
+ <% }; -%>
+ <div class="title">
+ <a href="#about">
+ <%- include ('src/assets/images/about-icon.svg') %>
+ <span data-localise="__MSG_about__">About</span>
+ </a></div>
+</section>
diff --git a/src/pages/widgets/links.pug b/src/pages/widgets/links.pug
deleted file mode 100644
index 37fe9375..00000000
--- a/src/pages/widgets/links.pug
+++ /dev/null
@@ -1,83 +0,0 @@
-include ./icons.pug
-
-mixin links(service)
- section#links.links
- .title
- +general
- a(href="#general" data-localise="__MSG_general__") General
-
- .title
- img(src="../../../assets/images/youtube-icon.png")
- a(href="#youtube" data-localise="__MSG_youtube__") YouTube
-
- .title
- img(src="../../../assets/images/youtube-music-icon.png")
- a(href="#youtubeMusic" data-localise="__MSG_ytmusic__") YT Music
-
- .title
- img(src="../../../assets/images/twitter-icon.png")
- a(href="#twitter" data-localise="__MSG_twitter__") Twitter
-
- .title
- img(src="../../../assets/images/instagram-icon.png")
- a(href="#instagram" data-localise="__MSG_instagram__") Instagram
-
- .title
- img(src="../../../assets/images/tiktok-icon.png")
- a(href="#tiktok" data-localise="__MSG_tiktok__") TikTok
-
- .title
- img(src="../../../assets/images/reddit-icon.png")
- a(href="#reddit" data-localise="__MSG_reddit__") Reddit
-
- .title
- img(src="../../../assets/images/imgur.png")
- a(href="#imgur" data-localise="__MSG_imgur__") Imgur
-
- .title
- img(src="../../../assets/images/wikipedia-icon.svg")
- a(href="#wikipedia" data-localise="__MSG_wikipedia__") Wikipedia
-
- .title
- +medium
- a(href="#medium" data-localise="__MSG_medium__") Medium
-
- .title
- img(src="../../../assets/images/quora.png")
- a(href="#quora" ) Quora
-
- .title
- img(src="../../../assets/images/imdb.svg")
- a(href="#imdb") IMDb
-
- .title
- img(src="../../../assets/images/reuters.svg")
- a(href="#reuters") Reuters
-
- .title
- img(src="../../../assets/images/peertube-icon.svg")
- a(href="#peertube" data-localise="__MSG_peertube__") PeerTube
-
- .title
- img(src="../../../assets/images/lbry-icon.png")
- a(href="#lbry" data-localise="__MSG_lbry__") LBRY
-
- .title
- +search
- a(href="#search" data-localise="__MSG_search__") Search
-
- .title
- +translate
- a(href="#translate" data-localise="__MSG_translate__") Translate
-
- .title
- +maps
- a(href="#maps" data-localise="__MSG_maps__") Maps
-
- .title
- +send
- a(href="#sendTargets" data-localise="__MSG_sendFiles__") Send Files
-
- .title
- +about
- a(href="#about" data-localise="__MSG_about") About
diff --git a/src/pages/widgets/switches.ejs b/src/pages/widgets/switches.ejs
new file mode 100644
index 00000000..e3ffdae7
--- /dev/null
+++ b/src/pages/widgets/switches.ejs
@@ -0,0 +1,11 @@
+<% for (const service in services) { -%>
+<div class="<%= service %> some-block"><a class="title" href="<%= services[service].url %>">
+ <% if (services[service].imageType != "svgMono") { _%>
+ <img src="../../assets/images/<%= service %>-icon.<%= services[service].imageType %>"/>
+ <% } else { _%>
+ <%- include ('src/assets/images/' + service + '-icon.svg') %>
+ <% } _%>
+ <h4 data-localise="__MSG_<%= service %>__"><%= services[service].name %></h4></a>
+ <input class="<%= service %>-enabled" type="checkbox"/>
+</div>
+<% } %>