#!/usr/bin/perl # Music Library # # Douglas Thrift # # $Id$ use strict; use warnings; use Audio::WMA; use DBI; use File::Basename; use File::Find; use MP3::Info; my @directories; for (@ARGV) { push @directories, $_; } Usage() if ($#directories == -1); my $db = DBI->connect('dbi:SQLite:dbname=' . dirname($0) . '/Music.db', '', '', {RaiseError => 1}); $db->prepare(<execute; create table if not exists artist ( id integer primary key, name text unique ) EOF $db->prepare(<execute; create table if not exists album ( id integer primary key, name text, artist integer references artist on delete cascade, year integer, unique (name, artist) ) EOF $db->prepare(<execute; create table if not exists song ( id integer primary key, name text not null, path text, album integer references album on delete cascade, track integer, unique (path, album) ) EOF $db->prepare(<execute; create index if not exists song_track on song (track) EOF my $select_artist = $db->prepare(<prepare(<prepare(<prepare(<prepare(<prepare(< \&File, follow => 1}, @directories); sub Usage { print 'Usage: ' . basename($0) . " [directory ...]\n"; exit 1; } sub File { if ($_ =~ /\.(wma|mp3)$/i) { my %tags; if ($1 =~ /^wma$/i) { %tags = %{new Audio::WMA($_)->tags}; } elsif ($1 =~ /^mp3$/i) { %tags = %{get_mp3tag($File::Find::name)}; } my $artist; $artist = $tags{ALBUMARTIST}; $artist = $tags{TPE2} if (!$artist); $artist = $tags{ARTIST} if (!$artist); $select_artist->execute($artist); my @row = $select_artist->fetchrow_array; if ($#row == -1) { $insert_artist->execute($artist); $select_artist->execute($artist); @row = $select_artist->fetchrow_array; } my $artist_id = $row[0]; my ($album, $year); $album = $tags{ALBUMTITLE}; $album = $tags{ALBUM} if (!$album); $year = $tags{YEAR}; $select_album->execute($album, $artist_id); @row = $select_album->fetchrow_array; if ($#row == -1) { $insert_album->execute($album, $artist_id, $year); $select_album->execute($album, $artist_id); @row = $select_album->fetchrow_array; } my $album_id = $row[0]; my ($song, $track); $song = $tags{TITLE}; $track = $tags{TRACKNUMBER}; $track = $tags{TRACKNUM} if (!$track); $select_song->execute($File::Find::name, $album_id); @row = $select_song->fetchrow_array; $insert_song->execute($song, $File::Find::name, $album_id, $track) if ($#row == -1); } }