#!/usr/bin/env bash # install.sh – Installation de TranscribeStation # Testé sur Debian 12 (Bookworm) et Debian 13 (Trixie) set -euo pipefail # ─── Couleurs terminal ──────────────────────────────────────────────────────── RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m' CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m' info() { echo -e "${CYAN}[INFO]${NC} $*"; } success() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERR]${NC} $*" >&2; exit 1; } step() { echo -e "\n${BOLD}$*${NC}"; } echo -e "${BOLD}" echo "╔══════════════════════════════════════════════╗" echo "║ TranscribeStation – Installation ║" echo "║ Debian 12/13 · Python · Qt6 ║" echo "╚══════════════════════════════════════════════╝" echo -e "${NC}" # ─── Vérifications préliminaires ───────────────────────────────────────────── if [[ $EUID -eq 0 ]]; then error "Ne pas lancer ce script en root. Utilisez votre compte normal." fi command -v python3 >/dev/null 2>&1 || error "python3 introuvable." PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') info "Python détecté : $PYTHON_VERSION" # ─── Étape 1 : Dépendances système ─────────────────────────────────────────── step "[1/6] Installation des dépendances système..." sudo apt-get update -qq sudo apt-get install -y \ python3 python3-pip python3-venv \ libhidapi-dev libhidapi-hidraw0 libusb-1.0-0 \ gstreamer1.0-plugins-good \ gstreamer1.0-plugins-bad \ gstreamer1.0-plugins-ugly \ gstreamer1.0-libav \ fonts-noto-color-emoji \ 2>&1 | grep -E "^(Inst|Conf|E:)" || true success "Dépendances système installées." # ─── Étape 2 : Environnement virtuel Python ─────────────────────────────────── step "[2/6] Création de l'environnement virtuel..." if [ -d ".venv" ]; then warn "Environnement .venv existant détecté — réutilisation." else python3 -m venv .venv success "Environnement virtuel créé dans .venv/" fi source .venv/bin/activate # ─── Étape 3 : Mise à jour de pip ──────────────────────────────────────────── step "[3/6] Mise à jour de pip..." pip install --upgrade pip --quiet success "pip mis à jour : $(pip --version | awk '{print $2}')" # ─── Étape 4 : Dépendances Python ──────────────────────────────────────────── step "[4/6] Installation des dépendances Python..." info "Installation de PySide6 (interface + lecteur audio)..." pip install "PySide6>=6.5.0" --quiet success "PySide6 $(pip show PySide6 | awk '/^Version/{print $2}')" info "Installation de numpy + soundfile (affichage waveform)..." pip install "numpy>=1.24.0" "soundfile>=0.12.0" --quiet success "numpy $(pip show numpy | awk '/^Version/{print $2}') soundfile $(pip show soundfile | awk '/^Version/{print $2}')" info "Installation de hid (support pédalier USB HID)..." if pip install "hid>=1.0.5" --quiet 2>/dev/null; then success "hid $(pip show hid | awk '/^Version/{print $2}')" else warn "Le paquet 'hid' n'a pas pu être installé automatiquement." warn "Tentative via hidapi..." if pip install "hidapi>=0.14.0" --quiet 2>/dev/null; then success "hidapi installé (alias hid)." else warn "Support pédalier désactivé. Pour l'activer plus tard :" warn " pip install hid ou pip install hidapi" fi fi info "Vérification des imports Python..." python3 - << 'PYCHECK' import importlib for pkg, mod in [("PySide6","PySide6.QtWidgets"),("numpy","numpy"), ("soundfile","soundfile"),("hid","hid")]: try: importlib.import_module(mod) print(f" \u2705 {pkg}") except ImportError: print(f" \u26a0\ufe0f {pkg} (non disponible)") PYCHECK # ─── Étape 5 : Règle udev pédalier Olympus ─────────────────────────────────── step "[5/6] Configuration udev pour le pédalier Olympus..." UDEV_FILE="/etc/udev/rules.d/99-olympus-pedal.rules" RULE='SUBSYSTEM=="hidraw", ATTRS{idVendor}=="07b4", MODE="0666", GROUP="plugdev"' if [ -f "$UDEV_FILE" ]; then warn "Règle udev déjà présente : $UDEV_FILE" else echo "$RULE" | sudo tee "$UDEV_FILE" > /dev/null sudo udevadm control --reload-rules sudo udevadm trigger success "Règle udev créée : $UDEV_FILE" fi if groups "$USER" | grep -q plugdev; then success "Utilisateur '$USER' déjà dans le groupe 'plugdev'." else sudo usermod -aG plugdev "$USER" success "Utilisateur '$USER' ajouté au groupe 'plugdev'." warn "Déconnectez-vous et reconnectez-vous pour activer le groupe." fi # ─── Étape 6 : Création du lanceur ─────────────────────────────────────────── step "[6/6] Création du script de lancement..." cat > launch.sh << 'LAUNCHEOF' #!/usr/bin/env bash SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/.venv/bin/activate" exec python "$SCRIPT_DIR/transcribe_station.py" "$@" LAUNCHEOF chmod +x launch.sh success "Script de lancement créé : ./launch.sh" # ─── Résumé ────────────────────────────────────────────────────────────────── echo "" echo -e "${GREEN}${BOLD}Installation terminée !${NC}" echo "" echo -e " Lancer l'application :" echo -e " ${CYAN}./launch.sh${NC}" echo -e " ou" echo -e " ${CYAN}source .venv/bin/activate && python transcribe_station.py${NC}" echo "" echo -e " ${YELLOW}Rappel :${NC} si vous avez été ajouté au groupe 'plugdev'," echo -e " déconnectez-vous/reconnectez-vous avant de brancher le pédalier." echo ""