X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FID3FS%2FPath.pm;h=25e4092b59e6306ebea4b41508dff77e7ea11ec9;hb=eb98d37f4a2ff614889f70f0dfa639ac8600a920;hp=6665122e94da2009b857d655730783b6883db006;hpb=da358c7f7a23904348862f21e2192de5539cfb30;p=id3fs.git diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index 6665122..25e4092 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -23,7 +23,7 @@ sub new $self->{db}=shift; $self->{path}=shift; $self->parse(); - print "STATE: ", $self->state(), "\n"; +# print "STATE: ", $self->state(), "\n"; return $self; } @@ -53,10 +53,10 @@ sub isvalid sub dest { - my($self)=@_; + my($self, $mountpoint)=@_; if($self->state() == $STATE_FILE) { - return $self->{db}->filename(@{$self->{elements}}); + return $self->{db}->filename($mountpoint, @{$self->{elements}}); } return "ERROR"; #should never happen? } @@ -66,7 +66,7 @@ sub dirents my($self)=@_; my @dents=(); my $state=$self->state(); - print "DIRENTS: STATE: $state\n"; +# print "DIRENTS: STATE: $state\n"; if($state==$STATE_TAG || $state==$STATE_TAGVAL) { my $tag=$self->{elements}->[$#{$self->{elements}}]; @@ -75,27 +75,32 @@ sub dirents ref($tag) eq "ID3FS::PathElement::Tag" && $self->{db}->tag_has_values($tag->{id})) { - print "DIRENTS: TAG: TAGVALUES\n"; @dents=$self->{db}->tag_values($tag->{id}); } else { - print "DIRENTS: TAG/TAGVAL($state): ARTISTS\n"; - @dents=(qw(AND ALLTRACKS), # FIXME: NOT and OR + @dents=(qw(AND OR TRACKS NOARTIST), $self->{db}->artists(@{$self->{elements}})); } } elsif($state==$STATE_BOOLEAN) { - @dents=$self->{db}->tags(@{$self->{elements}}); + my $parent=$self->{elements}->[$#{$self->{elements}}]; + unless(defined($parent) && + ref($parent) eq "ID3FS::PathElement::Boolean" && + $parent->{name} eq "NOT") + { + push(@dents, "NOT"); + } + push(@dents, $self->{db}->tags(@{$self->{elements}})); } elsif($state==$STATE_ROOT) { - @dents=("ALL", $self->{db}->tags(@{$self->{elements}})); + @dents=(qw(ALL NOT), $self->{db}->tags(@{$self->{elements}})); } elsif($state==$STATE_ALBUMS) { - @dents=("TRACKS", $self->{db}->albums(@{$self->{elements}})); + @dents=(qw(TRACKS NOALBUM),$self->{db}->albums(@{$self->{elements}})); } elsif($state==$STATE_TRACKLIST) { @@ -113,8 +118,7 @@ sub parse my($self)=@_; @{$self->{components}}=split(/\//, $self->{path}); shift @{$self->{components}}; # drop empty field before leading / - print "PATH: $self->{path}\n"; -# print "COMPONENTS: ", join(' | ', @{$self->{components}}), "\n"; +# print "PATH: $self->{path}\n"; $self->state($STATE_ROOT); return if($self->{path} eq "/"); my @parts=@{$self->{components}}; @@ -122,20 +126,25 @@ sub parse $self->{elements}=[]; while(my $name=shift @parts) { - print "NAME: $name\n"; +# print "NAME: $name\n"; my $state=$self->state(); if($state==$STATE_INVALID) { - print "SM: INVALID: $name\n"; +# print "SM: INVALID: $name\n"; return; } elsif($state==$STATE_ROOT) { - print "SM: ROOT: $name\n"; +# print "SM: ROOT: $name\n"; if($name eq "ALL") { $self->state($STATE_TAG); } + elsif($name eq "NOT") + { + push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); + $self->state($STATE_BOOLEAN); + } else { $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); @@ -152,7 +161,7 @@ sub parse } elsif($state==$STATE_TAG || $state==$STATE_TAGVAL) { - print "SM: TAG/TAGVAL($state): $name\n"; +# print "SM: TAG/TAGVAL($state): $name\n"; my $tag=$self->{elements}->[$#{$self->{elements}}]; if($state==$STATE_TAG && defined($tag) && @@ -171,24 +180,23 @@ sub parse $self->state($STATE_INVALID); } } - elsif($name eq "ALLTRACKS") + elsif($name eq "TRACKS") + { + $self->state($STATE_TRACKLIST); + } + elsif($name eq "NOARTIST") { $self->state($STATE_TRACKLIST); } elsif($name eq "AND") { $self->state($STATE_BOOLEAN); -# push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); + push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); } elsif($name eq "OR") { $self->state($STATE_BOOLEAN); -# push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); - } - elsif($name eq "NOT") - { - $self->state($STATE_TAG); -# push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); + push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); } else { @@ -206,25 +214,45 @@ sub parse } elsif($state==$STATE_BOOLEAN) { - print "SM: BOOLEAN: $name\n"; - my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); - if($tag) +# print "SM: BOOLEAN: $name\n"; + my $parent=$self->{elements}->[$#{$self->{elements}}]; + my $allownot=1; + if(defined($parent) && + ref($parent) eq "ID3FS::PathElement::Boolean" && + $parent->{name} eq "NOT") { - push(@{$self->{elements}}, $tag); - $self->state($STATE_TAG); - } + $allownot=0; + } + if($allownot && $name eq "NOT") + { + $self->state($STATE_BOOLEAN); + push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); + } else { - $self->state($STATE_INVALID); + my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); + if($tag) + { + push(@{$self->{elements}}, $tag); + $self->state($STATE_TAG); + } + else + { + $self->state($STATE_INVALID); + } } } elsif($state==$STATE_ALBUMS) { - print "SM: ALBUM: $name\n"; +# print "SM: ALBUM: $name\n"; if($name eq "TRACKS") { $self->state($STATE_TRACKLIST); } + elsif($name eq "NOALBUM") + { + $self->state($STATE_TRACKLIST); + } else { my $album=ID3FS::PathElement::Album->new($self->{db}, $name); @@ -241,9 +269,8 @@ sub parse } elsif($state==$STATE_TRACKLIST) { - print "SM: TRACKLIST: $name\n"; +# print "SM: TRACKLIST: $name\n"; my $track=ID3FS::PathElement::File->new($self->{db}, $name); - push(@{$self->{elements}}, $track); if($track) { push(@{$self->{elements}}, $track); @@ -256,7 +283,7 @@ sub parse } elsif($state==$STATE_FILE) { - print "SM: FILE: $name\n"; +# print "SM: FILE: $name\n"; # Can't have anything after a filename $self->state($STATE_INVALID); }