channel_url: "https://www.youtube.com/@Nostal-Vlad/videos" languages: es: any es-419: any en: any prefer_manual: true include_shorts: false include_live: true min_duration_sec: 30 # -------------------------------------------------------------------------- # Ritmo contra YouTube. # # El unico techo publicado que existe es el de la wiki de yt-dlp: una sesion # sin cuenta aguanta ~300 videos/hora (~1000 peticiones/hora) antes del muro # de bot. Google no documenta limites para acceso sin API, asi que ese numero # es la referencia menos mala. Los valores de abajo apuntan deliberadamente # por debajo. # # Cuentas: un video cuesta 3 peticiones a youtube.com # 1. la pagina /watch # 2. la llamada InnerTube /youtubei/v1/player (separada de la anterior por # sleep_subrequests) # 3. /api/timedtext, la transcripcion # (la miniatura va a i.ytimg.com, que es CDN estatico y no cuenta contra esto) # # Esas 3 son irreducibles: se midio si se podia bajar de ahi restringiendo # player_client o saltando la pagina /watch, y no se puede. Con solo # web_safari, o con player_skip=webpage, yt-dlp devuelve CERO pistas de # subtitulos y pierde duration/channel_id/tags. El default de yt-dlp # (android_vr + web_safari, 2 peticiones) ya es el optimo. No re-litigar. # # Medido con estos valores: 12.4 s/video => ~870 peticiones/hora, ~290 # videos/hora. Por debajo del techo, con margen. # # Si vas con prisa y aceptas el riesgo, baja delay.min/max_seconds y # min_request_interval. Si aun asi te topas con el muro, subelos: # min_request_interval es el unico ajuste que aplica a la vez a los jobs y # a los /api/tools/*, que corren fuera del JobManager. # -------------------------------------------------------------------------- delay: min_seconds: 5.0 max_seconds: 10.0 backoff_base: 2.0 # tras un rate-limit: min(2 * 2**n + jitter, cap) backoff_cap: 60.0 throttle_threshold: 3 # 3 rate-limits seguidos y el job para min_request_interval: 2.5 audio_rate_limit: 0 yt_dlp: retries: 10 sleep_subrequests: 3.0 # -> sleep_interval_requests de yt-dlp extractor_retries: 3 socket_timeout: 30.0 sync: incremental: true window: 30 max_window: 300 overlap: 3 database_path: "data/state.db" output_dir: "data/markdown" template_path: "templates/video.md.j2" filename_template: "{upload_date}_{slug}"