//! 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 -- ...` //! 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 = std::env::args().skip(1).collect(); let video_ids: Vec = 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::() ); 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(()) }