From b629d57c3496f4619564efd8b243bf6898a49f23 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 6 Nov 2025 07:45:36 +0000 Subject: [PATCH 1/3] =?UTF-8?q?Am=C3=A9liorer=20la=20documentation=20d'ins?= =?UTF-8?q?tallation=20et=20ajouter=20des=20scripts=20automatiques?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ajouter setup-deps.sh : script d'installation automatique de libsoxr et libasound2 - Corriger setup-env.sh : utiliser $HOME au lieu de /root pour la portabilité - Mettre à jour INSTALL_LIBSOXR.md : ajouter méthode rapide avec les scripts - Mettre à jour INSTALL_NOTES.md : référencer les scripts d'installation - Mettre à jour Readme.md : ajouter section démarrage rapide Ces changements facilitent l'installation dans les environnements sans sudo (comme Claude Code) en automatisant le téléchargement et l'extraction des dépendances système nécessaires. --- INSTALL_LIBSOXR.md | 46 +++++++++++++++++++++------------- INSTALL_NOTES.md | 17 ++++++++++++- Readme.md | 27 ++++++++++++++++++++ setup-deps.sh | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 134 insertions(+), 18 deletions(-) create mode 100755 setup-deps.sh diff --git a/INSTALL_LIBSOXR.md b/INSTALL_LIBSOXR.md index a3c4129f..b9c70c4d 100644 --- a/INSTALL_LIBSOXR.md +++ b/INSTALL_LIBSOXR.md @@ -152,7 +152,22 @@ cargo test ### Configuration initiale (à faire une seule fois) -Dans une session Claude Code (https://claude.ai/code), vous n'avez pas de droits sudo. Suivez ces étapes : +Dans une session Claude Code (https://claude.ai/code), vous n'avez pas de droits sudo. + +**🚀 Méthode rapide (recommandée) :** + +```bash +# 1. Installation automatique des dépendances (une seule fois) +./setup-deps.sh + +# 2. Configuration des variables d'environnement (à chaque session) +source setup-env.sh + +# 3. Compilation +cargo build +``` + +**📋 Méthode manuelle (si les scripts ne fonctionnent pas) :** #### 1. Installation des dépendances @@ -184,23 +199,13 @@ export LD_LIBRARY_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH" export RUSTFLAGS="-L $HOME/.local/usr/lib/x86_64-linux-gnu" ``` -**Astuce :** Copier ces trois lignes dans un fichier `setup-env.sh` à la racine du projet : - -```bash -cat > setup-env.sh << 'EOF' -export PKG_CONFIG_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH" -export LD_LIBRARY_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH" -export RUSTFLAGS="-L $HOME/.local/usr/lib/x86_64-linux-gnu" -EOF -``` - -Puis dans chaque session : +Ou utilisez le script fourni : ```bash source setup-env.sh ``` -⚠️ **NE PAS committer `setup-env.sh`** - ajouter au `.gitignore` +⚠️ **Note :** Les scripts `setup-deps.sh` et `setup-env.sh` sont déjà dans `.gitignore` #### 3. Vérifier l'installation @@ -228,9 +233,16 @@ cargo run --package pmoparadise --example play_and_cache --features full -- 0 À chaque fois que vous démarrez une nouvelle session Claude Code : -1. **Exporter les variables d'environnement** (ou `source setup-env.sh`) -2. Compiler avec `cargo build` -3. Exécuter les exemples ou tests +```bash +# 1. Configuration de l'environnement +source setup-env.sh + +# 2. Compilation +cargo build + +# 3. Exécution des exemples +cargo run --package pmoparadise --example play_and_cache --features full -- 0 +``` **IMPORTANT :** Si vous oubliez d'exporter les variables, vous obtiendrez des erreurs comme : ``` @@ -244,7 +256,7 @@ ou rust-lld: error: unable to find library -lasound ``` -Solution : Exporter les variables et recompiler. +**Solution :** Exécutez `source setup-env.sh` et recompilez. ### Notes importantes diff --git a/INSTALL_NOTES.md b/INSTALL_NOTES.md index cf2fad54..77d256e6 100644 --- a/INSTALL_NOTES.md +++ b/INSTALL_NOTES.md @@ -29,7 +29,22 @@ brew install libsoxr apk add soxr-dev alsa-lib-dev ``` -**Sans privilèges root** : Si vous n'avez pas les droits sudo, consultez `INSTALL_LIBSOXR.md` pour l'installation locale de `libsoxr` et `libasound2`. +**Sans privilèges root (Claude Code, environnements sans sudo)** : + +🚀 **Installation automatique** : + +```bash +# 1. Installation des dépendances (une seule fois) +./setup-deps.sh + +# 2. Configuration de l'environnement (à chaque session) +source setup-env.sh + +# 3. Compilation +cargo build +``` + +Pour plus de détails, consultez `INSTALL_LIBSOXR.md`. --- diff --git a/Readme.md b/Readme.md index 0dc06507..a604739d 100644 --- a/Readme.md +++ b/Readme.md @@ -1,5 +1,32 @@ # Développement de l'application PMOMusic en RUST +## 🚀 Démarrage rapide + +### Installation des dépendances (environnement sans sudo) + +Pour compiler PMOMusic dans un environnement sans privilèges sudo (comme Claude Code) : + +```bash +# 1. Installation automatique de libsoxr et libasound2 (une seule fois) +./setup-deps.sh + +# 2. Configuration de l'environnement (à chaque nouvelle session) +source setup-env.sh + +# 3. Compilation +cargo build + +# 4. Test de l'exemple Radio Paradise +cargo run --package pmoparadise --example play_and_cache --features full -- 0 +``` + +### Documentation + +- **[INSTALL_NOTES.md](INSTALL_NOTES.md)** - Guide d'installation général +- **[INSTALL_LIBSOXR.md](INSTALL_LIBSOXR.md)** - Installation détaillée de libsoxr et ALSA + +--- + ## Création de la structure ```bash diff --git a/setup-deps.sh b/setup-deps.sh new file mode 100755 index 00000000..d07de01c --- /dev/null +++ b/setup-deps.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Script d'installation automatique des dépendances soxr et alsa pour PMOMusic +# Usage: ./setup-deps.sh + +set -e + +echo "=========================================" +echo "Installation des dépendances PMOMusic" +echo "=========================================" +echo "" + +# Créer le répertoire local +echo "1. Création du répertoire ~/.local" +mkdir -p ~/.local +cd ~/.local + +# Télécharger les packages +echo "" +echo "2. Téléchargement des packages libsoxr et libasound2" +apt-get download libsoxr-dev libsoxr0 libasound2-dev libasound2t64 + +# Extraire les packages +echo "" +echo "3. Extraction des packages" +dpkg -x libsoxr-dev_*.deb . +dpkg -x libsoxr0_*.deb . +dpkg -x libasound2-dev_*.deb . +dpkg -x libasound2t64_*.deb . + +# Vérifier l'installation +echo "" +echo "4. Vérification de l'installation" +if [ -f usr/lib/x86_64-linux-gnu/pkgconfig/soxr.pc ]; then + echo " ✓ libsoxr installé" +else + echo " ✗ Erreur: libsoxr non trouvé" + exit 1 +fi + +if [ -f usr/lib/x86_64-linux-gnu/pkgconfig/alsa.pc ]; then + echo " ✓ libasound2 installé" +else + echo " ✗ Erreur: libasound2 non trouvé" + exit 1 +fi + +# Retourner au projet +cd - > /dev/null + +echo "" +echo "=========================================" +echo "Installation terminée avec succès !" +echo "=========================================" +echo "" +echo "Pour compiler le projet, exportez les variables d'environnement :" +echo "" +echo " source setup-env.sh" +echo "" +echo "Puis compilez avec :" +echo "" +echo " cargo build" +echo "" From 590cd655d6208b94ee7de13656a95a275e35fe74 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 6 Nov 2025 07:47:10 +0000 Subject: [PATCH 2/3] Documenter le contenu de setup-env.sh dans la documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - INSTALL_LIBSOXR.md : Ajouter le contenu complet du script setup-env.sh - Readme.md : Montrer comment créer setup-env.sh en une commande Puisque setup-env.sh est dans .gitignore (configuration locale), les utilisateurs doivent le créer eux-mêmes. La documentation fournit maintenant le contenu exact à utiliser. --- INSTALL_LIBSOXR.md | 28 ++++++++++++++++++++++++++-- Readme.md | 17 ++++++++++++++--- 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/INSTALL_LIBSOXR.md b/INSTALL_LIBSOXR.md index b9c70c4d..3632ccac 100644 --- a/INSTALL_LIBSOXR.md +++ b/INSTALL_LIBSOXR.md @@ -199,13 +199,37 @@ export LD_LIBRARY_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH" export RUSTFLAGS="-L $HOME/.local/usr/lib/x86_64-linux-gnu" ``` -Ou utilisez le script fourni : +**Astuce :** Créez un fichier `setup-env.sh` pour ne pas avoir à retaper ces commandes à chaque session : + +```bash +cat > setup-env.sh << 'EOF' +#!/bin/bash +# Script de configuration des variables d'environnement pour PMOMusic +# Usage: source setup-env.sh + +# Configuration des chemins pour libsoxr et libasound2 +export PKG_CONFIG_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH" +export LD_LIBRARY_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH" +export RUSTFLAGS="-L $HOME/.local/usr/lib/x86_64-linux-gnu" + +echo "Variables d'environnement configurées pour PMOMusic" +echo " PKG_CONFIG_PATH=$PKG_CONFIG_PATH" +echo " LD_LIBRARY_PATH=$LD_LIBRARY_PATH" +echo " RUSTFLAGS=$RUSTFLAGS" +echo "" +echo "Vous pouvez maintenant compiler avec: cargo build" +EOF + +chmod +x setup-env.sh +``` + +Puis dans chaque session : ```bash source setup-env.sh ``` -⚠️ **Note :** Les scripts `setup-deps.sh` et `setup-env.sh` sont déjà dans `.gitignore` +⚠️ **Note :** Le fichier `setup-env.sh` est dans `.gitignore` (configuration locale), vous devez le créer vous-même avec le contenu ci-dessus. #### 3. Vérifier l'installation diff --git a/Readme.md b/Readme.md index a604739d..f2785fe9 100644 --- a/Readme.md +++ b/Readme.md @@ -10,16 +10,27 @@ Pour compiler PMOMusic dans un environnement sans privilèges sudo (comme Claude # 1. Installation automatique de libsoxr et libasound2 (une seule fois) ./setup-deps.sh -# 2. Configuration de l'environnement (à chaque nouvelle session) +# 2. Créer le fichier setup-env.sh (une seule fois, voir INSTALL_LIBSOXR.md pour le contenu) +cat > setup-env.sh << 'EOF' +#!/bin/bash +export PKG_CONFIG_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH" +export LD_LIBRARY_PATH="$HOME/.local/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH" +export RUSTFLAGS="-L $HOME/.local/usr/lib/x86_64-linux-gnu" +echo "Variables d'environnement configurées pour PMOMusic" +EOF + +# 3. Configuration de l'environnement (à chaque nouvelle session) source setup-env.sh -# 3. Compilation +# 4. Compilation cargo build -# 4. Test de l'exemple Radio Paradise +# 5. Test de l'exemple Radio Paradise cargo run --package pmoparadise --example play_and_cache --features full -- 0 ``` +⚠️ **Note :** Le fichier `setup-env.sh` est dans `.gitignore` car il contient une configuration locale. + ### Documentation - **[INSTALL_NOTES.md](INSTALL_NOTES.md)** - Guide d'installation général From 15eb4da6690136d4da827b2e65ec486132fd318d Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 6 Nov 2025 07:54:09 +0000 Subject: [PATCH 3/3] Corriger la race condition dans add_from_url et add_from_reader MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problème : Les fonctions add_from_url() et add_from_reader() retournaient le pk immédiatement après avoir lancé l'ingestion en arrière-plan, mais AVANT que le fichier soit créé sur disque. Cela causait une erreur "Cache entry not found" quand la playlist appelait is_valid_pk() qui vérifie que le fichier existe. Solution : Attendre (jusqu'à 5 secondes max) que le fichier soit créé sur disque avant de retourner le pk. Cela permet au cache progressif de fonctionner correctement : le fichier existe et peut commencer à être lu pendant que le téléchargement continue en arrière-plan. Changements : - add_from_url() : attente de la création du fichier avant retour - add_from_reader() : attente de la création du fichier avant retour - Cas où download déjà en cours : attente également de la création du fichier Résultat testé : ✓ L'exemple play_and_cache fonctionne maintenant sans erreur ✓ Le pipeline de download se termine avec succès ✓ Les pistes sont correctement ajoutées à la playlist --- pmocache/src/cache.rs | 46 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/pmocache/src/cache.rs b/pmocache/src/cache.rs index 879cc8be..0057213d 100755 --- a/pmocache/src/cache.rs +++ b/pmocache/src/cache.rs @@ -181,8 +181,18 @@ impl Cache { { let downloads = self.downloads.read().await; if downloads.contains_key(&pk) { - // Download déjà en cours pour ce contenu, retourner la clé + // Download déjà en cours pour ce contenu, attendre que le fichier soit créé tracing::debug!("Download already in progress for pk {}", pk); + drop(downloads); // Libérer le lock avant la boucle d'attente + + // Attendre que le fichier soit créé (pour le cache progressif) + let file_path = self.get_file_path(&pk); + let mut attempts = 0; + while !file_path.exists() && attempts < 100 { + tokio::time::sleep(std::time::Duration::from_millis(50)).await; + attempts += 1; + } + return Ok(pk); } } @@ -215,6 +225,23 @@ impl Cache { downloads_clone.write().await.remove(&pk_clone); }); + // Attendre que le fichier soit créé sur disque (pour le cache progressif) + // On attend jusqu'à 5 secondes maximum + let file_path = self.get_file_path(&pk); + let mut attempts = 0; + while !file_path.exists() && attempts < 100 { + tokio::time::sleep(std::time::Duration::from_millis(50)).await; + attempts += 1; + } + + if !file_path.exists() { + tracing::warn!( + "File {} not created after waiting 5 seconds, pk={}", + file_path.display(), + pk + ); + } + Ok(pk) } @@ -319,6 +346,23 @@ impl Cache { downloads_clone.write().await.remove(&pk_clone); }); + // Attendre que le fichier soit créé sur disque (pour le cache progressif) + // On attend jusqu'à 5 secondes maximum + let file_path = self.get_file_path(&pk); + let mut attempts = 0; + while !file_path.exists() && attempts < 100 { + tokio::time::sleep(std::time::Duration::from_millis(50)).await; + attempts += 1; + } + + if !file_path.exists() { + tracing::warn!( + "File {} not created after waiting 5 seconds, pk={}", + file_path.display(), + pk + ); + } + Ok(pk) }