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;
67 print "$me: analyzing db\n" if $verbose;
74 if(/.*\.(.*)/) { $ext=lc($1); }
77 print("$_\n") if $verbose;
80 elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions)))
91 return unless(opendir(DIR, $dir));
92 my @oldfiles=$db->files_in($dir);
93 my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
95 @oldfiles=sort @oldfiles;
96 @newfiles=sort @newfiles;
99 for my $file (@oldfiles)
101 unless(exists($hash{$file}))
103 # FIXME: add path, rebasify
113 my @baretags=$db->bare_tags();
114 my $valtags=$db->tags_with_values();
118 print join(', ', sort @baretags), "\n\n";
122 print "TAGS WITH VALUES\n";
123 for my $key (sort keys %$valtags)
125 print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
132 die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
133 " -v|--verbose\t\t\tVerbose\n".
134 " -q|--quiet\t\t\tQuiet (default)\n".
135 " -d|--dir=PATH\t\t\tBase directory of source files (default: ARGV[0])\n".
136 " -f|--database=FILE\t\tPath to database file (default: basedir/.id3fs)\n".
137 " -e|--extensions=EXT1,EXT2\tFile extensions to index (default: mp3, ogg, flac)\n".
138 " -h|--help\t\t\tThis help\n".
139 " --\t\t\t\tEnd of options\n");
146 id3fs-index - Add files to id3fs index
150 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>...]
154 Extracts id3 tags from mp3 files (and comment tags from ogg and flac
155 files) and adds them to a sqlite database, ready for mounting
164 Enable verbose operation.
168 Quiet (no output). This is the default.
170 =item S<B<-d >I<PATH>> | S<B<--dir=>I<PATH>>
172 Specify base directory of source files. All files will be indexed
173 relative to this point.
175 If not specified, defaults to the first non-option argument on the
176 command line. Note that to avoid ambiguities, if more than one
177 directory is specified on the command line, the base directory must
178 be specified explicitly.
180 All files indexed must be under the base directory.
182 =item S<B<-f >I<FILE>> | S<B<--database=>I<FILE>>
184 Database file to use. If not specified, defaults to
185 a hidden file called B<".id3fs"> under the base directory.
187 =item S<B<-e >I<EXT1,EXT2>> | S<B<--extensions=>I<EXT1,EXT2>>
189 File extensions to consider when indexing.
190 Defaults to B<.mp3>, B<.ogg> and B<.flac>.
194 Show a short help message.
204 Index all files in the current directory:
208 Index current directory, printing each subdirectory as it recurses
213 Just index some sub-directories:
215 id3fs-index -d . dir1 dir2
217 Store the database in a custom location:
219 id3fs-index -f ~/.id3fs/index.sqlite .
221 Only index .mp3 and .flac files:
223 id3fs-index -e mp3,flac .
227 Please report any found to ianb@erislabs.net
235 Ian Beckwith <ianb@erislabs.net>
239 The latest version can be found at:
241 B<http://erislabs.net/ianb/projects/id3fs/>
245 Copyright 2010 Ian Beckwith <ianb@erislabs.net>
247 This program is free software: you can redistribute it and/or modify
248 it under the terms of the GNU General Public License as published by
249 the Free Software Foundation; either version 3 of the License, or
250 (at your option) any later version.
252 This program is distributed in the hope that it will be useful,
253 but WITHOUT ANY WARRANTY; without even the implied warranty of
254 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
255 GNU General Public License for more details.
257 You should have received a copy of the GNU General Public License
258 along with this program. If not, see <http://www.gnu.org/licenses/>.