arthur.bebou

Le site arthur.bebou.netlib.re - retour accueil

git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |

fip (3098B)


      1 #!/bin/sh
      2 
      3 # Sans argument on écoute fip
      4 if [ "$#" -eq 0 ]; then
      5 	radio="FIP"
      6 elif [ "$1" = "list" ]; then
      7 	# Avec list on liste les stations dispo
      8 	curl -Ls 'https://openapi.radiofrance.fr/v1/graphql' \
      9 		  -H 'Content-Type: application/json' \
     10 		  -H 'Accept: application/json' \
     11 		  -H 'x-token: 9720d513-a257-417a-9d05-0772dd40a7e5' \
     12 		  --data-binary '{"query":"{ brands { webRadios { id } }}"}' \
     13 		  --compressed |
     14 	jq |
     15 	grep -Eo 'FIP_[^\"]*'
     16 	exit 0
     17 else
     18 	# Sinon on écoute celle passée en argument
     19 	radio=$(echo "$1" | tr "[a-z]" "[A-Z]")
     20 fi
     21 
     22 # La barre de progression
     23 length=60; delim='|'; before='-'; after='='
     24 barlines="$delim\n$(yes "$before" | head -n$length)\n$delim"
     25 
     26 # Pour supprimer la ligne courante et remettre le curseur au début
     27 eraseline(){
     28 	echo -n "\033[2K\033[0G"
     29 }
     30 
     31 from_fip() {
     32 	# On récupère les infos via l'api de radiofrance
     33 	curl -Ls 'https://openapi.radiofrance.fr/v1/graphql' \
     34 	-H 'Content-Type: application/json' \
     35 	-H 'x-token: 9720d513-a257-417a-9d05-0772dd40a7e5' \
     36 	--data-binary '{"query":"{ live(station: '$radio') { song { end track { mainArtists title } } }}"}' \
     37 	--compressed
     38 }
     39 
     40 # On filtre pour récupérer les infos du morceau en 2 lignes :
     41 # le titre
     42 # l'url de la couverture (RIP)
     43 # l'heure de fin du morceau
     44 current_track() {
     45 	in=$(cat)
     46 	# Si y'a null dedans alors c'est ça qu'on passe en tant que titre
     47 	# Sinon on fait le coup de jq pour récupérer les infos
     48 	echo "$in" |
     49 		grep -q "null" &&
     50 			echo "" ||
     51 			echo "$in" |
     52 				jq -r ' ( .data.live.song | ([.track.mainArtists[], " - ", .track.title]|join("")), .end)'
     53 }
     54 
     55 # Mise à jour des informations du morceau
     56 enjoy() {
     57 	# local ne marche pas en shell POSIX !!!
     58 	for it; do read -r "${it?}"; done
     59 
     60 	# On vérifie que l'api ait bien renvoyé une chanson
     61 	if [ ! "$title" ];then
     62 		# Si non on attend 4 secondes puis on quitte la fonction
     63 		# pour requêter l'api une nouvelle fois
     64 		sleep 4
     65 		return 0
     66 	fi
     67 
     68 	# On affiche les infos
     69 	echo "$title"
     70 	# On les ajoute dans le fichier de session
     71 	echo "$title	$(date)" >> ~/git/fip/session
     72 	# on attend la fin du morceau
     73 	# sleep $(( $pause + 1 )) 2>/dev/null
     74 
     75 	# Puisque la barre de progression fait 58 "-" de long
     76 	# on calcul combien de secondes doivent faire les $length incréments
     77 	# de temps entre le début et la fin de la chanson
     78 	inc=$(echo "($end - $(date +%s))/$length" | bc -l)
     79 	for i in $(seq 1 $length);do
     80 		# Pour chacun de ces incrément on affiche la barre de progression et
     81 		# on attend le nombre de secondes
     82 		echo "$barlines" | sed -E "1,$i s/$before/$after/g" | tr -d '\n'
     83 		sleep $inc
     84 		# Puis on efface la barre pour affichier la nouvelle
     85 		eraseline
     86 	done
     87 	sleep 1
     88 
     89 	# Affichage de la couverture, supprimer si on s'en fiche
     90 	# Ou si l'on veut économiser des ressources
     91 	# Malheureusement les couverture ne sont plus dispos ? :(
     92 	# curl -Ls "$cover" --output - | catimg -w 80 -
     93 }
     94 
     95 ( while :; do
     96 	from_fip |
     97 	current_track |
     98 	enjoy title end
     99 done; ) &
    100 set $!
    101 mpv --volume=50 --really-quiet "https://icecast.radiofrance.fr/$(echo $radio | tr -d '_' | tr '[A-Z]' '[a-z]')-midfi.mp3"
    102 kill $1
    103 killall fip &> /dev/null