Page 1 sur 3
Enregistre le titre en cour sur radio dans un fichier texte
Publié : mar. 07/mai/2013 9:45
par John
Bonjour
Tout d'abords je suis complétement novice dans le codage informatique.
Voici mon problème, je veut récupéré le titre du morceau en cour de lecture sur une radio internet
dans un fichier texte pour alimenter un encodeur RDS.
Le site de la radio est
http://www.smoothjazz.com lorsque j'utilise le programme wget j'arrive a récupéré la page entière le problème étant de filtre l'info qui m’intéresse. En l'occurrence:
Code : Tout sélectionner
</div>
<div class='nowplaying_album'><img src="/images/cd_covers/marilyn_scott_every_time.jpg" alt="CD Cover" id="nowplaying_album_img" height="135" width="135"></div>
<div class='nowplaying_info'>
<span class="nowplaying_artist">Marilyn Scott</span><br>
<span class="nowplaying_song"> Cry Me A River</span><br>
<span class="nowplaying_album_title">Every Time We Say Goodbye</span><br>
je pense que le plus simple est d'utiliser les fonctions de purebasic pour faire le travail de wget, filter l'info, l'enregistre sur le disque, et cela toute les minutes pour ne pas rater un titre.
j'ai commencer un bout de code avec l'aide d'un ami qui lui fait un truc similaire mais pour une image sur le web.
Code : Tout sélectionner
; nowplaying_artist
#nowplaying_artist = 0
; nowplaying_song
#nowplaying_song = 0
; nowplaying_album_title
#nowplaying_album_title = 0
; chemin web
Fichierindex1$ = "http://www.smoothjazz.com"
;----------------- lecture page web ---------------------------
ProcedureDLL Read_File(file.s)
#INTERNET_FLAG_RELOAD = $80000000
Bytes.l = 0
flg_i = 0
*html = AllocateMemory( 500000)
hInet.l = InternetOpen_(Fichierindex2$, 1, #Null, #Null, 0)
If hInet
hURL.l = InternetOpenUrl_(hInet, file, #Null, 0, #INTERNET_FLAG_RELOAD, 0)
If hURL
If InternetReadFile_(hURL, *html, 500000, @Bytes)
Result =
InternetCloseHandle_(hURL)
Else
Bytes.l = 0
EndIf
Else
Bytes.l = 0
EndIf
InternetCloseHandle_(hInet)
Else
Bytes.l = 0
EndIf
FreeMemory(*html)
ProcedureReturn Bytes
EndProcedure
Mais je cale très rapidement.
Merci pour votre aide.
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 10:25
par Ar-S
Perso je lis le source et récupère ce genre de donnée en lisant la source (recherche Url2Text2) puis en utilisant
Code : Tout sélectionner
D.s = "<div class='nowplaying_info'> <span class="+Chr(34)+"nowplaying_artist"+Chr(34)+">Marilyn Scott</span><br> <span class="
D + Chr(34)+"nowplaying_song"+Chr(34)+"> Cry Me A River</span><br> <span class="+Chr(34)+"nowplaying_album_title"+Chr(34)
Nbr_de_mot_cle = 2
Source.s = D.s
For i = 1 To Nbr_de_mot_cle
pos1 = 0
pos2 = 0
Select i
Case 1
MotCle.s = "nowplaying_artist"
Case 2
MotCle.s = "nowplaying_song"
EndSelect
BaliseStart.s = "<span class="+Chr(34)+MotCle.s+Chr(34)+">"
BaliseEnd.s = "</span><br> "
Pos1 = FindString(source.s, BaliseStart.s,0)
Pos1 + Len(BaliseStart)
Pos2 = FindString(source.s, BaliseEnd.s, Pos1)
Titre.s = Mid(source.s, pos1, pos2-pos1)
Debug Titre.s
Next
tu peux aussi utiliser les regex, tu trouveras aussi des exemples à foison (expression régulière)
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 10:39
par G-Rom
bonjour, ton url ne contient pas d'info sur la musique en cour , faut fouiller dans les liens à mon avis :
Code : Tout sélectionner
url$ = "http://www.smoothjazz.com"
Procedure.s OpenURL(URL.s, OpenType.b)
;?OpenType [1 = IOTPreconfig | 2 = IOTDirect | 3 = IOTProxy]
;content.s = OpenURL("http://www.google.de/index.html", 1)
isLoop.b=1
INET_RELOAD.l=$80000000
hInet.l=0: hURL.l=0: Bytes.l=0
Buffer.s=Space(2048)
res.s=""
hInet = InternetOpen_("PB@INET", OpenType, #Null, #Null, 0)
hURL = InternetOpenUrl_(hInet, URL, #Null, 0, INET_RELOAD, 0)
Repeat
InternetReadFile_(hURL, @Buffer, Len(Buffer), @Bytes)
If Bytes = 0
isLoop=0
Else
res = res + Left(Buffer, Bytes)
EndIf
Until isLoop=0
InternetCloseHandle_(hURL)
InternetCloseHandle_(hInet)
ProcedureReturn res
EndProcedure
Debug OpenUrl(url$,1)
une fois que tu as trouvé le lien , extrait la partie qui t'interesse avec ce bout de code :
Code : Tout sélectionner
Procedure.s ExtractFromTag(Text.s, open.s, close.s)
PosA = FindString(Text,open,1) + Len(open)
PosB = FindString(Text,close,2)
Out$ = Mid(Text,PosA,PosB-PosA)
ProcedureReturn Out$
EndProcedure
string$ = "<blop>Glop</blop> et <blop>Pas Glop</blop>"
;-Extraction
exp = CreateRegularExpression(#PB_Any, "<blop>([^<]*)</blop>")
Dim Strong$(0)
StrongFound = ExtractRegularExpression(exp,string$, Strong$())
FreeRegularExpression(exp)
;Resultat
For k = 0 To StrongFound-1
Debug ExtractFromTag(Strong$(k),"<blop>","</blop>")
Next
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 10:52
par Backup
voici un exemple concret avec ton lien
tu patientes 10 secondes
et tu vois le resultat s'afficher .. (n'oublie pas d'autoriser ton Firewall )
toute les 10 secondes la page est Scanné
donc le changement de titre devrai apparaitre
le resultat ( en principe ) est dans les Variables
voila voila
Code : Tout sélectionner
Global site.s = "http://www.smoothjazz.com"
;-declaration
Declare ouvre_fenetre()
Declare.s SearchString(String.s,StartString.s,EndString.s)
Declare.s Url2Text2(Url.s, OpenType.b,ProxyAndPort.s)
Declare.s Url2Text(Url.s)
Declare.s filtre(Var.s)
;-initialisation
Enumeration ; fennetre
#window
EndEnumeration
Enumeration ; gadgets
#editeur
#timer
#editor
EndEnumeration
Enumeration ;Fichier
#file
EndEnumeration
ouvre_fenetre()
;-boucle
Repeat
select WindowEvent()
Case #PB_Event_Timer
if EventTimer() = #timer
interpret.s= SearchString(Url2Text(Site.s),"<span class="+chr(34)+"nowplaying_artist"+chr(34)+">","<")
titre.s= SearchString(Url2Text(Site.s),chr(34)+"nowplaying_song"+chr(34)+">","<")
interpret.s=filtre(interpret.s)
titre.s=filtre(titre.s)
; Affichage Editeur
ClearGadgetItems(#editor)
AddGadgetItem(#editor, 0,"Titre :"+titre.s)
AddGadgetItem(#editor, 0, "Artist: "+interpret.s)
if interpret.s<>"" and titre.s<>""
if OpenFile(#file,"info.txt")
TruncateFile(#File)
WriteString(#file,interpret.s+"-")
WriteString(#file,titre.s)
CloseFile(#file)
Endif
Endif
Endif
Case #PB_Event_CloseWindow
End
Endselect
forever
; ********** Zone des Procedures **********************************
;- zone procedure
Procedure ouvre_fenetre()
OpenWindow(#window,10,10,320,100,"resultat",#PB_Window_SystemMenu )
EditorGadget(#editor,10,10,300,80)
AddWindowTimer(#window, #timer, 10000) ; toute les 10 secondes
EndProcedure
Procedure.s SearchString(String.s,StartString.s,EndString.s)
Global SearchStringIndex,SearchString.s
SearchStringIndex=1
SearchString=String
Start=FindString(SearchString,StartString,SearchStringIndex)
If Start
Start=Start+Len(StartString)
EndIndex=FindString(SearchString,EndString,Start)
If EndIndex
SearchStringIndex=EndIndex+Len(EndString)
ProcedureReturn Mid(SearchString,Start,EndIndex-Start)
Else
EndIndex=Len(SearchString)+1
SearchStringIndex=EndIndex+Len(EndString)
ProcedureReturn Mid(SearchString,Start,EndIndex-Start)
EndIf
Else
Start=1
EndIndex=FindString(SearchString,EndString,Start)
If EndIndex
SearchStringIndex=EndIndex+Len(EndString)
ProcedureReturn Mid(SearchString,Start,EndIndex-Start)
Else
EndIndex=Len(SearchString)+1
SearchStringIndex=EndIndex+Len(EndString)
ProcedureReturn Mid(SearchString,Start,EndIndex-Start)
EndIf
EndIf
EndProcedure
ProcedureDLL.s Url2Text2(Url.s, OpenType.b,ProxyAndPort.s)
; 1 INTERNET_OPEN_TYPE_DIRECT Resolves all host names locally.
; 0 INTERNET_OPEN_TYPE_PRECONFIG Retrieves the proxy Or direct configuration from the registry.
; 4 INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY Retrieves the proxy Or direct configuration from the registry And prevents the use of a startup Microsoft JScript Or Internet Setup (INS) file.
; 3 INTERNET_OPEN_TYPE_PROXY Passes requests To the proxy unless a proxy bypass list is supplied And the name To be resolved bypasses the proxy. In this Case, the function uses INTERNET_OPEN_TYPE_DIRECT.
isLoop.b=1
INET_RELOAD.l = $80000000
hInet.l=0
hURL.l=0
Bytes.l=0
Buffer.s=Space(2048)
res.s=""
hInet = InternetOpen_("", OpenType, ProxyAndPort, "", 0)
hURL = InternetOpenUrl_(hInet, Url, #Null, 0, INET_RELOAD, 0)
Repeat
InternetReadFile_(hURL,@Buffer, Len(Buffer), @Bytes)
If Bytes = 0
isLoop=0
Else
res = res + Left(Buffer, Bytes)
EndIf
Until isLoop=0
InternetCloseHandle_(hURL)
InternetCloseHandle_(hInet)
ProcedureReturn res
EndProcedure
ProcedureDLL.s Url2Text(Url.s)
ProcedureReturn Url2Text2(Url,1,"")
EndProcedure
Procedure.s filtre(Var.s)
for i=32 to 255
if i<100
Var.s = ReplaceString(Var.s,"&#"+"0"+str(i),chr(i) )
Else
Var.s = ReplaceString(Var.s,"&#"+str(i),chr(i) )
Endif
Next i
; By Dobro
; autre exemple de filtre qui a l'avantage que nous voyons directement les caracteres que nous désirons garder , il suffit de les ajouter dans la chaine Ref.s
ref.s="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&()/éèê.:[]-' " ; << derniere caractere est un espace
For i=1 to len(var.s)
ex.s=mid(var.s,i,1)
If findstring(ref.s,ex.s)>0
sort.s=sort.s+ex.s
Endif
Next i
ProcedureReturn Sort.s
Endprocedure
; EPB
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 15:49
par John
bonjour
merci infiniment pour votre aide a présent que les texte son dans les variable interprète et titre,
comment il faut procéder pour écrire un fichier texte sur le disque avec le contenu de ces variables
en incluant l’écriture du fichier dans la boucle de scan de la page pour qu'il soit automatiquement rafraichi?
Merci.
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 15:59
par Backup
John a écrit :bonjour
merci infiniment pour votre aide a présent que les texte son dans les variable interprète et titre,
comment il faut procéder pour écrire un fichier texte sur le disque avec le contenu de ces variables
en incluant l’écriture du fichier dans la boucle de scan de la page pour qu'il soit automatiquement rafraichi?
Merci.
pourquoi tu veux ecrire dans un fichier ?
et quel type d'ecriture ?
je veux dire tu veux que les 2 variable n'apparaissent qu'en haut d'un fichier Text (comme pour l'editeur actuellement )
ou bien il faut que les ecritures s'ecrivent ligne apres ligne pour remplir une page par exemple ??
y aura t'il d'autre info ecris sur le fichier ?
essaye d'tre le plus précis possible le prochain coup

Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 16:07
par John
c'est le logiciel de mon encodeur RDS qui demande un fichier texte pour les infos RDS TXT il faut que le titre et l’interprète soit sur une même ligne.
je pense que ça devrais marcher.
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 16:08
par Backup
John a écrit :c'est le logiciel de mon encodeur RDS qui demande un fichier texte pour les infos RDS TXT il faut que le titre et l’interprète soit sur une même ligne.
je pense que ça devrais marcher.
sur la meme ligne ?
l'interprete en premier ? puis le titre ?
ya pas de séparation ? un code de séparation ?
ps : tu met plus de temps a repondre que moi a coder

Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 16:15
par John
oui c'est ça l'interprete en premier puis le titre séparer par un tirer ça devrais le faire!
oui je suis pas un stakhanoviste du clavier lol!
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 16:20
par Backup
je m'etais endormis , sorry
bon j'ai réedité mon code ci dessus , ça va creer un fichier text du nom de "info.txt" ( a coté du prg .. compilé ou pas .. )
tu pourra le renommer comme tu veux a partir du code
ça fait ce que tu demande

Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 16:29
par John
Super c'est parfait tu est vraiment un chef!
Bravo et merci pour ton aide encore une fois.
A bientôt je vais potasser ton code pour apprendre comment ça marche.
Bye
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 16:33
par Backup
de rien ,
j'ai legerement modifié le code pour ajouter une condition
de sorte que le fichier va se mettre a jour seulement si les variables sont remplies
il arrive rentre 2 morceau que celles ci ne le soit pas

Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 17:08
par John
t'est super merci a toi.
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 17:30
par John
encore un petit pb
ça écrase pas le fichier a chaque rafraichissement ce qui fait qu'une parti de l'ancien titre persiste.
si le suivant n'est pas asse long.
Re: Enregistre le titre en cour sur radio dans un fichier te
Publié : mar. 07/mai/2013 17:34
par Backup
j'ai reglé le probleme en effaçant le fichier .. avant sa creation
pour info , il m'a suffit de faire :
mon code est corrigé dans ce sens
