Configure(qw(bundling no_ignore_case));
my $optret=GetOptions(
"verbose|v" => \$verbose,
- "quiet|q" => sub { $verbose=0; },
"help|h" => \$help,
"dir|d=s" => \$basedir,
"database|f=s" => \$dbpath,
my $directories_pruned=$db->prune_directories();
if($files_pruned || $directories_pruned)
{
- print "$me: removing data from pruned files\n" if $verbose;
+ print "$me: pruning removed files from db\n" if $verbose;
$db->remove_unused();
}
print "$me: analyzing db\n" if $verbose;
}
}
-
sub prune
{
my $dir=shift;
@oldfiles=sort @oldfiles;
@newfiles=sort @newfiles;
my %hash;
+ # hash slice!
@hash{@newfiles}=();
for my $file (@oldfiles)
{
sub usage
{
- die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
- " -v|--verbose\t\t\tVerbose\n".
- " -q|--quiet\t\t\tQuiet (default)\n".
- " -d|--dir=PATH\t\t\tBase directory of source files (default: ARGV[0])\n".
- " -f|--database=FILE\t\tPath to database file (default: basedir/.id3fs)\n".
- " -e|--extensions=EXT1,EXT2\tFile extensions to index (default: mp3, ogg, flac)\n".
- " -h|--help\t\t\tThis help\n".
- " --\t\t\t\tEnd of options\n");
+ die("Usage: $me [-lvh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
+ " -d|--dir=PATH Base directory of source files (default: ARGV[0])\n".
+ " -f|--database=FILE Path to database file (default: basedir/.id3fs)\n".
+ " -e|--extensions=EXT1,EXT2 File extensions to index (default: mp3, ogg, flac)\n".
+ " -l|list List tags in use\n" .
+ " -v|--verbose Verbose\n".
+ " -h|--help This help\n".
+ " -- End of options\n");
}
__END__
=head1 SYNOPSIS
-B<id3fs-index> [B<-vqh>] S<[B<-d >I<basedir>]> S<[B<-f >I<dbpath>]> S<[B<-e >I<mp3,ogg,flac>]> [B<-->] [I<DIR>...]
+B<id3fs-index> [B<-lvh>] S<[B<-d >I<basedir>]> S<[B<-f >I<dbpath>]> S<[B<-e >I<mp3,ogg,flac>]> [B<-->] [I<DIR>...]
=head1 DESCRIPTION
=over 4
-=item B<-v>
-
-Enable verbose operation.
-
-=item B<-q>
+=item B<-l> | B<--list>
-Quiet (no output). This is the default.
+List tags in use in specified database.
=item S<B<-d >I<PATH>> | S<B<--dir=>I<PATH>>
File extensions to consider when indexing.
Defaults to B<.mp3>, B<.ogg> and B<.flac>.
+=item B<-v>
+
+Enable verbose operation.
+
=item B<-h>
Show a short help message.
=head1 SEE ALSO
-L<id3fsd(8)>
+L<id3fsd(8)>, L<MP3::Tag>, L<Audio::Flac::Header>, L<Ogg::Vorbis::Header>
=head1 AUTHOR
Ian Beckwith <ianb@erislabs.net>
+Many thanks to Aubrey Stark-Toller for help wrangling SQL.
+
=head1 AVAILABILITY
The latest version can be found at:
-B<http://erislabs.net/ianb/projects/id3fs/>
+L<http://erislabs.net/ianb/projects/id3fs/>
=head1 COPYRIGHT
-Copyright 2010 Ian Beckwith <ianb@erislabs.net>
+Copyright (C) 2010 Ian Beckwith <ianb@erislabs.net>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3 of the License, or
+the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
our ($TYPE_DIR, $TYPE_SYMLINK)=(0040, 0120);
our $DEFAULT_MAXTAGDEPTH = 10;
+
sub new
{
my $proto=shift;
$atime, $mtime, $ctime, $blksize, $blocks);
}
+sub mode
+{
+ my($self, $type)=@_;
+ return(($type << 9) | $self->{perms});
+}
+
sub readlink
{
my($self,$filename)=@_;
return(-ENOTDIR()) unless($path->isdir());
my @dents=();
my($dirs, $files)=$path->dirents();
- # too slow
-# push(@dents, $path->filter(@$dirs));
push(@dents, @$dirs);
push(@dents, @$files);
if(@dents)
sub listxattr { print "FUSE: listxattr\n"; return -EOPNOTSUPP(); }
sub removexattr { print "FUSE: removexattr\n"; return -EOPNOTSUPP(); }
-sub mode
-{
- my($self, $type)=@_;
- return(($type << 9) | $self->{perms});
-}
-
1;