All checks were successful
Python CI / test (push) Successful in 1m30s
Lint / lint (push) Successful in 1m8s
Tests / test (3.11) (push) Successful in 1m41s
Tests / test (3.12) (push) Successful in 1m42s
Tests / test (3.13) (push) Successful in 1m36s
Tests / test (3.14) (push) Successful in 1m17s
266 lines
6.7 KiB
Bash
Executable File
266 lines
6.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Debian/Ubuntu installation script for pyPhotoAlbum
|
|
# Creates a virtual environment and installs all dependencies
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
print_info() {
|
|
echo -e "${GREEN}[INFO]${NC} $1"
|
|
}
|
|
|
|
print_warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
print_step() {
|
|
echo -e "${BLUE}[STEP]${NC} $1"
|
|
}
|
|
|
|
# Get the directory where this script is located
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
VENV_DIR="$SCRIPT_DIR/venv"
|
|
INSTALL_DIR="$HOME/.local"
|
|
BIN_DIR="$INSTALL_DIR/bin"
|
|
|
|
echo "========================================"
|
|
echo " pyPhotoAlbum Debian Installation "
|
|
echo "========================================"
|
|
echo ""
|
|
|
|
# Check if running on Debian/Ubuntu
|
|
if [ -f /etc/os-release ]; then
|
|
. /etc/os-release
|
|
if [[ "$ID" != "debian" && "$ID" != "ubuntu" && "$ID_LIKE" != *"debian"* && "$ID_LIKE" != *"ubuntu"* ]]; then
|
|
print_warn "This script is designed for Debian/Ubuntu-based systems."
|
|
print_warn "Detected: $PRETTY_NAME"
|
|
read -p "Continue anyway? [y/N]: " continue_choice
|
|
if [[ ! "$continue_choice" =~ ^[Yy]$ ]]; then
|
|
exit 1
|
|
fi
|
|
else
|
|
print_info "Detected: $PRETTY_NAME"
|
|
fi
|
|
fi
|
|
|
|
# Check for required files
|
|
if [ ! -f "$SCRIPT_DIR/pyproject.toml" ]; then
|
|
print_error "pyproject.toml not found. Please run this script from the project root."
|
|
exit 1
|
|
fi
|
|
|
|
# Step 1: Install system dependencies
|
|
print_step "Installing system dependencies..."
|
|
echo ""
|
|
|
|
# Check if we need sudo
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
SUDO="sudo"
|
|
else
|
|
SUDO=""
|
|
fi
|
|
|
|
$SUDO apt update
|
|
|
|
# Install Python and venv support
|
|
print_info "Installing Python and venv support..."
|
|
$SUDO apt install -y python3 python3-venv python3-pip
|
|
|
|
# Install system libraries required for PyQt6 and OpenGL
|
|
print_info "Installing Qt6 and OpenGL libraries..."
|
|
$SUDO apt install -y \
|
|
libgl1-mesa-dev \
|
|
libglu1-mesa-dev \
|
|
libxcb-xinerama0 \
|
|
libxcb-cursor0 \
|
|
libxkbcommon0 \
|
|
libdbus-1-3 \
|
|
libegl1 \
|
|
libfontconfig1 \
|
|
libfreetype6 \
|
|
libx11-6 \
|
|
libx11-xcb1 \
|
|
libxcb1 \
|
|
libxcb-glx0 \
|
|
libxcb-icccm4 \
|
|
libxcb-image0 \
|
|
libxcb-keysyms1 \
|
|
libxcb-randr0 \
|
|
libxcb-render0 \
|
|
libxcb-render-util0 \
|
|
libxcb-shape0 \
|
|
libxcb-shm0 \
|
|
libxcb-sync1 \
|
|
libxcb-xfixes0 \
|
|
libxcb-xkb1 \
|
|
libxkbcommon-x11-0 \
|
|
libglib2.0-0 \
|
|
libgtk-3-0 || print_warn "Some packages may not be available, continuing..."
|
|
|
|
echo ""
|
|
|
|
# Step 2: Create virtual environment
|
|
print_step "Creating virtual environment..."
|
|
echo ""
|
|
|
|
if [ -d "$VENV_DIR" ]; then
|
|
print_warn "Virtual environment already exists at $VENV_DIR"
|
|
read -p "Remove and recreate? [y/N]: " recreate_choice
|
|
if [[ "$recreate_choice" =~ ^[Yy]$ ]]; then
|
|
print_info "Removing existing virtual environment..."
|
|
rm -rf "$VENV_DIR"
|
|
else
|
|
print_info "Using existing virtual environment..."
|
|
fi
|
|
fi
|
|
|
|
if [ ! -d "$VENV_DIR" ]; then
|
|
print_info "Creating virtual environment at $VENV_DIR..."
|
|
python3 -m venv "$VENV_DIR"
|
|
fi
|
|
|
|
# Activate virtual environment
|
|
source "$VENV_DIR/bin/activate"
|
|
|
|
# Upgrade pip
|
|
print_info "Upgrading pip..."
|
|
pip install --upgrade pip
|
|
|
|
echo ""
|
|
|
|
# Step 3: Install Python dependencies
|
|
print_step "Installing Python dependencies..."
|
|
echo ""
|
|
|
|
print_info "Installing pyPhotoAlbum and its dependencies..."
|
|
pip install -e "$SCRIPT_DIR"
|
|
|
|
echo ""
|
|
|
|
# Step 4: Create launcher script
|
|
print_step "Creating launcher script..."
|
|
echo ""
|
|
|
|
mkdir -p "$BIN_DIR"
|
|
|
|
cat > "$BIN_DIR/pyphotoalbum" << EOF
|
|
#!/bin/bash
|
|
# pyPhotoAlbum launcher script
|
|
# Activates the virtual environment and runs the application
|
|
|
|
SCRIPT_DIR="$SCRIPT_DIR"
|
|
VENV_DIR="$VENV_DIR"
|
|
|
|
# Activate venv and run
|
|
source "\$VENV_DIR/bin/activate"
|
|
exec python "\$SCRIPT_DIR/pyPhotoAlbum/main.py" "\$@"
|
|
EOF
|
|
|
|
chmod +x "$BIN_DIR/pyphotoalbum"
|
|
print_info "Launcher script created at $BIN_DIR/pyphotoalbum"
|
|
|
|
echo ""
|
|
|
|
# Step 5: Install desktop integration
|
|
print_step "Installing desktop integration..."
|
|
echo ""
|
|
|
|
DESKTOP_DIR="$HOME/.local/share/applications"
|
|
ICON_DIR="$HOME/.local/share/icons/hicolor"
|
|
|
|
mkdir -p "$DESKTOP_DIR"
|
|
mkdir -p "$ICON_DIR/256x256/apps"
|
|
|
|
# Create desktop file with correct path
|
|
cat > "$DESKTOP_DIR/pyphotoalbum.desktop" << EOF
|
|
[Desktop Entry]
|
|
Type=Application
|
|
Name=pyPhotoAlbum
|
|
GenericName=Photo Album Designer
|
|
Comment=Design photo albums and export them to PDF
|
|
Exec=$BIN_DIR/pyphotoalbum %F
|
|
Icon=pyphotoalbum
|
|
Terminal=false
|
|
Categories=Graphics;Photography;Qt;
|
|
Keywords=photo;album;pdf;design;layout;
|
|
MimeType=application/x-pyphotoalbum-project;
|
|
StartupNotify=true
|
|
StartupWMClass=pyPhotoAlbum
|
|
Actions=NewProject;
|
|
|
|
[Desktop Action NewProject]
|
|
Name=New Project
|
|
Exec=$BIN_DIR/pyphotoalbum --new
|
|
EOF
|
|
|
|
print_info "Desktop file created at $DESKTOP_DIR/pyphotoalbum.desktop"
|
|
|
|
# Copy icon
|
|
if [ -f "$SCRIPT_DIR/pyPhotoAlbum/icons/icon.png" ]; then
|
|
cp "$SCRIPT_DIR/pyPhotoAlbum/icons/icon.png" "$ICON_DIR/256x256/apps/pyphotoalbum.png"
|
|
print_info "Icon installed"
|
|
|
|
# Generate additional icon sizes if ImageMagick is available
|
|
if command -v convert &> /dev/null || command -v magick &> /dev/null; then
|
|
for size in 48 64 128; do
|
|
mkdir -p "$ICON_DIR/${size}x${size}/apps"
|
|
if command -v magick &> /dev/null; then
|
|
magick "$SCRIPT_DIR/pyPhotoAlbum/icons/icon.png" -resize ${size}x${size} "$ICON_DIR/${size}x${size}/apps/pyphotoalbum.png" 2>/dev/null
|
|
else
|
|
convert "$SCRIPT_DIR/pyPhotoAlbum/icons/icon.png" -resize ${size}x${size} "$ICON_DIR/${size}x${size}/apps/pyphotoalbum.png" 2>/dev/null
|
|
fi
|
|
done
|
|
print_info "Additional icon sizes generated"
|
|
fi
|
|
fi
|
|
|
|
# Update desktop database
|
|
if command -v update-desktop-database &> /dev/null; then
|
|
update-desktop-database "$DESKTOP_DIR" 2>/dev/null || true
|
|
fi
|
|
|
|
# Update icon cache
|
|
if command -v gtk-update-icon-cache &> /dev/null; then
|
|
gtk-update-icon-cache -f "$ICON_DIR" 2>/dev/null || true
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# Deactivate venv
|
|
deactivate
|
|
|
|
# Final message
|
|
echo "========================================"
|
|
echo -e "${GREEN} Installation complete!${NC}"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "You can now run pyPhotoAlbum by:"
|
|
echo " 1) Running 'pyphotoalbum' in the terminal"
|
|
echo " 2) Finding 'pyPhotoAlbum' in your application menu"
|
|
echo ""
|
|
|
|
# Check if ~/.local/bin is in PATH
|
|
if [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
|
|
print_warn "~/.local/bin is not in your PATH"
|
|
echo ""
|
|
echo "Add this to your ~/.bashrc or ~/.profile:"
|
|
echo " export PATH=\"\$HOME/.local/bin:\$PATH\""
|
|
echo ""
|
|
echo "Then run: source ~/.bashrc"
|
|
fi
|
|
|
|
echo ""
|
|
echo "To run directly from source directory:"
|
|
echo " $SCRIPT_DIR/launch-pyphotoalbum.sh"
|
|
echo ""
|