Foro de elhacker.net

Programación => Java => Mensaje iniciado por: 16BITBoy en 11 Enero 2011, 01:09 am



Título: [SRC] Obtener Titulos de un stream de audio.
Publicado por: 16BITBoy en 11 Enero 2011, 01:09 am
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
  1. /**
  2.  * Lectura de tags de streams de audio.
  3.  *
  4.  * 16BITBoy
  5.  */
  6.  
  7.  
  8. import java.io.BufferedInputStream;
  9. import java.io.IOException;
  10. import java.net.MalformedURLException;
  11. import java.net.URL;
  12. import java.net.URLConnection;
  13. import java.util.*;
  14.  
  15. public class StreamTitles {
  16.  
  17. /**
  18. * @param args
  19. */
  20. public static void main(String[] args) {
  21.  
  22. StreamTitleLog log = new StreamTitleLog();
  23.  
  24. //Especificamos la emisora a escuchar | Set stream URL.
  25.  
  26. try {
  27. log.setSource(new URL("http://relay5.slayradio.org:8000"));
  28. } catch (MalformedURLException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. //Que empiece el registro ;) | Start logging.
  33. try {
  34. log.startLog();
  35. } catch (IOException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39.  
  40. }
  41.  
  42. }
  43.  
  44. class StreamTitleLog {
  45.  
  46. private final String tag = "StreamTitle='"; //We should look for this in the stream of bytes
  47.  
  48. private URL url = null;
  49.  
  50. //Default constructor
  51. public StreamTitleLog(){
  52.  
  53. }
  54.  
  55. public void setSource(URL url){
  56. this.url = url;
  57. }
  58.  
  59. public URL getSource(){
  60. return url;
  61. }
  62.  
  63. private void getTitle(BufferedInputStream is) throws IOException{
  64.  
  65. StringBuilder buffer = new StringBuilder();
  66.  
  67. while(true){
  68.  
  69. while(is.available() < 0){
  70. continue;
  71. }
  72.  
  73. buffer.append((char)is.read());
  74.  
  75. if(buffer.charAt(buffer.length() - 1) == '\''){
  76.  
  77. buffer.deleteCharAt(buffer.length() - 1);
  78. titles.add(buffer.toString());
  79.  
  80. System.out.println(buffer.toString());
  81.  
  82. break;
  83.  
  84. }
  85.  
  86. }
  87. }
  88.  
  89. public void startLog() throws IOException{
  90.  
  91. ArrayList<Character> buffer = new ArrayList<Character>();
  92.  
  93. //This is the get header info we need to send in order to retrieve stream titles
  94. //Esta es la info de cabecera del get que necesitamso enviar para recibir los titulos
  95. URLConnection uc = url.openConnection();
  96. uc.setRequestProperty("Connection", "close");
  97. uc.setRequestProperty("icy-metadata", " 1");
  98. uc.setRequestProperty("transferMode.dlna.org", "Streaming");
  99.  
  100. BufferedInputStream is = new BufferedInputStream(uc.getInputStream());
  101.  
  102.  
  103. //El metodo, como una videoconsola trata a un mando de juegos a la espera de
  104. //una combinacion de botones. Esa combinación será que cada uno de los caracteres
  105. //llegue al stream, si solo llega uno, tres o casi todos no nos sirve, lo queremos entero
  106.  
  107. //This method is like trying to retrieve the desired sequence of button presses.
  108. //If the sequence does not match at some point, buffer is cleared.
  109.  
  110. while(true){
  111.  
  112. while(is.available() < 0){
  113. continue;
  114. }
  115. buffer.add((char)is.read());
  116.  
  117. if(buffer.get(buffer.size() - 1) == tag.charAt(buffer.size() - 1)){
  118.  
  119. if(buffer.size() == tag.length()){
  120.  
  121. getTitle(is);
  122. buffer.clear();
  123.  
  124. }
  125.  
  126. }
  127. else{
  128.  
  129. buffer.clear();
  130.  
  131. }
  132. }
  133.  
  134. }
  135.  
  136. }
  137.  

Espero que os sea de alguna utilidad. Saludos ;)


Título: Re: [SRC] Obtener Titulos de un stream de audio.
Publicado por: kasiko en 11 Enero 2011, 22:24 pm
pues se agradece  :D


Título: Re: [SRC] Obtener Titulos de un stream de audio.
Publicado por: Debci en 19 Enero 2011, 21:49 pm
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