mirror of
https://github.com/imputnet/cobalt.git
synced 2025-06-28 09:28:29 +00:00

if provided, cobalt will pull poToken & visitor_data from an instance of invidious' youtube-trusted-session-generator or its counterpart
75 lines
2.1 KiB
JavaScript
75 lines
2.1 KiB
JavaScript
import * as cluster from "../../misc/cluster.js";
|
|
|
|
import { env } from "../../config.js";
|
|
import { Green, Yellow } from "../../misc/console-text.js";
|
|
|
|
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).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);
|
|
}
|
|
});
|
|
}
|
|
}
|