my $help=0;
my $basedir=undef;
my $dbpath=undef;
-my @extensions=qw(mp3); # ogg flac); # FIXME
+my $list=0;
+my @extensions=qw(mp3 flac ogg);
+my $files_pruned;
Configure(qw(bundling no_ignore_case));
my $optret=GetOptions(
"dir|d=s" => \$basedir,
"database|f=s" => \$dbpath,
"extensions|e=s" => sub { @extensions=split(/\s+|\s*,\s*/, $_[1]); },
+ "list|l" => \$list,
);
usage() if(!@ARGV || !$optret || $help);
}
my $db=ID3FS::DB->new($me, $dbpath, $basedir, $ARGV[0]);
-$db->last_update(time());
-
-while(my $path=shift)
+if($list)
+{
+ list_tags($db);
+}
+else
{
- File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
+ $db->last_update(time());
+
+ my $directories_pruned=$db->prune_directories();
+ while(my $path=shift)
+ {
+ File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
+ }
+ if($files_pruned || $directories_pruned)
+ {
+ print "Removing data from pruned files\n" if $verbose;
+ $db->remove_unused();
+ }
}
sub wanted
if(-d)
{
print("$_\n") if $verbose;
+ prune($_);
}
elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions)))
{
}
}
+
+sub prune
+{
+ my $dir=shift;
+ return unless(opendir(DIR, $dir));
+ print "Pruning $dir\n";
+ my @oldfiles=$db->files_in($dir);
+ my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
+ closedir(DIR);
+ @oldfiles=sort @oldfiles;
+ @newfiles=sort @newfiles;
+ my %hash;
+ @hash{@newfiles}=();
+ for my $file (@oldfiles)
+ {
+ unless(exists($hash{$file}))
+ {
+ # FIXME: add path, rebasify
+ $files_pruned=1;
+ $db->unindex($file);
+ }
+ }
+}
+
+
+
+
+sub list_tags
+{
+ my($db)=@_;
+ my @baretags=$db->bare_tags();
+ my $valtags=$db->tags_with_values();
+ if(@baretags)
+ {
+ print "BARE TAGS\n";
+ print join(', ', sort @baretags), "\n\n";
+ }
+ if(keys(%$valtags))
+ {
+ print "TAGS WITH VALUES\n";
+ for my $key (sort keys %$valtags)
+ {
+ print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
+ }
+ }
+}
+
sub usage
{
- die("Usage: $me [-vqh] [-d basedir] [-b dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
+ 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".
=head1 SYNOPSIS
-B<id3fs-index> [I<-vqh>] S<[I<-d >B<basedir>]> S<[I<-f >B<dbpath>]> S<[I<-e >B<mp3,ogg,flac>]> [--] [B<DIR>...]
+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>...]
=head1 DESCRIPTION