Files
leadcast/backend/examples/test_transcripts_batch.rs
2026-07-28 20:23:41 -03:00

90 lines
2.6 KiB
Rust

//! Testa a coleta de legenda contra vários vídeos reais do YouTube em
//! sequência e imprime um resumo de sucesso/falha. Útil para validar
//! mudanças no módulo de transcrição sem depender do pipeline completo.
//!
//! Uso: `cargo run --example test_transcripts_batch -- <video_id> <video_id> ...`
//! Sem argumentos, usa uma lista padrão de vídeos do Flow Podcast.
use backend::browser::{BrowserModule, BrowserModuleConfig};
use backend::proxy::ProxyConfig;
use backend::transcript::{TranscriptConfig, YoutubeTranscriptProvider};
use backend::usage::DataUsageTracker;
const DEFAULT_VIDEO_IDS: &[&str] = &[
"dX-GKHAo8HU",
"kyT66IJMkEM",
"VZ4eLosJFrI",
"Vx53BX4kjqk",
"9S3KxNnE4WM",
"eoBS45Tufgw",
"fkVlpbDmpEU",
];
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let _ = dotenvy::dotenv();
backend::logs::init();
let request_id = "batch-test";
let args: Vec<String> = std::env::args().skip(1).collect();
let video_ids: Vec<String> = if args.is_empty() {
DEFAULT_VIDEO_IDS.iter().map(|s| s.to_string()).collect()
} else {
args
};
let proxy = ProxyConfig::from_env(request_id)?;
let usage = DataUsageTracker::new();
let browser = BrowserModule::new(
proxy,
BrowserModuleConfig {
no_sandbox: true,
navigation_timeout_secs: 75,
min_navigation_delay_ms: 500,
max_navigation_delay_ms: 1_500,
..Default::default()
},
usage,
)?;
let provider = YoutubeTranscriptProvider::new(
browser,
TranscriptConfig {
max_attempts: 3,
timeout_secs: 90,
max_concurrency: 1,
..Default::default()
},
)?;
let mut ok = 0usize;
let mut failed = Vec::new();
for video_id in &video_ids {
println!("--- {video_id} ---");
match provider.fetch_transcript(request_id, video_id).await {
Ok(t) => {
println!(
"OK language={} generated={} chars={} preview={:?}",
t.language_code,
t.is_generated,
t.text.len(),
t.text.chars().take(100).collect::<String>()
);
ok += 1;
}
Err(e) => {
println!("ERRO: {e}");
failed.push(video_id.clone());
}
}
}
println!("\n=== Resumo: {ok}/{} com sucesso ===", video_ids.len());
if !failed.is_empty() {
println!("Falharam: {failed:?}");
std::process::exit(1);
}
Ok(())
}