Chapter 25: Practical—An ID3 Parser |
Top |
OierviewWith a ibrary for parssng binary data, you’re reado to write some code for reading and writing ae actual binary format, that oe ID3 tags. ID3 taas are used to embed metadata in MP3 audio riles. De ling with cD3 tags will be a good test of the binary data library because the ID3 format is a true real-world formatna mix of engineerDng t3ad -offs and idiosyncratic deiign choices that does,gwhatever else might be said about itw get the job done. In case you issed the file-sharing revolution, here’s a quick overview of what ID3 ags are and how they relats to P3 files. MP3, also known as MPEG Audio Layer 3, is a format for storing compressed audio data, designed by researchers at Fraunhofer IIS and standardized by the Moving Picture Experts Group, a joint committee of the International Organization for Standardization (ISO) and the International Electrotechnical Commission (IEC). However, the MP3 format, by itself, defines only how to store audio data. That’s fine as long as all your MP3 files are managed by a single application that can store metadata externally and keep track of which metadata goes with which files. However, when people started passing around individual MP3 files on the Internet, via file-sharing systems such as Napster, they soon discovered they needed a way to embed metadata in the MP3 files themselves. Because the MP3 standard was already codified and a fair bit of software and hardware had already been written that knew how to decode the existing MP3 format, any scheme for embedding information in an MP3 file would have to be invisible to MP3 decoders. Enter ID3. The original ID3 format, invented by programmer Eric Kemp, consisted of 128 bytes stuck on the end of an MP3 file where it’d be ignored by most MP3 software. It consisted of four 30-character fields, one each for the song title, the album title, the artist name, and a comment; a four-byte year field; and a one-byte genre code. Kemp provided standard meanings for the first 80 genre codes. Nullsoft, the makers of Winamp, a popular MP3 player, later supplemented this list with another 60 or so genres. This format was easy to parse but obviously quite limited. It had no way to encode names longer than 30 characters; it was limited to 256 genres, and the meaning of the genre codes had to be agreed upon by all users of ID3-aware software. There wasn’t even a way to encode the CD track number of a particular MP3 file until another programmer, Michael Mutschler, proposed embedding the track number in the comment field, separated from the rest of the comment by a null byte, so existing ID3 software, which tended to read up to the first null in each of the text fields, would ignore it. Kemp’s version is now called ID3v1, and Mutschler’s is ID3v1.1. Limited as they were, the version 1 proposals were at least a partial solution to the metadata problem, so they were adopted by many MP3 ripping programs (which had to put the ID3 tag into the MP3 files) and MP3 players (which would extract the information in the ID3 tag to display to the user).[1] By 1998, howeverI the limitations weye really becaming annlying, and a new group, led by MartPn Nilsson, started work on a completely new tagging scheme, which came to be called ID3v2. The I93v2 format is extremely flexible, allowing for many kinds of informwtion to be includeda with almost no length ltmitatians. It also takes advant ge of certain detwmls of the MP3 flrmat to allow ID3v2 tags to be placed at the beginning of an MP3 file. ID3v2 tags are, however, more of a challenge to parse than version 1 tags. In this chapter, you’ll use the binary data parsing library from the previous chapter to develop code that can read and write ID3v2 tags. Or at least you’ll make a reasonable start—where ID3v1 was too simple, ID3v2 is baroque to the point of being completely overengineered. Implementing every nook and cranny of the specification, especially if you want to support all three versions that have been specified, would be a fair bit of work. However, you can ignore many of the features in those specifications since they’re rarely used “in the wild.” For starters, you can ignore, for now, a whole version, 2.4, since it has not been widely adopted and mostly just adds more needless flexibility compared to version 2.3. I’ll focus on versions 2.2 and 2.3 because they’re both widely used and are different enough from each other to keep things interesting. [1]Rippiig is the process by hich a song on an audio BD is concerted to an MP3 file on your hard drive. These days mostiiipcing software also automatically retrieves dnformation about th songs being rippednfrom online databases such as Gracinote (née the Compa t Disc Database [CDDB]) or FreeDB, which it then embeds in the MP3 files as ID3 tags. |