Spaces:
Paused
Paused
| import * as cluster from "../../misc/cluster.js"; | |
| import { Agent } from "undici"; | |
| import { env } from "../../config.js"; | |
| import { Green, Yellow } from "../../misc/console-text.js"; | |
| const defaultAgent = new Agent(); | |
| let session; | |
| const validateSession = (sessionResponse) => { | |
| if (!sessionResponse.potoken) { | |
| throw "no poToken in session response"; | |
| } | |
| if (!sessionResponse.visitor_data) { | |
| throw "no visitor_data in session response"; | |
| } | |
| if (!sessionResponse.updated) { | |
| throw "no last update timestamp in session response"; | |
| } | |
| // https://github.com/iv-org/youtube-trusted-session-generator/blob/c2dfe3f/potoken_generator/main.py#L25 | |
| if (sessionResponse.potoken.length < 160) { | |
| console.error(`${Yellow('[!]')} poToken is too short and might not work (${new Date().toISOString()})`); | |
| } | |
| } | |
| const updateSession = (newSession) => { | |
| session = newSession; | |
| } | |
| const loadSession = async () => { | |
| const sessionServerUrl = new URL(env.ytSessionServer); | |
| sessionServerUrl.pathname = "/token"; | |
| const newSession = await fetch( | |
| sessionServerUrl, | |
| { dispatcher: defaultAgent } | |
| ).then(a => a.json()); | |
| validateSession(newSession); | |
| if (!session || session.updated < newSession?.updated) { | |
| cluster.broadcast({ youtube_session: newSession }); | |
| updateSession(newSession); | |
| } | |
| } | |
| const wrapLoad = (initial = false) => { | |
| loadSession() | |
| .then(() => { | |
| if (initial) { | |
| console.log(`${Green('[✓]')} poToken & visitor_data loaded successfully!`); | |
| } | |
| }) | |
| .catch((e) => { | |
| console.error(`${Yellow('[!]')} Failed loading poToken & visitor_data at ${new Date().toISOString()}.`); | |
| console.error('Error:', e); | |
| }) | |
| } | |
| export const getYouTubeSession = () => { | |
| return session; | |
| } | |
| export const setup = () => { | |
| if (cluster.isPrimary) { | |
| wrapLoad(true); | |
| if (env.ytSessionReloadInterval > 0) { | |
| setInterval(wrapLoad, env.ytSessionReloadInterval * 1000); | |
| } | |
| } else if (cluster.isWorker) { | |
| process.on('message', (message) => { | |
| if ('youtube_session' in message) { | |
| updateSession(message.youtube_session); | |
| } | |
| }); | |
| } | |
| } | |