summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2015-11-28 02:19:40 +0100
committerYorhel <git@yorhel.nl>2015-11-28 02:19:40 +0100
commitc25b3c20e0f85cc5f085e06ce7f9e7d96101d7ba (patch)
treedf8533dc596fdb5858b3016087e17337eb3f9e0f /lib
parent20511590c1611fbd0679703300eac55a0f8c5026 (diff)
VNPage: Generalize seiyuu listing to character summary listing
The comment already suggested this: I wonder whether it's better to just ask database for character list instead of doing this manual group/sort So yeah, let's just do that.
Diffstat (limited to 'lib')
-rw-r--r--lib/VNDB/DB/VN.pm18
-rw-r--r--lib/VNDB/Handler/VNEdit.pm2
-rw-r--r--lib/VNDB/Handler/VNPage.pm134
3 files changed, 80 insertions, 74 deletions
diff --git a/lib/VNDB/DB/VN.pm b/lib/VNDB/DB/VN.pm
index b7474570..203fdcad 100644
--- a/lib/VNDB/DB/VN.pm
+++ b/lib/VNDB/DB/VN.pm
@@ -7,12 +7,12 @@ use Exporter 'import';
use VNDB::Func 'gtintype', 'normalize_query';
use Encode 'decode_utf8';
-our @EXPORT = qw|dbVNGet dbVNGetRev dbVNRevisionInsert dbVNImageId dbScreenshotAdd dbScreenshotGet dbScreenshotRandom dbVNHasChar dbVNImportSeiyuu|;
+our @EXPORT = qw|dbVNGet dbVNGetRev dbVNRevisionInsert dbVNImageId dbScreenshotAdd dbScreenshotGet dbScreenshotRandom dbVNImportSeiyuu|;
# 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
-# What: extended anime credits relations screenshots relgraph rating ranking wishlist vnlist
+# 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
sub dbVNGet {
@@ -162,7 +162,7 @@ sub dbVNGetRev {
sub _enrich {
my($self, $r, $np, $rev, $what) = @_;
- if(@$r && $what =~ /anime|relations|screenshots|credits/) {
+ if(@$r && $what =~ /anime|relations|screenshots|staff|seiyuu/) {
my($col, $hist, $colname) = $rev ? ('cid', '_hist', 'chid') : ('id', '', 'id');
my %r = map {
$r->[$_]{anime} = [];
@@ -173,7 +173,7 @@ sub _enrich {
($r->[$_]{$col}, $_)
} 0..$#$r;
- if($what =~ /credits/) {
+ if($what =~ /staff/) {
push(@{$r->[$r{ delete $_->{xid} }]{credits}}, $_) for (@{$self->dbAll("
SELECT vs.$colname AS xid, s.id, vs.aid, sa.name, sa.original, s.gender, s.lang, vs.role, vs.note
FROM vn_staff$hist vs
@@ -183,7 +183,9 @@ sub _enrich {
ORDER BY vs.role ASC, sa.name ASC",
[ keys %r ]
)});
+ }
+ if($what =~ /seiyuu/) {
# The seiyuu query needs the VN id to get the VN<->Char spoiler level.
# Obtaining this ID is different when using the hist table.
my($vid, $join) = $rev ? ('h.itemid', 'JOIN changes h ON h.id = vs.chid') : ('vs.id', '');
@@ -336,14 +338,6 @@ sub dbScreenshotRandom {
}
-sub dbVNHasChar {
- my($self, $vid) = @_;
- return $self->dbRow(
- 'SELECT 1 AS exists FROM chars c JOIN chars_vns cv ON c.id = cv.id WHERE cv.vid = ? AND NOT c.hidden', $vid
- )->{exists};
-}
-
-
# returns seiyuus that voice characters referenced by $cids in VNs other than $vid
sub dbVNImportSeiyuu {
my($self, $vid, $cids) = @_;
diff --git a/lib/VNDB/Handler/VNEdit.pm b/lib/VNDB/Handler/VNEdit.pm
index 2d67a3df..220da8af 100644
--- a/lib/VNDB/Handler/VNEdit.pm
+++ b/lib/VNDB/Handler/VNEdit.pm
@@ -77,7 +77,7 @@ sub addform {
sub edit {
my($self, $vid, $rev, $nosubmit) = @_;
- my $v = $vid && $self->dbVNGetRev(id => $vid, what => 'extended screenshots relations anime credits changes', $rev ? (rev => $rev) : ())->[0];
+ my $v = $vid && $self->dbVNGetRev(id => $vid, what => 'extended screenshots relations anime staff seiyuu changes', $rev ? (rev => $rev) : ())->[0];
return $self->resNotFound if $vid && !$v->{id};
$rev = undef if !$vid || $v->{lastrev};
diff --git a/lib/VNDB/Handler/VNPage.pm b/lib/VNDB/Handler/VNPage.pm
index 54fd9c23..7a554c35 100644
--- a/lib/VNDB/Handler/VNPage.pm
+++ b/lib/VNDB/Handler/VNPage.pm
@@ -336,7 +336,7 @@ sub page {
my $method = $rev ? 'dbVNGetRev' : 'dbVNGet';
my $v = $self->$method(
id => $vid,
- what => 'extended anime relations screenshots rating ranking credits',
+ what => 'extended anime relations screenshots rating ranking staff'.($rev ? ' seiyuu' : ''),
$rev ? (rev => $rev) : (),
)->[0];
return $self->resNotFound if !$v->{id};
@@ -464,11 +464,11 @@ sub page {
}
end 'div'; # /mainbox
- my $haschar = $self->dbVNHasChar($v->{id});
- if($haschar || $self->authCan('edit')) {
+ my $chars = $self->dbCharGet(vid => $v->{id}, what => "seiyuu vns($v->{id})".($char ? ' extended traits' : ''), results => 100);
+ if(@$chars || $self->authCan('edit')) {
clearfloat; # fix tabs placement when tags are hidden
ul class => 'maintabs notfirst';
- if($haschar) {
+ if(@$chars) {
li class => 'left '.(!$char ? ' tabselected' : ''); a href => "/v$v->{id}#main", name => 'main', mt '_vnpage_tab_main'; end;
li class => 'left '.($char ? ' tabselected' : ''); a href => "/v$v->{id}/chars#chars", name => 'chars', mt '_vnpage_tab_chars'; end;
}
@@ -480,10 +480,11 @@ sub page {
}
if($char) {
- _chars($self, $haschar, $v);
+ _chars($self, $chars, $v);
} else {
_releases($self, $v, $r);
_staff($self, $v);
+ _charsum($self, $chars, $v);
_stats($self, $v);
_screenshots($self, $v, $r) if @{$v->{screenshots}};
}
@@ -497,7 +498,7 @@ sub _revision {
return if !$rev;
my $prev = $rev && $rev > 1 && $self->dbVNGetRev(
- id => $v->{id}, rev => $rev-1, what => 'extended anime relations screenshots credits'
+ id => $v->{id}, rev => $rev-1, what => 'extended anime relations screenshots staff seiyuu'
)->[0];
$self->htmlRevision('v', $prev, $v,
@@ -873,10 +874,18 @@ sub _stats {
}
+sub _charspoillvl {
+ my($vid, $c) = @_;
+ my $minspoil = 5;
+ $minspoil = $_->{vid} == $vid && $_->{spoil} < $minspoil ? $_->{spoil} : $minspoil
+ for(@{$c->{vns}});
+ return $minspoil;
+}
+
+
sub _chars {
- my($self, $has, $v) = @_;
- my $l = $has && $self->dbCharGet(vid => $v->{id}, what => "extended vns($v->{id}) seiyuu traits", results => 100);
- return if !$has;
+ my($self, $l, $v) = @_;
+ return if !@$l;
my %done;
my %rol;
for my $r (@{$self->{char_roles}}) {
@@ -888,72 +897,75 @@ sub _chars {
div class => 'mainbox';
$self->charOps(1) if !$first++;
h1 mt "_charrole_$r", scalar @{$rol{$r}};
- for my $c (@{$rol{$r}}) {
- my $minspoil = 5;
- $minspoil = $_->{vid} == $v->{id} && $_->{spoil} < $minspoil ? $_->{spoil} : $minspoil
- for(@{$c->{vns}});
- $self->charTable($c, 1, $c != $rol{$r}[0], 1, $minspoil);
- }
+ $self->charTable($_, 1, $_ != $rol{$r}[0], 1, _charspoillvl $v->{id}, $_) for (@{$rol{$r}});
end;
}
}
-sub _staff {
- my ($self, $v) = @_;
- if(@{$v->{credits}}) {
- div class => 'mainbox staff', id => 'staff';
- h1 mt '_vnpage_staff';
- for my $r (@{$self->{staff_roles}}) {
- my @s = grep $_->{role} eq $r, @{$v->{credits}};
- next if !@s;
- ul;
- li; b mt '_credit_'.$r; end;
- for(@s) {
- li;
- a href => "/s$_->{id}", title => $_->{original}||$_->{name}, $_->{name};
- b class => 'grayedout', $_->{note} if $_->{note};
- end;
- }
- end;
- }
- clearfloat;
- end;
- }
- if(@{$v->{seiyuu}}) {
- my($has_spoilers, %cast);
- # %cast hash serves only one purpose: in the rare case of several voice
- # actors voicing single character it groups them all together.
- for(@{$v->{seiyuu}}) {
- $has_spoilers ||= $_->{spoil};
- push @{$cast{$_->{cid}}}, $_;
+sub _charsum {
+ my($self, $l, $v) = @_;
+ return if !@$l;
+
+ my(@l, %done, $has_spoilers);
+ for my $r (@{$self->{char_roles}}) {
+ last if $r eq 'appears';
+ for (grep grep($_->{role} eq $r, @{$_->{vns}}) && !$done{$_->{id}}++, @$l) {
+ $_->{role} = $r;
+ $has_spoilers = $has_spoilers || _charspoillvl $v->{id}, $_;
+ push @l, $_;
}
- div class => 'mainbox staff cast';
- $self->charOps(0) if $has_spoilers;
- h1 mt '_vnpage_cast';
- div class => 'cast_list';
- # i wonder whether it's better to just ask database for character list instead
- # of doing this manual group/sort
- for my $cid (sort { $cast{$a}[0]{cname} cmp $cast{$b}[0]{cname} } keys %cast) {
- my $s = $cast{$cid};
- div class => 'char_bubble'.($has_spoilers ? ' '.charspoil($s->[0]{spoil}) : '');
- div class => 'name';
- a href => "/c$cid", $s->[0]{cname};
- end;
+ }
+
+ div class => 'mainbox charsum';
+ $self->charOps(0) if $has_spoilers;
+ h1 mt '_vnpage_charsum';
+ div class => 'charsum_list';
+ for my $c (@l) {
+ div class => 'charsum_bubble'.($has_spoilers ? ' '.charspoil(_charspoillvl $v->{id}, $c) : '');
+ div class => 'name';
+ i mt '_charrole_'.$c->{role}, 1;
+ a href => "/c$c->{id}", title => $c->{original}||$c->{name}, $c->{name};
+ end;
+ if(@{$c->{seiyuu}}) {
div class => 'actor';
txt mt '_charp_voice';
- @{$s} > 1 ? br : txt ' ';
- for(@{$s}) {
- a href => "/s$_->{id}", title => $_->{original}||$_->{name}, $_->{name};
- b class => 'grayedout', $_->{note} if $_->{note};
+ @{$c->{seiyuu}} > 1 ? br : txt ' ';
+ for my $s (sort { $a->{name} cmp $b->{name} } @{$c->{seiyuu}}) {
+ a href => "/s$s->{sid}", title => $s->{original}||$s->{name}, $s->{name};
+ b class => 'grayedout', $s->{note} if $s->{note};
br;
}
end;
+ }
+ end;
+ }
+ end;
+ end;
+}
+
+
+sub _staff {
+ my ($self, $v) = @_;
+ return if !@{$v->{credits}};
+
+ div class => 'mainbox staff', id => 'staff';
+ h1 mt '_vnpage_staff';
+ for my $r (@{$self->{staff_roles}}) {
+ my @s = grep $_->{role} eq $r, @{$v->{credits}};
+ next if !@s;
+ ul;
+ li; b mt '_credit_'.$r; end;
+ for(@s) {
+ li;
+ a href => "/s$_->{id}", title => $_->{original}||$_->{name}, $_->{name};
+ b class => 'grayedout', $_->{note} if $_->{note};
end;
}
end;
- end;
- }
+ }
+ clearfloat;
+ end;
}