From 80f807f3e6511efb27fb150dda47b98a9de0bea4 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Wed, 30 Dec 2015 16:19:25 +0100 Subject: Add release filters to VN browser --- lib/VNDB/DB/Releases.pm | 39 ++++++++++++++++++++++++--------------- lib/VNDB/DB/VN.pm | 10 +++++++++- 2 files changed, 33 insertions(+), 16 deletions(-) (limited to 'lib/VNDB/DB') diff --git a/lib/VNDB/DB/Releases.pm b/lib/VNDB/DB/Releases.pm index eafb84c0..ecec63aa 100644 --- a/lib/VNDB/DB/Releases.pm +++ b/lib/VNDB/DB/Releases.pm @@ -7,26 +7,15 @@ use POSIX 'strftime'; use Exporter 'import'; use VNDB::Func 'gtintype'; -our @EXPORT = qw|dbReleaseGet dbReleaseGetRev dbReleaseRevisionInsert|; +our @EXPORT = qw|dbReleaseFilters dbReleaseGet dbReleaseGetRev dbReleaseRevisionInsert|; -# Options: id vid pid released page results what med sort reverse date_before date_after -# plat lang olang type minage search resolution freeware doujin voiced ani_story ani_ero -# What: extended vn producers platforms media affiliates -# Sort: title released minage -sub dbReleaseGet { +# Release filters shared by dbReleaseGet and dbVNGet +sub dbReleaseFilters { my($self, %o) = @_; - $o{results} ||= 50; - $o{page} ||= 1; - $o{what} ||= ''; $o{plat} = [ $o{plat} ] if $o{plat} && !ref $o{plat}; $o{med} = [ $o{med} ] if $o{med} && !ref $o{med}; - - my @where = ( - !$o{id} ? ( 'r.hidden = FALSE' => 0 ) : (), - $o{id} ? ( 'r.id = ?' => $o{id} ) : (), - $o{vid} ? ( 'rv.vid IN(!l)' => [ ref $o{vid} ? $o{vid} : [$o{vid}] ] ) : (), - $o{pid} ? ( 'rp.pid = ?' => $o{pid} ) : (), + return ( defined $o{patch} ? ( 'r.patch = ?' => $o{patch} == 1 ? 1 : 0) : (), defined $o{freeware} ? ( 'r.freeware = ?' => $o{freeware} == 1 ? 1 : 0) : (), defined $o{doujin} ? ( 'r.doujin = ?' => $o{doujin} == 1 ? 1 : 0) : (), @@ -52,6 +41,26 @@ sub dbReleaseGet { grep(!/^unk$/, @{$o{med}}) ? 'r.id IN(SELECT irm.id FROM releases_media irm WHERE irm.medium IN(!l))' : () ).')', [ [ grep(!/^unk$/, @{$o{med}}) ] ]) : (), ); +} + + +# Options: id vid pid released page results what med sort reverse date_before date_after +# plat lang olang type minage search resolution freeware doujin voiced ani_story ani_ero +# What: extended vn producers platforms media affiliates +# Sort: title released minage +sub dbReleaseGet { + my($self, %o) = @_; + $o{results} ||= 50; + $o{page} ||= 1; + $o{what} ||= ''; + + my @where = ( + !$o{id} ? ( 'r.hidden = FALSE' => 0 ) : (), + $o{id} ? ( 'r.id = ?' => $o{id} ) : (), + $o{vid} ? ( 'rv.vid IN(!l)' => [ ref $o{vid} ? $o{vid} : [$o{vid}] ] ) : (), + $o{pid} ? ( 'rp.pid = ?' => $o{pid} ) : (), + $self->dbReleaseFilters(%o), + ); if($o{search}) { for (split /[ -,._]/, $o{search}) { diff --git a/lib/VNDB/DB/VN.pm b/lib/VNDB/DB/VN.pm index 203fdcad..91ad7ccb 100644 --- a/lib/VNDB/DB/VN.pm +++ b/lib/VNDB/DB/VN.pm @@ -3,6 +3,7 @@ package VNDB::DB::VN; use strict; use warnings; +use TUWF 'sqlprint'; use Exporter 'import'; use VNDB::Func 'gtintype', 'normalize_query'; use Encode 'decode_utf8'; @@ -11,7 +12,7 @@ our @EXPORT = qw|dbVNGet dbVNGetRev dbVNRevisionInsert dbVNImageId dbScreenshotA # Options: id, char, search, length, lang, olang, plat, tag_inc, tag_exc, tagspoil, -# hasani, hasshot, ul_notblack, ul_onwish, results, page, what, sort, reverse, inc_hidden +# hasani, hasshot, ul_notblack, ul_onwish, results, page, what, sort, reverse, inc_hidden, release # What: extended anime staff seiyuu relations screenshots relgraph rating ranking wishlist vnlist # Note: wishlist and vnlist are ignored (no db search) unless a user is logged in # Sort: id rel pop rating title tagscore rand @@ -71,6 +72,13 @@ sub dbVNGet { 'v.id IN(SELECT floor(random() * last_value)::integer FROM generate_series(1,20), (SELECT MAX(id) AS last_value FROM vn) s1 LIMIT 20)' ) : (), ); + if($o{release}) { + my($q, @p) = sqlprint + 'v.id IN(SELECT rv.vid FROM releases r JOIN releases_vn rv ON rv.id = r.id !W)', + [ 'NOT r.hidden' => 1, $self->dbReleaseFilters(%{$o{release}}), ]; + push @where, $q, \@p; + } + my @join = ( $o{what} =~ /relgraph/ ? 'JOIN relgraphs vg ON vg.id = v.rgraph' : (), -- cgit v1.2.3