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());
52 my $directories_pruned=$db->prune_directories();
55 File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
57 if($files_pruned || $directories_pruned)
59 print "Removing data from pruned files\n" if $verbose;
67 if(/.*\.(.*)/) { $ext=lc($1); }
70 print("$_\n") if $verbose;
73 elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions)))
84 return unless(opendir(DIR, $dir));
85 print "Pruning $dir\n";
86 my @oldfiles=$db->files_in($dir);
87 my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
89 @oldfiles=sort @oldfiles;
90 @newfiles=sort @newfiles;
93 for my $file (@oldfiles)
95 unless(exists($hash{$file}))
97 # FIXME: add path, rebasify
107 my @baretags=$db->bare_tags();
108 my $valtags=$db->tags_with_values();
112 print join(', ', sort @baretags), "\n\n";
116 print "TAGS WITH VALUES\n";
117 for my $key (sort keys %$valtags)
119 print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
126 die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
127 " -v|--verbose\t\t\tVerbose\n".
128 " -q|--quiet\t\t\tQuiet (default)\n".
129 " -d|--dir=PATH\t\t\tBase directory of source files (default: ARGV[0])\n".
130 " -f|--database=FILE\t\tPath to database file (default: basedir/.id3fs)\n".
131 " -e|--extensions=EXT1,EXT2\tFile extensions to index (default: mp3, ogg, flac)\n".
132 " -h|--help\t\t\tThis help\n".
133 " --\t\t\t\tEnd of options\n");
140 id3fs-index - Add files to id3fs index
144 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>...]
148 Extracts id3 tags from mp3 files (and comment tags from ogg and flac
149 files) and adds them to a sqlite database, ready for mounting
158 Enable verbose operation.
162 Quiet (no output). This is the default.
164 =item S<B<-d >I<PATH>> | S<B<--dir=>I<PATH>>
166 Specify base directory of source files. All files will be indexed
167 relative to this point.
169 If not specified, defaults to the first non-option argument on the
170 command line. Note that to avoid ambiguities, if more than one
171 directory is specified on the command line, the base directory must
172 be specified explicitly.
174 All files indexed must be under the base directory.
176 =item S<B<-f >I<FILE>> | S<B<--database=>I<FILE>>
178 Database file to use. If not specified, defaults to
179 a hidden file called B<".id3fs"> under the base directory.
181 =item S<B<-e >I<EXT1,EXT2>> | S<B<--extensions=>I<EXT1,EXT2>>
183 File extensions to consider when indexing.
184 Defaults to B<.mp3>, B<.ogg> and B<.flac>.
188 Show a short help message.
198 Index all files in the current directory:
202 Index current directory, printing each subdirectory as it recurses
207 Just index some sub-directories:
209 id3fs-index -d . dir1 dir2
211 Store the database in a custom location:
213 id3fs-index -f ~/.id3fs/index.sqlite .
215 Only index .mp3 and .flac files:
217 id3fs-index -e mp3,flac .
221 Please report any found to ianb@erislabs.net
229 Ian Beckwith <ianb@erislabs.net>
233 The latest version can be found at:
235 B<http://erislabs.net/ianb/projects/id3fs/>
239 Copyright 2010 Ian Beckwith <ianb@erislabs.net>
241 This program is free software: you can redistribute it and/or modify
242 it under the terms of the GNU General Public License as published by
243 the Free Software Foundation; either version 3 of the License, or
244 (at your option) any later version.
246 This program is distributed in the hope that it will be useful,
247 but WITHOUT ANY WARRANTY; without even the implied warranty of
248 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
249 GNU General Public License for more details.
251 You should have received a copy of the GNU General Public License
252 along with this program. If not, see <http://www.gnu.org/licenses/>.