Files
shorts-autopilot/install.sh
T
2026-09-17 18:38:39 -07:00

161 lines
4.4 KiB
Bash
Executable File

#!/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