453 lines
18 KiB
JavaScript
453 lines
18 KiB
JavaScript
window.browser = window.browser || window.chrome
|
|
|
|
import utils from "./utils.js"
|
|
|
|
const targets = [/^https?:\/{2}(www\.|old\.|np\.|new\.|amp\.|)reddit\.com/, /^https?:\/{2}(i\.|preview\.)redd\.it/]
|
|
let redirects = {}
|
|
|
|
const frontends = new Array("libreddit", "teddit")
|
|
const protocols = new Array("normal", "tor", "i2p", "loki")
|
|
|
|
for (let i = 0; i < frontends.length; i++) {
|
|
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 = val
|
|
libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
|
|
tedditNormalRedirectsChecks = [...redirects.teddit.normal]
|
|
for (const instance of r.cloudflareBlackList) {
|
|
const a = libredditNormalRedirectsChecks.indexOf(instance)
|
|
if (a > -1) libredditNormalRedirectsChecks.splice(a, 1)
|
|
|
|
const b = tedditNormalRedirectsChecks.indexOf(instance)
|
|
if (b > -1) tedditNormalRedirectsChecks.splice(b, 1)
|
|
}
|
|
browser.storage.local.set({
|
|
redditRedirects: redirects,
|
|
libredditNormalRedirectsChecks,
|
|
tedditNormalRedirectsChecks,
|
|
})
|
|
})
|
|
}
|
|
|
|
let disableReddit,
|
|
redditFrontend,
|
|
redditRedirects,
|
|
protocol,
|
|
protocolFallback,
|
|
libredditNormalRedirectsChecks,
|
|
libredditNormalCustomRedirects,
|
|
libredditTorRedirectsChecks,
|
|
libredditTorCustomRedirects,
|
|
libredditI2pCustomRedirects,
|
|
libredditLokiCustomRedirects,
|
|
tedditNormalRedirectsChecks,
|
|
tedditNormalCustomRedirects,
|
|
tedditTorRedirectsChecks,
|
|
tedditTorCustomRedirects,
|
|
tedditI2pCustomRedirects,
|
|
tedditLokiCustomRedirects
|
|
|
|
function init() {
|
|
return new Promise(resolve => {
|
|
browser.storage.local.get(
|
|
[
|
|
"disableReddit",
|
|
"redditFrontend",
|
|
"redditRedirects",
|
|
"protocol",
|
|
"protocolFallback",
|
|
"libredditNormalRedirectsChecks",
|
|
"libredditNormalCustomRedirects",
|
|
"libredditTorRedirectsChecks",
|
|
"libredditTorCustomRedirects",
|
|
"libredditI2pCustomRedirects",
|
|
"libredditLokiCustomRedirects",
|
|
"tedditNormalRedirectsChecks",
|
|
"tedditNormalCustomRedirects",
|
|
"tedditTorRedirectsChecks",
|
|
"tedditTorCustomRedirects",
|
|
"tedditI2pCustomRedirects",
|
|
"tedditLokiCustomRedirects",
|
|
],
|
|
r => {
|
|
disableReddit = r.disableReddit
|
|
redditFrontend = r.redditFrontend
|
|
redditRedirects = r.redditRedirects
|
|
protocol = r.protocol
|
|
protocolFallback = r.protocolFallback
|
|
libredditNormalRedirectsChecks = r.libredditNormalRedirectsChecks
|
|
libredditNormalCustomRedirects = r.libredditNormalCustomRedirects
|
|
libredditTorRedirectsChecks = r.libredditTorRedirectsChecks
|
|
libredditTorCustomRedirects = r.libredditTorCustomRedirects
|
|
libredditI2pCustomRedirects = r.libredditI2pCustomRedirects
|
|
libredditLokiCustomRedirects = r.libredditLokiCustomRedirects
|
|
tedditNormalRedirectsChecks = r.tedditNormalRedirectsChecks
|
|
tedditNormalCustomRedirects = r.tedditNormalCustomRedirects
|
|
tedditTorRedirectsChecks = r.tedditTorRedirectsChecks
|
|
tedditTorCustomRedirects = r.tedditTorCustomRedirects
|
|
tedditI2pCustomRedirects = r.tedditI2pCustomRedirects
|
|
tedditLokiCustomRedirects = r.tedditLokiCustomRedirects
|
|
resolve()
|
|
}
|
|
)
|
|
})
|
|
}
|
|
|
|
init()
|
|
browser.storage.onChanged.addListener(init)
|
|
|
|
function initLibredditCookies(test, from) {
|
|
return new Promise(async resolve => {
|
|
await init()
|
|
const protocolHost = utils.protocolHost(from)
|
|
if (
|
|
![
|
|
...libredditNormalRedirectsChecks,
|
|
...libredditTorRedirectsChecks,
|
|
...libredditNormalCustomRedirects,
|
|
...libredditTorCustomRedirects,
|
|
...libredditI2pCustomRedirects,
|
|
...libredditLokiCustomRedirects,
|
|
].includes(protocolHost)
|
|
) {
|
|
resolve()
|
|
return
|
|
}
|
|
|
|
if (!test) {
|
|
let checkedInstances = []
|
|
if (protocol == "loki") checkedInstances = [...libredditLokiCustomRedirects]
|
|
else if (protocol == "i2p") checkedInstances = [...libredditI2pCustomRedirects]
|
|
else if (protocol == "tor") checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
|
|
if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
|
|
checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
|
|
}
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "theme")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "front_page")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "layout")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "wide")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "post_sort")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "comment_sort")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "show_nsfw")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "autoplay_videos")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "use_hls")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "hide_hls_notification")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "subscriptions")
|
|
await utils.copyCookie("libreddit", from, checkedInstances, "filters")
|
|
}
|
|
resolve(true)
|
|
})
|
|
}
|
|
|
|
function pasteLibredditCookies() {
|
|
return new Promise(async resolve => {
|
|
await init()
|
|
if (disableReddit || redditFrontend != "libreddit" || protocol === undefined) {
|
|
resolve()
|
|
return
|
|
}
|
|
let checkedInstances = []
|
|
if (protocol == "loki") checkedInstances = [...libredditLokiCustomRedirects]
|
|
else if (protocol == "i2p") checkedInstances = [...libredditI2pCustomRedirects]
|
|
else if (protocol == "tor") checkedInstances = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
|
|
if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
|
|
checkedInstances = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
|
|
}
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "theme")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "front_page")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "layout")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "wide")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "post_sort")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "comment_sort")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "show_nsfw")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "autoplay_videos")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "use_hls")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "hide_hls_notification")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "subscriptions")
|
|
utils.getCookiesFromStorage("libreddit", checkedInstances, "filters")
|
|
resolve()
|
|
})
|
|
}
|
|
|
|
function initTedditCookies(test, from) {
|
|
return new Promise(async resolve => {
|
|
await init()
|
|
let protocolHost = utils.protocolHost(from)
|
|
if (
|
|
![...tedditNormalRedirectsChecks, ...tedditTorRedirectsChecks, ...tedditNormalCustomRedirects, ...tedditTorCustomRedirects, ...tedditI2pCustomRedirects, ...tedditI2pCustomRedirects].includes(
|
|
protocolHost
|
|
)
|
|
)
|
|
resolve()
|
|
|
|
if (!test) {
|
|
let checkedInstances = []
|
|
if (protocol == "loki") checkedInstances = [...tedditLokiCustomRedirects]
|
|
else if (protocol == "i2p") checkedInstances = [...tedditI2pCustomRedirects]
|
|
else if (protocol == "tor") checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
|
|
if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
|
|
checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
|
|
}
|
|
await utils.copyCookie("teddit", from, checkedInstances, "collapse_child_comments")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "domain_instagram")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "domain_twitter")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "domain_youtube")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "flairs")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "highlight_controversial")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "nsfw_enabled")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "post_media_max_height")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "show_upvoted_percentage")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "show_upvotes")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "theme")
|
|
await utils.copyCookie("teddit", from, checkedInstances, "videos_muted")
|
|
}
|
|
resolve(true)
|
|
})
|
|
}
|
|
|
|
function pasteTedditCookies() {
|
|
return new Promise(async resolve => {
|
|
await init()
|
|
if (disableReddit || redditFrontend != "teddit" || protocol === undefined) {
|
|
resolve()
|
|
return
|
|
}
|
|
let checkedInstances = []
|
|
if (protocol == "loki") checkedInstances = [...tedditLokiCustomRedirects]
|
|
else if (protocol == "i2p") checkedInstances = [...tedditI2pCustomRedirects]
|
|
else if (protocol == "tor") checkedInstances = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
|
|
if ((checkedInstances.length === 0 && protocolFallback) || protocol == "normal") {
|
|
checkedInstances = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
|
|
}
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "collapse_child_comments")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "domain_instagram")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "domain_twitter")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "domain_youtube")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "flairs")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "highlight_controversial")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "nsfw_enabled")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "post_media_max_height")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "show_upvoted_percentage")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "show_upvotes")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "theme")
|
|
utils.getCookiesFromStorage("teddit", checkedInstances, "videos_muted")
|
|
resolve()
|
|
})
|
|
}
|
|
|
|
function all() {
|
|
return [
|
|
...redditRedirects.libreddit.normal,
|
|
...redditRedirects.libreddit.tor,
|
|
...redditRedirects.teddit.normal,
|
|
...redditRedirects.teddit.tor,
|
|
...libredditNormalCustomRedirects,
|
|
...libredditTorCustomRedirects,
|
|
...libredditI2pCustomRedirects,
|
|
...libredditLokiCustomRedirects,
|
|
...tedditNormalCustomRedirects,
|
|
...tedditTorCustomRedirects,
|
|
...tedditI2pCustomRedirects,
|
|
...tedditLokiCustomRedirects,
|
|
]
|
|
}
|
|
|
|
// https://libreddit.exonip.de/vid/1mq8d0ma3yk81/720.mp4
|
|
// https://libreddit.exonip.de/img/4v3t1vgvrzk81.png
|
|
|
|
// https://teddit.net/vids/1mq8d0ma3yk81.mp4
|
|
// https://teddit.net/pics/w:null_4v3t1vgvrzk81.png
|
|
|
|
// redd.it/t5379n
|
|
// https://v.redd.it/z08avb339n801/DASH_1_2_M
|
|
// https://i.redd.it/bfkhs659tzk81.jpg
|
|
function redirect(url, type, initiator, disableOverride) {
|
|
if (disableReddit && !disableOverride) return
|
|
if (!targets.some(rx => rx.test(url.href))) return
|
|
if (initiator && all().includes(initiator.origin)) return "BYPASSTAB"
|
|
if (!["main_frame", "xmlhttprequest", "other", "image", "media"].includes(type)) return
|
|
const bypassPaths = /\/(gallery\/poll\/rpan\/settings\/topics)/
|
|
if (url.pathname.match(bypassPaths)) return
|
|
|
|
let libredditInstancesList = []
|
|
let tedditInstancesList = []
|
|
|
|
if (protocol == "loki") {
|
|
libredditInstancesList = [...libredditLokiCustomRedirects]
|
|
tedditInstancesList = [...tedditLokiCustomRedirects]
|
|
} else if (protocol == "i2p") {
|
|
libredditInstancesList = [...libredditI2pCustomRedirects]
|
|
tedditInstancesList = [...tedditI2pCustomRedirects]
|
|
} else if (protocol == "tor") {
|
|
libredditInstancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
|
|
tedditInstancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
|
|
}
|
|
if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
|
|
libredditInstancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
|
|
tedditInstancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
|
|
}
|
|
|
|
if (url.host === "i.redd.it") {
|
|
if (redditFrontend == "teddit") {
|
|
if (tedditInstancesList.length === 0) return
|
|
let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList)
|
|
return `${tedditRandomInstance}/pics/w:null_${url.pathname.substring(1)}${url.search}`
|
|
}
|
|
if (redditFrontend == "libreddit") {
|
|
if (libredditInstancesList.length === 0) return
|
|
let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList)
|
|
return `${libredditRandomInstance}/img${url.pathname}${url.search}`
|
|
}
|
|
} else if (url.host === "redd.it") {
|
|
if (redditFrontend == "libreddit" && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) {
|
|
if (libredditInstancesList.length === 0) return
|
|
let libredditRandomInstance = utils.getRandomInstance(libredditInstancesList)
|
|
// https://redd.it/foo => https://libredd.it/comments/foo
|
|
return `${libredditRandomInstance}/comments${url.pathname}${url.search}`
|
|
}
|
|
if (redditFrontend == "teddit" && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) {
|
|
if (tedditInstancesList.length === 0) return
|
|
let tedditRandomInstance = utils.getRandomInstance(tedditInstancesList)
|
|
// https://redd.it/foo => https://teddit.net/comments/foo
|
|
return `${tedditRandomInstance}/comments${url.pathname}${url.search}`
|
|
}
|
|
} else if (url.host === "preview.redd.it") {
|
|
if (redditFrontend == "teddit") return
|
|
if (redditFrontend == "libreddit") {
|
|
if (libredditInstancesList.length === 0) return
|
|
const libredditRandomInstance = utils.getRandomInstance(libredditInstancesList)
|
|
return `${libredditRandomInstance}/preview/pre${url.pathname}${url.search}`
|
|
}
|
|
}
|
|
|
|
let randomInstance
|
|
if (redditFrontend == "libreddit") {
|
|
if (libredditInstancesList.length === 0) return
|
|
randomInstance = utils.getRandomInstance(libredditInstancesList)
|
|
}
|
|
if (redditFrontend == "teddit") {
|
|
if (tedditInstancesList.length === 0) return
|
|
randomInstance = utils.getRandomInstance(tedditInstancesList)
|
|
}
|
|
return `${randomInstance}${url.pathname}${url.search}`
|
|
}
|
|
|
|
function switchInstance(url, disableOverride) {
|
|
return new Promise(async resolve => {
|
|
await init()
|
|
if (disableReddit && !disableOverride) {
|
|
resolve()
|
|
return
|
|
}
|
|
const protocolHost = utils.protocolHost(url)
|
|
if (!all().includes(protocolHost)) {
|
|
resolve()
|
|
return
|
|
}
|
|
let instancesList = []
|
|
if (redditFrontend == "libreddit") {
|
|
if (protocol == "loki") instancesList = [...libredditLokiCustomRedirects]
|
|
else if (protocol == "i2p") instancesList = [...libredditI2pCustomRedirects]
|
|
else if (protocol == "tor") instancesList = [...libredditTorRedirectsChecks, ...libredditTorCustomRedirects]
|
|
if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
|
|
instancesList = [...libredditNormalRedirectsChecks, ...libredditNormalCustomRedirects]
|
|
}
|
|
if ([...redditRedirects.teddit.normal, ...redditRedirects.teddit.tor].includes(protocolHost)) url.pathname = url.pathname.replace("/pics/w:null_", "/img/")
|
|
} else if (redditFrontend == "teddit") {
|
|
if (protocol == "loki") instancesList = [...tedditLokiCustomRedirects]
|
|
else if (protocol == "i2p") instancesList = [...tedditI2pCustomRedirects]
|
|
else if (protocol == "tor") instancesList = [...tedditTorRedirectsChecks, ...tedditTorCustomRedirects]
|
|
if ((instancesList.length === 0 && protocolFallback) || protocol == "normal") {
|
|
instancesList = [...tedditNormalRedirectsChecks, ...tedditNormalCustomRedirects]
|
|
}
|
|
if ([...redditRedirects.libreddit.normal, ...redditRedirects.libreddit.tor].includes(protocolHost)) url.pathname = url.pathname.replace("/img/", "/pics/w:null_")
|
|
}
|
|
|
|
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(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 => {
|
|
libredditNormalRedirectsChecks = [...redirects.libreddit.normal]
|
|
tedditNormalRedirectsChecks = [...redirects.teddit.normal]
|
|
for (const instance of r.cloudflareBlackList) {
|
|
let i
|
|
|
|
i = libredditNormalRedirectsChecks.indexOf(instance)
|
|
if (i > -1) libredditNormalRedirectsChecks.splice(i, 1)
|
|
|
|
i = tedditNormalRedirectsChecks.indexOf(instance)
|
|
if (i > -1) tedditNormalRedirectsChecks.splice(i, 1)
|
|
}
|
|
browser.storage.local.set(
|
|
{
|
|
disableReddit: false,
|
|
redditFrontend: "libreddit",
|
|
redditRedirects: redirects,
|
|
|
|
libredditNormalRedirectsChecks: libredditNormalRedirectsChecks,
|
|
libredditNormalCustomRedirects: [],
|
|
|
|
libredditTorRedirectsChecks: [...redirects.libreddit.tor],
|
|
libredditTorCustomRedirects: [],
|
|
|
|
libredditI2pRedirectsChecks: [...redirects.libreddit.i2p],
|
|
libredditI2pCustomRedirects: [],
|
|
|
|
libredditLokiRedirectsChecks: [...redirects.libreddit.loki],
|
|
libredditLokiCustomRedirects: [],
|
|
|
|
tedditNormalRedirectsChecks: tedditNormalRedirectsChecks,
|
|
tedditNormalCustomRedirects: [],
|
|
|
|
tedditTorRedirectsChecks: [...redirects.teddit.tor],
|
|
tedditTorCustomRedirects: [],
|
|
|
|
tedditI2pRedirectsChecks: [...redirects.teddit.i2p],
|
|
tedditI2pCustomRedirects: [],
|
|
|
|
tedditLokiRedirectsChecks: [...redirects.teddit.loki],
|
|
tedditLokiCustomRedirects: [],
|
|
},
|
|
() => resolve()
|
|
)
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
export default {
|
|
setRedirects,
|
|
initLibredditCookies,
|
|
pasteLibredditCookies,
|
|
initTedditCookies,
|
|
pasteTedditCookies,
|
|
|
|
redirect,
|
|
initDefaults,
|
|
switchInstance,
|
|
}
|