TubeScript-API/SOLUCION_YTDLP_ERROR.md
2026-01-29 22:49:00 -07:00

11 KiB
Raw Permalink Blame History

╔══════════════════════════════════════════════════════════════════════╗ ║ ║ ║ SOLUCIÓN COMPLETA: Error de yt-dlp ║ ║ ║ ║ Estrategia Multi-Formato + Actualización + Fallback ║ ║ ║ ╚══════════════════════════════════════════════════════════════════════╝

🐛 ERROR DETECTADO

Error de yt-dlp: Traceback (most recent call last):
  File "/usr/local/bin/yt-dlp", line 8, in <module>
    sys.exit(main())

Causas Posibles:

  1. yt-dlp está desactualizado o corrupto
  2. Incompatibilidad con la versión de Python
  3. Dependencias faltantes
  4. YouTube cambió su API
  5. Formato de video no compatible

SOLUCIONES IMPLEMENTADAS

1 Función get_stream_url() Mejorada con Estrategia de Fallback

streamlit_app.py - Nueva implementación:

Múltiples formatos: Intenta 4 formatos diferentes automáticamente Cliente Android: Usa player_client=android (más compatible con YouTube) Fallback automático: Si un formato falla, intenta el siguiente Mejor UI: Muestra progreso de cada intento Mensajes detallados: Ayuda al usuario a diagnosticar el problema

Formatos que intenta (en orden):

  1. best - Mejor calidad disponible
  2. best[ext=mp4] - Mejor calidad MP4
  3. bestvideo+bestaudio - Video y audio separados
  4. worst - Menor calidad (más compatible)

Características adicionales:

  • Variable de entorno PYTHONIOENCODING=utf-8 para evitar errores de encoding
  • --extractor-args youtube:player_client=android para mejor compatibilidad
  • Manejo robusto de errores con continue en lugar de fallar

2 Dockerfile Mejorado

Cambios implementados:

# Variable de entorno para encoding
ENV PYTHONIOENCODING=utf-8

# Actualizar pip, setuptools y wheel antes de instalar
RUN pip install --no-cache-dir --upgrade pip setuptools wheel

# Instalar yt-dlp con upgrade explícito
RUN pip install --no-cache-dir --upgrade yt-dlp

# Verificación mejorada
RUN python3 -c "import yt_dlp; print(f'yt-dlp OK')"

Beneficios:

  • Asegura que yt-dlp esté actualizado desde el inicio
  • Verifica la instalación correctamente
  • Evita problemas de encoding

3 Script de Actualización Rápida

Creado: docker-update-ytdlp.sh

Actualiza yt-dlp en los contenedores SIN necesidad de rebuild completo.

Uso:

./docker-update-ytdlp.sh

Beneficios:

  • Actualización rápida (segundos vs minutos)
  • No requiere reconstruir imágenes
  • Actualiza ambos contenedores
  • Muestra versión instalada

🚀 CÓMO USAR LAS SOLUCIONES

Opción 1: Actualización Rápida (RECOMENDADO)

Si los contenedores ya están corriendo:

# 1. Actualizar yt-dlp en contenedores
./docker-update-ytdlp.sh

# 2. Reiniciar streamlit (opcional)
docker-compose restart streamlit-panel

# 3. Probar
http://localhost:8501

Tiempo estimado: 30 segundos ⏱️


Opción 2: Rebuild Completo

Si quieres empezar desde cero:

# 1. Detener contenedores
docker-compose down

# 2. Reconstruir sin cache
docker-compose build --no-cache

# 3. Iniciar
docker-compose up -d

# 4. Verificar
docker-compose ps

Tiempo estimado: 5-10 minutos ⏱️⏱️


Opción 3: Rebuild con Script

./docker-rebuild.sh

El script te guiará paso a paso.


🧪 PROBAR QUE FUNCIONA

1. Verificar Versión de yt-dlp

# En streamlit_panel
docker exec streamlit_panel python3 -c "import yt_dlp; print(yt_dlp.version.__version__)"

# En tubescript_api
docker exec tubescript_api python3 -c "import yt_dlp; print(yt_dlp.version.__version__)"

Debe mostrar: Una versión reciente (ej: 2026.01.29)


2. Probar con Video en Vivo

Canales 24/7 recomendados para probar:

  1. DW News (Alemán):

    https://www.youtube.com/@DWNews
    Buscar: "DW News live"
    
  2. France 24 English:

    Buscar: "France 24 English live"
    
  3. Al Jazeera English:

    Buscar: "Al Jazeera English live"
    
  4. NBC News NOW:

    Buscar: "NBC News NOW live"
    

3. Probar Manualmente en Contenedor

# Entrar al contenedor
docker exec -it streamlit_panel bash

# Probar yt-dlp directamente
yt-dlp -g -f best "URL_VIDEO_YOUTUBE_LIVE"

# Debe mostrar una URL HTTP/HTTPS

💡 ESTRATEGIA DE FALLBACK EXPLICADA

La nueva función intenta formatos en este orden:

1. "-f best"
   └─ Mejor calidad disponible
   └─ Si falla →

2. "-f best[ext=mp4]"
   └─ Mejor calidad en formato MP4
   └─ Si falla →

3. "-f bestvideo+bestaudio"
   └─ Mejor video + mejor audio por separado
   └─ Si falla →

4. "-f worst"
   └─ Menor calidad (última opción, más compatible)
   └─ Si falla →

❌ Muestra error detallado con sugerencias

Beneficios:

  • Si un formato no funciona, automáticamente intenta otro
  • Maximiza compatibilidad
  • Usuario ve progreso de cada intento

🔧 CARACTERÍSTICAS ADICIONALES

Cliente Android

"--extractor-args", "youtube:player_client=android"

¿Por qué?

  • YouTube es más permisivo con el cliente Android
  • Menos restricciones de extracción
  • Mayor tasa de éxito

Encoding UTF-8

env={**os.environ, "PYTHONIOENCODING": "utf-8"}

¿Por qué?

  • Evita errores con caracteres especiales
  • Compatible con títulos en otros idiomas
  • Previene fallos de encoding

📊 INTERFAZ MEJORADA

Mensajes que Verás:

Durante extracción:

🔄 Intentando: Mejor calidad disponible...
✅ URL obtenida con: Mejor calidad disponible
✅ Stream listo para transmitir

Si falla:

❌ No se pudo obtener la URL del stream con ningún formato

🔍 Ver detalles del error ▼

⚠️ Posibles causas:
1. El video no está EN VIVO 🔴
   - Verifica que el video tenga el indicador rojo "EN VIVO"
   
2. Video con restricciones
   - Restricciones geográficas
   
3. Problema con yt-dlp
   - yt-dlp puede estar desactualizado

💡 Soluciones:
1. Intenta con un canal de noticias 24/7
2. Agrega cookies de YouTube
3. Actualiza el contenedor

🐛 SOLUCIÓN A ERRORES ESPECÍFICOS

Error: "Traceback... yt-dlp"

Solución 1: Actualizar yt-dlp

./docker-update-ytdlp.sh

Solución 2: Rebuild

docker-compose down
docker-compose build --no-cache
docker-compose up -d

Error: "No se pudo obtener la URL"

Solución: Verificar el video

  1. Debe estar 🔴 EN VIVO
  2. Debe ser público
  3. No debe tener restricciones de edad
  4. Preferir canales de noticias 24/7

Error: "Timeout"

Solución: Ya está resuelto

  • Timeout aumentado a 60s
  • Múltiples intentos con formatos diferentes

Error: "ImportError: yt_dlp"

Solución:

# Reinstalar yt-dlp en contenedor
docker exec streamlit_panel pip install --force-reinstall yt-dlp

# O rebuild completo
./docker-rebuild.sh

📋 CHECKLIST DE VERIFICACIÓN

Después de aplicar las soluciones:

  • yt-dlp actualizado: ./docker-update-ytdlp.sh
  • Contenedores corriendo: docker-compose ps
  • Versión correcta: docker exec streamlit_panel python3 -c "import yt_dlp; print(yt_dlp.version.__version__)"
  • Panel accesible: http://localhost:8501
  • Probar con video 24/7 (DW News, etc.)
  • Ver mensajes de progreso en UI
  • Verificar que muestra " Stream listo"

🎯 COMANDOS RÁPIDOS

# Actualización rápida (RECOMENDADO)
./docker-update-ytdlp.sh

# Ver versión de yt-dlp
docker exec streamlit_panel python3 -c "import yt_dlp; print(yt_dlp.version.__version__)"

# Probar manualmente
docker exec streamlit_panel yt-dlp -g -f best "URL_VIDEO"

# Ver logs en tiempo real
docker-compose logs -f streamlit-panel

# Reiniciar panel
docker-compose restart streamlit-panel

# Rebuild completo
./docker-rebuild.sh

# Entrar al contenedor para debug
docker exec -it streamlit_panel bash

📚 ARCHIVOS MODIFICADOS

Archivo Cambios
streamlit_app.py Función con estrategia de fallback
Dockerfile Mejor instalación de yt-dlp
docker-update-ytdlp.sh NUEVO - Actualización rápida

🎉 RESULTADO ESPERADO

Después de aplicar estas soluciones:

  1. yt-dlp actualizado a última versión
  2. Múltiples formatos intentados automáticamente
  3. Mejor compatibilidad con YouTube
  4. Mensajes de error claros y útiles
  5. Fácil actualización sin rebuild

El error debe estar completamente resuelto! 🚀


╔══════════════════════════════════════════════════════════════════════╗ ║ ║ ║ SOLUCIÓN COMPLETA LISTA ║ ║ ║ ║ EJECUTA UNO DE ESTOS: ║ ║ ║ ║ Opción Rápida (30s): ║ ║ ./docker-update-ytdlp.sh ║ ║ ║ ║ Opción Completa (10min): ║ ║ ./docker-rebuild.sh ║ ║ ║ ║ Luego prueba con: ║ ║ http://localhost:8501 ║ ║ ║ ║ ¡Busca "DW News live" para probar! 📺 ║ ║ ║ ╚══════════════════════════════════════════════════════════════════════╝