- scripts/bootstrap.sh: setup idempotente (python>=3.10, venv, extras, ffmpeg/node con hints de brew/apt, config.yaml desde example) - scripts/start-server.sh / stop-server.sh: equivalentes bash de los .ps1 (reuso de servidor via .run/server.info, puerto libre 8000-8100, healthz, apertura de navegador con open/xdg-open) - Makefile: setup/serve/stop/test/clean (Windows apunta a los .bat/.ps1) - compatible con bash 3.2 de macOS, sin bashismos
116 lines
3.8 KiB
Bash
116 lines
3.8 KiB
Bash
#!/usr/bin/env bash
|
|
# bootstrap.sh — prepara una maquina nueva (macOS/Linux) para yt-scraper.
|
|
# Idempotente: seguro de ejecutar tantas veces como haga falta.
|
|
#
|
|
# bash scripts/bootstrap.sh (o `make setup`)
|
|
#
|
|
# Que hace:
|
|
# 1. Localiza Python >= 3.10 (prefiere 3.12; pista de brew si falta).
|
|
# 2. Crea el venv .venv/ si no existe (o lo reusa).
|
|
# 3. Instala el paquete con los extras dev, web y analysis.
|
|
# 4. Revisa herramientas opcionales: ffmpeg y node (con pistas de instalacion).
|
|
# 5. Copia config.example.yaml -> config.yaml si aun no existe.
|
|
#
|
|
# Compatible con el bash 3.2 de macOS y con POSIX sh.
|
|
|
|
set -u
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" || exit 1
|
|
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" || exit 1
|
|
cd "$ROOT" || exit 1
|
|
|
|
say() { printf '%s\n' "$*"; }
|
|
ok() { say " [ok] $*"; }
|
|
warn() { say " [warn] $*"; }
|
|
err() { say " [error] $*"; }
|
|
|
|
OS="$(uname)"
|
|
|
|
say ""
|
|
say " [yt-scraper] preparando el entorno en $ROOT ..."
|
|
|
|
# --- (1) Python >= 3.10 (se prefiere 3.12) ---
|
|
PY=""
|
|
for candidate in python3.12 python3.11 python3.10 python3 python; do
|
|
command -v "$candidate" >/dev/null 2>&1 || continue
|
|
ver="$("$candidate" -c 'import sys; print("%d.%d" % sys.version_info[:2])' 2>/dev/null || true)"
|
|
case "$ver" in
|
|
3.1[0-9] | 3.[2-9][0-9] | 4.*)
|
|
PY="$(command -v "$candidate")"
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ -z "$PY" ]; then
|
|
err "no encontre Python >= 3.10 en el PATH."
|
|
if [ "$OS" = "Darwin" ]; then
|
|
say " instalalo con Homebrew: brew install [email protected]"
|
|
else
|
|
say " instalalo con el gestor de tu distro, p.ej.:"
|
|
say " sudo apt install python3 python3-venv python3-pip"
|
|
fi
|
|
exit 1
|
|
fi
|
|
ok "Python encontrado: $PY ($("$PY" -c 'import sys; print(sys.version.split()[0])'))"
|
|
|
|
# --- (2) venv (crear si falta, reusar si ya existe) ---
|
|
if [ ! -x ".venv/bin/python" ]; then
|
|
say " [...] creando venv .venv/ ..."
|
|
if ! "$PY" -m venv .venv; then
|
|
err "no se pudo crear el venv (en Debian/Ubuntu falta: sudo apt install python3-venv)."
|
|
exit 1
|
|
fi
|
|
else
|
|
ok "venv .venv/ ya existe; reusandolo."
|
|
fi
|
|
VPY=".venv/bin/python"
|
|
|
|
# --- (3) dependencias (paquete + extras dev/web/analysis) ---
|
|
say " [...] instalando dependencias: pip install -e \"[dev,web,analysis]\" ..."
|
|
"$VPY" -m pip install --quiet --upgrade pip || true
|
|
if ! "$VPY" -m pip install -e ".[dev,web,analysis]"; then
|
|
err "fallo pip install; revisa el mensaje de arriba."
|
|
exit 1
|
|
fi
|
|
ok "dependencias instaladas."
|
|
|
|
# --- (4) herramientas opcionales ---
|
|
if command -v ffmpeg >/dev/null 2>&1; then
|
|
ok "ffmpeg presente ($(command -v ffmpeg))."
|
|
else
|
|
warn "ffmpeg no encontrado (solo hace falta para descargar audio MP3)."
|
|
if [ "$OS" = "Darwin" ]; then
|
|
say " brew install ffmpeg"
|
|
else
|
|
say " sudo apt install ffmpeg # Debian/Ubuntu (dnf/pacman en otras distros)"
|
|
fi
|
|
fi
|
|
|
|
if command -v node >/dev/null 2>&1; then
|
|
ok "node presente ($(command -v node)) — runtime JS para los retos de yt-dlp."
|
|
else
|
|
warn "node no encontrado (yt-dlp lo usa como runtime JS para algunos desafios)."
|
|
if [ "$OS" = "Darwin" ]; then
|
|
say " brew install node"
|
|
else
|
|
say " usa el gestor de tu distro o descargalo de https://nodejs.org"
|
|
fi
|
|
fi
|
|
|
|
# --- (5) configuracion inicial ---
|
|
if [ -f "config.example.yaml" ] && [ ! -f "config.yaml" ]; then
|
|
cp config.example.yaml config.yaml
|
|
ok "config.yaml creado a partir de config.example.yaml (revisa canales y rutas)."
|
|
elif [ -f "config.yaml" ]; then
|
|
ok "config.yaml ya existe; no se toca."
|
|
fi
|
|
|
|
# --- siguientes pasos ---
|
|
say ""
|
|
say " Listo. Siguientes pasos:"
|
|
say " - arranca el servidor: bash scripts/start-server.sh (o: make serve)"
|
|
say " - detene el servidor: bash scripts/stop-server.sh (o: make stop)"
|
|
say " - o usa la CLI: .venv/bin/yt-scraper --help"
|
|
say ""
|