Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/01/2024, à 19:22

O_20_100_O

(Résolu) Afficher les informations sur les variantes de FIP.

Bonjour,
Tous ceux qui écoutent FIP et ses variantes savent que Radio France ne communique pas d'information sur le morceau diffusé dans le flux musical. On peut lire ces données directement sur le site de la variante FIP concernée mais ils restent inconnus des applications comme Audacious, strawberry et autres ...

Par contre, Radio France produit des pages web au format json qui contiennent les metadata des titres qui passent à l'antenne. Si on veut ces informations il faut aller les chercher. C'est dans ce but que je viens de commencer l'écriture d'un script qui permet de récupérer les artistes, titres et date.

Pour le moment, à titre d'essai, il ne fonctionne que pour fip, fip-jazz, fip-rock et fip-sacré français. J'ai aussi créé un lanceur présent sur le bureau et il suffit de cliquer dessus pour que s'affiche une fenêtre de zenity avec les informations sur le morceau en cours. Cela suffit à satisfaire ma curiosité quand j'ai envie d'en savoir plus sur ce que j'écoute avec Audacious sur mon PC. le script fonctionne aussi avec Strawberry et devrait en faire autant avec d'autres lecteurs.

Mais j'ai écrit ce script avec mes très faibles moyens, c'est pourquoi je recevrai avec plaisir toutes les suggestions de correction des formes erronées ou maladroites et de tout ce qui pourra optimiser la chose.

Edit : Voilà la version actuelle suite aux contributions de Watael.

#!/bin/bash
#Déclaration des variables
player=$(playerctl -l) #Liste des applications de lecture de musique actives !!! Il peut y en avoir plusieurs
ecoute=$(playerctl metadata xesam:url | cut -d "/" -f 4 | cut -c -7) #Sept premiers caractères de la station écoutée, pris dans son url. 
radiofrance="https://www.radiofrance.fr/fip/api/live/webradios" #Début de l'url de la page des metadata, commun à toutes les variantes.
declare -A metadata=(["fip-hif"]="fip" ["fipjazz"]="fip_jazz" ["fiprock"]="fip_rock" ["fipsacr"]="fip_sacre_francais") #Complément de l'url selon la variante
#Y a-t-il au moins un lecteur actif ? si non => info et arrêt
if [[ -z "$player" ]]
	then
		zenity --info --title="Recherche d'un lecteur de musique" --timeout=5 --width=500 --height=150 --text="Pas de lecture en cours."
		exit 1
fi
#La station écoutée est-elle prise en charge par ce script ? si non => info et arrêt
stations="${!metadata[*]}"
if [[ "$stations" != *"$ecoute"* ]]
 	then
		zenity --info --title="Recherche de la station écoutée." --timeout=5 --width=500 --height=150 --text="Le lecteur ou la station écoutée ne sont pas traités par cette fonction."
		exit 2		
fi 
#Extraction des données dans la page des metadata de la variante.
readarray -t -d '' datas < <(curl "$radiofrance/${metadata[$ecoute]}" | jq -r --raw-output0 '.now.thirdLine,.now.secondLine,.now.firstLine,.now.song.year')
variante=${datas[0]}
artiste=${datas[1]}
titre=${datas[2]}
annee=${datas[3]}
if [ $variante = "null" ]; then variante=""; fi
#Affichage des metadata du morceau écouté.
zenity --info --title="$player diffuse FIP $variante" --timeout=10 --width=800 --height=150 --text="<big><big><big><big>Artiste: $artiste\nTitre: $titre\nAnnée: $annee</big></big></big></big>"
exit 0 

Dernière modification par O_20_100_O (Le 02/02/2024, à 18:44)

Hors ligne

#2 Le 28/01/2024, à 21:29

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

- les déclarations se font au début d'un programme.
- les tests arithmétiques devraient être faits dans une évaluation arithmétique : if (( station > 2 )); then zenity.
- on utilise : parce qu'on prévoit de mettre quelque chose, pas comme une fin en soit.
- tu pourrais n'utiliser jq qu'une seule fois pour extraire les données souhaitées :

read -r titre artiste variante annee < <(jq '.....' fip.json)

edit :

radioFrance='https://www.radiofrance.fr/fip/api/live/webradios'    # à mettre
declare -a metadata=( "fip_jazz" "fip_rock" "fip_sacre_francais")  # au début du script
#...
read -r titre artiste variante annee < <(curl "$radioFrance/${metaData[$station]}" | jq '.....' )

RIP fip.json wink

Dernière modification par Watael (Le 28/01/2024, à 21:36)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 29/01/2024, à 12:11

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Merci Watael,
Tests en cours ...

Dernière modification par O_20_100_O (Le 30/01/2024, à 09:56)

Hors ligne

#4 Le 29/01/2024, à 15:35

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

#!/bin/bash
#Déclaration des variables
player=$(playerctl -l) #Liste des applications de lecture de musique actives !!! Il peut y en avoir plusieurs
ecoute=$(playerctl metadata title | cut -c -7) #Sept premiers caractères de la station en écoute. FIP place le nom de sa variante dans le titre du morceau diffusé.
radiofrance="https://www.radiofrance.fr/fip/api/live/webradios"
declare -A metadata=(["fipjazz"]="fip_jazz" ["fiprock"]="fip_rock" ["fipsacr"]="fip_sacre_francais")

#Y a-t-il au moins un lecteur actif ?
if [[ -z "$player" ]]
	then
		zenity --info --title="Recherche d'un lecteur de musique" --timeout=5 --width=500 --height=150 --text="Pas de lecture en cours."
		sleep 5
		exit 1
fi

#La statio écoutée est-elle prise en charge par ce script ?
if [[ "$ecoute" = "fipjazz" ]] || [[ "$ecoute" = "fiprock" ]] || [[ "$ecoute" = "fipsacr" ]]
 	then
		:
	else
		zenity --info --title="Recherche de la station écoutée." --timeout=5 --width=500 --height=150 --text="Le lecteur ou la station écoutée ne sont pas traités par cette fonction."
		sleep 5
		exit 2		
fi 

#Téléchargement du fichier des metadata et extraction des variables dans fip.json
read variante titre artiste annee  < <(echo $(curl $radiofrance/${metadata[$ecoute]} | jq '.now.thirdLine, .now.secondLine, .now.firstLine, .now.song.year'))
#Affichage des variables : station, artiste, titre et année dans une fenêtre zenity.
zenity --info --title="$player diffuse FIP $variante" --timeout=10 --width=800 --height=150 --text="<big><big>Artiste: $artiste\nTitre: $titre\nAnnée: $annee</big></big>"
exit 0

Dernière modification par O_20_100_O (Le 30/01/2024, à 10:09)

Hors ligne

#5 Le 30/01/2024, à 11:56

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Les données sont bien extraites par jq et read les enregistre, mais elles ne sont pas bien réparties dans les variables. Il y a une césure à chaque espace dans les données et le reste se retrouve dans la dernière variable.

echo $variante-$titre-$artiste-$annee
"Rock"-"The-Verlaines"-"Jesus what a jerk" 1990
echo $variante
"Rock"
echo $titre
"The
echo $annee
"Jesus what a jerk" 1990

fip.json est encore vivant !

Dernière modification par O_20_100_O (Le 30/01/2024, à 12:00)

Hors ligne

#6 Le 30/01/2024, à 11:58

bruno

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Modération : si c'est une ébauche, la place de ce fil n’était pas dans la section « Trrucs, astuces et scripts utiles »  wink


Attention, les bouteilles vendues par Nestlé Waters sont contaminées au monoxyde de dihydrogène.

Hors ligne

#7 Le 30/01/2024, à 12:01

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Mais oui, merci de le mettre là où il faut.

Effectivement, j'ai posté un script fonctionnel. C'est son optimisation qui ne marche plus tongue

Dernière modification par O_20_100_O (Le 30/01/2024, à 12:10)

Hors ligne

#8 Le 30/01/2024, à 12:47

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

ne modifie pas le code dans tes messages, on peut avoir besoin de consulter les versions précédentes !

datas=()
while read data; do datas+=( "$data" ); done < <(curl ... | jq -r '...')
var=${datas[0]}
nom=${datas[1]}
titre=${datas[2]}
annee=${datas[3]}

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 30/01/2024, à 13:48

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Merci, ça fonctionne bien. J'étais parti pour faire curl en quatre fois. Avec while c'est top !
Et donc, oui, RIP fip.json cool
j'y reviens ce soir.

Dernière modification par O_20_100_O (Le 30/01/2024, à 13:49)

Hors ligne

#10 Le 30/01/2024, à 19:42

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

readarray -t -d '' datas < <(curl '$radiofrance/${metadata[$ecoute]}" | jq -r --raw-output0 '.now.thirdLine,.now.secondLine,.now.firstLine,.now.song.year'

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 30/01/2024, à 20:02

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Cela devient donc encore plus simple.

readarray -t -d '' datas < <(curl "$radiofrance/${metadata[$ecoute]}" | jq -r --raw-output0 '.now.thirdLine,.now.secondLine,.now.firstLine,.now.song.year')

J'ai ajouté une ) à la fin et remplacé ' par " après curl pour corriger les erreurs.

Merci pour tout cela. smile

Dernière modification par O_20_100_O (Le 30/01/2024, à 20:03)

Hors ligne

#12 Le 31/01/2024, à 19:00

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

#!/bin/bash
declare -A rgx=( [ecoute]='^(fipjazz|fiprock|fipsacr)$' ) # un tableau associatif, parce tu auras plus tard peut-être d'autres regex.
#...
if [[ $ecoute =~ ${rgx[ecoute]} ]]

et, pourquoi sleep 5 ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#13 Le 31/01/2024, à 19:58

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

et, pourquoi sleep 5 ?

C'est un reste de test avant le --timeout de zenity. Il n'y en a plus  tongue
Je vais chercher ce que signifie "... ='^(..." Cela fonctionne, mais je ne vois pas comment.

Dernière modification par O_20_100_O (Le 31/01/2024, à 20:27)

Hors ligne

#14 Le 31/01/2024, à 21:29

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

c'est une regex
^ : début
$ : fin
entre parenthèses, les motifs auxquels peut correspondre $ecoute

autrement dit, $ecoute doit être strictement l'une des expressions entre parenthèses.
cf. man 7 regex

NB: ça peut s'écrire sans regex :

[[ $ecoute == fip@(jazz|rock|sacr) ]]

cf. man bash /Pathname Expansion /Pattern Matching

PS: ce qui me fait penser à une regex plus courte aussi [[ $ecoute =~ ^fip(jazz|rock|sacr)$ ]]

Dernière modification par Watael (Le 31/01/2024, à 21:32)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 31/01/2024, à 21:56

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Merci pour l'explication.

une regex plus courte aussi [[ $ecoute =~ ^fip(jazz|rock|sacr)$ ]]

En plus d'être plus court et simple, ça me semble plus facile à comprendre.

Pourrait-on écrire que $ecoute doit être l'un des index de la table associative metadata ?

Dernière modification par O_20_100_O (Le 01/02/2024, à 08:57)

Hors ligne

#16 Le 31/01/2024, à 22:15

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

oui.

rgx="^($(IFS='|'; echo "${!metadata[*]}"))$"
if [[ $ecoute =~ $rgx ]]

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 01/02/2024, à 10:05

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

C'est encore mieux car on utilise le tableau au lieu de re-écrire les valeurs, mais je n'arrive a avoir des résultats corrects avec le test. Il arrive souvent un moment où le mieux est l'ennemi du bien. On y est peut-être.

J'en reste donc à :

if [[ $ecoute == fip@(jazz|rock|sacr) ]]
 	then
		:
	else
		zenity .... 

qui ne donne pas la réponse attendue si je fais le test avec :

if [[ $ecoute =~ fip@(jazz|rock|sacr) ]]
 	then
		zenity .... 

Dernière modification par O_20_100_O (Le 01/02/2024, à 11:14)

Hors ligne

#18 Le 01/02/2024, à 15:07

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

deux choses :
- fip@(rock|..), n'est pas une regex, or =~ traite uniquement des regex !
- et tu as oublié la négation :

if [[ $ecoute != fip@(jazz|rock|sacr) ]] #pattern matching
then
  zenity --info --title="Erreur" ...

ou bien

if ! [[ $ecoute =~ ^fip(jazz|rock|sacr)$ ]] #regex
then
   zenity --info --title="Erreur" ...

Dernière modification par Watael (Le 01/02/2024, à 15:10)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#19 Le 01/02/2024, à 15:37

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

et tu as oublié la négation :

Merci, j'ai mis la négation adaptée à ce cas et bien entendu ça baigne tongue
Je garde cette solution et je reviendrai tester le #16 car pour le moment le résultat du contrôle n'est correct que si $ecoute se termine par "|" comme dans fipjazz|

Edit : ça donne de bons résultats avec cela:

stations="${!metadata[*]}"
if [[ "$stations" != *"$ecoute"* ]]

Dernière modification par O_20_100_O (Le 01/02/2024, à 18:15)

Hors ligne

#20 Le 02/02/2024, à 12:33

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Edit : ça donne de bons résultats avec cela:

stations="${!metadata[*]}"
if [[ "$stations" != *"$ecoute"* ]]

ce n'est pas très précis. hmm
d'autant qu'il y a une station/variante que tu n'as pas inscrite dans ton tableau, mais qui matcherait toutes les autres stations/variantes : fip

je l'ai trouvée en voulant alimenter automatiquement le tableau associatif metadata :

radioFrance='https://www.radiofrance.fr'
Fip="$radioFrance/Fip"
fipAPI="$Fip/api/live/webradios"
stations=( $(curl -s "$fipAPI" | jq -r '.[]|.station') )
meta=( "${stations[@]//_}" )
declare -A metadata
for i in ${!meta[*]}; do metadata["${meta[$i]::7}"]="${stations[$i]}"; done
#...

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#21 Le 02/02/2024, à 12:50

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

J'ai traité FIP ce matin et j'ai dû changer la façon de trouver la variante, maintenant je vais dans l'url écoutée. C'est aussi parce que en passant sur Strawberry, j'ai vu que d'une part ce dernier ne met pas la variante dans le titre, mais il y place l'url. Et d'autre part, le contenu "playerctl metadata" est influencé par la longueur du nom de l'application de musique. Strawberry a un caractère de plus qu'audacious. Je vais donc dans l'url qui est la partie commune.

ecoute=$(playerctl metadata | grep url | cut -d "/" -f 4 | cut -c -7) #Sept premiers caractères de la station écoutée, pris dans son url. 

Mais ce n'est pas très beau, tu vas certainement faire plus simple.

declare -A metadata=(["fip-hif"]="fip" ["fipjazz"]="fip_jazz" ["fiprock"]="fip_rock" ["fipsacr"]="fip_sacre_francais") #Complément de l'url selon la variante

Dernière modification par O_20_100_O (Le 02/02/2024, à 12:58)

Hors ligne

#22 Le 02/02/2024, à 17:00

Watael

Re : (Résolu) Afficher les informations sur les variantes de FIP.

testé avec VLC :

ecoute=$(playerctl metadata 'xesam:url' | sed 's@.*/\([^-]*\).*@\1@; /fip.\+/s/fip/&_/')

Est-ce que tous les lecteurs proposent cette clé (xesam:url) ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#23 Le 02/02/2024, à 18:41

O_20_100_O

Re : (Résolu) Afficher les informations sur les variantes de FIP.

Est-ce que tous les lecteurs proposent cette clé (xesam:url) ?

je ne sais pas.
Et je retiens donc playerctl metadata xesam:url qui supprime grep. j'avais testé avec playerctl metadata url qui ne trouve rien, alors que playerctl metadata title trouve bien le titre. Cela doit dépendre fortement du lecteur utilisé.

Dernière modification par O_20_100_O (Le 02/02/2024, à 18:45)

Hors ligne