Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Julierme Felix

Dados do XML do Shoutcast

Recommended Posts

Pessoal

Estou criando um player em flash para um site de radio online, consigo rodar o stream, mas não estou conseguindo trazer as informações das musicas que estão sendo tocadas.

Estou usando o xml gerado automaticamente pelo shoutcast.

Tentei usar o ID3 mas não consegui, li um outro tópico aqui relacionado ao ID3 com shoutcast, mas pelo que vi tb não houve solução.

Segue abaixo o codigo para analise e possivel ajuda de todos.

Sempre aparece como undefined.

 

function stream()
{
    System.security.allowDomain("http://dominio:7020");
    myRadio = new String("http://dominio:7020/;");
    mySound = new Sound();
    mySound.loadSound(myRadio, true);
    mySound.start();

} 

function clearBuffer()
{
    mySound.stop();
    delete mySound;
    stream();

} 

timerinProgress = false;
musicOn = true;
offonText = "OFF";
System.security.allowDomain("http://dominio:7020");
myRadio = new String("http://dominio:7020/;");
mySound = new Sound();
mySound.loadSound(myRadio, true);
mySound.start();

var vol = 80;
_root.onEnterFrame = function ()
{
    _root.mySound.setVolume(vol);

};
var intervalID = setInterval(clearBuffer, 1200000);


if(ligado==null) {
	i = 0;
	vol = 100;
	ligado = false;
}

this.onEnterFrame = function () {
	mySound.setVolume(vol);
}

if(ligado==false) {
	mySound.loadSound(myRadio, true);
	if(i<2)
	i++;
	else
	i = 0;
	ligado=true;
}

//tentando pegar informações atraves do ID3
//artista.text = "Artista: " + _root.mySound.id3.artist;
//musica.text = "Musica: " + _root_mySound.id3.songname;

verifica = mySound.getVolume();
if(verifica>=100) {
	mySound.setVolume(100);
}
if(verifica<=0) {
	mySound.setVolume(0);
}
v3.text = mySound.getVolume() + "%";


mySound.onSoundComplete = function() {
	ligado = false;
}

//aumenta volume
v1.onRelease = function() {
	verifica = mySound.getVolume();
	vol = verifica+5;
}

//diminui volume
v2.onRelease = function() {
	verifica = mySound.getVolume()
	vol = verifica-5;
}

//parar música
parar.onRelease = function() {
	acao = "stop"
	mySound.stop();
}

//pause música
pause.onRelease = function() {
	acao = "pause";
	pos = mySound.position/1000;
	mySound.stop();
}

tocar.onRelease = function() {
	if(acao=="pause") {
		mySound.start(pos);
		acao="";
	} else {
		mySound.start();
	}
}

passar.onRelease = function() {
	ligado = next;
	mySound.start();
}

//Buscar informações do xml

function loadXML(loaded) {
System.security.allowDomain("http://dominio:7020");
if (loaded) {
_root.songtitle= this.firstChild.childNodes[8].firstChild.nodeValue;
_root.dj = this.firstChild.childNodes[7].firstChild.nodeValue;
musica.text = "MUSICA: " + _root.songtitle;
artista.text="DJ: " + _root.dj;

} else {
trace("Servidor não localizado");

}
}

System.useCodepage = true;
var meuXML:XML = new XML();
meuXML.ignoreWhite = true;
meuXML.addRequestHeader("User-Agent","Mozilla");
meuXML.load("http://dominio:7020/admin.cgi?pass=senha&mode=viewxml"); 
//trace(this.firstChild);

Compartilhar este post


Link para o post
Compartilhar em outros sites

é impressão minha, ou você esqueceu de atribuir a função de onLoad:

 

 

var meuXML:XML = new XML();

meuXML.ignoreWhite = true;

meuXML.addRequestHeader("User-Agent","Mozilla");

meuXML.onLoad = loadXML;

meuXML.load("http://dominio:7020/admin.cgi?pass=senha&mode=viewxml");

 

 

outro detalhes, é saber se o domínio onde esta esse XML, deu permissão para acessar através do crossdomain.xml

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

o meuXML.onload=loadXML

Existe..é que na hora q coloquei aki o codigo vai ver que não copiei ele...

Fiz o arquivo crossdomain.xml ... mas mesmo assim não esta lendo o arquivo xml...

fiz o seguinte teste abaixo e confirmei que o arquivo xml não esta sendo lido.

o resultado foi "não leu o arquivo"

Estou executando o player fora do dominio do streaming...

 

Obs:. como saber isso: "outro detalhes, é saber se o domínio onde esta esse XML, deu permissão para acessar através do crossdomain.xml"

 

//Buscar informações do xml

function loadXML(loaded) {
System.security.allowDomain("http://dominio:7020");
if (loaded) {
musica.text = "lendo arquivo com sucesso";

} else {
musica.text = "não leu o arquivo";

}
}

System.useCodepage = true;
var meuXML:XML = new XML();
meuXML.ignoreWhite = true;
meuXML.onLoad = loadXML;
meuXML.addRequestHeader("User-Agent","Mozilla");
meuXML.load("http://dominio:7020/admin.cgi?pass=senha&mode=viewxml"); 

 

é impressão minha, ou você esqueceu de atribuir a função de onLoad:

 

 

var meuXML:XML = new XML();

meuXML.ignoreWhite = true;

meuXML.addRequestHeader("User-Agent","Mozilla");

meuXML.onLoad = loadXML;

meuXML.load("http://dominio:7020/admin.cgi?pass=senha&mode=viewxml");

 

 

outro detalhes, é saber se o domínio onde esta esse XML, deu permissão para acessar através do crossdomain.xml

 

 

[]´s

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

se o seu swf esta no www.dominio1.com.br, e o XML que ele esta tentando ler esta em www.dominio2.com.br

 

no dominio2, deve ter um arquivo XML(com o nome crossdomain.xml), liberando acesso para o flash acessar arquivos dele

 

 

dê uma pesquisada por crossdomain.xml aqui no fórum que tem uns tópicos sobre isso

 

 

[]s

Compartilhar este post


Link para o post
Compartilhar em outros sites

se o seu swf esta no www.dominio1.com.br, e o XML que ele esta tentando ler esta em www.dominio2.com.br

 

no dominio2, deve ter um arquivo XML(com o nome crossdomain.xml), liberando acesso para o flash acessar arquivos dele

 

 

dê uma pesquisada por crossdomain.xml aqui no fórum que tem uns tópicos sobre isso

 

 

[]s

 

Tinha colocado o crossdomain.xml no dominio onde estava executando o player.

Agora coloquei no dominio do stream...mas mesmo assim não funcionou.

 

meu cross esta assim:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="netfelix.com.br"/>
<site-control permitted-cross-domain-policies="all"/>
<allow-http-request-headers-from domain="*" headers="*" secure="true" /> 
</cross-domain-policy>

no flash estou colocando assim na função loadXML

System.security.allowDomain("http://208.115.228.122");
Security.loadPolicyFile("http://208.115.228.122/crossdomain.xml");

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, seria apenas no domínio do stream, não precisa mudar nada no flash, ele vai puxar automaticamente esse crossdomain.xml,

 

tente tirar esses códigos do flash e teste para ver

 

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, seria apenas no domínio do stream, não precisa mudar nada no flash, ele vai puxar automaticamente esse crossdomain.xml,

 

tente tirar esses códigos do flash e teste para ver

 

 

 

 

[]´s

 

Não deu certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal pelo PHP ele pega os dados do arquivo xml, usando o seguinte:

 

fputs($scfp,"GET /admin.cgi?pass=$scpass&mode=viewxml HTTP/1.0\r\nUser-Agent: SHOUTcast Song Status (Mozilla Compatible)\r\n\r\n");

 

No flash o problema não estaria na opção:

 

meuXML.addRequestHeader("User-Agent","Mozilla");

 

 

 

 

 

 

 

sim, seria apenas no domínio do stream, não precisa mudar nada no flash, ele vai puxar automaticamente esse crossdomain.xml,

 

tente tirar esses códigos do flash e teste para ver

 

 

 

 

[]´s

 

Não deu certo

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz o crossdomin coloquei no servidor de stream, mas mesmo assim não rodou...

segue o codigo do crossodomain.

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="http://208.115.228.122:7020"/>
<allow-access-from domain="netfelix.com.br"/>
<allow-access-from domain="radiohonraelouvoraosenhor.net"/>
<allow-access-from domain="http://208.115.228.122"/>

<site-control permitted-cross-domain-policies="all"/>
<allow-http-request-headers-from domain="*" headers="*" secure="true" /> 
</cross-domain-policy>

codigo que deveria ler o xml

function loadXML(loaded){

if (loaded) {
_root.songtitle = this.firstChild.childNodes[8].firstChild.nodeValue;
_root.SERVERTITLE = this.firstChild.childNodes[7].firstChild.nodeValue;
musica.text = "MUSICA: " + _root.songtitle;
artista.text="DJ: " + _root.SERVERTITLE;

} else {
artista.text="Não Lendo o arquivo XML";
}
}

//System.useCodepage = true;
var meuXML:XML = new XML();
meuXML.ignoreWhite = true;
meuXML.onLoad = loadXML;
meuXML.addRequestHeader("User-Agent","Mozilla");
meuXML.load("http://208.115.228.122:7020/admin.cgi?pass=senha&mode=viewxml");

acesse o link abaixo para testar....

http://netfelix.com.br/Player.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo fiz uns testes e notei que você faz um login para acessar o admin neh?

Esta senha enviada com parâmetro pode ser insegura dentro do flash, pois as pessoas podem decompilar-lo e roubar-la.

 

E como você havia dito que funcionou com o php você pode fazer o seguinte:

 

No php que você criou ninguem poderá ter acesso a esta senha, porque o php é server side, e no flash você carrega um xml da saída deste php :D

 

É uma possível solução ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

OLá

Consegui gerar o xml a partir do PHP e o flash agora esta lendo o XML.

Mas não consegui que ao tocar a proxima musica os dados sejam recarregados, ou seja que o xml seja criado novamente, se dar um refresh na pagina isso acontece...mas estou buscando fazer dentro do php.

 

segue exemplo agora com as informações.

 

http://netfelix.com.br/radio/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

isto é porque o shoutcast é uma audio que vai sendo baixado progressivamente, teóricamente não tem fim, e ele vai ocupando a memória do flash progressivamente tmb.. uma hora vai estourar hehe...

Mas até ai sem problemas (ou nao rsrs).

 

Mas voltando ao assunto: tem como você descobrir via este XML o tempo da música, o tempo decorrido ou o tempo restante?

 

Voê pode fazer com que de 5 em 5 segundos ele dê um reload no xml:

 

http://snipplr.com/view/4563/as3-basic-timer-example/

 

//tempo em milisegundos, 1000 = 1 seg
var timer:Timer = new Timer(5000);
    timer.addEventListener(TimerEvent.TIMER, reloadXML);
    timer.start();

function reloadXML(e:TimerEvent):void{
     //Carregar XML Novamente
}

Assim ele vai checando toda hora qndo mudar o audio ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Irineu pela ajuda e pela dica do PHP.

 

Acho que agora consegui resolver, fiz umas alterações no PHP e no flash.

 

codigo php

<?php
include('config_radio.php');
$scfp = fsockopen("$scip", $scport, &$errno, &$errstr, 10);
 fputs($scfp,"GET /admin.cgi?pass=$scpass&mode=viewxml HTTP/1.0\r\nUser-Agent: SHOUTcast Song Status (Mozilla Compatible)\r\n\r\n"); 
  while(!feof($scfp)) {
  $page .= fgets($scfp, 1000);
  }

 $loop = array("STREAMSTATUS", "BITRATE", "SERVERTITLE", "CURRENTLISTENERS");
 $y=0;
 while($loop[$y]!=''){
  $pageed = ereg_replace(".*<$loop[$y]>", "", $page);
  $scphp = strtolower($loop[$y]);
  $$scphp = ereg_replace("</$loop[$y]>.*", "", $pageed);
  if($loop[$y]==SERVERGENRE || $loop[$y]==SERVERTITLE || $loop[$y]==SONGTITLE || $loop[$y]==SERVERTITLE)
   $$scphp = urldecode($$scphp);

  $y++;
 }

 $pageed = ereg_replace(".*<SONGHISTORY>", "", $page);
 $pageed = ereg_replace("<SONGHISTORY>.*", "", $pageed);
 $songatime = explode("<SONG>", $pageed);
 $r=1;
 while($songatime[$r]!=""){
  $t=$r-1;
  $playedat[$t] = ereg_replace(".*<PLAYEDAT>", "", $songatime[$r]);
  $playedat[$t] = ereg_replace("</PLAYEDAT>.*", "", $playedat[$t]);
  $song[$t] = ereg_replace(".*<TITLE>", "", $songatime[$r]);
  $song[$t] = ereg_replace("</TITLE>.*", "", $song[$t]);
  $song[$t] = urldecode($song[$t]);
  $dj[$t] = ereg_replace(".*<SERVERTITLE>", "", $page);
  $dj[$t] = ereg_replace("</SERVERTITLE>.*", "", $pageed);
$r++;
 }
//end song info

fclose($scfp);

echo "<?xml version='1.0' enconding='UTF-8 ?>";
echo "<item>";
echo "<musica>$song[0]</musica>";
echo "<dj>$servertitle</dj>";
echo "<tocou>$song[1]</tocou>";

?>

codigo no flash

//Buscar informações do xml(radioju.php)

function loadXML(loaded){

if (loaded) {
_root.songtitle = this.firstChild.childNodes[0].firstChild.nodeValue;
_root.SERVERTITLE = this.firstChild.childNodes[1].firstChild.nodeValue;
_root.tocou = this.firstChild.childNodes[2].firstChild.nodeValue;
musica.text = "Tocando: "+ _root.songtitle;
artista.text="DJ: " + _root.SERVERTITLE;
album.text="Tocou: "+_root.tocou;
} else {
artista.text="Não Lendo o arquivo XML";
}
}


var meuXML:XML = new XML();
meuXML.ignoreWhite = true;
meuXML.onLoad = loadXML;
meuXML.addRequestHeader("User-Agent","Mozilla");
meuXML.load("radioju.php");


var timer = setInterval(reloadXML, 5000);
timer.start();

function reloadXML():Void{

var meuXML:XML = new XML();
meuXML.ignoreWhite = true;
meuXML.onLoad = loadXML;
meuXML.addRequestHeader("User-Agent","Mozilla");
meuXML.load("radioju.php");
loadXML.start();
}

coloquei aki para teste

 

http://netfelix.com.br/Player.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá pessoal, sou novo no forum e no flash tbm.

 

com ajuda do Julierme, utilizei o mesmo metodo dele para exibir o nome das musicas, porem o html gerado pelo flash não toca.

estou com player.html e o player.swf hospedados no localhost e ao abri-los é apresentado o nome da musica, mas não sai o som.

 

o q pode ser?

 

desde já agradeço aos que me ajudarem pois falta apenas o player para eu colocar o site no ar.

 

grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez seja problema de crossdomain, já verificou?

 

 

Olá Irineu, o crossdomain não tem a ver apenas com o xml pra mostrar o nome das musicas não?

se não como verifico isso?

 

Obs: estou testando a radio por isso utilizo o listen2myradio para o streaming.

 

aguardo resposta

Compartilhar este post


Link para o post
Compartilhar em outros sites

O crossDomain serve para tudo que exiga acessar domínios estrangeiros (até no mesmo domínio, mas com portas diferentes).

 

Se no seu pc local funciona mas na web não, é bem provável que seja o crossdomain ;)

 

Uma dica: no safari ao acessar um site em flash que não carrega algo, em Window>Activity, ele aponta caso não tenha encontrado o arkivo ou se falta o crossdomain.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O crossDomain serve para tudo que exiga acessar domínios estrangeiros (até no mesmo domínio, mas com portas diferentes).

 

Se no seu pc local funciona mas na web não, é bem provável que seja o crossdomain ;)

 

Uma dica: no safari ao acessar um site em flash que não carrega algo, em Window>Activity, ele aponta caso não tenha encontrado o arkivo ou se falta o crossdomain.

 

realmente com um arquivo local funcionou perfeitamente.

 

bom se for problema do crossdomain não tem como resolver com o listen2myradio pq num tem como acessar ou fazer o upload do arquivo lá.

 

mas tipo tem como utilizar o load para carregar uma pagina em outro servidor?

tipo meuXML.Load("pagina de outro servidor")?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.