A tool for adding anime to your anidb list.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

286 lines
12KB

  1. #ifndef _API_H
  2. #define _API_H
  3. #include <stdint.h>
  4. #include <time.h>
  5. #include <stdbool.h>
  6. #include "error.h"
  7. #define API_VERSION "3"
  8. /* Maximum length of one response/request */
  9. #define API_BUFSIZE 1400
  10. /* Session key maximum size, including '\0' */
  11. #define API_SMAXSIZE 16
  12. /* Encryption salt maximum size, including '\0' */
  13. #define API_SALTMAXSIZE 16
  14. /* The session timeout in miliseconds */
  15. #define API_TIMEOUT 30 * 60 * 1000
  16. /* How many miliseconds to wait between sends */
  17. #define API_SENDWAIT 2 * 1000
  18. /* The number of packets that are exccempt from the ratelimit */
  19. #define API_FREESEND 5
  20. /* Long term wait between sends */
  21. #define API_SENDWAIT_LONG 4 * 1000
  22. /* After this many packets has been sent, use the longterm ratelimit */
  23. #define API_LONGTERM_PACKETS 100
  24. /* How much to wait between try agains? in ms */
  25. #define API_TRYAGAIN_TIME 60 * 1000
  26. #define API_MAX_TRYAGAIN 5
  27. enum api_code {
  28. APICODE_LOGIN_ACCEPTED = 200,
  29. APICODE_LOGIN_ACCEPTED_NEW_VERSION = 201,
  30. APICODE_LOGGED_OUT = 203,
  31. APICODE_RESOURCE = 205,
  32. APICODE_STATS = 206,
  33. APICODE_TOP = 207,
  34. APICODE_UPTIME = 208,
  35. APICODE_ENCRYPTION_ENABLED = 209,
  36. APICODE_MYLIST_ENTRY_ADDED = 210,
  37. APICODE_MYLIST_ENTRY_DELETED = 211,
  38. APICODE_ADDED_FILE = 214,
  39. APICODE_ADDED_STREAM = 215,
  40. APICODE_EXPORT_QUEUED = 217,
  41. APICODE_EXPORT_CANCELLED = 218,
  42. APICODE_ENCODING_CHANGED = 219,
  43. APICODE_FILE = 220,
  44. APICODE_MYLIST = 221,
  45. APICODE_MYLIST_STATS = 222,
  46. APICODE_WISHLIST = 223,
  47. APICODE_NOTIFICATION = 224,
  48. APICODE_GROUP_STATUS = 225,
  49. APICODE_WISHLIST_ENTRY_ADDED = 226,
  50. APICODE_WISHLIST_ENTRY_DELETED = 227,
  51. APICODE_WISHLIST_ENTRY_UPDATED = 228,
  52. APICODE_MULTIPLE_WISHLIST = 229,
  53. APICODE_ANIME = 230,
  54. APICODE_ANIME_BEST_MATCH = 231,
  55. APICODE_RANDOM_ANIME = 232,
  56. APICODE_ANIME_DESCRIPTION = 233,
  57. APICODE_REVIEW = 234,
  58. APICODE_CHARACTER = 235,
  59. APICODE_SONG = 236,
  60. APICODE_ANIMETAG = 237,
  61. APICODE_CHARACTERTAG = 238,
  62. APICODE_EPISODE = 240,
  63. APICODE_UPDATED = 243,
  64. APICODE_TITLE = 244,
  65. APICODE_CREATOR = 245,
  66. APICODE_NOTIFICATION_ENTRY_ADDED = 246,
  67. APICODE_NOTIFICATION_ENTRY_DELETED = 247,
  68. APICODE_NOTIFICATION_ENTRY_UPDATE = 248,
  69. APICODE_MULTIPLE_NOTIFICATION = 249,
  70. APICODE_GROUP = 250,
  71. APICODE_CATEGORY = 251,
  72. APICODE_BUDDY_LIST = 253,
  73. APICODE_BUDDY_STATE = 254,
  74. APICODE_BUDDY_ADDED = 255,
  75. APICODE_BUDDY_DELETED = 256,
  76. APICODE_BUDDY_ACCEPTED = 257,
  77. APICODE_BUDDY_DENIED = 258,
  78. APICODE_VOTED = 260,
  79. APICODE_VOTE_FOUND = 261,
  80. APICODE_VOTE_UPDATED = 262,
  81. APICODE_VOTE_REVOKED = 263,
  82. APICODE_HOT_ANIME = 265,
  83. APICODE_RANDOM_RECOMMENDATION = 266,
  84. APICODE_RANDOM_SIMILAR = 267,
  85. APICODE_NOTIFICATION_ENABLED = 270,
  86. APICODE_NOTIFYACK_SUCCESSFUL_MESSAGE = 281,
  87. APICODE_NOTIFYACK_SUCCESSFUL_NOTIFICATION = 282,
  88. APICODE_NOTIFICATION_STATE = 290,
  89. APICODE_NOTIFYLIST = 291,
  90. APICODE_NOTIFYGET_MESSAGE = 292,
  91. APICODE_NOTIFYGET_NOTIFY = 293,
  92. APICODE_SENDMESSAGE_SUCCESSFUL = 294,
  93. APICODE_USER_ID = 295,
  94. APICODE_CALENDAR = 297,
  95. APICODE_PONG = 300,
  96. APICODE_AUTHPONG = 301,
  97. APICODE_NO_SUCH_RESOURCE = 305,
  98. APICODE_API_PASSWORD_NOT_DEFINED = 309,
  99. APICODE_FILE_ALREADY_IN_MYLIST = 310,
  100. APICODE_MYLIST_ENTRY_EDITED = 311,
  101. APICODE_MULTIPLE_MYLIST_ENTRIES = 312,
  102. APICODE_WATCHED = 313,
  103. APICODE_SIZE_HASH_EXISTS = 314,
  104. APICODE_INVALID_DATA = 315,
  105. APICODE_STREAMNOID_USED = 316,
  106. APICODE_EXPORT_NO_SUCH_TEMPLATE = 317,
  107. APICODE_EXPORT_ALREADY_IN_QUEUE = 318,
  108. APICODE_EXPORT_NO_EXPORT_QUEUED_OR_IS_PROCESSING = 319,
  109. APICODE_NO_SUCH_FILE = 320,
  110. APICODE_NO_SUCH_ENTRY = 321,
  111. APICODE_MULTIPLE_FILES_FOUND = 322,
  112. APICODE_NO_SUCH_WISHLIST = 323,
  113. APICODE_NO_SUCH_NOTIFICATION = 324,
  114. APICODE_NO_GROUPS_FOUND = 325,
  115. APICODE_NO_SUCH_ANIME = 330,
  116. APICODE_NO_SUCH_DESCRIPTION = 333,
  117. APICODE_NO_SUCH_REVIEW = 334,
  118. APICODE_NO_SUCH_CHARACTER = 335,
  119. APICODE_NO_SUCH_SONG = 336,
  120. APICODE_NO_SUCH_ANIMETAG = 337,
  121. APICODE_NO_SUCH_CHARACTERTAG = 338,
  122. APICODE_NO_SUCH_EPISODE = 340,
  123. APICODE_NO_SUCH_UPDATES = 343,
  124. APICODE_NO_SUCH_TITLES = 344,
  125. APICODE_NO_SUCH_CREATOR = 345,
  126. APICODE_NO_SUCH_GROUP = 350,
  127. APICODE_NO_SUCH_CATEGORY = 351,
  128. APICODE_BUDDY_ALREADY_ADDED = 355,
  129. APICODE_NO_SUCH_BUDDY = 356,
  130. APICODE_BUDDY_ALREADY_ACCEPTED = 357,
  131. APICODE_BUDDY_ALREADY_DENIED = 358,
  132. APICODE_NO_SUCH_VOTE = 360,
  133. APICODE_INVALID_VOTE_TYPE = 361,
  134. APICODE_INVALID_VOTE_VALUE = 362,
  135. APICODE_PERMVOTE_NOT_ALLOWED = 363,
  136. APICODE_ALREADY_PERMVOTED = 364,
  137. APICODE_HOT_ANIME_EMPTY = 365,
  138. APICODE_RANDOM_RECOMMENDATION_EMPTY = 366,
  139. APICODE_RANDOM_SIMILAR_EMPTY = 367,
  140. APICODE_NOTIFICATION_DISABLED = 370,
  141. APICODE_NO_SUCH_ENTRY_MESSAGE = 381,
  142. APICODE_NO_SUCH_ENTRY_NOTIFICATION = 382,
  143. APICODE_NO_SUCH_MESSAGE = 392,
  144. APICODE_NO_SUCH_NOTIFY = 393,
  145. APICODE_NO_SUCH_USER = 394,
  146. APICODE_CALENDAR_EMPTY = 397,
  147. APICODE_NO_CHANGES = 399,
  148. APICODE_NOT_LOGGED_IN = 403,
  149. APICODE_NO_SUCH_MYLIST_FILE = 410,
  150. APICODE_NO_SUCH_MYLIST_ENTRY = 411,
  151. APICODE_MYLIST_UNAVAILABLE = 412,
  152. APICODE_LOGIN_FAILED = 500,
  153. APICODE_LOGIN_FIRST = 501,
  154. APICODE_ACCESS_DENIED = 502,
  155. APICODE_CLIENT_VERSION_OUTDATED = 503,
  156. APICODE_CLIENT_BANNED = 504,
  157. APICODE_ILLEGAL_INPUT_OR_ACCESS_DENIED = 505,
  158. APICODE_INVALID_SESSION = 506,
  159. APICODE_NO_SUCH_ENCRYPTION_TYPE = 509,
  160. APICODE_ENCODING_NOT_SUPPORTED = 519,
  161. APICODE_BANNED = 555,
  162. APICODE_UNKNOWN_COMMAND = 598,
  163. APICODE_INTERNAL_SERVER_ERROR = 600,
  164. APICODE_ANIDB_OUT_OF_SERVICE = 601,
  165. APICODE_SERVER_BUSY = 602,
  166. APICODE_NO_DATA = 603,
  167. APICODE_TIMEOUT = 604,
  168. APICODE_API_VIOLATION = 666,
  169. APICODE_PUSHACK_CONFIRMED = 701,
  170. APICODE_NO_SUCH_PACKET_PENDING = 702,
  171. APICODE_VERSION = 998,
  172. };
  173. enum mylist_state {
  174. MYLIST_STATE_UNKNOWN = 0,
  175. MYLIST_STATE_INTERNAL,
  176. MYLIST_STATE_EXTERNAL,
  177. MYLIST_STATE_DELETED,
  178. MYLIST_STATE_REMOTE,
  179. };
  180. enum file_state {
  181. FILE_STATE_NORMAL = 0,
  182. FILE_STATE_CORRUPT,
  183. FILE_STATE_SELF_EDIT,
  184. FILE_STATE_SELF_RIP = 10,
  185. FILE_STATE_ON_DVD,
  186. FILE_STATE_ON_VHS,
  187. FILE_STATE_ON_TV,
  188. FILE_STATE_IN_THEATERS,
  189. FILE_STATE_STREAMED,
  190. FILE_STATE_OTHER = 100,
  191. };
  192. struct api_mylistadd_opts {
  193. enum mylist_state state;
  194. bool watched;
  195. uint64_t wdate;
  196. struct {
  197. bool state_set : 1;
  198. bool watched_set : 1;
  199. bool wdate_set : 1;
  200. };
  201. };
  202. struct api_version_result {
  203. char version_str[40];
  204. };
  205. struct api_auth_result {
  206. union {
  207. char session_key[API_SMAXSIZE];
  208. /* free() */
  209. char *banned_reason;
  210. };
  211. };
  212. struct api_encrypt_result {
  213. char salt[API_SALTMAXSIZE];
  214. };
  215. struct api_uptime_result {
  216. int32_t ms;
  217. };
  218. struct api_mylist_result {
  219. uint64_t lid, fid, eid, aid, gid, date, viewdate;
  220. /* free() if != NULL ofc */
  221. char *storage, *source, *other;
  222. enum mylist_state state;
  223. enum file_state filestate;
  224. };
  225. struct api_mylistadd_result {
  226. uint64_t new_id;
  227. };
  228. struct api_mylistmod_result {
  229. uint32_t n_edits;
  230. };
  231. /* The largest struct probably lul 136 bytes */
  232. struct api_myliststats_result {
  233. uint64_t animes, eps, files, size_of_files;
  234. uint64_t added_animes, added_eps, added_files;
  235. uint64_t added_groups, leech_prcnt, glory_prcnt;
  236. uint64_t viewed_prcnt_of_db, mylist_prcnt_of_db;
  237. uint64_t viewed_prcnt_of_mylist, num_of_viewed_eps;
  238. uint64_t votes, reviews, viewed_minutes;
  239. };
  240. #define e(n) struct api_##n##_result n
  241. struct api_result {
  242. uint16_t code;
  243. union {
  244. e(version);
  245. e(auth);
  246. e(uptime);
  247. e(mylist);
  248. e(mylistadd);
  249. e(encrypt);
  250. e(mylistmod);
  251. e(myliststats);
  252. };
  253. };
  254. #undef e
  255. enum error api_init(bool auth);
  256. void api_free();
  257. enum error api_cmd_version(struct api_result *res);
  258. enum error api_cmd_uptime(struct api_result *res);
  259. enum error api_cmd_mylist(uint64_t lid, struct api_result *res);
  260. enum error api_cmd_mylistadd(int64_t size, const uint8_t *hash,
  261. struct api_mylistadd_opts *opts, struct api_result *res);
  262. enum error api_cmd_mylistmod(uint64_t lid, struct api_mylistadd_opts *opts,
  263. struct api_result *res);
  264. enum error api_cmd_myliststats(struct api_result *res);
  265. #endif /* _API_H */