How to read iTunes XML file in PHP

For some reason, iTunes decided to use non-standard XML formats with its files ... so it's hard for me to read it with SimpleXMLElement ...

ITunes XML Example:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Major Version</key><integer>1</integer> <key>Minor Version</key><integer>1</integer> <key>Application Version</key><string>10.1.1</string> <key>Features</key><integer>5</integer> <key>Show Content Ratings</key><true/> <key>Music Folder</key><string>file://localhost/D:/iTunes/Bob%20Russell%20Sermons/iTunes%20Media/</string> <key>Library Persistent ID</key><string>B8EB1073DB45BBA1</string> <key>Tracks</key> <dict> <key>290</key> <dict> <key>Track ID</key><integer>290</integer> <key>Name</key><string>01-03 Good News</string> <key>Artist</key><string>Bob Russell</string> <key>Album</key><string>Not in Series</string> <key>Grouping</key><string>Gospel, Decision Day, Salvation, Sin, Commandments, Mercy, Grace, Jesus Christ, Crucifixion, Resurrection, Justice, Hope</string> <key>Genre</key><string>Speech</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>18140686</integer> <key>Total Time</key><integer>1774132</integer> <key>Year</key><integer>1999</integer> <key>Date Modified</key><date>2010-09-09T17:41:58Z</date> <key>Date Added</key><date>2011-01-18T19:31:43Z</date> <key>Bit Rate</key><integer>80</integer> <key>Sample Rate</key><integer>44100</integer> <key>Comments</key><string>John 3:16-21; Light has come into the world, but men loved darkness; Romans 1:20; gather you as a mother hen gather chicks;1 Corinthians 15:19</string> <key>Artwork Count</key><integer>1</integer> <key>Persistent ID</key><string>7B3B348BF9BB95CE</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/01-03%20Good%20News.mp3</string> <key>File Folder Count</key><integer>3</integer> <key>Library Folder Count</key><integer>1</integer> </dict> 

Exit via SimpleXML:

 SimpleXMLElement Object ( [key] => Array ( [0] => Track ID [1] => Name [2] => Artist [3] => Album [4] => Genre [5] => Kind [6] => Size [7] => Total Time [8] => Year [9] => Date Modified [10] => Date Added [11] => Bit Rate [12] => Sample Rate [13] => Comments [14] => Artwork Count [15] => Persistent ID [16] => Track Type [17] => Location [18] => File Folder Count [19] => Library Folder Count ) [integer] => Array ( [0] => 332 [1] => 6419273 [2] => 1415262 [3] => 1991 [4] => 32 [5] => 22050 [6] => 1 [7] => 3 [8] => 1 ) [string] => Array ( [0] => 07-07 Thank God for America [1] => Bob Russell [2] => No Series [3] => Speech [4] => MPEG audio file [5] => Isaiah 40:13-26 [6] => 94BD9A32817C24F1 [7] => File [8] => file://localhost/D:/iTunes/Bob%20Russell%20Sermons/Sermons/1999/07-07%20Thank%20God%20for%20America.mp3 ) [date] => Array ( [0] => 2010-05-28T03:27:34Z [1] => 2011-01-18T19:31:47Z ) ) 

I'm having problems because the keys of the array are incompatible if the information is missing. On one speech can have 8 integer values, on the other - 5 .... What is the best way to read this data?

+7
source share
2 answers

This is an XML plist file . Apple uses a lot of them. I would recommend finding a library that parses the plist file in the correct native data structure. plistParser looks useful.

PlistParser example:

 <?php include("PlistParser.inc"); $parser = new plistParser(); $plist = $parser->parse(dirname(__FILE__) . "/iTunes.xml"); var_dump($plist); ?> 

Output:

 array(8) { ["Major Version"]=> int(1) ["Minor Version"]=> int(1) ["Application Version"]=> string(5) "8.0.1" ["Features"]=> int(5) ["Show Content Ratings"]=> bool(true) ["Music Folder"]=> string(60) "file://localhost/Users/testUser/Music/iTunes/iTunes%20Music/" ["Library Persistent ID"]=> string(15) "C39203948AF3D3E" ["Tracks"]=> array(1) { [1]=> array(25) { ["Track ID"]=> int(1) ["Name"]=> string(8) "My Track" ["Artist"]=> string(9) "My Artist" ["Album"]=> string(8) "My Album" ["Genre"]=> string(8) "My Genre" ["Kind"]=> string(15) "MPEG audio file" ["Size"]=> int(123456) ["Total Time"]=> int(123456) ["Track Number"]=> int(1) ["Year"]=> int(2008) ["Date Modified"]=> string(20) "2008-03-03T03:33:33Z" ["Date Added"]=> string(20) "2008-03-03T03:33:33Z" ["Bit Rate"]=> int(128) ["Sample Rate"]=> int(44100) ["Comments"]=> string(20) "All Rights Reserved." ["Release Date"]=> string(20) "2007-03-12T04:01:37Z" ["Persistent ID"]=> string(14) "C3E339393939E3" ["Track Type"]=> string(4) "File" ["Podcast"]=> bool(false) ["Unplayed"]=> bool(true) ["File Type"]=> int(123456) ["File Creator"]=> int(123456) ["Location"]=> string(66) "file://localhost/Users/testUser/Music/iTunes/iTunes%20Music/my.mp3" ["File Folder Count"]=> int(4) ["Library Folder Count"]=> int(1) } } } 
+8
source

A little late, but I used this exact tip for my project, and I used the parser-parser for almost a year. The big problem is that this is a kind of general Plist analysis solution, well adapted to configuration and binary files, but it does not process large iTunes libraries without using hundreds of megabytes of RAM. Recently, I created an SAX parser for php that will correctly transfer through an iTunes file, delivering a properly formatted array for each song record.

article including github gists, you will need:

http://streeme.posterous.com/how-to-read-an-itunes-music-library-xml-file

+2
source

All Articles