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];
18 my @extensions=qw(mp3 flac ogg);
21 Configure(qw(bundling no_ignore_case));
22 my $optret=GetOptions(
23 "verbose|v" => \$verbose,
24 "quiet|q" => sub { $verbose=0; },
26 "dir|d=s" => \$basedir,
27 "database|f=s" => \$dbpath,
28 "extensions|e=s" => sub { @extensions=split(/\s+|\s*,\s*/, $_[1]); },
32 usage() if(!@ARGV || !$optret || $help);
34 if(@ARGV > 1 && !defined($basedir))
36 die("$me: --basedir must be specified if multiple paths are supplied\n");
39 my $db=ID3FS::DB->new($me, $dbpath, $basedir, $ARGV[0]);
46 $db->last_update(time());
48 my $directories_pruned=$db->prune_directories();
51 File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
53 if($files_pruned || $directories_pruned)
55 print "Removing data from pruned files\n" if $verbose;
63 if(/.*\.(.*)/) { $ext=lc($1); }
66 print("$_\n") if $verbose;
69 elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions)))
80 return unless(opendir(DIR, $dir));
81 print "Pruning $dir\n";
82 my @oldfiles=$db->files_in($dir);
83 my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
85 @oldfiles=sort @oldfiles;
86 @newfiles=sort @newfiles;
89 for my $file (@oldfiles)
91 unless(exists($hash{$file}))
93 # FIXME: add path, rebasify
106 my @baretags=$db->bare_tags();
107 my $valtags=$db->tags_with_values();
111 print join(', ', sort @baretags), "\n\n";
115 print "TAGS WITH VALUES\n";
116 for my $key (sort keys %$valtags)
118 print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
125 die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
126 " -v|--verbose\t\t\tVerbose\n".
127 " -q|--quiet\t\t\tQuiet (default)\n".
128 " -d|--dir=PATH\t\t\tBase directory of source files (default: ARGV[0])\n".
129 " -f|--database=FILE\t\tPath to database file (default: basedir/.id3fs)\n".
130 " -e|--extensions=EXT1,EXT2\tFile extensions to index (default: mp3, ogg, flac)\n".
131 " -h|--help\t\t\tThis help\n".
132 " --\t\t\t\tEnd of options\n");
139 id3fs-index - Add files to id3fs index
143 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>...]
147 Extracts id3 tags from mp3 files (and comment tags from ogg and flac
148 files) and adds them to a sqlite database, ready for mounting
157 Enable verbose operation.
161 Quiet (no output). This is the default.
163 =item S<B<-d >I<PATH>> | S<B<--dir=>I<PATH>>
165 Specify base directory of source files. All files will be indexed
166 relative to this point.
168 If not specified, defaults to the first non-option argument on the
169 command line. Note that to avoid ambiguities, if more than one
170 directory is specified on the command line, the base directory must
171 be specified explicitly.
173 All files indexed must be under the base directory.
175 =item S<B<-f >I<FILE>> | S<B<--database=>I<FILE>>
177 Database file to use. If not specified, defaults to
178 a hidden file called B<".id3fs"> under the base directory.
180 =item S<B<-e >I<EXT1,EXT2>> | S<B<--extensions=>I<EXT1,EXT2>>
182 File extensions to consider when indexing.
183 Defaults to B<.mp3>, B<.ogg> and B<.flac>.
187 Show a short help message.
197 Index all files in the current directory:
201 Index current directory, printing each subdirectory as it recurses
206 Just index some sub-directories:
208 id3fs-index -d . dir1 dir2
210 Store the database in a custom location:
212 id3fs-index -f ~/.id3fs/index.sqlite .
214 Only index .mp3 and .flac files:
216 id3fs-index -e mp3,flac .
220 Please report any found to ianb@erislabs.net
228 Ian Beckwith <ianb@erislabs.net>
232 The latest version can be found at:
234 B<http://erislabs.net/ianb/projects/id3fs/>
238 Copyright 2010 Ian Beckwith <ianb@erislabs.net>
240 This program is free software: you can redistribute it and/or modify
241 it under the terms of the GNU General Public License as published by
242 the Free Software Foundation; either version 3 of the License, or
243 (at your option) any later version.
245 This program is distributed in the hope that it will be useful,
246 but WITHOUT ANY WARRANTY; without even the implied warranty of
247 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
248 GNU General Public License for more details.
250 You should have received a copy of the GNU General Public License
251 along with this program. If not, see <http://www.gnu.org/licenses/>.