356 lines
6.9 KiB
Markdown
356 lines
6.9 KiB
Markdown
# ✅ SOLUCIÓN FINAL SIMPLIFICADA - Error de Formato de Subtítulos
|
|
|
|
## 📝 Resumen del Problema
|
|
|
|
```
|
|
ERROR: [youtube] 6hini9Xz_fc: Requested format is not available
|
|
```
|
|
|
|
Este error ocurre porque yt-dlp no puede obtener los subtítulos en el formato solicitado.
|
|
|
|
---
|
|
|
|
## ✅ Cambios Implementados en main.py
|
|
|
|
### 1. Comando Simplificado (Sin Restricciones de Formato)
|
|
|
|
**ANTES:**
|
|
```python
|
|
command = [
|
|
"yt-dlp",
|
|
"--skip-download",
|
|
"--write-auto-subs",
|
|
"--sub-format", "json3", # ❌ Esto causaba el error
|
|
"--sub-langs", f"{lang}.*",
|
|
...
|
|
]
|
|
```
|
|
|
|
**DESPUÉS:**
|
|
```python
|
|
command = [
|
|
"yt-dlp",
|
|
"--skip-download",
|
|
"--dump-json", # ✅ Solo obtener metadatos
|
|
"--no-warnings",
|
|
"--extractor-args", "youtube:player_client=android",
|
|
url
|
|
]
|
|
```
|
|
|
|
### 2. Búsqueda Flexible de Subtítulos
|
|
|
|
El código ahora:
|
|
1. Obtiene SOLO los metadatos del video
|
|
2. Busca subtítulos en el JSON de metadatos
|
|
3. Acepta CUALQUIER formato disponible
|
|
4. Descarga directamente desde la URL encontrada
|
|
|
|
```python
|
|
# Buscar en automatic_captions
|
|
for lang_key in automatic_captions.keys():
|
|
if lang in lang_key or lang_key.startswith(lang):
|
|
# Tomar el PRIMER formato disponible (sin filtrar)
|
|
if automatic_captions[lang_key]:
|
|
requested_subs = {lang_key: automatic_captions[lang_key][0]}
|
|
break
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 CÓMO APLICAR LA SOLUCIÓN
|
|
|
|
### Método 1: Reconstruir Docker (Recomendado)
|
|
|
|
```bash
|
|
# Limpiar todo
|
|
docker stop $(docker ps -aq) 2>/dev/null
|
|
docker rm $(docker ps -aq) 2>/dev/null
|
|
|
|
# Reconstruir desde cero
|
|
cd /Users/cesarmendivil/Documents/Nextream/TubeScript-API
|
|
docker-compose build --no-cache
|
|
|
|
# Iniciar
|
|
docker-compose up -d
|
|
|
|
# Ver logs
|
|
docker-compose logs -f tubescript-api
|
|
```
|
|
|
|
### Método 2: Si Docker da problemas
|
|
|
|
```bash
|
|
# Reiniciar Docker Desktop
|
|
# 1. Cierra Docker Desktop completamente
|
|
# 2. Ábrelo nuevamente
|
|
# 3. Espera que inicie completamente
|
|
# 4. Ejecuta:
|
|
|
|
docker-compose down
|
|
docker-compose build --no-cache
|
|
docker-compose up -d
|
|
```
|
|
|
|
### Método 3: Build Manual
|
|
|
|
```bash
|
|
# Build solo del API
|
|
docker build -t tubescript-api -f Dockerfile .
|
|
|
|
# Ejecutar manualmente
|
|
docker run -d \
|
|
--name tubescript_api \
|
|
-p 8080:8000 \
|
|
-v "$(pwd)/cookies.txt:/app/cookies.txt:ro" \
|
|
-v "$(pwd):/app" \
|
|
tubescript-api \
|
|
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
|
|
|
|
# Ver logs
|
|
docker logs -f tubescript_api
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 PROBAR LA SOLUCIÓN
|
|
|
|
### Test 1: Verificar que Docker está corriendo
|
|
|
|
```bash
|
|
docker ps
|
|
```
|
|
|
|
Debería mostrar al menos `tubescript_api` corriendo.
|
|
|
|
### Test 2: Probar el endpoint problemático
|
|
|
|
```bash
|
|
# Esperar 10 segundos después de iniciar
|
|
sleep 10
|
|
|
|
# Probar
|
|
curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es"
|
|
```
|
|
|
|
### Test 3: Ver logs en tiempo real
|
|
|
|
```bash
|
|
# Terminal 1: Ver logs
|
|
docker logs -f tubescript_api
|
|
|
|
# Terminal 2: Hacer petición
|
|
curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es"
|
|
```
|
|
|
|
---
|
|
|
|
## 🔍 DIAGNÓSTICO DE PROBLEMAS
|
|
|
|
### Problema: Docker no responde
|
|
|
|
```bash
|
|
# Reiniciar Docker
|
|
killall Docker
|
|
open -a Docker
|
|
|
|
# Esperar 30 segundos
|
|
sleep 30
|
|
|
|
# Verificar
|
|
docker ps
|
|
```
|
|
|
|
### Problema: Puerto 8080 ocupado
|
|
|
|
```bash
|
|
# Ver qué usa el puerto
|
|
lsof -i :8080
|
|
|
|
# Matar proceso
|
|
kill -9 $(lsof -ti:8080)
|
|
|
|
# Cambiar puerto en docker-compose.yml
|
|
# ports:
|
|
# - "8081:8000" # Usar 8081 en lugar de 8080
|
|
```
|
|
|
|
### Problema: Contenedor se detiene inmediatamente
|
|
|
|
```bash
|
|
# Ver logs completos
|
|
docker logs tubescript_api
|
|
|
|
# Ejecutar en modo interactivo
|
|
docker run -it --rm \
|
|
-p 8080:8000 \
|
|
-v "$(pwd):/app" \
|
|
tubescript-api \
|
|
bash
|
|
|
|
# Dentro del contenedor:
|
|
python3 main.py
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 QUÉ HACE EL CÓDIGO AHORA
|
|
|
|
### Flujo Simplificado:
|
|
|
|
```
|
|
1. Usuario pide transcripción de video
|
|
↓
|
|
2. yt-dlp obtiene SOLO metadatos (sin bajar subtítulos)
|
|
↓
|
|
3. Parseamos el JSON de metadatos
|
|
↓
|
|
4. Buscamos en:
|
|
- automatic_captions
|
|
- subtitles
|
|
↓
|
|
5. Tomamos el PRIMER formato disponible
|
|
(json3, srv3, vtt, o lo que haya)
|
|
↓
|
|
6. Descargamos desde la URL encontrada
|
|
↓
|
|
7. Parseamos según el formato
|
|
↓
|
|
8. ✅ Retornamos formato estándar
|
|
```
|
|
|
|
### Ventajas:
|
|
|
|
✅ **Más rápido** - Solo obtiene metadatos una vez
|
|
✅ **Más flexible** - Acepta cualquier formato
|
|
✅ **Menos errores** - No forzamos formatos específicos
|
|
✅ **Mejor compatibilidad** - Funciona con más videos
|
|
|
|
---
|
|
|
|
## 💡 ALTERNATIVA: Probar Localmente Sin Docker
|
|
|
|
Si Docker sigue dando problemas, puedes probar localmente:
|
|
|
|
```bash
|
|
# 1. Instalar dependencias
|
|
pip install fastapi uvicorn requests yt-dlp
|
|
|
|
# 2. Ejecutar el API directamente
|
|
cd /Users/cesarmendivil/Documents/Nextream/TubeScript-API
|
|
uvicorn main:app --reload --port 8080
|
|
|
|
# 3. En otra terminal, probar:
|
|
curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es"
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 VERIFICACIÓN FINAL
|
|
|
|
Una vez que hayas reconstruido, verifica:
|
|
|
|
```bash
|
|
# 1. Contenedor corriendo
|
|
docker ps | grep tubescript_api
|
|
|
|
# 2. API respondiendo
|
|
curl http://localhost:8080/docs
|
|
|
|
# 3. Endpoint de transcripción
|
|
curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es" | jq
|
|
|
|
# 4. Logs sin errores
|
|
docker logs tubescript_api 2>&1 | tail -20
|
|
```
|
|
|
|
---
|
|
|
|
## ✅ CHECKLIST
|
|
|
|
- [ ] Detener servicios Docker actuales
|
|
- [ ] Verificar que Docker Desktop esté corriendo
|
|
- [ ] Reconstruir imagen: `docker-compose build --no-cache`
|
|
- [ ] Iniciar servicios: `docker-compose up -d`
|
|
- [ ] Esperar 10 segundos para que inicie
|
|
- [ ] Verificar contenedor: `docker ps`
|
|
- [ ] Probar endpoint: `curl http://localhost:8080/transcript/6hini9Xz_fc?lang=es`
|
|
- [ ] Ver logs: `docker logs tubescript_api`
|
|
- [ ] Si funciona: ✅ ¡Listo!
|
|
- [ ] Si falla: Ver logs y diagnosticar
|
|
|
|
---
|
|
|
|
## 🆘 SI TODO FALLA
|
|
|
|
### Opción 1: Reinstalar Docker
|
|
|
|
1. Desinstala Docker Desktop
|
|
2. Descarga la última versión
|
|
3. Instala
|
|
4. Reinicia la Mac
|
|
5. Abre Docker Desktop
|
|
6. Prueba de nuevo
|
|
|
|
### Opción 2: Usar Python Local
|
|
|
|
```bash
|
|
# Instalar en entorno virtual
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
pip install -r requirements.txt
|
|
|
|
# Ejecutar
|
|
uvicorn main:app --reload --port 8080
|
|
```
|
|
|
|
### Opción 3: Contactar Soporte
|
|
|
|
Si nada funciona, proporciona:
|
|
- Logs completos: `docker logs tubescript_api`
|
|
- Versión de Docker: `docker --version`
|
|
- Sistema: `uname -a`
|
|
- Error exacto que ves
|
|
|
|
---
|
|
|
|
## 📝 RESUMEN DE CAMBIOS EN EL CÓDIGO
|
|
|
|
| Archivo | Cambio | Línea Aprox. |
|
|
|---------|--------|--------------|
|
|
| main.py | Comando yt-dlp simplificado | ~98-108 |
|
|
| main.py | Búsqueda flexible de subtítulos | ~125-145 |
|
|
| main.py | Acepta cualquier formato | ~125-145 |
|
|
| main.py | Parser multi-formato | ~30-80 |
|
|
|
|
---
|
|
|
|
## 🎉 RESULTADO ESPERADO
|
|
|
|
Después de aplicar los cambios:
|
|
|
|
```bash
|
|
curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es"
|
|
```
|
|
|
|
**Debería retornar:**
|
|
```json
|
|
{
|
|
"video_id": "6hini9Xz_fc",
|
|
"count": 150,
|
|
"segments": [
|
|
{
|
|
"start": 0.0,
|
|
"duration": 2.5,
|
|
"text": "Texto del subtítulo..."
|
|
},
|
|
...
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
**TubeScript API Pro © 2026**
|
|
¡Reconstruye Docker y prueba!
|