Objectif
Disons que vous ayez :
- un fichier audio contenant plusieurs morceaux de musique (comme un CD, un mix téléchargé sur le net ou même un livre audio dont vous aimeriez extraire les chapitres) ;
- la liste des plages audio et leur horodatage (quand chaque morceau démarre).
À partir de ces deux informations, vous pouvez extraire facilement vos plages ! ffmpeg fait très bien le travail, mais il lui manque une interface simple pour utilisateur, c’est exactement ce que fait get-tracks.sh
.
Usage
Vous avez votre fichier audio, disons doom-eternal.opus
, et la liste des morceaux de musique dans un fichier texte (doom-eternal.txt). Ce fichier ressemble à ceci :
0:00 DOOM Eternal
4:48 Hell on Earth
9:29 Deag Nilox - First Priest Death
10:14 Barging In
12:32 Demonic Corruption
À partir de ça, les morceaux sont extraits :
$ get-tracks.sh doom-eternal.opus doom-eternal.txt
$ ls
01 - DOOM Eternal.opus
02 - Hell on Earth.opus
03 - Deag Nilox - First Priest Death.opus
04 - Barging In.opus
05 - Demonic Corruption.opus
Configuration
Le comportement du script peut changer via quelques variables d’environnement.
Par exemple, si vous ne voulez pas le numéro du morceau dans le nom de fichier :
$ NONUMBER=1 get-tracks.sh doom-eternal.opus doom-eternal.txt
# Fichiers produits :
# DOOM Eternal.opus
# Hell on Earth.opus
# ...
Si vous souhaitez les numéros, mais que vous voulez changer le séparateur (qui est par défaut -
) :
$ SEPARATOR=". " get-tracks.sh doom-eternal.opus doom-eternal.txt
# Fichiers produits :
# 01. DOOM Eternal.opus
# 02. Hell on Earth.opus
# ...
D’autres options sont possibles. Par exemple, il est possible de changer le format des fichiers générés, si vous préférez avoir des mp3
plutôt que opus
(format libre avec une bonne compression). Allez voir la page du projet pour plus d’informations.
À l’intérieur
Ce simple script est écrit en sh
: pas de basheries ou zsheries. Il a été testé sur Linux (Ubuntu et Alpine) et OpenBSD.
get-tracks.sh
prend en compte des erreurs courantes de typographie dans l’horodatage des pistes, telles que l’on peut en trouver dans des commentaires en ligne. Par exemple, un commentaire en ligne peut nommer des plages en incluant des caractères qui ne sont pas acceptables pour des noms de fichier comme le caractère /
, ou des caractères non affichables.
Contraintes de développement
Je me suis efforcé à produire un outil :
- avec des technos très répandues (
sh
, sed
, awk
, xxd
, ffmpeg
) ;
- avec le moins de complexité possible (pas de langage dynamique « simple » codé en plus d’un million de lignes de code comme Python) ;
- le plus simple possible à maintenir (chose réussie, en n’utilisant que des langages quasi gravés dans le marbre).
Le programme iconv
n’est pas appelé, la suppression ou la modification des caractères UTF-8 non acceptables est faite à la main via xxd
, sed
et awk
. Cela permet de ne pas dépendre de cet outil qui, au fond, ne nous est pas indispensable.
Pourquoi ?
Pourquoi avoir fait cet outil avec ces contraintes ? Pour voir où on pouvait aller avec des outils de base du système. J’ai utilisé des programmes qui sont sur nos ordinateurs depuis des décennies et qui répondent pourtant, encore et toujours, à des besoins actuels.
Je pense que le code peut servir d’exemple pour des développeurs débutants : il est très simple (en sh
, awk
, sed
, et xxd
), il y a un peu de gestion d’erreurs et je bidouille à la main du code UTF-8 (suppression des caractères qui nous gênent).
J’utilise régulièrement ce script, et je pense qu’il était temps que je le diffuse. Selon moi il peut servir à un paquet de gens.
Si vous voyez des améliorations possibles, n’hésitez pas à m’en faire part ou à contribuer ! Le code peut être compris même par des novices.