#!/bin/sh # http://nicofo.tuxfamily.org # 27/09/2008 - 1ère version # 21/04/2009 - nbre de sec à 2 chiffres # 05/01/2012 - utilise ffmpeg si totem-video-indexer est absent (plus présent sous F15). # Rem : id3info (mp3 only) et ogginfo (ogg only) peuvent aussi être utilisés, mais n'affichent pas la durée # 17/08/2015 - ajout option "-m 1" à grep title (ne prend que la 1ère occurence, car il y a des fichiers avec plusieurs si thumbnail intégré) # 18/02/2023 - correction si ":" dans le nom du titre, album, artiste # sans arguments : affiche les TAGS de tous les fichiers du dossier # un/des arguments : affiche les TAGS du/des fichiers donnés if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then echo -e "\033[1;4mUsage\033[0m : $(basename $0) [-l [-s STRING]] [fichiers musicaux]" echo echo -e " \033[1mAffiche les informations (Auteur/Titre/Album/...) contenues dans les\n\tfichiers mp3, ogg ou wma.\033[0m" echo echo -e " Si aucun fichier n'est donné, analyse tous les fichiers du dossier\n\tcourant." echo echo -e " Si aucune option n'est donnée, affiche les informations \033[4mcomplètes\033[0m. \033[4mSinon\033[0m" echo " -l : Affiche les informations sous la forme définie par STRING" echo " -s STRING : définit la manière dont les données sont affichées :" echo " les lettres suivantes permettent d'afficher l'information suivante" echo " a : l'auteur" echo " t : le titre" echo " A : l'album" echo " p : le n° de piste" echo " y : l'année" echo " d : la durée" echo " n : le quantième fichier analysé" echo " f : le nom du fichier" echo -e " \033[2mExemple : -s \"t - a (d)\" : affiche les informations sous la forme \n\t \"Titre - Auteur (3\"07')\"\033[0m" echo -e " Par défaut, en l'absence de '-s STRING', les informations sont\n\t affichées sous la forme \"1) Titre - Auteur\"" exit fi [ -n "$(which totem-video-indexer 2>/dev/null)" ] && USE_TOTEM=1 || USE_TOTEM=0 [ $USE_TOTEM -eq 0 -a -z "$(which ffprobe 2>/dev/null)" ] && echo "Veuillez installer ffmpeg." && exit 1 if [ "$1" = "-l" ]; then LISTE=1 if [ "$2" = "-s" ]; then AFF=$3 shift ; shift else AFF="n) t - a" fi shift fi if [ -n "$1" ]; then nombre=$# for file in "$@"; do if [ ! -f "$file" ]; then [ ! -d "$file" ] && echo -e "\033[31mErreur : \"$file\" pas trouvé !\033[0m" nombre=$(($nombre-1)) fi FILES="$FILES \"$file\"" done [ $nombre -eq 0 ] && exit 1 else motif="*.[mM][pP]3 *.[oO][gG][gG] *.[wW][mM][aA]" nombre=$(ls -- $motif 2>/dev/null |grep "." -c) #-- => pas d'erreur si le fichier commence par un tiret if [ $nombre -eq 0 ] ;then echo "Pas de fichier musical." exit fi FILES=$motif fi echo n=0 eval ls -dU -- "$FILES" 2>/dev/null | while read file ; do # -U => do not sort : conserve le même ordre que "$@" ; -d => ne liste pas le contenu des dossiers if [ -d "$file" ]; then continue fi n=$(($n+1)) [ $n -ne 1 -a "$LISTE" != "1" ]&& echo -e "\033[31;1m--------------------------------------------------------------------------------\033[0m" [ "$LISTE" != "1" ] && echo -n "[$n/$nombre] " #Liste des tags if [ $USE_TOTEM -eq 1 ]; then infos=$(totem-video-indexer "$file" 2>/dev/null) if [ $? -ne 0 ] || [ -z "$(echo "$infos" | grep TOTEM_INFO_DURATION)" ]; then echo -e "\033[31mErreur : pas de métadata dans \"$file\"\033[0m" continue fi auteur=$(echo "$infos" | grep TOTEM_INFO_ARTIST | cut -d'=' -f2) titre=$(echo "$infos" | grep TOTEM_INFO_TITLE | cut -d'=' -f2) album=$(echo "$infos" | grep TOTEM_INFO_ALBUM | cut -d'=' -f2) piste=$(echo "$infos" | grep TOTEM_INFO_TRACK_NUMBER | cut -d'=' -f2) annee=$(echo "$infos" | grep TOTEM_INFO_YEAR | cut -d'=' -f2) duree=$(echo "$infos" | grep TOTEM_INFO_DURATION | cut -d'=' -f2) if [ -n "$duree" ]; then sec=$(printf %02d $(($duree-$duree/60*60))) #nbre sec à 2 chiffres duree="$(($duree/60))'$sec\"" fi else infos=$(ffprobe -- "$file" 2>&1) #-- = fin des arguments -> permet de traiter les fichiers dont le nom commence par '-' if [ $? -ne 0 ] || [ -z "$(echo "$infos" | grep "Duration: ")" ]; then echo -e "\033[31mErreur : pas de métadata dans \"$file\"\033[0m" continue fi if [ -z "$(echo "$infos" | grep "Duration: .*, start: .*")" ] || [ -n "$(echo "$infos" | grep "Duration: .*N/A")" ]; then echo -e "\033[31mErreur : \"$file\" n'est pas un fichier musical\033[0m" continue fi auteur=$(echo "$infos" | grep -i "^ \+artist *: " | sed "s/[^:]*: //") #[^:]* au lieu de .* si artist contient un ":" titre=$(echo "$infos" | grep -i "^ \+title *: " -m 1 | sed "s/[^:]*: //") album=$(echo "$infos" | grep -i "^ \+album *: " | sed "s/[^:]*: //") piste=$(echo "$infos" | grep -i "^ \+track *: " | sed "s/[^:]*: //") annee=$(echo "$infos" | grep -i "^ \+date *: " | sed "s/.*: //") annee=$(echo $annee|sed "s/-.*//") # suppression du mois et du jour si présent duree=$(echo "$infos" | grep -i "^ \+duration *: " | sed "s/.*Duration: \([^,]*\),.*/\\1/") duree=$(echo $duree|sed "s/^00:\([^\.]*\)\..*/\\1/") # suppression des décimales des secondes et des heures duree=$(echo $duree|sed "s/^0//") # suppression du 1er '0' si moins de 10 min duree="$(echo $duree|tr : \')\"" fi # Affichage if [ "$LISTE" = "1" ]; then OPTS=$(echo "$AFF"|sed "s/ /\\\/g") OPTS=$(echo "$OPTS"|sed "s/\(.\)/\1 /g") for opt in $OPTS; do case $opt in a) echo -n $auteur ;; t) echo -n $titre ;; A) echo -n $album ;; p) echo -n $piste ;; y) echo -n $annee ;; d) echo -n $duree ;; \\) echo -n " " ;; n) echo -n $n ;; f) echo -n $file ;; *) echo -n "$opt" ;; esac done echo else echo $(basename -- "$file") echo -n " De : " [ -z "$auteur" ] && echo -en "\033[37m(pas d'auteur)\033[0m" || echo -en "\033[1m$auteur\033[0m - " echo -en "\r\033[35C" #déplacer curseur à la 35è colonne [ -z "$titre" ] && echo -en "\033[37m(pas de titre)\033[0m" || echo -en "\033[1m$titre\033[0m" echo -en "\r\033[72C" [ -z "$duree" ] && echo -en "\033[37m(x'x\")\033[0m" || echo -en "($duree)" echo echo -n " Album : " [ -z "$album" ] && echo -en "\033[37m(pas d'album)\033[0m" || echo -en "\033[1m$album\033[0m" echo -en "\r\033[62C" [ -z "$piste" ] && echo -en "\033[37m(piste x)\033[0m" || echo -en "piste $piste" echo -en "\r\033[73C" [ -z "$annee" ] && echo -en "\033[37m(année x)\033[0m" || echo -en "($annee)" echo fi done