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 "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 print "Pruning $dir\n";
91 my @oldfiles=$db->files_in($dir);
92 my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
94 @oldfiles=sort @oldfiles;
95 @newfiles=sort @newfiles;
98 for my $file (@oldfiles)
100 unless(exists($hash{$file}))
102 # FIXME: add path, rebasify
112 my @baretags=$db->bare_tags();
113 my $valtags=$db->tags_with_values();
117 print join(', ', sort @baretags), "\n\n";
121 print "TAGS WITH VALUES\n";
122 for my $key (sort keys %$valtags)
124 print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
131 die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
132 " -v|--verbose\t\t\tVerbose\n".
133 " -q|--quiet\t\t\tQuiet (default)\n".
134 " -d|--dir=PATH\t\t\tBase directory of source files (default: ARGV[0])\n".
135 " -f|--database=FILE\t\tPath to database file (default: basedir/.id3fs)\n".
136 " -e|--extensions=EXT1,EXT2\tFile extensions to index (default: mp3, ogg, flac)\n".
137 " -h|--help\t\t\tThis help\n".
138 " --\t\t\t\tEnd of options\n");
145 id3fs-index - Add files to id3fs index
149 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>...]
153 Extracts id3 tags from mp3 files (and comment tags from ogg and flac
154 files) and adds them to a sqlite database, ready for mounting
163 Enable verbose operation.
167 Quiet (no output). This is the default.
169 =item S<B<-d >I<PATH>> | S<B<--dir=>I<PATH>>
171 Specify base directory of source files. All files will be indexed
172 relative to this point.
174 If not specified, defaults to the first non-option argument on the
175 command line. Note that to avoid ambiguities, if more than one
176 directory is specified on the command line, the base directory must
177 be specified explicitly.
179 All files indexed must be under the base directory.
181 =item S<B<-f >I<FILE>> | S<B<--database=>I<FILE>>
183 Database file to use. If not specified, defaults to
184 a hidden file called B<".id3fs"> under the base directory.
186 =item S<B<-e >I<EXT1,EXT2>> | S<B<--extensions=>I<EXT1,EXT2>>
188 File extensions to consider when indexing.
189 Defaults to B<.mp3>, B<.ogg> and B<.flac>.
193 Show a short help message.
203 Index all files in the current directory:
207 Index current directory, printing each subdirectory as it recurses
212 Just index some sub-directories:
214 id3fs-index -d . dir1 dir2
216 Store the database in a custom location:
218 id3fs-index -f ~/.id3fs/index.sqlite .
220 Only index .mp3 and .flac files:
222 id3fs-index -e mp3,flac .
226 Please report any found to ianb@erislabs.net
234 Ian Beckwith <ianb@erislabs.net>
238 The latest version can be found at:
240 B<http://erislabs.net/ianb/projects/id3fs/>
244 Copyright 2010 Ian Beckwith <ianb@erislabs.net>
246 This program is free software: you can redistribute it and/or modify
247 it under the terms of the GNU General Public License as published by
248 the Free Software Foundation; either version 3 of the License, or
249 (at your option) any later version.
251 This program is distributed in the hope that it will be useful,
252 but WITHOUT ANY WARRANTY; without even the implied warranty of
253 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
254 GNU General Public License for more details.
256 You should have received a copy of the GNU General Public License
257 along with this program. If not, see <http://www.gnu.org/licenses/>.