#!/bin/bash # Sin cookies → android (sin n-challenge, sin Node.js) # Con cookies → web + Node.js (Node.js resuelve n-challenge/signature) # for_stream → android (mejor HLS en lives) # Script de prueba completo — guarda TODO en /tmp/resultado.txt exec > /tmp/resultado.txt 2>&1 REPO="/home/xesar/PycharmProjects/TubeScript-API" cd "$REPO" echo "=== $(date) ===" # ---------- 1. Rebuild imagen ---------- echo "--- Parando contenedor anterior ---" docker rm -f tubescript_api 2>/dev/null || true echo "--- Construyendo imagen (CACHEBUST para forzar COPY . /app fresco) ---" # --build-arg CACHEBUST=$(date +%s) invalida solo la capa COPY . /app # (mucho más rápido que --no-cache que descarga todo desde cero) docker build \ --build-arg CACHEBUST="$(date +%s)" \ -f Dockerfile.api \ -t tubescript-api:latest . 2>&1 | tail -8 echo "BUILD_RC=$?" # ---------- 2. Levantar ---------- echo "--- Levantando contenedor ---" docker run -d \ --name tubescript_api \ --network tubescript-network \ -p 8282:8000 \ -v "${REPO}/data:/app/data:rw" \ -e PYTHONUNBUFFERED=1 \ -e API_COOKIES_PATH=/app/data/cookies.txt \ --restart unless-stopped \ tubescript-api:latest echo "RC_RUN=$?" sleep 10 echo "--- docker ps ---" docker ps --format "{{.Names}} {{.Status}} {{.Ports}}" | grep tube || echo "NO CORRIENDO" echo "--- uvicorn logs ---" docker logs tubescript_api 2>&1 | tail -4 echo "--- _yt_client_args en imagen (verificar lógica nueva) ---" docker exec tubescript_api grep -A12 "def _yt_client_args" /app/main.py echo "" echo "=== PRUEBA A: android SIN cookies ===" docker exec tubescript_api yt-dlp \ --no-warnings --skip-download \ --extractor-args "youtube:player_client=android" \ --print title \ "https://www.youtube.com/watch?v=dQw4w9WgXcQ" 2>&1 echo "RC_A=$?" echo "" echo "=== PRUEBA B: web + Node.js CON cookies ===" docker exec tubescript_api yt-dlp \ --cookies /app/data/cookies.txt \ --no-warnings --skip-download \ --extractor-args "youtube:player_client=web" \ --js-runtimes "node:/usr/bin/node" \ --print title \ "https://www.youtube.com/watch?v=dQw4w9WgXcQ" 2>&1 echo "RC_B=$?" echo "" echo "=== PRUEBA C: endpoint /debug/metadata ===" sleep 2 curl -s --max-time 30 "http://127.0.0.1:8282/debug/metadata/dQw4w9WgXcQ" \ | python3 -c " import sys,json raw=sys.stdin.read() try: d=json.loads(raw) if 'detail' in d: print('ERROR:', d['detail'][:200]) else: print('title :', d.get('title','?')) print('uploader:', d.get('uploader','?')) print('duration:', d.get('duration','?')) except Exception as e: print('PARSE ERROR:', e) print('RAW:', raw[:300]) " echo "RC_C=$?" echo "" echo "=== PRUEBA D: endpoint /transcript?lang=en ===" curl -s --max-time 90 "http://127.0.0.1:8282/transcript/dQw4w9WgXcQ?lang=en" \ | python3 -c " import sys,json raw=sys.stdin.read() try: d=json.loads(raw) if 'detail' in d: print('ERROR:', d['detail'][:200]) else: print('count :', d.get('count','?')) print('preview:', str(d.get('text','?'))[:120]) except Exception as e: print('PARSE ERROR:', e) print('RAW:', raw[:200]) " echo "RC_D=$?" echo "" echo "=== PRUEBA E: /transcript/QjK5wq8L3Ac (sin subtítulos — mensaje claro esperado) ===" curl -s --max-time 60 "http://127.0.0.1:8282/transcript/QjK5wq8L3Ac?lang=es" \ | python3 -c " import sys,json raw=sys.stdin.read() try: d=json.loads(raw) if 'detail' in d: print('DETALLE:', d['detail'][:250]) else: print('OK count:', d.get('count','?')) except Exception as e: print('RAW:', raw[:200]) " echo "RC_E=$?" echo "" echo "=== PRUEBA F: /debug/metadata/QjK5wq8L3Ac (title con cookies) ===" curl -s --max-time 30 "http://127.0.0.1:8282/debug/metadata/QjK5wq8L3Ac" \ | python3 -c " import sys,json d=json.loads(sys.stdin.read()) print('title:',d.get('title','?')) if 'title' in d else print('ERROR:',d.get('detail','?')[:200]) " echo "RC_F=$?" echo "" echo "=== FIN ==="