#!/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 python@3.12" 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 ""