Avoid redirecting `studio.youtube.com` & basic instance validation
This commit is contained in:
parent
d25072f6b5
commit
eb99449f72
|
@ -3,11 +3,11 @@
|
||||||
- [Chrome Extension](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb)
|
- [Chrome Extension](https://chrome.google.com/webstore/detail/privacy-redirect/pmcmeagblkinmogikoikkdjiligflglb)
|
||||||
- [Firefox Add-on](https://addons.mozilla.org/en-US/firefox/addon/privacy-redirect/)
|
- [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:
|
Listens for and redirects requests made to the following:
|
||||||
- **Twitter -** `twitter.com`, `www.twitter.com`, `mobile.twitter.com`
|
- **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`.
|
- **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.
|
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.
|
||||||
|
|
|
@ -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)) {
|
if (url.pathname === '/' || url.pathname.match(instagramPathsRegex)) {
|
||||||
return bibliogramInstance + url.pathname + url.search;
|
return `${bibliogramInstance}${url.pathname}${url.search}`;
|
||||||
} else {
|
} else {
|
||||||
// Redirect user profile requests to '/u/...'
|
// Redirect user profile requests to '/u/...'
|
||||||
return `${bibliogramInstance}/u${url.pathname}${url.search}`;
|
return `${bibliogramInstance}/u${url.pathname}${url.search}`;
|
||||||
|
@ -71,23 +84,23 @@ chrome.webRequest.onBeforeRequest.addListener(
|
||||||
if (url.host.match(youtubeRegex)) {
|
if (url.host.match(youtubeRegex)) {
|
||||||
if (!disableInvidious) {
|
if (!disableInvidious) {
|
||||||
redirect = {
|
redirect = {
|
||||||
redirectUrl: invidiousInstance + url.pathname + url.search
|
redirectUrl: redirectYouTube(url)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
} else if (url.host.match(twitterRegex)) {
|
} else if (url.host.match(twitterRegex)) {
|
||||||
if (!disableNitter) {
|
if (!disableNitter) {
|
||||||
redirect = {
|
redirect = {
|
||||||
redirectUrl: nitterInstance + url.pathname + url.search
|
redirectUrl: redirectTwitter(url)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
} else if (url.host.match(instagramRegex)) {
|
} else if (url.host.match(instagramRegex)) {
|
||||||
if (!disableBibliogram) {
|
if (!disableBibliogram) {
|
||||||
redirect = {
|
redirect = {
|
||||||
redirectUrl: redirectBibliogram(url)
|
redirectUrl: redirectInstagram(url)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (redirect) {
|
if (redirect && redirect.redirectUrl) {
|
||||||
console.log(
|
console.log(
|
||||||
'Redirecting', `"${url.toString()}"`, '=>', `"${redirect.redirectUrl}"`
|
'Redirecting', `"${url.toString()}"`, '=>', `"${redirect.redirectUrl}"`
|
||||||
);
|
);
|
||||||
|
|
BIN
images/logo.png
BIN
images/logo.png
Binary file not shown.
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 39 KiB |
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "Privacy Redirect",
|
"name": "Privacy Redirect",
|
||||||
"description": "Redirects Twitter, Youtube & Instagram requests to privacy friendly alternatives - Nitter, Invidious, & Bibliogram.",
|
"description": "Redirects Twitter, YouTube & Instagram requests to privacy friendly alternatives - Nitter, Invidious, & Bibliogram.",
|
||||||
"version": "1.1.5",
|
"version": "1.1.6",
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"background": {
|
"background": {
|
||||||
"scripts": [
|
"scripts": [
|
||||||
|
|
|
@ -28,9 +28,9 @@ chrome.storage.sync.get(
|
||||||
|
|
||||||
document.querySelector('#save').addEventListener('click', () => {
|
document.querySelector('#save').addEventListener('click', () => {
|
||||||
chrome.storage.sync.set({
|
chrome.storage.sync.set({
|
||||||
nitterInstance: nitterInstance.value,
|
nitterInstance: nitterInstance.value && nitterInstance.checkValidity() ? new URL(nitterInstance.value).origin : '',
|
||||||
invidiousInstance: invidiousInstance.value,
|
invidiousInstance: invidiousInstance.value && invidiousInstance.checkValidity() ? new URL(invidiousInstance.value).origin : '',
|
||||||
bibliogramInstance: bibliogramInstance.value,
|
bibliogramInstance: bibliogramInstance.value && bibliogramInstance.checkValidity() ? new URL(bibliogramInstance.value).origin : '',
|
||||||
disableNitter: !disableNitter.checked,
|
disableNitter: !disableNitter.checked,
|
||||||
disableInvidious: !disableInvidious.checked,
|
disableInvidious: !disableInvidious.checked,
|
||||||
disableBibliogram: !disableBibliogram.checked
|
disableBibliogram: !disableBibliogram.checked
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
<img src="../../images/logo.png" alt="Privacy Redirect logo">
|
<img src="../../images/logo.png" alt="Privacy Redirect logo">
|
||||||
</div>
|
</div>
|
||||||
<small>
|
<small>
|
||||||
<span>Version</span>: 1.1.4</span>
|
<span>Version: <span id="version"></span></span>
|
||||||
</small>
|
</small>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ let bibliogramInstance = document.querySelector('#bibliogramInstance');
|
||||||
let disableNitter = document.querySelector('#disableNitter');
|
let disableNitter = document.querySelector('#disableNitter');
|
||||||
let disableInvidious = document.querySelector('#disableInvidious');
|
let disableInvidious = document.querySelector('#disableInvidious');
|
||||||
let disableBibliogram = document.querySelector('#disableBibliogram');
|
let disableBibliogram = document.querySelector('#disableBibliogram');
|
||||||
|
let version = document.querySelector('#version');
|
||||||
|
|
||||||
chrome.storage.sync.get(
|
chrome.storage.sync.get(
|
||||||
[
|
[
|
||||||
|
@ -26,6 +27,8 @@ chrome.storage.sync.get(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
version.textContent = chrome.runtime.getManifest().version;
|
||||||
|
|
||||||
function debounce(func, wait, immediate) {
|
function debounce(func, wait, immediate) {
|
||||||
let timeout;
|
let timeout;
|
||||||
return () => {
|
return () => {
|
||||||
|
@ -42,21 +45,30 @@ function debounce(func, wait, immediate) {
|
||||||
};
|
};
|
||||||
|
|
||||||
let nitterInstanceChange = debounce(() => {
|
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);
|
}, 500);
|
||||||
|
|
||||||
nitterInstance.addEventListener('input', nitterInstanceChange);
|
nitterInstance.addEventListener('input', nitterInstanceChange);
|
||||||
|
|
||||||
let invidiousInstanceChange = debounce(() => {
|
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);
|
}, 500);
|
||||||
|
|
||||||
invidiousInstance.addEventListener('input', invidiousInstanceChange);
|
invidiousInstance.addEventListener('input', invidiousInstanceChange);
|
||||||
|
|
||||||
let bibliogramInstanceChange = debounce(() => {
|
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);
|
}, 500);
|
||||||
|
|
||||||
bibliogramInstance.addEventListener('input', bibliogramInstanceChange);
|
bibliogramInstance.addEventListener('input', bibliogramInstanceChange);
|
||||||
|
|
||||||
disableNitter.addEventListener('change', event => {
|
disableNitter.addEventListener('change', event => {
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
--white: #FFF;
|
--white: #FFF;
|
||||||
--active: #FF5B56;
|
--active: #FF5B56;
|
||||||
--space: 5px;
|
--space: 5px;
|
||||||
|
--danger: #f04141;
|
||||||
|
--danger-light: #F9D0D5;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -31,7 +33,7 @@ header .logo-container {
|
||||||
}
|
}
|
||||||
|
|
||||||
header .logo-container img {
|
header .logo-container img {
|
||||||
width: 100%;
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
header small {
|
header small {
|
||||||
|
@ -137,10 +139,25 @@ input:checked+label:after {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
-webkit-transition-duration: 0.4s;
|
||||||
|
transition-duration: 0.4s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.button:hover {
|
.button:hover {
|
||||||
background-color: var(--active);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue