Tenho uma máquina um pouco mais antiga em casa mesmo que deixei rodando o script, geralmente utilizo ela com o ubuntu server para pequenos projetos pessoais, para executar 1x por dia tem várias abordagens, você pode agendar via cron ou então deixar o código todo em um loop e e adicionar um sleep de 24 horas. Que foi a abordagem que eu utilizei, inclusive com uma pequena lógica de retry em caso de falhas, não é uma das melhores mas para o meu caso está mais do que suficiente.
Por exemplo:
async function main() {
const allVideosFromChannel = await getAllVideosByChannelUrlAsync('https://www.youtube.com/@canal_escolhido_aqui')
await saveOnlyNewVideos(allVideosFromChannel);
await transcribeVideos();
await postProcessingTranscription();
await publishPosts();
}
while(true) {
// 1 minute -> 60 seconds
// 1 hour -> 3600 seconds
// 1 day -> 86400 seconds
const sleepingTimeInSeconds = 86400;
let tentative = 1;
const initialSleepingTimeToRetry = 60;
const retry = 3;
try {
await main();
console.log('Waiting to check for new videos...');
await new Promise(resolve => setTimeout(resolve, sleepingTimeInSeconds));
tentative = 1;
} catch (error) {
console.log(error);
if (tentative === retry) {
console.log('Max retries reached. Waiting to check for new videos...');
await new Promise(resolve => setTimeout(resolve, sleepingTimeInSeconds));
tentative = 1;
}
const backoffTime = initialSleepingTimeToRetry * (initialSleepingTimeToRetry * (2 ** (retry - 1)));
console.log(`Retrying in ${backoffTime} seconds... (Attempt ${tentative} of ${retry})`);
await new Promise(resolve => setTimeout(resolve, backoffTime * 1000));
tentative++;
}
}