about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/assets/javascripts/services.js42
-rw-r--r--src/assets/javascripts/utils.js8
-rw-r--r--src/config/config.json1012
-rw-r--r--src/instances/get_instances.py30
-rw-r--r--src/pages/options/index.ejs6
-rw-r--r--src/pages/options/widgets/general.js3
-rw-r--r--src/pages/options/widgets/services.js3
-rw-r--r--src/pages/popup/popup.ejs4
-rw-r--r--src/pages/popup/popup.js3
-rw-r--r--src/pages/widgets/links.ejs8
10 files changed, 556 insertions, 563 deletions
diff --git a/src/assets/javascripts/services.js b/src/assets/javascripts/services.js
index 309d5528..25e998d2 100644
--- a/src/assets/javascripts/services.js
+++ b/src/assets/javascripts/services.js
@@ -11,8 +11,7 @@ async function getConfig() {
 		fetch("/config/config.json")

 			.then(response => response.text())

 			.then(data => {

-				const tmp = JSON.parse(data)

-				config = tmp.config

+				config = JSON.parse(data)

 				resolve()

 			})

 	})

@@ -55,7 +54,7 @@ function all(service) {
 	for (const frontend in config.services[service].frontends) {

 		if (config.services[service].frontends[frontend].instanceList) {

 			for (const network in config.networks) {

-				tmp.push(...redirects[frontend][network])

+				tmp.push(...redirects[frontend][network], ...options[frontend][network].custom)

 			}

 		} else if (config.services[service].frontends[frontend].singleInstance != undefined) tmp.push(config.services[service].frontends[frontend].singleInstance)

 	}

@@ -168,10 +167,10 @@ function redirect(url, type, initiator) {
 			} else if (url.pathname.split("/").includes("tweets")) return `${randomInstance}${url.pathname.replace("/tweets", "")}${url.search}`

 			else if (url.host == "t.co") return `${randomInstance}/t.co${url.pathname}`

 			else return `${randomInstance}${url.pathname}${url.search}`

-		case "yatte":

+		case "yattee":

 			return url.href.replace(/^https?:\/{2}/, "yattee://")

 		case "freetube":

-			return `freetube://https://youtube.com${url.pathname}${url.search}`

+			return `freetube://https://youtu.be${url.pathname}${url.search}`.replace(/watch\?v=/, "")

 		case "simplyTranslate":

 			return `${randomInstance}/${url.search}`

 		case "osm": {

@@ -462,9 +461,9 @@ function switchInstance(url) {
 	return new Promise(async resolve => {

 		await init()

 		await getConfig()

+		const protocolHost = utils.protocolHost(url)

 		for (const service in config.services) {

 			if (!options[service].enabled) continue

-			const protocolHost = utils.protocolHost(url)

 			if (!all(service).includes(protocolHost)) continue

 

 			let instancesList = [...options[options[service].frontend][options.network].checks, ...options[options[service].frontend][options.network].custom]

@@ -485,15 +484,44 @@ function switchInstance(url) {
 			// This is to make instance switching work when the instance depends on the pathname, eg https://darmarit.org/searx

 			// Doesn't work because of .includes array method, not a top priotiry atm

 			resolve(oldUrl.replace(oldInstance, randomInstance))

+			return

 		}

 		resolve()

 	})

 }

 

+function reverse(url) {

+	return new Promise(async resolve => {

+		await init()

+		await getConfig()

+		let protocolHost = utils.protocolHost(url)

+		let currentService

+		for (const service in config.services) {

+			if (!all(service).includes(protocolHost)) continue

+			currentService = service

+		}

+		switch (currentService) {

+			case "instagram":

+				if (url.pathname.startsWith("/p")) resolve(`https://instagram.com${url.pathname.replace("/p", "")}${url.search}`)

+				if (url.pathname.startsWith("/u")) resolve(`https://instagram.com${url.pathname.replace("/u", "")}${url.search}`)

+			case "youtube":

+			case "imdb":

+			case "imgur":

+			case "tiktok":

+			case "twitter":

+				resolve(config.services[currentService].url + url.pathname + url.search)

+				return

+			default:

+				resolve()

+				return

+		}

+	})

+}

+

 export default {

 	redirect,

 	initDefaults,

 	computeService,

 	switchInstance,

-	init,

+	reverse,

 }

diff --git a/src/assets/javascripts/utils.js b/src/assets/javascripts/utils.js
index 371838ff..c28af018 100644
--- a/src/assets/javascripts/utils.js
+++ b/src/assets/javascripts/utils.js
@@ -408,13 +408,7 @@ function copyRaw(test, copyRawElement) {
 					return
 				}
 
-				let newUrl = await youtubeHelper.reverse(url)
-				if (!newUrl) newUrl = await twitterHelper.reverse(url)
-				if (!newUrl) newUrl = await instagramHelper.reverse(url)
-				if (!newUrl) newUrl = await tiktokHelper.reverse(url)
-				if (!newUrl) newUrl = await quoraHelper.reverse(url)
-				if (!newUrl) newUrl = await libremdbHelper.reverse(url)
-				if (!newUrl) newUrl = await imgurHelper.reverse(url)
+				let newUrl = await servicesHelper.reverse(url)
 
 				if (newUrl) {
 					resolve(newUrl)
diff --git a/src/config/config.json b/src/config/config.json
index 84f430fa..ca835d51 100644
--- a/src/config/config.json
+++ b/src/config/config.json
@@ -1,548 +1,546 @@
 {

-	"config": {

-		"networks": {

-			"clearnet": {

-				"tld": "org",

-				"name": "Clearnet"

-			},

-			"tor": {

-				"tld": "onion",

-				"name": "Tor"

-			},

-			"i2p": {

-				"tld": "i2p",

-				"name": "I2P"

-			},

-			"loki": {

-				"tld": "loki",

-				"name": "Lokinet"

-			}

+	"networks": {

+		"clearnet": {

+			"tld": "org",

+			"name": "Clearnet"

 		},

-		"services": {

-			"youtube": {

-				"frontends": {

-					"invidious": {

-						"preferences": {

-							"cookies": ["PREFS"]

-						},

-						"name": "Invidious",

-						"embeddable": true,

-						"instanceList": true

-					},

-					"piped": {

-						"preferences": {

-							"localstorage": [

-								"bufferGoal",

-								"comments",

-								"disableLBRY",

-								"enabledCodecs",

-								"hl",

-								"homepage",

-								"instance",

-								"listen",

-								"minimizeDescription",

-								"playerAutoPlay",

-								"proxyLBRY",

-								"quality",

-								"region",

-								"selectedSkip",

-								"sponsorblock",

-								"theme",

-								"volume",

-								"watchHistory"

-							]

-						},

-						"name": "Piped",

-						"embeddable": true,

-						"instanceList": true

-					},

-					"pipedMaterial": {

-						"preferences": {

-							"localstorage": ["PREFERENCES"]

-						},

-						"name": "Piped-Material",

-						"embeddable": false,

-						"instanceList": true

-					},

-					"cloudtube": {

-						"preferences": {

-							"token": "token",

-							"fetchEndpoint": "/api/settings",

-							"setEndpoint": "/settings"

-						},

-						"name": "CloudTube",

-						"embeddable": false,

-						"instanceList": true

+		"tor": {

+			"tld": "onion",

+			"name": "Tor"

+		},

+		"i2p": {

+			"tld": "i2p",

+			"name": "I2P"

+		},

+		"loki": {

+			"tld": "loki",

+			"name": "Lokinet"

+		}

+	},

+	"services": {

+		"youtube": {

+			"frontends": {

+				"invidious": {

+					"preferences": {

+						"cookies": ["PREFS"]

 					},

-					"freetube": {

-						"name": "FreeTube",

-						"embeddable": false,

-						"instanceList": false

+					"name": "Invidious",

+					"embeddable": true,

+					"instanceList": true

+				},

+				"piped": {

+					"preferences": {

+						"localstorage": [

+							"bufferGoal",

+							"comments",

+							"disableLBRY",

+							"enabledCodecs",

+							"hl",

+							"homepage",

+							"instance",

+							"listen",

+							"minimizeDescription",

+							"playerAutoPlay",

+							"proxyLBRY",

+							"quality",

+							"region",

+							"selectedSkip",

+							"sponsorblock",

+							"theme",

+							"volume",

+							"watchHistory"

+						]

 					},

-					"yattee": {

-						"name": "Yattee",

-						"embeddable": false,

-						"instanceList": false

-					}

+					"name": "Piped",

+					"embeddable": true,

+					"instanceList": true

 				},

-				"targets": [

-					"^https?:\\/{2}(?:www\\.|m\\.|)youtube.com(?!iframe_api\\/.*)",

-					"^https?:\\/{2}img\\.youtube.com\\/vi\\/.*\\/..*",

-					"^https?:\\/{2}(?:i|s)\\.ytimg.com\\/vi\\/.*\\/..*",

-					"^https?:\\/{2}(?:www\\.|music\\.|)youtube.com\\/watch?v=..*",

-					"^https?:\\/{2}youtu\\.be\\/..*",

-					"^https?:\\/{2}(?:www\\.|)(youtube|youtube-nocookie)\\.com\\/embed\\/..*"

-				],

-				"name": "Youtube",

-				"options": {

-					"enabled": true,

-					"redirectType": "both",

-					"frontend": "invidious",

-					"embedFrontend": "invidious"

+				"pipedMaterial": {

+					"preferences": {

+						"localstorage": ["PREFERENCES"]

+					},

+					"name": "Piped-Material",

+					"embeddable": false,

+					"instanceList": true

 				},

-				"imageType": "png",

-				"embeddable": true,

-				"url": "https://youtube.com"

-			},

-			"youtubeMusic": {

-				"frontends": {

-					"beatbump": {

-						"preferences": {

-							"localstorage": ["settings"],

-							"indexeddb": "beatbump"

-						},

-						"name": "Beatbump",

-						"instanceList": true

+				"cloudtube": {

+					"preferences": {

+						"token": "token",

+						"fetchEndpoint": "/api/settings",

+						"setEndpoint": "/settings"

 					},

-					"hyperpipe": {

-						"preferences": {

-							"localstorage": ["api", "authapi", "codec", "locale", "next", "pipedapi", "quality", "theme", "vol"],

-							"indexeddb": ["hyperpipedb"]

-						},

-						"name": "HyperPipe",

-						"instanceList": true

-					}

+					"name": "CloudTube",

+					"embeddable": false,

+					"instanceList": true

 				},

-				"targets": ["^https?:\\/{2}music\\.youtube\\.com(\\/.*|$)"],

-				"name": "YT Music",

-				"options": {

-					"enabled": true,

-					"frontend": "beatbump"

+				"freetube": {

+					"name": "FreeTube",

+					"embeddable": false,

+					"instanceList": false

 				},

-				"imageType": "png",

-				"embeddable": false,

-				"url": "https://music.youtube.com"

+				"yattee": {

+					"name": "Yattee",

+					"embeddable": false,

+					"instanceList": false

+				}

 			},

-			"twitter": {

-				"frontends": {

-					"nitter": {

-						"preferences": {

-							"cookies": [

-								"theme",

-								"infiniteScroll",

-								"stickyProfile",

-								"bidiSupport",

-								"hideTweetStats",

-								"hideBanner",

-								"hidePins",

-								"hideReplies",

-								"squareAvatars",

-								"mp4Playback",

-								"hlsPlayback",

-								"proxyVideos",

-								"muteVideos",

-								"autoplayGifs",

-								"replaceInstagram",

-								"replaceReddit",

-								"replaceTwitter",

-								"replaceYouTube"

-							]

-						},

-						"name": "Nitter",

-						"embeddable": true,

-						"instanceList": true

-					}

-				},

-				"targets": ["^https?:\\/{2}(www\\.|mobile\\.|)twitter\\.com", "^https?:\\/{2}(pbs\\.|video\\.|)twimg\\.com", "^https?:\\/{2}platform\\.twitter\\.com/embed", "^https?:\\/{2}t\\.co"],

-				"name": "Twitter",

-				"options": {

-					"enabled": true,

-					"redirectType": "both"

-				},

-				"imageType": "png",

-				"embeddable": true,

-				"url": "https://twitter.com"

+			"targets": [

+				"^https?:\\/{2}(?:www\\.|m\\.|)youtube.com(?!iframe_api\\/.*)",

+				"^https?:\\/{2}img\\.youtube.com\\/vi\\/.*\\/..*",

+				"^https?:\\/{2}(?:i|s)\\.ytimg.com\\/vi\\/.*\\/..*",

+				"^https?:\\/{2}(?:www\\.|music\\.|)youtube.com\\/watch?v=..*",

+				"^https?:\\/{2}youtu\\.be\\/..*",

+				"^https?:\\/{2}(?:www\\.|)(youtube|youtube-nocookie)\\.com\\/embed\\/..*"

+			],

+			"name": "Youtube",

+			"options": {

+				"enabled": true,

+				"redirectType": "both",

+				"frontend": "invidious",

+				"embedFrontend": "invidious"

 			},

-			"instagram": {

-				"frontends": {

-					"bibliogram": {

-						"preferences": {

-							"token": "token",

-							"fetchEndpoint": "/settings.json",

-							"setEndpoint": "/applysettings"

-						},

-						"name": "Bibliogram",

-						"instanceList": true

-					}

+			"imageType": "png",

+			"embeddable": true,

+			"url": "https://youtube.com"

+		},

+		"youtubeMusic": {

+			"frontends": {

+				"beatbump": {

+					"preferences": {

+						"localstorage": ["settings"],

+						"indexeddb": "beatbump"

+					},

+					"name": "Beatbump",

+					"instanceList": true

 				},

-				"targets": ["^https?:\\/{2}(www\\.)?instagram\\.com"],

-				"name": "Instagram",

-				"options": { "enabled": true },

-				"imageType": "png",

-				"embeddable": false,

-				"url": "https://instagram.com"

+				"hyperpipe": {

+					"preferences": {

+						"localstorage": ["api", "authapi", "codec", "locale", "next", "pipedapi", "quality", "theme", "vol"],

+						"indexeddb": ["hyperpipedb"]

+					},

+					"name": "HyperPipe",

+					"instanceList": true

+				}

 			},

-			"tiktok": {

-				"frontends": {

-					"proxiTok": {

-						"preferences": {

-							"cookies": ["api-test_endpoints", "theme"]

-						},

-						"name": "ProxiTok",

-						"instanceList": true

-					}

-				},

-				"targets": ["^https?:\\/{2}(www\\.|)tiktok\\.com.*"],

-				"name": "TikTok",

-				"options": { "enabled": true },

-				"imageType": "png",

-				"embeddable": false,

-				"url": "https://tiktok.com"

+			"targets": ["^https?:\\/{2}music\\.youtube\\.com(\\/.*|$)"],

+			"name": "YT Music",

+			"options": {

+				"enabled": true,

+				"frontend": "beatbump"

 			},

-			"reddit": {

-				"frontends": {

-					"libreddit": {

-						"preferences": {

-							"cookies": ["theme", "front_page", "layout", "wide", "post_sort", "comment_sort", "show_nsfw", "autoplay_videos", "use_hls", "hide_hls_notification", "subscriptions", "filters"]

-						},

-						"name": "Libreddit",

-						"instanceList": true

+			"imageType": "png",

+			"embeddable": false,

+			"url": "https://music.youtube.com"

+		},

+		"twitter": {

+			"frontends": {

+				"nitter": {

+					"preferences": {

+						"cookies": [

+							"theme",

+							"infiniteScroll",

+							"stickyProfile",

+							"bidiSupport",

+							"hideTweetStats",

+							"hideBanner",

+							"hidePins",

+							"hideReplies",

+							"squareAvatars",

+							"mp4Playback",

+							"hlsPlayback",

+							"proxyVideos",

+							"muteVideos",

+							"autoplayGifs",

+							"replaceInstagram",

+							"replaceReddit",

+							"replaceTwitter",

+							"replaceYouTube"

+						]

 					},

-					"teddit": {

-						"preferences": {

-							"cookies": [

-								"collapse_child_comments",

-								"domain_instagram",

-								"domain_twitter",

-								"domain_youtube",

-								"flairs",

-								"highlight_controversial",

-								"nsfw_enabled",

-								"post_media_max_height",

-								"show_upvoted_percentage",

-								"show_upvotes",

-								"theme",

-								"videos_muted"

-							]

-						},

-						"name": "Teddit",

-						"instanceList": true

-					}

-				},

-				"targets": ["^https?:\\/{2}(www\\.|old\\.|np\\.|new\\.|amp\\.|)reddit\\.com", "^https?:\\/{2}(i\\.|preview\\.)redd\\.it"],

-				"name": "Reddit",

-				"options": {

-					"enabled": true,

-					"frontend": "libreddit"

-				},

-				"imageType": "png",

-				"embeddable": false,

-				"url": "https://reddit.com"

+					"name": "Nitter",

+					"embeddable": true,

+					"instanceList": true

+				}

 			},

-			"imgur": {

-				"frontends": {

-					"rimgo": {

-						"name": "rimgo",

-						"instanceList": true

-					}

-				},

-				"targets": ["^https?:\\/{2}([im]\\.)?imgur\\.(com|io)(\\/|$)"],

-				"name": "Imgur",

-				"options": { "enabled": true },

-				"imageType": "png",

-				"embeddable": false,

-				"url": "https://imgur.com"

-			},

-			"wikipedia": {

-				"frontends": {

-					"wikiless": {

-						"preferences": {

-							"cookies": ["theme", "default_lang"]

-						},

-						"name": "Wikiless",

-						"instanceList": true

-					}

-				},

-				"targets": ["^https?:\\/{2}(?:[a-z]+\\.)*wikipedia\\.org"],

-				"name": "Wikipedia",

-				"options": { "enabled": false },

-				"imageType": "svg",

-				"embeddable": false,

-				"url": "https://wikipedia.com"

+			"targets": ["^https?:\\/{2}(www\\.|mobile\\.|)twitter\\.com", "^https?:\\/{2}(pbs\\.|video\\.|)twimg\\.com", "^https?:\\/{2}platform\\.twitter\\.com/embed", "^https?:\\/{2}t\\.co"],

+			"name": "Twitter",

+			"options": {

+				"enabled": true,

+				"redirectType": "both"

 			},

-			"medium": {

-				"frontends": {

-					"scribe": {

-						"name": "Scribe",

-						"instanceList": true

-					}

-				},

-				"targets": [

-					"(?:.*\\.)*(?<!(link\\.|cdn\\-images\\-\\d+\\.))medium\\.com(\\/.*)?$",

-					"^towardsdatascience\\.com",

-					"^uxdesign\\.cc",

-					"^uxplanet\\.org",

-					"^betterprogramming\\.pub",

-					"^aninjusticemag\\.com",

-					"^betterhumans\\.pub",

-					"^psiloveyou\\.xyz",

-					"^entrepreneurshandbook\\.co",

-					"^blog\\.coinbase\\.com",

-					"^levelup\\.gitconnected\\.com",

-					"^javascript\\.plainenglish\\.io",

-					"^blog\\.bitsrc\\.io",

-					"^itnext\\.io",

-					"^codeburst\\.io",

-					"^infosecwriteups\\.com",

-					"^blog\\.devgenius\\.io",

-					"^writingcooperative\\.com"

-				],

-				"name": "Medium",

-				"options": { "enabled": true },

-				"imageType": "svgMono",

-				"embeddable": false,

-				"url": "https://medium.com"

+			"imageType": "png",

+			"embeddable": true,

+			"url": "https://twitter.com"

+		},

+		"instagram": {

+			"frontends": {

+				"bibliogram": {

+					"preferences": {

+						"token": "token",

+						"fetchEndpoint": "/settings.json",

+						"setEndpoint": "/applysettings"

+					},

+					"name": "Bibliogram",

+					"instanceList": true

+				}

 			},

-			"quora": {

-				"frontends": {

-					"quetre": {

-						"preferences": {

-							"localstorage": ["theme"]

-						},

-						"name": "Quetre",

-						"instanceList": true

-					}

-				},

-				"targets": ["^https?:\\/{2}([a-z]+\\.)*quora\\.com.*"],

-				"name": "Quora",

-				"options": { "enabled": true },

-				"imageType": "png",

-				"embeddable": false,

-				"url": "https://quora.com"

+			"targets": ["^https?:\\/{2}(www\\.)?instagram\\.com"],

+			"name": "Instagram",

+			"options": { "enabled": true },

+			"imageType": "png",

+			"embeddable": false,

+			"url": "https://instagram.com"

+		},

+		"tiktok": {

+			"frontends": {

+				"proxiTok": {

+					"preferences": {

+						"cookies": ["api-test_endpoints", "theme"]

+					},

+					"name": "ProxiTok",

+					"instanceList": true

+				}

 			},

-			"imdb": {

-				"frontends": {

-					"libremdb": {

-						"preferences": {

-							"localstorage": ["theme"]

-						},

-						"name": "libremdb",

-						"instanceList": true

-					}

+			"targets": ["^https?:\\/{2}(www\\.|)tiktok\\.com.*"],

+			"name": "TikTok",

+			"options": { "enabled": true },

+			"imageType": "png",

+			"embeddable": false,

+			"url": "https://tiktok.com"

+		},

+		"reddit": {

+			"frontends": {

+				"libreddit": {

+					"preferences": {

+						"cookies": ["theme", "front_page", "layout", "wide", "post_sort", "comment_sort", "show_nsfw", "autoplay_videos", "use_hls", "hide_hls_notification", "subscriptions", "filters"]

+					},

+					"name": "Libreddit",

+					"instanceList": true

 				},

-				"targets": ["^https?:\\/{2}(?:www\\.|)imdb\\.com.*"],

-				"name": "IMDb",

-				"options": { "enabled": false },

-				"imageType": "svg",

-				"embeddable": false,

-				"url": "https://imdb.com"

+				"teddit": {

+					"preferences": {

+						"cookies": [

+							"collapse_child_comments",

+							"domain_instagram",

+							"domain_twitter",

+							"domain_youtube",

+							"flairs",

+							"highlight_controversial",

+							"nsfw_enabled",

+							"post_media_max_height",

+							"show_upvoted_percentage",

+							"show_upvotes",

+							"theme",

+							"videos_muted"

+						]

+					},

+					"name": "Teddit",

+					"instanceList": true

+				}

 			},

-			"reuters": {

-				"frontends": {

-					"neuters": {

-						"name": "Neuters",

-						"instanceList": true

-					}

-				},

-				"targets": ["^https?:\\/{2}(www\\.|)reuters\\.com.*"],

-				"name": "Reuters",

-				"options": { "enabled": false },

-				"imageType": "svg",

-				"embeddable": false,

-				"url": "https://reuters.com"

+			"targets": ["^https?:\\/{2}(www\\.|old\\.|np\\.|new\\.|amp\\.|)reddit\\.com", "^https?:\\/{2}(i\\.|preview\\.)redd\\.it"],

+			"name": "Reddit",

+			"options": {

+				"enabled": true,

+				"frontend": "libreddit"

 			},

-			"peertube": {

-				"frontends": {

-					"simpleertube": {

-						"name": "SimpleerTube",

-						"instanceList": true

-					}

-				},

-				"targets": "datajson",

-				"name": "PeerTube",

-				"options": { "enabled": false },

-				"imageType": "svg",

-				"embeddable": false,

-				"url": "https://search.joinpeertube.org"

+			"imageType": "png",

+			"embeddable": false,

+			"url": "https://reddit.com"

+		},

+		"imgur": {

+			"frontends": {

+				"rimgo": {

+					"name": "rimgo",

+					"instanceList": true

+				}

 			},

-			"lbry": {

-				"frontends": {

-					"librarian": {

-						"preferences": {

-							"cookies": ["nsfw", "theme"],

-							"localstorage": ["autoplay", "autoplayNextVid", "collapseComments", "plyr", "sb_categories", "showRelated"]

-						},

-						"name": "Librarian",

-						"embeddable": true,

-						"instanceList": true

+			"targets": ["^https?:\\/{2}([im]\\.)?imgur\\.(com|io)(\\/|$)"],

+			"name": "Imgur",

+			"options": { "enabled": true },

+			"imageType": "png",

+			"embeddable": false,

+			"url": "https://imgur.com"

+		},

+		"wikipedia": {

+			"frontends": {

+				"wikiless": {

+					"preferences": {

+						"cookies": ["theme", "default_lang"]

 					},

-					"lbryDesktop": {

-						"name": "LBRY Desktop",

-						"embeddable": false,

-						"instanceList": false

-					}

-				},

-				"targets": ["^https?:\\/{2}odysee\\.com", "^https?:\\/{2}lbry\\.tv"],

-				"name": "LBRY",

-				"options": {

-					"enabled": false,

-					"frontend": "librarian",

-					"redirectType": "both",

-					"embedFrontend": "librarian"

-				},

-				"imageType": "png",

-				"embeddable": true,

-				"url": "https://odysee.com"

+					"name": "Wikiless",

+					"instanceList": true

+				}

+			},

+			"targets": ["^https?:\\/{2}(?:[a-z]+\\.)*wikipedia\\.org"],

+			"name": "Wikipedia",

+			"options": { "enabled": false },

+			"imageType": "svg",

+			"embeddable": false,

+			"url": "https://wikipedia.com"

+		},

+		"medium": {

+			"frontends": {

+				"scribe": {

+					"name": "Scribe",

+					"instanceList": true

+				}

 			},

-			"search": {

-				"frontends": {

-					"searx": {

-						"preferences": {

-							"cookies": [

-								"advanced_search",

-								"autocomplete",

-								"categories",

-								"disabled_engines",

-								"disabled_plugins",

-								"doi_resolver",

-								"enabled_engines",

-								"enabled_plugins",

-								"image_proxy",

-								"language",

-								"locale",

-								"method",

-								"oscar-style",

-								"results_on_new_tab",

-								"safesearch",

-								"theme",

-								"tokens"

-							]

-						},

-						"name": "SearX",

-						"instanceList": true

+			"targets": [

+				"(?:.*\\.)*(?<!(link\\.|cdn\\-images\\-\\d+\\.))medium\\.com(\\/.*)?$",

+				"^towardsdatascience\\.com",

+				"^uxdesign\\.cc",

+				"^uxplanet\\.org",

+				"^betterprogramming\\.pub",

+				"^aninjusticemag\\.com",

+				"^betterhumans\\.pub",

+				"^psiloveyou\\.xyz",

+				"^entrepreneurshandbook\\.co",

+				"^blog\\.coinbase\\.com",

+				"^levelup\\.gitconnected\\.com",

+				"^javascript\\.plainenglish\\.io",

+				"^blog\\.bitsrc\\.io",

+				"^itnext\\.io",

+				"^codeburst\\.io",

+				"^infosecwriteups\\.com",

+				"^blog\\.devgenius\\.io",

+				"^writingcooperative\\.com"

+			],

+			"name": "Medium",

+			"options": { "enabled": true },

+			"imageType": "svgMono",

+			"embeddable": false,

+			"url": "https://medium.com"

+		},

+		"quora": {

+			"frontends": {

+				"quetre": {

+					"preferences": {

+						"localstorage": ["theme"]

 					},

-					"searxng": {

-						"preferences": {

-							"cookies": [

-								"autocomplete",

-								"categories",

-								"disabled_engines",

-								"disabled_plugins",

-								"doi_resolver",

-								"enabled_plugins",

-								"enabled_engines",

-								"image_proxy",

-								"infinite_scroll",

-								"language",

-								"locale",

-								"maintab",

-								"method",

-								"query_in_title",

-								"results_on_new_tab",

-								"safesearch",

-								"simple_style",

-								"theme",

-								"tokens"

-							]

-						},

-						"name": "SearXNG",

-						"instanceList": true

+					"name": "Quetre",

+					"instanceList": true

+				}

+			},

+			"targets": ["^https?:\\/{2}([a-z]+\\.)*quora\\.com.*"],

+			"name": "Quora",

+			"options": { "enabled": true },

+			"imageType": "png",

+			"embeddable": false,

+			"url": "https://quora.com"

+		},

+		"imdb": {

+			"frontends": {

+				"libremdb": {

+					"preferences": {

+						"localstorage": ["theme"]

 					},

-					"whoogle": {

-						"name": "Whoogle",

-						"instanceList": true

+					"name": "libremdb",

+					"instanceList": true

+				}

+			},

+			"targets": ["^https?:\\/{2}(?:www\\.|)imdb\\.com.*"],

+			"name": "IMDb",

+			"options": { "enabled": false },

+			"imageType": "svg",

+			"embeddable": false,

+			"url": "https://imdb.com"

+		},

+		"reuters": {

+			"frontends": {

+				"neuters": {

+					"name": "Neuters",

+					"instanceList": true

+				}

+			},

+			"targets": ["^https?:\\/{2}(www\\.|)reuters\\.com.*"],

+			"name": "Reuters",

+			"options": { "enabled": false },

+			"imageType": "svg",

+			"embeddable": false,

+			"url": "https://reuters.com"

+		},

+		"peertube": {

+			"frontends": {

+				"simpleertube": {

+					"name": "SimpleerTube",

+					"instanceList": true

+				}

+			},

+			"targets": "datajson",

+			"name": "PeerTube",

+			"options": { "enabled": false },

+			"imageType": "svg",

+			"embeddable": false,

+			"url": "https://search.joinpeertube.org"

+		},

+		"lbry": {

+			"frontends": {

+				"librarian": {

+					"preferences": {

+						"cookies": ["nsfw", "theme"],

+						"localstorage": ["autoplay", "autoplayNextVid", "collapseComments", "plyr", "sb_categories", "showRelated"]

 					},

-					"librex": {

-						"preferences": {

-							"cookies": ["bibliogram", "disable_frontends", " disable_special", "invidious", "libreddit", "nitter", "proxitok", "save", "theme", "wikiless"]

-						},

-						"name": "LibreX",

-						"instanceList": true

-					}

+					"name": "Librarian",

+					"embeddable": true,

+					"instanceList": true

 				},

-				"targets": ["^https?:\\/{2}search\\.libredirect\\.invalid"],

-				"name": "Search",

-				"options": {

-					"enabled": true,

-					"frontend": "searxng"

-				},

-				"imageType": "svgMono",

-				"embeddable": false,

-				"url": "https://search.libredirect.invalid"

+				"lbryDesktop": {

+					"name": "LBRY Desktop",

+					"embeddable": false,

+					"instanceList": false

+				}

+			},

+			"targets": ["^https?:\\/{2}odysee\\.com", "^https?:\\/{2}lbry\\.tv"],

+			"name": "LBRY",

+			"options": {

+				"enabled": false,

+				"frontend": "librarian",

+				"redirectType": "both",

+				"embedFrontend": "librarian"

 			},

-			"translate": {

-				"frontends": {

-					"simplyTranslate": {

-						"preferences": {

-							"cookies": ["from_lang", "to_lang", "tts_enabled", "use_text_fields"]

-						},

-						"name": "SimplyTranslate",

-						"instanceList": true

+			"imageType": "png",

+			"embeddable": true,

+			"url": "https://odysee.com"

+		},

+		"search": {

+			"frontends": {

+				"searx": {

+					"preferences": {

+						"cookies": [

+							"advanced_search",

+							"autocomplete",

+							"categories",

+							"disabled_engines",

+							"disabled_plugins",

+							"doi_resolver",

+							"enabled_engines",

+							"enabled_plugins",

+							"image_proxy",

+							"language",

+							"locale",

+							"method",

+							"oscar-style",

+							"results_on_new_tab",

+							"safesearch",

+							"theme",

+							"tokens"

+						]

+					},

+					"name": "SearX",

+					"instanceList": true

+				},

+				"searxng": {

+					"preferences": {

+						"cookies": [

+							"autocomplete",

+							"categories",

+							"disabled_engines",

+							"disabled_plugins",

+							"doi_resolver",

+							"enabled_plugins",

+							"enabled_engines",

+							"image_proxy",

+							"infinite_scroll",

+							"language",

+							"locale",

+							"maintab",

+							"method",

+							"query_in_title",

+							"results_on_new_tab",

+							"safesearch",

+							"simple_style",

+							"theme",

+							"tokens"

+						]

 					},

-					"lingva": {

-						"preferences": {

-							"localstorage": ["isauto", "source", "target"]

-						},

-						"name": "Lingva",

-						"instanceList": true

-					}

+					"name": "SearXNG",

+					"instanceList": true

 				},

-				"targets": ["^https?:\\/{2}translate\\.google(\\.[a-z]{2,3}){1,2}\\/"],

-				"name": "Translate",

-				"options": {

-					"enabled": true,

-					"frontend": "simplyTranslate"

+				"whoogle": {

+					"name": "Whoogle",

+					"instanceList": true

 				},

-				"imageType": "svgMono",

-				"embeddable": false,

-				"url": "https://translate.google.com"

+				"librex": {

+					"preferences": {

+						"cookies": ["bibliogram", "disable_frontends", " disable_special", "invidious", "libreddit", "nitter", "proxitok", "save", "theme", "wikiless"]

+					},

+					"name": "LibreX",

+					"instanceList": true

+				}

 			},

-			"maps": {

-				"frontends": {

-					"facil": {

-						"name": "FacilMap",

-						"instanceList": true

+			"targets": ["^https?:\\/{2}search\\.libredirect\\.invalid"],

+			"name": "Search",

+			"options": {

+				"enabled": true,

+				"frontend": "searxng"

+			},

+			"imageType": "svgMono",

+			"embeddable": false,

+			"url": "https://search.libredirect.invalid"

+		},

+		"translate": {

+			"frontends": {

+				"simplyTranslate": {

+					"preferences": {

+						"cookies": ["from_lang", "to_lang", "tts_enabled", "use_text_fields"]

 					},

-					"osm": {

-						"name": "OpenStreetMap",

-						"instanceList": false,

-						"singleInstance": "https://www.openstreetmap.org"

-					}

+					"name": "SimplyTranslate",

+					"instanceList": true

 				},

-				"targets": ["^https?:\\/{2}(((www|maps)\\.)?(google\\.).*(\\/maps)|maps\\.(google\\.).*)"],

-				"name": "Maps",

-				"options": {

-					"enabled": true,

-					"frontend": "osm"

-				},

-				"imageType": "svgMono",

-				"embeddable": false,

-				"url": "https://maps.google.com"

+				"lingva": {

+					"preferences": {

+						"localstorage": ["isauto", "source", "target"]

+					},

+					"name": "Lingva",

+					"instanceList": true

+				}

 			},

-			"sendTargets": {

-				"frontends": {

-					"send": {

-						"name": "Send",

-						"instanceList": "true"

-					}

+			"targets": ["^https?:\\/{2}translate\\.google(\\.[a-z]{2,3}){1,2}\\/"],

+			"name": "Translate",

+			"options": {

+				"enabled": true,

+				"frontend": "simplyTranslate"

+			},

+			"imageType": "svgMono",

+			"embeddable": false,

+			"url": "https://translate.google.com"

+		},

+		"maps": {

+			"frontends": {

+				"facil": {

+					"name": "FacilMap",

+					"instanceList": true

 				},

-				"targets": ["^https?:\\/{2}send\\.libredirect\\.invalid\\/$", "^https?:\\/{2}send\\.firefox\\.com\\/$", "^https?:\\/{2}sendfiles\\.online\\/$"],

-				"name": "Send Files",

-				"options": { "enabled": true },

-				"imageType": "svgMono",

-				"embeddable": false,

-				"url": "https://send.libredirect.invalid"

-			}

+				"osm": {

+					"name": "OpenStreetMap",

+					"instanceList": false,

+					"singleInstance": "https://www.openstreetmap.org"

+				}

+			},

+			"targets": ["^https?:\\/{2}(((www|maps)\\.)?(google\\.).*(\\/maps)|maps\\.(google\\.).*)"],

+			"name": "Maps",

+			"options": {

+				"enabled": true,

+				"frontend": "osm"

+			},

+			"imageType": "svgMono",

+			"embeddable": false,

+			"url": "https://maps.google.com"

+		},

+		"sendTargets": {

+			"frontends": {

+				"send": {

+					"name": "Send",

+					"instanceList": "true"

+				}

+			},

+			"targets": ["^https?:\\/{2}send\\.libredirect\\.invalid\\/$", "^https?:\\/{2}send\\.firefox\\.com\\/$", "^https?:\\/{2}sendfiles\\.online\\/$"],

+			"name": "Send Files",

+			"options": { "enabled": true },

+			"imageType": "svgMono",

+			"embeddable": false,

+			"url": "https://send.libredirect.invalid"

 		}

 	}

 }

diff --git a/src/instances/get_instances.py b/src/instances/get_instances.py
index 85bdf1cf..3b773304 100644
--- a/src/instances/get_instances.py
+++ b/src/instances/get_instances.py
@@ -286,31 +286,7 @@ def send():
 
 
 def nitter():
-    r = requests.get('https://raw.githubusercontent.com/wiki/zedeus/nitter/Instances.md')
-    tmp = re.findall(
-        r"(?:(?:\| \[(?:\S+\.)+[a-zA-Z]+\]\((https?:\/{2}(?:\S+\.)+[a-zA-Z]+)\/?\) (?:\((?:\S+ ?\S*)\) )? *\| [^❌]{1,3} +\|(?:(?:\n)|(?: (?:❌)|(?: ✅)|(?: ❓)|(?: \[))))|(?:-   \[(?:\S+\.)+(?:(?:i2p)|(?:loki))\]\((https?:\/{2}(?:\S+\.)(?:(?:i2p)|(?:loki)))\/?\)))", r.text)
-
-    nitterList = {}
-    nitterList['clearnet'] = []
-    nitterList['tor'] = []
-    nitterList['i2p'] = []
-    nitterList['loki'] = []
-    for item in tmp:
-        for i in item:
-            if i == '':
-                continue
-            else:
-                item = i
-        if re.search(torRegex, item):
-            nitterList['tor'].append(item)
-        elif re.search(i2pRegex, item):
-            nitterList['i2p'].append(item)
-        elif re.search(lokiRegex, item):
-            nitterList['loki'].append(item)
-        else:
-            nitterList['clearnet'].append(item)
-    mightyList['nitter'] = nitterList
-    print(Fore.GREEN + 'Fetched ' + Style.RESET_ALL + 'Nitter')
+    fetchRegexList('nitter', 'Nitter', 'https://raw.githubusercontent.com/wiki/zedeus/nitter/Instances.md', r"(?:(?:\| )|(?:-   ))\[(?:(?:\S+\.)+[a-zA-Z0-9]+)\/?\]\((https?:\/{2}(?:\S+\.)+[a-zA-Z0-9]+)\/?\)(?:(?: (?:\((?:\S+ ?\S*)\) )? *\| [^❌]{1,4} +\|(?:(?:\n)|(?: ❌)|(?: ✅)|(?: ❓)|(?: \[)))|(?:\n))")
 
 
 def bibliogram():
@@ -334,11 +310,11 @@ def scribe():
 
 
 def quetre():
-    fetchRegexList('quetre', 'Quetre', 'https://raw.githubusercontent.com/zyachel/quetre/main/README.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|")
+    fetchRegexList('quetre', 'Quetre', 'https://raw.githubusercontent.com/zyachel/quetre/main/README.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|")
 
 
 def libremdb():
-    fetchRegexList('libremdb', 'libremdb', 'https://raw.githubusercontent.com/zyachel/libremdb/main/README.md', r"\| ([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)*\|*[A-Z]{0,}.*\|.*\|")
+    fetchRegexList('libremdb', 'libremdb', 'https://raw.githubusercontent.com/zyachel/libremdb/main/README.md', r"\| \[.*\]\(([-a-zA-Z0-9@:%_\+.~#?&//=]{2,}\.[a-z0-9]{2,}\b(?:\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)\)*\|*[A-Z]{0,}.*\|.*\|")
 
 
 def simpleertube():
diff --git a/src/pages/options/index.ejs b/src/pages/options/index.ejs
index e0ce3c3c..7f09e6da 100644
--- a/src/pages/options/index.ejs
+++ b/src/pages/options/index.ejs
@@ -2,10 +2,10 @@
 <html id="elementToShowWithJavaScript" lang="en">
   <%- include('src/pages/widgets/head') -%>
   <body class="option" dir="auto">
-  <%- include('src/pages/widgets/links', {config: config}) -%>
+  <%- include('src/pages/widgets/links', {services: services}) -%>
     <div id="pages">
-      <%- include('src/pages/options/widgets/general', {config: config}) -%>
-      <%- include('src/pages/options/widgets/services', {config: config}) -%>
+      <%- include('src/pages/options/widgets/general', {config: {networks, services}}) -%>
+      <%- include('src/pages/options/widgets/services', {config: {networks, services}}) -%>
       <%- include('src/pages/options/widgets/about') -%>
     </div>
   </body>
diff --git a/src/pages/options/widgets/general.js b/src/pages/options/widgets/general.js
index 2249f830..cfc95df2 100644
--- a/src/pages/options/widgets/general.js
+++ b/src/pages/options/widgets/general.js
@@ -22,8 +22,7 @@ async function getConfig() {
 		fetch("/config/config.json")
 			.then(response => response.text())
 			.then(data => {
-				const tmp = JSON.parse(data)
-				config = tmp.config
+				config = JSON.parse(data)
 				resolve()
 			})
 	})
diff --git a/src/pages/options/widgets/services.js b/src/pages/options/widgets/services.js
index b595943e..dbb66dec 100644
--- a/src/pages/options/widgets/services.js
+++ b/src/pages/options/widgets/services.js
@@ -9,8 +9,7 @@ function getConfig() {
 		fetch("/config/config.json")
 			.then(response => response.text())
 			.then(data => {
-				const tmp = JSON.parse(data)
-				config = tmp.config
+				config = JSON.parse(data)
 				resolve()
 			})
 	})
diff --git a/src/pages/popup/popup.ejs b/src/pages/popup/popup.ejs
index efb73e5c..5b3bb026 100644
--- a/src/pages/popup/popup.ejs
+++ b/src/pages/popup/popup.ejs
@@ -8,13 +8,13 @@
   </head>
   <body dir="auto">
     <div class="current_site">
-      <%- include('src/pages/widgets/switches', {config: config}) -%>
+      <%- include('src/pages/widgets/switches', {config: {networks, services}}) -%>
       <div id="current_site_divider">
         <hr>
       </div>
     </div>
     <div class="all_sites">
-      <%- include('src/pages/widgets/switches', {config: config}) -%>
+      <%- include('src/pages/widgets/switches', {config: {networks, services}}) -%>
     </div>
     <hr>
     <div class="some-block" id="change_instance_div"><a class="title button prevent" id="change_instance">
diff --git a/src/pages/popup/popup.js b/src/pages/popup/popup.js
index fce451cb..c28f2d94 100644
--- a/src/pages/popup/popup.js
+++ b/src/pages/popup/popup.js
@@ -27,8 +27,7 @@ async function getConfig() {
 		fetch("/config/config.json")
 			.then(response => response.text())
 			.then(data => {
-				const tmp = JSON.parse(data)
-				config = tmp.config
+				config = JSON.parse(data)
 				resolve()
 			})
 	})
diff --git a/src/pages/widgets/links.ejs b/src/pages/widgets/links.ejs
index 24a02e90..6fa9514c 100644
--- a/src/pages/widgets/links.ejs
+++ b/src/pages/widgets/links.ejs
@@ -1,13 +1,13 @@
 <section class="links" id="links">
   <div class="title"><%- include ('src/assets/images/general-icon.svg') %><a href="#general" data-localise="__MSG_general__">General</a></div>
-  <% for (const service in config.services) { -%>
+  <% for (const service in services) { -%>
   <div class="title">
-  <% if (config.services[service].imageType != "svgMono") { _%>
-  <img src="../../../assets/images/<%= service %>-icon.<%= config.services[service].imageType %>">
+  <% if (services[service].imageType != "svgMono") { _%>
+  <img src="../../../assets/images/<%= service %>-icon.<%= services[service].imageType %>">
   <% } else { _%>
   <%- include ('src/assets/images/' + service + '-icon.svg') %>
   <% } _%>
-  <a href="#<%= service %>" data-localise="__MSG_<%= service %>__"><%= config.services[service].name %></a></div>
+  <a href="#<%= service %>" data-localise="__MSG_<%= service %>__"><%= services[service].name %></a></div>
   <% }; -%>
   <div class="title"><%- include ('src/assets/images/about-icon.svg') %><a href="#about" data-localise="__MSG_about__">About</a></div>
 </section>