Enregistre le titre en cour sur radio dans un fichier texte

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
John
Messages : 16
Inscription : mar. 07/mai/2013 9:29

Enregistre le titre en cour sur radio dans un fichier texte

Message 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.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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
Dernière modification par Backup le ven. 10/mai/2013 14:50, modifié 17 fois.
John
Messages : 16
Inscription : mar. 07/mai/2013 9:29

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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 ;)
John
Messages : 16
Inscription : mar. 07/mai/2013 9:29

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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:
John
Messages : 16
Inscription : mar. 07/mai/2013 9:29

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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!
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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 ;)
John
Messages : 16
Inscription : mar. 07/mai/2013 9:29

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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 ;)
John
Messages : 16
Inscription : mar. 07/mai/2013 9:29

Re: Enregistre le titre en cour sur radio dans un fichier te

Message par John »

t'est super merci a toi.
John
Messages : 16
Inscription : mar. 07/mai/2013 9:29

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Enregistre le titre en cour sur radio dans un fichier te

Message 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 ;)
Répondre