#!/bin/bash # Définition des paramètres par défaut num_files=100 # Nombre de fichiers à inclure dans le M3U par défaut directory="$PWD" # Répertoire par défaut à scanner date_format=$(date +"%Y%m%d_%H%M%S") # Fonction pour afficher l'utilisation du script usage() { echo "Utilisation : $0 [-EU] [-n ] [-d ] [-o ]" echo "Options :" echo " -n : Nombre de fichiers à inclure dans le M3U" echo " -d : Répertoire à scanner (y compris les sous-répertoires)" echo " -o : Nom du fichier M3U de sortie" echo " -E : Recherche des doublons basée sur l'empreinte auditive" echo " -U : Mise à jour de la base de données" exit 1 } # Temps de début d'exécution start_time=$(date +%s) # search_type search_type="S" # standard # Analyse des options de ligne de commande while getopts "n:d:o:EU" opt; do case $opt in E) search_type="E" # empreintes identiques ;; U) search_type="U" # mise à jour de la base ;; n) num_files=$OPTARG ;; d) directory=$OPTARG ;; o) output_file=$OPTARG ;; \?) echo "Option non valide : -$OPTARG" >&2 usage ;; esac done # Définition du dossier des paramètres CONFIG_DIR=${HOME}/.config/cedrix/generate_playlist if [ ! -d "$CONFIG_DIR" ]; then mkdir -p ${CONFIG_DIR} fi # Vérifier si le fichier user-dirs.dirs existe if [[ -f ~/.config/user-dirs.dirs ]]; then # Charger les variables depuis le fichier user-dirs.dirs source ~/.config/user-dirs.dirs # Vérifier si la variable XDG_MUSIC_DIR est définie if [[ -v XDG_MUSIC_DIR ]]; then # Le répertoire XDG_MUSIC_DIR existe mkdir -p "$XDG_MUSIC_DIR/playlists" output_file="$XDG_MUSIC_DIR/playlists/playlist_${date_format}.m3u" else # La variable XDG_MUSIC_DIR n'est pas définie output_file="$HOME/playlist_${date_format}.m3u" fi else # Le fichier user-dirs.dirs n'existe pas output_file="$HOME/playlist_${date_format}.m3u" fi # Vérification si le répertoire existe if [ ! -d "$directory" ]; then echo "Le répertoire spécifié n'existe pas : $directory" usage fi # Création d'un fichier temporaire pour stocker la liste des fichiers audio temp_file=$(mktemp) count=0 # Si l'option -E est spécifiée, rechercher les doublons basés sur l'empreinte auditive if [ "$search_type" == "S" ]; then echo "Recherche en cours des $num_files derniers fichiers audios dans \"$directory\"" find "$directory" -type f \( -name "*.mp3" -o -name "*.opus" -o -name "*.ogg" -o -name "*.m4a" \) -exec stat --format="%Z %n" {} + > "$temp_file" echo "Nombre de fichiers audios trouvé dans $directory : "$(wc -l "$temp_file") # Création de la liste des fichiers audio les plus récents à partir du fichier temporaire sort -n -r -o "$temp_file" "$temp_file" head -n "$num_files" "$temp_file" | awk '{print $2}' > "$output_file" elif [ "$search_type" == "E" ]; then # Code pour rechercher les doublons basés sur l'empreinte auditive echo "Option -E spécifiée : Recherche des doublons basés sur l'empreinte auditive. Veuillez patienter ..." # Chemin de la base de données SQLite db_file=${CONFIG_DIR}/database.sqlite # Requête SQL pour récupérer les fichiers avec des empreintes identiques query="SELECT acoustid, GROUP_CONCAT(file_id) AS file_ids, COUNT(*) AS count FROM metadata GROUP BY acoustid HAVING count > 1;" # Exécuter la requête SQL et afficher les résultats sqlite3 "$db_file" "$query"| while IFS='|' read -r acoustid file_ids count; do echo "Empreinte digitale ID : $acoustid" echo "Fichiers associés : $file_ids" echo "Nombre de fichiers : $count" echo "-------------------------" done exit elif [ "$search_type" == "U" ]; then # Code pour rechercher les doublons basés sur l'empreinte auditive echo "Mise à jour de la base de données. Le traitement peut être un peu long. Veuillez patienter ..." # Vérifier si fpcalc est installé et l'installer si nécessaire if ! command -v fpcalc &>/dev/null; then echo "Téléchargement de fpcalc..." mkdir -p "$HOME/.local/bin" wget -O /tmp/chromaprint.tar.gz https://github.com/acoustid/chromaprint/releases/download/v1.5.1/chromaprint-fpcalc-1.5.1-linux-x86_64.tar.gz tar -xzf /tmp/chromaprint.tar.gz -C "$HOME/.local/bin" --strip-components=1 rm /tmp/chromaprint.tar.gz chmod +x "$HOME/.local/bin/fpcalc" echo "fpcalc installé avec succès." fi # Vérifier si PHP est installé if ! command -v php &>/dev/null; then echo "PHP n'est pas installé. Installation en cours..." if command -v dnf &>/dev/null; then sudo dnf install -y php elif command -v apt &>/dev/null; then sudo apt install -y php elif command -v yum &>/dev/null; then sudo yum install -y php else echo "Système de gestion de paquets non pris en charge." exit 1 fi echo "PHP installé avec succès." fi # Vérifier si SQLite pour PHP est installé if ! php -m | grep -q "sqlite3"; then echo "SQLite pour PHP n'est pas installé. Installation en cours..." if command -v dnf &>/dev/null; then sudo dnf install -y php-sqlite3 elif command -v apt &>/dev/null; then sudo apt install -y php-sqlite3 elif command -v yum &>/dev/null; then sudo yum install -y php-sqlite3 else echo "Système de gestion de paquets non pris en charge." exit 1 fi echo "SQLite pour PHP installé avec succès." fi # Chemin de la base de données SQLite db_file=${CONFIG_DIR}/database.sqlite # Chemin complet du script PHP php_script="$(dirname "$0")/generate_playlist_fp.php" # Appeler le script PHP avec les paramètres appropriés php "$php_script" "$directory" "$db_file" fi echo -e " and more...\n" # Suppression du fichier temporaire rm -v "$temp_file" # ajout du nombre de fichiers de la playlist dans le nom du fichier num_files_real=$(wc -l $output_file) # Extraire le nom de fichier sans l'extension filename_without_extension="${output_file%.*}" # Extraire l'extension du fichier extension="${original_file##*.}" # Construire le nouveau nom de fichier avec num_files_real ajouté avant l'extension output_new_file="${filename_without_extension}_${num_files_real}.${extension}" mv -v "${output_file}" "${output_new_file}" echo "Le fichier M3U a été créé avec les $num_files_real fichiers audio les plus récents dans le répertoire $directory : $output_file" # Temps de fin d'exécution end_time=$(date +%s) # Calcul du temps écoulé execution_time=$((end_time - start_time)) echo "Temps d'exécution: $execution_time secondes"