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]); },
33 usage() if(!@ARGV || !$optret || $help);
34 $init=1 unless($list);
36 if(@ARGV > 1 && !defined($basedir))
38 die("$me: --basedir must be specified if multiple paths are supplied\n");
41 my $db=ID3FS::DB->new($me, $verbose, $init, $dbpath, $basedir, $ARGV[0]);
50 $db->last_update(time());
51 my $base=$db->base_dir();
52 my $abs_base=Cwd::abs_path($base);
55 if(Cwd::abs_path($path) !~ /^$abs_base/)
57 print "$me: $path is outside $base, skipping\n";
59 File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
61 my $directories_pruned=$db->prune_directories();
62 if($files_pruned || $directories_pruned)
64 print "$me: removing data from pruned files\n" if $verbose;
72 if(/.*\.(.*)/) { $ext=lc($1); }
75 print("$_\n") if $verbose;
78 elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions)))
89 return unless(opendir(DIR, $dir));
90 my @oldfiles=$db->files_in($dir);
91 my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
93 @oldfiles=sort @oldfiles;
94 @newfiles=sort @newfiles;
97 for my $file (@oldfiles)
99 unless(exists($hash{$file}))
101 # FIXME: add path, rebasify
111 my @baretags=$db->bare_tags();
112 my $valtags=$db->tags_with_values();
116 print join(', ', sort @baretags), "\n\n";
120 print "TAGS WITH VALUES\n";
121 for my $key (sort keys %$valtags)
123 print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
130 die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
131 " -v|--verbose\t\t\tVerbose\n".
132 " -q|--quiet\t\t\tQuiet (default)\n".
133 " -d|--dir=PATH\t\t\tBase directory of source files (default: ARGV[0])\n".
134 " -f|--database=FILE\t\tPath to database file (default: basedir/.id3fs)\n".
135 " -e|--extensions=EXT1,EXT2\tFile extensions to index (default: mp3, ogg, flac)\n".
136 " -h|--help\t\t\tThis help\n".
137 " --\t\t\t\tEnd of options\n");
144 id3fs-index - Add files to id3fs index
148 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>...]
152 Extracts id3 tags from mp3 files (and comment tags from ogg and flac
153 files) and adds them to a sqlite database, ready for mounting
162 Enable verbose operation.
166 Quiet (no output). This is the default.
168 =item S<B<-d >I<PATH>> | S<B<--dir=>I<PATH>>
170 Specify base directory of source files. All files will be indexed
171 relative to this point.
173 If not specified, defaults to the first non-option argument on the
174 command line. Note that to avoid ambiguities, if more than one
175 directory is specified on the command line, the base directory must
176 be specified explicitly.
178 All files indexed must be under the base directory.
180 =item S<B<-f >I<FILE>> | S<B<--database=>I<FILE>>
182 Database file to use. If not specified, defaults to
183 a hidden file called B<".id3fs"> under the base directory.
185 =item S<B<-e >I<EXT1,EXT2>> | S<B<--extensions=>I<EXT1,EXT2>>
187 File extensions to consider when indexing.
188 Defaults to B<.mp3>, B<.ogg> and B<.flac>.
192 Show a short help message.
202 Index all files in the current directory:
206 Index current directory, printing each subdirectory as it recurses
211 Just index some sub-directories:
213 id3fs-index -d . dir1 dir2
215 Store the database in a custom location:
217 id3fs-index -f ~/.id3fs/index.sqlite .
219 Only index .mp3 and .flac files:
221 id3fs-index -e mp3,flac .
225 Please report any found to ianb@erislabs.net
233 Ian Beckwith <ianb@erislabs.net>
237 The latest version can be found at:
239 B<http://erislabs.net/ianb/projects/id3fs/>
243 Copyright 2010 Ian Beckwith <ianb@erislabs.net>
245 This program is free software: you can redistribute it and/or modify
246 it under the terms of the GNU General Public License as published by
247 the Free Software Foundation; either version 3 of the License, or
248 (at your option) any later version.
250 This program is distributed in the hope that it will be useful,
251 but WITHOUT ANY WARRANTY; without even the implied warranty of
252 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
253 GNU General Public License for more details.
255 You should have received a copy of the GNU General Public License
256 along with this program. If not, see <http://www.gnu.org/licenses/>.