#!/bin/sh # Sans argument on écoute fip if [ "$#" -eq 0 ]; then radio="FIP" elif [ "$1" = "list" ]; then # Avec list on liste les stations dispo curl -Ls 'https://openapi.radiofrance.fr/v1/graphql' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -H 'x-token: 9720d513-a257-417a-9d05-0772dd40a7e5' \ --data-binary '{"query":"{ brands { webRadios { id } }}"}' \ --compressed | jq | grep -Eo 'FIP_[^\"]*' exit 0 else # Sinon on écoute celle passée en argument radio=$(echo "$1" | tr "[a-z]" "[A-Z]") fi # La barre de progression length=60; delim='|'; before='-'; after='=' barlines="$delim\n$(yes "$before" | head -n$length)\n$delim" # Pour supprimer la ligne courante et remettre le curseur au début eraseline(){ echo -n "\033[2K\033[0G" } from_fip() { # On récupère les infos via l'api de radiofrance curl -Ls 'https://openapi.radiofrance.fr/v1/graphql' \ -H 'Content-Type: application/json' \ -H 'x-token: 9720d513-a257-417a-9d05-0772dd40a7e5' \ --data-binary '{"query":"{ live(station: '$radio') { song { end track { mainArtists title } } }}"}' \ --compressed } # On filtre pour récupérer les infos du morceau en 2 lignes : # le titre # l'url de la couverture (RIP) # l'heure de fin du morceau current_track() { in=$(cat) # Si y'a null dedans alors c'est ça qu'on passe en tant que titre # Sinon on fait le coup de jq pour récupérer les infos echo "$in" | grep -q "null" && echo "" || echo "$in" | jq -r ' ( .data.live.song | ([.track.mainArtists[], " - ", .track.title]|join("")), .end)' } # Mise à jour des informations du morceau enjoy() { # local ne marche pas en shell POSIX !!! for it; do read -r "${it?}"; done # On vérifie que l'api ait bien renvoyé une chanson if [ ! "$title" ];then # Si non on attend 4 secondes puis on quitte la fonction # pour requêter l'api une nouvelle fois sleep 4 return 0 fi # On affiche les infos echo "$title" # On les ajoute dans le fichier de session echo "$title $(date)" >> ~/git/fip/session # on attend la fin du morceau # sleep $(( $pause + 1 )) 2>/dev/null # Puisque la barre de progression fait 58 "-" de long # on calcul combien de secondes doivent faire les $length incréments # de temps entre le début et la fin de la chanson inc=$(echo "($end - $(date +%s))/$length" | bc -l) for i in $(seq 1 $length);do # Pour chacun de ces incrément on affiche la barre de progression et # on attend le nombre de secondes echo "$barlines" | sed -E "1,$i s/$before/$after/g" | tr -d '\n' sleep $inc # Puis on efface la barre pour affichier la nouvelle eraseline done sleep 1 # Affichage de la couverture, supprimer si on s'en fiche # Ou si l'on veut économiser des ressources # Malheureusement les couverture ne sont plus dispos ? :( # curl -Ls "$cover" --output - | catimg -w 80 - } ( while :; do from_fip | current_track | enjoy title end done; ) & set $! mpv --volume=50 --really-quiet "https://icecast.radiofrance.fr/$(echo $radio | tr -d '_' | tr '[A-Z]' '[a-z]')-midfi.mp3" kill $1 killall fip &> /dev/null