Audio::M4P::QuickTime -- Perl module for m4p/mp4/m4a Quicktime audio files


In late 2004 an update to iTunes made that program incompatible with decrypted files still containing meta information identifying the content as having been purchased via iTMS. This forced an update to the module Audio::M4pDecrypt (now renamed Audio::M4P::Decrypt), which now strips such meta information from the file. As a happy side effect of these changes, this module, part of the Audio::M4P distribution, now allows extraction and modification of meta information in such files, similar to the MP3::Info and MP4::Info modules.

About QuickTime File Structure and Atoms

M4P is a QuickTime protected audio file format. It is composed of a linear stream of bytes which are segmented into units called atoms. Some atoms may be containers for other atoms. iTMS (M4P) music files are Quicktime audio files which are encrypted using a combination of information in the file's drms atom and information which is commonly stored on the computer or audio player.


     use Audio::M4P::QuickTime;
     my $mp4file = "file.m4p";
     my $qt = new Audio::M4P::QuickTime(file => $mp4file);
     my $tags = $qt->GetMetaInfo;
     print "Artist is $tags->{ARTIST}\n" if $tags->{ARTIST};


 my $qt = Audio::M4P::QuickTime->new;

 $qt = new Audio::M4P::QuickTime(
   DEBUG => 2, 
   DEBUGDUMPFILE => 'quicktime_treedump.html'

 $qt = new Audio::M4P::QuickTime(file => 'qt_audio_file.m4p');

Create a new Audio::M4P::QuickTime object. DEBUG => 1 as argument causes parse and other information to be printed to stdout during processing. DEBUG => 2, DEBUGDUMPFILE => "file" causes an HTML tree representation of the QuickTime file to be emitted to the file given as value to the argument pair. file => "filename.m4p" causes the named QuickTime file to be read and parsed during object initialization.


Read the named file into the QuickTime object buffer.


Parse the file that has been read as a QuickTime stream.


Write the (possibly modified) file back to the output file argument.

 my $hashref = $qt->GetMetaInfo(1);
 while(my($tag, $value) = each %{$hashref}) { 
    print "$tag => $value\n";

Returns a hash reference to meta tag information. Attempts to be compatible with tag information formats in MP3::Info and MP4::Info. Potential tags are AAID, ALBUM, ARTIST, COMMENT, COM, CPIL, CPRT, YEAR, DISK, GENRE, GRP, NAM, RTNG, TMPO, TOO, TRKN, and WRT. Note that, due to preservation of compatibility with MP3::Info by returning tag info as a hash reference, duplicate entries of the same tag name, such as multiple comment fields, will not be returned in the hash reference. An optional second argument, if 1 or true, should convert some binary fields to text in the tags, for instance my $hashref = $qt->GetMetaInfo(1);

 my $hashref = $qt->GetMP4Info;
 while(my($tag, $value) = each %{$hashref}) { 
    print "$tag => $value\n";

Returns a hash reference to MP3 tag audio information. Attempts to be compatible with tag information formats in MP3::Info and MP4::Info. Potential tags are LAYER (1), VERSION (4), SIZE, SECONDS, SS, MM, and BITRATE.

 my $comment = "After paying for this music file, I have fair use rights to change it.";

 $qt->SetMetaInfo(COMMENT => $comment);
 $qt->SetMetaInfo(GENRE => "Bebop", 1, 'day');

Set a meta information field. The third argument, if given and true, indicates that the program should replace all instances of meta data of this type with the new entry, rather than adding the tag to the existing meta data. The fourth argument, if given and true, indicated a tag value before which the new tag is to be placed in the file. The fifth argument indicates the values are in text form, ie for meta type 'trkn', value is something like 'Track 5 of 11'.

 my $hashref = $qt->iTMS_MetaInfo;
 $hashref->{comments} = "A new comment";

Get or set a meta information field via a hash reference to an Apple iTMS type dict data structure. Possible fields are copyright, comments, songName, genre, playlistArtistName, genreID, composerName, playlistName, year, trackNumber, trackCount, discNumber, discCount, and artworkURL. iTMS meta data entries may not be compatible with MP3::Info type meta data.


    The Audio::M4P::* code is not re-entrant, due to recursive changes to containers not being thread-safe. Threaded code using these modules may need to lock down all method calls with a semaphore or other serialization method.


Audio::M4P, Audio::M4P::Atom, Audio::M4PDecrypt


MP3::Info, MP4::Info, Mac::iTunes, Net::iTMS, LWP::UserAgent::iTMS_Client


William Herrera


Questions, feature requests and bug reports should go to <>.


    Copyright (c) 2003-2005 William Herrera. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.

4 POD Errors

The following errors were encountered while parsing the POD:

Around line 615:

'=item' outside of any '=over'

Around line 619:

You forgot a '=back' before '=head2'

Around line 621:

'=item' outside of any '=over'

Around line 623:

You forgot a '=back' before '=head1'