246 lines
8.1 KiB
JavaScript
246 lines
8.1 KiB
JavaScript
import {
|
|
d as dt
|
|
} from './parse_token.util-ed270559.js';
|
|
import {
|
|
e
|
|
} from './fetch_youtube-71c76849.js';
|
|
import {
|
|
n
|
|
} from './router.interface-6cdbc015.js';
|
|
import {
|
|
s,
|
|
m
|
|
} from './storage-a8ac7bd3.js';
|
|
|
|
class o extends Error {
|
|
constructor(t, e) {
|
|
super(e), this.code = t, this.message = e;
|
|
}
|
|
}
|
|
const r = (t, e = {}, a) => ({
|
|
body: e,
|
|
meta: {
|
|
isSuccess: !1,
|
|
code: t,
|
|
nonce: a
|
|
}
|
|
});
|
|
let i;
|
|
const c = t => s.cookies.getAll({
|
|
url: t
|
|
}).then((t => t.filter((t => !t.name.startsWith("ST-"))).map((t => [t.name, t.value])))).then(Object.fromEntries),
|
|
u = {
|
|
"@me": async () => {
|
|
const t = await m.auth.get("token");
|
|
return dt(t)
|
|
},
|
|
logout: async () => {
|
|
const t = await m.auth.get("token");
|
|
await fetch("https://v2.mogultv.org/auth/youtube", {
|
|
method: "DELETE",
|
|
headers: {
|
|
Authorization: `Bearer ${t}`
|
|
}
|
|
}), await m.auth.remove("token");
|
|
},
|
|
login: async t => {
|
|
const a = await c(t.href),
|
|
s = await fetch("https://v2.mogultv.org/auth/youtube", {
|
|
method: "POST",
|
|
body: JSON.stringify(Object.assign(Object.assign({}, t), {
|
|
cookies: a
|
|
}))
|
|
});
|
|
if (200 !== s.status) return null;
|
|
const {
|
|
jwt: n
|
|
} = await s.json();
|
|
return await m.auth.set("token", n), n
|
|
},
|
|
link: async t => {
|
|
const a = await m.auth.get("token"),
|
|
n = await fetch(`https://v2.mogultv.org/link/${t}`, {
|
|
method: "GET",
|
|
headers: {
|
|
Authorization: `Bearer ${a}`
|
|
}
|
|
});
|
|
if (200 !== n.status) return;
|
|
const o = await n.text();
|
|
await chrome.cookies.set({
|
|
url: "https://v2.mogultv.org",
|
|
name: "Authorization",
|
|
value: a,
|
|
httpOnly: !0,
|
|
path: `/link/${t}/callback`,
|
|
expirationDate: Math.floor(Date.now() / 1e3) + 3600
|
|
}), await chrome.windows.create({
|
|
url: o,
|
|
focused: !0,
|
|
type: "popup",
|
|
width: 850,
|
|
height: 800
|
|
});
|
|
const r = await new Promise((t => {
|
|
i = t;
|
|
}));
|
|
return m.auth.set("token", r), dt(r)
|
|
},
|
|
"finish-link": async (t, e) => {
|
|
var s$1, n;
|
|
(null === (s$1 = e.sender.tab) || void 0 === s$1 ? void 0 : s$1.id) && s.tabs.remove(null === (n = e.sender.tab) || void 0 === n ? void 0 : n.id), null == i || i(t);
|
|
},
|
|
"disconnect-link": async t => {
|
|
const a = await m.auth.get("token"),
|
|
n = await fetch(`https://v2.mogultv.org/link/${t}`, {
|
|
method: "DELETE",
|
|
headers: {
|
|
Authorization: `Bearer ${a}`
|
|
}
|
|
});
|
|
if (200 !== n.status) return;
|
|
const {
|
|
jwt: o
|
|
} = await n.json();
|
|
return await m.auth.set("token", o), dt(o)
|
|
}
|
|
};
|
|
const l = t => async () => {
|
|
var a, s;
|
|
const n = await m.cache.get(t);
|
|
let o;
|
|
if (n && n.expiresAt > Date.now()) o = n.value;
|
|
else {
|
|
const n = await fetch("https://v2.mogultv.org" + t),
|
|
r = Number(n.headers.get("age")),
|
|
i = Number((null === (s = null === (a = n.headers.get("cache-control")) || void 0 === a ? void 0 : a.match(/max-age=(\d+)/)) || void 0 === s ? void 0 : s[1]) || 300) - r,
|
|
c = Date.now() + 1e3 * i;
|
|
o = await n.json(), await m.cache.set(t, {
|
|
expiresAt: c,
|
|
value: o
|
|
});
|
|
}
|
|
return o
|
|
}, h = {
|
|
youtube: {
|
|
"get-stream": async () => {
|
|
const t = await m.cache.get("get-stream");
|
|
let a;
|
|
if (t && t.expiresAt > Date.now()) a = t.value;
|
|
else {
|
|
const t = Date.now() + 6e4;
|
|
a = await async function() {
|
|
try {
|
|
const t = await fetch("https://youtube.com/channel/UCrPseYLGpNygVi34QpGNqpA/live");
|
|
if (200 !== t.status) return null;
|
|
const e = await t.text(),
|
|
a = /(?:window\s*\[\s*["']ytInitialData["']\s*\]|ytInitialData)\s*=\s*({.+?})\s*;/.exec(e);
|
|
if (a) {
|
|
const t = JSON.parse(a[1]),
|
|
e = t.currentVideoEndpoint.watchEndpoint.videoId,
|
|
s = t.contents.twoColumnWatchNextResults.results.results.contents[0].videoPrimaryInfoRenderer,
|
|
n = t.contents.twoColumnWatchNextResults.results.results.contents[1].videoSecondaryInfoRenderer.owner.videoOwnerRenderer.thumbnail.thumbnails[0].url,
|
|
o = s.viewCount.videoViewCountRenderer.viewCount.runs.find((t => /^[0-9,]+$/.test(t.text))).text;
|
|
return {
|
|
title: s.title.runs[0].text,
|
|
viewersCount: parseInt(o.replace(/,/g, "")),
|
|
previewImageURL: `https://i.ytimg.com/vi/${e}/mqdefault.jpg`,
|
|
profileImageURL: n
|
|
}
|
|
}
|
|
} catch (t) {
|
|
console.warn(t);
|
|
}
|
|
return null
|
|
}(), await m.cache.set("get-stream", {
|
|
expiresAt: t,
|
|
value: a
|
|
});
|
|
}
|
|
return a
|
|
},
|
|
"get-user": async t => {
|
|
const e$1 = await c(t.href),
|
|
a = await e(Object.assign(Object.assign({}, t), {
|
|
cookies: e$1
|
|
}));
|
|
if (!a.success) throw new o(a.code, a.message);
|
|
return a.data
|
|
}
|
|
},
|
|
gateway: {
|
|
users: l("/gateway/users"),
|
|
emotes: l("/gateway/emotes"),
|
|
badges: l("/gateway/badges"),
|
|
"set-settings": async t => {
|
|
const a = await m.auth.get("token"),
|
|
n = await fetch("https://v2.mogultv.org/gateway/settings", {
|
|
method: "PUT",
|
|
headers: {
|
|
Authorization: `Bearer ${a}`
|
|
},
|
|
body: JSON.stringify(t)
|
|
}),
|
|
{
|
|
jwt: o
|
|
} = await n.json();
|
|
return m.auth.set("token", o), dt(o)
|
|
}
|
|
},
|
|
auth: u,
|
|
extension: {
|
|
popup: () => s.action.openPopup(),
|
|
"open-tab": async t => {
|
|
await s.tabs.create({
|
|
url: t
|
|
});
|
|
}
|
|
}
|
|
}, d = async (e, a) => {
|
|
var s;
|
|
const {
|
|
path: n$1,
|
|
body: o
|
|
} = e;
|
|
if (!n$1) return;
|
|
e.meta ? e.meta.sender = a : e.meta = {
|
|
sender: a,
|
|
isPort: !1
|
|
}, e.meta.isPort || (e.meta.isPort = !1);
|
|
const i = t => {},
|
|
c = n$1.split("/").filter(Boolean),
|
|
u = c[0];
|
|
if (!(u in h)) {
|
|
return r(n.NotFound, void 0, e.nonce)
|
|
}
|
|
const l = h[u][c.slice(1).join("/")];
|
|
if (!l) {
|
|
return r(n.NotFound, void 0, e.nonce)
|
|
}
|
|
try {
|
|
const a = ((e, a) => ({
|
|
body: e,
|
|
meta: {
|
|
isSuccess: !0,
|
|
code: n.Success,
|
|
nonce: a
|
|
}
|
|
}))(await l(o, e.meta), e.nonce);
|
|
return i(a), a
|
|
} catch (a) {
|
|
const n$1 = a;
|
|
return r(null !== (s = n$1.code) && void 0 !== s ? s : n.Unknown, {
|
|
message: n$1.message
|
|
}, e.nonce)
|
|
}
|
|
};
|
|
s.runtime.onConnect.addListener((t => {
|
|
const e = t.sender;
|
|
e && t.onMessage.addListener((async a => {
|
|
a.meta = {
|
|
isPort: !0
|
|
};
|
|
const s = await d(a, e);
|
|
t.postMessage(s);
|
|
}));
|
|
})), s.runtime.onMessage.addListener(d); |