From 1a663a52a35f7bf627d9b8af968a6f1d2f7fc217 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Mon, 18 Oct 2010 01:27:04 +0100 Subject: [PATCH] filter out empty TRACKS, NOARTIST, NOALBUM --- lib/ID3FS/Path.pm | 65 ++++++++++++------------------------------------------- 1 file changed, 14 insertions(+), 51 deletions(-) diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index cd8b5ac..cc0c041 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -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; -- 2.11.0