Hello,
La situation : j’ai des dossiers avec des tas de samples (de petits fichiers audio), je veux en sélectionner quelques uns qui me plaisent, je veux en choisir, ou en éliminer, directement après leur écoute.
Alors j’ai procédé ainsi : les ouvrir tous dans un éditeur ou lecteur audio, écouter les uns après les autres et choisir ceux qui me plaisent. Le programme moc (Music On Console) par exemple, pas modifié depuis huit ans, c’est dire s’il est parfait, qui permet de picorer le contenu d’un répertoire afin d’établir une liste de lecture, qu’il est possible d’exporter ensuite, faisait à peu près le job.
Mais cela demandait encore trop d’effort pour le flemmard professionnel que je suis. Comment faire ?
Il n’apparaissait plus comme unique possibilité à ma portée d’écrire un script ad-hoc, en Bash parce que ça le vaut bien.
Je le trouve assez potable pour vous le présenter ici. Avec quelques modifications je pense qu’il pourrait servir dans d’autres contextes que le picorage de sample audio. Puis vous ne manquerez pas de faire les remarques constructives nécessaires à mon instruction sur ce merveilleux langage qu’est Bash.
Bash, qui s’il est moins puissant que Python, est en même temps mille fois moins ennuyeux à écrire.
Utilisation : deux arguments, le répertoire où se trouvent les samples, puis en second le répertoire où l’on va déplacer ou copier les samples sélectionnés. Ça joue un premier sample au hasard, on a le choix de rejouer le sample, le copier/déplacer dans la destination, le supprimer du dossier source, ajouter son chemin dans une liste, passer au sample suivant sans rien faire, et quelques autres possibilités. Je l’ai appelé “cast”, parce que.
#!/bin/bash
IFS=$'\t\n'
set -euo pipefail
cast () {
declare action='p'
declare source_folder="$(realpath "${1:-.}")"
declare target_folder="${2:-./samples}"
declare -i idx=0
declare -i max=$(ls -1 "${source_folder}"/*.flac | wc -l)
declare -i size=0
mkdir -p "${target_folder}"
for file in $(shuf -e "${source_folder}"/*.flac); do
let idx++ || true
size=$(wc -l "${source_folder}.list" 2>/dev/null | cut -d' ' -f1 || true)
while [[ "${action}" != 'q' ]]; do
[[ "${action}" =~ ^(a|n|C|c|M|m|p|d)$ ]] && { echo -e "\nPlaying ${size}/${idx}/${max} ${file}"; play "${file}" stats 2>&1 | grep -E '(factor|dB|level|Length)'; }
read -p $'\n(p)lay again / (a)dd to list / (C)opy to target folder / (c)opy to target folder and add to list / (M)ove to target folder / (m)ove to target folder and add to list / play (n)ext / (d)elete file / show (l)ist / list (L)ists / (q)uit\n' -srn1 action
case "${action}" in
'd') /usr/bin/rm -v "${file}"; break; ;;
'a') echo "Adding ${file} in ${source_folder}.list" >&2; realpath "${file}" >> "${source_folder}.list"; break; ;;
'C') echo "Adding ${file} in ${source_folder}.list and copy it to ${target_folder}" >&2; realpath "${file}" >> "${source_folder}.list"
cp -v "${file}" "${target_folder}"
break; ;;
'M') echo "Adding ${file} in ${source_folder}.list" >&2; realpath "${file}" >> "${source_folder}.list"; break; ;;
'm') echo "Adding ${file} in ${source_folder}.list and move it to ${target_folder}" >&2; realpath "${file}" >> "${source_folder}.list"
mv -v "${file}" "${target_folder}"
break; ;;
'n') break; ;;
'c') cp -v "${file}" "${target_folder}"; break; ;;
'l') cat "${source_folder}.list" >&2 || true; ;;
'L') wc -l "${source_folder}/../"*.list | sort -nr >&2 || true; ;;
'q') echo "Quitting… (${size} samples listed in ${source_folder}.list)" >&2; break 2; ;;
'p'|*) :
esac
done
done
}
cast "${@}"
Envoyer un commentaire
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.