427 lines
18 KiB
JavaScript
427 lines
18 KiB
JavaScript
import {
|
|
e
|
|
} from '../../index-6137f488.js';
|
|
import {
|
|
e as e$2
|
|
} from '../../background.injected-af36b849.js';
|
|
import {
|
|
n,
|
|
e as e$4
|
|
} from '../../get_stream_details-b6177000.js';
|
|
import {
|
|
d as dt,
|
|
t
|
|
} from '../../parse_token.util-ed270559.js';
|
|
import {
|
|
e as e$3
|
|
} from '../../fetch_youtube-71c76849.js';
|
|
import {
|
|
s
|
|
} from '../../router.interface-6cdbc015.js';
|
|
import {
|
|
e as e$1
|
|
} from '../../style-inject.es-a0e1a0ba.js';
|
|
|
|
function u(t) {
|
|
if (!t) return 0;
|
|
t = t.toLowerCase();
|
|
const e = /\((.+)\)/.exec(t);
|
|
if (!e) return 1;
|
|
const n = e[1].split(/\s/),
|
|
i = parseInt(n[0]);
|
|
return isNaN(i) ? 0 : n[1].startsWith("year") ? 12 * parseInt(n[0]) : parseInt(n[0])
|
|
}
|
|
|
|
function d(t, e) {
|
|
const n = e;
|
|
for (let e = 0; e < n.length; e++)
|
|
if (n[e][0] > t) return n[e - 1][1];
|
|
return n[n.length - 1][1]
|
|
}
|
|
|
|
function l(t, e, n, i) {
|
|
const a = e(t.authorExternalChannelId);
|
|
! function(t, e) {
|
|
(null == e ? void 0 : e.a) && (t.authorName = {
|
|
simpleText: e.a
|
|
});
|
|
}(t, a),
|
|
function(t, e) {
|
|
var n, i;
|
|
t.authorBadges || (t.authorBadges = []);
|
|
for (const a of t.authorBadges) {
|
|
const t = a.liveChatAuthorBadgeRenderer;
|
|
(null === (n = t.icon) || void 0 === n ? void 0 : n.iconType) ? t._mtvType = null === (i = t.icon) || void 0 === i ? void 0 : i.iconType.toLowerCase(): t.customThumbnail && (t._mtvType = "member"), "moderator" === t._mtvType && (delete t.icon, t._mtvType = "moderator", t.customThumbnail = {
|
|
thumbnails: [{
|
|
url: e,
|
|
width: 18,
|
|
height: 18
|
|
}]
|
|
});
|
|
}
|
|
}(t, i),
|
|
function(t, e, n) {
|
|
if ((null == n ? void 0 : n.b) && !(n.b <= 0))
|
|
for (const i of t.authorBadges) {
|
|
const t = i.liveChatAuthorBadgeRenderer;
|
|
if ("member" !== t._mtvType) continue;
|
|
const a = u(t.tooltip);
|
|
if (0 === a) continue;
|
|
const o = a + n.b,
|
|
r = `Member (${o} months)`,
|
|
s = d(o, e);
|
|
t.customThumbnail = s, delete t.icon, t.tooltip = r, t.accessibility.accessibilityData.label = r;
|
|
}
|
|
}(t, n, a);
|
|
}
|
|
const h = /[\s.,?!]/;
|
|
|
|
function f(t) {
|
|
const e = [];
|
|
let n = 0;
|
|
for (let i = 0; i < t.length - 1; i++) h.test(t[i]) !== h.test(t[i + 1]) && (e.push(t.substring(n, i + 1)), n = i + 1);
|
|
return e.push(t.substring(n)), e
|
|
}
|
|
|
|
function m(t$1) {
|
|
let e;
|
|
if (t$1.provider === t.Twitch) e = `https://static-cdn.jtvnw.net/emoticons/v2/${t$1.id}/static/dark/1.0`;
|
|
else if (t$1.provider === t.FFZ) e = `https://cdn.frankerfacez.com/emote/${t$1.id}/1`;
|
|
else {
|
|
if (t$1.provider !== t.BTTV) return;
|
|
e = `https://cdn.betterttv.net/emote/${t$1.id}/1x`;
|
|
}
|
|
return {
|
|
emojiId: "mogultv-" + t$1.name + "-" + t$1.id,
|
|
image: {
|
|
thumbnails: [{
|
|
url: e
|
|
}],
|
|
accessibility: {
|
|
accessibilityData: {
|
|
label: t$1.name
|
|
}
|
|
}
|
|
},
|
|
isCustomEmoji: !0,
|
|
searchTerms: [t$1.name],
|
|
shortcuts: [":" + t$1.name + ":", t$1.name]
|
|
}
|
|
}
|
|
const g = ["#ff0000", "#009000", "#b22222", "#ff7f50", "#9acd32", "#ff4500", "#2e8b57", "#daa520", "#d2691e", "#5f9ea0", "#1e90ff", "#ff69b4", "#00ff7f", "#a244f9"];
|
|
/*!
|
|
* cookie
|
|
* Copyright(c) 2012-2014 Roman Shtylman
|
|
* Copyright(c) 2015 Douglas Christopher Wilson
|
|
* MIT Licensed
|
|
*/
|
|
var v = function(t, e) {
|
|
if ("string" != typeof t) throw new TypeError("argument str must be a string");
|
|
for (var n = {}, i = e || {}, a = t.split(p), o = i.decode || y, r = 0; r < a.length; r++) {
|
|
var s = a[r],
|
|
c = s.indexOf("=");
|
|
if (!(c < 0)) {
|
|
var u = s.substr(0, c).trim(),
|
|
d = s.substr(++c, s.length).trim();
|
|
'"' == d[0] && (d = d.slice(1, -1)), null == n[u] && (n[u] = w(d, o));
|
|
}
|
|
}
|
|
return n
|
|
},
|
|
y = decodeURIComponent,
|
|
p = /; */;
|
|
|
|
function w(t, e) {
|
|
try {
|
|
return e(t)
|
|
} catch (e) {
|
|
return t
|
|
}
|
|
}
|
|
var b;
|
|
class A {
|
|
constructor(t) {
|
|
this.gatewayService = t;
|
|
}
|
|
addAliasesToMessage(t) {
|
|
l(t, (t => this.gatewayService.getUserInfo(t)), this.gatewayService.badgeList, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAABg2lDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AcxV/TiiIVBzuIOGRonSyIijpqFYpQIdQKrTqYXPoFTRqSFBdHwbXg4Mdi1cHFWVcHV0EQ/ABxc3NSdJES/5cUWsR4cNyPd/ced+8AoVFhmhUaAzTdNtPJhJjNrYrdrwgjBGAaMZlZxpwkpeA7vu4R4OtdnGf5n/tz9Kl5iwEBkXiWGaZNvEE8tWkbnPeJI6wkq8TnxKMmXZD4keuKx2+ciy4LPDNiZtLzxBFisdjBSgezkqkRTxJHVU2nfCHrscp5i7NWqbHWPfkLw3l9ZZnrNIeRxCKWIEGEghrKqMBGnFadFAtp2k/4+Idcv0QuhVxlMHIsoAoNsusH/4Pf3VqFiXEvKZwAul4c5yMGdO8CzbrjfB87TvMECD4DV3rbX20AM5+k19ta9Ajo3wYurtuasgdc7gCDT4Zsyq4UpCkUCsD7GX1TDhi4BXrXvN5a+zh9ADLUVeoGODgERoqUve7z7p7O3v490+rvB3pIcqqJKL5aAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAB3RJTUUH5QwEARQDdqq2HwAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAAAGkSURBVDjLpdSxS5tBGMfx7+V9JamLGbSQNNAQdBBJhZKWLPkHxKmQEgd9xUFwCRQKHe1cKHSztCCmLyQlkriULu2kSyBQkCCCg0bQCJrhTSUxoW+8DuLRNPqq8aa7hx8f7nk4TpDXDCQfAC+9rTKCt4KctgcEnZKJ/pcYoRmG+oewz21Wdlb4+PvzvxFLvwlJD5vEx+Lomg5A6ahE/nTt/5hXd0Le+98x9WRKnUtHJSYKkxzLalfW5djSaKILOZCHqvZQDLIwMO8MPdOf4h/wq3Or3epAAuIRP6M/MEYMZyjY1zm6SCBC8XlBId+j3wj7wuiui+lcO6PVszxNu4lH93RiFHBrbsK+MAAnjRNnKBVaxq25u+qRQETt7bZNavfL9a2lQstMj08jhHB8idmtLF8b2atvdBUipaTVbqk2K7UKme0MrytvVEa/DWJumhi7c8QfvKD8p0zR/tV1O0FOk7dBblougE+Pl+6FKGijukGtWesZUZBZT5NcT2KdWT0hl8O2AK9ZT8M6xAZjzO8v3PFLkmVBTpsFuQgi2Nu/Ji3QXv0FPBynaffELJkAAAAASUVORK5CYII=");
|
|
}
|
|
}
|
|
class T {
|
|
constructor(t) {
|
|
this.gatewayService = t;
|
|
}
|
|
addTwitchEmotesToMessage(t) {
|
|
return function(t, e) {
|
|
const n = [];
|
|
for (const i of t.runs)
|
|
if ("string" == typeof i.text) {
|
|
const {
|
|
text: t
|
|
} = i;
|
|
let a = 0,
|
|
o = 0;
|
|
const r = f(t);
|
|
let s = !1;
|
|
for (const i of r) {
|
|
const r = e("🌝" === i ? "Kappa" : i);
|
|
r && (s = !0, a > 0 && n.push({
|
|
text: t.substring(o, a)
|
|
}), n.push({
|
|
emoji: r
|
|
}), o = a + i.length), a += i.length;
|
|
}
|
|
s ? n.push({
|
|
text: t.substring(o, a)
|
|
}) : n.push(i);
|
|
} else if ("🌝" === i.emoji.emojiId) {
|
|
const t = e("Kappa");
|
|
t && n.push({
|
|
emoji: t
|
|
});
|
|
} else n.push(i);
|
|
return t.runs = n, t
|
|
}(t, (t => this.gatewayService.getEmote(t)))
|
|
}
|
|
}
|
|
class x extends e.exports.EventEmitter {
|
|
constructor(t) {
|
|
super(), this.backgroundService = t, this.badgeList = [], this.emoteCache = new Map, t.getLiveStorageValue("auth.token", dt).then((t => this.myUserInfo = t)), this.fetchUserInfo(), this.fetchEmotes(), this.fetchBadges(), setInterval((() => {
|
|
this.fetchUserInfo(), this.fetchEmotes(), this.fetchBadges();
|
|
}), 3e5);
|
|
}
|
|
async fetchBadges() {
|
|
const t = await this.backgroundService.fetch("/gateway/badges");
|
|
if (!s(t)) return;
|
|
const e = t.body.sort(((t, e) => t.months - e.months));
|
|
this.badgeList = e.map((t => [t.months, {
|
|
thumbnails: [{
|
|
url: t.url,
|
|
width: 16,
|
|
height: 16
|
|
}]
|
|
}])), this.emit("badges", this.badgeList);
|
|
}
|
|
async fetchEmotes() {
|
|
const t = await this.backgroundService.fetch("/gateway/emotes");
|
|
if (s(t)) {
|
|
this.emoteCache.clear();
|
|
for (const e of t.body) {
|
|
const t = m(e);
|
|
t && this.emoteCache.set(e.name, t);
|
|
}
|
|
this.emit("emotes", this.emoteCache);
|
|
}
|
|
}
|
|
async fetchUserInfo() {
|
|
const t = await this.backgroundService.fetch("/gateway/users");
|
|
s(t) && (this.infoCache = new Map(t.body), this.emit("users", this.infoCache));
|
|
}
|
|
getSerializedMetadata(t) {
|
|
const e = t.links.find((e => e.prv === t.prv)),
|
|
n = {
|
|
a: null == e ? void 0 : e.name,
|
|
b: t.meta.sub,
|
|
c: t.meta.col
|
|
};
|
|
return Object.values(n).filter((t => void 0 !== t)).length > 0 ? n : void 0
|
|
}
|
|
getUserInfo(t) {
|
|
var e, n, i;
|
|
if ((null === (n = null === (e = this.myUserInfo) || void 0 === e ? void 0 : e.value) || void 0 === n ? void 0 : n.sub) === t) {
|
|
const t = this.getSerializedMetadata(this.myUserInfo.value);
|
|
if (t) return t
|
|
}
|
|
return null === (i = this.infoCache) || void 0 === i ? void 0 : i.get(t)
|
|
}
|
|
getEmote(t) {
|
|
var e;
|
|
return null === (e = this.emoteCache) || void 0 === e ? void 0 : e.get(t)
|
|
}
|
|
}
|
|
async function I(t, n) {
|
|
await customElements.whenDefined(t);
|
|
const i = customElements.get(t);
|
|
if (!i) return void console.warn(`Polymer: ${t} not found`);
|
|
const a = i.prototype[n.functionName];
|
|
i.prototype[n.functionName] = function(...t) {
|
|
if (n.ludwigOnly && !e$4()) return a.apply(this, t);
|
|
if (n.type === b.OverrideFunction) try {
|
|
return n.function.apply(this, t)
|
|
} catch (t) {
|
|
console.error(JSON.stringify(n)), console.error(t);
|
|
}
|
|
if (n.type === b.RunBefore) try {
|
|
n.function.apply(this, t);
|
|
} catch (t) {
|
|
console.error(t);
|
|
}
|
|
let i = a.apply(this, t);
|
|
if (n.type === b.RunAfter) try {
|
|
i = n.function.apply(this, [i]);
|
|
} catch (t) {
|
|
console.error(t);
|
|
}
|
|
return i
|
|
};
|
|
}! function(t) {
|
|
t[t.OverrideFunction = 0] = "OverrideFunction", t[t.RunBefore = 1] = "RunBefore", t[t.RunAfter = 2] = "RunAfter";
|
|
}(b || (b = {}));
|
|
const B = (t, e, {
|
|
LudwigOnly: n
|
|
}) => ({
|
|
functionName: t,
|
|
function: e,
|
|
ludwigOnly: n || !1,
|
|
type: b.OverrideFunction
|
|
}),
|
|
E = (t, e, {
|
|
LudwigOnly: n
|
|
}) => ({
|
|
functionName: t,
|
|
function: e,
|
|
ludwigOnly: n || !1,
|
|
type: b.RunBefore
|
|
});
|
|
|
|
function C(t, n, i) {
|
|
I("yt-live-chat-item-list-renderer", E("handleAddChatItemAction_", (function(e) {
|
|
e.item.liveChatTextMessageRenderer && (t.addTwitchEmotesToMessage(e.item.liveChatTextMessageRenderer.message), n.addAliasesToMessage(e.item.liveChatTextMessageRenderer));
|
|
}), {
|
|
LudwigOnly: true
|
|
})), I("yt-live-chat-text-input-field-renderer", ((t, e, {
|
|
LudwigOnly: n
|
|
}) => ({
|
|
functionName: t,
|
|
function: e,
|
|
ludwigOnly: n || !1,
|
|
type: b.RunAfter
|
|
}))("calculateLiveChatRichMessageInput_", (function(t) {
|
|
var e;
|
|
if (!(null == t ? void 0 : t.textSegments)) return t;
|
|
for (const n of t.textSegments)
|
|
if (null === (e = n.emojiId) || void 0 === e ? void 0 : e.startsWith("mogultv")) {
|
|
const [, t] = n.emojiId.split("-");
|
|
delete n.emojiId, n.text = t;
|
|
} return t
|
|
}), {
|
|
LudwigOnly: true
|
|
})), i.on("emotes", (t => {
|
|
if (!e$4()) return;
|
|
const n = document.querySelector("yt-live-chat-item-list-renderer");
|
|
if (null == n ? void 0 : n.emojiManager) {
|
|
if (n.emojiManager._mogulTvLoaded) return;
|
|
n.emojiManager._mogulTvLoaded = !0, n.emojiManager.load([...t.values()]);
|
|
} else console.warn("Cannot find chat list");
|
|
}));
|
|
}
|
|
|
|
function S(t) {
|
|
return t ? t._mtvType ? t._mtvType : t.icon ? t.icon.iconType.toLowerCase() : t.customThumbnail ? "member" : "" : ""
|
|
}
|
|
async function M(t) {
|
|
I("yt-live-chat-author-badge-renderer", B("computeType_", (t => S(t.liveChatAuthorBadgeRenderer)), {
|
|
LudwigOnly: true
|
|
})), I("yt-live-chat-author-chip", B("computeAuthorType_", (function(e) {
|
|
var n, i;
|
|
const a = this.$["author-name"];
|
|
if (a) {
|
|
let e;
|
|
const o = null === (n = this.parentElement) || void 0 === n ? void 0 : n.parentElement,
|
|
r = null === (i = null == o ? void 0 : o.data) || void 0 === i ? void 0 : i.authorExternalChannelId;
|
|
if (r) {
|
|
const n = t.getUserInfo(r);
|
|
(null == n ? void 0 : n.c) && (e = n.c);
|
|
}
|
|
e || (e = function(t) {
|
|
const e = function(t) {
|
|
let e = 0;
|
|
if (0 === t.length) return 0;
|
|
for (let n = 0; n < t.length; n++) e = (e << 5) - e + t.charCodeAt(n), e |= 0;
|
|
return e
|
|
}(t);
|
|
return g[(e % g.length + g.length) % g.length]
|
|
}(this.authorName.simpleText)), a.style.color = e;
|
|
}
|
|
return function(t) {
|
|
if (!t) return "";
|
|
for (const e of t) {
|
|
if (!e.liveChatAuthorBadgeRenderer) continue;
|
|
const t = S(e.liveChatAuthorBadgeRenderer);
|
|
if ("verified" !== t) return t
|
|
}
|
|
return ""
|
|
}(e)
|
|
}), {
|
|
LudwigOnly: true
|
|
}));
|
|
}
|
|
e$1("\n/* Make the masthead transparent unless we are hovering it */\nbody[data-mogul-theater-mode] #masthead-container {\n opacity: 0.1;\n transition: opacity .2s ease;\n}\n\nbody[data-mogul-theater-mode] #masthead-container:hover {\n opacity: 1;\n}\n\n\n@media screen and (min-width: 1014px) {\n /* Make chat fill screen vertically */\n body[data-mogul-theater-mode] #chat.ytd-watch-flexy {\n height: calc(100vh - 56px) !important;\n width: var(--ytd-watch-flexy-sidebar-width);\n position: absolute;\n top: 56px;\n right: 0;\n }\n\n body[data-mogul-theater-mode] #player-theater-container.ytd-watch-flexy {\n width: calc(100vw - var(--ytd-watch-flexy-sidebar-width) - var(--ytd-watch-flexy-scrollbar-width)) !important;\n max-width: calc(100vw - var(--ytd-watch-flexy-sidebar-width) - var(--ytd-watch-flexy-scrollbar-width)) !important;\n height: calc(100vh - 56px) !important;\n max-height: calc(100vh - 56px) !important;\n }\n}");
|
|
const R = null !== document.querySelector("yt-live-chat-app"),
|
|
j = new e$2;
|
|
if (R) {
|
|
const t = new x(j),
|
|
e = new T(t),
|
|
n = new A(t);
|
|
L = j, C(e, n, O = t), async function(t) {
|
|
const e = await t.getLiveStorageValue("settings.chatBatching");
|
|
I("yt-timed-continuation", E("dataChanged_", (function() {
|
|
e.value && (this.data.timeoutMs /= 3 * Math.random() + 2);
|
|
}), {
|
|
LudwigOnly: !0
|
|
})), I("yt-live-chat-renderer", E("preprocessActions_", (function(t) {
|
|
const n = Object.getPrototypeOf(this.smoothedQueue_);
|
|
for (const t in n)
|
|
if (t.includes("emitSmoothedMessages")) {
|
|
n[t] = function() {
|
|
if (this.nextUpdateId_ = null, this.messageQueue_.length) {
|
|
let i = 1e4;
|
|
this.estimatedUpdateInterval_ && (i = this.estimatedUpdateInterval_ - Date.now() + this.lastUpdateTime_);
|
|
const a = this.messageQueue_.length < i / 80 ? 1 : Math.ceil(this.messageQueue_.length / (i / 80)),
|
|
o = this.messageQueue_.splice(0, a);
|
|
if (this.callback && this.callback(o[0]), this.messageQueue_.length) {
|
|
let o = 1;
|
|
e.value || (1 === a ? (o = i / this.messageQueue_.length, o *= Math.random() + .5, o = Math.min(1e3, o), o = Math.max(80, o)) : o = 80), this.nextUpdateId_ = window.setTimeout(n[t].bind(this), o);
|
|
}
|
|
}
|
|
};
|
|
break
|
|
} return t
|
|
}), {
|
|
LudwigOnly: !0
|
|
}));
|
|
}(L), M(O);
|
|
} else !async function(t) {
|
|
async function n() {
|
|
const n = document.querySelector("ytd-watch-flexy"),
|
|
i = (null == n ? void 0 : n.hasAttribute("theater")) || !1,
|
|
a = (null == n ? void 0 : n.hasAttribute("fullscreen")) || !1,
|
|
o = await t.getStorage("settings.theaterMode"),
|
|
r = e$4(!1);
|
|
return i && !a && o && r
|
|
}
|
|
let i = await n();
|
|
setInterval((async () => {
|
|
await n() ? (document.body.setAttribute("data-mogul-theater-mode", ""), i || window.dispatchEvent(new Event("resize")), i = !0) : (i = !1, document.body.removeAttribute("data-mogul-theater-mode"));
|
|
}), 250);
|
|
}(j), async function(t) {
|
|
if (!window.ytcfg) return;
|
|
const e = {
|
|
key: window.ytcfg.get("INNERTUBE_API_KEY"),
|
|
authUser: window.ytcfg.get("SESSION_INDEX"),
|
|
pageId: window.ytcfg.get("DELEGATED_SESSION_ID"),
|
|
href: window.location.href,
|
|
context: window.ytcfg.get("INNERTUBE_CONTEXT")
|
|
};
|
|
n = await e$3(Object.assign(Object.assign({}, e), {
|
|
cookies: v(document.cookie)
|
|
})), i = await t.fetch("/auth/@me"), (!n.success || !i.meta.isSuccess || n.data.id !== (null === (a = i.body) || void 0 === a ? void 0 : a.sub)) && await t.fetch("/auth/login", e);
|
|
var n, i, a;
|
|
}(j), setInterval((() => {
|
|
const t = document.querySelector("ytd-live-chat-frame iframe");
|
|
if (t && !t.src.includes("QXZRwEzaeHNfDqtD")) {
|
|
const e = n();
|
|
t.src += `#QXZRwEzaeHNfDqtD=${encodeURIComponent(JSON.stringify(e))}`;
|
|
}
|
|
}), 1e3);
|
|
var L, O; |