diff options
-rw-r--r-- | data/docs/11 | 18 | ||||
-rw-r--r-- | lib/Multi/API.pm | 84 |
2 files changed, 78 insertions, 24 deletions
diff --git a/data/docs/11 b/data/docs/11 index 58b86d4c..d934ab8f 100644 --- a/data/docs/11 +++ b/data/docs/11 @@ -304,6 +304,24 @@ however still required.<br /> All members can be <b>null</b> when no links are available or known to us. </td> </tr> + <tr class="odd"> + <td>anime</td> + <td>anime</td> + <td>array of objects</td> + <td>no</td> + <td> + List of anime related to the VN, each object has the following members:<br /> + "id", integer, <a href="http://anidb.net/">AniDB</a> ID<br /> + "ann_id", integer, <a href="http://animenewsnetwork.com/">AnimeNewsNetwork</a> ID<br /> + "nfo_id", string, <a href="http://animenfo.com/">AnimeNfo</a> ID<br /> + "title_romaji", string<br /> + "title_kanji", string<br /> + "year", integer, year in which the anime was aired<br /> + "type", string<br /> + All members except the "id" can be <b>null</b>. Note that this data is courtesy of AniDB, + and may not reflect the latest state of their information due to caching. + </td> + </tr> </table> <b>Accepted filters for the 'vn' type:</b> 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}); } |