filter out empty TRACKS, NOARTIST, NOALBUM
authorIan Beckwith <ianb@erislabs.net>
Mon, 18 Oct 2010 00:27:04 +0000 (01:27 +0100)
committerIan Beckwith <ianb@erislabs.net>
Mon, 18 Oct 2010 00:27:04 +0000 (01:27 +0100)
lib/ID3FS/Path.pm

index cd8b5ac..cc0c041 100644 (file)
@@ -101,7 +101,8 @@ sub dirents
            {
                @dents=qw(AND OR);
            }
-           push(@dents, $PATH_ALLTRACKS, $PATH_NOARTIST, $self->artists());
+           push(@dents, $self->filter($PATH_ALLTRACKS, $PATH_NOARTIST));
+           push(@dents, $self->artists());
        }
     }
     elsif($state==$STATE_BOOLEAN)
@@ -121,7 +122,7 @@ sub dirents
     }
     elsif($state==$STATE_ALBUMS)
     {
-       @dents=($PATH_ALLTRACKS, $PATH_NOALBUM, $self->albums());
+       @dents=($self->filter($PATH_ALLTRACKS, $PATH_NOALBUM), $self->albums());
     }
     elsif($state==$STATE_TRACKLIST)
     {
@@ -844,24 +845,24 @@ sub constraints_tag_list
     return(\@tags, \@tags_vals, $lasttag);
 }
 
-# Not used, slows things down too much
+# we just filter $ALLTRACKS, $NOARTIST and $NOALBUM
+# filtering tags properly requires up to four levels of recursion
+# (tag/tagval/AND/NOT) and is too slow
 sub filter
 {
     my($self, @dirs)=@_;
     my $base=$self->{path};
     my @outdirs=();
-    # depth 4 to allow for tag/tagval/AND/NOT
-    my $maxdepth=4;
     for my $dir (@dirs)
     {
-#      print "\nFILTER (",$self->state(), "): $base / $dir\n";
-       if($self->empty("$base/$dir", $maxdepth))
+       print "\nFILTER (",$self->state(), "): $base / $dir\n";
+       if($self->empty("$base/$dir"))
        {
-#          print "empty: $base / $dir\n";
+           print "empty: $base / $dir\n";
        }
        else
        {
-#          print "non-empty, accepting: $base / $dir\n";
+           print "non-empty, accepting: $base / $dir\n";
            push(@outdirs, $dir);
        }
     }
@@ -870,51 +871,13 @@ sub filter
 
 sub empty
 {
-    my($self, $dir, $maxdepth)=@_;
-    return 0 unless($maxdepth);
-#    print "testing($maxdepth): $dir\n";
-    my $path=ID3FS::Path->new($self->{db}, $dir, $self->{verbose}, $self->{tagdepth});
-#    print "PATH INVALID\n" unless($path->isvalid());
+    my($self, $dir)=@_;
+    my $path=ID3FS::Path->new($self->{db}, $dir, $self->{verbose},
+                             ($self->{maxtagdepth} - $self->{curtagdepth}));
     return 1 unless($path->isvalid());
     my($subdirs,$subfiles)=$path->dirents();
-#    print "SUBDENTS: ", join(", ", @$subdirs, @$subfiles), "\n";
-#    print("SUBFILES: ", join(', ', @$subfiles), "\n") if(@$subfiles);
-    return 0 if(@$subfiles);
-    for my $subdir (@$subdirs)
-    {
-#      print "SUBSUB $dir/$subdir\n";
-       if(1) #$self->dir_is_special($subdir))
-       {
-           if($self->empty("$dir/$subdir", ($maxdepth-1)))
-           {
-#              print "EMPTY: $dir / $subdir\n";
-           }
-           else
-           {
-#              print "NONEMPTY: $dir / $subdir\n";
-               return 0;
-           }
-       }
-       else
-       {
-           return 0;
-       }
-#      return 0 if($self->nonempty("$dir/$subdir", ($maxdepth-1)));
-    }
+    return 0 if(@$subfiles || @$subdirs);
     return 1;
 }
 
-sub dir_is_special
-{
-    my($self, $dir)=@_;
-    my $id=$self->{db}->lookup_id("tags", $dir);
-    if((grep { $_ eq $dir; } (qw(AND OR NOT), $PATH_ALLTRACKS,
-                             $PATH_NOARTIST, $PATH_NOALBUM)) ||
-       ($id && $self->{db}->tag_has_values($id)))
-    {
-       return 1;
-    }
-    return 0;
-}
-
 1;