about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorSimonBrazell <simon@brazell.com.au>2020-11-08 21:07:03 +1100
committerSimonBrazell <simon@brazell.com.au>2020-11-08 21:07:03 +1100
commit4bf5f20ad476d2f79ec5a23a9477f8719cc0b49a (patch)
tree240d2c525a2f3ac84d66b38661a5edc45621acbf
parentMerge branch 'master' of github.com:SimonBrazell/privacy-redirect (diff)
downloadlibredirect-4bf5f20ad476d2f79ec5a23a9477f8719cc0b49a.zip
Closes #111 - Adds ability to customise random instance pools
-rw-r--r--_locales/en/messages.json12
-rw-r--r--background.js104
-rw-r--r--pages/options/options.html46
-rw-r--r--pages/options/options.js82
-rw-r--r--pages/styles.css16
5 files changed, 204 insertions, 56 deletions
diff --git a/_locales/en/messages.json b/_locales/en/messages.json
index 096deaa0..3748db3b 100644
--- a/_locales/en/messages.json
+++ b/_locales/en/messages.json
@@ -110,5 +110,17 @@
   "useFreeTube": {
     "message": "Use FreeTube over Invidious when possible",
     "description": "Label for 'Use FreeTube over Invidious when possible' option (options)."
+  },
+  "nitterRandomPool": {
+    "message": "Nitter random instance pool (comma-separated)",
+    "description": "Label for 'Nitter random instance pool (comma-separated)' option (options)."
+  },
+  "invidiousRandomPool": {
+    "message": "Invidious random instance pool (comma-separated)",
+    "description": "Label for 'Invidious random instance pool (comma-separated)' option (options)."
+  },
+  "bibliogramRandomPool": {
+    "message": "Bibliogram random instance pool (comma-separated)",
+    "description": "Label for 'Bibliogram random instance pool (comma-separated)' option (options)."
   }
 }
diff --git a/background.js b/background.js
index ad9d3c45..1e236228 100644
--- a/background.js
+++ b/background.js
@@ -11,21 +11,6 @@ const youtubeDomains = [
   "s.ytimg.com",
   "music.youtube.com",
 ];
-const invidiousInstances = [
-  "https://invidious.snopyta.org",
-  "https://invidious.site",
-  "https://invidious.zapashcanon.fr",
-  "https://invidiou.site",
-  "https://invidious.kavin.rocks",
-  "https://tube.connect.cafe",
-];
-const twitterDomains = [
-  "twitter.com",
-  "www.twitter.com",
-  "mobile.twitter.com",
-  "pbs.twimg.com",
-  "video.twimg.com",
-];
 const nitterInstances = [
   "https://nitter.net",
   "https://nitter.snopyta.org",
@@ -34,13 +19,41 @@ const nitterInstances = [
   "https://nitter.13ad.de",
   "https://nitter.pussthecat.org",
   "https://nitter.mastodont.cat",
+  "https://nitter.dark.fail",
   "https://nitter.tedomum.net",
   "https://nitter.cattube.org",
   "https://nitter.fdn.fr",
   "https://nitter.1d4.us",
   "https://nitter.kavin.rocks",
-  "https://nitter.dark.fail",
   "https://tweet.lambda.dance",
+  "https://nitter.cc",
+  "https://nitter.weaponizedhumiliation.com",
+  "https://nitter.vxempire.xyz",
+  "http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion",
+  "http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion",
+  "http://nitterlgj3n5fgwesu3vxc5h67ruku33nqaoeoocae2mvlzhsu6k7fqd.onion",
+  "http://npf37k3mtzwxreiw52ccs5ay4e6qt2fkcs2ndieurdyn2cuzzsfyfvid.onion",
+];
+const twitterDomains = [
+  "twitter.com",
+  "www.twitter.com",
+  "mobile.twitter.com",
+  "pbs.twimg.com",
+  "video.twimg.com",
+];
+const invidiousInstances = [
+  "https://invidious.snopyta.org",
+  "https://invidious.xyz",
+  "https://invidious.kavin.rocks",
+  "https://tube.connect.cafe",
+  "https://invidious.zapashcanon.fr",
+  "https://invidiou.site",
+  "https://vid.mint.lgbt",
+  "https://invidious.site",
+  "http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion",
+  "http://qklhadlycap4cnod.onion",
+  "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion",
+  "http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion",
 ];
 const instagramDomains = [
   "instagram.com",
@@ -82,6 +95,7 @@ const bibliogramInstances = [
   "https://bg.endl.site",
   "https://bibliogram.13ad.de",
   "https://bibliogram.pixelfed.uno",
+  "https://bibliogram.ethibox.fr",
   "https://bibliogram.hamster.dance",
   "https://bibliogram.kavin.rocks",
   "https://bibliogram.ggc-project.de",
@@ -96,7 +110,7 @@ const redditDomains = [
 const redditBypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/;
 const oldRedditViews = [
   "https://old.reddit.com", // desktop
-  "https://i.reddit.com" // mobile
+  "https://i.reddit.com", // mobile
 ];
 const oldRedditDefaultView = oldRedditViews[0];
 const googleMapsRegex = /https?:\/\/(((www|maps)\.)?(google\.).*(\/maps)|maps\.(google\.).*)/;
@@ -135,10 +149,17 @@ let invidiousPlayerStyle;
 let invidiousSubtitles;
 let invidiousAutoplay;
 let useFreeTube;
+let nitterRandomPool;
+let invidiousRandomPool;
+let bibliogramRandomPool;
 let exceptions;
 
 window.browser = window.browser || window.chrome;
 
+function filterInstances(instances) {
+  return instances.filter((instance) => !instance.includes(".onion"));
+}
+
 browser.storage.sync.get(
   [
     "nitterInstance",
@@ -160,6 +181,9 @@ browser.storage.sync.get(
     "invidiousSubtitles",
     "invidiousAutoplay",
     "useFreeTube",
+    "nitterRandomPool",
+    "invidiousRandomPool",
+    "bibliogramRandomPool",
     "exceptions",
   ],
   (result) => {
@@ -187,6 +211,15 @@ browser.storage.sync.get(
     invidiousSubtitles = result.invidiousSubtitles || "";
     invidiousAutoplay = result.invidiousAutoplay;
     useFreeTube = result.useFreeTube;
+    nitterRandomPool = result.nitterRandomPool
+      ? result.nitterRandomPool.split(",")
+      : filterInstances(nitterInstances);
+    invidiousRandomPool = result.invidiousRandomPool
+      ? result.invidiousRandomPool.split(",")
+      : filterInstances(invidiousInstances);
+    bibliogramRandomPool = result.bibliogramRandomPool
+      ? result.bibliogramRandomPool.split(",")
+      : filterInstances(bibliogramInstances);
   }
 );
 
@@ -248,6 +281,15 @@ browser.storage.onChanged.addListener((changes) => {
   if ("useFreeTube" in changes) {
     useFreeTube = changes.useFreeTube.newValue;
   }
+  if ("nitterRandomPool" in changes) {
+    nitterRandomPool = changes.nitterRandomPool.newValue.split(",");
+  }
+  if ("invidiousRandomPool" in changes) {
+    invidiousRandomPool = changes.invidiousRandomPool.newValue.split(",");
+  }
+  if ("bibliogramRandomPool" in changes) {
+    bibliogramRandomPool = changes.bibliogramRandomPool.newValue.split(",");
+  }
   if ("exceptions" in changes) {
     exceptions = changes.exceptions.newValue.map((e) => {
       return new RegExp(e);
@@ -318,7 +360,7 @@ function redirectYouTube(url, initiator, type) {
   if (onlyEmbeddedVideo && type !== "sub_frame") {
     return null;
   }
-  if (useFreeTube && type !== "sub_frame") {
+  if (useFreeTube && type === "main_frame") {
     return `freetube://${url}`;
   }
   // Apply settings
@@ -343,7 +385,7 @@ function redirectYouTube(url, initiator, type) {
   url.searchParams.append("autoplay", invidiousAutoplay ? 1 : 0);
 
   return `${
-    invidiousInstance || getRandomInstance(invidiousInstances)
+    invidiousInstance || getRandomInstance(invidiousRandomPool)
   }${url.pathname.replace("/shorts", "")}${url.search}`;
 }
 
@@ -368,18 +410,18 @@ function redirectTwitter(url, initiator) {
   }
   if (url.host.split(".")[0] === "pbs") {
     return `${
-      nitterInstance || getRandomInstance(nitterInstances)
+      nitterInstance || getRandomInstance(nitterRandomPool)
     }/pic/${encodeURIComponent(url.href)}`;
   } else if (url.host.split(".")[0] === "video") {
     return `${
-      nitterInstance || getRandomInstance(nitterInstances)
+      nitterInstance || getRandomInstance(nitterRandomPool)
     }/gif/${encodeURIComponent(url.href)}`;
   } else if (url.pathname.includes("tweets")) {
     return `${
-      nitterInstance || getRandomInstance(nitterInstances)
+      nitterInstance || getRandomInstance(nitterRandomPool)
     }${url.pathname.replace("/tweets", "")}${url.search}`;
   } else {
-    return `${nitterInstance || getRandomInstance(nitterInstances)}${
+    return `${nitterInstance || getRandomInstance(nitterRandomPool)}${
       url.pathname
     }${url.search}`;
   }
@@ -406,12 +448,12 @@ function redirectInstagram(url, initiator, type) {
     url.pathname === "/" ||
     instagramReservedPaths.includes(url.pathname.split("/")[1])
   ) {
-    return `${bibliogramInstance || getRandomInstance(bibliogramInstances)}${
+    return `${bibliogramInstance || getRandomInstance(bibliogramRandomPool)}${
       url.pathname
     }${url.search}`;
   } else {
     // Likely a user profile, redirect to '/u/...'
-    return `${bibliogramInstance || getRandomInstance(bibliogramInstances)}/u${
+    return `${bibliogramInstance || getRandomInstance(bibliogramRandomPool)}/u${
       url.pathname
     }${url.search}`;
   }
@@ -514,7 +556,10 @@ function redirectReddit(url, initiator, type) {
     return null;
   }
   // Do not redirect when already on the selected view
-  if (initiator && initiator.origin === oldRedditView || url.origin === oldRedditView) {
+  if (
+    (initiator && initiator.origin === oldRedditView) ||
+    url.origin === oldRedditView
+  ) {
     return null;
   }
   // Do not redirect exclusions nor anything other than main_frame
@@ -550,10 +595,13 @@ browser.webRequest.onBeforeRequest.addListener(
       redirect = {
         redirectUrl: redirectGoogleMaps(url, initiator),
       };
-    } else if (redditDomains.includes(url.host) || oldRedditViews.includes(url.origin)) {
+    } else if (
+      redditDomains.includes(url.host) ||
+      oldRedditViews.includes(url.origin)
+    ) {
       redirect = {
         redirectUrl: redirectReddit(url, initiator, details.type),
-      }
+      };
     }
     if (redirect && redirect.redirectUrl) {
       console.info(
diff --git a/pages/options/options.html b/pages/options/options.html
index a821524b..c33dbb49 100644
--- a/pages/options/options.html
+++ b/pages/options/options.html
@@ -204,6 +204,20 @@
     </div>
 
     <div id="advanced" class="tabcontent">
+      <div class="subheading">
+        <h1>Invidious</h1>
+        <hr>
+      </div>
+      <section class="settings-block">
+        <h1 data-localise="__MSG_invidiousRandomPool__">
+          Invidious random instance pool (comma-separated)
+        </h1>
+        <input
+          id="invidious-random-pool"
+          name="invidious-random-pool"
+          type="text"
+        />
+      </section>
       <section class="settings-block">
         <table
           class="option"
@@ -219,11 +233,11 @@
               <td>
                 <input
                   aria-hidden="true"
-                  id="useFreeTube"
+                  id="use-freetube"
                   type="checkbox"
                   checked
                 />&nbsp;
-                <label for="useFreeTube" class="checkbox-label"> </label>
+                <label for="use-freetube" class="checkbox-label"> </label>
               </td>
             </tr>
           </tbody>
@@ -392,6 +406,20 @@
           </tbody>
         </table>
       </section>
+      <div class="subheading">
+        <h1>Nitter</h1>
+        <hr>
+      </div>
+      <section class="settings-block">
+        <h1 data-localise="__MSG_nitterRandomPool__">
+          Nitter random instance pool (comma-separated)
+        </h1>
+        <input
+          id="nitter-random-pool"
+          name="nitter-random-pool"
+          type="text"
+        />
+      </section>
       <section class="settings-block">
         <table
           class="option"
@@ -417,6 +445,20 @@
           </tbody>
         </table>
       </section>
+      <div class="subheading">
+        <h1>Bibliogram</h1>
+        <hr>
+      </div>
+      <section class="settings-block">
+        <h1 data-localise="__MSG_bibliogramRandomPool__">
+          Bibliogram random instance pool (comma-separated)
+        </h1>
+        <input
+          id="bibliogram-random-pool"
+          name="bibliogram-random-pool"
+          type="text"
+        />
+      </section>
     </div>
 
     <div id="exceptions" class="tabcontent">
diff --git a/pages/options/options.js b/pages/options/options.js
index 2c3d5df9..f0e5f0ab 100644
--- a/pages/options/options.js
+++ b/pages/options/options.js
@@ -10,45 +10,48 @@ const nitterInstances = [
   "https://nitter.mastodont.cat",
   "https://nitter.dark.fail",
   "https://nitter.tedomum.net",
-  "https://t.maisputain.ovh",
+  "https://nitter.cattube.org",
+  "https://nitter.fdn.fr",
+  "https://nitter.1d4.us",
+  "https://nitter.kavin.rocks",
+  "https://tweet.lambda.dance",
+  "https://nitter.cc",
+  "https://nitter.weaponizedhumiliation.com",
+  "https://nitter.vxempire.xyz",
   "http://3nzoldnxplag42gqjs23xvghtzf6t6yzssrtytnntc6ppc7xxuoneoad.onion",
   "http://nitter.l4qlywnpwqsluw65ts7md3khrivpirse744un3x7mlskqauz5pyuzgqd.onion",
+  "http://nitterlgj3n5fgwesu3vxc5h67ruku33nqaoeoocae2mvlzhsu6k7fqd.onion",
+  "http://npf37k3mtzwxreiw52ccs5ay4e6qt2fkcs2ndieurdyn2cuzzsfyfvid.onion",
 ];
 const invidiousInstances = [
   "https://invidious.snopyta.org",
-  "https://yewtu.be",
-  "https://invidious.ggc-project.de",
-  "https://invidious.13ad.de",
   "https://invidious.xyz",
-  "https://invidious.toot.koeln",
-  "https://invidious.site",
+  "https://invidious.kavin.rocks",
+  "https://tube.connect.cafe",
+  "https://invidious.zapashcanon.fr",
   "https://invidiou.site",
-  "https://invidious.fdn.fr",
-  "https://watch.nettohikari.com",
-  "https://yt.iswleuven.be",
-  "https://yt.maisputain.ovh",
-  "http://kgg2m7yk5aybusll.onion",
-  "http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion",
+  "https://vid.mint.lgbt",
+  "https://invidious.site",
   "http://fz253lmuao3strwbfbmx46yu7acac2jz27iwtorgmbqlkurlclmancad.onion",
   "http://qklhadlycap4cnod.onion",
   "http://c7hqkpkpemu6e7emz5b4vyz7idjgdvgaaa3dyimmeojqbgpea3xqjoid.onion",
-  "http://mfqczy4mysscub2s.onion",
-  "http://4l2dgddgsrkf2ous66i6seeyi6etzfgrue332grh2n7madpwopotugyd.onion",
+  "http://w6ijuptxiku4xpnnaetxvnkc5vqcdu7mgns2u77qefoixi63vbvnpnqd.onion",
 ];
 const bibliogramInstances = [
   "https://bibliogram.art",
   "https://bibliogram.snopyta.org",
   "https://bibliogram.pussthecat.org",
   "https://bibliogram.nixnet.services",
+  "https://bg.endl.site",
+  "https://bibliogram.13ad.de",
+  "https://bibliogram.pixelfed.uno",
+  "https://bibliogram.ethibox.fr",
   "https://bibliogram.hamster.dance",
-  "https://insta.maisputain.ovh",
+  "https://bibliogram.kavin.rocks",
   "https://bibliogram.ggc-project.de",
 ];
 const osmInstances = ["https://openstreetmap.org"];
-const oldRedditViews = [
-  "https://old.reddit.com", // desktop
-  "https://i.reddit.com" // mobile
-];
+const oldRedditViews = ["https://old.reddit.com", "https://i.reddit.com"];
 const autocompletes = [
   { id: "nitter-instance", instances: nitterInstances },
   { id: "invidious-instance", instances: invidiousInstances },
@@ -78,7 +81,10 @@ let invidiousPlayerStyle = document.getElementById("invidious-player-style");
 let invidiousSubtitles = document.getElementById("invidious-subtitles");
 let invidiousAutoplay = document.getElementById("invidious-autoplay");
 let theme = document.getElementById("theme");
-let useFreeTube = document.getElementById("useFreeTube");
+let useFreeTube = document.getElementById("use-freetube");
+let nitterRandomPool = document.getElementById("nitter-random-pool");
+let invidiousRandomPool = document.getElementById("invidious-random-pool");
+let bibliogramRandomPool = document.getElementById("bibliogram-random-pool");
 let exceptions;
 
 window.browser = window.browser || window.chrome;
@@ -105,6 +111,10 @@ function prependExceptionsItem(item, index) {
   });
 }
 
+function filterInstances(instances) {
+  return instances.filter((instance) => !instance.includes(".onion")).join();
+}
+
 browser.storage.sync.get(
   [
     "nitterInstance",
@@ -130,6 +140,9 @@ browser.storage.sync.get(
     "exceptions",
     "theme",
     "useFreeTube",
+    "nitterRandomPool",
+    "invidiousRandomPool",
+    "bibliogramRandomPool",
   ],
   (result) => {
     theme.value = result.theme || "";
@@ -160,6 +173,12 @@ browser.storage.sync.get(
     invidiousSubtitles.value = result.invidiousSubtitles || "";
     invidiousAutoplay.checked = result.invidiousAutoplay;
     useFreeTube.checked = result.useFreeTube;
+    nitterRandomPool.value =
+      result.nitterRandomPool || filterInstances(nitterInstances);
+    invidiousRandomPool.value =
+      result.invidiousRandomPool || filterInstances(invidiousInstances);
+    bibliogramRandomPool.value =
+      result.bibliogramRandomPool || filterInstances(bibliogramInstances);
   }
 );
 
@@ -364,11 +383,7 @@ invidiousPlayerStyle.addEventListener("change", (event) => {
 });
 
 let invidiousSubtitlesChange = debounce(() => {
-  if (invidiousInstance.checkValidity()) {
-    browser.storage.sync.set({
-      invidiousSubtitles: invidiousSubtitles.value,
-    });
-  }
+  browser.storage.sync.set({ invidiousSubtitles: invidiousSubtitles.value });
 }, 500);
 invidiousSubtitles.addEventListener("input", invidiousSubtitlesChange);
 
@@ -376,6 +391,23 @@ invidiousAutoplay.addEventListener("change", (event) => {
   browser.storage.sync.set({ invidiousAutoplay: event.target.checked });
 });
 
+let nitterRandomPoolChange = debounce(() => {
+  browser.storage.sync.set({ nitterRandomPool: nitterRandomPool.value });
+}, 500);
+nitterRandomPool.addEventListener("input", nitterRandomPoolChange);
+
+let invidiousRandomPoolChange = debounce(() => {
+  browser.storage.sync.set({ invidiousRandomPool: invidiousRandomPool.value });
+}, 500);
+invidiousRandomPool.addEventListener("input", invidiousRandomPoolChange);
+
+let bibliogramRandomPoolChange = debounce(() => {
+  browser.storage.sync.set({
+    bibliogramRandomPool: bibliogramRandomPool.value,
+  });
+}, 500);
+bibliogramRandomPool.addEventListener("input", bibliogramRandomPoolChange);
+
 theme.addEventListener("change", (event) => {
   const value = event.target.options[theme.selectedIndex].value;
   switch (value) {
diff --git a/pages/styles.css b/pages/styles.css
index 167763d5..022b96bd 100644
--- a/pages/styles.css
+++ b/pages/styles.css
@@ -237,7 +237,7 @@ input:invalid {
   background-color: var(--bg-secondary);
   position: fixed;
   top: 0;
-  width: 100%;
+  width: 400px;
   z-index: 2;
 }
 
@@ -465,3 +465,17 @@ input[type="range"]::-moz-range-thumb {
 #volume-value {
   float: right;
 }
+
+.subheading {
+  padding: 0 10px;
+}
+
+.subheading h1 {
+  color: var(--active);
+}
+
+.subheading hr {
+  height: 1px;
+  background-color: var(--active);
+  border: none;
+}