VideoTools/scripts/install.sh

316 lines
9.9 KiB
Bash
Executable File

#!/bin/bash
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Spinner function
spinner() {
local pid=$1
local task=$2
local spin='⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏'
local i=0
while kill -0 $pid 2>/dev/null; do
i=$(( (i+1) %10 ))
printf "\r${BLUE}${spin:$i:1}${NC} %s..." "$task"
sleep 0.1
done
printf "\r"
}
# Configuration
BINARY_NAME="VideoTools"
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DEFAULT_INSTALL_PATH="/usr/local/bin"
USER_INSTALL_PATH="$HOME/.local/bin"
# Args
DVDSTYLER_URL=""
while [ $# -gt 0 ]; do
case "$1" in
--dvdstyler-url=*)
DVDSTYLER_URL="${1#*=}"
shift
;;
--dvdstyler-url)
DVDSTYLER_URL="$2"
shift 2
;;
*)
echo "Unknown option: $1"
echo "Usage: $0 [--dvdstyler-url URL]"
exit 1
;;
esac
done
# Platform detection
UNAME_S="$(uname -s)"
IS_WINDOWS=false
IS_DARWIN=false
IS_LINUX=false
case "$UNAME_S" in
MINGW*|MSYS*|CYGWIN*)
IS_WINDOWS=true
;;
Darwin*)
IS_DARWIN=true
;;
Linux*)
IS_LINUX=true
;;
esac
INSTALL_TITLE="VideoTools Installation"
if [ "$IS_WINDOWS" = true ]; then
INSTALL_TITLE="VideoTools Windows Installation"
elif [ "$IS_DARWIN" = true ]; then
INSTALL_TITLE="VideoTools macOS Installation"
elif [ "$IS_LINUX" = true ]; then
INSTALL_TITLE="VideoTools Linux Installation"
fi
echo "════════════════════════════════════════════════════════════════"
echo " $INSTALL_TITLE"
echo "════════════════════════════════════════════════════════════════"
echo ""
# Step 1: Check if Go is installed
echo -e "${CYAN}[1/6]${NC} Checking Go installation..."
if ! command -v go &> /dev/null; then
echo -e "${RED}✗ Error: Go is not installed or not in PATH${NC}"
echo "Please install Go 1.21+ from https://go.dev/dl/"
exit 1
fi
GO_VERSION=$(go version | awk '{print $3}' | sed 's/go//')
echo -e "${GREEN}${NC} Found Go version: $GO_VERSION"
# Step 2: Check authoring dependencies
echo ""
echo -e "${CYAN}[2/6]${NC} Checking authoring dependencies..."
if [ "$IS_WINDOWS" = true ]; then
echo "Detected Windows environment."
if command -v powershell.exe &> /dev/null; then
if [ -n "$DVDSTYLER_URL" ]; then
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$PROJECT_ROOT/scripts/install-deps-windows.ps1" -DvdStylerUrl "$DVDSTYLER_URL"
else
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$PROJECT_ROOT/scripts/install-deps-windows.ps1"
fi
if [ $? -ne 0 ]; then
echo -e "${RED}✗ Windows dependency installer failed.${NC}"
echo "If DVDStyler download failed, retry with a direct mirror:"
echo ""
echo "Git Bash:"
echo " export VT_DVDSTYLER_URL=\"https://netcologne.dl.sourceforge.net/project/dvdstyler/DVDStyler/3.2.1/DVDStyler-3.2.1-win64.zip\""
echo " ./scripts/install.sh"
echo ""
echo "PowerShell:"
echo " \$env:VT_DVDSTYLER_URL=\"https://netcologne.dl.sourceforge.net/project/dvdstyler/DVDStyler/3.2.1/DVDStyler-3.2.1-win64.zip\""
echo " .\\scripts\\install-deps-windows.ps1"
exit 1
fi
echo -e "${GREEN}${NC} Windows dependency installer completed"
else
echo -e "${RED}✗ powershell.exe not found.${NC}"
echo "Please run: $PROJECT_ROOT\\scripts\\install-deps-windows.ps1"
exit 1
fi
else
missing_deps=()
if ! command -v ffmpeg &> /dev/null; then
missing_deps+=("ffmpeg")
fi
if ! command -v dvdauthor &> /dev/null; then
missing_deps+=("dvdauthor")
fi
if ! command -v mkisofs &> /dev/null && ! command -v genisoimage &> /dev/null && ! command -v xorriso &> /dev/null; then
missing_deps+=("iso-tool")
fi
install_deps=false
if [ ${#missing_deps[@]} -gt 0 ]; then
echo -e "${YELLOW}WARNING${NC} Missing dependencies: ${missing_deps[*]}"
read -p "Install missing dependencies now? [y/N]: " install_choice
if [[ "$install_choice" =~ ^[Yy]$ ]]; then
install_deps=true
fi
else
echo -e "${GREEN}${NC} All authoring dependencies found"
fi
if [ "$install_deps" = true ]; then
if command -v apt-get &> /dev/null; then
sudo apt-get update
sudo apt-get install -y ffmpeg dvdauthor genisoimage
elif command -v dnf &> /dev/null; then
sudo dnf install -y ffmpeg dvdauthor genisoimage
elif command -v pacman &> /dev/null; then
sudo pacman -Sy --noconfirm ffmpeg dvdauthor cdrtools
elif command -v zypper &> /dev/null; then
sudo zypper install -y ffmpeg dvdauthor genisoimage
elif command -v brew &> /dev/null; then
brew install ffmpeg dvdauthor xorriso
else
echo -e "${RED}✗ No supported package manager found.${NC}"
echo "Please install: ffmpeg, dvdauthor, and mkisofs/genisoimage/xorriso"
exit 1
fi
fi
if ! command -v ffmpeg &> /dev/null || ! command -v dvdauthor &> /dev/null; then
echo -e "${RED}✗ Missing required dependencies after install attempt.${NC}"
echo "Please install: ffmpeg and dvdauthor"
exit 1
fi
if ! command -v mkisofs &> /dev/null && ! command -v genisoimage &> /dev/null && ! command -v xorriso &> /dev/null; then
echo -e "${RED}✗ Missing ISO creation tool after install attempt.${NC}"
echo "Please install: mkisofs (cdrtools), genisoimage, or xorriso"
exit 1
fi
fi
# Step 3: Build the binary
echo ""
echo -e "${CYAN}[3/6]${NC} Building VideoTools..."
cd "$PROJECT_ROOT"
CGO_ENABLED=1 go build -o "$BINARY_NAME" . > /tmp/videotools-build.log 2>&1 &
BUILD_PID=$!
spinner $BUILD_PID "Building $BINARY_NAME"
if wait $BUILD_PID; then
echo -e "${GREEN}${NC} Build successful"
else
echo -e "${RED}✗ Build failed${NC}"
echo ""
echo "Build log:"
cat /tmp/videotools-build.log
rm -f /tmp/videotools-build.log
exit 1
fi
rm -f /tmp/videotools-build.log
# Step 4: Determine installation path
echo ""
echo -e "${CYAN}[4/6]${NC} Installation path selection"
echo ""
echo "Where would you like to install $BINARY_NAME?"
echo " 1) System-wide (/usr/local/bin) - requires sudo, available to all users"
echo " 2) User-local (~/.local/bin) - no sudo needed, available only to you"
echo ""
read -p "Enter choice [1 or 2, default 2]: " choice
choice=${choice:-2}
case $choice in
1)
INSTALL_PATH="$DEFAULT_INSTALL_PATH"
NEEDS_SUDO=true
;;
2)
INSTALL_PATH="$USER_INSTALL_PATH"
NEEDS_SUDO=false
mkdir -p "$INSTALL_PATH"
;;
*)
echo -e "${RED}✗ Invalid choice. Exiting.${NC}"
rm -f "$BINARY_NAME"
exit 1
;;
esac
# Step 5: Install the binary
echo ""
echo -e "${CYAN}[5/6]${NC} Installing binary to $INSTALL_PATH..."
if [ "$NEEDS_SUDO" = true ]; then
echo "Installing $BINARY_NAME (sudo required)..."
if sudo install -m 755 "$BINARY_NAME" "$INSTALL_PATH/$BINARY_NAME" > /dev/null 2>&1; then
echo -e "${GREEN}${NC} Installation successful"
else
echo -e "${RED}✗ Installation failed${NC}"
rm -f "$BINARY_NAME"
exit 1
fi
else
install -m 755 "$BINARY_NAME" "$INSTALL_PATH/$BINARY_NAME" > /dev/null 2>&1 &
INSTALL_PID=$!
spinner $INSTALL_PID "Installing $BINARY_NAME"
if wait $INSTALL_PID; then
echo -e "${GREEN}${NC} Installation successful"
else
echo -e "${RED}✗ Installation failed${NC}"
rm -f "$BINARY_NAME"
exit 1
fi
fi
rm -f "$BINARY_NAME"
# Step 6: Setup shell aliases and environment
echo ""
echo -e "${CYAN}[6/6]${NC} Setting up shell environment..."
# Detect shell
if [ -n "$ZSH_VERSION" ]; then
SHELL_RC="$HOME/.zshrc"
SHELL_NAME="zsh"
elif [ -n "$BASH_VERSION" ]; then
SHELL_RC="$HOME/.bashrc"
SHELL_NAME="bash"
else
# Default to bash
SHELL_RC="$HOME/.bashrc"
SHELL_NAME="bash"
fi
# Create alias setup script
ALIAS_SCRIPT="$PROJECT_ROOT/scripts/alias.sh"
# Add installation path to PATH if needed
if [[ ":$PATH:" != *":$INSTALL_PATH:"* ]]; then
# Check if PATH export already exists
if ! grep -q "export PATH.*$INSTALL_PATH" "$SHELL_RC" 2>/dev/null; then
echo "" >> "$SHELL_RC"
echo "# VideoTools installation path" >> "$SHELL_RC"
echo "export PATH=\"$INSTALL_PATH:\$PATH\"" >> "$SHELL_RC"
echo -e "${GREEN}${NC} Added $INSTALL_PATH to PATH in $SHELL_RC"
fi
fi
# Add alias sourcing if not already present
if ! grep -q "source.*alias.sh" "$SHELL_RC" 2>/dev/null; then
echo "" >> "$SHELL_RC"
echo "# VideoTools convenience aliases" >> "$SHELL_RC"
echo "source \"$ALIAS_SCRIPT\"" >> "$SHELL_RC"
echo -e "${GREEN}${NC} Added VideoTools aliases to $SHELL_RC"
fi
echo ""
echo "════════════════════════════════════════════════════════════════"
echo "Installation Complete!"
echo "════════════════════════════════════════════════════════════════"
echo ""
echo "Next steps:"
echo ""
echo "1. Reload your shell configuration:"
echo " source $SHELL_RC"
echo ""
echo "2. Run VideoTools:"
echo " VideoTools"
echo ""
echo "3. Available commands:"
echo " - VideoTools - Run the application"
echo " - VideoToolsRebuild - Force rebuild from source"
echo " - VideoToolsClean - Clean build artifacts and cache"
echo ""
echo "For more information, see BUILD_AND_RUN.md and DVD_USER_GUIDE.md"
echo ""