2 # Ian Beckwith <ianb@erislabs.net>
5 use lib '/home/ianb/projects/id3fs/id3fs/lib'; # FIXME: remove
7 use Getopt::Long qw(Configure);
11 $me=($0=~/(?:.*\/)?(.*)/)[0];
19 my @extensions=qw(mp3 flac ogg);
22 Configure(qw(bundling no_ignore_case));
23 my $optret=GetOptions(
24 "verbose|v" => \$verbose,
25 "quiet|q" => sub { $verbose=0; },
27 "dir|d=s" => \$basedir,
28 "database|f=s" => \$dbpath,
29 "extensions|e=s" => sub { @extensions=split(/\s+|\s*,\s*/, $_[1]); },
37 usage() if(!@ARGV || !$optret || $help);
38 $init=1 unless($list);
40 unless(defined($basedir) && defined($dbpath))
42 $basedir=ID3FS::DB::find_db($me, $init, @ARGV);
43 exit unless($basedir);
44 my $absbase=Cwd::abs_path($basedir);
47 if(Cwd::abs_path($dir) !~ /^\Q$absbase\E/)
49 die("$me: $dir: must be under basedir $absbase - use --basedir to specify\n");
53 my $db=ID3FS::DB->new($me, $verbose, $init, $basedir, $dbpath);
62 $db->last_update(time());
63 my $base=$db->base_dir();
64 my $abs_base=Cwd::abs_path($base);
67 if(Cwd::abs_path($path) !~ /^$abs_base/)
69 print "$me: $path is outside $base, skipping\n";
71 File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
73 my $directories_pruned=$db->prune_directories();
74 if($files_pruned || $directories_pruned)
76 print "$me: removing data from pruned files\n" if $verbose;
79 print "$me: analyzing db\n" if $verbose;
86 if(/.*\.(.*)/) { $ext=lc($1); }
89 print("$_\n") if $verbose;
92 elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions)))
103 $dir=Cwd::abs_path($dir);
104 return unless(opendir(DIR, $dir));
105 my $base=Cwd::abs_path($db->base_dir());
107 my @oldfiles=$db->files_in($dir);
108 my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
110 @oldfiles=sort @oldfiles;
111 @newfiles=sort @newfiles;
114 for my $file (@oldfiles)
116 unless(exists($hash{$file}))
119 $db->unindex($dir, $file);
127 my @baretags=$db->bare_tags();
128 my $valtags=$db->tags_with_values();
132 print join(', ', sort @baretags), "\n\n";
136 print "TAGS WITH VALUES\n";
137 for my $key (sort keys %$valtags)
139 print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
146 die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
147 " -v|--verbose\t\t\tVerbose\n".
148 " -q|--quiet\t\t\tQuiet (default)\n".
149 " -d|--dir=PATH\t\t\tBase directory of source files (default: ARGV[0])\n".
150 " -f|--database=FILE\t\tPath to database file (default: basedir/.id3fs)\n".
151 " -e|--extensions=EXT1,EXT2\tFile extensions to index (default: mp3, ogg, flac)\n".
152 " -h|--help\t\t\tThis help\n".
153 " --\t\t\t\tEnd of options\n");
160 id3fs-index - Add files to id3fs index
164 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>...]
168 Extracts id3 tags from mp3 files (and comment tags from ogg and flac
169 files) and adds them to a sqlite database, ready for mounting
178 Enable verbose operation.
182 Quiet (no output). This is the default.
184 =item S<B<-d >I<PATH>> | S<B<--dir=>I<PATH>>
186 Specify base directory of source files. All files will be indexed
187 relative to this point.
189 If not specified, defaults to the first non-option argument on the
190 command line. Note that to avoid ambiguities, if more than one
191 directory is specified on the command line, the base directory must
192 be specified explicitly.
194 All files indexed must be under the base directory.
196 =item S<B<-f >I<FILE>> | S<B<--database=>I<FILE>>
198 Database file to use. If not specified, defaults to
199 a hidden file called B<".id3fs"> under the base directory.
201 =item S<B<-e >I<EXT1,EXT2>> | S<B<--extensions=>I<EXT1,EXT2>>
203 File extensions to consider when indexing.
204 Defaults to B<.mp3>, B<.ogg> and B<.flac>.
208 Show a short help message.
218 Index all files in the current directory:
222 Index current directory, printing each subdirectory as it recurses
227 Just index some sub-directories:
229 id3fs-index -d . dir1 dir2
231 Store the database in a custom location:
233 id3fs-index -f ~/.id3fs/index.sqlite .
235 Only index .mp3 and .flac files:
237 id3fs-index -e mp3,flac .
241 Please report any found to ianb@erislabs.net
249 Ian Beckwith <ianb@erislabs.net>
253 The latest version can be found at:
255 B<http://erislabs.net/ianb/projects/id3fs/>
259 Copyright 2010 Ian Beckwith <ianb@erislabs.net>
261 This program is free software: you can redistribute it and/or modify
262 it under the terms of the GNU General Public License as published by
263 the Free Software Foundation; either version 3 of the License, or
264 (at your option) any later version.
266 This program is distributed in the hope that it will be useful,
267 but WITHOUT ANY WARRANTY; without even the implied warranty of
268 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
269 GNU General Public License for more details.
271 You should have received a copy of the GNU General Public License
272 along with this program. If not, see <http://www.gnu.org/licenses/>.