views:

1299

answers:

7

If I know the URL of an MP3 file, what is the easiest/fastest way to get its length, bitrate, size, etc?

How can I download just the ID3 tag part of the MP3 to get these details?

A: 

Download it, then read the file.

Dave Swersky
A: 

You cannot get this information from the URL alone.

You'll have to load the first few K of content and use an mp3 library to decode the header and get the values.

Jason Cohen
+5  A: 

You will need to look at the ID3 tags in the mp3 file.

Unless you keep track of the metadata you want somewhere else.

To specifically get the Track length of the file you will need to look into the ID3 metadata tag for sure, specifically the 'TRCK' frame of the tag.

To only download the ID3 Tag part, you must first download the ID3 header part of the file.

This website contains very specific information about the ID3 Tag format. You will need to look at the version number of the ID3 Tag and then, based on that, you will need to find the information regarding how long the ID3 Tag is. Then, you must download the WHOLE tag because the frames are not in any specific order.

Then you should be able to use a third party library to find the TRCK frame and its data.

jjnguy
A: 

That data is encoded in the id3 tag, so you need to download at least that much of the file, which is at the beginning so you're in luck.

Alternatively you can look at the content-length header value in the http response header to know the length, if the server tells you which it may not.

jeffamaphone
A: 

Here is how you get file size, but how do you get bitrate and track length?

import java.io.*;
import java.net.*;

public class FileSizeFromURL {
public static final void main(String[] args) {
URL url;
URLConnection conn;
int size;

if(args.length != 1) {
  System.out.println("Usage: FileSizeFromURL ");
  return;
  }

try {
  url = new URL(args[0]);
  conn = url.openConnection();
  size = conn.getContentLength();
  if(size < 0)
     System.out.println("Could not determine file size.");
  else
    System.out.println(args[0] + "\nSize: " + size);
  conn.getInputStream().close();
  } 
catch(Exception e) {
  e.printStackTrace();
  }
}
}
Penchant
try the suggestions made in the other answers?
Mitch Wheat
It would probably be best for performance to do this as a HEAD request rather than GET. See eg. HttpURLConnection.setRequestMethod. http://java.sun.com/j2se/1.4.2/docs/api/java/net/HttpURLConnection.html#setRequestMethod(java.lang.String)
bobince
+1  A: 

what is the easiest/fastest way to get its length, bitrate, size, etc?

File size you can get with an HTTP HEAD request. If by ‘length’ you mean playing time in seconds, you cannot get this without fetching the entire file. You can guess, by fetching the first few MP3 frames, looking at their bitrate, and assuming that the rest of the file has the same bitrate, but given the popularity of Variable Bit-Rate encoding the likelihood this will be close to accurate is quite low.

ID3 tags can in theory contain information that might allow you to guess the length better, in the ASPI and ETCO tags. But in practice these are very rarely present.

How can I download just the ID3 tag part of the MP3 to get these details?

For ID3v2 tags, grab the start of the file. (It's possible for ID3v2 frames to be elsewhere, but in practice they're always there.) You can't tell how long the tag is going to be in advance. For text-only tags you're likely to find the information you want in the first 512-1024 bytes. Unfortunately more and more MP3s have embedded ‘album art’ pictures, which can be much longer; try to pick an ID3 library that will gracefully ignore truncated ID3 information.

ID3v1 tags are located at the end of the file. Again you can't tell how long they're going to be. And of course you don't know in advance whether the file has ID3v1 tags, ID3v2 tags, both or neither. Generally these days ID3v2 is a better bet though.

To read part of a file through HTTP you need the Range header. This too is not supported everywhere.

In summary, there are enough problems with this that the best option may well be giving up and just fetching the whole file.

bobince
A: 

I am answering this question a year+ after it was asked but I do have some info to add for those happening by at a later time. I answered a similar question about getting the image dimensions from an image on a remote server without downloading the whole image. See that discussion at the following URL:

http://stackoverflow.com/questions/869989/get-image-dimensions-with-curl/2597990#2597990

You could definitely use the same technique to pull info out of the ID3 tags without downloading the whole MP3 from a remote server.

I hope that helps for future passers-by.

John Mark Mitchell