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

Code : Tout sélectionner

interpret.s
titre.s


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 :lol:

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 :lol:

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

Code : Tout sélectionner

if interpret.s<>"" and titre.s<>""
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 :

Code : Tout sélectionner

DeleteFile("info.txt")
mon code est corrigé dans ce sens ;)