Pergunta

Estou procurando uma maneira de ler as tags ID3 de um arquivo MP3 em um servidor remoto sem realmente baixar o arquivo. Vi bibliotecas como Jaudiotagger e Entragged, mas ambas parecem exigir um objeto de arquivo e não um URL ou InputStream, que eu sei como obter com um arquivo remoto. Existe outra biblioteca que pode fazer isso? Ou existe uma maneira de obter o objeto correto para interagir com essas classes usando um URL?

Foi útil?

Solução

Esta página descreve como obter o ID3 V. 1 Tags de um arquivo mp3. http://willcode4beer.com/parsing.jsp?set=mp3id3

Oferece um ..

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

..Method É isso que você deseja para um URL remoto. A idéia básica seria obter uma UrlConnection e consultá -la para o comprimento dos dados no MP3, depois subtrair 128 desse número e usar isso como o argumento inicial (caso contrário, será muito lento).

Outras dicas

As tags ID3 estão localizadas nos últimos 128 (355, se estiver usando tag estendido) bytes do arquivo, para que você tenha pelo menos o download de parte do arquivo. Como o HTTP suporta acesso ao arquivo específico do intervalo, deve ser possível fazer isso (embora eu não conheça nenhuma biblioteca que o faria).

Essencialmente, o que precisaria acontecer é fazer uma solicitação de cabeça para obter a duração do arquivo em bytes e depois executar um arquivo no arquivo com o intervalo length-355 até o final do arquivo. Isso retornaria os metadados necessários. este Dá uma boa idéia de como é uma solicitação de longo alcance.

Desculpe, porém, eu não conheço nenhuma biblioteca que faria isso automaticamente, mas não é uma tarefa particularmente difícil configurar o getter. A partir daí, é possível escrever os metadados em um arquivo temp e tê -lo analisado pelo seu analisador 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top