Add almost all irregular url structures
This commit is contained in:
parent
f360a6ff1f
commit
4492914535
|
@ -1,120 +1,152 @@
|
||||||
window.browser = window.browser || window.chrome
|
window.browser = window.browser || window.chrome
|
||||||
|
|
||||||
import utils from "./utils.js"
|
import utils from "./utils.js"
|
||||||
|
|
||||||
let config
|
let config
|
||||||
|
|
||||||
function getConfig() {
|
function getConfig() {
|
||||||
return new Promise(async resolve => {
|
return new Promise(async resolve => {
|
||||||
fetch("/config/config.json")
|
fetch("/config/config.json")
|
||||||
.then(response => response.text())
|
.then(response => response.text())
|
||||||
.then(data => {
|
.then(data => {
|
||||||
config = JSON.parse(data)
|
config = JSON.parse(data)
|
||||||
})
|
})
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let redirects = {}
|
let redirects = {}
|
||||||
let disabled, curNetwork, networkFallback, redirectType
|
let disabled, curNetwork, networkFallback, redirectType
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
return new Promise(async resolve => {
|
return new Promise(async resolve => {
|
||||||
browser.storage.local.get(["network", "networkFallback"], r => {
|
browser.storage.local.get(["network", "networkFallback"], r => {
|
||||||
curNetwork = r.network
|
curNetwork = r.network
|
||||||
networkFallback = r.networkFallback
|
networkFallback = r.networkFallback
|
||||||
})
|
})
|
||||||
//cur = current
|
//cur = current
|
||||||
getConfig()
|
getConfig()
|
||||||
for (service in config.services) {
|
for (service in config.services) {
|
||||||
redirects = {}
|
redirects = {}
|
||||||
browser.storage.local.get([`disable${camelCase(service)}`, `${service}Redirects`, `${service}RedirectType,`, `${service}Frontend`], r => {
|
browser.storage.local.get([`disable${camelCase(service)}`, `${service}Redirects`, `${service}RedirectType,`, `${service}Frontend`], r => {
|
||||||
disabled = r["disable" + camelCase(service)]
|
disabled = r["disable" + camelCase(service)]
|
||||||
redirects = r[service + "Redirects"]
|
redirects = r[service + "Redirects"]
|
||||||
frontend = r[service + "Frontend"]
|
frontend = r[service + "Frontend"]
|
||||||
})
|
})
|
||||||
for (frontend in config[service].frontends) {
|
for (frontend in config[service].frontends) {
|
||||||
redirects[frontend] = {}
|
redirects[frontend] = {}
|
||||||
for (network in config.networks) {
|
for (network in config.networks) {
|
||||||
browser.storage.local.get([`${frontend}${camelCase(network)}RedirectsChecks`, `${frontend}${camelCase(network)}CustomRedirects`], r => {
|
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"]]
|
redirects[frontend][network] = [...r[frontend + camelCase(network) + "RedirectsChecks"], ...r[frontend + camelCase(network) + "CustomRedirects"]]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resolve()
|
resolve()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
init()
|
init()
|
||||||
browser.storage.onChanged.addListener(init)
|
browser.storage.onChanged.addListener(init)
|
||||||
|
|
||||||
function redirect(url, type, initiator) {
|
function redirect(url, type, initiator) {
|
||||||
let randomInstance
|
let randomInstance, frontend
|
||||||
if (url.pathname == "/") return
|
if (url.pathname == "/") return
|
||||||
for (service in config.services) {
|
for (service in config.services) {
|
||||||
if (disabled && !disableOverride) continue
|
if (disabled && !disableOverride) continue
|
||||||
if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) continue
|
if (initiator && (all().includes(initiator.origin) || targets.includes(initiator.host))) continue
|
||||||
//if (!targets.some(rx => rx.test(url.href))) continue
|
//if (!targets.some(rx => rx.test(url.href))) continue
|
||||||
if (!target.test(url)) continue
|
if (!target.test(url)) continue
|
||||||
if (type != redirectType && type != "both") continue
|
if (type != redirectType && type != "both") continue
|
||||||
for (frontend in service.frontends) {
|
browser.storage.local.get(`${service}Frontend`, (frontend = r[service + "Frontend"]))
|
||||||
let instanceList = redirects[frontend][curNetwork]
|
let instanceList = redirects[frontend][curNetwork]
|
||||||
if (instanceList.length === 0 && networkFallback) instanceList = redirects[frontend].clearnet
|
if (instanceList.length === 0 && networkFallback) instanceList = redirects[frontend].clearnet
|
||||||
if (instanceList.length === 0) return
|
if (instanceList.length === 0) return
|
||||||
randomInstance = utils.getRandomInstance(instanceList)
|
randomInstance = utils.getRandomInstance(instanceList)
|
||||||
}
|
}
|
||||||
}
|
switch (frontend) {
|
||||||
switch (frontend) {
|
// This is where all instance-specific code must be ran to convert the service url to one that can be understood by the frontend.
|
||||||
case "beatbump":
|
case "beatbump":
|
||||||
return `${randomInstance}${url.pathname}${url.search}`
|
return `${randomInstance}${url.pathname}${url.search}`
|
||||||
.replace("/watch?v=", "/listen?id=")
|
.replace("/watch?v=", "/listen?id=")
|
||||||
.replace("/channel/", "/artist/")
|
.replace("/channel/", "/artist/")
|
||||||
.replace("/playlist?list=", "/playlist/VL")
|
.replace("/playlist?list=", "/playlist/VL")
|
||||||
.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=song")
|
.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/") + "?filter=song")
|
||||||
case "hyperpipe":
|
case "hyperpipe":
|
||||||
return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/"))
|
return `${randomInstance}${url.pathname}${url.search}`.replace(/\/search\?q=.*/, searchQuery => searchQuery.replace("?q=", "/"))
|
||||||
default:
|
case "bibliogram":
|
||||||
return `${randomInstance}${url.pathname}${url.search}`
|
const reservedPaths = ["u", "p", "privacy"]
|
||||||
}
|
if (url.pathname === "/" || reservedPaths.includes(url.pathname.split("/")[1])) return `${randomInstance}${url.pathname}${url.search}`
|
||||||
}
|
if (url.pathname.startsWith("/reel") || url.pathname.startsWith("/tv")) return `${randomInstance}/p${url.pathname.replace(/\/reel|\/tv/i, "")}${url.search}`
|
||||||
|
else return `${randomInstance}/u${url.pathname}${url.search}` // Likely a user profile, redirect to '/u/...'
|
||||||
function initDefaults() {
|
case "lbryDesktop":
|
||||||
return new Promise(resolve => {
|
return url.href.replace(/^https?:\/{2}odysee\.com\//, "lbry://").replace(/:(?=[a-zA-Z0-9])/g, "#")
|
||||||
fetch("/instances/data.json")
|
case "neuters":
|
||||||
.then(response => response.text())
|
if (url.pathname.startsWith("/article/") || url.pathname.startsWith("/pf/") || url.pathname.startsWith("/arc/") || url.pathname.startsWith("/resizer/")) return null
|
||||||
.then(data => {
|
else if (url.pathname.endsWith("/")) return `${randomInstance}${url.pathname}`
|
||||||
let dataJson = JSON.parse(data)
|
else return `${randomInstance}${url.pathname}/`
|
||||||
redirects = dataJson
|
case "searx":
|
||||||
browser.storage.local.get(["cloudflareBlackList", "authenticateBlackList", "offlineBlackList"], async r => {
|
case "searxng":
|
||||||
for (service in config.services) {
|
return `${randomInstance}/?q=${encodeURIComponent(url.searchParams.get("q"))}`
|
||||||
for (frontend in service.frontends) {
|
case "whoogle":
|
||||||
for (const instance of [...r.cloudflareBlackList, ...r.authenticateBlackList, ...r.offlineBlackList]) {
|
return `${randomInstance}/search${encodeURIComponent(url.searchParams.get("q"))}`
|
||||||
let i = redirects[frontend]["clearnet"].indexOf(instance)
|
case "librex":
|
||||||
if (i > -1) redirects[frontend]["clearnet"].splice(i, 1)
|
return `${randomInstance}/search.php${encodeURIComponent(url.searchParams.get("q"))}`
|
||||||
}
|
case "send":
|
||||||
browser.storage.local.set({
|
return randomInstance
|
||||||
["disable" + camelCase(service)]: false,
|
case "nitter":
|
||||||
[service + "Redirects"]: redirects,
|
if (url.host.split(".")[0] === "pbs" || url.host.split(".")[0] === "video") {
|
||||||
[service + "RedirectType"]: "both",
|
const [, id, format, extra] = url.search.match(/(.*)\?format=(.*)&(.*)/)
|
||||||
})
|
const query = encodeURIComponent(`${id}.${format}?${extra}`)
|
||||||
for (frontend in service.frontends) {
|
return `${randomInstance}/pic${url.pathname}${query}`
|
||||||
for (protocol in config.protocols) {
|
} else if (url.pathname.split("/").includes("tweets")) return `${randomInstance}${url.pathname.replace("/tweets", "")}${url.search}`
|
||||||
browser.storage.local.set({
|
else if (url.host == "t.co") return `${randomInstance}/t.co${url.pathname}`
|
||||||
[frontend + camelCase(protocol) + "RedirectsChecks"]: [...redirects[frontend][protocol]],
|
else return `${randomInstance}${url.pathname}${url.search}`
|
||||||
[frontend + camelCase(protocol) + "CustomRedirects"]: [],
|
case "yatte":
|
||||||
})
|
return url.href.replace(/^https?:\/{2}/, "yattee://")
|
||||||
}
|
case "freetube":
|
||||||
}
|
return `freetube://https://youtube.com${url.pathname}${url.search}`
|
||||||
;() => resolve()
|
case "simplyTranslate":
|
||||||
}
|
return `${randomInstance}/${url.search}`
|
||||||
}
|
default:
|
||||||
})
|
return `${randomInstance}${url.pathname}${url.search}`
|
||||||
})
|
} // TODO: Wikiless, All youtube frontends by changing regex, lingva
|
||||||
})
|
}
|
||||||
}
|
|
||||||
|
function initDefaults() {
|
||||||
export default {
|
return new Promise(resolve => {
|
||||||
redirect,
|
fetch("/instances/data.json")
|
||||||
initDefaults,
|
.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 (defaultOption in service.defaults) {
|
||||||
|
browser.storage.local.set({
|
||||||
|
[defaultOption]: defaultOption.value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
for (network in config.networks) {
|
||||||
|
browser.storage.local.set({
|
||||||
|
[frontend + camelCase(network) + "RedirectsChecks"]: [...redirects[frontend][network]],
|
||||||
|
[frontend + camelCase(network) + "CustomRedirects"]: [],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
;() => resolve()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
redirect,
|
||||||
|
initDefaults,
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue