(NOTA: Actualmente no funciona porque ya no es posible recuperar las emisoras y ademas shoutcast esta emitiendo en AAC, shoutcast a protegido el sistema en el que muestra los links de los archivos .pls mediante cookies y javascript, quizas sería posible capturando el valor de la cookie que te envía la pagina en el header para luego enviarla nuevamente en la petición curl junto al header para así engañar y poder traerte los links, e intentado capturar las cookies y guardarlas para enviarla en los headers con curl pero no me ha funcionado, quizás alguien más entendido pueda hacerlo, pienso que es un poco tontería perder tanto tiempo en hackear la protección de los links cuando es mas fácil registrarse en shoucast y usar la API que ellos mismos proporcionan.
Create list of stations with as3 flash player radio for connecting to and parsing shoutcast.com pls files
Hace nada me estuve preguntando cómo se podría hacer para recuperar la lista de géneros y las radios de shoutcast.com para hacer un playList, estube buscando info por internet y lamentablemente no encontré nada ni tampoco ningún webservice disponible desde shoutcast.com, así que me puse a trastear como conseguirlo de la manera más simple posible.
El invento funciona bien, aunque es un poco lento, ya que el modo en que recupera el contenido, es cargando las páginas completas de shoutcast.com y leyendo los enlaces de su interior.
El proceso es sencillo, primero cargamos la pagina principal de shoutcast y recuperamos todos los géneros listados en ella, después dependiendo del genero que seleccionemos, cargamos la pagina de ese género y recuperamos todos los enlaces a archivos .pls, abrimos los pls extraemos los links de las radios y se las pasamos a flash, un poco basto pero fácil 🙂
El problema de este truquillo que nos podemos encontrar es que si la gente de shoutcast decide cambiar la estructura de los links o del formato .pls el invento dejara de funcionar y tendremos que adaptar de nuevo los archivos php.
Estoy seguro que a más de uno le será de utilidad, aquí os dejo el ejemplo y debajo del ejemplo la descarga del mismo y si alguien sabe otra manera mejor para hacerlo que no dude en compartirlo.
[download id=»5″ format=»2″]
Código del ejemplo playlist
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
//Events import flash.events.Event; //NET import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.net.URLRequestMethod; //PASO 1 ################## RECUPERANDO GENEROS ################### //----------- CONFIGURAMOS //Creamos el loader encargado de cargar los géneros var generos:URLLoader = new URLLoader(); //le decimos que cargue los datos como TEXTO en vez de variables generos.dataFormat = URLLoaderDataFormat.TEXT; //Insertamos un listener para cuando los datos estén cargados generos.addEventListener(Event.COMPLETE, onLoadGeneros); //Llamamos al archivo php encargado de buscar los géneros en shoutcast.com; generos.load(new URLRequest("getGeneros.php")); //mientras carga deshabilitamos los 2 componentes lista para que no se pueda hacer click en ellos; listaGeneros.enabled = listaEmisoras.enabled = false; waitShow(); //----------- //Es llamada cuando los datos han sido cargados function onLoadGeneros(e:Event):void { waitHide(); //el archivo php nos devuelve una cadena con los géneros separados con @@ //Ej: dance@@pop@@trance@RB@@ //Borramos el listener generos.addEventListener(Event.COMPLETE, onLoadGeneros); //Creamos un array para almacenar los géneros var arrGen:Array = new Array(); //Una vez cargados habilitamos la lista de géneros listaGeneros.enabled = true; //Convertimos la cadena de géneros en un array utilizando como separador "@@" arrGen = generos.data.split("@@"); //Recorremos el array y agregamos los valores de cada elemento al componente lista for (var n:int = 0; n<arrGen.length; n++) { listaGeneros.addItem({label:arrGen[n],data:arrGen[n]}); } } //Una vez cargados los géneros escuchamos si se selecciona alguno; listaGeneros.addEventListener(Event.CHANGE,onGeneroChange); //PASO 2 ################## RECUPERANDO EMISORAS ################### //----------- CONFIGURAMOS //Creamos el loader encargado de cargar las emisoras var emisoras:URLLoader = new URLLoader(); //le decimos que cargue los datos como VARIABLES en vez de TEXTO emisoras.dataFormat = URLLoaderDataFormat.VARIABLES; //Creamos un contenedor de variables para enviarlas al script php var sendVars:URLVariables = new URLVariables(); //Creamos un request y lo configuramos para enviar las variables mediante POST var requestPls:URLRequest = new URLRequest(); requestPls.method = URLRequestMethod.POST; //----------- //Es llamada cuando se selecciona un género de la lista de géneros function onGeneroChange(e:Event = null):void { waitShow(); //mientras carga deshabilitamos los 2 componentes lista para que no se pueda hacer click en ellos listaGeneros.enabled = listaEmisoras.enabled = false; //Borramos todo el contenido de la lista de emisoras si hubiera algo listaEmisoras.removeAll(); //Creamos la variable genero que contendrá el nombre del género seleccionado; sendVars.genero = listaGeneros.selectedItem.label; //Pasamos el contenedor de variables a request requestPls.data = sendVars; //Escuchamos cuando se carguen las emisoras encontradas emisoras.addEventListener(Event.COMPLETE, onLoadEmisoras); //Le pasamos a request la ruta del archivo php encargado de devolver las emisoras; requestPls.url = "getStations.php"; //llamamos al php enviándole el contenido de la variable genero //El php buscara todas las emisoras relacionadas con el género enviado por POST emisoras.load(requestPls); } function onLoadEmisoras(e:Event):void { waitHide(); //el archivo php nos devuelve una cadena con formato variable / valor //Ej: total=2 &Title1=hola &File1=mundo &Title2=adios &File2=mundo //Una vez cargado permitimos de nuevo hacer click en los componentes Lista listaGeneros.enabled = listaEmisoras.enabled = true; //eliminamos el listener emisoras.removeEventListener(Event.COMPLETE, onLoadEmisoras); //Agregamos un listener para escuchar cuando se cambia o selecciona una emisora de la lista listaEmisoras.addEventListener(Event.CHANGE, onChangeEmisoras); //Recuperamos en primer lugar la variable total que indica el número total de emisoras //disponibles en la cadena recibida var total:int = emisoras.data.total; for (var n:int =1; n<= total; n++) { //Recorremos los datos recibidos y los añadimos al componente lista de emisoras listaEmisoras.addItem({label:emisoras.data["Title"+n],data:emisoras.data["File"+n]}); } } //PASO 3 ################## REPRODUCIENDO EL SONIDO ################### import flash.media.Sound; var miMusica:Sound = new Sound(); var chanel1:SoundChannel; var isPlaying:Boolean = false; function onChangeEmisoras(e:Event):void { if (isPlaying) { isPlaying = false; chanel1.stop(); } if (!isPlaying) { isPlaying = true; miMusica = new Sound(); miMusica.load(new URLRequest(e.target.selectedItem.data+"/;")); chanel1 = miMusica.play(); } } function waitShow():void{ waiting.visible = true; waiting.play(); } function waitHide():void{ waiting.visible = false; waiting.stop(); } |
Código del script getGeneros.php (Nueva version 2015)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php //jvm.bricobit.com $oldSetting = libxml_use_internal_errors( true ); libxml_clear_errors(); $html = new DOMDocument(); $html->loadHtmlFile( 'http://www.shoutcast.com' ); $select = $html->getElementById('mobile-genres'); $options = $select->getElementsByTagName('option'); $optionValuesArr = array(); foreach($options as $option) { //$text = $option->textContent; $optionValuesArr[] = $option->getAttribute('value'); } echo implode("@@", $optionValuesArr); ?> |
Codigo anterior para recuperar los links desfasado:
$oldSetting = libxml_use_internal_errors( true );
libxml_clear_errors();
$html = new DOMDocument();
//recuperamos la pagina de shoucast
$html->loadHtmlFile( ‘http://www.shoutcast.com’ );
$xpath = new DOMXPath( $html );
$links = $xpath->query( ‘//a’ );
$genArr = array();
//Recorremos todos los links
foreach ( $links as $link ){
$cadena = $link->getAttribute( ‘href’ );
$extraido = substr($cadena,0,7);
$inside = false;
//Solo si el principio de cada link es igual a /radio/
if($extraido == «/radio/»){
//Eliminamos /radio/ y nos quedamos solo con el nombre del genero
$cadena = ereg_replace(«/radio/», «», $cadena);
//Evitamos duplicar generos
for($n = 0; $n
Nuevamente y por causas que desconozco no puedo postear el código del segundo script getStation.php pero podéis encontrarlo dentro de la descarga del ejemplo de arriba.
Por alguna razón existen algunas líneas de código en php que cuando se postean en una entrada de wordpress ese código es interpretado aun estando dentro de los tags (php) y (/php) del plugin ig_syntax_hilite dando como resultado un error 404 que no deja postear el código, si alguien tiene la solución para este problema le agradecería que me lo contara.
Social Report xavirobot
6 comments on “AS3 – Audio – Crear lista de emisoras de radio conectando con shoutcast y parseando archivos pls (DEPRECATED)”
huooo! tk jvm, andaba buscando algo así hace tiempo, solo encontré algo parecido por ahí y era mucho más complicado
hola Javier.. fijate donde puse tu playlist
muy bueno 🙂 como lo hicistes? utilizastes una herramienta de terceros en tu pagina de facebook para incrustar el flash no?
si use un FBML statico
Que crack, deberias patentar ese sitema que as utilizado para listar las radios automaticamente jeje te debe haber costado tu tiempo, si llego a ser yo ni loco lo comparto, me quedo con el secreto o lo vendo xD
Enhorabuena por el blog
hola gente necesito ayuda, tengo esta app y tengo un problema, despues de escuchar unos minutos el audio ser corta, tengo que darle a boton stop y volver a dar al play, para volver a escuchar por un tiempo mas, nesecitaria saber como hacer que solo vuelva a buscar el audio del streamming….ayuda por favor…
import flash.media.SoundTransform;
btn_stop.addEventListener(MouseEvent.CLICK, detener);
function detener(event:MouseEvent) {
gotoAndStop(«36»);
SoundMixer.stopAll()
}
var mySound:Sound = new Sound();
var songURL:URLRequest = new URLRequest(«http://109.169.37.137:24950/stream?type=.icecast;»);
var context:SoundLoaderContext = new SoundLoaderContext(500, true);
var channel1:SoundChannel = new SoundChannel();
var volumeAdjust:SoundTransform = new SoundTransform();
var timeout:Number = 1;
volumeAdjust.volume = 1.0;
mySound.load(songURL);