Vu le blog que je tiens, si je dis que j’ai beaucoup de musique sur mon disque dur, ce n’est pas quelque chose de très surprenant.
Que ce soit avec ma collection complète sur l’ordi, ou une partie copié sur mon ordiphone (j’aime bien ce mot qui représente bien comment j’use de ces appareils), j’utilise le plus souvent le mode lecture aléatoire.
Le problème est que cet aléatoire rejoue trop souvent les même morceaux. Deux explications. Déjà c’est par définition un pseudo-aléatoire qui existe en informatique. Et al semblerait que les algorithmes tiennent compte des pistes déjà écoutées.
Avec mes connaissances de débutanx en informatique, et une envie de geeker, tentons un petit script en ligne de commande pour cela.
Et comme j’aime la péda, la démarche expérimentale et de projet, tentons de formaliser le processus.
Rubriques de l'article
Script idéal voulu
C’est ce que l’on appel un cahier des charges :
- écrire tous les morceaux de musique dans un fichier
- chercher de façon aléatoire 100 morceaux et les mettre dans un fichier playlist
- ouvrir cette playlist
Lister la musique du répertoire
Toutes les commandes se font évidement dans un terminal ou console.
avec les commandes
- cd ./Musique
je me place dans mon fichier Musique* - ls -R
j’affiche la liste du répertoire de façon récurrente donc avec les sous-dossiers et leur fichiers - ls -R > MaZic.txt
Idem et l’écrit dans un ficher. S’il n’existe pas ça le crée, sinon ça efface et remplace
Cela fait pour moi plusieurs dizaines de milliers lignes ! Dont celle pour les dossiers, les fichiers zip, images des pochettes, des lignes vides…
Un tri sera nécessaire à faire. On verra plus tard.
Tirage au sort de la play list
- Une recherche rapide sur internet me propose d’utiliser la ligne de code suivante : shuf -n N input > output
- Ce qui donne ici shuf -n 10 MaZic.txt > selectionaleatoire.txt
- Mais comme une play liste est au format m3u faisons plutôt shuf -n 10 MaZic.txt > selectionaleatoire.m3u
- Ouvrons cette playlist. Ca ne marche pas !
- En effet la liste généré est constitué uniquement du titre de la piste. Il manque toute une partie de l’adresse relative de la piste entre ~/Musique et /nomdelapiste.mp3
- Recherche internet.
- Essayons avec la commande find. Cela donne :
find > MaZic2.txt
shuf -n 10 MaZic2.txt > selectionaleatoire.m3u - et là on a une liste musicale qui fonctionne. Sauf quand elle essaie de lire les pdf, images et autres fichier non-musicaux.
Tirage amélioré
- find –help + quelques recherches pour retrouver comment utiliser l’opérateur logique ou
- Regarder dans MaZic.txt les formats musicaux présent.
- Ca donne la longue commande
find . -type f \( -name « *.mp3 » -o -name « *.MP3 » -o -name « *.ogg » -o -name « *.wav » -o -name « *.flac » -o -name « *.wma » -o -name « *.mp4 » -o -name « *.m4a » \) > MaZic2.txt - Cela supprimer environs dix milles lignes dans le fichier correspondant aux images, fichier info, zip, vidéo musicale, Thumbs.db, lignes vides…
Lancer la liste musicale en ligne de commande
- En faisant quelques essaie avec rhytmhbox, je ne trouve pas, pas grave.
- Avec VLC ça marche en faisant vlc selectionaleatoire.m3u
Résumé
Faire successivement les 3 commandes.
- find . -type f \( -name « *.mp3 » -o -name « *.MP3 » -o -name « *.ogg » -o -name « *.wav » -o -name « *.flac » -o -name « *.wma » -o -name « *.mp4 » -o -name « *.m4a » \) > TouteMaMusique.txt
- shuf -n 20 TouteMaMusique.txt > 20ChansonAleatoire.m3u
- vlc 20ChansonAleatoire.m3u
Une fois le fichier texte contenant toutes les pistes du répertoire créé, tant qu’il n’y a pas d’ajout, retrait, modification, pas besoin de refaire la première ligne.
Le transformer en script
Et donc avoir moins à écrire. C’est bien l’objectif !
Il suffit de suivre le tuto de l’ex site du zéro. On obtient
fairemaliste.sh
find . -type f \( -name « *.mp3 » -o -name « *.MP3 » -o -name « *.ogg » -o -name « *.wav » -o -name « *.flac » -o -name « *.wma » -o -name « *.mp4 » -o -name « *.m4a » \) > TouteMaMusique.txt
shuf -n 20 TouteMaMusique.txt > 20ChansonAleatoire.m3u
vlc 20ChansonAleatoire.m3u
Mais pourquoi 20 chansons ? On peut avoir envie de changer à chaque fois.
Cela donne avec un paramètre d’entrée
fairemaliste2.sh
find . -type f \( -name « *.mp3 » -o -name « *.MP3 » -o -name « *.ogg » -o -name « *.wav » -o -name « *.flac » -o -name « *.wma » -o -name « *.mp4 » -o -name « *.m4a » \) > TouteMaMusique.txt
shuf -n $1 TouteMaMusique.txt > PlusieursChansonAleatoire.m3u
vlc PlusieursChansonAleatoire.m3u
Ne pas oublier de donner les droits exécution : chmod +x nomdufichier
Et ça se lance en étant dans le fichier ~/Musique en écrivant ./fairemaliste2.sh 20
Script fini
fairemaliste2.sh
#script de Gabriel-le ; le 14/12/2020
#nécessite un nombre comme paramètre d’entrée pour déterminer le nombre de chanson à écouter
# fait la liste de tous les morceaux de musique de ~/Musique
cd ~/Musique
find . -type f \( -name « *.mp3 » -o -name « *.MP3 » -o -name « *.ogg » -o -name « *.wav » -o -name « *.flac » -o -name « *.wma » -o -name « *.mp4 » -o -name « *.m4a » \) > TouteMaMusique.txt
# création d’une liste musicale aléatoire
shuf -n $1 TouteMaMusique.txt > PlusieursChansonAleatoire.m3u
#ouverture de la liste dans vlc
vlc PlusieursChansonAleatoire.m3u
ressources utilisées
- https://www.quennec.fr/trucs-astuces/syst%C3%A8mes/gnulinux/programmation-shell-sous-gnulinux/les-m%C3%A9canismes-du-shell/redirections/redirection-des-sorties-vers-un-fichier
- https://qastack.fr/ubuntu/686702/how-to-make-a-playlist-from-a-directory-of-mp3-files
- https://unix.stackexchange.com/questions/50612/how-to-combine-2-name-conditions-in-find
- https://mediamus.blogspot.com/2014/07/mp3-flac-wav-et-les-autres-les-formats.html
- https://openclassrooms.com/fr/courses/43538-reprenez-le-controle-a-laide-de-linux/
1 thought on “playlist aléatoire en ligne de commande”