- Timestamp:
- 03/28/06 19:38:39 (19 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/README
r1 r19 1 MP3::Find version 0.0 11 MP3::Find version 0.04 2 2 ====================== 3 3 4 DESCRIPTION 4 5 This module allows you to search for MP3 files by their ID3 tags. You … … 7 8 formatted string for each file using its ID3 tags, or the actual Perl 8 9 data structure representing the results. 10 11 There are currently two backends to this module: MP3::Find::Filesystem 12 and MP3::Find::DB. You choose which one you want by passing its name as 13 the argument to you "use" statement; MP3::Find will look for a 14 MP3::Find::$BACKEND module. If no backend name is given, it will default 15 to using MP3::Find::Filesystem. 16 17 Note: I'm still working out some kinks in the DB backend, so it is 18 currently not as stable as the Filesystem backend. 19 20 Note the second: This whole project is still in the alpha stage, so I 21 can make no guarentees that there won't be significant interface changes 22 in the next few versions or so. Also, comments about what about the API 23 rocks (or sucks!) are appreciated. 9 24 10 25 INSTALL … … 17 32 18 33 SYNOPSIS 19 use MP3Find; 34 # select with backend you want 35 use MP3::Find qw(Filesystem); 20 36 21 37 print "$_\n" foreach find_mp3s( … … 26 42 }, 27 43 ignore_case => 1, 28 match_words=> 1,44 exact_match => 1, 29 45 sort => [qw(year album tracknum)], 30 46 printf => '%2n. %a - %t (%b: %y)', … … 32 48 33 49 REQUIRES 34 File::Find, MP3::Info, Scalar::Util 50 File::Find, MP3::Info, and Scalar::Util are needed for the filesystem 51 backend (MP3::Find::Filesystem). In addition, if MP3::Tag is available, 52 you can search by explicit ID3v2 tag frames. 35 53 36 DBI and DBD::SQLite are needed if you want to have a database backend. 54 DBI, DBD::SQLite, and SQL::Abstract are needed for the database backend 55 (MP3::Find::DB). 37 56 38 57 COPYRIGHT AND LICENSE -
trunk/lib/MP3/Find.pm
r18 r19 47 47 }, 48 48 ignore_case => 1, 49 match_words=> 1,49 exact_match => 1, 50 50 sort => [qw(year album tracknum)], 51 51 printf => '%2n. %a - %t (%b: %y)', … … 77 77 78 78 L<File::Find>, L<MP3::Info>, and L<Scalar::Util> are needed for 79 the filesystem backend (L<MP3::Find::Filesystem>). 79 the filesystem backend (L<MP3::Find::Filesystem>). In addition, 80 if L<MP3::Tag> is available, you can search by explicit ID3v2 81 tag frames. 80 82 81 83 L<DBI>, L<DBD::SQLite>, and L<SQL::Abstract> are needed for the … … 184 186 currently only uses the filesystem backend). 185 187 188 L<mp3db> is a (currently rather barebones) command line 189 frontend for creating and updating a SQLite database for 190 use with L<MP3::Find::DB>. 191 186 192 See L<MP3::Info> for more information about the fields you can 187 search and sort on. 193 search and sort on. See L<http://id3.org/> for information about 194 ID3v2 tags. 188 195 189 196 L<File::Find::Rule::MP3Info> is another way to search for MP3 -
trunk/lib/MP3/Find/DB.pm
r13 r19 43 43 ); 44 44 45 my $DEFAULT_STATUS_CALLBACK = sub { 46 my ($action_code, $filename) = @_; 47 print STDERR "$action_code $filename\n"; 48 }; 45 49 46 50 sub search { … … 89 93 sub update_db { 90 94 my $self = shift; 91 my $db_file = shift or croak "Need the name of the datab se to update";95 my $db_file = shift or croak "Need the name of the database to update"; 92 96 my $dirs = shift; 97 98 my $status_callback = $self->{status_callback} || $DEFAULT_STATUS_CALLBACK; 93 99 94 100 my @dirs = ref $dirs eq 'ARRAY' ? @$dirs : ($dirs); … … 126 132 if (@$records == 0) { 127 133 $insert_sth->execute(map { $mp3->{$$_[0]} } @COLUMNS); 128 print STDERR "A $$mp3{FILENAME}\n";134 $status_callback->(A => $$mp3{FILENAME}); 129 135 $count++; 130 136 } elsif ($mp3->{mtime} > $$records[0][0]) { 131 137 # the mp3 file is newer than its record 132 138 $update_sth->execute((map { $mp3->{$$_[0]} } @COLUMNS), $mp3->{FILENAME}); 133 print STDERR "U $$mp3{FILENAME}\n";139 $status_callback->(U => $$mp3{FILENAME}); 134 140 $count++; 135 141 } … … 140 146 foreach ($mtime_sth, $insert_sth, $update_sth) { 141 147 $_->{RaiseError} = 0; # don't die on error 148 $_->{PrintError} = 0; # ...and don't even say anything 142 149 $_->{Active} = 1; 143 150 $_->finish; … … 150 157 my $self = shift; 151 158 my $db_file = shift or croak "Need the name of the databse to sync"; 152 159 160 my $status_callback = $self->{status_callback} || $DEFAULT_STATUS_CALLBACK; 161 153 162 my $dbh = DBI->connect("dbi:SQLite:dbname=$db_file", '', '', {RaiseError => 1}); 154 163 my $select_sth = $dbh->prepare('SELECT FILENAME FROM mp3'); … … 162 171 unless (-e $filename) { 163 172 $delete_sth->execute($filename); 164 print STDERR "D $filename\n";173 $status_callback->(D => $filename); 165 174 $count++; 166 175 } -
trunk/mkreadme
r1 r19 1 1 #!/bin/sh 2 perl -I./lib -M$1 -e"\$ver = '$1 version ' . $1->VERSION; print qq[\$ver\\n] . '=' x length(\$ver) . qq[\\n ]"2 perl -I./lib -M$1 -e"\$ver = '$1 version ' . $1->VERSION; print qq[\$ver\\n] . '=' x length(\$ver) . qq[\\n\\n]" 3 3 4 4 PM_FILE=./lib/`echo $1 | sed 's/::/\//g'`.pm -
trunk/t/03-db.t
r12 r19 23 23 # exercise the object 24 24 25 my $finder = MP3::Find::DB->new; 25 my $finder = MP3::Find::DB->new( 26 status_callback => sub {}, # be quiet about updates 27 ); 26 28 isa_ok($finder, 'MP3::Find::DB'); 27 29
Note: See TracChangeset
for help on using the changeset viewer.