247 lines
7.9 KiB
Bash
Executable File
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 "$@"
|