429 lines
11 KiB
Markdown
429 lines
11 KiB
Markdown
╔══════════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ ✅ 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:**
|
||
|
||
```dockerfile
|
||
# 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:**
|
||
```bash
|
||
./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:
|
||
|
||
```bash
|
||
# 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:
|
||
|
||
```bash
|
||
# 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
|
||
|
||
```bash
|
||
./docker-rebuild.sh
|
||
```
|
||
|
||
El script te guiará paso a paso.
|
||
|
||
---
|
||
|
||
## 🧪 PROBAR QUE FUNCIONA
|
||
|
||
### 1. Verificar Versión de yt-dlp
|
||
|
||
```bash
|
||
# 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
|
||
|
||
```bash
|
||
# 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
|
||
|
||
```python
|
||
"--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
|
||
|
||
```python
|
||
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**
|
||
```bash
|
||
./docker-update-ytdlp.sh
|
||
```
|
||
|
||
**Solución 2: Rebuild**
|
||
```bash
|
||
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:**
|
||
```bash
|
||
# 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
|
||
|
||
```bash
|
||
# 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! 📺 ║
|
||
║ ║
|
||
╚══════════════════════════════════════════════════════════════════════╝
|