From: Ian Beckwith Date: Sun, 26 Sep 2010 23:18:06 +0000 (+0100) Subject: implement id3fs-index -l X-Git-Tag: debian/1.0-1~155 X-Git-Url: http://erislabs.net/gitweb/?p=id3fs.git;a=commitdiff_plain;h=2810a098210c12971b57489131bf7e759473ca27 implement id3fs-index -l --- diff --git a/bin/id3fs-index b/bin/id3fs-index index 8fa80b3..89f6f12 100755 --- a/bin/id3fs-index +++ b/bin/id3fs-index @@ -14,6 +14,7 @@ my $verbose=0; my $help=0; my $basedir=undef; my $dbpath=undef; +my $list=0; my @extensions=qw(mp3 flac ogg); Configure(qw(bundling no_ignore_case)); @@ -24,6 +25,7 @@ my $optret=GetOptions( "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); @@ -34,11 +36,18 @@ if(@ARGV > 1 && !defined($basedir)) } 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 @@ -56,6 +65,26 @@ 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". diff --git a/lib/ID3FS/DB.pm b/lib/ID3FS/DB.pm index 8794ca1..dd467c7 100644 --- a/lib/ID3FS/DB.pm +++ b/lib/ID3FS/DB.pm @@ -359,6 +359,34 @@ sub filename 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)=@_;