NAME

iTunes Music Library File Format

SYNOPSIS

This file describes the iTunes Music Library file format for application versions 1.1.2 and 3.0.

DESCRIPTION

The iTunes Music Library file contains a series of variable length blocks. The first part of the file refers to iTunes in general and to the number of playlists the file contains. The middle part holds all of the MP3 data, which is only stored once per item. Each item has a unique identifier used later in the file. The last part of the file contains a list of playlists, and within each playlist is a list of the item identifiers from the middle of the file.

Markers

Each block of data begins with a four letter marker which denotes the type of block. Some blocks contain sub-blocks, which means you cannot simply read to the next marker.

The blocks show up roughly in this order:

hdfm -- file header
hdsm -- part header ?
htlm -- master items list header ?
htim -- master item record
hohm -- data sublock, multi-purpose (in htim, hpim blocks)
hplm -- playlist list header ?
hpim -- start of playlist block
hptm -- item indentifier sub-block for hpim

Block format

hdfm
Byte   Length  Comment
-----------------------
  0       4     'hdfm'
  4       4     L = header length
  8       4     file length ?
 12       4     ?
 13       1     N = length of version string
 14       N     application version string
 14+N   L-N-17  ?
hdsm
Byte   Length  Comment
-----------------------
  0       4     'hdsm'
  4       4     L = header length
  8       4     ?
 12       4     block type ?
 16      L-16   ?
htlm
Byte   Length  Comment
-----------------------
  0       4     'htlm'
  4       4     L = header length
  8       4     number of songs
 12      L-12   ?
htim
Byte   Length  Comment
-----------------------
  0       4     'htim'
  4       4     L = header length (usually 156, or 0x9C)
  8       4     R = total record length, including sub-blocks
 12       4     N = number of hohm sub-blocks
 16       4     song identifier
 20       4     block type => (1, ?)
 24       4     ?
 28       4     Mac OS file type (e.g. MPG3)
 32       4     modification date
 36       4     file size, in bytes
 40       4     playtime, millisecs
 44       4     track number
 48       4     total number of tracks
 52       2     ?
 54       2     year
 56       2     ?
 58       2     bit rate
 60       2     sample rate
 62       2     ?
 64       4     volume adjustment (signed)
 68       4     start time, milliseconds
 72       4     end time, milliseconds
 76       4     playcount
 80       2     ?
 82       2     compilation (1 = yes, 0 = no)
 84      12     ?
 96       4     playcount again?
100       4     last play date
104       2     disk number
106       2     total disks
108       1     rating ( 0 to 100 )
109      11     ?
120       4     add date
124      32     ?
156      R-L    hohm sub blocks
hohm

The hohm block has a header, annotated immediately below, and a data-specific block.

Byte   Length  Comment
-----------------------
  0       4     'hohm'
  4       4     L = header length, usually 0x18
  8       4     R = total record length
 12       4     block type, (1, 2, 3, 4, 5, 6, 0x0b, 0x64)
 16      12     ?
 28     R-28    block specific data
hohm block types

The data-specific structure follows the header structure of the hohm block. Offsets start at 0', which is byte 28 in the record. Sometimes these data appear to have null bytes alternate with information bytes, as in the Perl string "\000H\000e\000l\000l\000o". In that case, the null bytes count in the length of the data.

Type  Decimal   Description
--------------------------------------
 1              big bag of gook     
 2              song title
 3              album title
 4              artist name
 5              genre string (not number)
 6              file type (e.g. MPEG)
 8              comments
 b      11      URL
 c      12      composer
3a      58      equalizer data?
3c      60      equalizer preset (text)
64     100      playlist name (used in hpim)
hohm type 1
   Byte   Length  Comment
   -----------------------
     0'      2     ?
     2       2     n = length of next thingy ?
     4       n     ?
     4+n     1     N = volume name length up to 27 (e.g. hard drive name)
     5+n     N     volume name
            27-N   left over bytes from volume name (null bytes)
             2     ?? (iTunes 3)
     5+n+N   1     M = filename length
     6+n+N   M     filename

     (let A = n+N+M )

      6+A    4     Mac OS file type
     10+A    4     Mac OS creator
     14+A   20     ?
     24+A    4     B = directory name length
     28+A    B     directory name
     28+A+B  C?    ? gook up to the sequence 0x5a_00_02_00 ? (iTunes 1)
                   ? gook up to the sequence 0x7f_00_02_00 ? (iTunes 3)

     (let A' = A+B+C )

     28+A'   2     D = length of fully qualified path
     30+A'   D    path

=item hohm type 11 (0x0b)

   Byte   Length  Comment
   -----------------------
     0'     12      ?
    12       4      N = length of data
    16       8      ?
    24       N      URL
hohm type 100 (0x64)
Byte   Length  Comment
-----------------------
  0'     12      ?
 12       4      N = length of playlist name
 16       8      ?
 24       N      playlist name
other hohm types
Byte   Length  Comment
-----------------------
  0'     12      ?
 12       4      N = length of data
 16       8      ?
 24       N      data
hpim
Byte   Length  Comment
-----------------------
  0       4      hpim
  4       4      N = length of data
  8       4      ?
 12       4      ?
 16       4      number of items (hptm) in playlist
hptm
Byte   Length  Comment
-----------------------
  0       4      hpim
  4       4      N = length of data
  8      16      ?
 24       4      song key (from htim)
 28     N - 28   ?

TO DO

* verify that this works on all available versions

BUGS

* i've guessed on almost everything in this document, but it seems to work.

AUTHOR

Copyright 2002, brian d foy <bdfoy@cpan.org>

You may redistribute this under the same terms as Perl.