implement id3fs-index -l
authorIan Beckwith <ianb@erislabs.net>
Sun, 26 Sep 2010 23:18:06 +0000 (00:18 +0100)
committerIan Beckwith <ianb@erislabs.net>
Sun, 26 Sep 2010 23:18:06 +0000 (00:18 +0100)
bin/id3fs-index
lib/ID3FS/DB.pm

index 8fa80b3..89f6f12 100755 (executable)
@@ -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".
index 8794ca1..dd467c7 100644 (file)
@@ -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)=@_;