my $help=0;
my $basedir=undef;
my $dbpath=undef;
+my $list=0;
my @extensions=qw(mp3 flac ogg);
Configure(qw(bundling no_ignore_case));
"dir|d=s" => \$basedir,
"database|f=s" => \$dbpath,
"extensions|e=s" => sub { @extensions=split(/\s+|\s*,\s*/, $_[1]); },
+ "list|l" => \$list,
);
usage() if(!@ARGV || !$optret || $help);
}
my $db=ID3FS::DB->new($me, $dbpath, $basedir, $ARGV[0]);
-$db->last_update(time());
-
-while(my $path=shift)
+if($list)
{
- File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
+ list_tags($db);
+}
+else
+{
+ $db->last_update(time());
+
+ while(my $path=shift)
+ {
+ File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path);
+ }
}
sub wanted
}
}
+sub list_tags
+{
+ my($db)=@_;
+ my @baretags=$db->bare_tags();
+ my $valtags=$db->tags_with_values();
+ if(@baretags)
+ {
+ print "BARE TAGS\n";
+ print join(', ', sort @baretags), "\n\n";
+ }
+ if(keys(%$valtags))
+ {
+ print "TAGS WITH VALUES\n";
+ for my $key (sort keys %$valtags)
+ {
+ print "$key: ", join(', ', sort(@{$valtags->{$key}})), "\n";
+ }
+ }
+}
+
sub usage
{
die("Usage: $me [-vqh] [-d basedir] [-f dbpath] [-e mp3,ogg,flac] [--] DIR...\n".
die("DB::filename: unhandled case\n"); #FIXME
}
+sub bare_tags
+{
+ my($self)=@_;
+ my $sql=("SELECT tags.name FROM tags\n" .
+ "LEFT JOIN tags_x_tagvals ON tags.id=tags_x_tagvals.tags_id\n" .
+ "WHERE tags_x_tagvals.tags_id IS NULL\n" .
+ "GROUP BY tags.name\n");
+ my $result=$self->cmd_rows($sql);
+ my @names=map { $_->[0]; } @$result;
+ return (@names);
+}
+
+sub tags_with_values
+{
+ my($self)=@_;
+ my $sql=("SELECT tags.name, tagvals.name FROM tags\n" .
+ "INNER JOIN tags_x_tagvals ON tags.id=tags_x_tagvals.tags_id\n" .
+ "INNER JOIN tagvals ON tagvals.id=tags_x_tagvals.tagvals_id\n" .
+ "GROUP BY tags.name, tagvals.name\n");
+ my $result=$self->cmd_rows($sql);
+ my $tags={};
+ for my $pair (@$result)
+ {
+ push(@{$tags->{$pair->[0]}}, $pair->[1]);
+ }
+ return $tags;
+}
+
sub id
{
my($self, $type, $val)=@_;