#!/usr/bin/env bash set -euo pipefail cd "$(dirname "$0")" TEXT_MODEL="${TEXT_MODEL:-llama3.1:8b}" VISION_MODEL="${VISION_MODEL:-llama3.2-vision}" OLLAMA_URL="http://localhost:11434" OS="$(uname -s)" PYTHON="" if [ "$(id -u)" -eq 0 ]; then SUDO="" else SUDO="sudo" fi info() { printf '\n\033[1;34m==>\033[0m %s\n' "$1"; } warn() { printf '\033[1;33mWarning:\033[0m %s\n' "$1"; } fail() { printf '\033[1;31mError:\033[0m %s\n' "$1"; exit 1; } ollama_up() { curl -fs "$OLLAMA_URL/api/tags" >/dev/null 2>&1 } load_brew() { if [ -x /opt/homebrew/bin/brew ]; then eval "$(/opt/homebrew/bin/brew shellenv)" elif [ -x /usr/local/bin/brew ]; then eval "$(/usr/local/bin/brew shellenv)" fi } install_macos() { load_brew if ! command -v brew >/dev/null 2>&1; then info "Installing Homebrew" /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" load_brew fi command -v brew >/dev/null 2>&1 || fail "Homebrew is not available" info "Installing Python, ffmpeg, and Ollama" brew install python ffmpeg ollama PYTHON="$(brew --prefix)/bin/python3" if [ ! -x "$PYTHON" ]; then PYTHON="$(command -v python3 || true)" fi } linux_deps_present() { command -v python3 >/dev/null 2>&1 \ && python3 -c 'import venv, ensurepip' >/dev/null 2>&1 \ && command -v ffmpeg >/dev/null 2>&1 \ && command -v curl >/dev/null 2>&1 } install_linux() { if linux_deps_present; then info "Python, ffmpeg, and curl already installed" else info "Installing Python, ffmpeg, and curl" if command -v apt-get >/dev/null 2>&1; then $SUDO apt-get update $SUDO apt-get install -y python3 python3-venv python3-pip ffmpeg curl elif command -v dnf >/dev/null 2>&1; then $SUDO dnf install -y python3 python3-pip curl $SUDO dnf install -y ffmpeg || $SUDO dnf install -y ffmpeg-free elif command -v pacman >/dev/null 2>&1; then $SUDO pacman -Sy --needed --noconfirm python python-pip ffmpeg curl elif command -v zypper >/dev/null 2>&1; then $SUDO zypper --non-interactive install python3 python3-pip ffmpeg curl else fail "Unsupported package manager. Install python3 (3.10+) with venv, ffmpeg, and curl, then rerun" fi fi if command -v ollama >/dev/null 2>&1; then info "Ollama already installed" else info "Installing Ollama" curl -fsSL https://ollama.com/install.sh | sh fi PYTHON="$(command -v python3 || true)" } start_ollama() { if ollama_up; then echo "Ollama is already running" return fi if [ "$OS" = "Darwin" ]; then brew services start ollama elif command -v systemctl >/dev/null 2>&1 && systemctl cat ollama.service >/dev/null 2>&1; then $SUDO systemctl enable --now ollama else mkdir -p data/logs nohup ollama serve > data/logs/ollama.log 2>&1 & fi for _ in $(seq 1 30); do if ollama_up; then return fi sleep 1 done fail "Ollama did not start. Try running: ollama serve" } [ -f app.py ] || fail "Run this script from the shorts-autopilot folder" case "$OS" in Darwin) install_macos ;; Linux) install_linux ;; *) fail "Unsupported OS: $OS" ;; esac if [ -z "$PYTHON" ] || [ ! -x "$PYTHON" ]; then fail "python3 was not found after install" fi "$PYTHON" -c 'import sys; sys.exit(0 if sys.version_info >= (3, 10) else 1)' \ || fail "Python 3.10 or newer is required (found $("$PYTHON" --version 2>&1))" info "Using $("$PYTHON" --version)" info "Starting Ollama" start_ollama info "Downloading AI models (this can take a while)" ollama pull "$TEXT_MODEL" ollama pull "$VISION_MODEL" info "Setting up Python virtual environment" if [ ! -x .venv/bin/python ]; then "$PYTHON" -m venv .venv fi .venv/bin/python -m pip install --upgrade pip .venv/bin/python -m pip install -r requirements.txt info "Updating .gitignore" touch .gitignore for entry in data/ videos/ client_secret.json __pycache__/ '*.pyc' .venv/; do if ! grep -qxF "$entry" .gitignore; then echo "$entry" >> .gitignore fi done chmod +x run.sh 2>/dev/null || true info "Checking setup" if [ -f client_secret.json ]; then echo "client_secret.json found" else warn "client_secret.json is missing. Download it from Google Cloud and place it next to app.py" fi echo "After the app starts, paste your Gemini API key in Settings" info "Install complete" echo "Start the app any time with: ./run.sh" answer="n" read -r -p "Start it now? [Y/n] " answer || answer="n" case "${answer:-Y}" in [Yy]*) exec ./run.sh ;; esac