pyPhotoAlbum/install.sh
2025-11-11 16:02:02 +00:00

247 lines
7.9 KiB
Bash
Executable File

#!/bin/bash
# Installation script for pyPhotoAlbum
# Supports both system-wide and user-local installation
# Don't use set -e for dependency installation as some packages may already be installed
# We'll handle errors individually where needed
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Print functions
print_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Check if running as root
is_root() {
[ "$(id -u)" -eq 0 ]
}
# Detect distribution
detect_distro() {
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "$ID"
else
echo "unknown"
fi
}
# Install system dependencies
install_dependencies() {
local distro=$(detect_distro)
print_info "Detected distribution: $distro"
case "$distro" in
fedora)
print_info "Installing dependencies for Fedora..."
# Use --skip-unavailable and --allowerasing to handle already installed packages
sudo dnf install -y --skip-unavailable python3 python3-pip python3-pyqt6 python3-pyopengl \
python3-numpy python3-pillow python3-reportlab python3-lxml || {
print_warn "Some packages may already be installed or unavailable, continuing..."
}
;;
arch|cachyos)
print_info "Installing dependencies for Arch/CachyOS..."
sudo pacman -S --needed --noconfirm python python-pip python-pyqt6 \
python-pyopengl python-numpy python-pillow python-reportlab python-lxml
;;
ubuntu|debian)
print_info "Installing dependencies for Ubuntu/Debian..."
sudo apt update
sudo apt install -y python3 python3-pip python3-pyqt6 python3-opengl \
python3-numpy python3-pil python3-reportlab python3-lxml
;;
*)
print_warn "Unknown distribution. Please install dependencies manually."
print_info "Required packages: python3, python3-pip, PyQt6, PyOpenGL, numpy, Pillow, reportlab, lxml"
;;
esac
}
# Install Python package
install_package() {
local install_mode=$1
if [ "$install_mode" = "system" ]; then
print_info "Installing pyPhotoAlbum system-wide..."
sudo pip install .
else
print_info "Installing pyPhotoAlbum for current user..."
pip install --user .
fi
}
# Install desktop integration
install_desktop_integration() {
local install_mode=$1
if [ "$install_mode" = "system" ]; then
print_info "Installing desktop integration system-wide..."
# Install desktop file
sudo install -Dm644 pyphotoalbum.desktop \
/usr/share/applications/pyphotoalbum.desktop
# Install icons in multiple sizes for GNOME
print_info "Installing application icons..."
# Install main icon (256x256)
sudo install -Dm644 pyPhotoAlbum/icons/icon.png \
/usr/share/icons/hicolor/256x256/apps/pyphotoalbum.png
# Install additional sizes if they exist
for size in 16 22 24 32 48 64 128 512; do
icon_file="pyPhotoAlbum/icons/icon-${size}x${size}.png"
if [ -f "$icon_file" ]; then
sudo install -Dm644 "$icon_file" \
"/usr/share/icons/hicolor/${size}x${size}/apps/pyphotoalbum.png"
fi
done
# Update desktop database
if command -v update-desktop-database &> /dev/null; then
sudo update-desktop-database /usr/share/applications
fi
# Update icon cache
if command -v gtk-update-icon-cache &> /dev/null; then
print_info "Updating icon cache..."
sudo gtk-update-icon-cache -f /usr/share/icons/hicolor/
fi
else
print_info "Installing desktop integration for current user..."
# Create directories if they don't exist
mkdir -p ~/.local/share/applications
# Copy desktop file and update Exec paths to use full path
cp pyphotoalbum.desktop ~/.local/share/applications/
sed -i "s|Exec=pyphotoalbum|Exec=$HOME/.local/bin/pyphotoalbum|g" ~/.local/share/applications/pyphotoalbum.desktop
# Install icons in multiple sizes for GNOME
print_info "Installing application icons..."
# Install main icon (256x256)
mkdir -p ~/.local/share/icons/hicolor/256x256/apps
cp pyPhotoAlbum/icons/icon.png ~/.local/share/icons/hicolor/256x256/apps/pyphotoalbum.png
# Generate and install additional sizes for better display
if command -v magick &> /dev/null || command -v convert &> /dev/null; then
for size in 48 64 128; do
mkdir -p ~/.local/share/icons/hicolor/${size}x${size}/apps
if command -v magick &> /dev/null; then
magick pyPhotoAlbum/icons/icon.png -resize ${size}x${size} ~/.local/share/icons/hicolor/${size}x${size}/apps/pyphotoalbum.png 2>/dev/null
else
convert pyPhotoAlbum/icons/icon.png -resize ${size}x${size} ~/.local/share/icons/hicolor/${size}x${size}/apps/pyphotoalbum.png 2>/dev/null
fi
done
fi
# Install additional sizes if they exist
for size in 16 22 24 32 48 64 128 512; do
icon_file="pyPhotoAlbum/icons/icon-${size}x${size}.png"
if [ -f "$icon_file" ]; then
mkdir -p ~/.local/share/icons/hicolor/${size}x${size}/apps
cp "$icon_file" ~/.local/share/icons/hicolor/${size}x${size}/apps/pyphotoalbum.png
fi
done
# Update desktop database
if command -v update-desktop-database &> /dev/null; then
update-desktop-database ~/.local/share/applications
fi
# Update icon cache
if command -v gtk-update-icon-cache &> /dev/null; then
print_info "Updating icon cache..."
gtk-update-icon-cache -f ~/.local/share/icons/hicolor/
fi
fi
}
# Main installation
main() {
echo "========================================"
echo " pyPhotoAlbum Installation Script "
echo "========================================"
echo ""
# Check for required files
if [ ! -f "pyproject.toml" ]; then
print_error "pyproject.toml not found. Please run this script from the project root."
exit 1
fi
# Determine installation mode
local install_mode="user"
if is_root || [ "${1}" = "--system" ]; then
install_mode="system"
fi
print_info "Installation mode: $install_mode"
echo ""
# Ask user what to install
echo "What would you like to install?"
echo "1) Dependencies only"
echo "2) Application only (no dependencies)"
echo "3) Everything (recommended)"
echo "4) Exit"
echo ""
read -p "Enter your choice [1-4]: " choice
case "$choice" in
1)
install_dependencies
;;
2)
install_package "$install_mode"
install_desktop_integration "$install_mode"
;;
3)
install_dependencies
install_package "$install_mode"
install_desktop_integration "$install_mode"
;;
4)
print_info "Installation cancelled."
exit 0
;;
*)
print_error "Invalid choice. Exiting."
exit 1
;;
esac
echo ""
print_info "Installation complete!"
echo ""
echo "You can now run pyPhotoAlbum by:"
echo " 1) Running 'pyphotoalbum' in the terminal"
echo " 2) Finding 'pyPhotoAlbum' in your application menu"
echo ""
if [ "$install_mode" = "user" ]; then
print_warn "Note: If the 'pyphotoalbum' command is not found, make sure ~/.local/bin is in your PATH"
echo "Add this to your ~/.bashrc or ~/.zshrc:"
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
fi
}
# Run main function
main "$@"