Add almost all irregular url structures

This commit is contained in:
Hygna 2022-09-08 21:04:25 +01:00
parent f360a6ff1f
commit 4492914535
1 changed files with 152 additions and 120 deletions

View File

@ -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,
}