X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=bin%2Fid3fs-index;h=7f0c17ca67464afd28edd3f359334c8553b20a52;hb=198047fe7da462f486e7da3a751ecdea8d285750;hp=99ae6bb485368fb53e84bbcb1f180704ef2dbd3a;hpb=cd69739c61886e975d3ea0b0ec19c0e0fcba49bb;p=id3fs.git diff --git a/bin/id3fs-index b/bin/id3fs-index index 99ae6bb..7f0c17c 100755 --- a/bin/id3fs-index +++ b/bin/id3fs-index @@ -1,6 +1,20 @@ #!/usr/bin/perl -w -# Ian Beckwith # +# id3fs - a FUSE-based filesystem for browsing audio metadata +# Copyright (C) 2010 Ian Beckwith +# +# 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 . use lib '/home/ianb/projects/id3fs/id3fs/lib'; # FIXME: remove use strict; @@ -14,7 +28,10 @@ my $verbose=0; my $help=0; my $basedir=undef; my $dbpath=undef; -my @extensions=qw(mp3); # ogg flac); # FIXME +my $list=0; +my $init=0; +my @extensions=qw(mp3 flac ogg); +my $files_pruned; Configure(qw(bundling no_ignore_case)); my $optret=GetOptions( @@ -24,21 +41,57 @@ my $optret=GetOptions( "dir|d=s" => \$basedir, "database|f=s" => \$dbpath, "extensions|e=s" => sub { @extensions=split(/\s+|\s*,\s*/, $_[1]); }, + "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]); -$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 $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 "$me: removing data from pruned files\n" if $verbose; + $db->remove_unused(); + } + print "$me: analyzing db\n" if $verbose; + $db->analyze(); } sub wanted @@ -48,6 +101,7 @@ sub wanted if(-d) { print("$_\n") if $verbose; + prune($_); } elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions))) { @@ -56,9 +110,54 @@ sub wanted } } + +sub prune +{ + my $dir=shift; + $dir=Cwd::abs_path($dir); + return unless(opendir(DIR, $dir)); + my $base=Cwd::abs_path($db->base_dir()); + $dir=~s/^$base\/?//; + 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})) + { + $files_pruned=1; + $db->unindex($dir, $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". @@ -76,7 +175,7 @@ id3fs-index - Add files to id3fs index =head1 SYNOPSIS -B [I<-vqh>] S<[I<-d >B]> S<[I<-f >B]> S<[I<-e >B]> [--] [B...] +B [B<-vqh>] S<[B<-d >I]> S<[B<-f >I]> S<[B<-e >I]> [B<-->] [I...] =head1 DESCRIPTION