arthur.bebou

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