TubeScript-API/SOLUCION_FINAL_DOCKER.md

6.9 KiB

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:

command = [
    "yt-dlp",
    "--skip-download",
    "--write-auto-subs",
    "--sub-format", "json3",  # ❌ Esto causaba el error
    "--sub-langs", f"{lang}.*",
    ...
]

DESPUÉS:

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
# 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)

# 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

# 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

# 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

docker ps

Debería mostrar al menos tubescript_api corriendo.

Test 2: Probar el endpoint problemático

# 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

# 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

# Reiniciar Docker
killall Docker
open -a Docker

# Esperar 30 segundos
sleep 30

# Verificar
docker ps

Problema: Puerto 8080 ocupado

# 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

# 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:

# 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:

# 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

# 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:

curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es"

Debería retornar:

{
  "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!