diff --git a/README.md b/README.md index 515e0eb..60cf566 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ - [Chrome Extension](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb) - [Firefox Add-on](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/) -A simple browser extension that redirects Twitter, Youtube & Instagram requests to privacy friendly alternatives - [Nitter](https://github.com/zedeus/nitter), [Invidious](https://github.com/omarroth/invidious) & [Bibliogram](https://github.com/cloudrac3r/bibliogram). +A simple browser extension that redirects Twitter, YouTube & Instagram requests to privacy friendly alternatives - [Nitter](https://github.com/zedeus/nitter), [Invidious](https://github.com/omarroth/invidious) & [Bibliogram](https://github.com/cloudrac3r/bibliogram). Listens for and redirects requests made to the following: - **Twitter -** `twitter.com`, `www.twitter.com`, `mobile.twitter.com` - - **Youtube -** `youtube.com`, `www.youtube.com`, `youtube-nocookie.com`, `www.youtube-nocookie.com`, `m.youtube.com` + - **YouTube -** `youtube.com`, `www.youtube.com`, `youtube-nocookie.com`, `www.youtube-nocookie.com`, `m.youtube.com` - **Instagram -** `instagram.com`, `www.instagram.com`, `help.instagram.com`, `about.instagram.com`. Allows for setting custom [Nitter](https://github.com/zedeus/nitter/wiki/Instances), [Invidious](https://github.com/omarroth/invidious/wiki/Invidious-Instances) & [Bibliogram](https://github.com/cloudrac3r/bibliogram/wiki/Instances) instances and toggling redirects on & off. diff --git a/background.js b/background.js index bf06841..5790eb5 100644 --- a/background.js +++ b/background.js @@ -55,9 +55,22 @@ chrome.storage.onChanged.addListener(changes => { } }); -function redirectBibliogram(url) { +function redirectYouTube(url) { + if (url.host.split('.')[0] === 'studio') { + // Avoid redirecting `studio.youtube.com` + return null; + } else { + return `${invidiousInstance}${url.pathname}${url.search}`; + } +} + +function redirectTwitter(url) { + return `${nitterInstance}${url.pathname}${url.search}` +} + +function redirectInstagram(url) { if (url.pathname === '/' || url.pathname.match(instagramPathsRegex)) { - return bibliogramInstance + url.pathname + url.search; + return `${bibliogramInstance}${url.pathname}${url.search}`; } else { // Redirect user profile requests to '/u/...' return `${bibliogramInstance}/u${url.pathname}${url.search}`; @@ -71,23 +84,23 @@ chrome.webRequest.onBeforeRequest.addListener( if (url.host.match(youtubeRegex)) { if (!disableInvidious) { redirect = { - redirectUrl: invidiousInstance + url.pathname + url.search + redirectUrl: redirectYouTube(url) }; } } else if (url.host.match(twitterRegex)) { if (!disableNitter) { redirect = { - redirectUrl: nitterInstance + url.pathname + url.search + redirectUrl: redirectTwitter(url) }; } } else if (url.host.match(instagramRegex)) { if (!disableBibliogram) { redirect = { - redirectUrl: redirectBibliogram(url) + redirectUrl: redirectInstagram(url) }; } } - if (redirect) { + if (redirect && redirect.redirectUrl) { console.log( 'Redirecting', `"${url.toString()}"`, '=>', `"${redirect.redirectUrl}"` ); diff --git a/images/logo.png b/images/logo.png index db4030f..ecb3e38 100644 Binary files a/images/logo.png and b/images/logo.png differ diff --git a/manifest.json b/manifest.json index 48cdc43..4e4b8e4 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "Privacy Redirect", - "description": "Redirects Twitter, Youtube & Instagram requests to privacy friendly alternatives - Nitter, Invidious, & Bibliogram.", - "version": "1.1.5", + "description": "Redirects Twitter, YouTube & Instagram requests to privacy friendly alternatives - Nitter, Invidious, & Bibliogram.", + "version": "1.1.6", "manifest_version": 2, "background": { "scripts": [ diff --git a/pages/options/options.js b/pages/options/options.js index ed9c70d..a55d032 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -28,9 +28,9 @@ chrome.storage.sync.get( document.querySelector('#save').addEventListener('click', () => { chrome.storage.sync.set({ - nitterInstance: nitterInstance.value, - invidiousInstance: invidiousInstance.value, - bibliogramInstance: bibliogramInstance.value, + nitterInstance: nitterInstance.value && nitterInstance.checkValidity() ? new URL(nitterInstance.value).origin : '', + invidiousInstance: invidiousInstance.value && invidiousInstance.checkValidity() ? new URL(invidiousInstance.value).origin : '', + bibliogramInstance: bibliogramInstance.value && bibliogramInstance.checkValidity() ? new URL(bibliogramInstance.value).origin : '', disableNitter: !disableNitter.checked, disableInvidious: !disableInvidious.checked, disableBibliogram: !disableBibliogram.checked diff --git a/pages/popup/popup.html b/pages/popup/popup.html index 986fd8c..32643ac 100644 --- a/pages/popup/popup.html +++ b/pages/popup/popup.html @@ -14,7 +14,7 @@ Privacy Redirect logo - Version: 1.1.4 + Version:  diff --git a/pages/popup/popup.js b/pages/popup/popup.js index ecbaf1e..103f07c 100644 --- a/pages/popup/popup.js +++ b/pages/popup/popup.js @@ -6,6 +6,7 @@ let bibliogramInstance = document.querySelector('#bibliogramInstance'); let disableNitter = document.querySelector('#disableNitter'); let disableInvidious = document.querySelector('#disableInvidious'); let disableBibliogram = document.querySelector('#disableBibliogram'); +let version = document.querySelector('#version'); chrome.storage.sync.get( [ @@ -26,6 +27,8 @@ chrome.storage.sync.get( } ); +version.textContent = chrome.runtime.getManifest().version; + function debounce(func, wait, immediate) { let timeout; return () => { @@ -42,21 +45,30 @@ function debounce(func, wait, immediate) { }; let nitterInstanceChange = debounce(() => { - chrome.storage.sync.set({ nitterInstance: nitterInstance.value }); + if (nitterInstance.checkValidity()) { + chrome.storage.sync.set({ + nitterInstance: nitterInstance.value ? new URL(nitterInstance.value).origin : '' + }); + } }, 500); - nitterInstance.addEventListener('input', nitterInstanceChange); let invidiousInstanceChange = debounce(() => { - chrome.storage.sync.set({ invidiousInstance: invidiousInstance.value }); + if (invidiousInstance.checkValidity()) { + chrome.storage.sync.set({ + invidiousInstance: invidiousInstance.value ? new URL(invidiousInstance.value).origin : '' + }); + } }, 500); - invidiousInstance.addEventListener('input', invidiousInstanceChange); let bibliogramInstanceChange = debounce(() => { - chrome.storage.sync.set({ bibliogramInstance: bibliogramInstance.value }); + if (bibliogramInstance.checkValidity()) { + chrome.storage.sync.set({ + bibliogramInstance: bibliogramInstance.value ? new URL(bibliogramInstance.value).origin : '' + }); + } }, 500); - bibliogramInstance.addEventListener('input', bibliogramInstanceChange); disableNitter.addEventListener('change', event => { diff --git a/pages/styles.css b/pages/styles.css index 5a23352..a1fa933 100644 --- a/pages/styles.css +++ b/pages/styles.css @@ -5,6 +5,8 @@ --white: #FFF; --active: #FF5B56; --space: 5px; + --danger: #f04141; + --danger-light: #F9D0D5; } body { @@ -31,7 +33,7 @@ header .logo-container { } header .logo-container img { - width: 100%; + max-width: 100%; } header small { @@ -137,10 +139,25 @@ input:checked+label:after { padding: 10px; text-align: center; text-decoration: none; + cursor: pointer; + -webkit-transition-duration: 0.4s; + transition-duration: 0.4s; } .button:hover { background-color: var(--active); - color: #fff + color: #fff; +} + +.button:active { + background-color: var(--active); + box-shadow: 0 5px var(--dark-grey); + transform: translateY(4px); +} + +input[type="url"]:invalid { + color: var(--danger); + border-color: var(--danger); + background-color: var(--danger-light); }