TubeScript-API/SOLUCION_ERROR_FORMATO_SUBTITULOS.md

7.1 KiB

🔧 Solución para Error "Requested format is not available"

Problema

{
  "detail": "Error de yt-dlp al obtener metadatos: ERROR: [youtube] 6hini9Xz_fc: Requested format is not available. Use --list-formats for a list of available formats"
}

Este error ocurre cuando:

  1. El video no tiene subtítulos en el formato json3 solicitado
  2. El video tiene subtítulos pero en otro formato (srv3, vtt, etc.)
  3. El video no está disponible o tiene restricciones

Solución Implementada

He mejorado el código para:

1. Aceptar Múltiples Formatos de Subtítulos

Ahora el sistema acepta:

  • json3 (JSON format 3 de YouTube)
  • srv3 (Server format 3)
  • vtt (WebVTT format)

2. Búsqueda Inteligente de Subtítulos

El sistema busca en orden:

  1. requested_subtitles (subtítulos solicitados)
  2. automatic_captions (subtítulos automáticos)
  3. subtitles (subtítulos manuales)

3. Parser Flexible

Nueva función parse_subtitle_format() que maneja:

  • JSON3: Formato estructurado de YouTube
  • SRV3: Similar a JSON3
  • VTT: Formato de texto WebVTT

🚀 Actualizar el Sistema

Método 1: Script Automático

./docker-update-system.sh

Método 2: Manual

# 1. Detener servicios
docker-compose down

# 2. Reconstruir con los cambios
docker-compose build --no-cache

# 3. Iniciar
docker-compose up -d

# 4. Verificar logs
docker-compose logs -f tubescript_api

🧪 Probar la Solución

Test con el video que falló:

# Probar el video específico
curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es"

Test con otros videos:

# Video de noticias (usualmente tiene subtítulos)
curl -X GET "http://localhost:8080/transcript/jNQXAC9IVRw?lang=en"

# Video popular
curl -X GET "http://localhost:8080/transcript/dQw4w9WgXcQ?lang=en"

🔍 Diagnóstico del Problema

Verificar Formatos Disponibles

# Entrar al contenedor
docker exec -it tubescript_api /bin/bash

# Ver formatos disponibles para un video
yt-dlp --list-subs https://www.youtube.com/watch?v=6hini9Xz_fc

# Intentar con diferentes formatos
yt-dlp --skip-download --write-auto-subs --sub-langs "es.*" \
  --dump-json https://www.youtube.com/watch?v=6hini9Xz_fc

Ver Logs Detallados

# Ver últimos errores del API
docker logs tubescript_api 2>&1 | grep -i "error" | tail -20

# Ver todo el log del último intento
docker logs tubescript_api 2>&1 | tail -100

💡 Mejoras Implementadas en el Código

Antes:

command = [
    "yt-dlp",
    "--skip-download",
    "--write-auto-subs",
    "--sub-format", "json3",  # ❌ Solo json3
    "--sub-langs", f"{lang}.*",
    "--dump-json",
    url
]

Después:

command = [
    "yt-dlp",
    "--skip-download",
    "--write-auto-subs",  # ✅ Sin forzar formato
    "--write-subs",       # ✅ También manuales
    "--sub-langs", f"{lang}.*",
    "--dump-json",
    url
]

# ✅ Busca en múltiples fuentes
for subtitle_option in automatic_captions[lang_key]:
    ext = subtitle_option.get('ext', '')
    if ext in ['json3', 'srv3', 'vtt']:  # ✅ Acepta múltiples formatos
        requested_subs = {lang_key: subtitle_option}
        break

📊 Formatos de Subtítulos Soportados

Formato Descripción Soporte
json3 JSON estructurado de YouTube Completo
srv3 Server format de YouTube Completo
vtt WebVTT (texto plano) Básico
ttml Timed Text Markup Language Futuro
srt SubRip format Futuro

⚠️ Casos Especiales

Video Sin Subtítulos

Si un video no tiene subtítulos en ningún formato:

{
  "detail": "No se encontraron subtítulos para el idioma 'es'. El video puede no tener subtítulos disponibles."
}

Solución: Probar con otro idioma o verificar que el video tenga subtítulos.

Video con Restricciones

Si el video tiene restricciones geográficas o de edad:

{
  "detail": "Acceso denegado (HTTP 403). El video puede tener restricciones geográficas o de edad. Intenta agregar cookies.txt."
}

Solución: Agregar cookies.txt de tu cuenta de YouTube.

Video Privado o Eliminado

{
  "detail": "Error de yt-dlp al obtener metadatos: ERROR: [youtube] Video unavailable"
}

Solución: Verificar que el video esté disponible públicamente.


🎯 Ejemplo de Uso Completo

1. Actualizar Sistema

./docker-update-system.sh

2. Probar Endpoint

# Con cURL
curl -X GET "http://localhost:8080/transcript/6hini9Xz_fc?lang=es" | jq

# Con HTTPie
http GET localhost:8080/transcript/6hini9Xz_fc lang==es

# Con Python
import requests
response = requests.get("http://localhost:8080/transcript/6hini9Xz_fc?lang=es")
print(response.json())

3. Procesar Respuesta

import requests

video_id = "6hini9Xz_fc"
response = requests.get(f"http://localhost:8080/transcript/{video_id}?lang=es")

if response.status_code == 200:
    data = response.json()
    print(f"✅ Se obtuvieron {data['count']} segmentos de subtítulos")
    
    # Mostrar primeros 5 segmentos
    for segment in data['segments'][:5]:
        print(f"{segment['start']:.1f}s: {segment['text']}")
else:
    print(f"❌ Error: {response.json()['detail']}")

🔄 Nuevo Flujo de Procesamiento

1. Solicitar metadatos sin forzar formato
   ↓
2. Buscar en requested_subtitles
   ↓ Si no hay
3. Buscar en automatic_captions
   ↓ Para cada idioma
4. Buscar formato: json3, srv3, o vtt
   ↓ Si encuentra
5. Descargar subtítulos
   ↓
6. Detectar formato automáticamente
   ↓
7. Parsear según formato:
   - JSON3 → clean_youtube_json()
   - SRV3 → clean_youtube_json()
   - VTT → parse_vtt_format()
   ↓
8. Retornar formato estándar

📝 Formato de Salida Estándar

Independientemente del formato de entrada, la salida siempre es:

{
  "video_id": "6hini9Xz_fc",
  "count": 150,
  "segments": [
    {
      "start": 0.0,
      "duration": 2.5,
      "text": "Texto del subtítulo"
    },
    {
      "start": 2.5,
      "duration": 3.0,
      "text": "Siguiente segmento"
    }
  ]
}

Checklist de Solución

  • Remover --sub-format json3 del comando yt-dlp
  • Agregar búsqueda en múltiples fuentes
  • Soportar formatos json3, srv3, vtt
  • Crear función parse_subtitle_format()
  • Manejar errores específicos por formato
  • Documentar la solución
  • Actualizar tu sistema
  • Probar con el video problemático
  • Verificar logs

🎉 Resumen

Problema:

  • Solo buscaba formato json3
  • No manejaba videos sin ese formato

Solución:

  • Busca en múltiples formatos (json3, srv3, vtt)
  • Parser flexible para cada formato
  • Búsqueda inteligente en múltiples fuentes
  • Mensajes de error claros

Próximo Paso:

# Actualiza tu sistema
./docker-update-system.sh

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

TubeScript API Pro © 2026
Soporte Multi-Formato de Subtítulos Implementado