youtube: periodically refresh innertube player
Some checks are pending
Run tests / check lockfile correctness (push) Waiting to run
Run tests / web sanity check (push) Waiting to run
Run tests / api sanity check (push) Waiting to run
Run tests / test service functionality (push) Waiting to run
Run tests / test service: ${{ matrix.service }} (push) Blocked by required conditions

This commit is contained in:
dumbmoron 2024-08-02 16:37:23 +00:00
parent 7f12f4c2d3
commit 05ba1f09b6
No known key found for this signature in database

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;
(input, init) => fetch(input, { try {
...init, yt = await cloneInnertube(
dispatcher: o.dispatcher (input, init) => fetch(input, {
}) ...init,
); 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;