[SRC] Obtener Titulos de un stream de audio.

Iniciado por 16BITBoy, 11 Enero 2011, 01:09 AM

0 Miembros y 1 Visitante están viendo este tema.

16BITBoy

Hola!
Me mandaron esto del instituto y creo que seria interesante compartir esta clase con ustedes, asi contribuyo un poquito ^^. Asi mientras todos hagamos esto, cumplimos con esa frase muy sonada y buena: "Ningún problema debería resolverse 2 veces".

Esta clase se encarga de mantenerse en escucha a la emisora de streaming que le digamos con el método setSource, y devuelve por pantalla el título de las canciones que esta ha reproducido.

La URL debe apuntar al stream directamente y no al playlist. Ha sido probada con servidores como shoutcast y icecast ( y el que usa M80 radio para emitir que no me acuerdo en estos momentos :D ) Para poner al programa en escucha se llama al método startLog.

Los comentarios los tengo escritos en ingles, pero he añadido una linea mas para los que lo quieran leer en español.

El codigo aqui:
Código (java) [Seleccionar]

/**
* Lectura de tags de streams de audio.
*
* 16BITBoy
*/


import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.*;

public class StreamTitles {

/**
* @param args
*/
public static void main(String[] args) {

StreamTitleLog log = new StreamTitleLog();

//Especificamos la emisora a escuchar | Set stream URL.

try {
log.setSource(new URL("http://relay5.slayradio.org:8000"));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Que empiece el registro ;) | Start logging.
try {
log.startLog();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

class StreamTitleLog {

private final String tag = "StreamTitle='"; //We should look for this in the stream of bytes

private URL url = null;

//Default constructor
public StreamTitleLog(){

}

public void setSource(URL url){
this.url = url;
}

public URL getSource(){
return url;
}

private void getTitle(BufferedInputStream is) throws IOException{

StringBuilder buffer = new StringBuilder();

while(true){

while(is.available() < 0){
continue;
}

buffer.append((char)is.read());

if(buffer.charAt(buffer.length() - 1) == '\''){

buffer.deleteCharAt(buffer.length() - 1);
titles.add(buffer.toString());

System.out.println(buffer.toString());

break;

}

}
}

public void startLog() throws IOException{

ArrayList<Character> buffer = new ArrayList<Character>();

//This is the get header info we need to send in order to retrieve stream titles
//Esta es la info de cabecera del get que necesitamso enviar para recibir los titulos
URLConnection uc = url.openConnection();
uc.setRequestProperty("Connection", "close");
uc.setRequestProperty("icy-metadata", " 1");
uc.setRequestProperty("transferMode.dlna.org", "Streaming");

BufferedInputStream is = new BufferedInputStream(uc.getInputStream());


//El metodo, como una videoconsola trata a un mando de juegos a la espera de
//una combinacion de botones. Esa combinación será que cada uno de los caracteres
//llegue al stream, si solo llega uno, tres o casi todos no nos sirve, lo queremos entero

//This method is like trying to retrieve the desired sequence of button presses.
//If the sequence does not match at some point, buffer is cleared.

while(true){

while(is.available() < 0){
continue;
}
buffer.add((char)is.read());

if(buffer.get(buffer.size() - 1) == tag.charAt(buffer.size() - 1)){

if(buffer.size() == tag.length()){

getTitle(is);
buffer.clear();

}

}
else{

buffer.clear();

}
}

}

}


Espero que os sea de alguna utilidad. Saludos ;)
Blog personal: http://www.16bitboy.com/blog

- Que horrible pesadilla, unos y ceros por todas partes... hasta me parecio ver un ¡dos!
- Bender, solo fue una pesadilla, no existe eso que llamas "dos".

kasiko

Nos vemos...


Debci

Es muy interesante tu código!
Se agradece muchísimo este aporte.
No dejes de programar y traernos todas tus ideas, y dudas, para poder llevarlas a cabo :P

Saludos