stonecolddevin has asked for the wisdom of the Perl Monks concerning the following question:

Dear monks,

I've been trying to find (or, as it looks now, write) something that I can show on my website what's currently playing on my iTunes. After searching through CPAN, I find that everything in there is either incomplete, or doesn't exist.

There's nothing I can find that will get the current playlist from iTunes, and I can't find anything that my brain parses as far as my other option (uploading my favorite playlists and parsing them using some sort of iTunes module).

It looks like I'm going to have to get involved somehow if I want something in the near future...is this correct thinking? Or should I pick through the XML file that I can have iTunes dump for me and parse it on my own using XML::Twig or something?

Help, wise ones...

PS: it would probably help for y'all to take a look at an example of an iTunes generated playlist...

<?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>7.0.2</string> <key>Features</key><integer>1</integer> <key>Show Content Ratings</key><true/> <key>Music Folder</key><string>file://localhost/C:/Documents%20and +%20Settings/Devin/My%20Documents/My%20Music/iTunes/iTunes%20Music/</s +tring> <key>Library Persistent ID</key><string>B7F13C5664B76F5E</string> <key>Tracks</key> <dict> <key>6639</key> <dict> <key>Track ID</key><integer>6639</integer> <key>Name</key><string>Please Forgive Me</string> <key>Artist</key><string>Bryan Adams</string> <key>Album Artist</key><string>Bryan Adams</string> <key>Composer</key><string>Bryan Adams/Robert John "Mutt" +Lange</string> <key>Album</key><string>The Best of Me</string> <key>Genre</key><string>Rock</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>5702522</integer> <key>Total Time</key><integer>355343</integer> <key>Track Number</key><integer>13</integer> <key>Year</key><integer>2001</integer> <key>Date Modified</key><date>2006-10-20T06:06:26Z</date> <key>Date Added</key><date>2006-11-13T05:50:43Z</date> <key>Bit Rate</key><integer>128</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>1</integer> <key>Play Date</key><integer>3246228984</integer> <key>Play Date UTC</key><date>2006-11-13T09:16:24Z</date> <key>Persistent ID</key><string>B7F13C5664B775D5</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Bryan%20Adams-Please%20Forgive%20Me.mp3< +/string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>7843</key> <dict> <key>Track ID</key><integer>7843</integer> <key>Name</key><string>Numb</string> <key>Artist</key><string>Linkin Park</string> <key>Album Artist</key><string>Linkin Park</string> <key>Composer</key><string>Linkin Park</string> <key>Album</key><string>Meteora</string> <key>Genre</key><string>Rock</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>4503928</integer> <key>Total Time</key><integer>187480</integer> <key>Track Number</key><integer>13</integer> <key>Year</key><integer>2003</integer> <key>Date Modified</key><date>2006-10-24T12:20:23Z</date> <key>Date Added</key><date>2006-11-13T05:50:53Z</date> <key>Bit Rate</key><integer>192</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>1</integer> <key>Play Date</key><integer>3246228402</integer> <key>Play Date UTC</key><date>2006-11-13T09:06:42Z</date> <key>Persistent ID</key><string>B7F13C5664B77967</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Linkin%20Park-%20Numb.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8232</key> <dict> <key>Track ID</key><integer>8232</integer> <key>Name</key><string>Average Man</string> <key>Artist</key><string>Obie Trice</string> <key>Album</key><string>Cheers</string> <key>Genre</key><string>Rap</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>6165329</integer> <key>Total Time</key><integer>256862</integer> <key>Track Number</key><integer>1</integer> <key>Year</key><integer>2003</integer> <key>Date Modified</key><date>2006-05-15T18:01:00Z</date> <key>Date Added</key><date>2006-11-13T05:50:55Z</date> <key>Bit Rate</key><integer>192</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>1</integer> <key>Play Date</key><integer>3246227679</integer> <key>Play Date UTC</key><date>2006-11-13T08:54:39Z</date> <key>Normalization</key><integer>29055</integer> <key>Persistent ID</key><string>B7F13C5664B77A8F</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Obie%20Trice/Cheers/01%20Average%20Man.m +p3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8414</key> <dict> <key>Track ID</key><integer>8414</integer> <key>Name</key><string>Every Little Thing She Does Is Magi +c</string> <key>Artist</key><string>Ra</string> <key>Album</key><string>Duality</string> <key>Genre</key><string>Hard Rock</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>5446468</integer> <key>Total Time</key><integer>226664</integer> <key>Track Number</key><integer>11</integer> <key>Date Modified</key><date>2006-05-09T03:38:44Z</date> <key>Date Added</key><date>2006-11-13T05:50:57Z</date> <key>Bit Rate</key><integer>192</integer> <key>Sample Rate</key><integer>44100</integer> <key>Comments</key><string> 00002617 000022F7 00005EDB 000 +051C3 0000BBE7 00009837 00008000 00008000 000023C5 000023C5</string> <key>Play Count</key><integer>3</integer> <key>Play Date</key><integer>3246228629</integer> <key>Play Date UTC</key><date>2006-11-13T09:10:29Z</date> <key>Persistent ID</key><string>B7F13C5664B77B19</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/RA/Duality/11%20Every%20Little%20Thing%2 +0She%20Does%20Is%20Ma.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8453</key> <dict> <key>Track ID</key><integer>8453</integer> <key>Name</key><string>What Hurts The Most</string> <key>Artist</key><string>Rascal Flatts</string> <key>Album</key><string>N/A</string> <key>Genre</key><string>Country</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>5130240</integer> <key>Total Time</key><integer>213681</integer> <key>Year</key><integer>2006</integer> <key>Date Modified</key><date>2006-11-06T10:28:30Z</date> <key>Date Added</key><date>2006-11-13T05:50:57Z</date> <key>Bit Rate</key><integer>192</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>1</integer> <key>Play Date</key><integer>3246226485</integer> <key>Play Date UTC</key><date>2006-11-13T08:34:45Z</date> <key>Persistent ID</key><string>B7F13C5664B77B36</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Rascal%20Flatts%20-%20What%20Hurts%20the +%20Most.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8480</key> <dict> <key>Track ID</key><integer>8480</integer> <key>Name</key><string>Rest in Pieces</string> <key>Artist</key><string>Saliva</string> <key>Album</key><string>Back into Your System</string> <key>Genre</key><string>Rock</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>5443888</integer> <key>Total Time</key><integer>226821</integer> <key>Year</key><integer>2002</integer> <key>Date Modified</key><date>2006-05-23T06:17:08Z</date> <key>Date Added</key><date>2006-11-13T05:50:57Z</date> <key>Bit Rate</key><integer>192</integer> <key>Sample Rate</key><integer>44100</integer> <key>Comments</key><string>.:[ BUTT OWNAGE ]:.</string> <key>Play Count</key><integer>1</integer> <key>Play Date</key><integer>3246229755</integer> <key>Play Date UTC</key><date>2006-11-13T09:29:15Z</date> <key>Persistent ID</key><string>B7F13C5664B77B4A</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Saliva/Back%20into%20Your%20System/Rest% +20in%20Pieces.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8491</key> <dict> <key>Track ID</key><integer>8491</integer> <key>Name</key><string>fine again</string> <key>Artist</key><string>seether</string> <key>Album</key><string>Disclaimer</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>3905999</integer> <key>Total Time</key><integer>244114</integer> <key>Date Modified</key><date>2006-03-12T23:18:10Z</date> <key>Date Added</key><date>2006-11-13T05:50:57Z</date> <key>Bit Rate</key><integer>128</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>2</integer> <key>Play Date</key><integer>3246230489</integer> <key>Play Date UTC</key><date>2006-11-13T09:41:29Z</date> <key>Normalization</key><integer>12857</integer> <key>Persistent ID</key><string>B7F13C5664B77B52</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/seether/Disclaimer/fine%20again.mp3</str +ing> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8503</key> <dict> <key>Track ID</key><integer>8503</integer> <key>Name</key><string>Out Of My Way</string> <key>Artist</key><string>Seether</string> <key>Album</key><string>Freddy Vs Jason</string> <key>Genre</key><string>Metal</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>5551299</integer> <key>Total Time</key><integer>231288</integer> <key>Track Number</key><integer>12</integer> <key>Year</key><integer>2003</integer> <key>Date Modified</key><date>2006-11-10T01:40:07Z</date> <key>Date Added</key><date>2006-11-13T05:50:57Z</date> <key>Bit Rate</key><integer>192</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>2</integer> <key>Play Date</key><integer>3246229986</integer> <key>Play Date UTC</key><date>2006-11-13T09:33:06Z</date> <key>Persistent ID</key><string>B7F13C5664B77B5B</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Seether%20-%20out%20of%20my%20way.mp3</s +tring> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8515</key> <dict> <key>Track ID</key><integer>8515</integer> <key>Name</key><string>broken</string> <key>Artist</key><string>seether ft amy lee</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>4147212</integer> <key>Total Time</key><integer>259134</integer> <key>Date Modified</key><date>2006-05-09T02:07:32Z</date> <key>Date Added</key><date>2006-11-13T05:50:58Z</date> <key>Bit Rate</key><integer>128</integer> <key>Sample Rate</key><integer>44100</integer> <key>Comments</key><string> 00002C6F 00002AD0 0000794A 000 +07D88 0002E647 00035B8E 00008000 00008000 00009C85 00009C85</string> <key>Play Count</key><integer>2</integer> <key>Play Date</key><integer>3246230245</integer> <key>Play Date UTC</key><date>2006-11-13T09:37:25Z</date> <key>Persistent ID</key><string>B7F13C5664B77B64</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/seether%20ft%20amy%20lee/Unknown%20Album +/broken.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8569</key> <dict> <key>Track ID</key><integer>8569</integer> <key>Name</key><string>1979</string> <key>Artist</key><string>Smashing Pumpkins</string> <key>Album</key><string>Mellon Collie, Disk 2</string> <key>Genre</key><string>Alternative</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>4254949</integer> <key>Total Time</key><integer>265926</integer> <key>Date Modified</key><date>2006-10-22T21:15:54Z</date> <key>Date Added</key><date>2006-11-13T05:50:58Z</date> <key>Bit Rate</key><integer>128</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>1</integer> <key>Play Date</key><integer>3246226012</integer> <key>Play Date UTC</key><date>2006-11-13T08:26:52Z</date> <key>Persistent ID</key><string>B7F13C5664B77B8D</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/smashing%20pumpkins%20-%201979.mp3</stri +ng> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8586</key> <dict> <key>Track ID</key><integer>8586</integer> <key>Name</key><string>Luna</string> <key>Artist</key><string>Smashing Pumpkins</string> <key>Album</key><string>Siamese Dream</string> <key>Genre</key><string>Other</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>3209648</integer> <key>Total Time</key><integer>200594</integer> <key>Date Modified</key><date>2006-10-22T21:29:48Z</date> <key>Date Added</key><date>2006-11-13T05:50:58Z</date> <key>Bit Rate</key><integer>128</integer> <key>Sample Rate</key><integer>44100</integer> <key>Comments</key><string>-Harry Sachs-</string> <key>Play Count</key><integer>1</integer> <key>Play Date</key><integer>3246225746</integer> <key>Play Date UTC</key><date>2006-11-13T08:22:26Z</date> <key>Persistent ID</key><string>B7F13C5664B77B9A</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/smashing%20pumpkins%20-%20siamese%20drea +m%20-%20luna(2).mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>8622</key> <dict> <key>Track ID</key><integer>8622</integer> <key>Name</key><string>Everything Changes</string> <key>Artist</key><string>Staind</string> <key>Composer</key><string>Staind</string> <key>Album</key><string>Chapter V</string> <key>Genre</key><string>Rock</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>3799040</integer> <key>Total Time</key><integer>235885</integer> <key>Track Number</key><integer>9</integer> <key>Year</key><integer>2005</integer> <key>Date Modified</key><date>2006-03-12T23:13:38Z</date> <key>Date Added</key><date>2006-11-13T05:50:58Z</date> <key>Bit Rate</key><integer>128</integer> <key>Sample Rate</key><integer>44100</integer> <key>Comments</key><string>www.staindsouls.com</string> <key>Play Count</key><integer>2</integer> <key>Play Date</key><integer>3246229220</integer> <key>Play Date UTC</key><date>2006-11-13T09:20:20Z</date> <key>Normalization</key><integer>19460</integer> <key>Persistent ID</key><string>B7F13C5664B77BB4</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Staind/Chapter%20V/09%20Everything%20Cha +nges.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>9608</key> <dict> <key>Track ID</key><integer>9608</integer> <key>Name</key><string>Gifts and Curses</string> <key>Artist</key><string>Yellowcard</string> <key>Album</key><string>Spiderman 2</string> <key>Genre</key><string>Soundtrack</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>8471939</integer> <key>Total Time</key><integer>307957</integer> <key>Year</key><integer>2004</integer> <key>Date Modified</key><date>2006-05-09T07:51:58Z</date> <key>Date Added</key><date>2006-11-13T05:51:06Z</date> <key>Bit Rate</key><integer>220</integer> <key>Sample Rate</key><integer>44100</integer> <key>Comments</key><string>.: XXL Team :.</string> <key>Play Count</key><integer>3</integer> <key>Play Date</key><integer>3246229528</integer> <key>Play Date UTC</key><date>2006-11-13T09:25:28Z</date> <key>Persistent ID</key><string>B7F13C5664B77E97</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Yellowcard/Spiderman%202/Gifts%20and%20C +urses.mp3</string> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> <key>12524</key> <dict> <key>Track ID</key><integer>12524</integer> <key>Name</key><string>how about you</string> <key>Artist</key><string>Staind</string> <key>Album</key><string>14 Shades Of Grey</string> <key>Genre</key><string>Hard Rock</string> <key>Kind</key><string>MPEG audio file</string> <key>Size</key><integer>5729350</integer> <key>Total Time</key><integer>238706</integer> <key>Track Number</key><integer>2</integer> <key>Year</key><integer>2003</integer> <key>Date Modified</key><date>2006-11-13T08:59:13Z</date> <key>Date Added</key><date>2006-11-13T08:58:53Z</date> <key>Bit Rate</key><integer>192</integer> <key>Sample Rate</key><integer>44100</integer> <key>Play Count</key><integer>2</integer> <key>Play Date</key><integer>3246230728</integer> <key>Play Date UTC</key><date>2006-11-13T09:45:28Z</date> <key>Persistent ID</key><string>B7F13C5664B78013</string> <key>Track Type</key><string>File</string> <key>Location</key><string>file://localhost/C:/Documents%2 +0and%20Settings/Devin/Shared/Staind%20-%20How%20About%20You.mp3</stri +ng> <key>File Folder Count</key><integer>-1</integer> <key>Library Folder Count</key><integer>-1</integer> </dict> </dict> <key>Playlists</key> <array> <dict> <key>Name</key><string>sleep</string> <key>Playlist ID</key><integer>12378</integer> <key>Playlist Persistent ID</key><string>B7F13C5664B7800A< +/string> <key>All Items</key><true/> <key>Playlist Items</key> <array> <dict> <key>Track ID</key><integer>7843</integer> </dict> <dict> <key>Track ID</key><integer>8414</integer> </dict> <dict> <key>Track ID</key><integer>6639</integer> </dict> <dict> <key>Track ID</key><integer>8622</integer> </dict> <dict> <key>Track ID</key><integer>9608</integer> </dict> <dict> <key>Track ID</key><integer>8480</integer> </dict> <dict> <key>Track ID</key><integer>8503</integer> </dict> <dict> <key>Track ID</key><integer>8515</integer> </dict> <dict> <key>Track ID</key><integer>8491</integer> </dict> <dict> <key>Track ID</key><integer>12524</integer> </dict> <dict> <key>Track ID</key><integer>8232</integer> </dict> <dict> <key>Track ID</key><integer>8453</integer> </dict> <dict> <key>Track ID</key><integer>8586</integer> </dict> <dict> <key>Track ID</key><integer>8569</integer> </dict> </array> </dict> </array> </dict> </plist>
meh.

Replies are listed 'Best First'.
Re: iTunes lacking on CPAN...
by Corion (Patriarch) on Nov 13, 2006 at 10:04 UTC
Re: iTunes lacking on CPAN...
by crenz (Priest) on Nov 13, 2006 at 12:55 UTC

    Another idea would be to save yourself quite some work by using a service like last.fm.

      It looks like http://last.fm has an XML/RSS feed that I can use (along with some HTML they provide that links to a .gif image with a list of recently played tracks. Doesn't update too fast though it looks like...) to show the most recent tracks...perhaps i could use XML::Twig for this...

      The XML is a LOT simpler for this site:

      Or, I could even parse the even simpler CSV file:

      1163436933,Staind – Everything Changes 1163436668,The Smashing Pumpkins – 1979 1163436360,Yellowcard – Gifts and Curses 1163435904,Rascal Flatts – What Hurts The Most

      meh.

      Looks like that could work great crenz. ++ to you :-). I still think it would be nice to have a module do this so people wouldn't have to sign up for a service to do it for me...that way they could have a perl app or C program that could run in the background and update automatically...

      meh.
Re: iTunes lacking on CPAN...
by jasonk (Parson) on Nov 13, 2006 at 14:20 UTC

    You should be able to do this pretty easily with Mac::AppleScript::Glue.

    #!/usr/bin/perl -w # This code not tested, as I sadly don't have a Mac at work use strict; use warnings; use Mac::AppleScript::Glue; use Data::Dumper; my $t = Mac::AppleScript::Glue::Application->new('iTunes'); my $track = $t->current_track; # Not sure if current_track is going to return a hash # or an object... print Dumper( $track );

    If that doesn't work, I'll update it when I get home tonight and have access to a Mac again...


    We're not surrounded, we're in a target-rich environment!

      I was under the impression that all Mac:: modules required a Apple computer to work? Maybe I misread...

      meh.

        You say that like it's a bad thing. :)

        (But yes, Mac::Glue et al depend on sending AppleEvents and are unlikely to work on Wintendo.)