about summary refs log tree commit diff stats
path: root/src/assets/javascripts/services.js
blob: 70d942336ae48911f6d9635186bdfa98e0bf7936 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
window.browser = window.browser || window.chrome

import utils from "./utils.js"

let config

function getConfig() {
	return new Promise(async resolve => {
		fetch("/config/config.json")
			.then(response => response.text())
			.then(data => {
				config = JSON.parse(data)
			})
		resolve()
	})
}

let redirects = {}
let disabled, curNetwork, networkFallback, redirectType

function init() {
	return new Promise(async resolve => {
		browser.storage.local.get(["network", "networkFallback"], r => {
			curNetwork = r.network
			networkFallback = r.networkFallback
		})
		//cur = current
		getConfig()
		for (service in config.services) {
			redirects = {}
			browser.storage.local.get([`disable${camelCase(service)}`, `${service}Redirects`, `${service}RedirectType,`, `${service}Frontend`], r => {
				disabled = r["disable" + camelCase(service)]
				redirects = r[service + "Redirects"]
				frontend = r[service + "Frontend"]
			})
			for (frontend in config[service].frontends) {
				redirects[frontend] = {}
				for (network in config.networks) {
					browser.storage.local.get([`${frontend}${camelCase(network)}RedirectsChecks`, `${frontend}${camelCase(network)}CustomRedirects`], r => {
						redirects[frontend][network] = [...r[frontend + camelCase(network) + "RedirectsChecks"], ...r[frontend + camelCase(network) + "CustomRedirects"]]
					})
				}
			}
		}
		resolve()
	})
}

init()
browser.storage.onChanged.addListener(init)

function redirect(url, type, initiator) {
	let randomInstance
	if (url.pathname == "/") return
	for (service in config.services) {
		if (disabled && !disableOverride) continue
		if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) continue
		//if (!targets.some(rx => rx.test(url.href))) continue
		if (!target.test(url)) continue
		if (type != redirectType && type != "both") continue
		for (frontend in service.frontends) {
			let instanceList = redirects[frontend][curNetwork]
			if (instanceList.length === 0 && networkFallback) instanceList = redirects[frontend].clearnet
			if (instanceList.length === 0) return
			randomInstance = utils.getRandomInstance(instanceList)
		}
	}
	switch (frontend) {
		case "beatbump":
			return `${randomInstance}${url.pathname}${url.search}`
				.replace("/watch?v=", "/listen?id=")
				.replace("/channel/", "/artist/")
				.replace("/playlist?list=", "/playlist/VL")
				.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=EgWKAQIIAWoKEAMQBBAKEAkQBQ%3D%3D")
		case "hyperpipe":
			return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/"))
		default:
			return `${randomInstance}${url.pathname}${url.search}`
	}
}

function initDefaults() {
	return new Promise(resolve => {
		fetch("/instances/data.json")
			.then(response => response.text())
			.then(data => {
				let dataJson = JSON.parse(data)
				redirects = dataJson
				browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], async r => {
					for (service in config.services) {
						for (frontend in service.frontends) {
							for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
								let i = redirects[frontend]["clearnet"].indexOf(instance)
								if (i > -1) redirects[frontend]["clearnet"].splice(i, 1)
							}
							browser.storage.local.set({
								["disable" + camelCase(service)]: false,
								[service + "Redirects"]: redirects,
								[service + "RedirectType"]: "both",
							})
							for (frontend in service.frontends) {
								for (protocol in config.protocols) {
									browser.storage.local.set({
										[frontend + camelCase(protocol) + "RedirectsChecks"]: [...redirects[frontend][protocol]],
										[frontend + camelCase(protocol) + "CustomRedirects"]: [],
									})
								}
							}
							;() => resolve()
						}
					}
				})
			})
	})
}

export default {
	redirect,
	initDefaults,
}