Skip to content
Advertisement

Pulling Track Info From an Audio Stream Using PHP

Is it possible to pull track info from an audio stream using PHP? I’ve done some digging and the closest function I can find is stream_get_transports but my host doesn’t support http transports via fsockopen() so I’ll have to do some more tinkering to see what else that function returns.

Currently, I’m trying to pull artist and track metadata from an AOL stream.

Advertisement

Answer

This is a SHOUTcast stream, and yes it is possible. It has absolutely nothing to do with ID3 tags. I wrote a script awhile ago to do this, but can’t find it anymore. Just last week I helped another guy who had a fairly complete script to do the same thing, but I can’t just post the source to it, as it isn’t mine. I will however get you in touch with him, if you e-mail me at brad@musatcha.com.

Anyway, here’s how to do it yourself:

The first thing you need to do is connect to the server directly. Don’t use HTTP. Well, you could probably use cURL, but it will likely be much more hassle than its worth. You connect to it with fsockopen() (doc). Make sure to use the correct port. Also note that many web hosts will block a lot of ports, but you can usually use port 80. Fortunately, all of the AOL-hosted SHOUTcast streams use port 80.

Now, make your request just like your client would.

GET /whatever HTTP/1.0

But, before sending <CrLf><CrLf>, include this next header!

Icy-MetaData:1

That tells the server that you want metadata. Now, send your pair of <CrLf>.

Ok, the server will respond with a bunch of headers and then start sending you data. In those headers will be an icy-metaint:8192 or similar. That 8192 is the meta interval. This is important, and really the only value you need. It is usually 8192, but not always, so make sure to actually read this value!

Basically it means, you will get 8192 bytes of MP3 data and then a chunk of meta, followed by 8192 bytes of MP3 data, followed by a chunk of meta.

Read 8192 bytes of data (make sure you are not including the header in this count), discard them, and then read the next byte. This byte is the first byte of meta data, and indicates how long the meta data is. Take the value of this byte (the actual byte with ord() (doc)), and multiply it by 16. The result is the number of bytes to read for metadata. Read those number of bytes into a string variable for you to work with.

Next, trim the value of this variable. Why? Because the string is padded with 0x0 at the end (to make it fit evenly into a multiple of 16 bytes), and trim() (doc) takes care of that for us.

You will be left with something like this:

StreamTitle='Awesome Trance Mix - DI.fm';StreamUrl=''

I’ll let you pick your method of choice for parsing this. Personally I’d probably just split with a limit of 2 on ;, but beware of titles that contain ;. I’m not sure what the escape character method is. A little experimentation should help you.

Don’t forget to disconnect from the server when you’re done with it!

There are lots of SHOUTcast MetaData references out there. This is a good one: http://www.smackfu.com/stuff/programming/shoutcast.html

User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement