Pregunta

Estoy buscando una manera de leer las etiquetas ID3 de un archivo MP3 en un servidor remoto sin tener que descargar el archivo. He visto como bibliotecas JAudioTagger y Entagged, pero ambos parecen requerir un objeto de archivo y no una URL o InputStream, que sé cómo llegar con un archivo remoto. ¿Hay alguna otra biblioteca que puede hacer esto? ¿O hay una manera de conseguir el objeto correcto para interactuar con estas clases utilizando una URL?

¿Fue útil?

Solución

Esta página se explica cómo obtener el ID3 V. 1 etiquetas de un archivo MP3. http://willcode4beer.com/parsing.jsp?set=mp3ID3

Ofrece un ..

public Tag readTag(InputStream in, long start) throws ..

.. método que es lo que se desea para una URL remota. La idea básica sería la de obtener un URLConnection y consulta para la longitud de los datos en los formatos MP3, luego restar 128 de ese número y usar eso como argumento de partida (de lo contrario será muy lento) .

Otros consejos

etiquetas ID3 se encuentran en el último 128 (355 si se utiliza la etiqueta extendida) bytes del archivo, por lo que van a por lo menos tienen que descargar parte del archivo. Como HTTP soportes oscilan acceso a archivos específicos, debería ser teóricamente posible hacer esto (aunque no sé de ninguna biblioteca que lo haga por usted).

En esencia, lo que tendría que pasar es hacer una petición HEAD para obtener la longitud del archivo en bytes, a continuación, realizar un GET en el archivo con el rango length-355 al final del archivo. Esto volvería los metadatos necesarios. Esta da una buena idea de lo que una petición a distancia se parece.

Lo sentimos embargo, que no sé de ninguna biblioteca que hacer esto automáticamente, pero no es una tarea particularmente difícil de configurar el captador. Desde allí es posible escribir los metadatos a un archivo temporal y lo han analizado por el analizador ID3.

    String tmp="";
    int bytes_read;

    try{
        //RandomAccessFile file = new RandomAccessFile("/mnt/sdcard/Music/6 am (reggaeton).mp3", "r");
        RandomAccessFile file = new RandomAccessFile("/mnt/sdcard/Music/Jorge Vercilo - Final feliz.mp3", "r");

        long fsize=file.length();
        System.out.println("Abriu arquivo");
        byte[] buf = new byte[1024];
        bytes_read = file.read(buf, 0, 10);
        System.out.println("Leu "+String.valueOf(bytes_read));
        if(bytes_read==10){
            if(buf[0] == 'I' &&buf[1] == 'D' && buf[2] == '3') {
                System.out.println("É ID3");
                int version = (buf[4]<<8) + (buf[3] & 0xff);
                System.out.println("Versão: "+String.valueOf(version));
                if(buf[5] == 0x00) System.out.println("Clear flags");
                long size = ((buf[9] & 0xFF) <<  0) |
                            ((buf[8] & 0xFF) <<  8) |
                            ((buf[7] & 0xFF) << 16) |
                            ((buf[6] & 0xFF) << 24);
                System.out.println("Size: "+String.valueOf(size));

                long p = 10;
                long frame_size;
                String encoding="";
                while(p<fsize){
                    file.seek(p);
                    bytes_read = file.read(buf, 0, 10);
                    if(bytes_read==10){
                        frame_size = ((buf[7] & 0xFF) <<  0) |
                            ((buf[6] & 0xFF) <<  8) |
                            ((buf[5] & 0xFF) << 16) |
                            ((buf[4] & 0xFF) << 24);
                        System.out.println("Frame size: "+String.valueOf(frame_size));
                        tmp = new String(buf,0,4);
                        System.out.println("Frame type: "+tmp);

                        if(buf[0] == 'T' && buf[1] == 'P' && buf[2] == 'E' && buf[3] == '1') {// artist
                            p+=10;
                            file.seek(p);
                            if(file.read(buf, 0, (int)frame_size)==frame_size){
                                if(buf[0]==0x01) encoding="UTF-16";
                                else if(buf[0]==0x02) encoding="UTF-16BE";
                                else if(buf[0]==0x03) encoding="UTF-8";
                                if(buf[0]==0x00) tmp = new String(buf,1,(int)frame_size-1);
                                else tmp = new String(buf,1,(int)frame_size-1,encoding);
                                System.out.println("Artist: "+tmp);
                            }
                            p+=frame_size;
                        }
                        else if(buf[0] == 'T' && buf[1] == 'I' && buf[2] == 'T' && buf[3] == '2') {// title
                            p+=10;
                            file.seek(p);
                            if(file.read(buf, 0, (int)frame_size)==frame_size){
                                if(buf[0]==0x01) encoding="UTF-16";
                                else if(buf[0]==0x02) encoding="UTF-16BE";
                                else if(buf[0]==0x03) encoding="UTF-8";
                                if(buf[0]==0x00) tmp = new String(buf,1,(int)frame_size-1);
                                else tmp = new String(buf,1,(int)frame_size-1,encoding);
                                System.out.println("title: "+tmp);
                            }
                            p+=frame_size;
                        }
                        else if(buf[0] == 0x00 && buf[1] == 0x00 && buf[2] == 0x00 && buf[3] == 0x00) {// END OF HEADER
                            break;
                        }
                        else p+= frame_size+10;
                    }
                    //checar se ja pegou o title e o artist
                }
            }
        }

        if(file!=null)  file.close();
    }catch(Exception e){
        System.out.println("ERROOOOOOOOO!");
        e.printStackTrace();
    }   
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top