summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2009-11-06 13:39:57 +0100
committerYorhel <git@yorhel.nl>2009-11-06 13:39:57 +0100
commit082be27b03d6b56e114a4b24101d1f5c0d8c3b53 (patch)
treeb1889a85f84b04ae01db306f6ccb1497d99bf6d4
parentf204eacba181acc025354e566a2fded59d0ecaaf (diff)
API: Added anime flag for the get vn command
-rw-r--r--data/docs/1118
-rw-r--r--lib/Multi/API.pm84
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});
}