summaryrefslogtreecommitdiff
path: root/lib/Multi/API.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Multi/API.pm')
-rw-r--r--lib/Multi/API.pm84
1 files changed, 60 insertions, 24 deletions
diff --git a/lib/Multi/API.pm b/lib/Multi/API.pm
index f734da7c..8f99915b 100644
--- a/lib/Multi/API.pm
+++ b/lib/Multi/API.pm
@@ -303,9 +303,9 @@ sub login_res { # num, res, [ c, arg ]
sub get_vn {
my($c, $info, $filters) = @_[ARG0..$#_];
- return cerr $c, getinfo => "Unkown info flag '$_'", flag => $_ for (grep !/^(basic|details)$/, @$info);
+ return cerr $c, getinfo => "Unkown info flag '$_'", flag => $_ for (grep !/^(basic|details|anime)$/, @$info);
- my $select = 'v.id';
+ my $select = 'v.id, v.latest';
$select .= ', vr.title, vr.original, v.c_released, v.c_languages, v.c_platforms' if grep /basic/, @$info;
$select .= ', vr.alias AS aliases, vr.length, vr.desc AS description, vr.l_wp, vr.l_encubed, vr.l_renai' if grep /details/, @$info;
@@ -345,36 +345,72 @@ sub get_vn {
$_[KERNEL]->post(pg => query =>
qq|SELECT $select FROM vn v JOIN vn_rev vr ON v.latest = vr.id WHERE NOT v.hidden AND $where LIMIT 10|,
- \@placeholders, 'get_vn_res', [ $c, $info, $filters ]);
+ \@placeholders, 'get_vn_res', { c => $c, info => $info, filters => $filters });
}
sub get_vn_res {
- my($num, $res, $c, $info, $filters, $time) = (@_[ARG0, ARG1], @{$_[ARG2]}, $_[ARG3]);
-
- for (@$res) {
- $_->{id}*=1;
- if(grep /basic/, @$info) {
- $_->{original} ||= undef;
- $_->{platforms} = [ split /\//, delete $_->{c_platforms} ];
- $_->{languages} = [ split /\//, delete $_->{c_languages} ];
- $_->{released} = formatdate delete $_->{c_released};
+ my($num, $res, $get, $time) = (@_[ARG0..$#_]);
+
+ $get->{time} += $time;
+ $get->{queries}++;
+
+ # process the results
+ if(!$get->{type}) {
+ for (@$res) {
+ $_->{id}*=1;
+ if(grep /basic/, @{$get->{info}}) {
+ $_->{original} ||= undef;
+ $_->{platforms} = [ split /\//, delete $_->{c_platforms} ];
+ $_->{languages} = [ split /\//, delete $_->{c_languages} ];
+ $_->{released} = formatdate delete $_->{c_released};
+ }
+ if(grep /details/, @{$get->{info}}) {
+ $_->{aliases} ||= undef;
+ $_->{length} *= 1;
+ $_->{length} ||= undef;
+ $_->{description} ||= undef;
+ $_->{links} = {
+ wikipedia => delete($_->{l_wp}) ||undef,
+ encubed => delete($_->{l_encubed})||undef,
+ renai => delete($_->{l_renai}) ||undef
+ };
+ }
}
- if(grep /details/, @$info) {
- $_->{aliases} ||= undef;
- $_->{length} *= 1;
- $_->{length} ||= undef;
- $_->{description} ||= undef;
- $_->{links} = {
- wikipedia => delete($_->{l_wp}) ||undef,
- encubed => delete($_->{l_encubed})||undef,
- renai => delete($_->{l_renai}) ||undef
- };
+ $get->{list} = $res;
+ }
+
+ elsif($get->{type} eq 'anime') {
+ # link
+ for my $i (@{$get->{list}}) {
+ $i->{anime} = [ grep $i->{latest} == $_->{vid}, @$res ];
+ }
+ # cleanup
+ for (@$res) {
+ $_->{id} *= 1;
+ $_->{year} *= 1 if defined $_->{year};
+ $_->{ann_id} *= 1 if defined $_->{ann_id};
+ delete $_->{vid};
}
+ $get->{anime} = 1;
+ }
+
+ # fetch more results
+ if(!$get->{anime} && grep /anime/, @{$get->{info}}) {
+ my @ids = map $_->{latest}, @{$get->{list}};
+ my $ids = join ',', map '?', @ids;
+ return $_[KERNEL]->post(pg => query => qq|
+ SELECT va.vid, a.id, a.year, a.ann_id, a.nfo_id, a.type, a.title_romaji, a.title_kanji
+ FROM anime a JOIN vn_anime va ON va.aid = a.id WHERE va.vid IN($ids)|,
+ \@ids, 'get_vn_res', { %$get, type => 'anime' });
}
- $c->{wheel}->put([ results => { num => $#$res+1, items => $res }]);
- $_[KERNEL]->yield(log => $c, "%4.0fms %2d get vn %s %s", $time*1000, $#$res+1, join (',', @$info), encode_filters $filters);
+ # send and log
+ delete $_->{latest} for @{$get->{list}};
+ $num = @{$get->{list}};
+ $get->{c}{wheel}->put([ results => { num => $num, items => $get->{list} }]);
+ $_[KERNEL]->yield(log => $get->{c}, "T:%4.0fms Q:%d R:%02d get vn %s %s",
+ $get->{time}*1000, $get->{queries}, $num, join(',', @{$get->{info}}), encode_filters $get->{filters});
}