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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
class FrontEnd {
constructor({ enable, frontends, frontend, redirect }) {
this.redirects = {}
this.enable = enable
this.frontend = frontend
this.protocol = "normal"
this.protocolFallback = true
fetch("/instances/data.json")
.then(response => response.text())
.then(async data => {
data = JSON.parse(data)
fetch("/instances/blacklist.json")
.then(response => response.text())
.then(async blackList => {
blackList = JSON.parse(blackList)
for (const frontend in frontends) {
this.redirects[frontend] = {}
this.redirects[frontend].cookies = [...frontends[frontend].cookies]
for (const protocol in data[frontend]) {
this.redirects[frontend][protocol] = {}
this.redirects[frontend][protocol].all = [...data[frontend][protocol]]
this.redirects[frontend][protocol].custom = []
this.redirects[frontend][protocol].checked = [...data[frontend][protocol]]
for (const instance of blackList.cloudflare) {
const a = this.redirects[frontend][protocol].checked.indexOf(instance)
if (a > -1) this.redirects[frontend][protocol].checked.splice(a, 1)
}
for (const instance of blackList.offline) {
const a = this.redirects[frontend][protocol].checked.indexOf(instance)
if (a > -1) this.redirects[frontend][protocol].checked.splice(a, 1)
}
}
}
})
})
this.unifyCookies = from =>
new Promise(async resolve => {
await init()
const protocolHost = utils.protocolHost(from)
const list = [...this.redirects[this.frontend][this.protocol]]
if (![...list.checked, ...list.custom].includes(protocolHost)) {
resolve()
return
}
for (const cookie of this.redirects[this.frontend].cookies) {
await utils.copyCookie(frontend, protocolHost, [...list.checked, list.custom], cookie)
}
resolve(true)
})
this.switchInstance = (url, disableOverride) => {
if (!this.enable && !disableOverride) return
const protocolHost = utils.protocolHost(url)
const list = [...this.redirects[this.frontend][this.protocol]]
if (!list.all.includes(protocolHost)) return
let userList = [...list.checked, ...list.custom]
if (userList.length === 0 && this.protocolFallback) userList = [...list.normal.all]
const i = userList.indexOf(protocolHost)
if (i > -1) userList.splice(i, 1)
if (userList.length === 0) return
const randomInstance = utils.getRandomInstance(userList)
return `${randomInstance}${url.pathname}${url.search}`
}
this.redirect = (url, type, initiator, disableOverride) => {
const result = redirect(url, type, initiator, disableOverride)
if (result == "BYPASSTAB") return "BYPASSTAB"
if (result) {
const list = [...this.redirects[this.frontend][this.protocol]]
let userList = [...list.checked, ...list.custom]
const randomInstance = utils.getRandomInstance(userList)
return `${randomInstance}${result.pathname}${result.search}`
}
}
let init = () => new Promise(async resolve => {})
}
}
let Reddit = new FrontEnd({
enable: true,
frontends: {
libreddit: { cookies: ["theme", "front_page", "layout", "wide", "post_sort", "comment_sort", "show_nsfw", "autoplay_videos", "use_hls", "hide_hls_notification", "subscriptions", "filters"] },
teddit: {
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",
],
},
},
frontend: "libreddit",
redirect: (url, type, initiator, disableOverride) => {
if (this.enable && !disableOverride) return
const targets = [/^https?:\/{2}(www\.|old\.|np\.|new\.|amp\.|)reddit\.com/, /^https?:\/{2}(i\.|preview\.)redd\.it/]
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
const protocolHost = utils.protocolHost(url)
if (url.host === "i.redd.it") {
if (this.frontend == "libreddit") return `${protocolHost}/img${url.pathname}${url.search}`
if (this.frontend == "teddit") return `${protocolHost}/pics/w:null_${url.pathname.substring(1)}${url.search}`
} else if (url.host === "redd.it") {
// https://redd.it/foo => https://libredd.it/comments/foo
if (this.frontend == "libreddit" && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) return `${protocolHost}/comments${url.pathname}${url.search}`
// https://redd.it/foo => https://teddit.net/comments/foo
if (this.frontend == "teddit" && !url.pathname.match(/^\/+[^\/]+\/+[^\/]/)) return `${protocolHost}/comments${url.pathname}${url.search}`
} else if (url.host === "preview.redd.it") {
if (this.frontend == "libreddit") return `${protocolHost}/preview/pre${url.pathname}${url.search}`
if (this.frontend == "teddit") return
} else {
return `${url.href}`
}
},
})
export default {}
|