youtube: periodically refresh innertube player

This commit is contained in:
dumbmoron 2024-08-02 16:37:23 +00:00 committed by wukko
parent dd30973601
commit 3fdf266ad0
No known key found for this signature in database
GPG key ID: 3E30B3F26C7B4AA2

View file

@ -6,7 +6,9 @@ import { env } from "../../config.js";
import { cleanString } from "../../sub/utils.js"; import { cleanString } from "../../sub/utils.js";
import { getCookie, updateCookieValues } from "../cookie/manager.js"; import { getCookie, updateCookieValues } from "../cookie/manager.js";
const ytBase = Innertube.create().catch(e => e); const PLAYER_REFRESH_PERIOD = 1000 * 60 * 15; // ms
let innertube, lastRefreshedAt;
const codecMatch = { const codecMatch = {
h264: { h264: {
@ -48,11 +50,12 @@ const transformSessionData = (cookie) => {
} }
const cloneInnertube = async (customFetch) => { const cloneInnertube = async (customFetch) => {
const innertube = await ytBase; const shouldRefreshPlayer = lastRefreshedAt + PLAYER_REFRESH_PERIOD < new Date();
if (innertube instanceof Error) { if (!innertube || shouldRefreshPlayer) {
if (innertube?.message?.endsWith("decipher algorithm")) { innertube = await Innertube.create({
return { error: "ErrorYoutubeDecipher" } fetch: customFetch
} else throw innertube; });
lastRefreshedAt = +new Date();
} }
const session = new Session( const session = new Session(
@ -97,13 +100,19 @@ const cloneInnertube = async (customFetch) => {
} }
export default async function(o) { export default async function(o) {
const yt = await cloneInnertube( let yt;
try {
yt = await cloneInnertube(
(input, init) => fetch(input, { (input, init) => fetch(input, {
...init, ...init,
dispatcher: o.dispatcher dispatcher: o.dispatcher
}) })
); );
if (yt.error) return yt; } catch(e) {
if (e.message?.endsWith("decipher algorithm")) {
return { error: "ErrorYoutubeDecipher" }
} else throw e;
}
const quality = o.quality === "max" ? "9000" : o.quality; const quality = o.quality === "max" ? "9000" : o.quality;