Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
index.sh (11847B)
1 #! page 2 title: Des outils pour le nouvel an 3 author: Arthur Pons 4 description: Des outils pour organiser un nouvel an 5 publication: 2023-11-15 6 sectionmd: main 7 8 9 J'organise une fête pour le nouvel an et je voulais que les personnes invitées 10 puissent ajouter simplement des chansons à la playlist sans pour autant avoir 11 recours à spotify ou tout autre gestionnaire de playlist en ligne. Ayant un 12 [peu d'expérience en la matière](../musique) j'ai décidé de partir sur un 13 principe similaire à ce que j'avais fait par le passé. 14 15 La boite à outil sera 16 17 * yt-dlp pour télécharger les musiques 18 * [mes scripts de téléchargement](git://katzele.netlib.re/downloadmusic) pour synchroniser les chansons avec la playlist 19 * sigtop pour télécharger des messages sur signal 20 * dash pour le shell 21 * bc pour les calculs 22 * exiftool pour les métadonnées 23 * date pour savoir quelle chanson passera quand 24 * un lecteur de musique (j'utilise mpv) 25 * toilet pour faire du "ascii art" 26 27 ## Le décompte pour minuit 28 29 Construisons un script pour un décompte de minuit. Pour l'affichage on souhaite 30 quelque chose d'un peu plus joli que juste ce qui sort si l'on fait un `echo`. 31 Pour cela on peut utiliser `toilet`[^toilet]. 32 33 echo "Test" | toilet 34 35 36 mmmmmmm m 37 # mmm mmm mm#mm 38 # #" # # " # 39 # #"""" """m # 40 # "#mm" "mmm" "mm 41 42 43 44 On peut choisir des fonts et des styles : 45 46 echo "Test" | toilet -f ansi --gay 47 48 ████████ ███████ ███████ ████████ 49 ██ ██ ██ ██ 50 ██ █████ ███████ ██ 51 ██ ██ ██ ██ 52 ██ ███████ ███████ ██ 53 54 55 56 L'option `--gay` ajoute des jolies couleurs arc-en-ciel (qu'on ne voit pas ici 57 forcément). 58 59 Evidemment dans notre cas on veut l'heure : 60 61 date +"%H:%M:sectionmd: " | toilet -f ansi 62 63 ██ ██████ ██ ██████ ██████ ██████ 64 ███ ██ ██ ███ ██ ██ ██ ██ 65 ██ ███████ ██ █████ █████ █████ 66 ██ ██ ██ ██ ██ ██ ██ ██ ██ 67 ██ ██████ ██ ███████ ██████ ███████ 68 69 70 71 Maintenant il faut avancer dans le temps et donc relancer 72 cette commande toutes les secondes. Par exemple, pour 73 le faire sur trois secondes on itère sur la sortie de 74 `seq 3` - c'est à dire 1/2/3 - avec une boucle `for`. 75 76 for i in $(seq 3) 77 do 78 date +"%H:%M:sectionmd: " | toilet -f ansi --gay 79 done 80 81 Sauf que l'on aura trois fois la même seconde en instantané. 82 Il faut dormir une seconde entre chaque affichage. 83 84 for i in $(seq 3) 85 do 86 date +"%H:%M:sectionmd: " | toilet -f ansi --gay 87 sleep 1 88 done 89 90 Cette fois-ci les secondes s'affichent les une après les autres or on voudrait 91 qu'elles s'affichent dans le même espace, la nouvelle seconde écrasant 92 l'ancienne. Il faut donc remettre le curseur d'écriture en haut de la fenêtre 93 avec `tput cup 0 0`. 94 95 96 97 #! /bin/sh 98 99 datetime="$@" 100 unixtime=$(date +%s --date "$datetime") 101 nbsecondsuntilend=$(( $unixtime - $(date +%s) - 10 )) 102 103 trap "clear;tput cnorm;exit 0" INT EXIT 104 clear 105 tput civis 106 for i in $(seq $nbsecondsuntilend) 107 do 108 tput cup 0 0 109 date +"%H:%M:sectionmd: " | toilet -f ansi --gay 110 sleep 1 111 done 112 clear 113 for i in $(seq 10 -1 0) 114 do 115 tput cup 0 0 116 echo "$i " | toilet -f ansi --gay 117 sleep 1 118 done 119 sleep 100000 120 121 ## Construire une playlist 122 123 ### Recueillir les données 124 125 Évidemment elle sera un fichier texte, lisant des titres sous la forme "artiste 126 - titre", un titre par ligne. L'idéal serait que chaque personne prenant part à 127 la soirée utilise git mais puisque ce n'est absolument pas le cas des personnes 128 invitées j'ai eu pour idée de recueillir les contributions via une application 129 de messagerie. Celle que j'utilise, signal, stocke ses messages dans une base 130 de données sqlite chiffrée. Si vous avez une application signal desktop 131 installée sur votre machine vous pouvez alors lire la base de donnée. 132 Personnellement je n'ai pas voulu perdre de temps à apprendre comment faire, 133 j'ai donc utilisé le projet sigtop qui le fait automatiquement.[^1] Avec sigtop 134 il suffit de faire 135 136 sigtop msg data 137 138 Pour avoir vos conversations sous format texte dans le dossier `data`. Admettons que notre 139 fichier soit `nouvel-an.txt`, il me reste à faire un `grep` sur les messages 140 que les invité·e·s ont envoyé. En l'occurrence j'avais demandé que les messages 141 commencent par `playlist -`, j'ai donc fait `grep -I "^playlist - " 142 nouvel-an.txt | sed 's/^playlist - //' > playlist.m3u` pour avoir la liste des titres à télécharger. 143 Dans la pratique cela m'a demandé un peu plus de travail puisqu'évidemment j'ai 144 mal communiqué le format et son importance mais ce n'est pas bien grave. 145 146 ### Télécharger les titres et les jouer 147 148 Rien de plus facile une fois la liste des titres extraite j'utilise mon script 149 `syncmusicfolder` pour télécharger tous les morceaux. **Et hop**, c'est fini ! 150 151 mkdir chansons 152 cp playlist.m3u chansons 153 cd chansons 154 syncmusicfolder < playlist.m3u 155 156 Pour jouer la playlist on lance `mpv playlist.m3u`. 157 158 ### Savoir quand vont passer les chansons 159 160 Le gros du travail est fait ! Maintenant disons que l'on souhaite savoir quand 161 est-ce que les chansons passerons. En effet, on imagine que l'on ne veuille pas 162 la même ambiance à 19h ou à 4h, sans parler de minuit. Comment pouvons nous 163 contrôler cela ? 164 165 #### Extraire les données 166 167 Chaque morceau a dans ses métadonnées sa durée. On peut consulter les 168 métadonnées avec `exiftool`. La commande `exiftool -Duration -t chanson.mp3` 169 renverra quelque chose sous la forme `Duration[tabulation]0:03:24` pour une 170 chanson d'une durée de 3 minutes et 24 secondes. Si on lui donne plusieurs 171 morceaux en argument on obtient une liste avec toutes les durées 172 173 cat playlist.m3u | xargs -d'\n' exiftool -t -Duration 174 175 ======== brique argent - collé serré 176 Duration 0:03:15 177 ======== ABBA - Gimme Gimme Gimme 178 Duration 0:03:30 179 ======== Louise Attaque - J't'emmène au vent 180 Duration 0:03:04 181 182 #### Les ajouter à notre fichier 183 184 On peut choisir de les ajouter à notre fichier de playlist de façon à 185 contenir toutes les informations au même endroit. Il faudra évidemment changer 186 la façon de lancer la playlist (en faisant `cut -f1 playlist.m3u | xargs mpv` 187 par exemple). 188 189 Reprenons là où nous en étions et filtrons sur les durées uniquement à l'aide 190 d'une regex : 191 192 cat playlist.m3u | 193 xargs -d'\n' exiftool -t -Duration | 194 grep -oE "[0-9]:[0-9]{2}:[0-9]{2}" 195 196 0:03:15 197 0:03:30 198 0:03:04 199 200 On peut ensuite l'ajouter au fichier de playlist avec paste : 201 202 cat playlist.m3u | 203 xargs -d'\n' exiftool -t -Duration | 204 grep -oE "[0-9]:[0-9]{2}:[0-9]{2}" | 205 paste playlist.m3u - 206 207 brique argent - collé serré 0:03:15 208 ABBA - Gimme Gimme Gimme 0:03:30 209 Louise Attaque - J't'emmène au vent 0:03:04 210 211 #### Manipuler le temps 212 213 Manipuler des durées c'est assez relou. J'ai fait un petit script un peu dégueu 214 qui converti le format hh:mm:ss en secondes et inversement. Si l'on avait 215 mis le résultat de la dernière commande dans `playlistwithduration, on l'utiliserait 216 ainsi : 217 218 cut -f2 playlistwithduration | ./t2s2t 219 220 195 221 210 222 184 223 224 Avoir le temps sous cette forme permet très simplement de savoir combien de 225 temps dur la playlist. On fait la somme des secondes en pipant ça dans `paste 226 -s -d+ | bc` et on reconverti en format `hh:mm:ss` en le repipant dans `./t2s2t 227 -r`. En l'occurence sur nos trois chansons ça fait 589 secondes soit 9 minutes 228 et 49 secondes. 229 230 #### Et maintenant la prédiction 231 232 Il se trouve que `date` permet des syntaxes où l'on ajoute une certaine 233 quantité de secondes, minutes, heures à une date donnée. C'est en parti sur ce 234 principe que repose [kun](../kun). Par exemple la commande `date --date 235 '2023-12-31T19:00:00+01:00+184seconds'` renvoie `2023-12-31T19:03:04+01:00`[^2]. 236 On imagine alors pouvoir ajouter la durée des chansons à un horaire donnée 237 et savoir à partir de là quand chacune des chansons commencera. 238 239 Pour cela il va falloir faire la somme successive du temps passé depuis la 240 première chansons jusqu'à celle en cours. Pour cela j'ai un petit script 241 qui, si on lui donne une liste d'entier, fait exactement cela : 242 243 cut -f2 playlistwithduration | ./t2s2t | ./cumulduration 244 245 195 246 405 247 589 248 249 Si l'on a une colonne comme celle-ci on peut alors construire des formats de 250 date mangeables par `date` qui correspondent tous au moment où se lancera 251 chacune des musiques à partir d'une date donnée. En le mettant dans un script 252 `predict` : 253 254 cut -f2 playlistwithduration | 255 ./t2s2t | 256 ./cumulduration | 257 ./predict "dec 31 19:00" | 258 paste playlist.m3u - 259 260 brique argent - collé serré 19:00:00 261 ABBA - Gimme Gimme Gimme 19:03:15 262 Louise Attaque - J't'emmène au vent 19:06:45 263 264 Hop là on peut savoir quand est-ce que passeront chacune des chansons. 265 266 ### Et si l'on souhaite changer l'ordre ? 267 268 Peut-être qu'avec ce nouveau pouvoir vous souhaitez pour éditer l'ordre de la 269 playlist et voir comment cela affecte les horaires. C'est ici que l'on peut 270 utiliser le pouvoir de vim pour créer des interfaces. Sachant que : 271 272 * il est possible d'activer l'écriture automatique d'un fichier lorsqu'on lance une commande 273 * il est possible d'activer la lecture automatique d'un fichier quand il change sur le disque 274 * il est possible de lancer des commandes shell à l'intérieur de vim 275 * il est possible de créer des raccourcis clavier personnalisés 276 277 on peut écrire un script qui modifie `playlist.m3u` pour lui ajouter les 278 horaires, l'appeler à l'intérieur de vim et voir automatiquement les effets. 279 On configure vim ainsi : 280 281 :set ar aw 282 :nmap <C-s> :silent exec "!< playlist.m3u ../makepredictions 'dec 31 19:00'" \| redraw!<CR> 283 284 La première commande active l'écriture et la lecture automatique. La seconde map ctrl+s à l'éxecution 285 de la commande `< playlist.m3u ../makepredictions 'dec 31 19:00'` (mais vous 286 pouvez y mettre ce que vous voulez) puis redessine l'écran. Ainsi on peut 287 manipuler la playlist comme bon nous semble à l'aide de nos connaissances de vim, appuyer 288 sur ctrl-s et hop avoir presque tout de suite les nouvelles horaires ! 289 290 ## Pour aller plus loin 291 292 J'explique [ici](details.html) comment `t2s2t`, `cumulduration` et `predict` 293 fonctionnent. 294 295 296 [^1]: Attention ! Si vous avez des messages sensibles sur signal il vaut 297 peut-être mieux faire une revue du code de sigtop et/ou apprendre à extraire 298 les messages vous même. D'autant plus que sigtop extrait *toutes* les 299 conversations, il n'est pas possible de lui demander de n'en extraire qu'une 300 seule. 301 [^2]: La date est au format ISO. Le +01:00 est le fuseau horaire. 302 [^toilet]: `sudo apt install toilet` sur debian 303