#!/usr/bin/perl -w
-# Ian Beckwith <ianb@erislabs.net>
#
+# id3fs - a FUSE-based filesystem for browsing audio metadata
+# 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
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
use lib '/home/ianb/projects/id3fs/id3fs/lib'; # FIXME: remove
use strict;
my $basedir=undef;
my $dbpath=undef;
my $list=0;
+my $init=0;
my @extensions=qw(mp3 flac ogg);
my $files_pruned;
"list|l" => \$list,
);
+if($list && !@ARGV)
+{
+ push(@ARGV, ".");
+}
usage() if(!@ARGV || !$optret || $help);
+$init=1 unless($list);
-if(@ARGV > 1 && !defined($basedir))
+unless(defined($basedir) && defined($dbpath))
{
- die("$me: --basedir must be specified if multiple paths are supplied\n");
+ $basedir=ID3FS::DB::find_db($me, $init, @ARGV);
+ exit unless($basedir);
+ my $absbase=Cwd::abs_path($basedir);
+ for my $dir (@ARGV)
+ {
+ if(Cwd::abs_path($dir) !~ /^\Q$absbase\E/)
+ {
+ die("$me: $dir: must be under basedir $absbase - use --basedir to specify\n");
+ }
+ }
}
+my $db=ID3FS::DB->new($me, $verbose, $init, $basedir, $dbpath);
+exit unless($db);
-my $db=ID3FS::DB->new($me, $dbpath, $basedir, $ARGV[0]);
if($list)
{
list_tags($db);
else
{
$db->last_update(time());
-
- my $directories_pruned=$db->prune_directories();
+ my $base=$db->base_dir();
+ my $abs_base=Cwd::abs_path($base);
while(my $path=shift)
{
+ if(Cwd::abs_path($path) !~ /^$abs_base/)
+ {
+ print "$me: $path is outside $base, skipping\n";
+ }
File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
}
+ my $directories_pruned=$db->prune_directories();
if($files_pruned || $directories_pruned)
{
- print "Removing data from pruned files\n" if $verbose;
+ print "$me: removing data from pruned files\n" if $verbose;
$db->remove_unused();
}
+ print "$me: analyzing db\n" if $verbose;
+ $db->analyze();
}
sub wanted
sub prune
{
my $dir=shift;
+ $dir=Cwd::abs_path($dir);
return unless(opendir(DIR, $dir));
- print "Pruning $dir\n";
+ my $base=Cwd::abs_path($db->base_dir());
+ $dir=~s/^$base\/?//;
my @oldfiles=$db->files_in($dir);
my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
closedir(DIR);
{
unless(exists($hash{$file}))
{
- # FIXME: add path, rebasify
$files_pruned=1;
- $db->unindex($file);
+ $db->unindex($dir, $file);
}
}
}
-
-
-
sub list_tags
{
my($db)=@_;