NAME

DBD::iPod - Connect to an iPod via DBI

SYNOPSIS

use DBI;
my $dbh = DBI->connect('dbi:iPod:');

#or explicitly give mount path, /mnt/ipod is the default
#my $dbh = DBI->connect('dbi:iPod:/mnt/ipod');

#not mounted at /mnt/ipod ?  do this:
#my $dbh = DBI->connect('dbi:iPod:/mnt/ipod2');

my $sth = $dbh->prepare("SELECT * FROM iPod");
$sth->execute();

my(%artist,$c,$count);

print STDERR "\nGenerating stats from iPod, this may take a few minutes...\n";

while(my $row = $sth->fetchrow_hashref){
  $artist{ $row->{artist} }++;
  $c += $row->{time};
  $count++;
}

my($h,$m,$s,$u) = (0,0,0,0);

$c /= 1000; #milliseconds to seconds
$cs = $c;
$cm = int($c / 60);
$cs %= 60;
$ch = int($cm / 60);
$cm %= 60;
$cu = $c % 1;

$cs += $cu;
$cs = sprintf("%.3f",$cs);
$cs = '0'.$cs if $cs < 10;
my $hmsu = sprintf('%02d:%02d:%s',$ch,$cm,$cs);

print "\n\n".
"=======================================\n".
"         This iPod contains:\n".
"  Artists:         ".scalar(keys(%artist))."\n".
"  Tracks:          ".$count."\n".
"  Total Play Time: ".$hmsu."\n".
"=======================================\n\n";

DESCRIPTION

Connect to the iPod using Mac::iPod::GNUpod and present the iTunes database as a DBD datasource. You query the iPod's iTunesDB database using a subset of SQL. iTunesDB is currently read only, and thus only supports the SQL SELECT statement.

We expect the iPod to be mounted at /mnt/ipod. If you've mounted elsewhere (or have multiple iPodia mounted), use an alternate system path. "SYNOPSIS".

THE iPod TABLE

There isn't really a table in the iPod. But we can make it look that way thanks to the wonderful GNUpod project. It might look like this:

   Column    |     Type
-------------+--------------
  bitrate    | kb/s
  time       | milliseonds
  stoptime   | milliseconds
  songs      | ?
  fdesc      | text
  srate      | Hertz
  rating     | integer
  cdnum      | ?
  cds        | ?
  starttime  | milliseconds
  playcount  | integer
  id         | GUID
  prerating  | ?
  volume     | integer
  songnum    | integer
  path       | filepath
  genre      | genre
  filesize   | bytes
  artist     | text
  album      | album name
  comment    | comment
  title      | track name
  uniq       | GUID

PARTIAL SQL SELECT SUPPORT

Not all SELECT functionality is implemented. Actually, almost none of it is implemented. Here are some examples of what you can do:

SELECT * FROM iPod;
SELECT artist,title FROM iPod;
SELECT * FROM iPod LIMIT 10,20;
SELECT * FROM iPod WHERE artist LIKE 'something%';
SELECT * FROM iPod WHERE artist LIKE 'something else%'
  OR (bitrate = 1024 AND playcount >= 1);

If you need more SQL functionality, please send me a patch. I'd really like to get DISTINCT(), COUNT(), and GROUP BY working.

AUTHOR

Allen Day <allenday@ucla.edu>

SEE ALSO

Mac::iPod::GNUpod, DBI.

GNUpod - http://www.gnu.org/software/gnupod/

iPodLinux - http://www.ipodlinux.org/index.php/Main_Page

BUGS / TODO

* Add playlist support. Should be implemented in Mac::iPod::GNUpod, it is in the original GNUpod project.

* Add more SELECT clause and function support. Especially "GROUP BY", "DISTINCT()", and "COUNT()".

* Add INSERT and UPDATE support.

* Some fields are missing, e.g. BPM (beats/minute) that are present in the iTunesDB. I've also read at iPodLinux, but not personally observed yet, that track ratings may be borked given what I understand about GNUpod.

COPYRIGHT AND LICENSE

GPL

APPENDIX

The rest of the documentation details each of the object methods. Internal methods are usually preceded with a '_'. Methods are in alphabetical order for the most part.

driver()

Usage   :
Function: Creates a new driver handle, which will be a singleton.
Example :
Returns : 
Args    :