#1 Le 27/09/2010, à 11:06
- jovial
Fip recupérer les infos en bash
J'ai commencé un script qui permet de collecter les infos sur les morceau joué sur fip et faire une chercher sur google, ajouter dans un bloc note...
Je voudrai isoler les infos pour les passer dans des variables : titre,artiste,album, année .
Je suis juste largué pour extraire correctement les chaines.
Je viens donc demander de l'aide.
Voici donc un exemple de programmation Fip à partir du quel je récupére les infos
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body style="margin:0;padding=0">
<META HTTP-EQUIV="Refresh" CONTENT="30">
<body bgcolor="#000000" style="margin:0;padding=0">
<center><font face="arial" size="2" color="#ffffff"><b>A l'antenne</b></font><br><br>
<MARQUEE DIRECTION="left" BGCOLOR="#000000" SCROLLAMOUNT="2" SCROLLDELAY="3">
<!-- FIP a l'antenne -->
<font face="arial" size="2" color="#ffffff"><b>TURN IT UP</b></font><br><font face="arial" size="1" color="#ffffff"><b>THE BAMBOOS - THE BAMBOOS 4 2010</b></font>
</MARQUEE></b></font></center>
</body>
</html>
Source:
http://players.tv-radio.com/radiofrance … tenne.html
Voici un exemple qui récupère les infos globalement (fourni par alej)
wget -qO - http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html|sed 's/\r//g;/FIP/,$!d;s/<br>/\n/g;s/<[^>]*>//g;/^$/d'
le script en cours ici : https://sites.google.com/site/jovialubuntu/divers/fip-infos-now
Merci
Jluc
Dernière modification par jovial (Le 27/09/2010, à 11:40)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#2 Le 27/09/2010, à 14:23
- sputnick
Re : Fip recupérer les infos en bash
links -dump http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html | awk 'NR>2{print}'
edit: Si toutes les radios avait ce genre de flux RSS ça serais cool, mais je pense pas que ça soit le cas !?
Dernière modification par sputnick (Le 27/09/2010, à 14:25)
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#3 Le 27/09/2010, à 18:26
- jovial
Re : Fip recupérer les infos en bash
links -dump http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html | awk 'NR>2{print}'
edit: Si toutes les radios avait ce genre de flux RSS ça serais cool, mais je pense pas que ça soit le cas !?
Merci cela marche bien le seul inconvénient est d'installer Links
Jluc
Dernière modification par jovial (Le 27/09/2010, à 18:26)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#4 Le 27/09/2010, à 22:59
- sputnick
Re : Fip recupérer les infos en bash
Ca marche aussi avec lynx :
lynx -dump http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html | awk 'NR>6 && NR<9{print}'
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#5 Le 27/09/2010, à 23:03
- sputnick
Re : Fip recupérer les infos en bash
Une solution plus approprié, plus sure et plus propre :
curl -s http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html | grep "^<font face" | html2text
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#6 Le 28/09/2010, à 13:33
- jovial
Re : Fip recupérer les infos en bash
Toute vos solution marchent , par contre cela oblige à installer des paquets
J'ai idée de partager le script et donc de le rendre le plus simple.
C'est aussi pour moi l'occasion d'apprendre à récupérer du texte dans fichier html et travailler sur les chaines
je suis avec ma petite logique de novice, J'aurai fait comme cela
J'isole le texte entre <!-- FIP a l'antenne --> et </body>:
<font face="arial" size="2" color="#ffffff"><b>I GOT RHYTHM</b></font><br><font face="arial" size="1" color="#ffffff"><b>JOVANOTTI - RHAPSODY 1998</b></font>
</MARQUEE></b></font></center>
Je recupère les chaines entre <b> et </b> dans 2 variables
ch1=I GOT RHYTHM
ch2=JOVANOTTI - RHAPSODY 1998
je me sert du tiret pour spliter le texte
ch3 =JOVANOTTI
ch4=RHAPSODY 1998
J'isole le dernier mot de ch 4
ch5=RHAPSODY
ch6=1998
Et j'ai tout ch1=titre ch3=artiste ch5=album ch6=année
En bash je sais pas encore le faire, je veux bien de l'aide
Merci à tous bye
Jluc
Jean-Luc
Dernière modification par jovial (Le 28/09/2010, à 13:52)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#7 Le 28/09/2010, à 13:51
- jovial
Re : Fip recupérer les infos en bash
@HP
Si besoin je le ferai mais dans ce cas je prévois une fonction pour installer les paquets
Sur 10.04 il m'en a fallu 2 html2text et curl.
Ce problème me donne aussi pour moi l'occasion de travailler sur fichier texte avec les outils de base.
Merci bye jluc
Dernière modification par jovial (Le 28/09/2010, à 13:51)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#8 Le 28/09/2010, à 14:25
- credenhill
Re : Fip recupérer les infos en bash
hello
w3m me semble installé par défaut
$ w3m -dump http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html 2>&1 |tail -2
IM CHAMBRE SEPAREE
ANNA NETREBKO - SOUVENIRS 2008
Hors ligne
#9 Le 28/09/2010, à 15:21
- sputnick
Re : Fip recupérer les infos en bash
L'approche consistant à utiliser tail n'est selon moi pas très fiable car si le nombre de lignes change pour une raison ou une autre cela ne fonctionnera pas, ce pourquoi j'ai choisi la méthode avec grep. Ce qui nous donne au final :
wget -qO- http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html | grep "^<font face" | html2text
pour ne rien installer à part html2text, mais c'est un outil basique à avoir dans la trousse à outil de scripting bash.
Selon moi, la présence de <font face en début de ligne est plus sur, il faut toujours essayer de minimiser l'impact de changements (mineurs ou pas) et de ce qui se passerais par exemple si le titre devenait plus long qu'habituellement.
@jovial, si tu veut partir sur de bonnes bases, oublie la solution des regex(p) en général pour parser du HTML sauf cas très simples, car c'est crados. Il existe pour ça des modules en Perl Ruby Python qui parsent proprement le HTML par leurs tags notamment. En Perl, je pense à HTML::TreeBuilder et HTML::TokeParser::Simple.
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#10 Le 28/09/2010, à 15:47
- sputnick
Re : Fip recupérer les infos en bash
Une solution pour affecter des variables à la volée :
eval $(
wget -qO- http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html |
grep "^<font face" |
html2text |
awk 'NR==1{print gensub(/(.*)/, "titre=\"\\1\"", "g")} NR==2{print "details=\""$0"\""}'
)
echo "$titre"
echo "$details"
Dernière modification par sputnick (Le 28/09/2010, à 15:48)
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#11 Le 28/09/2010, à 16:32
- sputnick
Re : Fip recupérer les infos en bash
C'est possible mais le grep est plus sûr selon moi. Bon, d'une façon ou d'une autre c'est empirique.
En utilisant la balise MARQUEE c'est surement encore mieux :
IFS='%' read titre details < <(
wget -qO- http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html |
awk '/^<MARQUEE DIRECTION/,/^<\/MARQUEE>/' |
html2text |
tr '\n' '%' |
xargs
)
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#12 Le 29/09/2010, à 14:00
- jovial
Re : Fip recupérer les infos en bash
Bonjour
Merci à tous, voilà ce j'arrive à faire
#!/bin/sh
eval $(
wget -qO- http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html |
grep "^<font face" |
html2text |
awk 'NR==1{print gensub(/(.*)/, "titre=\"\\1\"", "g")} NR==2{print "details=\""$0"\""}'
)
echo "Titre: $titre"
echo "Artiste Album Année: $details"
echo "------"
echo rech="$titre""$details"|sed -e "s/- //g"|sed -e "s/ /+/g"
`firefox "$rech" &`
gsearch="http://www.google.fr/search?q="
adr_rech="$gsearch$rech"
#echo $adr_rech
`firefox $adr_rech &`
Pour rappel le script permet d'afficher les infos Fip , de les ajouter à la volée dans un bloc note, denvoyer une recherche sur google
1 - J'arrive pas à concaténer les variables $gsearch $rech et les placer en argument sur le lancement de firefox
2 - Je voudrai spliter $details dans les variables $Artiste $Album $Annee
Dernière modification par jovial (Le 29/09/2010, à 14:06)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#13 Le 29/09/2010, à 14:13
- jovial
Re : Fip recupérer les infos en bash
La fonction pour installer les paquets… évite. Je penserais plutôt à une petite fonction testant leur présence, et avertissant l'utilisateur et interrompant le programme en leur absence…
Pourquoi? on peut pas lancer un sudo apt-get install html2text en demandant le mot de passe avec zenity ?
Si non je place simplement un lien apt sur mon site
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#14 Le 29/09/2010, à 16:21
- sputnick
Re : Fip recupérer les infos en bash
Bon, comme j'aime scripter et accessoirement FIP, je me suis penché sur la question de plus près :
#!/usr/bin/env bash
#
# ------------------------------------------------------------------------------
# made by sputnick in da FreAkY lAb (c) 2010
# gilles.quenot <AT> gmail <DOT> com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
# License published by the Free Software Foundation.
# (see http://www.gnu.org/licenses/gpl.html).
# ------------------------------------------------------------------------------
# ,,_
# o" )@
# ''''
#------------------------------------------------------------------------------#
# V e r s i o n i n f o r m a t i o n #
#------------------------------------------------------------------------------#
# $Id:: fip-rss.bash 1 2010-09-29 15:09:49Z sputnick $: #
# $Revision:: 1 $: #
# $Author:: sputnick <gilles.quenot@gmail.com> $: #
# $Date:: 2010-09-29 17:10:54 +0200 (mer., 29 sept. 2010) $: #
# $Hash:: $: #
#------------------------------------------------------------------------------#
# E n d o f v e r s i o n i n f o r m a t i o n #
#------------------------------------------------------------------------------#
#
# vim:ts=4:sw=4
readlink -f /proc/$$/exe | grep -q bash || {
echo >&2 "Hey dude ! You must call $0 with bash !"
exit 2
}
trap 'res=$?; kill &>/dev/null $_pid; exit $res' 1 2 3 15
mplayer &>/dev/null http://mp3.live.tv-radio.com/fip/all/fiphautdebit.mp3 & _pid=$!
while kill -0 $_pid; do
IFS='%' read titre details < <(
wget -qO- http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html |
awk '/^<MARQUEE DIRECTION/,/^<\/MARQUEE>/' |
html2text -nobs |
tr '\n' '%'
)
clear
cat<<-EOF
On air:
$titre
$details
EOF
echo -n 'Saisir "g" pour rechercher avec google ou "q" pour quitter. >>> '
read -n1 -s -t 7
case $REPLY in
g)
titre=$(sed -r 's@[[:space:]\-]{1,}@+@g' <<< "$titre")
details=$(sed -r 's@[[:space:]\-]{1,}@+@g' <<< "$details")
url="http://www.google.com/search?q=\"${titre}\"+${details}&ie=utf-8&oe=utf-8&lr=lang_en"
#firefox -remote "openurl('${url}',new-tab)"
xdg-open &>/dev/null "${url}"
;;
q)
kill $_pid
exit 0
;;
esac
done
Dernière modification par sputnick (Le 29/09/2010, à 21:00)
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#15 Le 29/09/2010, à 17:11
- sputnick
Re : Fip recupérer les infos en bash
Message du dessus édité avec version améliorée
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#16 Le 29/09/2010, à 21:55
- sputnick
Re : Fip recupérer les infos en bash
Re nouvelle version
Changelog :
- user agent changé pour Mozilla/5.0 afin de prevenir un éventuel mécontentement si un admin voit pas mal de wget. Pour ne pas abuser de la bande passante, on ne rafraichit que de :
- timeout de 7 secondes
- améliorations d’ordre esthétiques
#!/bin/bash
#
# ------------------------------------------------------------------------------
# made by sputnick in da FreAkY lAb (c) 2010
# gilles.quenot <AT> gmail <DOT> com
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of version 2 of the GNU General Public
# License published by the Free Software Foundation.
# (see http://www.gnu.org/licenses/gpl.html).
# ------------------------------------------------------------------------------
# ,,_
# o" )@
# ''''
#------------------------------------------------------------------------------#
# V e r s i o n i n f o r m a t i o n #
#------------------------------------------------------------------------------#
# $Id:: fip-rss.bash 1 2010-09-29 15:09:49Z sputnick $: #
# $Revision:: 1 $: #
# $Author:: sputnick <gilles.quenot@gmail.com> $: #
# $Date:: 2010-09-29 17:10:54 +0200 (mer., 29 sept. 2010) $: #
# $Hash:: $: #
#------------------------------------------------------------------------------#
# E n d o f v e r s i o n i n f o r m a t i o n #
#------------------------------------------------------------------------------#
#
# vim:ts=4:sw=4
readlink -f /proc/$$/exe | grep -q bash || {
echo >&2 "Hey dude ! You must call $0 with bash !"
exit 2
}
die() {
kill $_pid
echo
stty echo
exit ${1:-0}
}
trap 'res=$?; die $res' 1 2 3 15
mplayer &>/dev/null http://mp3.live.tv-radio.com/fip/all/fiphautdebit.mp3 & _pid=$!
while kill -0 $_pid; do
IFS='%' read titre details < <(
wget --user-agent="Mozilla/5.0" -qO- http://players.tv-radio.com/radiofrance/metadatas/fipRSS_a_lantenne.html |
awk '/^<MARQUEE DIRECTION/,/^<\/MARQUEE>/' |
html2text -nobs |
tr '\n' '%'
)
titre=$(echo $titre)
details=$(echo $details)
clear
cat<<-EOF
On air:
$titre
$details
EOF
echo -n 'Saisir "g" pour rechercher avec google ou "q" pour quitter. >>> '
read -n 1 -s -t 7
case $REPLY in
g)
titre=$(sed -r 's@[[:space:]\-]+@+@g' <<< "$titre")
details=$(sed -r 's@[[:space:]\-]+@+@g' <<< "$details")
url="http://www.google.com/search?q=\"${titre}\"+${details}&ie=utf-8&oe=utf-8&lr=lang_en"
#firefox -remote "openurl('${url}',new-tab)"
xdg-open &>/dev/null "${url}"
;;
q)
die
;;
esac
done
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#17 Le 29/09/2010, à 23:34
- jovial
Re : Fip recupérer les infos en bash
@ sputnick
Hello , j'ai testé ton script j'ai des erreurs
jean-luc@jean-luc-pc:~$ bash extract.sh
extract.sh: line 72: warning: here-document at line 48 delimited by end-of-file (wanted `EOF')
extract.sh: line 73: Erreur de syntaxe : fin de fichier prématurée
jean-luc@jean-luc-pc:~$
En copiant le script dans gedit je perds la coloration syntaxique à partir de la ligne 49 après cat<<-EOF
jluc
Dernière modification par jovial (Le 29/09/2010, à 23:40)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#18 Le 29/09/2010, à 23:45
- sputnick
Re : Fip recupérer les infos en bash
Oui, c'est à cause du copier coller. Une copie est dispo ici, ya qu'à copier coller cela dans ton term :
wget http://www.sputnick-area.net/scripts/fip-rss.bash
chmod +x fip-rss.bash
./fip-rss.bash
Dernière modification par sputnick (Le 29/09/2010, à 23:46)
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#19 Le 29/09/2010, à 23:58
- jovial
Re : Fip recupérer les infos en bash
@sputnick
Et bien ça marche nickel, bon job.
Pourquoi cela passe passe avec le copier collé ?
Grand merci à toi , et au autres
Je vais l'arranger à ma sauce, je vous tiens au courant
Bye
jluc
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#20 Le 30/09/2010, à 00:18
- sputnick
Re : Fip recupérer les infos en bash
Ca marche pas car ca ajoute des espaces à la fin des lignes.
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#21 Le 30/09/2010, à 18:58
- jovial
Re : Fip recupérer les infos en bash
Bonjour j'ai avancé sur le script dispo ici
https://sites.google.com/site/jovialubu … -infos-now
Il me manque
- du code pour informer l'absence du paquet
- du code pour placer une variable string dans le presse papier
Bye
Jean-Luc
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#22 Le 30/09/2010, à 19:34
- sputnick
Re : Fip recupérer les infos en bash
# fonction de test de présence commande
testApp() {
if ! type &>/dev/null "$1"; then
echo >&2 "Le paquet $1 soit être installé!"
die
fi
}
# utilisation de la fonction
testApp html2text
# presse papier
xsel <<< string
Sinon, je te suggère de changer tes test [ par des [[ si tu utilise bash, c'est plus puissant.
Aussi la forme `` est dépréciée en faveur de $()
Dernière modification par sputnick (Le 30/09/2010, à 19:37)
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#23 Le 01/10/2010, à 09:58
- jovial
Re : Fip recupérer les infos en bash
# presse papier
xsel <<< string
Installer le paquet: xsel
Copier recho "a-bit-of-text" | xsel -b
Autres exemples avec aussi xclip: http://linuxtidbits.wordpress.com/2008/ … o" | xclip
merci
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne
#24 Le 01/10/2010, à 14:46
- sputnick
Re : Fip recupérer les infos en bash
Pas besoin d'un pipe, ma solution est adaptée, je pense que tu ne l'a pas gardée parce que tu n'a pas compris :
xsel <<< string
C'est comme un here-doc sauf que sur une seule ligne ça s’appelle un here-string :
LC_ALL=C man bash | less +'/Here Strings'
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#25 Le 04/10/2010, à 08:25
- jovial
Re : Fip recupérer les infos en bash
Pas besoin d'un pipe, ma solution est adaptée, je pense que tu ne l'a pas gardée parce que tu n'a pas compris :
xsel <<< string
Bonjour
Alors je connais "<" "<<" mais rien trouvé avec "<<<"
xsel <<< "ma chaine " ne donne rien, donc si quelqu'un veux m'éclairer ...
Sinon, je te suggère de changer tes test [ par des [[ si tu utilise bash, c'est plus puissant.
Aussi la forme `` est dépréciée en faveur de $()
Plus puissant cela veux dire quoi ?
$() c'est vrai que c'est plus explicite pour la lecture.
Merci
Jluc
Dernière modification par jovial (Le 04/10/2010, à 08:46)
Ubuntu 22.10: Dell Optiplex 7040, I7-6700 16Gio - 22.04: Dell Latitude E7270 i5-6300U 8Gio
Hors ligne