about summary refs log tree commit diff stats
path: root/src/assets/javascripts/youtube
diff options
context:
space:
mode:
authorBobIsMyManager <bimmgitsignature.nly8m@simplelogin.co>2022-07-26 22:28:50 +0100
committerBobIsMyManager <bimmgitsignature.nly8m@simplelogin.co>2022-07-26 22:28:50 +0100
commit2a0596f08fb54e2faef4bcb4548a28f5837fc067 (patch)
treecf5851f95c37da269a561623cee0d3967ca321ec /src/assets/javascripts/youtube
parentI should really inspect diffs before commiting (diff)
downloadlibredirect-2a0596f08fb54e2faef4bcb4548a28f5837fc067.zip
Many things
Made all instances updateable

Added hyperpipe

Closes https://github.com/libredirect/libredirect/issues/398

Added cloudtube

Closes https://github.com/libredirect/libredirect/issues/397

Start using prettier
Diffstat (limited to 'src/assets/javascripts/youtube')
-rw-r--r--src/assets/javascripts/youtube/get_pipedMaterial_preferences.js10
-rw-r--r--src/assets/javascripts/youtube/get_piped_preferences.js44
-rw-r--r--src/assets/javascripts/youtube/set_pipedMaterial_preferences.js13
-rw-r--r--src/assets/javascripts/youtube/set_piped_preferences.js84
-rw-r--r--src/assets/javascripts/youtube/youtube.js1303
5 files changed, 851 insertions, 603 deletions
diff --git a/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js b/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js
index 9d052f62..df79e13c 100644
--- a/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js
+++ b/src/assets/javascripts/youtube/get_pipedMaterial_preferences.js
@@ -1,7 +1,5 @@
-window.browser = window.browser || window.chrome;
+window.browser = window.browser || window.chrome
 
-browser.storage.local.set(
-    {
-        'pipedMaterial_PREFERENCES': localStorage.getItem("PREFERENCES")
-    }
-)
\ No newline at end of file
+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
index 417d64df..388ecd19 100644
--- a/src/assets/javascripts/youtube/get_piped_preferences.js
+++ b/src/assets/javascripts/youtube/get_piped_preferences.js
@@ -1,24 +1,22 @@
-window.browser = window.browser || window.chrome;
+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"),
-    }
-)
+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
index 7415255a..59d6dcc4 100644
--- a/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js
+++ b/src/assets/javascripts/youtube/set_pipedMaterial_preferences.js
@@ -1,10 +1,7 @@
-window.browser = window.browser || window.chrome;
+window.browser = window.browser || window.chrome
 
-browser.storage.local.get(
-    "pipedMaterial_PREFERENCES",
-    r => {
-        if (r.pipedMaterial_PREFERENCES !== undefined) localStorage.setItem("PREFERENCES", r.pipedMaterial_PREFERENCES)
+browser.storage.local.get("pipedMaterial_PREFERENCES", r => {
+	if (r.pipedMaterial_PREFERENCES !== undefined) localStorage.setItem("PREFERENCES", r.pipedMaterial_PREFERENCES)
 
-        window.close();
-    }
-)
\ No newline at end of file
+	window.close()
+})
diff --git a/src/assets/javascripts/youtube/set_piped_preferences.js b/src/assets/javascripts/youtube/set_piped_preferences.js
index 346de5c2..374f2d61 100644
--- a/src/assets/javascripts/youtube/set_piped_preferences.js
+++ b/src/assets/javascripts/youtube/set_piped_preferences.js
@@ -1,45 +1,45 @@
-window.browser = window.browser || window.chrome;
+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);
+	[
+		"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();
-    }
-)
\ No newline at end of file
+		window.close()
+	}
+)
diff --git a/src/assets/javascripts/youtube/youtube.js b/src/assets/javascripts/youtube/youtube.js
index 72763c46..e8a77ff6 100644
--- a/src/assets/javascripts/youtube/youtube.js
+++ b/src/assets/javascripts/youtube/youtube.js
@@ -1,601 +1,856 @@
-"use strict";
+"use strict"
 
-window.browser = window.browser || window.chrome;
+window.browser = window.browser || window.chrome
 
-import utils from '../utils.js'
+import utils from "../utils.js"
 
 const targets = [
-  /^https?:\/{2}(www\.|music\.|m\.|)youtube\.com(\/.*|$)/,
+	/^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}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}(www\.|music\.|)youtube\.com\/watch\?v\=..*/,
 
-  /^https?:\/{2}youtu\.be\/..*/,
+	/^https?:\/{2}youtu\.be\/..*/,
 
-  /^https?:\/{2}(www\.|)(youtube|youtube-nocookie)\.com\/embed\/..*/,
-];
+	/^https?:\/{2}(www\.|)(youtube|youtube-nocookie)\.com\/embed\/..*/,
+]
 
-const frontends = new Array("invidious", "piped", "pipedMaterial")
+const frontends = new Array("invidious", "piped", "pipedMaterial", "cloudtube")
 const protocols = new Array("normal", "tor", "i2p", "loki")
 
-let redirects = {};
+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[frontends[i]] = {}
+	for (let x = 0; x < protocols.length; x++) {
+		redirects[frontends[i]][protocols[x]] = []
+	}
 }
 
 function setRedirects(val) {
-  browser.storage.local.get('cloudflareBlackList', r => {
-    redirects.invidious = val.invidious;
-    redirects.piped = val.piped;
-    redirects.pipedMaterial = val.pipedMaterial
-    invidiousNormalRedirectsChecks = [...redirects.invidious.normal];
-    pipedNormalRedirectsChecks = [...redirects.piped.normal];
-    pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
-    for (const instance of r.cloudflareBlackList) {
-      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);
-    }
-    browser.storage.local.set({
-      youtubeRedirects: redirects,
-      invidiousNormalRedirectsChecks,
-      invidiousTorRedirectsChecks: redirects.invidious.tor,
-      pipedNormalRedirectsChecks,
-      pipedTorRedirectsChecks: redirects.piped.tor,
-      pipedMaterialNormalRedirectsChecks,
-      // pipedMaterialTorRedirectsChecks: redirects.pipedMaterial.tor
-    })
-  })
+	browser.storage.local.get("cloudflareBlackList", r => {
+		for (let i = 0; i < frontends.length; i++) {
+			redirects.frontends = val.frontends
+		}
+		invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
+		pipedNormalRedirectsChecks = [...redirects.piped.normal]
+		pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
+		for (const instance of r.cloudflareBlackList) {
+			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,
+			pipedNormalRedirectsChecks,
+			pipedMaterialNormalRedirectsChecks,
+			cloudtubeNormalRedirectsChecks,
+		})
+	})
 }
 
-let
-  disableYoutube,
-  onlyEmbeddedVideo,
-  youtubeFrontend,
-  protocol,
-  protocolFallback,
-  youtubeEmbedFrontend,
-  youtubeRedirects,
-  invidiousNormalRedirectsChecks,
-  invidiousNormalCustomRedirects,
-  invidiousTorRedirectsChecks,
-  invidiousTorCustomRedirects,
-  invidiousI2pCustomRedirects,
-  invidiousLokiCustomRedirects,
-  pipedNormalRedirectsChecks,
-  pipedNormalCustomRedirects,
-  pipedTorRedirectsChecks,
-  pipedTorCustomRedirects,
-  pipedI2pCustomRedirects,
-  pipedLokiCustomRedirects,
-  pipedMaterialNormalRedirectsChecks,
-  pipedMaterialNormalCustomRedirects,
-  pipedMaterialTorRedirectsChecks,
-  pipedMaterialTorCustomRedirects,
-  pipedMaterialI2pCustomRedirects,
-  pipedMaterialLokiCustomRedirects;
+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",
-        "invidiousI2pCustomRedirects",
-        "invidiousLokiCustomRedirects",
-        "pipedNormalRedirectsChecks",
-        "pipedNormalCustomRedirects",
-        "pipedTorRedirectsChecks",
-        "pipedTorCustomRedirects",
-        "pipedI2pCustomRedirects",
-        "pipedLokiCustomRedirects",
-        "pipedMaterialNormalRedirectsChecks",
-        "pipedMaterialNormalCustomRedirects",
-        "pipedMaterialTorRedirectsChecks",
-        "pipedMaterialTorCustomRedirects",
-        "pipedMaterialI2pCustomRedirects",
-        "pipedMaterialLokiCustomRedirects"
-      ],
-      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;
-        invidiousI2pCustomRedirects = r.invidiousI2pCustomRedirects;
-        invidiousLokiCustomRedirects = r.invidiousLokiCustomRedirects;
-        pipedNormalRedirectsChecks = r.pipedNormalRedirectsChecks;
-        pipedNormalCustomRedirects = r.pipedNormalCustomRedirects;
-        pipedTorRedirectsChecks = r.pipedTorRedirectsChecks;
-        pipedTorCustomRedirects = r.pipedTorCustomRedirects;
-        pipedI2pCustomRedirects = r.pipedI2pCustomRedirects;
-        pipedLokiCustomRedirects = r.pipedLokiCustomRedirects;
-        pipedMaterialNormalRedirectsChecks = r.pipedMaterialNormalRedirectsChecks;
-        pipedMaterialNormalCustomRedirects = r.pipedMaterialNormalCustomRedirects;
-        pipedMaterialTorRedirectsChecks = r.pipedMaterialTorRedirectsChecks;
-        pipedMaterialTorCustomRedirects = r.pipedMaterialTorCustomRedirects;
-        pipedMaterialI2pCustomRedirects = r.pipedMaterialI2pCustomRedirects;
-        pipedMaterialLokiCustomRedirects = r.pipedMaterialLokiCustomRedirects;
-        resolve();
-      }
-    )
-  })
+	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();
+init()
 browser.storage.onChanged.addListener(init)
 
 function all() {
-  return [
-    ...youtubeRedirects.invidious.normal,
-    ...youtubeRedirects.invidious.tor,
-
-    ...youtubeRedirects.piped.normal,
-    ...youtubeRedirects.piped.tor,
-
-    ...youtubeRedirects.pipedMaterial.normal,
-    ...youtubeRedirects.pipedMaterial.tor,
-
-    ...invidiousNormalCustomRedirects,
-    ...invidiousTorCustomRedirects,
-    ...invidiousI2pCustomRedirects,
-    ...invidiousLokiCustomRedirects,
-
-    ...pipedNormalCustomRedirects,
-    ...pipedTorCustomRedirects,
-    ...pipedI2pCustomRedirects,
-    ...pipedLokiCustomRedirects,
-
-    ...pipedMaterialNormalCustomRedirects,
-    ...pipedMaterialTorCustomRedirects,
-    ...pipedMaterialI2pCustomRedirects,
-    ...pipedMaterialLokiCustomRedirects
-  ];
+	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, initiator, disableOverride) {
-  if (disableYoutube && !disableOverride) return;
-  if (!targets.some(rx => rx.test(url.href))) return;
-  if (initiator && all().includes(initiator.origin)) return 'BYPASSTAB';
-
-  const isInvidious = youtubeFrontend == 'invidious';
-  const isPiped = youtubeFrontend == 'piped';
-  const isPipedMaterial = youtubeFrontend == 'pipedMaterial'
-  const isFreetube = youtubeFrontend == 'freetube';
-  const isYatte = youtubeFrontend == 'yatte';
-
-  //const isFrontendYoutube = youtubeEmbedFrontend == "youtube";
-  const isFrontendInvidious = youtubeEmbedFrontend == 'invidious';
-  const isFrontendPiped = youtubeEmbedFrontend == 'piped';
-  const isFrontendPipedMaterial = youtubeEmbedFrontend == 'pipedMaterial';
-
-  const main_frame = type === "main_frame";
-  const sub_frame = type === "sub_frame";
-
-  if (!sub_frame && !main_frame) return;
-  if (url.pathname.match(/iframe_api/) || url.pathname.match(/www-widgetapi/)) return; // Don't redirect YouTube Player API.
-  if (onlyEmbeddedVideo == 'onlyEmbedded' && main_frame) return;
-  if (onlyEmbeddedVideo == 'onlyNotEmbedded' && !main_frame) return;
-
-  //if ((isFreetube || isYatte) && sub_frame && isFrontendYoutube) return;
-
-  if (isYatte && main_frame) return url.href.replace(/^https?:\/{2}/, 'yattee://');
-  if (isFreetube && main_frame) return `freetube://https://youtube.com${url.pathname}${url.search}`;
-
-  if (isInvidious || ((isFreetube || isYatte) && sub_frame && isFrontendInvidious)) {
-    let instancesList = [];
-    if (protocol == 'loki') instancesList = [...invidiousLokiCustomRedirects];
-    else if (protocol == 'i2p') instancesList = [...invidiousI2pCustomRedirects];
-    else if (protocol == 'tor') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
-    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
-      instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-    }
-    if (instancesList.length === 0) return;
-    const randomInstance = utils.getRandomInstance(instancesList);
-    return `${randomInstance}${url.pathname}${url.search}`;
-  }
-  if (isPiped || ((isFreetube || isYatte) && sub_frame && isFrontendPiped)) {
-    let instancesList = [];
-    if (protocol == 'loki') instancesList = [...pipedLokiCustomRedirects];
-    else if (protocol == 'i2p') instancesList = [...pipedI2pCustomRedirects];
-    else if (protocol == 'tor') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
-    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
-      instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-    }
-    if (instancesList.length === 0) return;
-    const randomInstance = utils.getRandomInstance(instancesList);
-    return `${randomInstance}${url.pathname}${url.search}`;
-  }
-  if (isPipedMaterial || ((isFreetube || isYatte) && sub_frame && isFrontendPipedMaterial)) {
-    let instancesList = [];
-    if (protocol == 'loki') instancesList = [...pipedMaterialLokiCustomRedirects];
-    else if (protocol == 'i2p') instancesList = [...pipedMaterialI2pCustomRedirects];
-    else if (protocol == 'tor') instancesList = [...pipedMaterialTorCustomRedirects]; //...pipedMaterialTorRedirectsChecks, 
-    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
-      instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-    }
-    const randomInstance = utils.getRandomInstance(instancesList);
-    return `${randomInstance}${url.pathname}${url.search}`;
-  }
-  return 'CANCEL';
+	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 == "onlyEmbedded" && type == "main_frame") return
+	if (onlyEmbeddedVideo == "onlyNotEmbedded" && type == "sub_frame") return
+
+	if (type == "main_frame") {
+		switch (youtubeFrontend) {
+			case "yatte":
+				return url.href.replace(/^https?:\/{2}/, "yattee://")
+			case "freetube":
+				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}`);
-  })
+	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 = [];
-    if (protocol == 'loki') {
-      if (youtubeFrontend == 'invidious') instancesList = [...invidiousLokiCustomRedirects]; //...invidiousLokiRedirectsChecks, 
-      else if (youtubeFrontend == 'piped') instancesList = [...pipedLokiCustomRedirects]; //...pipedLokiRedirectsChecks, 
-      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialLokiCustomRedirects]; //...pipedMaterialLokiRedirectsChecks, 
-    }
-    else if (protocol == 'i2p') {
-      if (youtubeFrontend == 'invidious') instancesList = [...invidiousI2pCustomRedirects]; //...invidiousI2pRedirectsChecks, 
-      else if (youtubeFrontend == 'piped') instancesList = [...pipedI2pCustomRedirects]; //...pipedI2pRedirectsChecks, 
-      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialI2pCustomRedirects]; //...pipedMaterialI2pRedirectsChecks, 
-    }
-    else if (protocol == 'tor') {
-      if (youtubeFrontend == 'invidious') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
-      else if (youtubeFrontend == 'piped') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
-      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialTorCustomRedirects]; //...pipedMaterialTorRedirectsChecks, 
-    }
-    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
-      if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-      else if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-      else if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-    }
-
-    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}`);
-  })
+	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', async r => {
+	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", async r => {
+					invidiousNormalRedirectsChecks = [...redirects.invidious.normal]
+					pipedNormalRedirectsChecks = [...redirects.piped.normal]
+					pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal]
+					cloudtubeNormalRedirectsChecks = [...redirects.cloudtube.normal]
+
+					for (const instance of r.cloudflareBlackList) {
+						const a = invidiousNormalRedirectsChecks.indexOf(instance)
+						if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1)
 
-        invidiousNormalRedirectsChecks = [...redirects.invidious.normal];
-        pipedNormalRedirectsChecks = [...redirects.piped.normal];
-        pipedMaterialNormalRedirectsChecks = [...redirects.pipedMaterial.normal];
+						const b = pipedNormalRedirectsChecks.indexOf(instance)
+						if (b > -1) pipedNormalRedirectsChecks.splice(b, 1)
 
-        for (const instance of r.cloudflareBlackList) {
-          const a = invidiousNormalRedirectsChecks.indexOf(instance);
-          if (a > -1) invidiousNormalRedirectsChecks.splice(a, 1);
+						const c = pipedMaterialNormalRedirectsChecks.indexOf(instance)
+						if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1)
 
-          const b = pipedNormalRedirectsChecks.indexOf(instance);
-          if (b > -1) pipedNormalRedirectsChecks.splice(b, 1);
+						const d = cloudtubeNormalRedirectsChecks.indexOf(instance)
+						if (d > -1) cloudtubeNormalRedirectsChecks.indexOf(instance)
+					}
 
-          const c = pipedMaterialNormalRedirectsChecks.indexOf(instance);
-          if (c > -1) pipedMaterialNormalRedirectsChecks.splice(c, 1);
-        }
+					browser.storage.local.set(
+						{
+							disableYoutube: false,
+							enableYoutubeCustomSettings: false,
+							onlyEmbeddedVideo: "both",
+							youtubeRedirects: redirects,
+							youtubeFrontend: "invidious",
 
-        browser.storage.local.set({
-          disableYoutube: false,
-          enableYoutubeCustomSettings: false,
-          onlyEmbeddedVideo: 'both',
-          youtubeRedirects: redirects,
-          youtubeFrontend: 'invidious',
+							invidiousNormalRedirectsChecks: invidiousNormalRedirectsChecks,
+							invidiousNormalCustomRedirects: [],
 
-          invidiousNormalRedirectsChecks: invidiousNormalRedirectsChecks,
-          invidiousNormalCustomRedirects: [],
+							invidiousTorRedirectsChecks: [...redirects.invidious.tor],
+							invidiousTorCustomRedirects: [],
 
-          invidiousTorRedirectsChecks: [...redirects.invidious.tor],
-          invidiousTorCustomRedirects: [],
+							invidiousI2pRedirectsChecks: [...redirects.invidious.i2p],
+							invidiousI2pCustomRedirects: [],
 
-          invidiousI2pRedirectsChecks: [...redirects.invidious.i2p],
-          invidiousI2pCustomRedirects: [],
+							invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
+							invidiousLokiCustomRedirects: [],
 
-          invidiousLokiRedirectsChecks: [...redirects.invidious.loki],
-          invidiousLokiCustomRedirects: [],
+							pipedNormalRedirectsChecks: pipedNormalRedirectsChecks,
+							pipedNormalCustomRedirects: [],
 
-          pipedNormalRedirectsChecks: pipedNormalRedirectsChecks,
-          pipedNormalCustomRedirects: [],
+							pipedTorRedirectsChecks: [...redirects.piped.tor],
+							pipedTorCustomRedirects: [],
 
-          pipedTorRedirectsChecks: [...redirects.piped.tor],
-          pipedTorCustomRedirects: [],
+							pipedI2pRedirectsChecks: [...redirects.piped.i2p],
+							pipedI2pCustomRedirects: [],
 
-          pipedI2pRedirectsChecks: [...redirects.piped.i2p],
-          pipedI2pCustomRedirects: [],
+							pipedLokiRedirectsChecks: [...redirects.piped.loki],
+							pipedLokiCustomRedirects: [],
 
-          pipedLokiRedirectsChecks: [...redirects.piped.loki],
-          pipedLokiCustomRedirects: [],
+							pipedMaterialNormalRedirectsChecks: pipedMaterialNormalRedirectsChecks,
+							pipedMaterialNormalCustomRedirects: [],
 
-          pipedMaterialNormalRedirectsChecks: pipedMaterialNormalRedirectsChecks,
-          pipedMaterialNormalCustomRedirects: [],
+							pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
+							pipedMaterialTorCustomRedirects: [],
 
-          pipedMaterialTorRedirectsChecks: [...redirects.pipedMaterial.tor],
-          pipedMaterialTorCustomRedirects: [],
+							pipedMaterialI2pRedirectsChecks: [...redirects.pipedMaterial.i2p],
+							pipedMaterialI2pCustomRedirects: [],
 
-          pipedMaterialI2pRedirectsChecks: [...redirects.pipedMaterial.i2p],
-          pipedMaterialI2pCustomRedirects: [],
+							pipedMaterialLokiRedirectsChecks: [...redirects.pipedMaterial.loki],
+							pipedMaterialLokiCustomRedirects: [],
 
-          pipedMaterialLokiRedirectsChecks: [...redirects.pipedMaterial.loki],
-          pipedMaterialLokiCustomRedirects: [],
+							cloudtubeNormalRedirectsChecks: cloudtubeNormalRedirectsChecks,
+							cloudtubeNormalCustomRedirects: [],
 
-          youtubeEmbedFrontend: 'invidious'
-        }, () => resolve())
-      })
-    })
-  })
+							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);
-  })
+	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 pasteInvidiousCookies() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableYoutube || youtubeFrontend != 'invidious') { resolve(); return; }
-    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]
-    }
-    utils.getCookiesFromStorage('invidious', checkedInstances, 'PREFS');
-    resolve();
-  })
+	return new Promise(async resolve => {
+		await init()
+		if (disableYoutube || youtubeFrontend != "invidious") {
+			resolve()
+			return
+		}
+		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]
+		}
+		utils.getCookiesFromStorage("invidious", checkedInstances, "PREFS")
+		resolve()
+	})
 }
 
 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 ((instancesList.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);
-  })
+	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 ((instancesList.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 pastePipedLocalStorage() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableYoutube || youtubeFrontend != 'piped') { resolve(); return; }
-    let checkedInstances = [];
-    if (protocol == 'loki') checkedInstances = [...pipedLokiCustomRedirects];
-    else if (protocol == 'i2p') checkedInstances = [...pipedI2pCustomRedirects];
-    else if (protocol == 'tor') checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
-    if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
-      checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
-    }
-    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();
-  })
+	return new Promise(async resolve => {
+		await init()
+		if (disableYoutube || youtubeFrontend != "piped") {
+			resolve()
+			return
+		}
+		let checkedInstances = []
+		if (protocol == "loki") checkedInstances = [...pipedLokiCustomRedirects]
+		else if (protocol == "i2p") checkedInstances = [...pipedI2pCustomRedirects]
+		else if (protocol == "tor") checkedInstances = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects]
+		if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
+			checkedInstances = [...pipedNormalCustomRedirects, ...pipedNormalRedirectsChecks]
+		}
+		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()
+	})
 }
 
-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 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 pastePipedMaterialLocalStorage() {
-  return new Promise(async resolve => {
-    await init();
-    if (disableYoutube || youtubeFrontend != 'pipedMaterial') { resolve(); return; }
-    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]
-    }
-    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();
-  })
+	return new Promise(async resolve => {
+		await init()
+		if (disableYoutube || youtubeFrontend != "pipedMaterial") {
+			resolve()
+			return
+		}
+		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]
+		}
+		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()
+	})
 }
 
 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 = [];
-        if (protocol == 'loki') {
-          if (youtubeFrontend == 'invidious') instancesList = [...invidiousLokiCustomRedirects]; //...invidiousLokiRedirectsChecks, 
-          if (youtubeFrontend == 'piped') instancesList = [...pipedLokiCustomRedirects]; //...pipedLokiRedirectsChecks, 
-          if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialLokiCustomRedirects]; //...pipedMaterialLokiRedirectsChecks, 
-        }
-        else if (protocol == 'i2p') {
-          if (youtubeFrontend == 'invidious') instancesList = [...invidiousI2pCustomRedirects]; //...invidiousI2pRedirectsChecks, 
-          if (youtubeFrontend == 'piped') instancesList = [...pipedI2pCustomRedirects]; //...pipedI2pRedirectsChecks, 
-          if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialI2pCustomRedirects]; //...pipedMaterialI2pRedirectsChecks, 
-        }
-        else if (protocol == 'tor') {
-          if (youtubeFrontend == 'invidious') instancesList = [...invidiousTorRedirectsChecks, ...invidiousTorCustomRedirects];
-          if (youtubeFrontend == 'piped') instancesList = [...pipedTorRedirectsChecks, ...pipedTorCustomRedirects];
-          if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialTorCustomRedirects]; //...pipedMaterialTorRedirectsChecks, 
-        }
-        if ((instancesList.length === 0 && protocolFallback) || protocol == 'normal') {
-          if (youtubeFrontend == 'invidious') instancesList = [...invidiousNormalRedirectsChecks, ...invidiousNormalCustomRedirects];
-          if (youtubeFrontend == 'piped') instancesList = [...pipedNormalRedirectsChecks, ...pipedNormalCustomRedirects];
-          if (youtubeFrontend == 'pipedMaterial') instancesList = [...pipedMaterialNormalRedirectsChecks, ...pipedMaterialNormalCustomRedirects];
-        }
-        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 };
+	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,
-  pastePipedLocalStorage,
-  copyPastePipedMaterialLocalStorage,
-  pastePipedMaterialLocalStorage,
-  copyPasteInvidiousCookies,
-  pasteInvidiousCookies,
-  redirect,
-  reverse,
-  switchInstance,
-  initDefaults,
-  removeXFrameOptions,
-};
+	setRedirects,
+	copyPastePipedLocalStorage,
+	pastePipedLocalStorage,
+	copyPastePipedMaterialLocalStorage,
+	pastePipedMaterialLocalStorage,
+	copyPasteInvidiousCookies,
+	pasteInvidiousCookies,
+	redirect,
+	reverse,
+	switchInstance,
+	initDefaults,
+	removeXFrameOptions,
+}