315 lines
8.5 KiB
JavaScript
315 lines
8.5 KiB
JavaScript
import { d as dt } from "./parse_token.util-ed270559.js";
|
|
import { n } from "./router.interface-6cdbc015.js";
|
|
import { e } from "./fetch_youtube-cfbafc47.js";
|
|
import { s as s$1, m } from "./storage-a8ac7bd3.js";
|
|
|
|
class s extends Error {
|
|
constructor(t, e) {
|
|
super(e), (this.code = t), (this.message = e);
|
|
}
|
|
}
|
|
const r = (t, e = {}, n) => ({
|
|
body: e,
|
|
meta: {
|
|
isSuccess: !1,
|
|
code: t,
|
|
nonce: n,
|
|
},
|
|
});
|
|
let i;
|
|
const c = (t) =>
|
|
s$1.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);
|
|
},
|
|
token: async () => await m.auth.get("token"),
|
|
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 n = await c(t.href),
|
|
a = await fetch("https://v2.mogultv.org/auth/youtube", {
|
|
method: "POST",
|
|
body: JSON.stringify(
|
|
Object.assign(Object.assign({}, t), {
|
|
cookies: n,
|
|
})
|
|
),
|
|
});
|
|
if (200 !== a.status) return null;
|
|
const { jwt: o } = await a.json();
|
|
return await m.auth.set("token", o), o;
|
|
},
|
|
link: async (t) => {
|
|
const n = await m.auth.get("token"),
|
|
o = await fetch(`https://v2.mogultv.org/link/${t}`, {
|
|
method: "GET",
|
|
headers: {
|
|
Authorization: `Bearer ${n}`,
|
|
},
|
|
});
|
|
if (200 !== o.status) return;
|
|
const s = await o.text();
|
|
await chrome.cookies.set({
|
|
url: "https://v2.mogultv.org",
|
|
name: "Authorization",
|
|
value: n,
|
|
httpOnly: !0,
|
|
path: `/link/${t}/callback`,
|
|
expirationDate: Math.floor(Date.now() / 1e3) + 3600,
|
|
}),
|
|
await chrome.windows.create({
|
|
url: s,
|
|
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 a, o;
|
|
(null === (a = e.sender.tab) || void 0 === a ? void 0 : a.id) &&
|
|
s$1.tabs.remove(
|
|
null === (o = e.sender.tab) || void 0 === o ? void 0 : o.id
|
|
),
|
|
null == i || i(t);
|
|
},
|
|
"disconnect-link": async (t) => {
|
|
const n = await m.auth.get("token"),
|
|
o = await fetch(`https://v2.mogultv.org/link/${t}`, {
|
|
method: "DELETE",
|
|
headers: {
|
|
Authorization: `Bearer ${n}`,
|
|
},
|
|
});
|
|
if (200 !== o.status) return;
|
|
const { jwt: s } = await o.json();
|
|
return await m.auth.set("token", s), dt(s);
|
|
},
|
|
};
|
|
const l = (t) => async () => {
|
|
var n, a;
|
|
const o = await m.cache.get(t);
|
|
let s;
|
|
if (o && o.expiresAt > Date.now()) s = o.value;
|
|
else {
|
|
const o = await fetch("https://v2.mogultv.org" + t),
|
|
r = Number(o.headers.get("age")),
|
|
i =
|
|
Number(
|
|
(null ===
|
|
(a =
|
|
null === (n = o.headers.get("cache-control")) || void 0 === n
|
|
? void 0
|
|
: n.match(/max-age=(\d+)/)) || void 0 === a
|
|
? void 0
|
|
: a[1]) || 300
|
|
) - r,
|
|
c = Date.now() + 1e3 * i;
|
|
(s = await o.json()),
|
|
await m.cache.set(t, {
|
|
expiresAt: c,
|
|
value: s,
|
|
});
|
|
}
|
|
return s;
|
|
};
|
|
async function d(t, e) {
|
|
const n = {
|
|
sourceType: t,
|
|
sourceId: e,
|
|
};
|
|
try {
|
|
const t = await (async function (t, e, n, { throwIfErrors: a } = {}) {
|
|
var o;
|
|
const s = await fetch(t, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({
|
|
query: e,
|
|
variables: n,
|
|
}),
|
|
}),
|
|
r = await s.json();
|
|
if (a && (null === (o = r.data) || void 0 === o ? void 0 : o.errors))
|
|
throw new Error(`spore graphql error ${r.data.errors}`);
|
|
return r.data;
|
|
})(
|
|
"https://zygote.spore.build/graphql",
|
|
"query GetExtensionMappingConnection($sourceType: String, $sourceId: String) {\n\textensionMappingConnection(sourceType: $sourceType, sourceId: $sourceId) {\n\t\tnodes {\n\t\t\tid\n\t\t\tslug\n\t\t\tiframeUrl\n\t\t\tdomAction\n\t\t\tquerySelector\n\t\t\tiframeQuerySelector\n\t\t}\n\t}\n}",
|
|
n
|
|
);
|
|
return t.extensionMappingConnection.nodes;
|
|
} catch (t) {
|
|
console.error(t);
|
|
}
|
|
}
|
|
const h = {
|
|
youtube: {
|
|
"get-stream": async () => {
|
|
const t = await m.cache.get("get-stream");
|
|
let n;
|
|
if (t && t.expiresAt > Date.now()) n = t.value;
|
|
else {
|
|
const t = Date.now() + 6e4;
|
|
(n = 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(),
|
|
n =
|
|
/(?:window\s*\[\s*["']ytInitialData["']\s*\]|ytInitialData)\s*=\s*({.+?})\s*;/.exec(
|
|
e
|
|
);
|
|
if (n) {
|
|
const t = JSON.parse(n[1]),
|
|
e = t.currentVideoEndpoint.watchEndpoint.videoId,
|
|
a =
|
|
t.contents.twoColumnWatchNextResults.results.results
|
|
.contents[0].videoPrimaryInfoRenderer,
|
|
o =
|
|
t.contents.twoColumnWatchNextResults.results.results
|
|
.contents[1].videoSecondaryInfoRenderer.owner
|
|
.videoOwnerRenderer.thumbnail.thumbnails[0].url,
|
|
s = a.viewCount.videoViewCountRenderer.viewCount.runs.find(
|
|
(t) => /^[0-9,]+$/.test(t.text)
|
|
).text;
|
|
return {
|
|
title: a.title.runs[0].text,
|
|
viewersCount: parseInt(s.replace(/,/g, "")),
|
|
previewImageURL: `https://i.ytimg.com/vi/${e}/mqdefault.jpg`,
|
|
profileImageURL: o,
|
|
};
|
|
}
|
|
} catch (t) {
|
|
console.warn(t);
|
|
}
|
|
return null;
|
|
})()),
|
|
await m.cache.set("get-stream", {
|
|
expiresAt: t,
|
|
value: n,
|
|
});
|
|
}
|
|
return n;
|
|
},
|
|
"get-user": async (t) => {
|
|
const e$1 = await c(t.href),
|
|
n = await e(
|
|
Object.assign(Object.assign({}, t), {
|
|
cookies: e$1,
|
|
})
|
|
);
|
|
if (!n.success) throw new s(n.code, n.message);
|
|
return n.data;
|
|
},
|
|
},
|
|
gateway: {
|
|
users: l("/gateway/users"),
|
|
emotes: l("/gateway/emotes"),
|
|
badges: l("/gateway/badges"),
|
|
"set-settings": async (t) => {
|
|
const n = await m.auth.get("token"),
|
|
o = await fetch("https://v2.mogultv.org/gateway/settings", {
|
|
method: "PUT",
|
|
headers: {
|
|
Authorization: `Bearer ${n}`,
|
|
},
|
|
body: JSON.stringify(t),
|
|
}),
|
|
{ jwt: s } = await o.json();
|
|
return m.auth.set("token", s), dt(s);
|
|
},
|
|
},
|
|
auth: u,
|
|
extension: {
|
|
popup: () => s$1.action.openPopup(),
|
|
"open-tab": async (t) => {
|
|
await s$1.tabs.create({
|
|
url: t,
|
|
});
|
|
},
|
|
},
|
|
spore: {
|
|
"fetch-extension-mappings": async (t) => await d("youtube", t),
|
|
},
|
|
};
|
|
const w = async (e, n$1) => {
|
|
var a;
|
|
const { path: o, body: s } = e;
|
|
if (!o) return;
|
|
e.meta
|
|
? (e.meta.sender = n$1)
|
|
: (e.meta = {
|
|
sender: n$1,
|
|
isPort: !1,
|
|
}),
|
|
e.meta.isPort || (e.meta.isPort = !1);
|
|
const i = (t) => {},
|
|
c = o.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 n$1 = ((e, n$1) => ({
|
|
body: e,
|
|
meta: {
|
|
isSuccess: !0,
|
|
code: n.Success,
|
|
nonce: n$1,
|
|
},
|
|
}))(await l(s, e.meta), e.nonce);
|
|
return i(n$1), n$1;
|
|
} catch (n$1) {
|
|
const o = n$1;
|
|
return r(
|
|
null !== (a = o.code) && void 0 !== a ? a : n.Unknown,
|
|
{
|
|
message: o.message,
|
|
},
|
|
e.nonce
|
|
);
|
|
}
|
|
};
|
|
s$1.runtime.onConnect.addListener((t) => {
|
|
const e = t.sender;
|
|
e &&
|
|
t.onMessage.addListener(async (n) => {
|
|
n.meta = {
|
|
isPort: !0,
|
|
};
|
|
const a = await w(n, e);
|
|
t.postMessage(a);
|
|
});
|
|
}),
|
|
s$1.runtime.onMessage.addListener(w);
|