UDP API Definition: Difference between revisions

m
Fix typo in return code 282 name (NOTIFYACK_SUCCESSFUL_NOTIFICATION -- was [...]_NOTIFIATION)
m (Fix typo in return code 282 name (NOTIFYACK_SUCCESSFUL_NOTIFICATION -- was [...]_NOTIFIATION))
 
(68 intermediate revisions by 9 users not shown)
Line 3: Line 3:
== General Information ==
== General Information ==
'''Author:''' [[User:Exp|Exp]] & [[User:Epoximator|Epoximator]] & [[User:Ommina|Ommina]]<br>
'''Author:''' [[User:Exp|Exp]] & [[User:Epoximator|Epoximator]] & [[User:Ommina|Ommina]]<br>
'''Version:''' 0.03.322 (2009-10-02)<br>
'''Version:''' 0.03.730 (2015-03-25)<br>
'''Version number used for protover parameter:''' "3"
'''Version number used for protover parameter:''' "3"


Line 31: Line 31:
** All newlines should be replaced by &lt;br /&gt;
** All newlines should be replaced by &lt;br /&gt;
* Escape scheme for returned data fields (from server): ', | and newline
* Escape scheme for returned data fields (from server): ', | and newline
** Content newlines are encoded as &lt;br /&gt;, ' is encoded as ` and | is not allowed in data fields.
** Content newlines are encoded as &lt;br /&gt;, ' is encoded as ` and | is encoded as /.
** Dates are returned in unix time (number of seconds elapsed since January 1, 1970 00:00:00 UTC)
** Dates are returned in unix time (number of seconds elapsed since January 1, 1970 00:00:00 UTC)


== Basics ==
== Basics ==
=== General ===
=== General ===
The network communication is ''packet'' and ''line'' based. Each AniDB API command is exactly one UDP packet containing one line. Results are sent as one packet but may consist out of multiple lines. A return value always starts with a 3 byte result code followed by a human readable version of the result code. Be aware that important data fields may be returned directly after the return code (see: 200,201,271,272,504).
The network communication is ''packet'' and ''line'' based. Each AniDB API command is exactly one UDP packet containing one line. Results are sent as one packet but may consist out of multiple lines. A return value always starts with a 3 byte result code followed by a human readable version of the result code. Be aware that important data fields may be returned directly after the return code (see: 200,201,209,271,272,504).
The meaning for all result codes can be found in this document. If there is more than one entry returned, it's one entry per line. Lines are terminated by a <tt>\n</tt> (no dos linefeed <tt>\r</tt>). The elements of a format string are separated by a "|" character.
The meaning for all result codes can be found in this document. If there is more than one entry returned, it's one entry per line. Lines are terminated by a <tt>\n</tt> (no dos linefeed <tt>\r</tt>). The elements of a format string are separated by a "|" character.


Line 55: Line 55:
*** 601 ANIDB OUT OF SERVICE - TRY AGAIN LATER
*** 601 ANIDB OUT OF SERVICE - TRY AGAIN LATER
*** 602 SERVER BUSY - TRY AGAIN LATER
*** 602 SERVER BUSY - TRY AGAIN LATER
*** 604 TIMEOUT - DELAY AND RESUBMIT
** Additional return codes for all commands that '''require login''':
** Additional return codes for all commands that '''require login''':
*** 501 LOGIN FIRST
*** 501 LOGIN FIRST
Line 79: Line 80:
: <tt>6xx ERROR DESCRIPTION</tt>
: <tt>6xx ERROR DESCRIPTION</tt>
* Possible codes are 600-699.
* Possible codes are 600-699.
* Occurrences of these errors (except 601) should be reported to [[User:Ommina|Ommina]].
* Occurrences of these errors (except 601 and 602) should be reported to [[User:Ommina|Ommina]].
{{eyecatch|Note|6XX messages do not always return the tags given with the command which caused the error!}}
{{eyecatch|Note|6XX messages do not always return the tags given with the command which caused the error!}}


Line 92: Line 93:


'''Note when behind a [[Wikipedia:Network address translation|NAT]]/masquerading router:'''<br>
'''Note when behind a [[Wikipedia:Network address translation|NAT]]/masquerading router:'''<br>
A session between the server and a client is identified by the ''ip and port'' used by the client. So when the port (or ip) changes within a session the client has to authenticate again. If a client is behind a nat router it can’t actually control the local port used for the connection. The router will normally ''translate'' the port to support several computers on a LAN to share the Internet connection. The public port (as determined by the router and seen by the server) which has been assigned to the connection will only be reserved for as long as it is in use. This means that the router will usually ''deallocate the port after a fixed timeout period'' (i.e. 5, 10 or 15 minutes). Once that happens the client will no longer be able to receive UDP messages from the server (the messages will be discarded as undeliverable by the router) and a new port will be selected once the client tries to send a message to the server (which will result in a new connection session - '''Note:''' This could get you banned!, see above). So in order to keep a session over a NAT router alive, the client has to ping the server within this period to prevent a timeout.
A session between the server and a client is identified by the ''IP and port'' used by the client. So when the port (or IP) changes within a session the client has to authenticate again. If a client is behind a NAT router it can’t actually control the local port used for the connection. The router will normally ''translate'' the port to support several computers on a LAN to share the Internet connection. The public port (as determined by the router and seen by the server) which has been assigned to the connection will only be reserved for as long as it is in use. This means that the router will usually ''deallocate the port after a fixed timeout period'' (eg. five, ten or 15 minutes). Once that happens the client will no longer be able to receive UDP messages from the server (the messages will be discarded as undeliverable by the router) and a new port will be selected once the client tries to send a message to the server (which will result in a new connection session - '''Note:''' This could get you banned!, see above). So in order to keep a session over a NAT router alive, the client has to ping the server within the router's deallocation period to prevent a timeout.


The client can decide whether it is behind a NAT router or not by adding <tt>nat=1</tt> to the AUTH command. This will cause the response to include the ip and port as seen by the server. If the port differs from the port reported by the local socket, the connection subject to NAT and the client should issue PING commands in regular intervals. Please do not send pings more often then once every 5 minutes and only on connections via NAT routers or if the user has explicitly enabled regular keepalive pings via a configuration setting (default setting should be OFF).
The client can decide whether it is behind a NAT router or not by adding <tt>nat=1</tt> to the AUTH command. This will cause the response to include the IP and port as seen by the server. If the port differs from the port reported by the local socket, the connection subject to NAT and the client should issue PING commands in regular intervals. Please do not send pings more often than is necessary to keep NAT connections alive.


=== Flood Protection ===
=== Flood Protection ===
To prevent high server load the UDP API server enforces a strict flood protection policy.
To prevent high server load the UDP API server enforces a strict flood protection policy.
* Short Term:
* Short Term:
** A Client MUST NOT send more than 0.5 packets per second.
** A Client MUST NOT send more than 0.5 packets per second (that's one packet every two seconds, not two packets a second!)
** The server will start to enforce the limit after the first 5 packets have been received.
** The server will start to enforce the limit after the first 5 packets have been received.
* Long Term:
* Long Term:
** A Client MUST NOT send more than one packet every 30 seconds over an extended amount of time.
** A Client MUST NOT send more than one packet every four seconds over an extended amount of time.
** ''An extended amount of time'' is not defined. Use common sense.
** ''An extended amount of time'' is not defined. Use common sense.


Line 156: Line 157:
=== AUTH: Authing to the AnimeDB ===
=== AUTH: Authing to the AnimeDB ===
'''Command String:'''
'''Command String:'''
* AUTH user={str username}&pass={str password}&protover={int4 apiversion}&client={str clientname}&clientver={int4 clientversion}[&nat=1&comp=1&enc={str encoding}&mtu{int4 mtu value}&imgserver=1]
* AUTH user={str username}&pass={str password}&protover={int4 apiversion}&client={str clientname}&clientver={int4 clientversion}[&nat=1&comp=1&enc={str encoding}&mtu={int4 mtu value}&imgserver=1]


'''Possible Replies:'''
'''Possible Replies:'''
Line 234: Line 235:
----
----
=== ENCRYPT: Start Encrypted Session ===
=== ENCRYPT: Start Encrypted Session ===
Will cause all future messages from the server, except the first (the reply to the ENCRYPT command itself), to be encrypted (128 bit [[Wikipedia:Advanced Encryption Standard|AES]]). The client will also have to encrypt all future requests sent to the server. All non-encrypted messages will be discarded by the server. The encryption key is the [[Wikipedia:MD5|MD5]] hash of a special ''API Password'' (defined in the users profile) concatenated with the salt string as given in the reply to the ENCRYPT message. A normal AUTH message is still necessary to authenticate and should follow the ENCRYPT command once the API has acknowledged the encryption.
Will cause all future messages from the server, except the first (the reply to the ENCRYPT command itself), to be encrypted (128 bit [[Wikipedia:Advanced Encryption Standard|AES]]). The client will also have to encrypt all future requests sent to the server. All non-encrypted messages will be discarded by the server. The encryption key is the [[Wikipedia:MD5|MD5]] hash of a special ''UDP API Key'' (defined in the users profile) concatenated with the salt string as given in the reply to the ENCRYPT message. A normal AUTH message is still necessary to authenticate and should follow the ENCRYPT command once the API has acknowledged the encryption.


'''Command String:'''
'''Command String:'''
Line 248: Line 249:
* ''user'' is the user name.
* ''user'' is the user name.
* ''type'' is the type of encryption; 1 => 128 bit AES (only one defined).
* ''type'' is the type of encryption; 1 => 128 bit AES (only one defined).
* ''API Password'' is the one defined in the {{AniDBLink|profile|profile settings page}}.
* ''API Key'' is the one defined in the {{AniDBLink|profile|profile settings page}}.
* It is not possible to disable the encryption once enabled while staying logged in.
* It is not possible to disable the encryption once enabled while staying logged in.
** A logout (the logout message needs to be correctly encrypted) or timeout will disable the encryption.
** A logout (the logout message needs to be correctly encrypted) or timeout will disable the encryption.
* In order to minimize server load, encryption should be disabled by default and should have to be enabled manually by the user in the configuration options.
* In order to minimize server load, encryption should be disabled by default and should have to be enabled manually by the user in the configuration options.
* The encryption key is md5(api_password_of_user+''salt'').
* The encryption key is md5(api_key_of_user+''salt'').
* Padding of the message needs to be done according to the PKCS5Padding scheme.
* Padding of the message needs to be done according to the PKCS5Padding scheme.


Line 473: Line 474:
'''Info:'''
'''Info:'''
* See: '''PUSH'''
* See: '''PUSH'''
== Notification Commands ==
=== NOTIFICATIONADD: Add Anime or Group to Notify List ===
'''Command String:'''<br>
by anime id:
* NOTIFICATIONADD aid={int4 aid}&type={int2 type}&priority={int2 priority}
by group id:
* NOTIFICATIONADD gid={int4 gid}&type={int2 type}&priority={int2 priority}
<br>
'''Possible Replies:'''
* 246 NOTIFICATION ITEM ADDED
: {int4 notification id}
* 248 NOTIFICATION ITEM UPDATED
: {int4 notification id}
* 399 NO CHANGES
<br>
'''Info:'''
* ''Priority'' values are 0: low, 1: medium, 2: high
* ''Type'' values are 0: all, 1: new, 2: group, 3: complete
=== NOTIFICATIONDEL: Remove Anime or Group from Notify List ===
'''Command String:'''<br>
by anime id:
* NOTIFICATIONDEL aid={int4 aid}
by group id:
* NOTIFICATIONDEL gid={int4 gid}
<br>
'''Possible Replies:'''
* 247 NOTIFICATION ITEM DELETED
: {int4 notification_table}|{int4 relid}
* 324 NO SUCH NOTIFICATION ITEM
<br>
'''Info:'''
* ''notification_table'' values are 1: anime, 2: group
* ''relid'' value matches the aid/gid supplied


== Buddy Commands ==
== Buddy Commands ==
Line 559: Line 603:
* Fields are returned in the same order they appear in the ''amask'' field list: byte 1, bit 7 first
* Fields are returned in the same order they appear in the ''amask'' field list: byte 1, bit 7 first
* Synonyms and short names are separated with '
* Synonyms and short names are separated with '
* Category fields are separated with ',' and ordered by weight (desc).
* Category fields are separated with ',' and ordered by weight (desc). ''However'', be aware that categories are no longer used nor updated internally, and category responses are only returned to avoid breaking older clients.  Use tags as a replacement. 
* By name: must be perfect match of romaji/kanji/english/other/synonym/short name.
* By name: must be perfect match of romaji/kanji/english/other/synonym/short name.
* 'Producer id list' and 'producer name list' match the data returned by the former producer bits (but using the revised creator ids)
* 'Producer id list' and 'producer name list' match the data returned by the former producer bits (but using the revised creator ids)
* Date flags are used to indicated an unknown value (unknown month, day, year)
* ''dateflags'' values:
** bit0 set == Startdate, Unknown Day
** bit1 set == Startdate, Unknown Month, Day
** bit2 set == Enddate, Unknown Day
** bit3 set == Enddate, Unknown Month, Day
** bit4 set == AirDate in the Past/Anime has ended
** bit5 set == Startdate, Unknown Year
** bit6 set == Enddate, Unknown Year


* '''Note:''' The character id list is the first data to be truncated if needed. And then: category list, synonym list, short name list. This applies to the FILE command too.
* '''Note:''' The character id list is the first data to be truncated if needed. And then: tag list, synonym list, short name list. This applies to the FILE command too.
* Selecting an 'unused' or 'reserved' bit will return an "illegal input" (505) response.
* Selecting an 'unused' or 'reserved' bit will return an "illegal input" (505) response.


<table border="0" cellpadding="0" cellspacing="2">
<table border="0" cellpadding="0" cellspacing="2">
  <tr><td colspan="5" align="center">'''amask'''</td></tr>
  <tr><td colspan="5" align="center"><b>amask</b></td></tr>
  <tr>
  <tr>
   <td align="center">'''Byte 1'''</td>
   <td align="center"><b>Byte 1</b></td>
   <td align="center">'''Byte 2'''</td>
   <td align="center"><b>Byte 2</b></td>
   <td align="center">'''Byte 3'''</td>
   <td align="center"><b>Byte 3</b></td>
   <td align="center">'''Byte 4'''</td>
   <td align="center"><b>Byte 4</b></td>
   <td align="center">'''Byte 5'''</td>
   <td align="center"><b>Byte 5</b></td>
   <td align="center">'''Byte 6'''</td>
   <td align="center"><b>Byte 6</b></td>
   <td align="center">'''Byte 7'''</td>
   <td align="center"><b>Byte 7</b></td>
  </tr>
  </tr>
  <tr>
  <tr>
Line 581: Line 634:
   <table>
   <table>
     <tr>
     <tr>
     <td>'''Bit'''</td>
     <td><b>Bit</b></td>
     <td align="right">'''Dec'''</td>
     <td align="right"><b>Dec</b></td>
     <td>'''Data Field'''</td>
     <td><b>Data Field</b></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
Line 593: Line 646:
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>unused</td>
     <td>int dateflags</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
Line 605: Line 658:
     <td>str type</td>
     <td>str type</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
Line 615: Line 668:
     <td>str related aid type</td>
     <td>str related aid type</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td>str category list</td>
     <td><i>retired</i></td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td>str category weight list</td>
     <td><i>retired</i></td>
     </tr>
     </tr>
   </table>
   </table>
Line 630: Line 683:
   <table>
   <table>
     <tr>
     <tr>
     <td>'''Bit'''</td>
     <td><b>Bit</b></td>
     <td align="right">'''Dec'''</td>
     <td align="right"><b>Dec</b></td>
     <td>'''Data Field'''</td>
     <td><b>Data Field</b></td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>7</td>
     <td>7</td>
Line 639: Line 692:
     <td>str romaji name</td>
     <td>str romaji name</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
Line 649: Line 702:
     <td>str english name</td>
     <td>str english name</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
Line 659: Line 712:
     <td>str short name list</td>
     <td>str short name list</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
Line 669: Line 722:
     <td><i>retired</i></td>
     <td><i>retired</i></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
Line 679: Line 732:
   <table>
   <table>
     <tr>
     <tr>
     <td>'''Bit'''</td>
     <td><b>Bit</b></td>
     <td align="right">'''Dec'''</td>
     <td align="right"><b>Dec</b></td>
     <td>'''Data Field'''</td>
     <td><b>Data Field</b></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
Line 693: Line 746:
     <td>int4 highest episode number</td>
     <td>int4 highest episode number</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
Line 701: Line 754:
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>int4 air date</td>
     <td>int air date</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>int4 end date</td>
     <td>int end date</td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 713: Line 766:
     <td>str url</td>
     <td>str url</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
Line 721: Line 774:
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td>str category id list</td>
     <td><i>retired</i></td>
     </tr>
     </tr>
   </table>
   </table>
Line 728: Line 781:
   <table>
   <table>
     <tr>
     <tr>
     <td>'''Bit'''</td>
     <td><b>Bit</b></td>
     <td align="right">'''Dec'''</td>
     <td align="right"><b>Dec</b></td>
     <td>'''Data Field'''</td>
     <td><b>Data Field</b></td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 737: Line 790:
     <td>int4 rating</td>
     <td>int4 rating</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>int4 vote count</td>
     <td>int vote count</td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 747: Line 800:
     <td>int4 temp rating</td>
     <td>int4 temp rating</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>int4 temp vote count</td>
     <td>int temp vote count</td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 757: Line 810:
     <td>int4 average review rating</td>
     <td>int4 average review rating</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
     <td>int4 review count</td>
     <td>int review count</td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 767: Line 820:
     <td>str award list</td>
     <td>str award list</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
Line 777: Line 830:
   <table>
   <table>
     <tr>
     <tr>
     <td>'''Bit'''</td>
     <td><b>Bit</b></td>
     <td align="right">'''Dec'''</td>
     <td align="right"><b>Dec</b></td>
     <td>'''Data Field'''</td>
     <td><b>Data Field</b></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>int4 anime planet id</td>
     <td><i>retired</i></td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>int4 ANN id</td>
     <td>int ANN id</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>int4 allcinema id</td>
     <td>int allcinema id</td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 801: Line 854:
     <td>str AnimeNfo id</td>
     <td>str AnimeNfo id</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>unused</td>
     <td>str tag name list</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
     <td>unused</td>
     <td>int tag id list</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td>unused</td>
     <td>int tag weight list</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td>int4 date record updated</td>
     <td>int date record updated</td>
     </tr>
     </tr>
   </table>
   </table>
Line 826: Line 879:
   <table>
   <table>
     <tr>
     <tr>
     <td>'''Bit'''</td>
     <td><b>Bit</b></td>
     <td align="right">'''Dec'''</td>
     <td align="right"><b>Dec</b></td>
     <td>'''Data Field'''</td>
     <td><b>Data Field</b></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>int4 character id list</td>
     <td>int character id list</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>int4 creator id list</td>
     <td><i>retired</i></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>int4 producer id list</td>
     <td><i>retired</i></td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>str producer name list</td>
     <td><i>retired</i></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
Line 860: Line 913:
     <td>unused</td>
     <td>unused</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
Line 875: Line 928:
   <table>
   <table>
     <tr>
     <tr>
     <td>'''Bit'''</td>
     <td><b>Bit</b></td>
     <td align="right">'''Dec'''</td>
     <td align="right"><b>Dec</b></td>
     <td>'''Data Field'''</td>
     <td><b>Data Field</b></td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
Line 889: Line 942:
     <td>int4 credits count</td>
     <td>int4 credits count</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
Line 899: Line 952:
     <td>int4 trailer count</td>
     <td>int4 trailer count</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
Line 909: Line 962:
     <td>unused</td>
     <td>unused</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
Line 932: Line 985:
     2      prequel
     2      prequel
   11      same setting
   11      same setting
   21     alternative setting
   12     alternative setting
   32      alternative version
   32      alternative version
   41      music video
   41      music video
Line 942: Line 995:
   100      other
   100      other
</pre>
</pre>
'''Examples:''' (note that the given amask gives the same result as the default request)
  > ANIME aid=1&amask=b2f0e0fc000000&s=xxxxx
  < 230 ANIME
    1|1999-1999|TV Series|Space,Future,Plot Continuity,SciFi,Space Travel,Shipboard,Other Planet,Novel,Genetic Modification,Action,Romance,Military,Large Breasts,Gunfights,Adventure,Human Enhancement,Nudity|Seikai no Monshou|星界の紋章|Crest of the Stars||13|13|3|853|3225|756|110|875|11


----
----
Line 969: Line 1,028:


----
----
=== EPISODE: Retrieve Episode Data ===
=== CALENDAR: Get Upcoming Titles ===
'''Command String:'''<br>
Returns the anime ids of the 25 most recently aired / released anime, directly followed by the next 25 anime due to be aired / released, ordered by start date.
by eid
 
* EPISODE eid={int4 eid}
'''Command String:'''
by anime and episode number
* CALENDAR
* EPISODE aname={str anime name}&epno={int4 episode number}
* EPISODE aid={int4 anime id}&epno={int4 episode number}


'''Possible Replies:'''
'''Possible Replies:'''
* 240 EPISODE
* 297 CALENDAR
: {int4 eid}|{int4 aid}|{int4 length}|{int4 rating}|{int4 votes}|{str epno}|{str eng}|{str romaji}|{str kanji}|{int4 aired}
{int aid}|{int startdate}|{int dateflags}/n
* 340 NO SUCH EPISODE
 
..repeated n times
 
* 397 CALENDAR EMPTY


'''Info:'''
'''Info:'''
* length is in minutes
* Takes no parameters (other than the session string)
* Returned 'epno' includes special character (only if special) and padding (only if normal). Special characters are S(special), C(credits), T(trailer), P(parody), O(other).
* Titles returned are filtered by the 'show adult' preference of the logged in user.  That is, users who have elected to hide adult content will have it hidden here as well.
* Do not depend on the command always returning exactly 50 titles; there may not always be 25 future titles pending, depending on the user's 'adult' preferences, and the date in relation to the relation to the current anime season.
* Date flags are used to indicated an unknown value (unknown month, day, year)
* ''dateflags'' values:
** bit0 set == Startdate, Unknown Day
** bit1 set == Startdate, Unknown Month, Day
** bit2 set == Enddate, Unknown Day
** bit3 set == Enddate, Unknown Month, Day
** bit4 set == AirDate in the Past/Anime has ended
** bit5 set == Startdate, Unknown Year
** bit6 set == Enddate, Unknown Year
 


'''Examples:''' (html escaped code intended)
----
  > EPISODE eid=1&s=xxxxx
=== CHARACTER: Get Character Information ===
  < 240 EPISODE
Returns character details associated with a given character ID, including associated anime ids, episode ids, and seiyuu.
  1|1|24|400|4|01|Invasion|shinryaku|??


  > EPISODE aname=Seikai no Monshou&epno=2&s=xxxxx
'''Command String:'''
  < 240 EPISODE
* CHARACTER charid={int characterid}
  2|1|24|750|2|02|Kin of the Stars|Hoshi-tachi no Kenzoku|??????


----
'''Possible Replies:'''
=== FILE: Retrieve File Data ===
* 235 CHARACTER
'''Command String:'''<br>
: {int charid}|{str character name kanji}|{str character name transcription}|{str pic}|{anime blocks}|{int episode list}|{int last update date}|{int2 type}|{str gender}
by fid:
 
* FILE fid={int4 id}&fmask={hexstr fmask}&amask={hexstr amask}
: An 'anime block' is {int anime id},{int appearance},{int creatorid},{boolean is_main_seiyuu} repeated as many times as necessary, separated by a single quote ( ' ).
by size+ed2k hash:
* FILE size={int8 size}&ed2k={str ed2khash}&fmask={hexstr fmask}&amask={hexstr amask}
by anime, group and epno
* FILE aname={str anime name}&gname={str group name}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}
* FILE aname={str anime name}&gid={int4 group id}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}
* FILE aid={int4 anime id}&gname={str group name}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}
* FILE aid={int4 anime id}&gid={int4 group id}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}


'''Possible Replies:'''
* 335 NO SUCH CHARACTER
* 220 FILE
: {int4 fid}|{int4 aid}|{int4 eid}|{int4 gid}|{int4 state}|{int8 size}|{str ed2k}|{str anidbfilename}
* 220 FILE
: {int4 fid}|...(data list)
* 322 MULTIPLE FILES FOUND
: {int4 fid 0}|{int4 fid 1}|...|{int4 fid n}
* 320 NO SUCH FILE


'''Info:'''
'''Info:'''
* fid, aid, eid, gid are the unique ids for the file, anime, ep, group entries at AniDB.
* If no seiyuu is associated with the character for a given aid, the 'creatorid' and 'is_main_seiyuu' fields will be empty, but the commas will remain.
: You can use those to create links to the corresponding pages at AniDB.
* An empty episode list is "undefined": no episode values have been added.
* anidbfilename is the AniDB filename for the file.
* ''appearance'' values: 0='appears in', 1='cameo appearance in', 2='main character in', 3='secondary cast in'
: However this name does not contain all the extra information of the filenames on AniDB and might be composed slightly different.
* ''type'' can be one of: (Note: this is subject to changes so don't rely on this mapping)
* fmask and amask are hexidecimal strings where each bit corresponds to a data field related to the specified file (see below). The data list received is sorted in the same order as the tables (and fmask before amask).  There is '''no''' provision to retrieve all fields.  Further, requesting a 'unusued' or 'reserved' bit will return an "illegal input" error.
** 1 => 'Character'
* Only the first matching file is returned when aname, gname and epno is used.
** 2 => 'Mecha'
* "audio codec" and "audio bitrate" will return multiple values if there are multiple audio streams present in the file.  Values will be separated by a single quote. 
** 3 => 'Organisation'
** 4 => 'Vessel'  
* ''gender'' can be one of: (Note: this is subject to changes so don't rely on this mapping)
** "M" => 'Male'
** "F" => 'Female'
** "I" => 'Intersexual'
** "D" => 'Dimorphic'
** "-" => 'none/does not apply'
** "?" => 'unknown'
 
'''Example:'''


'''State:'''
  CHARACTER charid=488&s=DChan
<pre>
  235 CHARACTER
bit / int value meaning
  488|ニコ・ロビン|Nico Robin|14789.jpg|4097,2,1900,1'69,2,1901,0'6199,0,1900,1'5691,0,1900,1'2644,0,,'4851,0,1900,1||1236938094
1 / 1 FILE_CRCOK: file matched official CRC (displayed with green background in AniDB)
2 / 2 FILE_CRCERR: file DID NOT match official CRC (displayed with red background in AniDB)
3 / 4 FILE_ISV2: file is version 2
4 / 8 FILE_ISV3: file is version 3
5 / 16 FILE_ISV4: file is version 4
6 / 32 FILE_ISV5: file is version 5
7 / 64 FILE_UNC: file is uncensored
8 / 128 FILE_CEN: file is censored


examples:
=== CREATOR: Get Creator Information ===
state ==== 9 ==> FILE_CRCOK+FILE_ISV3 ==> file matched official CRC and is version 3
state ==== 0 ==> - ==> file was not crc checked and is version 1
state ==== 34 ==> FILE_CRCERR+FILE_ISV5 ==> file DID NOT match official CRC and is version 5
state ==== 1 ==> FILE_CRCOK ==> file matched official CRC and is version 1
state ==== 8 ==> FILE_ISV3 ==> file was not CRC checked and is version 3
</pre>


<table border="0" cellpadding="0" cellspacing="2">
'''Command String:'''
<tr><td colspan="4" align="center">'''fmask:'''</td></tr>
* CREATOR creatorid={int creatorid}
<tr>
 
  <td align="center">'''Byte 1'''</td>
'''Possible Replies:'''
  <td align="center">'''Byte 2'''</td>
* 245 CREATOR
  <td align="center">'''Byte 3'''</td>
: {int creatorid}|{str creator name kanji}|{str creator name transcription}|{int type}|{str pic_name}|{str url_english}|{str url_japanese}|{str wiki_url_english}|{str wiki_url_japanese}|{int last update date}
  <td align="center">'''Byte 4'''</td>
 
</tr>
* 345 NO SUCH CREATOR
<tr>
 
  <td>
'''Info:'''
  <table>
* ANIME AMASK byte6, bit5
    <tr>
* ''type'' values: 1='person', 2='company', 3='collaboration'
    <td>'''Bit'''</td>
 
    <td align="right">'''Dec'''</td>
Example:
    <td>'''Data Field'''</td>
 
    </tr>
  245 CREATOR
    <tr bgcolor="#eee">
  718|GAINAX|Gainax|2|10092.png||http://www.gainax.co.jp/|Gainax|Gainax|1237048093
    <td>7</td>
 
    <td align="right">128</td>
=== EPISODE: Retrieve Episode Data ===
    <td>unused</td>
'''Command String:'''<br>
    </tr>
by eid
    <tr>
* EPISODE eid={int eid}
    <td>6</td>
by anime and episode number
    <td align="right">64</td>
* EPISODE aname={str anime name}&epno={int4 episode number}
    <td>int4 aid</td>
* EPISODE aid={int anime id}&epno={int4 episode number}
    </tr>
 
    <tr bgcolor="#eee">
'''Possible Replies:'''
    <td>5</td>
* 240 EPISODE
    <td align="right">32</td>
: {int eid}|{int aid}|{int4 length}|{int4 rating}|{int votes}|{str epno}|{str eng}|{str romaji}|{str kanji}|{int aired}|{int type}
    <td>int4 eid</td>
* 340 NO SUCH EPISODE
    </tr>
 
    <tr>
'''Info:'''
    <td>4</td>
* length is in minutes
    <td align="right">16</td>
* Returned 'epno' includes special character (only if special) and padding (only if normal).
    <td>int4 gid</td>
** Special characters are S(special), C(credits), T(trailer), P(parody), O(other).
    </tr>
* The ''type'' is the raw episode type, used to indicate numerically what the special character will be
    <tr bgcolor="#eee">
** 1: regular episode (no prefix), 2: special ("S"), 3: credit ("C"), 4: trailer ("T"), 5: parody ("P"), 6: other ("O")
    <td>3</td>
 
    <td align="right">8</td>
'''Examples:''' (html escaped code intended)
    <td>int4 mylist id</td>
  > EPISODE eid=1&s=xxxxx
    </tr>
  < 240 EPISODE
    <tr>
  1|1|24|400|4|01|Invasion|shinryaku|??
    <td>2</td>
 
    <td align="right">4</td>
  > EPISODE aname=Seikai no Monshou&epno=2&s=xxxxx
    <td>list other episodes</td>
  < 240 EPISODE
    </tr>
  2|1|24|750|2|02|Kin of the Stars|Hoshi-tachi no Kenzoku|??????|1295059229|1
    <tr bgcolor="#eee">
 
    <td>1</td>
----
    <td align="right">2</td>
 
    <td>int2 IsDeprecated</td>
=== FILE: Retrieve File Data ===
    </tr>
'''Command String:'''<br>
    <tr>
by fid:
    <td>0</td>
* FILE fid={int4 id}&fmask={hexstr fmask}&amask={hexstr amask}
    <td align="right">1</td>
by size+ed2k hash:
    <td>int2 state</td>
* FILE size={int8 size}&ed2k={str ed2khash}&fmask={hexstr fmask}&amask={hexstr amask}
    </tr>
by anime, group and epno
  </table>
* FILE aname={str anime name}&gname={str group name}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}
  </td>
* FILE aname={str anime name}&gid={int4 group id}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}
  <td>
* FILE aid={int4 anime id}&gname={str group name}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}
  <table>
* FILE aid={int4 anime id}&gid={int4 group id}&epno={int4 episode number}&fmask={hexstr fmask}&amask={hexstr amask}
    <tr>
 
    <td>'''Bit'''</td>
'''Possible Replies:'''
    <td align="right">'''Dec'''</td>
* 220 FILE
    <td>'''Data Field'''</td>
: {int4 fid}|{int4 aid}|{int4 eid}|{int4 gid}|{int4 state}|{int8 size}|{str ed2k}|{str anidbfilename}
    </tr>
* 220 FILE
    <tr>
: {int4 fid}|...(data list)
    <td>7</td>
* 322 MULTIPLE FILES FOUND
    <td align="right">128</td>
: {int4 fid 0}|{int4 fid 1}|...|{int4 fid n}
    <td>int8 size</td>
* 320 NO SUCH FILE
    </tr>
 
    <tr bgcolor="#eee">
'''Info:'''
    <td>6</td>
* fid, aid, eid, gid are the unique ids for the file, anime, ep, group entries at AniDB.
    <td align="right">64</td>
: You can use those to create links to the corresponding pages at AniDB.
    <td>str ed2k</td>
* anidbfilename is the AniDB filename for the file.
    </tr>
: However this name does not contain all the extra information of the filenames on AniDB and might be composed slightly different.
    <tr>
* fmask and amask are hexidecimal strings where each bit corresponds to a data field related to the specified file (see below). The data list received is sorted and returned in the same order as the tables: top to bottom, left to right, with fmask preceding amask.  There is '''no''' provision to retrieve all fields.  Further, requesting a 'unusued' or 'reserved' bit will return an "illegal input" error.
    <td>5</td>
* fid is always returned as the first value, regardless of what masks are provided.
    <td align="right">32</td>
* Only the first matching file is returned when aname, gname and epno is used.
    <td>str md5</td>
* "audio codec" and "audio bitrate" will return multiple values if there are multiple audio streams present in the file.  Values will be separated by a single quote. 
    </tr>
* For byte 1, bit 2 (other episodes): episode IDs will be followed by an integer '''percentage''' that indicate the percentage of the related episode this file covers. Typically 100%, there are cases where it will be 50, 30, or other values.  This value provides no indication where, within an episode, the file represents.  That is, 50% could mean the file covers the first half of the episode, the second half, or some 50% range in between.
    <tr bgcolor="#eee">
'''State:'''
    <td>4</td>
<pre>
    <td align="right">16</td>
bit / int value meaning
    <td>str sha1</td>
1 / 1 FILE_CRCOK: file matched official CRC (displayed with green background in AniDB)
    </tr>
2 / 2 FILE_CRCERR: file DID NOT match official CRC (displayed with red background in AniDB)
    <tr>
3 / 4 FILE_ISV2: file is version 2
    <td>3</td>
4 / 8 FILE_ISV3: file is version 3
    <td align="right">8</td>
5 / 16 FILE_ISV4: file is version 4
    <td>str crc32</td>
6 / 32 FILE_ISV5: file is version 5
    </tr>
7 / 64 FILE_UNC: file is uncensored
    <tr bgcolor="#eee">
8 / 128 FILE_CEN: file is censored
    <td>2</td>
 
    <td align="right">4</td>
examples:
    <td>unused</td>
state ==== 9 ==> FILE_CRCOK+FILE_ISV3 ==> file matched official CRC and is version 3
    </tr>
state ==== 0 ==> - ==> file was not crc checked and is version 1
    <tr>
state ==== 34 ==> FILE_CRCERR+FILE_ISV5 ==> file DID NOT match official CRC and is version 5
    <td>1</td>
state ==== 1 ==> FILE_CRCOK ==> file matched official CRC and is version 1
    <td align="right">2</td>
state ==== 8 ==> FILE_ISV3 ==> file was not CRC checked and is version 3
    <td>unused</td>
</pre>
    </tr>
 
    <tr bgcolor="#eee">
<table border="0" cellpadding="0" cellspacing="2">
    <td>0</td>
<tr><td colspan="4" align="center">'''fmask:'''</td></tr>
    <td align="right">1</td>
<tr>
    <td>reserved</td>
  <td align="center">'''Byte 1'''</td>
    </tr>
  <td align="center">'''Byte 2'''</td>
  </table>
  <td align="center">'''Byte 3'''</td>
  </td>
  <td align="center">'''Byte 4'''</td>
  <td align="center">'''Byte 5'''</td>
</tr>
<tr>
   <td>
   <td>
   <table>
   <table>
Line 1,160: Line 1,214:
     <td>'''Data Field'''</td>
     <td>'''Data Field'''</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>str quality</td>
     <td>unused</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>str source</td>
     <td>int4 aid</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>str audio codec list</td>
     <td>int4 eid</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>int4 audio bitrate list</td>
     <td>int4 gid</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>str video codec</td>
     <td>int4 mylist id</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
     <td>int4 video bitrate</td>
     <td>list other episodes</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td>str video resolution</td>
     <td>int2 IsDeprecated</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td>str file type (extension)</td>
     <td>int2 state</td>
     </tr>
     </tr>
   </table>
   </table>
Line 1,212: Line 1,266:
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>str dub language</td>
     <td>int8 size</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>str sub language</td>
     <td>str ed2k</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>int4 length in seconds</td>
     <td>str md5</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>str description</td>
     <td>str sha1</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>int4 aired date</td>
     <td>str crc32</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
Line 1,242: Line 1,296:
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td>unused</td>
     <td>video colour depth</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td>str anidb file name</td>
     <td>reserved</td>
     </tr>
     </tr>
   </table>
   </table>
   </td>
   </td>
</tr>
   <td>
</table>
   <table>
 
     <tr>
<table border="0" cellpadding="0" cellspacing="2">
     <td>'''Bit'''</td>
<tr><td colspan="4" align="center">'''amask:'''</td></tr>
     <td align="right">'''Dec'''</td>
<tr>
  <td align="center">'''Byte 1'''</td>
  <td align="center">'''Byte 2'''</td>
  <td align="center">'''Byte 3'''</td>
  <td align="center">'''Byte 4'''</td>
</tr>
<tr>
   <td>
   <table>
     <tr>
     <td>'''Bit'''</td>
     <td align="right">'''Dec'''</td>
     <td>'''Data Field'''</td>
     <td>'''Data Field'''</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>int4 anime total episodes</td>
     <td>str quality</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>int4 highest episode number</td>
     <td>str source</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>str year</td>
     <td>str audio codec list</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>str type</td>
     <td>int4 audio bitrate list</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>str related aid list</td>
     <td>str video codec</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
     <td>str related aid type</td>
     <td>int4 video bitrate</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td>str category list</td>
     <td>str video resolution</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td>reserved</td>
     <td>str file type (extension)</td>
     </tr>
     </tr>
   </table>
   </table>
Line 1,322: Line 1,364:
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>str romaji name</td>
     <td>str dub language</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>str kanji name</td>
     <td>str sub language</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>str english name</td>
     <td>int4 length in seconds</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>str other name</td>
     <td>str description</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>str short name list</td>
     <td>int4 aired date</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
     <td>str synonym list</td>
     <td>unused</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td><i>retired</i></td>
     <td>unused</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td><i>retired</i></td>
     <td>str anidb file name</td>
     </tr>
     </tr>
   </table>
   </table>
Line 1,368: Line 1,410:
     <td>'''Data Field'''</td>
     <td>'''Data Field'''</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>str epno</td>
     <td>int4 mylist state</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>str ep name</td>
     <td>int4 mylist filestate</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>str ep romaji name</td>
     <td>int4 mylist viewed</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>str ep kanji name</td>
     <td>int4 mylist viewdate</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>int4 episode rating</td>
     <td>str mylist storage</td>
     </tr>
     </tr>
     <tr>
     <tr>
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
     <td>int4 episode vote count</td>
     <td>str mylist source</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td>unused</td>
     <td>str mylist other</td>
     </tr>
     </tr>
     <tr>
     <tr>
Line 1,410: Line 1,452:
   </table>
   </table>
   </td>
   </td>
   <td>
</tr>
   <table>
</table>
     <tr>
 
<table border="0" cellpadding="0" cellspacing="2">
<tr><td colspan="4" align="center">'''amask:'''</td></tr>
<tr>
  <td align="center">'''Byte 1'''</td>
  <td align="center">'''Byte 2'''</td>
  <td align="center">'''Byte 3'''</td>
  <td align="center">'''Byte 4'''</td>
</tr>
<tr>
   <td>
   <table>
     <tr>
     <td>'''Bit'''</td>
     <td>'''Bit'''</td>
     <td align="right">'''Dec'''</td>
     <td align="right">'''Dec'''</td>
     <td>'''Data Field'''</td>
     <td>'''Data Field'''</td>
     </tr>
     </tr>
     <tr>
     <tr bgcolor="#eeeeee">
     <td>7</td>
     <td>7</td>
     <td align="right">128</td>
     <td align="right">128</td>
     <td>str group name</td>
     <td>int4 anime total episodes</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr>
     <td>6</td>
     <td>6</td>
     <td align="right">64</td>
     <td align="right">64</td>
     <td>str group short name</td>
     <td>int4 highest episode number</td>
     </tr>
     </tr>
     <tr>
     <tr bgcolor="#eeeeee">
     <td>5</td>
     <td>5</td>
     <td align="right">32</td>
     <td align="right">32</td>
     <td>unused</td>
     <td>str year</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr>
     <td>4</td>
     <td>4</td>
     <td align="right">16</td>
     <td align="right">16</td>
     <td>unused</td>
     <td>str type</td>
     </tr>
     </tr>
     <tr>
     <tr bgcolor="#eeeeee">
     <td>3</td>
     <td>3</td>
     <td align="right">8</td>
     <td align="right">8</td>
     <td>unused</td>
     <td>str related aid list</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr>
     <td>2</td>
     <td>2</td>
     <td align="right">4</td>
     <td align="right">4</td>
     <td>unused</td>
     <td>str related aid type</td>
     </tr>
     </tr>
     <tr>
     <tr bgcolor="#eeeeee">
     <td>1</td>
     <td>1</td>
     <td align="right">2</td>
     <td align="right">2</td>
     <td>unused</td>
     <td>str category list</td>
     </tr>
     </tr>
     <tr bgcolor="#eee">
     <tr>
     <td>0</td>
     <td>0</td>
     <td align="right">1</td>
     <td align="right">1</td>
     <td>int4 date aid record updated</td>
     <td>reserved</td>
     </tr>
     </tr>
   </table>
   </table>
   </td>
   </td>
</tr>
  <td>
</table>
  <table>
 
    <tr>
'''Examples:''' (html escaped code intended)
    <td>'''Bit'''</td>
  > FILE size=177747474&ed2k=70cd93fd3981cc80a8ea6a646ff805c9&fmask=7FF8FEF8&amask=C000F0C0&s=xxxxx
    <td align="right">'''Dec'''</td>
  < 220 FILE
    <td>'''Data Field'''</td>
  312498|4688|69260|4243|0||0|1|177747474|70cd93fd3981cc80a8ea6a646ff805c9|b2a7c7d591333e20495de3571b235c28|7af9b962c17ff729baeee67533e5219526cd5095|a200fe73|high|DTV|Vorbis (Ogg Vorbis)|104|H264/AVC|800|704x400|japanese|english'english'english|1560||1175472000|26|26|01|The Wings to the Sky|Sora he no Tsubasa|????|#nanoha-DamagedGoodz|Nanoha-DGz
    </tr>
 
    <tr>
----
    <td>7</td>
 
    <td align="right">128</td>
=== GROUP: Retrieve Group Data ===
    <td>str romaji name</td>
'''Command String:'''<br>
    </tr>
by gid
    <tr bgcolor="#eeeeee">
* GROUP gid={int4 gid}
    <td>6</td>
by name/shortname
    <td align="right">64</td>
* GROUP gname={str group name}
    <td>str kanji name</td>
 
    </tr>
'''Possible Replies:'''
    <tr>
* 250 GROUP
    <td>5</td>
: {int4 gid}|{int4 rating}|{int4 votes}|{int4 acount}|{int fcount}|{str name}|{str short}|{str irc channel}|{str irc server}|{str url}|{str picname}
    <td align="right">32</td>
* 350 NO SUCH GROUP
    <td>str english name</td>
 
    </tr>
'''Examples:'''
    <tr bgcolor="#eeeeee">
  > GROUP gid=1&s=xxxxx
    <td>4</td>
  < 250 GROUP
    <td align="right">16</td>
  41|851|665|109|1004|Zhentarim DivX|zx|#zhentarim|irc.deltaanime.net|<nowiki>http://www.zhentarim.net/</nowiki>|1134.gif
    <td>str other name</td>
 
    </tr>
  > GROUP gname=a-l&s=xxxxx
    <tr>
  < 250 GROUP
    <td>3</td>
  566|840|453|53|534|Anime-Legion|A-L|#anime-legion|irc.irchighway.net|<nowiki>http://www.anime-legion.net</nowiki>|1088.png
    <td align="right">8</td>
 
    <td>str short name list</td>
----
    </tr>
 
    <tr bgcolor="#eeeeee">
=== GROUPSTATUS: Get Completed Episode ===
    <td>2</td>
Returns a list of group names and ranges of episodes released by the group for a given anime.
    <td align="right">4</td>
 
    <td>str synonym list</td>
'''Command String:'''
    </tr>
* GROUPSTATUS aid={int animeid}[&state={int completion_state}]
    <tr>
 
    <td>1</td>
'''Possible Replies:'''
    <td align="right">2</td>
* 225 Group Status
    <td><i>retired</i></td>
: {int group id}|{str group name}|{int completion state}|{int last episode number}|{int rating}|{int votes}|{str episode range}\n
    </tr>
: {int group id}|{str group name}|{int completion state}|{int last episode number}|{int rating}|{int votes}|{str episode range}\n
    <tr bgcolor="#eeeeee">
: ... (repeated)
    <td>0</td>
 
    <td align="right">1</td>
* 325 No Groups Found
    <td><i>retired</i></td>
* 330 Anime Not Found
    </tr>
 
  </table>
'''Info:'''
  </td>
* The seven fields will be repeated as necessary, one for each group, separated by a new line character
  <td>
* Groups will be filtered by the languages selected in the user's profile
  <table>
* If ''state'' is not supplied, groups with a completion state of 'ongoing', 'finished', or 'complete' are returned
    <tr>
* Groups are returned in order of descending episode count
    <td>'''Bit'''</td>
* If there are more groups to return than can be stored in a UDP packet, additional groups will be silently discarded
    <td align="right">'''Dec'''</td>
* ''state'' values: 1=ongoing, 2=stalled, 3=complete, 4=dropped, 5=finished, 6=specials_only
    <td>'''Data Field'''</td>
 
    </tr>
=== CREATOR: Get Creator Information ===
    <tr bgcolor="#eeeeee">
 
    <td>7</td>
'''Command String:'''
    <td align="right">128</td>
* CREATOR creatorid={int creatorid}
    <td>str epno</td>
 
    </tr>
'''Possible Replies:'''
    <tr>
* 245 CREATOR
    <td>6</td>
: {int creatorid}|{str creator name kanji}|{str creator name transcription}|{int type}|{str pic_name}|{str url_english}|{str url_japanese}|{str wiki_url_english}|{str wiki_url_japanese}|{int last update date}
    <td align="right">64</td>
 
    <td>str ep name</td>
* 345 NO SUCH CREATOR
    </tr>
 
    <tr bgcolor="#eeeeee">
'''Info:'''
    <td>5</td>
* ANIME AMASK byte6, bit5
    <td align="right">32</td>
* ''type'' values: 1='person', 2='company', 3='collaboration'
    <td>str ep romaji name</td>
 
    </tr>
Example:
    <tr>
 
    <td>4</td>
  245 CREATOR
    <td align="right">16</td>
  718|GAINAX|Gainax|2|10092.png||http://www.gainax.co.jp/|Gainax|Gainax|1237048093
    <td>str ep kanji name</td>
 
    </tr>
=== CHARACTER: Get Character Information ===
    <tr bgcolor="#eeeeee">
Returns character details associated with a given character ID, including associated anime ids, episode ids, and seiyuu.
    <td>3</td>
 
    <td align="right">8</td>
'''Command String:'''
    <td>int4 episode rating</td>
* CHARACTER charid={int characterid}
    </tr>
 
    <tr>
'''Possible Replies:'''
    <td>2</td>
* 235 CHARACTER
    <td align="right">4</td>
: {int charid}|{str character name kanji}|{str character name transcription}|{str pic}|{anime blocks}|{int episode list}|{int last update date}|{int2 type}|{str gender}
    <td>int4 episode vote count</td>
 
    </tr>
: An 'anime block' is {int anime id},{int appearance},{int creatorid},{boolean is_main_seiyuu} repeated as many times as necessary, separated by a single quote ( ' ).
    <tr bgcolor="#eeeeee">
 
    <td>1</td>
* 335 NO SUCH CHARACTER
    <td align="right">2</td>
 
    <td>unused</td>
'''Info:'''
    </tr>
* If no seiyuu is associated with the character for a given aid, the 'creatorid' and 'is_main_seiyuu' fields will be empty, but the commas will remain.
    <tr>
* An empty episode list is "undefined": no episode values have been added.
    <td>0</td>
* ''appearance'' values: 0='appears in', 1='cameo appearance in', 2='main character in', 3='secondary cast in'
    <td align="right">1</td>
 
    <td>unused</td>
Example:
    </tr>
 
  </table>
  CHARACTER charid=488&s=DChan
  </td>
  235 CHARACTER
  <td>
  488|ニコ・ロビン|Nico Robin|14789.jpg|4097,2,1900,1'69,2,1901,0'6199,0,1900,1'5691,0,1900,1'2644,0,,'4851,0,1900,1||1236938094
  <table>
 
    <tr>
== MyList Commands ==
    <td>'''Bit'''</td>
=== MYLIST: Retrieve MyList Data ===
    <td align="right">'''Dec'''</td>
'''Command String:'''<br>
    <td>'''Data Field'''</td>
by lid: (mylist id)
    </tr>
* MYLIST lid={int4 lid}
    <tr>
by fid:
    <td>7</td>
* MYLIST fid={int4 fid}
    <td align="right">128</td>
by size+ed2k hash:
    <td>str group name</td>
* MYLIST size={int4 size}&ed2k={str ed2khash}
    </tr>
by anime + group + epno
    <tr bgcolor="#eeeeee">
* MYLIST aname={str anime name}[&gname={str group name}&epno={int4 episode number}]
    <td>6</td>
* MYLIST aname={str anime name}[&gid={int4 group id}&epno={int4 episode number}]
    <td align="right">64</td>
* MYLIST aid={int4 anime id}[&gname={str group name}&epno={int4 episode number}]
    <td>str group short name</td>
* MYLIST aid={int4 anime id}[&gid={int4 group id}&epno={int4 episode number}]
    </tr>
 
    <tr>
'''Possible Replies:'''
    <td>5</td>
* 221 MYLIST
    <td align="right">32</td>
: {int4 lid}|{int4 fid}|{int4 eid}|{int4 aid}|{int4 gid}|{int4 date}|{int2 state}|{int4 viewdate}|{str storage}|{str source}|{str other}|{int2 filestate}
    <td>unused</td>
* 312 MULTIPLE MYLIST ENTRIES
    </tr>
: {str anime title}|{int episodes}|{str eps with state unknown}|{str eps with state on hhd}|{str eps with state on cd}|{str eps with state deleted}|{str watched eps}|{str group 1 short name}|{str eps for group 1}|...|{str group N short name}|{str eps for group N}
    <tr bgcolor="#eeeeee">
* 321 NO SUCH ENTRY
    <td>4</td>
    <td align="right">16</td>
    <td>unused</td>
    </tr>
    <tr>
    <td>3</td>
    <td align="right">8</td>
    <td>unused</td>
    </tr>
    <tr bgcolor="#eeeeee">
    <td>2</td>
    <td align="right">4</td>
    <td>unused</td>
    </tr>
    <tr>
    <td>1</td>
    <td align="right">2</td>
    <td>unused</td>
    </tr>
    <tr bgcolor="#eeeeee">
    <td>0</td>
    <td align="right">1</td>
    <td>int4 date aid record updated</td>
    </tr>
  </table>
  </td>
</tr>
</table>


'''Info:'''
'''Examples:''' (html escaped code intended)
* The state field provides information about the location and sharing state of a file in MyList.
  > FILE size=177747474&ed2k=70cd93fd3981cc80a8ea6a646ff805c9&fmask=7FF8FEF8&amask=C000F0C0&s=xxxxx
* If files are added after hashing, a client should specify the state as 1 (on HDD) (if the user doesn't explicitly select something else).
  < 220 FILE
* eps is a list of episodes, e.g. "1-12,14-16,T1"
  312498|4688|69260|4243|0||0|1|177747474|70cd93fd3981cc80a8ea6a646ff805c9|b2a7c7d591333e20495de3571b235c28|7af9b962c17ff729baeee67533e5219526cd5095|a200fe73|high|DTV|Vorbis (Ogg Vorbis)|104|H264/AVC|800|704x400|japanese|english'english'english|1560||1175472000|26|26|01|The Wings to the Sky|Sora he no Tsubasa|????|#nanoha-DamagedGoodz|Nanoha-DGz
 
----
 
=== GROUP: Retrieve Group Data ===
'''Command String:'''<br>
by gid
* GROUP gid={int gid}
by name/shortname
* GROUP gname={str group name}


'''States:'''
'''Possible Replies:'''
  0 - unknown - state is unknown or the user doesn't want to provide this information
* 250 GROUP
  1 - on hdd - the file is stored on hdd (but is not shared)
: {int gid}|{int4 rating}|{int votes}|{int4 acount}|{int fcount}|{str name}|{str short}|{str irc channel}|{str irc server}|{str url}|{str picname}|{int4 foundeddate}|{int4 disbandeddate}|{int2 dateflags}|{int4 lastreleasedate}|{int4 lastactivitydate}|{list grouprelations}
  2 - on cd - the file is stored on cd
* 350 NO SUCH GROUP
  3 - deleted - the file has been deleted or is not available for other reasons (i.e. reencoded)


'''Filestates:''' (for normal files, i.e. not generic)
'''Info:'''
  0  => normal/original
* Requires login
  1  => corrupted version/invalid crc
* ''gname'' is an exact match of either a group name or short name
  2  => self edited
* As either name and short names are unique if there is a result from GROUP request by name that will be the only match
  10  => self ripped
* ''dateflags'' values:
  11  => on dvd
** bit0 set == Foundeddate, Unknown Day
  12 => on vhs
** bit1 set == Foundeddate, Unknown Month, Day
  13  => on tv
** bit2 set == Disbandeddate, Unknown Day
  14  => in theaters
** bit3 set == Disbandeddate, Unknown Month, Day
  15  => streamed
** bit5 set == Foundeddate, Unknown Year
  100 => other
** bit6 set == Disbandeddate, Unknown Year
* ''releasedate'' and ''activitydate'' are distinct.  ''releasedate'' is the date a file was actually released by the group, where ''activitydate'' is the date of a file being added to AniDB. As such, lastrelease may very well be much older than lastactivity.
* ''groupreleations'' is a list of apostrophe-separated pairs, where each pair consists of {int4 othergroupid},{int2 relationtype}
** relationtype:
*** 1 => "Participant in"
*** 2 => "Parent of"
*** 4 => "Merged from"
*** 5 => "Now known as"
*** 6 => "Other"


'''Example:'''
'''Example:'''
   > MYLIST aname=gits sac&s=xxxxx
   > GROUP gid=7091&s=bunny
   < 322 MULTIPLE FILES FOUND
   < 250 GROUP
   Koukaku Kidoutai STAND ALONE COMPLEX|26||1-26|1-26,S2-S27|||V-A|S2-S27|LMF|20-26|KAA|1-26|AonE|1-19|Anime-MX|1-3,9-20
   7091|832|1445|43|566|Frostii|Frostii|#frostii|irc.rizon.net|<nowiki>http://frostii.com</nowiki>|15844.jpg|1228089600|0|1|1301875200|1304222640|7255,1'3097,4'748,4'8106,1'8159,2'8402,1'8696,1'9022,1


----
----
=== MYLISTADD: Add file to MyList ===
The command string for MYLISTADD is made of up two blocks: a 'fileinfo' block, which limits the command to a specific file, or an 'animeinfo'/'groupinfo'/'episodeinfo' block, which can be used to specify a range of files, including generics.  Additionally, a number of optional parameters can be included with either set.


'''Adding a single file to the MyList with the 'fileinfo' block'''
=== GROUPSTATUS: Get Completed Episode ===
Returns a list of group names and ranges of episodes released by the group for a given anime.


* MYLISTADD fid={int4 fid}
'''Command String:'''
'''or'''
* GROUPSTATUS aid={int animeid}[&state={int completion_state}]
* MYLISTADD size={int4 size}&ed2k={str ed2khash}
'''or'''
* MYLISTADD lid={int4 lid}&edit=1  (valid for edit only)


'''Adding one or more files to the MyList with the 'animeinfo'/'groupinfo'/'episodeinfo' block'''
'''Possible Replies:'''
* 225 GROUPSTATUS
: {int group id}|{str group name}|{int completion state}|{int last episode number}|{int rating}|{int votes}|{str episode range}\n
: {int group id}|{str group name}|{int completion state}|{int last episode number}|{int rating}|{int votes}|{str episode range}\n
: ... (repeated)


Here, you have a number of options, depending on what data you have available.  In brief, 'animeinfo' represents a choice between anime id and anime name.  'groupinfo' represents a choice between group id, group name, and generic=1.  'episodeinfo' represents a range of one or more episodes.
* 325 NO SUCH GROUPS FOUND
* 330 NO SUCH ANIME


* MYLISTADD aid={int4 aid}&gid={int gid}&epno={int4 episode number}
'''Info:'''
'''or'''
* The seven fields will be repeated as necessary, one for each group, separated by a new line character
* MYLISTADD aid={int4 aid}&gname={str group_name}&epno={int4 episode number}
* Groups will be filtered by the languages selected in the user's profile
'''or'''
* If ''state'' is not supplied, groups with a completion state of <i>'ongoing'</i>, <i>'finished'</i>, or <i>'complete'</i> are returned
* MYLISTADD aid={int4 aid}&generic=1&epno={int4 episode number}
* Groups are returned in order of descending episode count
'''or'''
* If there are more groups to return than can be stored in a UDP packet, additional groups will be silently discarded
* MYLISTADD aname={str anime_name}&gid={int gid}&epno={int4 episode number}
* ''state'' values:
'''or'''
#ongoing
* MYLISTADD aname={str anime_name}&gname={str group_name}&epno={int4 episode number}
#stalled
'''or'''
#complete
* MYLISTADD aname={str anime_name}&generic=1&epno={int4 episode number}
#dropped
#finished
#specials only


Each command listed can have, in addition, a number of optional components to provide further MyList details.  Append these as desired.
'''Example:'''
  > GROUP GROUPSTATUS aid=8692&s=vLl1N
  < 225 GROUPSTATUS
  7407|Coalgirls|3|25|839|12|1-25
  9863|Hadena Subs|3|25|374|1|1-25
  11951|ChaosBlades|3|25|0|0|1-25
  [truncated]


* &state={int2 state}
=== UPDATED: Get List of Updated Anime IDs ===
* &viewed={boolean viewed}
Returns a list of AniDB anime ids of anime that have been updated in in a given time frame, ordered by descending age (oldest to newest change).
* &viewdate={int4 viewdate}
* &source={str source}
* &storage={str storage}
* &other={str other}


Finally, edit=1 can be included to edit a MyList entry instead of creating a new one.  When editing, optional values that are not supplied retain their original value.  That is, they are ''not'' replaced with default or empty values.  Only values supplied are updated.
'''Command String:'''
* UPDATED entity=1&[age={int4 id}|time={int4 date}]


'''Possible Replies:'''
'''Possible Replies:'''
* 320 NO SUCH FILE
* 243 UPDATED
* 330 NO SUCH ANIME
{int entity}|{int total count}|{int last update date}|{list aid}
* 350 NO SUCH GROUP
 
when edit=0 and adding by fid, size/ed2k
* 343 NO UPDATES
* 210 MYLIST ENTRY ADDED
 
: {int4 mylist id of new entry}
'''Info:'''
when edit=0 and adding by aname, aid
* ''entity'' is always 1
* 210 MYLIST ENTRY ADDED
* Either ''age'' OR ''time'' can be specified, but not both
: {int4 number of entries added}
* ''age'' is specified in days.
* 310 FILE ALREADY IN MYLIST
** eg: age=30 requests a list of aid values of anime that have changed in the past 30 days
* 322 MULTIPLE FILES FOUND
* ''time'' is specified in unix time.
: {int4 fid 1}|{int4 fid 2}|...|{int4 fid n}
** eg: time=1264982400 requests a list of aid values of anime that have changed since 2010-02-01
when edit=1
* A maximum of 200 values will be returned
* 311 MYLIST ENTRY EDITED
* ''count'' specifies the total number of items found for the given time period.  In short, if this value is great than 200, you have not retrieved all applicable ids.
* 311 MYLIST ENTRY EDITED
* ''last update date'' will contain the AniDB update time of the ''last'' aid to appear on the list
: {int4 number of entries edited}
* A given list value will appear only once.  If there have been multiple changes to an entity, its age will reflect the most recent change.
* 411 NO SUCH MYLIST ENTRY
 
 
'''An anime will be considered updated if:'''
'''Info:'''
* A change is made to the anime record itself
* All data except lid/fid/size+hash/generic is optional.
* An ''main'' or ''official'' anime title is added, edited, or deleted (not ''short'' or ''synonym'')
* Viewed should be 0 for unwatched files and 1 for watched files.
* An episode for the anime is added, or deleted (but NOT edited!)
* if viewdate is not specified, the current time will be used. The field will be disregarded if viewed=0.
* An episode title is added, edited, or deleted
* Other is the only field which may contain newlines, but they have to be stored as &lt;br /&gt;
* An anime relation is added, or deleted
* For state values refer to: '''MYLIST'''
 
* If you want to change an existing entry and already know its MyList id (lid) please use the lid-version of this command. It put less load on the server.
== MyList Commands ==
* epno=0 means all eps (default), negative numbers means upto. (-12 -> upto 12)
=== MYLIST: Retrieve MyList Data ===
* group is optional only when edit=1, meaning you can't add every file for an anime
 
----
=== MYLISTDEL: Remove file from MyList ===
'''Command String:'''<br>
'''Command String:'''<br>
by lid: (mylist id)
by lid: (mylist id)
* MYLISTDEL lid={int4 lid}
* MYLIST lid={int4 lid}
by fid:
by fid:
* MYLISTDEL fid={int4 fid}
* MYLIST fid={int4 fid}
by size+ed2k hash:
by size+ed2k hash:
* MYLISTDEL size={int4 size}&ed2k={str ed2k hash}
* MYLIST size={int4 size}&ed2k={str ed2khash}
by anime + group + epno
by anime + group + epno
* MYLISTDEL aname={str anime name}[&gname={str group name}&epno={int4 episode number}]
* MYLIST aname={str anime name}[&gname={str group name}&epno={int4 episode number}]
* MYLISTDEL aname={str anime name}[&gid={int4 group id}&epno={int4 episode number}]
* MYLIST aname={str anime name}[&gid={int4 group id}&epno={int4 episode number}]
* MYLISTDEL aid={int4 anime id}[&gname={str group name}&epno={int4 episode number}]
* MYLIST aid={int4 anime id}[&gname={str group name}&epno={int4 episode number}]
* MYLISTDEL aid={int4 anime id}[&gid={int4 group id}&epno={int4 episode number}]
* MYLIST aid={int4 anime id}[&gid={int4 group id}&epno={int4 episode number}]


'''Possible Replies:'''
'''Possible Replies:'''
* 211 MYLIST ENTRY DELETED
* 221 MYLIST
: {int4 number of entries}
: {int4 lid}|{int4 fid}|{int4 eid}|{int4 aid}|{int4 gid}|{int4 date}|{int2 state}|{int4 viewdate}|{str storage}|{str source}|{str other}|{int2 filestate}
* 411 NO SUCH MYLIST ENTRY
* 312 MULTIPLE MYLIST ENTRIES
: {str anime title}|{int episodes}|{str eps with state unknown}|{str eps with state on hhd}|{str eps with state on cd}|{str eps with state deleted}|{str watched eps}|{str group 1 short name}|{str eps for group 1}|...|{str group N short name}|{str eps for group N}
* 321 NO SUCH ENTRY
 
'''Info:'''
'''Info:'''
* group is optional
* The state field provides information about the location and sharing state of a file in MyList.
* command will delete all enties found
* If files are added after hashing, a client should specify the state as 1 (on HDD) (if the user doesn't explicitly select something else).
* eps is a list of episodes, e.g. "1-12,14-16,T1"
 
'''States:'''
  0 - unknown - state is unknown or the user doesn't want to provide this information
  1 - internal storage - the file is stored on hdd (but is not shared)
  2 - external storage - the file is stored on cd/dvd/...
  3 - deleted - the file has been deleted or is not available for other reasons (i.e. reencoded)
  4 - remote storage - the file is stored on NAS/cloud/...
 
'''Filestates:''' (for normal files, i.e. not generic)
  0  => normal/original
  1  => corrupted version/invalid crc
  2  => self edited
  10  => self ripped
  11  => on dvd
  12  => on vhs
  13  => on tv
  14  => in theaters
  15  => streamed
  100 => other
 
'''Example:'''
  > MYLIST aname=gits sac&s=xxxxx
  < 322 MULTIPLE FILES FOUND
  Koukaku Kidoutai STAND ALONE COMPLEX|26||1-26|1-26,S2-S27|||V-A|S2-S27|LMF|20-26|KAA|1-26|AonE|1-19|Anime-MX|1-3,9-20
 
----
 
=== MYLISTADD: Add file to MyList ===
The command string for MYLISTADD is made of up two blocks: a 'fileinfo' block, which limits the command to a specific file, or an 'animeinfo'/'groupinfo'/'episodeinfo' block, which can be used to specify a range of files, including generics.  Additionally, a number of optional parameters can be included with either set.
 
'''Adding a single file to the MyList with the 'fileinfo' block'''
 
* MYLISTADD fid={int4 fid}
'''or'''
* MYLISTADD size={int4 size}&ed2k={str ed2khash}
'''or'''
* MYLISTADD lid={int4 lid}&edit=1  (valid for edit only)
 
'''Adding one or more files to the MyList with the 'animeinfo'/'groupinfo'/'episodeinfo' block'''
 
Here, you have a number of options, depending on what data you have available.  In brief, 'animeinfo' represents a choice between anime id and anime name.  'groupinfo' represents a choice between group id, group name, and generic=1.  'episodeinfo' represents a range of one or more episodes.
 
* MYLISTADD aid={int4 aid}&gid={int gid}&epno={int4 episode number}
'''or'''
* MYLISTADD aid={int4 aid}&gname={str group_name}&epno={int4 episode number}
'''or'''
* MYLISTADD aid={int4 aid}&generic=1&epno={int4 episode number}
'''or'''
* MYLISTADD aname={str anime_name}&gid={int gid}&epno={int4 episode number}
'''or'''
* MYLISTADD aname={str anime_name}&gname={str group_name}&epno={int4 episode number}
'''or'''
* MYLISTADD aname={str anime_name}&generic=1&epno={int4 episode number}
 
Each command listed can have, in addition, a number of optional components to provide further MyList details.  Append these as desired.
 
* &state={int2 state}
* &viewed={boolean viewed}
* &viewdate={int4 viewdate}
* &source={str source}
* &storage={str storage}
* &other={str other}
 
Finally, edit=1 can be included to edit a MyList entry instead of creating a new one.  When editing, optional values that are not supplied retain their original value.  That is, they are ''not'' replaced with default or empty values.  Only values supplied are updated.


----
=== MYLISTSTATS : Retrieve MyList stats ===
'''Command String:'''
* MYLISTSTATS
'''Possible Replies:'''
'''Possible Replies:'''
* 222 MYLIST STATS
* 320 NO SUCH FILE
{animes}|{eps}|{files}|{size of files}|{added animes}|{added eps}|{added files}|{added groups}|{leech %}|{glory %}|{viewed % of db}|{mylist % of db}|{viewed % of mylist}|{number of viewed eps}|{votes}|{reviews}
* 330 NO SUCH ANIME
* 350 NO SUCH GROUP
when edit=0 and adding by fid, size/ed2k
* 210 MYLIST ENTRY ADDED
: {int4 mylist id of new entry}
when edit=0 and adding by aname, aid
* 210 MYLIST ENTRY ADDED
: {int4 number of entries added}
* 310 FILE ALREADY IN MYLIST
: {int4 lid}|{int4 fid}|{int4 eid}|{int4 aid}|{int4 gid}|{int4 date}|{int2 state}|{int4 viewdate}|{str storage}|{str source}|{str other}|{int2 filestate}
* 322 MULTIPLE FILES FOUND
: {int4 fid 1}|{int4 fid 2}|...|{int4 fid n}
when edit=1
* 311 MYLIST ENTRY EDITED
* 311 MYLIST ENTRY EDITED
: {int4 number of entries edited}
* 411 NO SUCH MYLIST ENTRY
 
'''Info:'''
* All data except lid/fid/size+hash/generic is optional.
* Viewed should be 0 for unwatched files and 1 for watched files.
* If viewdate is not specified, the current time will be used. The field will be disregarded if viewed=0.
* Other is the only field which may contain newlines, but they have to be stored as &lt;br /&gt;
* For state values refer to: '''MYLIST'''
* If you want to change an existing entry and already know its MyList id (lid) please use the lid-version of this command. It put less load on the server.
* epno=0 means all eps (default), negative numbers means upto. (-12 -> upto 12)
* group is optional only when edit=1, meaning you can't add every file for an anime
* If the file already exists (response code 310), the ''current'' record will be returned, in the same format as the MYLIST response.
----
 
=== MYLISTDEL: Remove file from MyList ===
'''Command String:'''<br>
by lid: (mylist id)
* MYLISTDEL lid={int4 lid}
by fid:
* MYLISTDEL fid={int4 fid}
by size+ed2k hash:
* MYLISTDEL size={int4 size}&ed2k={str ed2k hash}
by anime + group + epno
* MYLISTDEL aname={str anime name}[&gname={str group name}&epno={int4 episode number}]
* MYLISTDEL aname={str anime name}[&gid={int4 group id}&epno={int4 episode number}]
* MYLISTDEL aid={int4 anime id}[&gname={str group name}&epno={int4 episode number}]
* MYLISTDEL aid={int4 anime id}[&gid={int4 group id}&epno={int4 episode number}]
 
'''Possible Replies:'''
* 211 MYLIST ENTRY DELETED
: {int4 number of entries}
* 411 NO SUCH MYLIST ENTRY
'''Info:'''
* group is optional
* command will delete all enties found
 
----
=== MYLISTSTATS : Retrieve MyList stats ===
'''Command String:'''
* MYLISTSTATS
'''Possible Replies:'''
* 222 MYLIST STATS
{animes}|{eps}|{files}|{size of files}|{added animes}|{added eps}|{added files}|{added groups}|{leech %}|{glory %}|{viewed % of db}|{mylist % of db}|{viewed % of mylist}|{number of viewed eps}|{votes}|{reviews}|{viewed length in minutes}
 
'''Info:'''
* All fields are int
 
----
 
=== VOTE: Vote for specified anime/episode/group ===
'''Command String:'''<br>
by id
* VOTE type={int2 type}&id={int4 id}[&value={int4 vote value}&epno={int4 episode number}]
* VOTE type={int2 type}&id={int4 id}[&value={int4 vote value}&epno={str episode number}]
by name
* VOTE type={int2 type}&name={string name}[&value={int4 vote value}&epno={int4 episode number}]
* VOTE type={int2 type}&name={string name}[&value={int4 vote value}&epno={str episode number}]
 
'''Possible Replies:'''
* 260 VOTED
: {str entity name}|{vote value}|{vote type}|{entity id}
* 261 VOTE FOUND
: {str entity name}|{vote value}|{vote type}|{entity id}
* 262 VOTE UPDATED
: {str entity name}|{old vote value}|{vote type}|{entity id}
* 263 VOTE REVOKED
: {str entity name}|{revoked vote value}|{vote type}|{entity id}
* 360 NO SUCH VOTE
: {str entity name}|0|{vote type}|{entity id}
* 361 INVALID VOTE TYPE
* 362 INVALID VOTE VALUE
* 363 PERMVOTE NOT ALLOWED
: {str aname}|{vote value}|{type}|{entity id}
* 364 ALREADY PERMVOTED
: {str entity name}|{existing vote value}|{vote type}|{entity id}
 
'''Example:'''
  VOTE type=1&id=5101&value=950
  260 VOTED
  Clannad|950|1|5101


'''Info:'''
  VOTE type=1&id=5101&value=950&epno=S2
* All fields are int
  260 VOTED
  Another World: Tomoyo Arc|950|1|91981


----
  VOTE type=6&id=91981&value=950
=== VOTE: Vote for specified anime/episode/group ===
  260 VOTED
'''Command String:'''<br>
  Another World: Tomoyo Arc|950|1|91981
by id
* VOTE type={int2 type}&id={int4 id}[&value={int4 vote value}&epno={int4 episode number}]
by name
* VOTE type={int2 type}&name={string name}[&value={int4 vote value}&epno={int4 episode number}]
 
'''Possible Replies:'''
* 260 VOTED
: {str entity name}|{vote value}|{vote type}|{entity id}
* 261 VOTE FOUND
: {str entity name}|{vote value}|{vote type}|{entity id}
* 262 VOTE UPDATED
: {str entity name}|{old vote value}|{vote type}|{entity id}
* 263 VOTE REVOKED
: {str entity name}|{revoked vote value}|{vote type}|{entity id}
* 360 NO SUCH VOTE
: {str entity name}|0|{vote type}|{entity id}
* 361 INVALID VOTE TYPE
* 362 INVALID VOTE VALUE
* 363 PERMVOTE NOT ALLOWED
: {str aname}|{vote value}|{type}|{entity id}
* 364 ALREADY PERMVOTED
: {str entity name}|{existing vote value}|{vote type}|{entity id}


'''Info:'''
'''Info:'''
* type: 1=anime, 2=anime tmpvote, 3=group
* Type: 1=anime, 2=anime tmpvote, 3=group, 6=episode
* entity: anime, episode, or group
* Entity: anime, episode, or group
* for episode voting add epno on type=1
* For episode voting add epno on type=1, or specify type=6 if eid is known
* value: negative number means revoke, 0 means retrieve (default), 100-1000 are valid vote values, rest is illegal
* Value: negative number means revoke, 0 means retrieve (default), 100-1000 are valid vote values, rest is illegal
* votes will be updated automatically (no questions asked)
* Votes will be updated automatically (no questions asked)
* tmpvoting when there exist a perm vote is not possible
* Tmpvoting when there exist a perm vote is not possible


----
----
Line 1,768: Line 2,005:


'''Possible Replies:'''
'''Possible Replies:'''
* 217 Export Queued
* 217 EXPORT QUEUED
* 218 Export Cancelled
* 218 EXPORT CANCELLED
* 317 No Such Template
* 317 EXPORT NO SUCH TEMPLATE
* 318 Export Already In Queue
* 318 EXPORT ALREADY IN QUEUE
* 319 No Export In Queue or Export In Progress
* 319 EXPORT NO EXPORT QUEUED OR IS PROCESSING


'''Info:'''
'''Info:'''
Line 1,858: Line 2,095:
=== USER: Retrieve User UID ===
=== USER: Retrieve User UID ===
'''Command String:'''
'''Command String:'''
* USER user={str user name}
* USER [user={str user name}|uid={int user id}]


'''Possible Replies:'''
'''Possible Replies:'''
* 394 NO SUCH USER
* 394 NO SUCH USER
* 295 USER
* 295 USER
: {int4 uid}
: {int4 uid}|{str username}


----
----
Line 1,912: Line 2,149:


== Return Codes ==
== Return Codes ==
{{eyecatch|Note|The names below do '''not''' necessarily reflect the actual code strings returned by the server.}}
{{eyecatch|Note|While the names below '''are''' the actual code strings returned by the server, clients are nonetheless encouraged to work with the numeric codes instead. }}
<pre>
<pre>
// POSITIVE 2XX
LOGIN_ACCEPTED                           = 200
 
LOGIN_ACCEPTED_NEW_VERSION              = 201
LOGIN_ACCEPTED =200, //a
LOGGED_OUT                               = 203
LOGIN_ACCEPTED_NEW_VER =201, //a
RESOURCE                                 = 205
LOGGED_OUT =203, //a
STATS                                   = 206
RESOURCE =205, //d
TOP                                     = 207
STATS =206, //b
UPTIME                                   = 208
TOP =207, //b
ENCRYPTION_ENABLED                       = 209
UPTIME =208, //b
MYLIST_ENTRY_ADDED                       = 210
ENCRYPTION_ENABLED =209, //c
MYLIST_ENTRY_DELETED                     = 211
 
ADDED_FILE                               = 214
MYLIST_ENTRY_ADDED =210, //a
ADDED_STREAM                             = 215
MYLIST_ENTRY_DELETED =211, //a
EXPORT_QUEUED                            = 217
 
EXPORT_CANCELLED                        = 218
ADDED_FILE =214, //e
ENCODING_CHANGED                         = 219
ADDED_STREAM =215, //e
FILE                                     = 220
 
MYLIST                                   = 221
ENCODING_CHANGED =219, //c
MYLIST_STATS                             = 222
 
WISHLIST                                = 223
FILE =220, //a
NOTIFICATION                            = 224
MYLIST =221, //a
GROUP_STATUS                            = 225
MYLIST_STATS =222, //b
WISHLIST_ENTRY_ADDED                    = 226
 
WISHLIST_ENTRY_DELETED                  = 227
ANIME =230, //b
WISHLIST_ENTRY_UPDATED                  = 228
ANIME_BEST_MATCH =231, //b
MULTIPLE_WISHLIST                        = 229
RANDOMANIME =232, //b
ANIME                                   = 230
        ANIME_DESCRIPTION                       =233, //b
ANIME_BEST_MATCH                         = 231
 
RANDOM_ANIME                            = 232
EPISODE =240, //b
ANIME_DESCRIPTION                       = 233
PRODUCER =245, //b
REVIEW                                  = 234
GROUP =250, //b
CHARACTER                                = 235
 
SONG                                    = 236
BUDDY_LIST =253, //c
ANIMETAG                                = 237
BUDDY_STATE =254, //c
CHARACTERTAG                            = 238
BUDDY_ADDED =255, //c
EPISODE                                 = 240
BUDDY_DELETED =256, //c
UPDATED                                  = 243
BUDDY_ACCEPTED =257, //c
TITLE                                    = 244
BUDDY_DENIED =258, //c
CREATOR                                  = 245
NOTIFICATION_ENTRY_ADDED                = 246
NOTIFICATION_ENTRY_DELETED              = 247
NOTIFICATION_ENTRY_UPDATE                = 248
MULTIPLE_NOTIFICATION                    = 249
GROUP                                   = 250
CATEGORY                                = 251
BUDDY_LIST                               = 253
BUDDY_STATE                             = 254
BUDDY_ADDED                             = 255
BUDDY_DELETED                           = 256
BUDDY_ACCEPTED                           = 257
BUDDY_DENIED                             = 258
VOTED                                    = 260
VOTE_FOUND                              = 261
VOTE_UPDATED                            = 262
VOTE_REVOKED                            = 263
HOT_ANIME                                = 265
RANDOM_RECOMMENDATION                    = 266
RANDOM_SIMILAR                          = 267
NOTIFICATION_ENABLED                    = 270
NOTIFYACK_SUCCESSFUL_MESSAGE            = 281
NOTIFYACK_SUCCESSFUL_NOTIFICATION        = 282
NOTIFICATION_STATE                      = 290
NOTIFYLIST                              = 291
NOTIFYGET_MESSAGE                        = 292
NOTIFYGET_NOTIFY                        = 293
SENDMESSAGE_SUCCESSFUL                  = 294
USER_ID                                  = 295
CALENDAR                                = 297


VOTED =260, //b
PONG                                    = 300
VOTE_FOUND =261, //b
AUTHPONG                                = 301
VOTE_UPDATED =262, //b
NO_SUCH_RESOURCE                        = 305
VOTE_REVOKED =263, //b
API_PASSWORD_NOT_DEFINED                = 309
FILE_ALREADY_IN_MYLIST                  = 310
MYLIST_ENTRY_EDITED                      = 311
MULTIPLE_MYLIST_ENTRIES                  = 312
WATCHED                                  = 313
SIZE_HASH_EXISTS                        = 314
INVALID_DATA                            = 315
STREAMNOID_USED                          = 316
EXPORT_NO_SUCH_TEMPLATE                  = 317
EXPORT_ALREADY_IN_QUEUE                  = 318
EXPORT_NO_EXPORT_QUEUED_OR_IS_PROCESSING = 319
NO_SUCH_FILE                            = 320
NO_SUCH_ENTRY                            = 321
MULTIPLE_FILES_FOUND                    = 322
NO_SUCH_WISHLIST                        = 323
NO_SUCH_NOTIFICATION                    = 324
NO_GROUPS_FOUND                          = 325
NO_SUCH_ANIME                            = 330
NO_SUCH_DESCRIPTION                      = 333
NO_SUCH_REVIEW                          = 334
NO_SUCH_CHARACTER                        = 335
NO_SUCH_SONG                            = 336
NO_SUCH_ANIMETAG                        = 337
NO_SUCH_CHARACTERTAG                    = 338
NO_SUCH_EPISODE                          = 340
NO_SUCH_UPDATES                          = 343
NO_SUCH_TITLES                          = 344
NO_SUCH_CREATOR                          = 345
NO_SUCH_GROUP                            = 350
NO_SUCH_CATEGORY                        = 351
BUDDY_ALREADY_ADDED                      = 355
NO_SUCH_BUDDY                            = 356
BUDDY_ALREADY_ACCEPTED                  = 357
BUDDY_ALREADY_DENIED                    = 358
NO_SUCH_VOTE                            = 360
INVALID_VOTE_TYPE                        = 361
INVALID_VOTE_VALUE                      = 362
PERMVOTE_NOT_ALLOWED                    = 363
ALREADY_PERMVOTED                        = 364
HOT_ANIME_EMPTY                          = 365
RANDOM_RECOMMENDATION_EMPTY              = 366
RANDOM_SIMILAR_EMPTY                    = 367
NOTIFICATION_DISABLED                    = 370
NO_SUCH_ENTRY_MESSAGE                    = 381
NO_SUCH_ENTRY_NOTIFICATION              = 382
NO_SUCH_MESSAGE                          = 392
NO_SUCH_NOTIFY                          = 393
NO_SUCH_USER                            = 394
CALENDAR_EMPTY                          = 397
NO_CHANGES                              = 399


NOTIFICATION_ENABLED =270, //a
NOT_LOGGED_IN                            = 403
NOTIFICATION_NOTIFY =271, //a
NO_SUCH_MYLIST_FILE                      = 410
NOTIFICATION_MESSAGE =272, //a
NO_SUCH_MYLIST_ENTRY                    = 411
NOTIFICATION_BUDDY =273, //c
MYLIST_UNAVAILABLE                      = 412
NOTIFICATION_SHUTDOWN =274, //c
PUSHACK_CONFIRMED =280, //a
NOTIFYACK_SUCCESSFUL_M =281, //a
NOTIFYACK_SUCCESSFUL_N =282, //a
NOTIFICATION =290, //a
NOTIFYLIST =291, //a
NOTIFYGET_MESSAGE =292, //a
NOTIFYGET_NOTIFY =293, //a


SENDMSG_SUCCESSFUL =294, //a
LOGIN_FAILED                            = 500
USER =295, //d
LOGIN_FIRST                              = 501
ACCESS_DENIED                            = 502
CLIENT_VERSION_OUTDATED                  = 503
CLIENT_BANNED                            = 504
ILLEGAL_INPUT_OR_ACCESS_DENIED          = 505
INVALID_SESSION                          = 506
NO_SUCH_ENCRYPTION_TYPE                  = 509
ENCODING_NOT_SUPPORTED                  = 519
BANNED                                  = 555
UNKNOWN_COMMAND                          = 598


// AFFIRMATIVE/NEGATIVE 3XX
INTERNAL_SERVER_ERROR                    = 600
ANIDB_OUT_OF_SERVICE                    = 601
SERVER_BUSY                              = 602
NO_DATA                                  = 603
TIMEOUT - DELAY AND RESUBMIT            = 604
API_VIOLATION                            = 666


PONG =300, //a
PUSHACK_CONFIRMED                        = 701
AUTHPONG =301, //c
NO_SUCH_PACKET_PENDING                  = 702
NO_SUCH_RESOURCE =305, //d
API_PASSWORD_NOT_DEFINED =309, //c


FILE_ALREADY_IN_MYLIST =310, //a
VERSION                                  = 998</pre>
MYLIST_ENTRY_EDITED =311, //a
MULTIPLE_MYLIST_ENTRIES =312, //e
 
SIZE_HASH_EXISTS =314, //c
INVALID_DATA =315, //c
STREAMNOID_USED =316, //c
 
NO_SUCH_FILE =320, //a
NO_SUCH_ENTRY =321, //a
MULTIPLE_FILES_FOUND =322, //b
 
NO_SUCH_ANIME =330, //b
        NO_SUCH_ANIME_DESCRIPTION              =333, //b
NO_SUCH_EPISODE =340, //b
NO_SUCH_PRODUCER =345, //b
NO_SUCH_GROUP =350, //b
 
BUDDY_ALREADY_ADDED =355, //c
NO_SUCH_BUDDY =356, //c
BUDDY_ALREADY_ACCEPTED =357, //c
BUDDY_ALREADY_DENIED =358, //c
 
NO_SUCH_VOTE =360, //b
INVALID_VOTE_TYPE =361, //b
INVALID_VOTE_VALUE =362, //b
PERMVOTE_NOT_ALLOWED =363, //b
ALREADY_PERMVOTED =364, //b
 
NOTIFICATION_DISABLED =370, //a
NO_SUCH_PACKET_PENDING =380, //a
NO_SUCH_ENTRY_M =381, //a
NO_SUCH_ENTRY_N =382, //a
 
NO_SUCH_MESSAGE =392, //a
NO_SUCH_NOTIFY =393, //a
NO_SUCH_USER =394, //a
 
 
// NEGATIVE 4XX
 
 
NOT_LOGGED_IN =403, //a
 
NO_SUCH_MYLIST_FILE =410, //a
NO_SUCH_MYLIST_ENTRY =411, //a
 
 
// CLIENT SIDE FAILURE 5XX
 
 
LOGIN_FAILED =500, //a
LOGIN_FIRST =501, //a
ACCESS_DENIED =502, //a
CLIENT_VERSION_OUTDATED =503, //a
CLIENT_BANNED =504, //a
ILLEGAL_INPUT_OR_ACCESS_DENIED =505, //a
INVALID_SESSION =506, //a
NO_SUCH_ENCRYPTION_TYPE =509, //c
ENCODING_NOT_SUPPORTED =519, //c
 
BANNED =555, //a
UNKNOWN_COMMAND =598, //a
 
 
// SERVER SIDE FAILURE 6XX
 
 
INTERNAL_SERVER_ERROR =600, //a
ANIDB_OUT_OF_SERVICE =601, //a
SERVER_BUSY =602, //d
API_VIOLATION =666, //a
</pre>


[[Category:Development]]
[[Category:Development]]
[[Category:UDP]]
[[Category:UDP]]
[[Category:API]]
[[Category:API]]
MediaWiki spam blocked by CleanTalk.
MediaWiki spam blocked by CleanTalk.