+
+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 "FILTER (",$self->state(), "): $base / $dir\n";
+ if($self->empty("$base/$dir", $maxdepth))
+ {
+# print "empty: $base / $dir\n";
+ }
+ else
+ {
+# print "accepting: $base / $dir\n";
+ push(@outdirs, $dir);
+ }
+ }
+ return(@outdirs);
+}
+
+sub empty
+{
+ my($self, $dir, $maxdepth)=@_;
+ return 1 unless($maxdepth);
+# print "testing($maxdepth): $dir\n";
+ my $path=ID3FS::Path->new($self->{db}, $dir);
+# print "PATH INVALID\n" unless($path->isvalid());
+ 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 1;
+}
+
+sub tagname_has_values
+{
+ my($self, $name)=@_;
+ my $id=$self->{db}->lookup_id("tags", $name);
+ return 0 unless($id);
+ return $self->{db}->tag_has_values($id);
+
+}
+
+sub dir_is_special
+{
+ my($self, $dir)=@_;
+ if((grep { $_ eq $dir; }
+ qw(AND OR NOT), $PATH_ALLTRACKS, $PATH_NOARTIST, $PATH_NOALBUM) ||
+ ($self->tagname_has_values($dir)))
+ {
+ return 1;
+ }
+ return 0;
+}
+