diff options
Diffstat (limited to 'lib/VNDB/Handler/VNBrowse.pm')
-rw-r--r-- | lib/VNDB/Handler/VNBrowse.pm | 64 |
1 files changed, 51 insertions, 13 deletions
diff --git a/lib/VNDB/Handler/VNBrowse.pm b/lib/VNDB/Handler/VNBrowse.pm index 1e02337d..d4b5c2d8 100644 --- a/lib/VNDB/Handler/VNBrowse.pm +++ b/lib/VNDB/Handler/VNBrowse.pm @@ -16,13 +16,14 @@ sub list { my($self, $char) = @_; my $f = $self->formValidate( - { name => 's', required => 0, default => 'title', enum => [ qw|title rel pop| ] }, - { name => 'o', required => 0, default => 'a', enum => [ 'a','d' ] }, + { name => 's', required => 0, default => 'tagscore', enum => [ qw|title rel pop tagscore| ] }, + { name => 'o', required => 0, enum => [ 'a','d' ] }, { name => 'p', required => 0, default => 1, template => 'int' }, { name => 'q', required => 0, default => '' }, { name => 'sq', required => 0, default => '' }, { name => 'ln', required => 0, multi => 1, enum => [ keys %{$self->{languages}} ], default => '' }, { name => 'pl', required => 0, multi => 1, enum => [ keys %{$self->{platforms}} ], default => '' }, + { name => 'ti', required => 0, default => '', maxlength => 200 }, ); return 404 if $f->{_err}; $f->{q} ||= $f->{sq}; @@ -37,39 +38,60 @@ sub list { $f->{ln} = $f->{ln}[0] ? [ @{$f->{ln}}, @lang ] : \@lang; } + my @ignored; + my @ti = map { + my $i = $self->dbTagGet(name => $_)->[0]; + push @ignored, [$_, 0] if !$i; + push @ignored, [$_, 1] if $i && $i->{meta}; + $i && !$i->{meta} ? $i->{id} : (); + } grep $_, split /\s*,\s*/, $f->{ti}; + $f->{s} = 'title' if !@ti && $f->{s} eq 'tagscore'; + $f->{o} = $f->{s} eq 'tagscore' ? 'd' : 'a' if !$f->{o}; + my($list, $np) = $self->dbVNGet( $char ne 'all' ? ( char => $char ) : (), $f->{q} ? ( search => $f->{q} ) : (), results => 50, page => $f->{p}, - order => ($f->{s} eq 'rel' ? 'c_released' : $f->{s} eq 'pop' ? 'c_popularity' : 'title').($f->{o} eq 'a' ? ' ASC' : ' DESC'), + order => ($f->{s} eq 'rel' ? 'c_released' : $f->{s} eq 'pop' ? 'c_popularity' : $f->{s}).($f->{o} eq 'a' ? ' ASC' : ' DESC'), $f->{pl}[0] ? ( platform => $f->{pl} ) : (), $f->{ln}[0] ? ( lang => $f->{ln} ) : (), + tags_include => \@ti, ); $self->resRedirect('/v'.$list->[0]{id}, 'temp') if $f->{q} && @$list == 1; $self->htmlHeader(title => 'Browse visual novels', search => $f->{q}); - _filters($self, $f, $char); + _filters($self, $f, $char, \@ignored); + + my $url = "/v/$char?q=$f->{q};ti=$f->{ti}"; + $_ and $url .= ";pl=$_" for @{$f->{pl}}; + $_ and $url .= ";ln=$_" for @{$f->{ln}}; $self->htmlBrowse( class => 'vnbrowse', items => $list, options => $f, nextpage => $np, - pageurl => "/v/$char?o=$f->{o};s=$f->{s};q=$f->{q}", - sorturl => "/v/$char?q=$f->{q}", + pageurl => "$url;o=$f->{o};s=$f->{s}", + sorturl => $url, header => [ - [ 'Title', 'title' ], - [ '', 0 ], - [ '', 0 ], - [ 'Released', 'rel' ], - [ 'Popularity', 'pop' ], + @ti ? [ 'Score', 'tagscore', undef, 'tc_s' ] : (), + [ 'Title', 'title', undef, @ti ? 'tc_t' : 'tc1' ], + [ '', 0, undef, 'tc2' ], + [ '', 0, undef, 'tc3' ], + [ 'Released', 'rel', undef, 'tc4' ], + [ 'Popularity', 'pop', undef, 'tc5' ], ], row => sub { my($s, $n, $l) = @_; Tr $n % 2 ? (class => 'odd') : (); - td class => 'tc1'; + if(@ti) { + td class => 'tc_s'; + tagscore $l->{tagscore}, 0; + end; + } + td class => @ti ? 'tc_t' : 'tc1'; a href => '/v'.$l->{id}, title => $l->{original}||$l->{title}, shorten $l->{title}, 100; end; td class => 'tc2'; @@ -92,7 +114,7 @@ sub list { sub _filters { - my($self, $f, $char) = @_; + my($self, $f, $char, $ign) = @_; form action => '/v/all', 'accept-charset' => 'UTF-8', method => 'get'; div class => 'mainbox'; @@ -103,10 +125,26 @@ sub _filters { a href => "/v/$_", $_ eq $char ? (class => 'optselected') : (), $_ ? uc $_ : '#'; } end; + + if(@$ign) { + div class => 'warning'; + h2 'The following tags were ignored:'; + ul; + li $_->[0].' ('.($_->[1]?"can't filter on meta tags":"no such tag found").')' for @$ign; + end; + end; + } + a id => 'advselect', href => '#'; lit '<i>▸</i> advanced search'; end; div id => 'advoptions', class => 'hidden vnoptions'; + + h2 'Tag filters'; + table class => 'formtable', style => 'margin-left: 0'; + $self->htmlFormPart($f, [ input => short => 'ti', name => 'Tags to include', width => 350 ]); + end; + h2; lit 'Languages <b>(boolean or, selecting more gives more results)</b>'; end; |