diff options
| author | Fuwn <[email protected]> | 2025-06-29 07:25:16 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-06-29 07:25:16 -0700 |
| commit | 0469c2da8e6ff3acdcd70c8f01157bf3f15a2282 (patch) | |
| tree | cf65b2cc7a9f0b7309f5971e095e65bce0f4c6ee | |
| download | oguri-0469c2da8e6ff3acdcd70c8f01157bf3f15a2282.tar.xz oguri-0469c2da8e6ff3acdcd70c8f01157bf3f15a2282.zip | |
feat: Initial commit
| -rw-r--r-- | .gitignore | 13 | ||||
| -rw-r--r-- | .python-version | 1 | ||||
| -rw-r--r-- | LICENSE.txt | 674 | ||||
| -rw-r--r-- | justfile | 11 | ||||
| -rw-r--r-- | pyproject.toml | 33 | ||||
| -rw-r--r-- | requirements-dev.lock | 67 | ||||
| -rw-r--r-- | requirements.lock | 67 | ||||
| -rw-r--r-- | schema.graphql | 6451 | ||||
| -rw-r--r-- | src/oguri/__init__.py | 92 | ||||
| -rw-r--r-- | src/oguri/__main__.py | 5 |
10 files changed, 7414 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9ed90ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Python +__pycache__/ +*.py[oc] +build/ +dist/ +wheels/ +*.egg-info + +# venv +.venv + +# Ariadne +src/*_client diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..c10780c --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.13.1 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + <program> Copyright (C) <year> <name of author> + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +<https://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +<https://www.gnu.org/licenses/why-not-lgpl.html>. diff --git a/justfile b/justfile new file mode 100644 index 0000000..c495100 --- /dev/null +++ b/justfile @@ -0,0 +1,11 @@ +alias gen := generate +alias fmt := format + +generate target="client": + rye run ariadne-codegen {{ target }} + +run: + rye run oguri + +format: + rye run black src/oguri diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..13c5faa --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,33 @@ +[project] +name = "oguri" +version = "0.1.0" +description = "Command-line tool for AniList" +authors = [{ name = "Fuwn", email = "[email protected]" }] +dependencies = [ + "ariadne-codegen @ git+https://github.com/flonou/ariadne-codegen@field_names_should_not_be_converted_to_snake-case", + "asyncio>=3.4.3", +] +requires-python = ">= 3.13" + +[project.scripts] +"oguri" = "oguri:main_script" + +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.rye] +managed = true +dev-dependencies = ["black>=25.1.0"] + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.wheel] +packages = ["src/oguri"] + +[tool.ariadne-codegen] +schema_path = "schema.graphql" +target_package_name = "anilist_client" +target_package_path = "src" +enable_custom_operations = true diff --git a/requirements-dev.lock b/requirements-dev.lock new file mode 100644 index 0000000..bfd2dc1 --- /dev/null +++ b/requirements-dev.lock @@ -0,0 +1,67 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: [] +# all-features: false +# with-sources: false +# generate-hashes: false +# universal: false + +-e file:. +annotated-types==0.7.0 + # via pydantic +anyio==4.9.0 + # via httpx +ariadne-codegen @ git+https://github.com/flonou/ariadne-codegen@a18ea3a0803f4ec5fdccb90c530932a3d9418940 + # via oguri +asyncio==3.4.3 + # via oguri +autoflake==2.3.1 + # via ariadne-codegen +black==25.1.0 + # via ariadne-codegen +certifi==2025.6.15 + # via httpcore + # via httpx +click==8.2.1 + # via ariadne-codegen + # via black +graphql-core==3.2.6 + # via ariadne-codegen +h11==0.16.0 + # via httpcore +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via ariadne-codegen +idna==3.10 + # via anyio + # via httpx +isort==6.0.1 + # via ariadne-codegen +mypy-extensions==1.1.0 + # via black +packaging==25.0 + # via black +pathspec==0.12.1 + # via black +platformdirs==4.3.8 + # via black +pydantic==2.11.7 + # via ariadne-codegen +pydantic-core==2.33.2 + # via pydantic +pyflakes==3.4.0 + # via autoflake +sniffio==1.3.1 + # via anyio +toml==0.10.2 + # via ariadne-codegen +typing-extensions==4.14.0 + # via pydantic + # via pydantic-core + # via typing-inspection +typing-inspection==0.4.1 + # via pydantic diff --git a/requirements.lock b/requirements.lock new file mode 100644 index 0000000..bfd2dc1 --- /dev/null +++ b/requirements.lock @@ -0,0 +1,67 @@ +# generated by rye +# use `rye lock` or `rye sync` to update this lockfile +# +# last locked with the following flags: +# pre: false +# features: [] +# all-features: false +# with-sources: false +# generate-hashes: false +# universal: false + +-e file:. +annotated-types==0.7.0 + # via pydantic +anyio==4.9.0 + # via httpx +ariadne-codegen @ git+https://github.com/flonou/ariadne-codegen@a18ea3a0803f4ec5fdccb90c530932a3d9418940 + # via oguri +asyncio==3.4.3 + # via oguri +autoflake==2.3.1 + # via ariadne-codegen +black==25.1.0 + # via ariadne-codegen +certifi==2025.6.15 + # via httpcore + # via httpx +click==8.2.1 + # via ariadne-codegen + # via black +graphql-core==3.2.6 + # via ariadne-codegen +h11==0.16.0 + # via httpcore +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via ariadne-codegen +idna==3.10 + # via anyio + # via httpx +isort==6.0.1 + # via ariadne-codegen +mypy-extensions==1.1.0 + # via black +packaging==25.0 + # via black +pathspec==0.12.1 + # via black +platformdirs==4.3.8 + # via black +pydantic==2.11.7 + # via ariadne-codegen +pydantic-core==2.33.2 + # via pydantic +pyflakes==3.4.0 + # via autoflake +sniffio==1.3.1 + # via anyio +toml==0.10.2 + # via ariadne-codegen +typing-extensions==4.14.0 + # via pydantic + # via pydantic-core + # via typing-inspection +typing-inspection==0.4.1 + # via pydantic diff --git a/schema.graphql b/schema.graphql new file mode 100644 index 0000000..0fa024e --- /dev/null +++ b/schema.graphql @@ -0,0 +1,6451 @@ +type Query { + Page( + """The page number""" + page: Int + + """The amount of entries per page, max 50""" + perPage: Int + ): Page + + """Media query""" + Media( + """Filter by the media id""" + id: Int + + """Filter by the media's MyAnimeList id""" + idMal: Int + + """Filter by the start date of the media""" + startDate: FuzzyDateInt + + """Filter by the end date of the media""" + endDate: FuzzyDateInt + + """Filter by the season the media was released in""" + season: MediaSeason + + """ + The year of the season (Winter 2017 would also include December 2016 releases). Requires season argument + """ + seasonYear: Int + + """Filter by the media's type""" + type: MediaType + + """Filter by the media's format""" + format: MediaFormat + + """Filter by the media's current release status""" + status: MediaStatus + + """Filter by amount of episodes the media has""" + episodes: Int + + """Filter by the media's episode length""" + duration: Int + + """Filter by the media's chapter count""" + chapters: Int + + """Filter by the media's volume count""" + volumes: Int + + """Filter by if the media's intended for 18+ adult audiences""" + isAdult: Boolean + + """Filter by the media's genres""" + genre: String + + """Filter by the media's tags""" + tag: String + + """ + Only apply the tags filter argument to tags above this rank. Default: 18 + """ + minimumTagRank: Int + + """Filter by the media's tags with in a tag category""" + tagCategory: String + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter media by sites name with a online streaming or reading license""" + licensedBy: String + + """Filter media by sites id with a online streaming or reading license""" + licensedById: Int + + """Filter by the media's average score""" + averageScore: Int + + """Filter by the number of users with this media on their list""" + popularity: Int + + """Filter by the source type of the media""" + source: MediaSource + + """Filter by the media's country of origin""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Filter by search query""" + search: String + + """Filter by the media id""" + id_not: Int + + """Filter by the media id""" + id_in: [Int] + + """Filter by the media id""" + id_not_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not: Int + + """Filter by the media's MyAnimeList id""" + idMal_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not_in: [Int] + + """Filter by the start date of the media""" + startDate_greater: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_lesser: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_like: String + + """Filter by the end date of the media""" + endDate_greater: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_lesser: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_like: String + + """Filter by the media's format""" + format_in: [MediaFormat] + + """Filter by the media's format""" + format_not: MediaFormat + + """Filter by the media's format""" + format_not_in: [MediaFormat] + + """Filter by the media's current release status""" + status_in: [MediaStatus] + + """Filter by the media's current release status""" + status_not: MediaStatus + + """Filter by the media's current release status""" + status_not_in: [MediaStatus] + + """Filter by amount of episodes the media has""" + episodes_greater: Int + + """Filter by amount of episodes the media has""" + episodes_lesser: Int + + """Filter by the media's episode length""" + duration_greater: Int + + """Filter by the media's episode length""" + duration_lesser: Int + + """Filter by the media's chapter count""" + chapters_greater: Int + + """Filter by the media's chapter count""" + chapters_lesser: Int + + """Filter by the media's volume count""" + volumes_greater: Int + + """Filter by the media's volume count""" + volumes_lesser: Int + + """Filter by the media's genres""" + genre_in: [String] + + """Filter by the media's genres""" + genre_not_in: [String] + + """Filter by the media's tags""" + tag_in: [String] + + """Filter by the media's tags""" + tag_not_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_not_in: [String] + + """Filter media by sites name with a online streaming or reading license""" + licensedBy_in: [String] + + """Filter media by sites id with a online streaming or reading license""" + licensedById_in: [Int] + + """Filter by the media's average score""" + averageScore_not: Int + + """Filter by the media's average score""" + averageScore_greater: Int + + """Filter by the media's average score""" + averageScore_lesser: Int + + """Filter by the number of users with this media on their list""" + popularity_not: Int + + """Filter by the number of users with this media on their list""" + popularity_greater: Int + + """Filter by the number of users with this media on their list""" + popularity_lesser: Int + + """Filter by the source type of the media""" + source_in: [MediaSource] + + """The order the results will be returned in""" + sort: [MediaSort] + ): Media + + """Media Trend query""" + MediaTrend( + """Filter by the media id""" + mediaId: Int + + """Filter by date""" + date: Int + + """Filter by trending amount""" + trending: Int + + """Filter by score""" + averageScore: Int + + """Filter by popularity""" + popularity: Int + + """Filter by episode number""" + episode: Int + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """Filter by the media id""" + mediaId_not: Int + + """Filter by the media id""" + mediaId_in: [Int] + + """Filter by the media id""" + mediaId_not_in: [Int] + + """Filter by date""" + date_greater: Int + + """Filter by date""" + date_lesser: Int + + """Filter by trending amount""" + trending_greater: Int + + """Filter by trending amount""" + trending_lesser: Int + + """Filter by trending amount""" + trending_not: Int + + """Filter by score""" + averageScore_greater: Int + + """Filter by score""" + averageScore_lesser: Int + + """Filter by score""" + averageScore_not: Int + + """Filter by popularity""" + popularity_greater: Int + + """Filter by popularity""" + popularity_lesser: Int + + """Filter by popularity""" + popularity_not: Int + + """Filter by episode number""" + episode_greater: Int + + """Filter by episode number""" + episode_lesser: Int + + """Filter by episode number""" + episode_not: Int + + """The order the results will be returned in""" + sort: [MediaTrendSort] + ): MediaTrend + + """Airing schedule query""" + AiringSchedule( + """Filter by the id of the airing schedule item""" + id: Int + + """Filter by the id of associated media""" + mediaId: Int + + """Filter by the airing episode number""" + episode: Int + + """Filter by the time of airing""" + airingAt: Int + + """Filter to episodes that haven't yet aired""" + notYetAired: Boolean + + """Filter by the id of the airing schedule item""" + id_not: Int + + """Filter by the id of the airing schedule item""" + id_in: [Int] + + """Filter by the id of the airing schedule item""" + id_not_in: [Int] + + """Filter by the id of associated media""" + mediaId_not: Int + + """Filter by the id of associated media""" + mediaId_in: [Int] + + """Filter by the id of associated media""" + mediaId_not_in: [Int] + + """Filter by the airing episode number""" + episode_not: Int + + """Filter by the airing episode number""" + episode_in: [Int] + + """Filter by the airing episode number""" + episode_not_in: [Int] + + """Filter by the airing episode number""" + episode_greater: Int + + """Filter by the airing episode number""" + episode_lesser: Int + + """Filter by the time of airing""" + airingAt_greater: Int + + """Filter by the time of airing""" + airingAt_lesser: Int + + """The order the results will be returned in""" + sort: [AiringSort] + ): AiringSchedule + + """Character query""" + Character( + """Filter by character id""" + id: Int + + """Filter by character by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by character id""" + id_not: Int + + """Filter by character id""" + id_in: [Int] + + """Filter by character id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [CharacterSort] + ): Character + + """Staff query""" + Staff( + """Filter by the staff id""" + id: Int + + """Filter by staff by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by the staff id""" + id_not: Int + + """Filter by the staff id""" + id_in: [Int] + + """Filter by the staff id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StaffSort] + ): Staff + + """Media list query""" + MediaList( + """Filter by a list entry's id""" + id: Int + + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId: Int + + """ + Filter list entries to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Limit to only entries also on the auth user's list. Requires user id or name arguments. + """ + compareWithAuthList: Boolean + + """Filter by a user's id""" + userId_in: [Int] + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId_in: [Int] + + """Filter by the media id of the list entry""" + mediaId_not_in: [Int] + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): MediaList + + """ + Media list collection query, provides list pre-grouped by status & custom lists. User ID and Media Type arguments required. + """ + MediaListCollection( + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Always return completed list entries in one group, overriding the user's split completed option. + """ + forceSingleCompletedList: Boolean + + """Which chunk of list entries to load""" + chunk: Int + + """The amount of entries per chunk, max 500""" + perChunk: Int + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): MediaListCollection + + """Collection of all the possible media genres""" + GenreCollection: [String] + + """Collection of all the possible media tags""" + MediaTagCollection( + """Mod Only""" + status: Int + ): [MediaTag] + + """User query""" + User( + """Filter by the user id""" + id: Int + + """Filter by the name of the user""" + name: String + + """Filter to moderators only if true""" + isModerator: Boolean + + """Filter by search query""" + search: String + + """The order the results will be returned in""" + sort: [UserSort] + ): User + + """Get the currently authenticated user""" + Viewer: User + + """Notification query""" + Notification( + """Filter by the type of notifications""" + type: NotificationType + + """Reset the unread notification count to 0 on load""" + resetNotificationCount: Boolean + + """Filter by the type of notifications""" + type_in: [NotificationType] + ): NotificationUnion + + """Studio query""" + Studio( + """Filter by the studio id""" + id: Int + + """Filter by search query""" + search: String + + """Filter by the studio id""" + id_not: Int + + """Filter by the studio id""" + id_in: [Int] + + """Filter by the studio id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StudioSort] + ): Studio + + """Review query""" + Review( + """Filter by Review id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by user id""" + userId: Int + + """Filter by media type""" + mediaType: MediaType + + """The order the results will be returned in""" + sort: [ReviewSort] + ): Review + + """Activity query""" + Activity( + """Filter by the activity id""" + id: Int + + """Filter by the owner user id""" + userId: Int + + """Filter by the id of the user who sent a message""" + messengerId: Int + + """Filter by the associated media id of the activity""" + mediaId: Int + + """Filter by the type of activity""" + type: ActivityType + + """ + Filter activity to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter activity to only activity with replies""" + hasReplies: Boolean + + """Filter activity to only activity with replies or is of type text""" + hasRepliesOrTypeText: Boolean + + """Filter by the time the activity was created""" + createdAt: Int + + """Filter by the activity id""" + id_not: Int + + """Filter by the activity id""" + id_in: [Int] + + """Filter by the activity id""" + id_not_in: [Int] + + """Filter by the owner user id""" + userId_not: Int + + """Filter by the owner user id""" + userId_in: [Int] + + """Filter by the owner user id""" + userId_not_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not: Int + + """Filter by the id of the user who sent a message""" + messengerId_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not: Int + + """Filter by the associated media id of the activity""" + mediaId_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not_in: [Int] + + """Filter by the type of activity""" + type_not: ActivityType + + """Filter by the type of activity""" + type_in: [ActivityType] + + """Filter by the type of activity""" + type_not_in: [ActivityType] + + """Filter by the time the activity was created""" + createdAt_greater: Int + + """Filter by the time the activity was created""" + createdAt_lesser: Int + + """The order the results will be returned in""" + sort: [ActivitySort] + ): ActivityUnion + + """Activity reply query""" + ActivityReply( + """Filter by the reply id""" + id: Int + + """Filter by the parent id""" + activityId: Int + ): ActivityReply + + """Follow query""" + Following( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): User + + """Follow query""" + Follower( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): User + + """Thread query""" + Thread( + """Filter by the thread id""" + id: Int + + """Filter by the user id of the thread's creator""" + userId: Int + + """Filter by the user id of the last user to comment on the thread""" + replyUserId: Int + + """Filter by if the currently authenticated user's subscribed threads""" + subscribed: Boolean + + """Filter by thread category id""" + categoryId: Int + + """Filter by thread media id category""" + mediaCategoryId: Int + + """Filter by search query""" + search: String + + """Filter by the thread id""" + id_in: [Int] + + """The order the results will be returned in""" + sort: [ThreadSort] + ): Thread + + """Comment query""" + ThreadComment( + """Filter by the comment id""" + id: Int + + """Filter by the thread id""" + threadId: Int + + """Filter by the user id of the comment's creator""" + userId: Int + + """The order the results will be returned in""" + sort: [ThreadCommentSort] + ): [ThreadComment] + + """Recommendation query""" + Recommendation( + """Filter by recommendation id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by media recommendation id""" + mediaRecommendationId: Int + + """Filter by user who created the recommendation""" + userId: Int + + """Filter by total rating of the recommendation""" + rating: Int + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter by total rating of the recommendation""" + rating_greater: Int + + """Filter by total rating of the recommendation""" + rating_lesser: Int + + """The order the results will be returned in""" + sort: [RecommendationSort] + ): Recommendation + + """Like query""" + Like( + """The id of the likeable type""" + likeableId: Int + + """The type of model the id applies to""" + type: LikeableType + ): User + + """Provide AniList markdown to be converted to html (Requires auth)""" + Markdown( + """The markdown to be parsed to html""" + markdown: String! + ): ParsedMarkdown + AniChartUser: AniChartUser + + """Site statistics query""" + SiteStatistics: SiteStatistics + + """ExternalLinkSource collection query""" + ExternalLinkSourceCollection( + """Filter by the link id""" + id: Int + type: ExternalLinkType + mediaType: ExternalLinkMediaType + ): [MediaExternalLink] +} + +"""Page of data""" +type Page { + """The pagination information""" + pageInfo: PageInfo + users( + """Filter by the user id""" + id: Int + + """Filter by the name of the user""" + name: String + + """Filter to moderators only if true""" + isModerator: Boolean + + """Filter by search query""" + search: String + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + media( + """Filter by the media id""" + id: Int + + """Filter by the media's MyAnimeList id""" + idMal: Int + + """Filter by the start date of the media""" + startDate: FuzzyDateInt + + """Filter by the end date of the media""" + endDate: FuzzyDateInt + + """Filter by the season the media was released in""" + season: MediaSeason + + """ + The year of the season (Winter 2017 would also include December 2016 releases). Requires season argument + """ + seasonYear: Int + + """Filter by the media's type""" + type: MediaType + + """Filter by the media's format""" + format: MediaFormat + + """Filter by the media's current release status""" + status: MediaStatus + + """Filter by amount of episodes the media has""" + episodes: Int + + """Filter by the media's episode length""" + duration: Int + + """Filter by the media's chapter count""" + chapters: Int + + """Filter by the media's volume count""" + volumes: Int + + """Filter by if the media's intended for 18+ adult audiences""" + isAdult: Boolean + + """Filter by the media's genres""" + genre: String + + """Filter by the media's tags""" + tag: String + + """ + Only apply the tags filter argument to tags above this rank. Default: 18 + """ + minimumTagRank: Int + + """Filter by the media's tags with in a tag category""" + tagCategory: String + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter media by sites name with a online streaming or reading license""" + licensedBy: String + + """Filter media by sites id with a online streaming or reading license""" + licensedById: Int + + """Filter by the media's average score""" + averageScore: Int + + """Filter by the number of users with this media on their list""" + popularity: Int + + """Filter by the source type of the media""" + source: MediaSource + + """Filter by the media's country of origin""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Filter by search query""" + search: String + + """Filter by the media id""" + id_not: Int + + """Filter by the media id""" + id_in: [Int] + + """Filter by the media id""" + id_not_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not: Int + + """Filter by the media's MyAnimeList id""" + idMal_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not_in: [Int] + + """Filter by the start date of the media""" + startDate_greater: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_lesser: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_like: String + + """Filter by the end date of the media""" + endDate_greater: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_lesser: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_like: String + + """Filter by the media's format""" + format_in: [MediaFormat] + + """Filter by the media's format""" + format_not: MediaFormat + + """Filter by the media's format""" + format_not_in: [MediaFormat] + + """Filter by the media's current release status""" + status_in: [MediaStatus] + + """Filter by the media's current release status""" + status_not: MediaStatus + + """Filter by the media's current release status""" + status_not_in: [MediaStatus] + + """Filter by amount of episodes the media has""" + episodes_greater: Int + + """Filter by amount of episodes the media has""" + episodes_lesser: Int + + """Filter by the media's episode length""" + duration_greater: Int + + """Filter by the media's episode length""" + duration_lesser: Int + + """Filter by the media's chapter count""" + chapters_greater: Int + + """Filter by the media's chapter count""" + chapters_lesser: Int + + """Filter by the media's volume count""" + volumes_greater: Int + + """Filter by the media's volume count""" + volumes_lesser: Int + + """Filter by the media's genres""" + genre_in: [String] + + """Filter by the media's genres""" + genre_not_in: [String] + + """Filter by the media's tags""" + tag_in: [String] + + """Filter by the media's tags""" + tag_not_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_not_in: [String] + + """Filter media by sites name with a online streaming or reading license""" + licensedBy_in: [String] + + """Filter media by sites id with a online streaming or reading license""" + licensedById_in: [Int] + + """Filter by the media's average score""" + averageScore_not: Int + + """Filter by the media's average score""" + averageScore_greater: Int + + """Filter by the media's average score""" + averageScore_lesser: Int + + """Filter by the number of users with this media on their list""" + popularity_not: Int + + """Filter by the number of users with this media on their list""" + popularity_greater: Int + + """Filter by the number of users with this media on their list""" + popularity_lesser: Int + + """Filter by the source type of the media""" + source_in: [MediaSource] + + """The order the results will be returned in""" + sort: [MediaSort] + ): [Media] + characters( + """Filter by character id""" + id: Int + + """Filter by character by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by character id""" + id_not: Int + + """Filter by character id""" + id_in: [Int] + + """Filter by character id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [CharacterSort] + ): [Character] + staff( + """Filter by the staff id""" + id: Int + + """Filter by staff by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by the staff id""" + id_not: Int + + """Filter by the staff id""" + id_in: [Int] + + """Filter by the staff id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StaffSort] + ): [Staff] + studios( + """Filter by the studio id""" + id: Int + + """Filter by search query""" + search: String + + """Filter by the studio id""" + id_not: Int + + """Filter by the studio id""" + id_in: [Int] + + """Filter by the studio id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StudioSort] + ): [Studio] + mediaList( + """Filter by a list entry's id""" + id: Int + + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId: Int + + """ + Filter list entries to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Limit to only entries also on the auth user's list. Requires user id or name arguments. + """ + compareWithAuthList: Boolean + + """Filter by a user's id""" + userId_in: [Int] + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId_in: [Int] + + """Filter by the media id of the list entry""" + mediaId_not_in: [Int] + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): [MediaList] + airingSchedules( + """Filter by the id of the airing schedule item""" + id: Int + + """Filter by the id of associated media""" + mediaId: Int + + """Filter by the airing episode number""" + episode: Int + + """Filter by the time of airing""" + airingAt: Int + + """Filter to episodes that haven't yet aired""" + notYetAired: Boolean + + """Filter by the id of the airing schedule item""" + id_not: Int + + """Filter by the id of the airing schedule item""" + id_in: [Int] + + """Filter by the id of the airing schedule item""" + id_not_in: [Int] + + """Filter by the id of associated media""" + mediaId_not: Int + + """Filter by the id of associated media""" + mediaId_in: [Int] + + """Filter by the id of associated media""" + mediaId_not_in: [Int] + + """Filter by the airing episode number""" + episode_not: Int + + """Filter by the airing episode number""" + episode_in: [Int] + + """Filter by the airing episode number""" + episode_not_in: [Int] + + """Filter by the airing episode number""" + episode_greater: Int + + """Filter by the airing episode number""" + episode_lesser: Int + + """Filter by the time of airing""" + airingAt_greater: Int + + """Filter by the time of airing""" + airingAt_lesser: Int + + """The order the results will be returned in""" + sort: [AiringSort] + ): [AiringSchedule] + mediaTrends( + """Filter by the media id""" + mediaId: Int + + """Filter by date""" + date: Int + + """Filter by trending amount""" + trending: Int + + """Filter by score""" + averageScore: Int + + """Filter by popularity""" + popularity: Int + + """Filter by episode number""" + episode: Int + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """Filter by the media id""" + mediaId_not: Int + + """Filter by the media id""" + mediaId_in: [Int] + + """Filter by the media id""" + mediaId_not_in: [Int] + + """Filter by date""" + date_greater: Int + + """Filter by date""" + date_lesser: Int + + """Filter by trending amount""" + trending_greater: Int + + """Filter by trending amount""" + trending_lesser: Int + + """Filter by trending amount""" + trending_not: Int + + """Filter by score""" + averageScore_greater: Int + + """Filter by score""" + averageScore_lesser: Int + + """Filter by score""" + averageScore_not: Int + + """Filter by popularity""" + popularity_greater: Int + + """Filter by popularity""" + popularity_lesser: Int + + """Filter by popularity""" + popularity_not: Int + + """Filter by episode number""" + episode_greater: Int + + """Filter by episode number""" + episode_lesser: Int + + """Filter by episode number""" + episode_not: Int + + """The order the results will be returned in""" + sort: [MediaTrendSort] + ): [MediaTrend] + notifications( + """Filter by the type of notifications""" + type: NotificationType + + """Reset the unread notification count to 0 on load""" + resetNotificationCount: Boolean + + """Filter by the type of notifications""" + type_in: [NotificationType] + ): [NotificationUnion] + followers( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + following( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + activities( + """Filter by the activity id""" + id: Int + + """Filter by the owner user id""" + userId: Int + + """Filter by the id of the user who sent a message""" + messengerId: Int + + """Filter by the associated media id of the activity""" + mediaId: Int + + """Filter by the type of activity""" + type: ActivityType + + """ + Filter activity to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter activity to only activity with replies""" + hasReplies: Boolean + + """Filter activity to only activity with replies or is of type text""" + hasRepliesOrTypeText: Boolean + + """Filter by the time the activity was created""" + createdAt: Int + + """Filter by the activity id""" + id_not: Int + + """Filter by the activity id""" + id_in: [Int] + + """Filter by the activity id""" + id_not_in: [Int] + + """Filter by the owner user id""" + userId_not: Int + + """Filter by the owner user id""" + userId_in: [Int] + + """Filter by the owner user id""" + userId_not_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not: Int + + """Filter by the id of the user who sent a message""" + messengerId_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not: Int + + """Filter by the associated media id of the activity""" + mediaId_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not_in: [Int] + + """Filter by the type of activity""" + type_not: ActivityType + + """Filter by the type of activity""" + type_in: [ActivityType] + + """Filter by the type of activity""" + type_not_in: [ActivityType] + + """Filter by the time the activity was created""" + createdAt_greater: Int + + """Filter by the time the activity was created""" + createdAt_lesser: Int + + """The order the results will be returned in""" + sort: [ActivitySort] + ): [ActivityUnion] + activityReplies( + """Filter by the reply id""" + id: Int + + """Filter by the parent id""" + activityId: Int + ): [ActivityReply] + threads( + """Filter by the thread id""" + id: Int + + """Filter by the user id of the thread's creator""" + userId: Int + + """Filter by the user id of the last user to comment on the thread""" + replyUserId: Int + + """Filter by if the currently authenticated user's subscribed threads""" + subscribed: Boolean + + """Filter by thread category id""" + categoryId: Int + + """Filter by thread media id category""" + mediaCategoryId: Int + + """Filter by search query""" + search: String + + """Filter by the thread id""" + id_in: [Int] + + """The order the results will be returned in""" + sort: [ThreadSort] + ): [Thread] + threadComments( + """Filter by the comment id""" + id: Int + + """Filter by the thread id""" + threadId: Int + + """Filter by the user id of the comment's creator""" + userId: Int + + """The order the results will be returned in""" + sort: [ThreadCommentSort] + ): [ThreadComment] + reviews( + """Filter by Review id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by user id""" + userId: Int + + """Filter by media type""" + mediaType: MediaType + + """The order the results will be returned in""" + sort: [ReviewSort] + ): [Review] + recommendations( + """Filter by recommendation id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by media recommendation id""" + mediaRecommendationId: Int + + """Filter by user who created the recommendation""" + userId: Int + + """Filter by total rating of the recommendation""" + rating: Int + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter by total rating of the recommendation""" + rating_greater: Int + + """Filter by total rating of the recommendation""" + rating_lesser: Int + + """The order the results will be returned in""" + sort: [RecommendationSort] + ): [Recommendation] + likes( + """The id of the likeable type""" + likeableId: Int + + """The type of model the id applies to""" + type: LikeableType + ): [User] +} + +type PageInfo { + """ + The total number of items. Note: This value is not guaranteed to be accurate, do not rely on this for logic + """ + total: Int + + """The count on a page""" + perPage: Int + + """The current page""" + currentPage: Int + + """The last page""" + lastPage: Int + + """If there is another page""" + hasNextPage: Boolean +} + +"""User sort enums""" +enum UserSort { + ID + ID_DESC + USERNAME + USERNAME_DESC + WATCHED_TIME + WATCHED_TIME_DESC + CHAPTERS_READ + CHAPTERS_READ_DESC + SEARCH_MATCH +} + +"""A user""" +type User { + """The id of the user""" + id: Int! + + """The name of the user""" + name: String! + + """The bio written by user (Markdown)""" + about( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The user's avatar images""" + avatar: UserAvatar + + """The user's banner images""" + bannerImage: String + + """If the authenticated user if following this user""" + isFollowing: Boolean + + """If this user if following the authenticated user""" + isFollower: Boolean + + """If the user is blocked by the authenticated user""" + isBlocked: Boolean + bans: Json + + """The user's general options""" + options: UserOptions + + """The user's media list options""" + mediaListOptions: MediaListOptions + + """The users favourites""" + favourites( + """Deprecated. Use page arguments on each favourite field instead.""" + page: Int + ): Favourites + + """The users anime & manga list statistics""" + statistics: UserStatisticTypes + + """The number of unread notifications the user has""" + unreadNotificationCount: Int + + """The url for the user page on the AniList website""" + siteUrl: String + + """The donation tier of the user""" + donatorTier: Int + + """Custom donation badge text""" + donatorBadge: String + + """The user's moderator roles if they are a site moderator""" + moderatorRoles: [ModRole] + + """ + When the user's account was created. (Does not exist for accounts created before 2020) + """ + createdAt: Int + + """When the user's data was last updated""" + updatedAt: Int + + """The user's statistics""" + stats: UserStats @deprecated(reason: "Deprecated. Replaced with statistics field.") + + """If the user is a moderator or data moderator""" + moderatorStatus: String @deprecated(reason: "Deprecated. Replaced with moderatorRoles field.") + + """The user's previously used names.""" + previousNames: [UserPreviousName] +} + +"""A user's avatars""" +type UserAvatar { + """The avatar of user at its largest size""" + large: String + + """The avatar of user at medium size""" + medium: String +} + +"""""" +scalar Json + +"""A user's general options""" +type UserOptions { + """The language the user wants to see media titles in""" + titleLanguage: UserTitleLanguage + + """Whether the user has enabled viewing of 18+ content""" + displayAdultContent: Boolean + + """ + Whether the user receives notifications when a show they are watching aires + """ + airingNotifications: Boolean + + """Profile highlight color (blue, purple, pink, orange, red, green, gray)""" + profileColor: String + + """Notification options""" + notificationOptions: [NotificationOption] + + """The user's timezone offset (Auth user only)""" + timezone: String + + """ + Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always. + """ + activityMergeTime: Int + + """The language the user wants to see staff and character names in""" + staffNameLanguage: UserStaffNameLanguage + + """Whether the user only allow messages from users they follow""" + restrictMessagesToFollowing: Boolean + + """ + The list activity types the user has disabled from being created from list updates + """ + disabledListActivity: [ListActivityOption] +} + +"""The language the user wants to see media titles in""" +enum UserTitleLanguage { + """The romanization of the native language title""" + ROMAJI + + """The official english title""" + ENGLISH + + """Official title in it's native language""" + NATIVE + + """ + The romanization of the native language title, stylised by media creator + """ + ROMAJI_STYLISED + + """The official english title, stylised by media creator""" + ENGLISH_STYLISED + + """Official title in it's native language, stylised by media creator""" + NATIVE_STYLISED +} + +"""Notification option""" +type NotificationOption { + """The type of notification""" + type: NotificationType + + """Whether this type of notification is enabled""" + enabled: Boolean +} + +"""Notification type enum""" +enum NotificationType { + """A user has sent you message""" + ACTIVITY_MESSAGE + + """A user has replied to your activity""" + ACTIVITY_REPLY + + """A user has followed you""" + FOLLOWING + + """A user has mentioned you in their activity""" + ACTIVITY_MENTION + + """A user has mentioned you in a forum comment""" + THREAD_COMMENT_MENTION + + """A user has commented in one of your subscribed forum threads""" + THREAD_SUBSCRIBED + + """A user has replied to your forum comment""" + THREAD_COMMENT_REPLY + + """An anime you are currently watching has aired""" + AIRING + + """A user has liked your activity""" + ACTIVITY_LIKE + + """A user has liked your activity reply""" + ACTIVITY_REPLY_LIKE + + """A user has liked your forum thread""" + THREAD_LIKE + + """A user has liked your forum comment""" + THREAD_COMMENT_LIKE + + """A user has replied to activity you have also replied to""" + ACTIVITY_REPLY_SUBSCRIBED + + """ + A new anime or manga has been added to the site where its related media is on the user's list + """ + RELATED_MEDIA_ADDITION + + """ + An anime or manga has had a data change that affects how a user may track it in their lists + """ + MEDIA_DATA_CHANGE + + """ + Anime or manga entries on the user's list have been merged into a single entry + """ + MEDIA_MERGE + + """An anime or manga on the user's list has been deleted from the site""" + MEDIA_DELETION +} + +"""The language the user wants to see staff and character names in""" +enum UserStaffNameLanguage { + """ + The romanization of the staff or character's native name, with western name ordering + """ + ROMAJI_WESTERN + + """The romanization of the staff or character's native name""" + ROMAJI + + """The staff or character's name in their native language""" + NATIVE +} + +type ListActivityOption { + disabled: Boolean + type: MediaListStatus +} + +"""Media list watching/reading status enum.""" +enum MediaListStatus { + """Currently watching/reading""" + CURRENT + + """Planning to watch/read""" + PLANNING + + """Finished watching/reading""" + COMPLETED + + """Stopped watching/reading before completing""" + DROPPED + + """Paused watching/reading""" + PAUSED + + """Re-watching/reading""" + REPEATING +} + +"""A user's list options""" +type MediaListOptions { + """The score format the user is using for media lists""" + scoreFormat: ScoreFormat + + """The default order list rows should be displayed in""" + rowOrder: String + useLegacyLists: Boolean @deprecated(reason: "No longer used") + + """The user's anime list options""" + animeList: MediaListTypeOptions + + """The user's manga list options""" + mangaList: MediaListTypeOptions + + """The list theme options for both lists""" + sharedTheme: Json @deprecated(reason: "No longer used") + + """ + If the shared theme should be used instead of the individual list themes + """ + sharedThemeEnabled: Boolean @deprecated(reason: "No longer used") +} + +"""Media list scoring type""" +enum ScoreFormat { + """An integer from 0-100""" + POINT_100 + + """A float from 0-10 with 1 decimal place""" + POINT_10_DECIMAL + + """An integer from 0-10""" + POINT_10 + + """An integer from 0-5. Should be represented in Stars""" + POINT_5 + + """ + An integer from 0-3. Should be represented in Smileys. 0 => No Score, 1 => :(, 2 => :|, 3 => :) + """ + POINT_3 +} + +"""A user's list options for anime or manga lists""" +type MediaListTypeOptions { + """The order each list should be displayed in""" + sectionOrder: [String] + + """If the completed sections of the list should be separated by format""" + splitCompletedSectionByFormat: Boolean + + """The list theme options""" + theme: Json @deprecated(reason: "This field has not yet been fully implemented and may change without warning") + + """The names of the user's custom lists""" + customLists: [String] + + """The names of the user's advanced scoring sections""" + advancedScoring: [String] + + """If advanced scoring is enabled""" + advancedScoringEnabled: Boolean +} + +"""User's favourite anime, manga, characters, staff & studios""" +type Favourites { + """Favourite anime""" + anime( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """Favourite manga""" + manga( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """Favourite characters""" + characters( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): CharacterConnection + + """Favourite staff""" + staff( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): StaffConnection + + """Favourite studios""" + studios( + """The page number""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): StudioConnection +} + +type MediaConnection { + edges: [MediaEdge] + nodes: [Media] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Media connection edge""" +type MediaEdge { + node: Media + + """The id of the connection""" + id: Int + + """The type of relation to the parent model""" + relationType( + """Provide 2 to use new version 2 of relation enum""" + version: Int + ): MediaRelation + + """ + If the studio is the main animation studio of the media (For Studio->MediaConnection field only) + """ + isMainStudio: Boolean! + + """The characters in the media voiced by the parent actor""" + characters: [Character] + + """The characters role in the media""" + characterRole: CharacterRole + + """Media specific character name""" + characterName: String + + """Notes regarding the VA's role for the character""" + roleNotes: String + + """ + Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant. + """ + dubGroup: String + + """The role of the staff member in the production of the media""" + staffRole: String + + """The voice actors of the character""" + voiceActors(language: StaffLanguage, sort: [StaffSort]): [Staff] + + """The voice actors of the character with role date""" + voiceActorRoles(language: StaffLanguage, sort: [StaffSort]): [StaffRoleType] + + """The order the media should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""Anime or Manga""" +type Media { + """The id of the media""" + id: Int! + + """The mal id of the media""" + idMal: Int + + """The official titles of the media in various languages""" + title: MediaTitle + + """The type of the media; anime or manga""" + type: MediaType + + """The format the media was released in""" + format: MediaFormat + + """The current releasing status of the media""" + status( + """Provide 2 to use new version 2 of sources enum""" + version: Int + ): MediaStatus + + """Short description of the media's story and characters""" + description( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The first official release date of the media""" + startDate: FuzzyDate + + """The last official release date of the media""" + endDate: FuzzyDate + + """The season the media was initially released in""" + season: MediaSeason + + """The season year the media was initially released in""" + seasonYear: Int + + """The year & season the media was initially released in""" + seasonInt: Int @deprecated(reason: "") + + """The amount of episodes the anime has when complete""" + episodes: Int + + """The general length of each anime episode in minutes""" + duration: Int + + """The amount of chapters the manga has when complete""" + chapters: Int + + """The amount of volumes the manga has when complete""" + volumes: Int + + """Where the media was created. (ISO 3166-1 alpha-2)""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Source type the media was adapted from.""" + source( + """Provide 2 or 3 to use new version 2 or 3 of sources enum""" + version: Int + ): MediaSource + + """Official Twitter hashtags for the media""" + hashtag: String + + """Media trailer or advertisement""" + trailer: MediaTrailer + + """When the media's data was last updated""" + updatedAt: Int + + """The cover images of the media""" + coverImage: MediaCoverImage + + """The banner image of the media""" + bannerImage: String + + """The genres of the media""" + genres: [String] + + """Alternative titles of the media""" + synonyms: [String] + + """A weighted average score of all the user's scores of the media""" + averageScore: Int + + """Mean score of all the user's scores of the media""" + meanScore: Int + + """The number of users with the media on their list""" + popularity: Int + + """ + Locked media may not be added to lists our favorited. This may be due to the entry pending for deletion or other reasons. + """ + isLocked: Boolean + + """The amount of related activity in the past hour""" + trending: Int + + """The amount of user's who have favourited the media""" + favourites: Int + + """List of tags that describes elements and themes of the media""" + tags: [MediaTag] + + """Other media in the same or connecting franchise""" + relations: MediaConnection + + """The characters in the media""" + characters( + sort: [CharacterSort] + role: CharacterRole + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): CharacterConnection + + """The staff who produced the media""" + staff( + sort: [StaffSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): StaffConnection + + """The companies who produced the media""" + studios(sort: [StudioSort], isMain: Boolean): StudioConnection + + """If the media is marked as favourite by the current authenticated user""" + isFavourite: Boolean! + + """If the media is blocked from being added to favourites""" + isFavouriteBlocked: Boolean! + + """If the media is intended only for 18+ adult audiences""" + isAdult: Boolean + + """The media's next episode airing schedule""" + nextAiringEpisode: AiringSchedule + + """The media's entire airing schedule""" + airingSchedule( + """Filter to episodes that have not yet aired""" + notYetAired: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): AiringScheduleConnection + + """The media's daily trend stats""" + trends( + sort: [MediaTrendSort] + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaTrendConnection + + """External links to another site related to the media""" + externalLinks: [MediaExternalLink] + + """Data and links to legal streaming episodes on external sites""" + streamingEpisodes: [MediaStreamingEpisode] + + """ + The ranking of the media in a particular time span and format compared to other media + """ + rankings: [MediaRank] + + """The authenticated user's media list entry for the media""" + mediaListEntry: MediaList + + """User reviews of the media""" + reviews( + limit: Int + sort: [ReviewSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): ReviewConnection + + """User recommendations for similar media""" + recommendations( + sort: [RecommendationSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): RecommendationConnection + stats: MediaStats + + """The url for the media page on the AniList website""" + siteUrl: String + + """ + If the media should have forum thread automatically created for it on airing episode release + """ + autoCreateForumThread: Boolean + + """If the media is blocked from being recommended to/from""" + isRecommendationBlocked: Boolean + + """If the media is blocked from being reviewed""" + isReviewBlocked: Boolean + + """Notes for site moderators""" + modNotes: String +} + +"""The official titles of the media in various languages""" +type MediaTitle { + """The romanization of the native language title""" + romaji(stylised: Boolean): String + + """The official english title""" + english(stylised: Boolean): String + + """Official title in it's native language""" + native(stylised: Boolean): String + + """ + The currently authenticated users preferred title language. Default romaji for non-authenticated + """ + userPreferred: String +} + +"""Media type enum, anime or manga.""" +enum MediaType { + """Japanese Anime""" + ANIME + + """Asian comic""" + MANGA +} + +"""The format the media was released in""" +enum MediaFormat { + """Anime broadcast on television""" + TV + + """Anime which are under 15 minutes in length and broadcast on television""" + TV_SHORT + + """Anime movies with a theatrical release""" + MOVIE + + """ + Special episodes that have been included in DVD/Blu-ray releases, picture dramas, pilots, etc + """ + SPECIAL + + """ + (Original Video Animation) Anime that have been released directly on DVD/Blu-ray without originally going through a theatrical release or television broadcast + """ + OVA + + """ + (Original Net Animation) Anime that have been originally released online or are only available through streaming services. + """ + ONA + + """Short anime released as a music video""" + MUSIC + + """Professionally published manga with more than one chapter""" + MANGA + + """Written books released as a series of light novels""" + NOVEL + + """Manga with just one chapter""" + ONE_SHOT +} + +"""The current releasing status of the media""" +enum MediaStatus { + """Has completed and is no longer being released""" + FINISHED + + """Currently releasing""" + RELEASING + + """To be released at a later date""" + NOT_YET_RELEASED + + """Ended before the work could be finished""" + CANCELLED + + """ + Version 2 only. Is currently paused from releasing and will resume at a later date + """ + HIATUS +} + +"""Date object that allows for incomplete date values (fuzzy)""" +type FuzzyDate { + """Numeric Year (2017)""" + year: Int + + """Numeric Month (3)""" + month: Int + + """Numeric Day (24)""" + day: Int +} + +enum MediaSeason { + """Months December to February""" + WINTER + + """Months March to May""" + SPRING + + """Months June to August""" + SUMMER + + """Months September to November""" + FALL +} + +"""ISO 3166-1 alpha-2 country code""" +scalar CountryCode + +"""Source type the media was adapted from""" +enum MediaSource { + """An original production not based of another work""" + ORIGINAL + + """Asian comic book""" + MANGA + + """Written work published in volumes""" + LIGHT_NOVEL + + """Video game driven primary by text and narrative""" + VISUAL_NOVEL + + """Video game""" + VIDEO_GAME + + """Other""" + OTHER + + """Version 2+ only. Written works not published in volumes""" + NOVEL + + """Version 2+ only. Self-published works""" + DOUJINSHI + + """Version 2+ only. Japanese Anime""" + ANIME + + """Version 3 only. Written works published online""" + WEB_NOVEL + + """Version 3 only. Live action media such as movies or TV show""" + LIVE_ACTION + + """Version 3 only. Games excluding video games""" + GAME + + """Version 3 only. Comics excluding manga""" + COMIC + + """Version 3 only. Multimedia project""" + MULTIMEDIA_PROJECT + + """Version 3 only. Picture book""" + PICTURE_BOOK +} + +"""Media trailer or advertisement""" +type MediaTrailer { + """The trailer video id""" + id: String + + """ + The site the video is hosted by (Currently either youtube or dailymotion) + """ + site: String + + """The url for the thumbnail image of the video""" + thumbnail: String +} + +type MediaCoverImage { + """ + The cover image url of the media at its largest size. If this size isn't available, large will be provided instead. + """ + extraLarge: String + + """The cover image url of the media at a large size""" + large: String + + """The cover image url of the media at medium size""" + medium: String + + """Average #hex color of cover image""" + color: String +} + +"""A tag that describes a theme or element of the media""" +type MediaTag { + """The id of the tag""" + id: Int! + + """The name of the tag""" + name: String! + + """A general description of the tag""" + description: String + + """The categories of tags this tag belongs to""" + category: String + + """The relevance ranking of the tag out of the 100 for this media""" + rank: Int + + """If the tag could be a spoiler for any media""" + isGeneralSpoiler: Boolean + + """If the tag is a spoiler for this media""" + isMediaSpoiler: Boolean + + """If the tag is only for adult 18+ media""" + isAdult: Boolean + + """The user who submitted the tag""" + userId: Int +} + +"""Character sort enums""" +enum CharacterSort { + ID + ID_DESC + ROLE + ROLE_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC + + """Order manually decided by moderators""" + RELEVANCE +} + +"""The role the character plays in the media""" +enum CharacterRole { + """A primary character role in the media""" + MAIN + + """A supporting character role in the media""" + SUPPORTING + + """A background character in the media""" + BACKGROUND +} + +type CharacterConnection { + edges: [CharacterEdge] + nodes: [Character] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Character connection edge""" +type CharacterEdge { + node: Character + + """The id of the connection""" + id: Int + + """The characters role in the media""" + role: CharacterRole + + """Media specific character name""" + name: String + + """The voice actors of the character""" + voiceActors(language: StaffLanguage, sort: [StaffSort]): [Staff] + + """The voice actors of the character with role date""" + voiceActorRoles(language: StaffLanguage, sort: [StaffSort]): [StaffRoleType] + + """The media the character is in""" + media: [Media] + + """The order the character should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""A character that features in an anime or manga""" +type Character { + """The id of the character""" + id: Int! + + """The names of the character""" + name: CharacterName + + """Character images""" + image: CharacterImage + + """A general description of the character""" + description( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """ + The character's gender. Usually Male, Female, or Non-binary but can be any string. + """ + gender: String + + """The character's birth date""" + dateOfBirth: FuzzyDate + + """ + The character's age. Note this is a string, not an int, it may contain further text and additional ages. + """ + age: String + + """The characters blood type""" + bloodType: String + + """ + If the character is marked as favourite by the currently authenticated user + """ + isFavourite: Boolean! + + """If the character is blocked from being added to favourites""" + isFavouriteBlocked: Boolean! + + """The url for the character page on the AniList website""" + siteUrl: String + + """Media that includes the character""" + media( + sort: [MediaSort] + type: MediaType + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + updatedAt: Int @deprecated(reason: "No data available") + + """The amount of user's who have favourited the character""" + favourites: Int + + """Notes for site moderators""" + modNotes: String +} + +"""The names of the character""" +type CharacterName { + """The character's given name""" + first: String + + """The character's middle name""" + middle: String + + """The character's surname""" + last: String + + """The character's first and last name""" + full: String + + """The character's full name in their native language""" + native: String + + """Other names the character might be referred to as""" + alternative: [String] + + """Other names the character might be referred to as but are spoilers""" + alternativeSpoiler: [String] + + """ + The currently authenticated users preferred name language. Default romaji for non-authenticated + """ + userPreferred: String +} + +type CharacterImage { + """The character's image of media at its largest size""" + large: String + + """The character's image of media at medium size""" + medium: String +} + +"""Media sort enums""" +enum MediaSort { + ID + ID_DESC + TITLE_ROMAJI + TITLE_ROMAJI_DESC + TITLE_ENGLISH + TITLE_ENGLISH_DESC + TITLE_NATIVE + TITLE_NATIVE_DESC + TYPE + TYPE_DESC + FORMAT + FORMAT_DESC + START_DATE + START_DATE_DESC + END_DATE + END_DATE_DESC + SCORE + SCORE_DESC + POPULARITY + POPULARITY_DESC + TRENDING + TRENDING_DESC + EPISODES + EPISODES_DESC + DURATION + DURATION_DESC + STATUS + STATUS_DESC + CHAPTERS + CHAPTERS_DESC + VOLUMES + VOLUMES_DESC + UPDATED_AT + UPDATED_AT_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC +} + +"""The primary language of the voice actor""" +enum StaffLanguage { + """Japanese""" + JAPANESE + + """English""" + ENGLISH + + """Korean""" + KOREAN + + """Italian""" + ITALIAN + + """Spanish""" + SPANISH + + """Portuguese""" + PORTUGUESE + + """French""" + FRENCH + + """German""" + GERMAN + + """Hebrew""" + HEBREW + + """Hungarian""" + HUNGARIAN +} + +"""Staff sort enums""" +enum StaffSort { + ID + ID_DESC + ROLE + ROLE_DESC + LANGUAGE + LANGUAGE_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC + + """Order manually decided by moderators""" + RELEVANCE +} + +"""Voice actors or production staff""" +type Staff { + """The id of the staff member""" + id: Int! + + """The names of the staff member""" + name: StaffName + + """The primary language the staff member dub's in""" + language: StaffLanguage @deprecated(reason: "Replaced with languageV2") + + """ + The primary language of the staff member. Current values: Japanese, English, Korean, Italian, Spanish, Portuguese, French, German, Hebrew, Hungarian, Chinese, Arabic, Filipino, Catalan, Finnish, Turkish, Dutch, Swedish, Thai, Tagalog, Malaysian, Indonesian, Vietnamese, Nepali, Hindi, Urdu + """ + languageV2: String + + """The staff images""" + image: StaffImage + + """A general description of the staff member""" + description( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The person's primary occupations""" + primaryOccupations: [String] + + """ + The staff's gender. Usually Male, Female, or Non-binary but can be any string. + """ + gender: String + dateOfBirth: FuzzyDate + dateOfDeath: FuzzyDate + + """The person's age in years""" + age: Int + + """ + [startYear, endYear] (If the 2nd value is not present staff is still active) + """ + yearsActive: [Int] + + """The persons birthplace or hometown""" + homeTown: String + + """The persons blood type""" + bloodType: String + + """ + If the staff member is marked as favourite by the currently authenticated user + """ + isFavourite: Boolean! + + """If the staff member is blocked from being added to favourites""" + isFavouriteBlocked: Boolean! + + """The url for the staff page on the AniList website""" + siteUrl: String + + """Media where the staff member has a production role""" + staffMedia( + sort: [MediaSort] + type: MediaType + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """Characters voiced by the actor""" + characters( + sort: [CharacterSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): CharacterConnection + + """ + Media the actor voiced characters in. (Same data as characters with media as node instead of characters) + """ + characterMedia( + sort: [MediaSort] + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + updatedAt: Int @deprecated(reason: "No data available") + + """Staff member that the submission is referencing""" + staff: Staff + + """Submitter for the submission""" + submitter: User + + """Status of the submission""" + submissionStatus: Int + + """Inner details of submission status""" + submissionNotes: String + + """The amount of user's who have favourited the staff member""" + favourites: Int + + """Notes for site moderators""" + modNotes: String +} + +"""The names of the staff member""" +type StaffName { + """The person's given name""" + first: String + + """The person's middle name""" + middle: String + + """The person's surname""" + last: String + + """The person's first and last name""" + full: String + + """The person's full name in their native language""" + native: String + + """Other names the staff member might be referred to as (pen names)""" + alternative: [String] + + """ + The currently authenticated users preferred name language. Default romaji for non-authenticated + """ + userPreferred: String +} + +type StaffImage { + """The person's image of media at its largest size""" + large: String + + """The person's image of media at medium size""" + medium: String +} + +"""Voice actor role for a character""" +type StaffRoleType { + """The voice actors of the character""" + voiceActor: Staff + + """Notes regarding the VA's role for the character""" + roleNotes: String + + """ + Used for grouping roles where multiple dubs exist for the same language. Either dubbing company name or language variant. + """ + dubGroup: String +} + +type StaffConnection { + edges: [StaffEdge] + nodes: [Staff] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Staff connection edge""" +type StaffEdge { + node: Staff + + """The id of the connection""" + id: Int + + """The role of the staff member in the production of the media""" + role: String + + """The order the staff should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""Studio sort enums""" +enum StudioSort { + ID + ID_DESC + NAME + NAME_DESC + SEARCH_MATCH + FAVOURITES + FAVOURITES_DESC +} + +type StudioConnection { + edges: [StudioEdge] + nodes: [Studio] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Studio connection edge""" +type StudioEdge { + node: Studio + + """The id of the connection""" + id: Int + + """If the studio is the main animation studio of the anime""" + isMain: Boolean! + + """The order the character should be displayed from the users favourites""" + favouriteOrder: Int +} + +"""Animation or production company""" +type Studio { + """The id of the studio""" + id: Int! + + """The name of the studio""" + name: String! + + """If the studio is an animation studio or a different kind of company""" + isAnimationStudio: Boolean! + + """The media the studio has worked on""" + media( + """The order the results will be returned in""" + sort: [MediaSort] + + """If the studio was the primary animation studio of the media""" + isMain: Boolean + onList: Boolean + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): MediaConnection + + """The url for the studio page on the AniList website""" + siteUrl: String + + """ + If the studio is marked as favourite by the currently authenticated user + """ + isFavourite: Boolean! + + """The amount of user's who have favourited the studio""" + favourites: Int +} + +""" +Media Airing Schedule. NOTE: We only aim to guarantee that FUTURE airing data is present and accurate. +""" +type AiringSchedule { + """The id of the airing schedule item""" + id: Int! + + """The time the episode airs at""" + airingAt: Int! + + """Seconds until episode starts airing""" + timeUntilAiring: Int! + + """The airing episode number""" + episode: Int! + + """The associate media id of the airing episode""" + mediaId: Int! + + """The associate media of the airing episode""" + media: Media +} + +type AiringScheduleConnection { + edges: [AiringScheduleEdge] + nodes: [AiringSchedule] + + """The pagination information""" + pageInfo: PageInfo +} + +"""AiringSchedule connection edge""" +type AiringScheduleEdge { + node: AiringSchedule + + """The id of the connection""" + id: Int +} + +"""Media trend sort enums""" +enum MediaTrendSort { + ID + ID_DESC + MEDIA_ID + MEDIA_ID_DESC + DATE + DATE_DESC + SCORE + SCORE_DESC + POPULARITY + POPULARITY_DESC + TRENDING + TRENDING_DESC + EPISODE + EPISODE_DESC +} + +type MediaTrendConnection { + edges: [MediaTrendEdge] + nodes: [MediaTrend] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Media trend connection edge""" +type MediaTrendEdge { + node: MediaTrend +} + +"""Daily media statistics""" +type MediaTrend { + """The id of the tag""" + mediaId: Int! + + """The day the data was recorded (timestamp)""" + date: Int! + + """The amount of media activity on the day""" + trending: Int! + + """A weighted average score of all the user's scores of the media""" + averageScore: Int + + """The number of users with the media on their list""" + popularity: Int + + """The number of users with watching/reading the media""" + inProgress: Int + + """If the media was being released at this time""" + releasing: Boolean! + + """The episode number of the anime released on this day""" + episode: Int + + """The related media""" + media: Media +} + +"""An external link to another site related to the media or staff member""" +type MediaExternalLink { + """The id of the external link""" + id: Int! + + """The url of the external link or base url of link source""" + url: String + + """The links website site name""" + site: String! + + """The links website site id""" + siteId: Int + type: ExternalLinkType + + """Language the site content is in. See Staff language field for values.""" + language: String + color: String + + """ + The icon image url of the site. Not available for all links. Transparent PNG 64x64 + """ + icon: String + notes: String + isDisabled: Boolean +} + +enum ExternalLinkType { + INFO + STREAMING + SOCIAL +} + +"""Data and links to legal streaming episodes on external sites""" +type MediaStreamingEpisode { + """Title of the episode""" + title: String + + """Url of episode image thumbnail""" + thumbnail: String + + """The url of the episode""" + url: String + + """The site location of the streaming episodes""" + site: String +} + +""" +The ranking of a media in a particular time span and format compared to other media +""" +type MediaRank { + """The id of the rank""" + id: Int! + + """The numerical rank of the media""" + rank: Int! + + """The type of ranking""" + type: MediaRankType! + + """The format the media is ranked within""" + format: MediaFormat! + + """The year the media is ranked within""" + year: Int + + """The season the media is ranked within""" + season: MediaSeason + + """If the ranking is based on all time instead of a season/year""" + allTime: Boolean + + """String that gives context to the ranking type and time span""" + context: String! +} + +"""The type of ranking""" +enum MediaRankType { + """Ranking is based on the media's ratings/score""" + RATED + + """Ranking is based on the media's popularity""" + POPULAR +} + +"""List of anime or manga""" +type MediaList { + """The id of the list entry""" + id: Int! + + """The id of the user owner of the list entry""" + userId: Int! + + """The id of the media""" + mediaId: Int! + + """The watching/reading status""" + status: MediaListStatus + + """The score of the entry""" + score( + """Force the score to be returned in the provided format type.""" + format: ScoreFormat + ): Float + + """The amount of episodes/chapters consumed by the user""" + progress: Int + + """The amount of volumes read by the user""" + progressVolumes: Int + + """The amount of times the user has rewatched/read the media""" + repeat: Int + + """Priority of planning""" + priority: Int + + """If the entry should only be visible to authenticated user""" + private: Boolean + + """Text notes""" + notes: String + + """If the entry shown be hidden from non-custom lists""" + hiddenFromStatusLists: Boolean + + """Map of booleans for which custom lists the entry are in""" + customLists( + """Change return structure to an array of objects""" + asArray: Boolean + ): Json + + """Map of advanced scores with name keys""" + advancedScores: Json + + """When the entry was started by the user""" + startedAt: FuzzyDate + + """When the entry was completed by the user""" + completedAt: FuzzyDate + + """When the entry data was last updated""" + updatedAt: Int + + """When the entry data was created""" + createdAt: Int + media: Media + user: User +} + +"""Review sort enums""" +enum ReviewSort { + ID + ID_DESC + SCORE + SCORE_DESC + RATING + RATING_DESC + CREATED_AT + CREATED_AT_DESC + UPDATED_AT + UPDATED_AT_DESC +} + +type ReviewConnection { + edges: [ReviewEdge] + nodes: [Review] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Review connection edge""" +type ReviewEdge { + node: Review +} + +"""A Review that features in an anime or manga""" +type Review { + """The id of the review""" + id: Int! + + """The id of the review's creator""" + userId: Int! + + """The id of the review's media""" + mediaId: Int! + + """For which type of media the review is for""" + mediaType: MediaType + + """A short summary of the review""" + summary: String + + """The main review body text""" + body( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The total user rating of the review""" + rating: Int + + """The amount of user ratings of the review""" + ratingAmount: Int + + """The rating of the review by currently authenticated user""" + userRating: ReviewRating + + """The review score of the media""" + score: Int + + """ + If the review is not yet publicly published and is only viewable by creator + """ + private: Boolean + + """The url for the review page on the AniList website""" + siteUrl: String + + """The time of the thread creation""" + createdAt: Int! + + """The time of the thread last update""" + updatedAt: Int! + + """The creator of the review""" + user: User + + """The media the review is of""" + media: Media +} + +"""Review rating enums""" +enum ReviewRating { + NO_VOTE + UP_VOTE + DOWN_VOTE +} + +"""Recommendation sort enums""" +enum RecommendationSort { + ID + ID_DESC + RATING + RATING_DESC +} + +type RecommendationConnection { + edges: [RecommendationEdge] + nodes: [Recommendation] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Recommendation connection edge""" +type RecommendationEdge { + node: Recommendation +} + +"""Media recommendation""" +type Recommendation { + """The id of the recommendation""" + id: Int! + + """Users rating of the recommendation""" + rating: Int + + """The rating of the recommendation by currently authenticated user""" + userRating: RecommendationRating + + """The media the recommendation is from""" + media: Media + + """The recommended media""" + mediaRecommendation: Media + + """The user that first created the recommendation""" + user: User +} + +"""Recommendation rating enums""" +enum RecommendationRating { + NO_RATING + RATE_UP + RATE_DOWN +} + +"""A media's statistics""" +type MediaStats { + scoreDistribution: [ScoreDistribution] + statusDistribution: [StatusDistribution] + airingProgression: [AiringProgression] @deprecated(reason: "Replaced by MediaTrends") +} + +"""A user's list score distribution.""" +type ScoreDistribution { + score: Int + + """The amount of list entries with this score""" + amount: Int +} + +""" +The distribution of the watching/reading status of media or a user's list +""" +type StatusDistribution { + """The day the activity took place (Unix timestamp)""" + status: MediaListStatus + + """The amount of entries with this status""" + amount: Int +} + +"""Score & Watcher stats for airing anime by episode and mid-week""" +type AiringProgression { + """ + The episode the stats were recorded at. .5 is the mid point between 2 episodes airing dates. + """ + episode: Float + + """The average score for the media""" + score: Float + + """The amount of users watching the anime""" + watching: Int +} + +"""Type of relation media has to its parent.""" +enum MediaRelation { + """An adaption of this media into a different format""" + ADAPTATION + + """Released before the relation""" + PREQUEL + + """Released after the relation""" + SEQUEL + + """The media a side story is from""" + PARENT + + """A side story of the parent media""" + SIDE_STORY + + """Shares at least 1 character""" + CHARACTER + + """A shortened and summarized version""" + SUMMARY + + """An alternative version of the same media""" + ALTERNATIVE + + """An alternative version of the media with a different primary focus""" + SPIN_OFF + + """Other""" + OTHER + + """Version 2 only. The source material the media was adapted from""" + SOURCE + + """Version 2 only.""" + COMPILATION + + """Version 2 only.""" + CONTAINS +} + +type UserStatisticTypes { + anime: UserStatistics + manga: UserStatistics +} + +type UserStatistics { + count: Int! + meanScore: Float! + standardDeviation: Float! + minutesWatched: Int! + episodesWatched: Int! + chaptersRead: Int! + volumesRead: Int! + formats(limit: Int, sort: [UserStatisticsSort]): [UserFormatStatistic] + statuses(limit: Int, sort: [UserStatisticsSort]): [UserStatusStatistic] + scores(limit: Int, sort: [UserStatisticsSort]): [UserScoreStatistic] + lengths(limit: Int, sort: [UserStatisticsSort]): [UserLengthStatistic] + releaseYears(limit: Int, sort: [UserStatisticsSort]): [UserReleaseYearStatistic] + startYears(limit: Int, sort: [UserStatisticsSort]): [UserStartYearStatistic] + genres(limit: Int, sort: [UserStatisticsSort]): [UserGenreStatistic] + tags(limit: Int, sort: [UserStatisticsSort]): [UserTagStatistic] + countries(limit: Int, sort: [UserStatisticsSort]): [UserCountryStatistic] + voiceActors(limit: Int, sort: [UserStatisticsSort]): [UserVoiceActorStatistic] + staff(limit: Int, sort: [UserStatisticsSort]): [UserStaffStatistic] + studios(limit: Int, sort: [UserStatisticsSort]): [UserStudioStatistic] +} + +"""User statistics sort enum""" +enum UserStatisticsSort { + ID + ID_DESC + COUNT + COUNT_DESC + PROGRESS + PROGRESS_DESC + MEAN_SCORE + MEAN_SCORE_DESC +} + +type UserFormatStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + format: MediaFormat +} + +type UserStatusStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + status: MediaListStatus +} + +type UserScoreStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + score: Int +} + +type UserLengthStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + length: String +} + +type UserReleaseYearStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + releaseYear: Int +} + +type UserStartYearStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + startYear: Int +} + +type UserGenreStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + genre: String +} + +type UserTagStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + tag: MediaTag +} + +type UserCountryStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + country: CountryCode +} + +type UserVoiceActorStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + voiceActor: Staff + characterIds: [Int]! +} + +type UserStaffStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + staff: Staff +} + +type UserStudioStatistic { + count: Int! + meanScore: Float! + minutesWatched: Int! + chaptersRead: Int! + mediaIds: [Int]! + studio: Studio +} + +"""Mod role enums""" +enum ModRole { + """An AniList administrator""" + ADMIN + + """A head developer of AniList""" + LEAD_DEVELOPER + + """An AniList developer""" + DEVELOPER + + """A lead community moderator""" + LEAD_COMMUNITY + + """A community moderator""" + COMMUNITY + + """A discord community moderator""" + DISCORD_COMMUNITY + + """A lead anime data moderator""" + LEAD_ANIME_DATA + + """An anime data moderator""" + ANIME_DATA + + """A lead manga data moderator""" + LEAD_MANGA_DATA + + """A manga data moderator""" + MANGA_DATA + + """A lead social media moderator""" + LEAD_SOCIAL_MEDIA + + """A social media moderator""" + SOCIAL_MEDIA + + """A retired moderator""" + RETIRED + + """A character data moderator""" + CHARACTER_DATA + + """A staff data moderator""" + STAFF_DATA +} + +"""A user's statistics""" +type UserStats { + """The amount of anime the user has watched in minutes""" + watchedTime: Int + + """The amount of manga chapters the user has read""" + chaptersRead: Int + activityHistory: [UserActivityHistory] + animeStatusDistribution: [StatusDistribution] + mangaStatusDistribution: [StatusDistribution] + animeScoreDistribution: [ScoreDistribution] + mangaScoreDistribution: [ScoreDistribution] + animeListScores: ListScoreStats + mangaListScores: ListScoreStats + favouredGenresOverview: [GenreStats] + favouredGenres: [GenreStats] + favouredTags: [TagStats] + favouredActors: [StaffStats] + favouredStaff: [StaffStats] + favouredStudios: [StudioStats] + favouredYears: [YearStats] + favouredFormats: [FormatStats] +} + +"""A user's activity history stats.""" +type UserActivityHistory { + """The day the activity took place (Unix timestamp)""" + date: Int + + """The amount of activity on the day""" + amount: Int + + """The level of activity represented on a 1-10 scale""" + level: Int +} + +"""User's list score statistics""" +type ListScoreStats { + meanScore: Int + standardDeviation: Int +} + +"""User's genre statistics""" +type GenreStats { + genre: String + amount: Int + meanScore: Int + + """The amount of time in minutes the genre has been watched by the user""" + timeWatched: Int +} + +"""User's tag statistics""" +type TagStats { + tag: MediaTag + amount: Int + meanScore: Int + + """The amount of time in minutes the tag has been watched by the user""" + timeWatched: Int +} + +"""User's staff statistics""" +type StaffStats { + staff: Staff + amount: Int + meanScore: Int + + """ + The amount of time in minutes the staff member has been watched by the user + """ + timeWatched: Int +} + +"""User's studio statistics""" +type StudioStats { + studio: Studio + amount: Int + meanScore: Int + + """ + The amount of time in minutes the studio's works have been watched by the user + """ + timeWatched: Int +} + +"""User's year statistics""" +type YearStats { + year: Int + amount: Int + meanScore: Int +} + +"""User's format statistics""" +type FormatStats { + format: MediaFormat + amount: Int +} + +"""A user's previous name""" +type UserPreviousName { + """A previous name of the user.""" + name: String + + """When the user first changed from this name.""" + createdAt: Int + + """When the user most recently changed from this name.""" + updatedAt: Int +} + +""" +8 digit long date integer (YYYYMMDD). Unknown dates represented by 0. E.g. 2016: 20160000, May 1976: 19760500 +""" +scalar FuzzyDateInt + +"""Media list sort enums""" +enum MediaListSort { + MEDIA_ID + MEDIA_ID_DESC + SCORE + SCORE_DESC + STATUS + STATUS_DESC + PROGRESS + PROGRESS_DESC + PROGRESS_VOLUMES + PROGRESS_VOLUMES_DESC + REPEAT + REPEAT_DESC + PRIORITY + PRIORITY_DESC + STARTED_ON + STARTED_ON_DESC + FINISHED_ON + FINISHED_ON_DESC + ADDED_TIME + ADDED_TIME_DESC + UPDATED_TIME + UPDATED_TIME_DESC + MEDIA_TITLE_ROMAJI + MEDIA_TITLE_ROMAJI_DESC + MEDIA_TITLE_ENGLISH + MEDIA_TITLE_ENGLISH_DESC + MEDIA_TITLE_NATIVE + MEDIA_TITLE_NATIVE_DESC + MEDIA_POPULARITY + MEDIA_POPULARITY_DESC +} + +"""Airing schedule sort enums""" +enum AiringSort { + ID + ID_DESC + MEDIA_ID + MEDIA_ID_DESC + TIME + TIME_DESC + EPISODE + EPISODE_DESC +} + +"""Notification union type""" +union NotificationUnion = AiringNotification | FollowingNotification | ActivityMessageNotification | ActivityMentionNotification | ActivityReplyNotification | ActivityReplySubscribedNotification | ActivityLikeNotification | ActivityReplyLikeNotification | ThreadCommentMentionNotification | ThreadCommentReplyNotification | ThreadCommentSubscribedNotification | ThreadCommentLikeNotification | ThreadLikeNotification | RelatedMediaAdditionNotification | MediaDataChangeNotification | MediaMergeNotification | MediaDeletionNotification + +"""Notification for when an episode of anime airs""" +type AiringNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the aired anime""" + animeId: Int! + + """The episode number that just aired""" + episode: Int! + + """The notification context text""" + contexts: [String] + + """The time the notification was created at""" + createdAt: Int + + """The associated media of the airing schedule""" + media: Media +} + +""" +Notification for when the authenticated user is followed by another user +""" +type FollowingNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who followed the authenticated user""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + user: User +} + +"""Notification for when a user is send an activity message""" +type ActivityMessageNotification { + """The id of the Notification""" + id: Int! + + """The if of the user who send the message""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity message""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The message activity""" + message: MessageActivity + + """The user who sent the message""" + user: User +} + +"""User message activity""" +type MessageActivity { + """The id of the activity""" + id: Int! + + """The user id of the activity's recipient""" + recipientId: Int + + """The user id of the activity's sender""" + messengerId: Int + + """The type of the activity""" + type: ActivityType + + """The number of activity replies""" + replyCount: Int! + + """The message text (Markdown)""" + message( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """If the activity is locked and can receive replies""" + isLocked: Boolean + + """If the currently authenticated user is subscribed to the activity""" + isSubscribed: Boolean + + """The amount of likes the activity has""" + likeCount: Int! + + """If the currently authenticated user liked the activity""" + isLiked: Boolean + + """ + If the message is private and only viewable to the sender and recipients + """ + isPrivate: Boolean + + """The url for the activity page on the AniList website""" + siteUrl: String + + """The time the activity was created at""" + createdAt: Int! + + """The user who the activity message was sent to""" + recipient: User + + """The user who sent the activity message""" + messenger: User + + """The written replies to the activity""" + replies: [ActivityReply] + + """The users who liked the activity""" + likes: [User] +} + +"""Activity type enum.""" +enum ActivityType { + """A text activity""" + TEXT + + """A anime list update activity""" + ANIME_LIST + + """A manga list update activity""" + MANGA_LIST + + """A text message activity sent to another user""" + MESSAGE + + """Anime & Manga list update, only used in query arguments""" + MEDIA_LIST +} + +"""Replay to an activity item""" +type ActivityReply { + """The id of the reply""" + id: Int! + + """The id of the replies creator""" + userId: Int + + """The id of the parent activity""" + activityId: Int + + """The reply text""" + text( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The amount of likes the reply has""" + likeCount: Int! + + """If the currently authenticated user liked the reply""" + isLiked: Boolean + + """The time the reply was created at""" + createdAt: Int! + + """The user who created reply""" + user: User + + """The users who liked the reply""" + likes: [User] +} + +""" +Notification for when authenticated user is @ mentioned in activity or reply +""" +type ActivityMentionNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who mentioned the authenticated user""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity where mentioned""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who mentioned the authenticated user""" + user: User +} + +"""Activity union type""" +union ActivityUnion = TextActivity | ListActivity | MessageActivity + +"""User text activity""" +type TextActivity { + """The id of the activity""" + id: Int! + + """The user id of the activity's creator""" + userId: Int + + """The type of activity""" + type: ActivityType + + """The number of activity replies""" + replyCount: Int! + + """The status text (Markdown)""" + text( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The url for the activity page on the AniList website""" + siteUrl: String + + """If the activity is locked and can receive replies""" + isLocked: Boolean + + """If the currently authenticated user is subscribed to the activity""" + isSubscribed: Boolean + + """The amount of likes the activity has""" + likeCount: Int! + + """If the currently authenticated user liked the activity""" + isLiked: Boolean + + """If the activity is pinned to the top of the users activity feed""" + isPinned: Boolean + + """The time the activity was created at""" + createdAt: Int! + + """The user who created the activity""" + user: User + + """The written replies to the activity""" + replies: [ActivityReply] + + """The users who liked the activity""" + likes: [User] +} + +"""User list activity (anime & manga updates)""" +type ListActivity { + """The id of the activity""" + id: Int! + + """The user id of the activity's creator""" + userId: Int + + """The type of activity""" + type: ActivityType + + """The number of activity replies""" + replyCount: Int! + + """The list item's textual status""" + status: String + + """The list progress made""" + progress: String + + """If the activity is locked and can receive replies""" + isLocked: Boolean + + """If the currently authenticated user is subscribed to the activity""" + isSubscribed: Boolean + + """The amount of likes the activity has""" + likeCount: Int! + + """If the currently authenticated user liked the activity""" + isLiked: Boolean + + """If the activity is pinned to the top of the users activity feed""" + isPinned: Boolean + + """The url for the activity page on the AniList website""" + siteUrl: String + + """The time the activity was created at""" + createdAt: Int! + + """The owner of the activity""" + user: User + + """The associated media to the activity update""" + media: Media + + """The written replies to the activity""" + replies: [ActivityReply] + + """The users who liked the activity""" + likes: [User] +} + +""" +Notification for when a user replies to the authenticated users activity +""" +type ActivityReplyNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who replied to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was replied too""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who replied to the activity""" + user: User +} + +""" +Notification for when a user replies to activity the authenticated user has replied to +""" +type ActivityReplySubscribedNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who replied to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was replied too""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who replied to the activity""" + user: User +} + +"""Notification for when a activity is liked""" +type ActivityLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was liked""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who liked the activity""" + user: User +} + +"""Notification for when a activity reply is liked""" +type ActivityReplyLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity reply""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity where the reply which was liked""" + activityId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The liked activity""" + activity: ActivityUnion + + """The user who liked the activity reply""" + user: User +} + +""" +Notification for when authenticated user is @ mentioned in a forum thread comment +""" +type ThreadCommentMentionNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who mentioned the authenticated user""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the comment where mentioned""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The thread comment that included the @ mention""" + comment: ThreadComment + + """The user who mentioned the authenticated user""" + user: User +} + +"""Forum Thread""" +type Thread { + """The id of the thread""" + id: Int! + + """The title of the thread""" + title: String + + """The text body of the thread (Markdown)""" + body( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The id of the thread owner user""" + userId: Int! + + """The id of the user who most recently commented on the thread""" + replyUserId: Int + + """The id of the most recent comment on the thread""" + replyCommentId: Int + + """The number of comments on the thread""" + replyCount: Int + + """The number of times users have viewed the thread""" + viewCount: Int + + """If the thread is locked and can receive comments""" + isLocked: Boolean + + """ + If the thread is stickied and should be displayed at the top of the page + """ + isSticky: Boolean + + """If the currently authenticated user is subscribed to the thread""" + isSubscribed: Boolean + + """The amount of likes the thread has""" + likeCount: Int! + + """If the currently authenticated user liked the thread""" + isLiked: Boolean + + """The time of the last reply""" + repliedAt: Int + + """The time of the thread creation""" + createdAt: Int! + + """The time of the thread last update""" + updatedAt: Int! + + """The owner of the thread""" + user: User + + """The user to last reply to the thread""" + replyUser: User + + """The users who liked the thread""" + likes: [User] + + """The url for the thread page on the AniList website""" + siteUrl: String + + """The categories of the thread""" + categories: [ThreadCategory] + + """The media categories of the thread""" + mediaCategories: [Media] +} + +"""A forum thread category""" +type ThreadCategory { + """The id of the category""" + id: Int! + + """The name of the category""" + name: String! +} + +"""Forum Thread Comment""" +type ThreadComment { + """The id of the comment""" + id: Int! + + """The user id of the comment's owner""" + userId: Int + + """The id of thread the comment belongs to""" + threadId: Int + + """The text content of the comment (Markdown)""" + comment( + """Return the string in pre-parsed html instead of markdown""" + asHtml: Boolean + ): String + + """The amount of likes the comment has""" + likeCount: Int! + + """If the currently authenticated user liked the comment""" + isLiked: Boolean + + """The url for the comment page on the AniList website""" + siteUrl: String + + """The time of the comments creation""" + createdAt: Int! + + """The time of the comments last update""" + updatedAt: Int! + + """The thread the comment belongs to""" + thread: Thread + + """The user who created the comment""" + user: User + + """The users who liked the comment""" + likes: [User] + + """The comment's child reply comments""" + childComments: Json + + """If the comment tree is locked and may not receive replies or edits""" + isLocked: Boolean +} + +"""Notification for when a user replies to your forum thread comment""" +type ThreadCommentReplyNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who create the comment reply""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the reply comment""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The reply thread comment""" + comment: ThreadComment + + """The user who replied to the activity""" + user: User +} + +"""Notification for when a user replies to a subscribed forum thread""" +type ThreadCommentSubscribedNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who commented on the thread""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the new comment in the subscribed thread""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The reply thread comment""" + comment: ThreadComment + + """The user who replied to the subscribed thread""" + user: User +} + +"""Notification for when a thread comment is liked""" +type ThreadCommentLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the activity which was liked""" + commentId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The thread comment that was liked""" + comment: ThreadComment + + """The user who liked the activity""" + user: User +} + +"""Notification for when a thread is liked""" +type ThreadLikeNotification { + """The id of the Notification""" + id: Int! + + """The id of the user who liked to the activity""" + userId: Int! + + """The type of notification""" + type: NotificationType + + """The id of the thread which was liked""" + threadId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The thread that the relevant comment belongs to""" + thread: Thread + + """The liked thread comment""" + comment: ThreadComment + + """The user who liked the activity""" + user: User +} + +"""Notification for when new media is added to the site""" +type RelatedMediaAdditionNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the new media""" + mediaId: Int! + + """The notification context text""" + context: String + + """The time the notification was created at""" + createdAt: Int + + """The associated media of the airing schedule""" + media: Media +} + +""" +Notification for when a media entry's data was changed in a significant way impacting users' list tracking +""" +type MediaDataChangeNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the media that received data changes""" + mediaId: Int! + + """The reason for the media data change""" + context: String + + """The reason for the media data change""" + reason: String + + """The time the notification was created at""" + createdAt: Int + + """The media that received data changes""" + media: Media +} + +""" +Notification for when a media entry is merged into another for a user who had it on their list +""" +type MediaMergeNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The id of the media that was merged into""" + mediaId: Int! + + """The title of the deleted media""" + deletedMediaTitles: [String] + + """The reason for the media data change""" + context: String + + """The reason for the media merge""" + reason: String + + """The time the notification was created at""" + createdAt: Int + + """The media that was merged into""" + media: Media +} + +""" +Notification for when a media tracked in a user's list is deleted from the site +""" +type MediaDeletionNotification { + """The id of the Notification""" + id: Int! + + """The type of notification""" + type: NotificationType + + """The title of the deleted media""" + deletedMediaTitle: String + + """The reason for the media deletion""" + context: String + + """The reason for the media deletion""" + reason: String + + """The time the notification was created at""" + createdAt: Int +} + +"""Activity sort enums""" +enum ActivitySort { + ID + ID_DESC + PINNED +} + +"""Thread sort enums""" +enum ThreadSort { + ID + ID_DESC + TITLE + TITLE_DESC + CREATED_AT + CREATED_AT_DESC + UPDATED_AT + UPDATED_AT_DESC + REPLIED_AT + REPLIED_AT_DESC + REPLY_COUNT + REPLY_COUNT_DESC + VIEW_COUNT + VIEW_COUNT_DESC + IS_STICKY + SEARCH_MATCH +} + +"""Thread comments sort enums""" +enum ThreadCommentSort { + ID + ID_DESC +} + +"""Types that can be liked""" +enum LikeableType { + THREAD + THREAD_COMMENT + ACTIVITY + ACTIVITY_REPLY +} + +"""List of anime or manga""" +type MediaListCollection { + """Grouped media list entries""" + lists: [MediaListGroup] + + """The owner of the list""" + user: User + + """If there is another chunk""" + hasNextChunk: Boolean + + """A map of media list entry arrays grouped by status""" + statusLists(asArray: Boolean): [[MediaList]] @deprecated(reason: "Not GraphQL spec compliant, use lists field instead.") + + """A map of media list entry arrays grouped by custom lists""" + customLists(asArray: Boolean): [[MediaList]] @deprecated(reason: "Not GraphQL spec compliant, use lists field instead.") +} + +"""List group of anime or manga entries""" +type MediaListGroup { + """Media list entries""" + entries: [MediaList] + name: String + isCustomList: Boolean + isSplitCompletedList: Boolean + status: MediaListStatus +} + +"""Provides the parsed markdown as html""" +type ParsedMarkdown { + """The parsed markdown as html""" + html: String +} + +type AniChartUser { + user: User + settings: Json + highlights: Json +} + +type SiteStatistics { + users( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + anime( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + manga( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + characters( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + staff( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + studios( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection + reviews( + sort: [SiteTrendSort] + + """The page""" + page: Int + + """The amount of entries per page, max 25""" + perPage: Int + ): SiteTrendConnection +} + +"""Site trend sort enums""" +enum SiteTrendSort { + DATE + DATE_DESC + COUNT + COUNT_DESC + CHANGE + CHANGE_DESC +} + +type SiteTrendConnection { + edges: [SiteTrendEdge] + nodes: [SiteTrend] + + """The pagination information""" + pageInfo: PageInfo +} + +"""Site trend connection edge""" +type SiteTrendEdge { + node: SiteTrend +} + +"""Daily site statistics""" +type SiteTrend { + """The day the data was recorded (timestamp)""" + date: Int! + count: Int! + + """The change from yesterday""" + change: Int! +} + +enum ExternalLinkMediaType { + ANIME + MANGA + STAFF +} + +type Mutation { + UpdateUser( + """User's about/bio text""" + about: String + + """User's title language""" + titleLanguage: UserTitleLanguage + + """If the user should see media marked as adult-only""" + displayAdultContent: Boolean + + """ + If the user should get notifications when a show they are watching aires + """ + airingNotifications: Boolean + + """The user's list scoring system""" + scoreFormat: ScoreFormat + + """The user's default list order""" + rowOrder: String + + """Profile highlight color""" + profileColor: String + + """Profile highlight color""" + donatorBadge: String + + """Notification options""" + notificationOptions: [NotificationOptionInput] + + """Timezone offset format: -?HH:MM""" + timezone: String + + """ + Minutes between activity for them to be merged together. 0 is Never, Above 2 weeks (20160 mins) is Always. + """ + activityMergeTime: Int + + """The user's anime list options""" + animeListOptions: MediaListOptionsInput + + """The user's anime list options""" + mangaListOptions: MediaListOptionsInput + + """The language the user wants to see staff and character names in""" + staffNameLanguage: UserStaffNameLanguage + + """Only allow messages from other users the user follows""" + restrictMessagesToFollowing: Boolean + disabledListActivity: [ListActivityOptionInput] + ): User + + """Create or update a media list entry""" + SaveMediaListEntry( + """The list entry id, required for updating""" + id: Int + + """The id of the media the entry is of""" + mediaId: Int + + """The watching/reading status""" + status: MediaListStatus + + """The score of the media in the user's chosen scoring method""" + score: Float + + """The score of the media in 100 point""" + scoreRaw: Int + + """The amount of episodes/chapters consumed by the user""" + progress: Int + + """The amount of volumes read by the user""" + progressVolumes: Int + + """The amount of times the user has rewatched/read the media""" + repeat: Int + + """Priority of planning""" + priority: Int + + """If the entry should only be visible to authenticated user""" + private: Boolean + + """Text notes""" + notes: String + + """If the entry shown be hidden from non-custom lists""" + hiddenFromStatusLists: Boolean + + """Array of custom list names which should be enabled for this entry""" + customLists: [String] + + """Array of advanced scores""" + advancedScores: [Float] + + """When the entry was started by the user""" + startedAt: FuzzyDateInput + + """When the entry was completed by the user""" + completedAt: FuzzyDateInput + ): MediaList + + """Update multiple media list entries to the same values""" + UpdateMediaListEntries( + """The watching/reading status""" + status: MediaListStatus + + """The score of the media in the user's chosen scoring method""" + score: Float + + """The score of the media in 100 point""" + scoreRaw: Int + + """The amount of episodes/chapters consumed by the user""" + progress: Int + + """The amount of volumes read by the user""" + progressVolumes: Int + + """The amount of times the user has rewatched/read the media""" + repeat: Int + + """Priority of planning""" + priority: Int + + """If the entry should only be visible to authenticated user""" + private: Boolean + + """Text notes""" + notes: String + + """If the entry shown be hidden from non-custom lists""" + hiddenFromStatusLists: Boolean + + """Array of advanced scores""" + advancedScores: [Float] + + """When the entry was started by the user""" + startedAt: FuzzyDateInput + + """When the entry was completed by the user""" + completedAt: FuzzyDateInput + + """The list entries ids to update""" + ids: [Int] + ): [MediaList] + + """Delete a media list entry""" + DeleteMediaListEntry( + """The id of the media list entry to delete""" + id: Int + ): Deleted + + """Delete a custom list and remove the list entries from it""" + DeleteCustomList( + """The name of the custom list to delete""" + customList: String + + """The media list type of the custom list""" + type: MediaType + ): Deleted + + """Create or update text activity for the currently authenticated user""" + SaveTextActivity( + """The activity's id, required for updating""" + id: Int + + """The activity text""" + text: String + + """If the activity should be locked. (Mod Only)""" + locked: Boolean + ): TextActivity + + """Create or update message activity for the currently authenticated user""" + SaveMessageActivity( + """The activity id, required for updating""" + id: Int + + """The activity message text""" + message: String + + """The id of the user the message is being sent to""" + recipientId: Int + + """If the activity should be private""" + private: Boolean + + """If the activity should be locked. (Mod Only)""" + locked: Boolean + + """If the message should be sent from the Moderator account (Mod Only)""" + asMod: Boolean + ): MessageActivity + + """Update list activity (Mod Only)""" + SaveListActivity( + """The activity's id, required for updating""" + id: Int + + """If the activity should be locked. (Mod Only)""" + locked: Boolean + ): ListActivity + + """Delete an activity item of the authenticated users""" + DeleteActivity( + """The id of the activity to delete""" + id: Int + ): Deleted + + """Toggle activity to be pinned to the top of the user's activity feed""" + ToggleActivityPin( + """Toggle activity id to be pinned""" + id: Int + + """If the activity should be pinned or unpinned""" + pinned: Boolean + ): ActivityUnion + + """Toggle the subscription of an activity item""" + ToggleActivitySubscription( + """The id of the activity to un/subscribe""" + activityId: Int + + """Whether to subscribe or unsubscribe from the activity""" + subscribe: Boolean + ): ActivityUnion + + """Create or update an activity reply""" + SaveActivityReply( + """The activity reply id, required for updating""" + id: Int + + """The id of the parent activity being replied to""" + activityId: Int + + """The reply text""" + text: String + + """If the reply should be sent from the Moderator account (Mod Only)""" + asMod: Boolean + ): ActivityReply + + """Delete an activity reply of the authenticated users""" + DeleteActivityReply( + """The id of the reply to delete""" + id: Int + ): Deleted + + """ + Add or remove a like from a likeable type. + Returns all the users who liked the same model + """ + ToggleLike( + """The id of the likeable type""" + id: Int + + """The type of model to be un/liked""" + type: LikeableType + ): [User] + + """Add or remove a like from a likeable type.""" + ToggleLikeV2( + """The id of the likeable type""" + id: Int + + """The type of model to be un/liked""" + type: LikeableType + ): LikeableUnion + + """Toggle the un/following of a user""" + ToggleFollow( + """The id of the user to un/follow""" + userId: Int + ): User + + """ + Favourite or unfavourite an anime, manga, character, staff member, or studio + """ + ToggleFavourite( + """The id of the anime to un/favourite""" + animeId: Int + + """The id of the manga to un/favourite""" + mangaId: Int + + """The id of the character to un/favourite""" + characterId: Int + + """The id of the staff to un/favourite""" + staffId: Int + + """The id of the studio to un/favourite""" + studioId: Int + ): Favourites + + """Update the order favourites are displayed in""" + UpdateFavouriteOrder( + """The id of the anime to un/favourite""" + animeIds: [Int] + + """The id of the manga to un/favourite""" + mangaIds: [Int] + + """The id of the character to un/favourite""" + characterIds: [Int] + + """The id of the staff to un/favourite""" + staffIds: [Int] + + """The id of the studio to un/favourite""" + studioIds: [Int] + + """List of integers which the anime should be ordered by (Asc)""" + animeOrder: [Int] + + """List of integers which the manga should be ordered by (Asc)""" + mangaOrder: [Int] + + """List of integers which the character should be ordered by (Asc)""" + characterOrder: [Int] + + """List of integers which the staff should be ordered by (Asc)""" + staffOrder: [Int] + + """List of integers which the studio should be ordered by (Asc)""" + studioOrder: [Int] + ): Favourites + + """Create or update a review""" + SaveReview( + """The review id, required for updating""" + id: Int + + """The id of the media the review is of""" + mediaId: Int + + """The main review text. Min:2200 characters""" + body: String + + """A short summary/preview of the review. Min:20, Max:120 characters""" + summary: String + + """A short summary/preview of the review. Min:20, Max:120 characters""" + score: Int + + """If the review should only be visible to its creator""" + private: Boolean + ): Review + + """Delete a review""" + DeleteReview( + """The id of the review to delete""" + id: Int + ): Deleted + + """Rate a review""" + RateReview( + """The id of the review to rate""" + reviewId: Int + + """The rating to apply to the review""" + rating: ReviewRating + ): Review + + """Recommendation a media""" + SaveRecommendation( + """The id of the base media""" + mediaId: Int + + """The id of the media to recommend""" + mediaRecommendationId: Int + + """The rating to give the recommendation""" + rating: RecommendationRating + ): Recommendation + + """Create or update a forum thread""" + SaveThread( + """The thread id, required for updating""" + id: Int + + """The title of the thread""" + title: String + + """The main text body of the thread""" + body: String + + """Forum categories the thread should be within""" + categories: [Int] + + """Media related to the contents of the thread""" + mediaCategories: [Int] + + """If the thread should be stickied. (Mod Only)""" + sticky: Boolean + + """If the thread should be locked. (Mod Only)""" + locked: Boolean + ): Thread + + """Delete a thread""" + DeleteThread( + """The id of the thread to delete""" + id: Int + ): Deleted + + """Toggle the subscription of a forum thread""" + ToggleThreadSubscription( + """The id of the forum thread to un/subscribe""" + threadId: Int + + """Whether to subscribe or unsubscribe from the forum thread""" + subscribe: Boolean + ): Thread + + """Create or update a thread comment""" + SaveThreadComment( + """The comment id, required for updating""" + id: Int + + """The id of thread the comment belongs to""" + threadId: Int + + """The id of thread comment to reply to""" + parentCommentId: Int + + """The comment markdown text""" + comment: String + + """If the comment tree should be locked. (Mod Only)""" + locked: Boolean + ): ThreadComment + + """Delete a thread comment""" + DeleteThreadComment( + """The id of the thread comment to delete""" + id: Int + ): Deleted + UpdateAniChartSettings(titleLanguage: String, outgoingLinkProvider: String, theme: String, sort: String): Json + UpdateAniChartHighlights(highlights: [AniChartHighlightInput]): Json +} + +"""Notification option input""" +input NotificationOptionInput { + """The type of notification""" + type: NotificationType + + """Whether this type of notification is enabled""" + enabled: Boolean +} + +"""A user's list options for anime or manga lists""" +input MediaListOptionsInput { + """The order each list should be displayed in""" + sectionOrder: [String] + + """If the completed sections of the list should be separated by format""" + splitCompletedSectionByFormat: Boolean + + """The names of the user's custom lists""" + customLists: [String] + + """The names of the user's advanced scoring sections""" + advancedScoring: [String] + + """If advanced scoring is enabled""" + advancedScoringEnabled: Boolean + + """list theme""" + theme: String +} + +input ListActivityOptionInput { + disabled: Boolean + type: MediaListStatus +} + +"""Date object that allows for incomplete date values (fuzzy)""" +input FuzzyDateInput { + """Numeric Year (2017)""" + year: Int + + """Numeric Month (3)""" + month: Int + + """Numeric Day (24)""" + day: Int +} + +"""Deleted data type""" +type Deleted { + """If an item has been successfully deleted""" + deleted: Boolean +} + +"""Likeable union type""" +union LikeableUnion = ListActivity | TextActivity | MessageActivity | ActivityReply | Thread | ThreadComment + +input AniChartHighlightInput { + mediaId: Int + highlight: String +} + +"""Page of data (Used for internal use only)""" +type InternalPage { + mediaSubmissions( + mediaId: Int + submissionId: Int + userId: Int + assigneeId: Int + status: SubmissionStatus + + """Filter by the media's type""" + type: MediaType + + """The order the results will be returned in""" + sort: [SubmissionSort] + ): [MediaSubmission] + characterSubmissions( + characterId: Int + + """Filter by the submitter of the submission""" + userId: Int + assigneeId: Int + + """Filter by the status of the submission""" + status: SubmissionStatus + + """The order the results will be returned in""" + sort: [SubmissionSort] + ): [CharacterSubmission] + staffSubmissions( + staffId: Int + + """Filter by the submitter of the submission""" + userId: Int + assigneeId: Int + + """Filter by the status of the submission""" + status: SubmissionStatus + + """The order the results will be returned in""" + sort: [SubmissionSort] + ): [StaffSubmission] + revisionHistory( + """Filter by the user id""" + userId: Int + + """Filter by the media id""" + mediaId: Int + + """Filter by the character id""" + characterId: Int + + """Filter by the staff id""" + staffId: Int + + """Filter by the studio id""" + studioId: Int + ): [RevisionHistory] + reports(reporterId: Int, reportedId: Int): [Report] + modActions(userId: Int, modId: Int): [ModAction] + userBlockSearch( + """Filter by search query""" + search: String + ): [User] + + """The pagination information""" + pageInfo: PageInfo + users( + """Filter by the user id""" + id: Int + + """Filter by the name of the user""" + name: String + + """Filter to moderators only if true""" + isModerator: Boolean + + """Filter by search query""" + search: String + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + media( + """Filter by the media id""" + id: Int + + """Filter by the media's MyAnimeList id""" + idMal: Int + + """Filter by the start date of the media""" + startDate: FuzzyDateInt + + """Filter by the end date of the media""" + endDate: FuzzyDateInt + + """Filter by the season the media was released in""" + season: MediaSeason + + """ + The year of the season (Winter 2017 would also include December 2016 releases). Requires season argument + """ + seasonYear: Int + + """Filter by the media's type""" + type: MediaType + + """Filter by the media's format""" + format: MediaFormat + + """Filter by the media's current release status""" + status: MediaStatus + + """Filter by amount of episodes the media has""" + episodes: Int + + """Filter by the media's episode length""" + duration: Int + + """Filter by the media's chapter count""" + chapters: Int + + """Filter by the media's volume count""" + volumes: Int + + """Filter by if the media's intended for 18+ adult audiences""" + isAdult: Boolean + + """Filter by the media's genres""" + genre: String + + """Filter by the media's tags""" + tag: String + + """ + Only apply the tags filter argument to tags above this rank. Default: 18 + """ + minimumTagRank: Int + + """Filter by the media's tags with in a tag category""" + tagCategory: String + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter media by sites name with a online streaming or reading license""" + licensedBy: String + + """Filter media by sites id with a online streaming or reading license""" + licensedById: Int + + """Filter by the media's average score""" + averageScore: Int + + """Filter by the number of users with this media on their list""" + popularity: Int + + """Filter by the source type of the media""" + source: MediaSource + + """Filter by the media's country of origin""" + countryOfOrigin: CountryCode + + """If the media is officially licensed or a self-published doujin release""" + isLicensed: Boolean + + """Filter by search query""" + search: String + + """Filter by the media id""" + id_not: Int + + """Filter by the media id""" + id_in: [Int] + + """Filter by the media id""" + id_not_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not: Int + + """Filter by the media's MyAnimeList id""" + idMal_in: [Int] + + """Filter by the media's MyAnimeList id""" + idMal_not_in: [Int] + + """Filter by the start date of the media""" + startDate_greater: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_lesser: FuzzyDateInt + + """Filter by the start date of the media""" + startDate_like: String + + """Filter by the end date of the media""" + endDate_greater: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_lesser: FuzzyDateInt + + """Filter by the end date of the media""" + endDate_like: String + + """Filter by the media's format""" + format_in: [MediaFormat] + + """Filter by the media's format""" + format_not: MediaFormat + + """Filter by the media's format""" + format_not_in: [MediaFormat] + + """Filter by the media's current release status""" + status_in: [MediaStatus] + + """Filter by the media's current release status""" + status_not: MediaStatus + + """Filter by the media's current release status""" + status_not_in: [MediaStatus] + + """Filter by amount of episodes the media has""" + episodes_greater: Int + + """Filter by amount of episodes the media has""" + episodes_lesser: Int + + """Filter by the media's episode length""" + duration_greater: Int + + """Filter by the media's episode length""" + duration_lesser: Int + + """Filter by the media's chapter count""" + chapters_greater: Int + + """Filter by the media's chapter count""" + chapters_lesser: Int + + """Filter by the media's volume count""" + volumes_greater: Int + + """Filter by the media's volume count""" + volumes_lesser: Int + + """Filter by the media's genres""" + genre_in: [String] + + """Filter by the media's genres""" + genre_not_in: [String] + + """Filter by the media's tags""" + tag_in: [String] + + """Filter by the media's tags""" + tag_not_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_in: [String] + + """Filter by the media's tags with in a tag category""" + tagCategory_not_in: [String] + + """Filter media by sites name with a online streaming or reading license""" + licensedBy_in: [String] + + """Filter media by sites id with a online streaming or reading license""" + licensedById_in: [Int] + + """Filter by the media's average score""" + averageScore_not: Int + + """Filter by the media's average score""" + averageScore_greater: Int + + """Filter by the media's average score""" + averageScore_lesser: Int + + """Filter by the number of users with this media on their list""" + popularity_not: Int + + """Filter by the number of users with this media on their list""" + popularity_greater: Int + + """Filter by the number of users with this media on their list""" + popularity_lesser: Int + + """Filter by the source type of the media""" + source_in: [MediaSource] + + """The order the results will be returned in""" + sort: [MediaSort] + ): [Media] + characters( + """Filter by character id""" + id: Int + + """Filter by character by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by character id""" + id_not: Int + + """Filter by character id""" + id_in: [Int] + + """Filter by character id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [CharacterSort] + ): [Character] + staff( + """Filter by the staff id""" + id: Int + + """Filter by staff by if its their birthday today""" + isBirthday: Boolean + + """Filter by search query""" + search: String + + """Filter by the staff id""" + id_not: Int + + """Filter by the staff id""" + id_in: [Int] + + """Filter by the staff id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StaffSort] + ): [Staff] + studios( + """Filter by the studio id""" + id: Int + + """Filter by search query""" + search: String + + """Filter by the studio id""" + id_not: Int + + """Filter by the studio id""" + id_in: [Int] + + """Filter by the studio id""" + id_not_in: [Int] + + """The order the results will be returned in""" + sort: [StudioSort] + ): [Studio] + mediaList( + """Filter by a list entry's id""" + id: Int + + """Filter by a user's id""" + userId: Int + + """Filter by a user's name""" + userName: String + + """Filter by the list entries media type""" + type: MediaType + + """Filter by the watching/reading status""" + status: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId: Int + + """ + Filter list entries to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter by note words and #tags""" + notes: String + + """Filter by the date the user started the media""" + startedAt: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt: FuzzyDateInt + + """ + Limit to only entries also on the auth user's list. Requires user id or name arguments. + """ + compareWithAuthList: Boolean + + """Filter by a user's id""" + userId_in: [Int] + + """Filter by the watching/reading status""" + status_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not_in: [MediaListStatus] + + """Filter by the watching/reading status""" + status_not: MediaListStatus + + """Filter by the media id of the list entry""" + mediaId_in: [Int] + + """Filter by the media id of the list entry""" + mediaId_not_in: [Int] + + """Filter by note words and #tags""" + notes_like: String + + """Filter by the date the user started the media""" + startedAt_greater: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_lesser: FuzzyDateInt + + """Filter by the date the user started the media""" + startedAt_like: String + + """Filter by the date the user completed the media""" + completedAt_greater: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_lesser: FuzzyDateInt + + """Filter by the date the user completed the media""" + completedAt_like: String + + """The order the results will be returned in""" + sort: [MediaListSort] + ): [MediaList] + airingSchedules( + """Filter by the id of the airing schedule item""" + id: Int + + """Filter by the id of associated media""" + mediaId: Int + + """Filter by the airing episode number""" + episode: Int + + """Filter by the time of airing""" + airingAt: Int + + """Filter to episodes that haven't yet aired""" + notYetAired: Boolean + + """Filter by the id of the airing schedule item""" + id_not: Int + + """Filter by the id of the airing schedule item""" + id_in: [Int] + + """Filter by the id of the airing schedule item""" + id_not_in: [Int] + + """Filter by the id of associated media""" + mediaId_not: Int + + """Filter by the id of associated media""" + mediaId_in: [Int] + + """Filter by the id of associated media""" + mediaId_not_in: [Int] + + """Filter by the airing episode number""" + episode_not: Int + + """Filter by the airing episode number""" + episode_in: [Int] + + """Filter by the airing episode number""" + episode_not_in: [Int] + + """Filter by the airing episode number""" + episode_greater: Int + + """Filter by the airing episode number""" + episode_lesser: Int + + """Filter by the time of airing""" + airingAt_greater: Int + + """Filter by the time of airing""" + airingAt_lesser: Int + + """The order the results will be returned in""" + sort: [AiringSort] + ): [AiringSchedule] + mediaTrends( + """Filter by the media id""" + mediaId: Int + + """Filter by date""" + date: Int + + """Filter by trending amount""" + trending: Int + + """Filter by score""" + averageScore: Int + + """Filter by popularity""" + popularity: Int + + """Filter by episode number""" + episode: Int + + """Filter to stats recorded while the media was releasing""" + releasing: Boolean + + """Filter by the media id""" + mediaId_not: Int + + """Filter by the media id""" + mediaId_in: [Int] + + """Filter by the media id""" + mediaId_not_in: [Int] + + """Filter by date""" + date_greater: Int + + """Filter by date""" + date_lesser: Int + + """Filter by trending amount""" + trending_greater: Int + + """Filter by trending amount""" + trending_lesser: Int + + """Filter by trending amount""" + trending_not: Int + + """Filter by score""" + averageScore_greater: Int + + """Filter by score""" + averageScore_lesser: Int + + """Filter by score""" + averageScore_not: Int + + """Filter by popularity""" + popularity_greater: Int + + """Filter by popularity""" + popularity_lesser: Int + + """Filter by popularity""" + popularity_not: Int + + """Filter by episode number""" + episode_greater: Int + + """Filter by episode number""" + episode_lesser: Int + + """Filter by episode number""" + episode_not: Int + + """The order the results will be returned in""" + sort: [MediaTrendSort] + ): [MediaTrend] + notifications( + """Filter by the type of notifications""" + type: NotificationType + + """Reset the unread notification count to 0 on load""" + resetNotificationCount: Boolean + + """Filter by the type of notifications""" + type_in: [NotificationType] + ): [NotificationUnion] + followers( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + following( + """User id of the follower/followed""" + userId: Int! + + """The order the results will be returned in""" + sort: [UserSort] + ): [User] + activities( + """Filter by the activity id""" + id: Int + + """Filter by the owner user id""" + userId: Int + + """Filter by the id of the user who sent a message""" + messengerId: Int + + """Filter by the associated media id of the activity""" + mediaId: Int + + """Filter by the type of activity""" + type: ActivityType + + """ + Filter activity to users who are being followed by the authenticated user + """ + isFollowing: Boolean + + """Filter activity to only activity with replies""" + hasReplies: Boolean + + """Filter activity to only activity with replies or is of type text""" + hasRepliesOrTypeText: Boolean + + """Filter by the time the activity was created""" + createdAt: Int + + """Filter by the activity id""" + id_not: Int + + """Filter by the activity id""" + id_in: [Int] + + """Filter by the activity id""" + id_not_in: [Int] + + """Filter by the owner user id""" + userId_not: Int + + """Filter by the owner user id""" + userId_in: [Int] + + """Filter by the owner user id""" + userId_not_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not: Int + + """Filter by the id of the user who sent a message""" + messengerId_in: [Int] + + """Filter by the id of the user who sent a message""" + messengerId_not_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not: Int + + """Filter by the associated media id of the activity""" + mediaId_in: [Int] + + """Filter by the associated media id of the activity""" + mediaId_not_in: [Int] + + """Filter by the type of activity""" + type_not: ActivityType + + """Filter by the type of activity""" + type_in: [ActivityType] + + """Filter by the type of activity""" + type_not_in: [ActivityType] + + """Filter by the time the activity was created""" + createdAt_greater: Int + + """Filter by the time the activity was created""" + createdAt_lesser: Int + + """The order the results will be returned in""" + sort: [ActivitySort] + ): [ActivityUnion] + activityReplies( + """Filter by the reply id""" + id: Int + + """Filter by the parent id""" + activityId: Int + ): [ActivityReply] + threads( + """Filter by the thread id""" + id: Int + + """Filter by the user id of the thread's creator""" + userId: Int + + """Filter by the user id of the last user to comment on the thread""" + replyUserId: Int + + """Filter by if the currently authenticated user's subscribed threads""" + subscribed: Boolean + + """Filter by thread category id""" + categoryId: Int + + """Filter by thread media id category""" + mediaCategoryId: Int + + """Filter by search query""" + search: String + + """Filter by the thread id""" + id_in: [Int] + + """The order the results will be returned in""" + sort: [ThreadSort] + ): [Thread] + threadComments( + """Filter by the comment id""" + id: Int + + """Filter by the thread id""" + threadId: Int + + """Filter by the user id of the comment's creator""" + userId: Int + + """The order the results will be returned in""" + sort: [ThreadCommentSort] + ): [ThreadComment] + reviews( + """Filter by Review id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by user id""" + userId: Int + + """Filter by media type""" + mediaType: MediaType + + """The order the results will be returned in""" + sort: [ReviewSort] + ): [Review] + recommendations( + """Filter by recommendation id""" + id: Int + + """Filter by media id""" + mediaId: Int + + """Filter by media recommendation id""" + mediaRecommendationId: Int + + """Filter by user who created the recommendation""" + userId: Int + + """Filter by total rating of the recommendation""" + rating: Int + + """Filter by the media on the authenticated user's lists""" + onList: Boolean + + """Filter by total rating of the recommendation""" + rating_greater: Int + + """Filter by total rating of the recommendation""" + rating_lesser: Int + + """The order the results will be returned in""" + sort: [RecommendationSort] + ): [Recommendation] + likes( + """The id of the likeable type""" + likeableId: Int + + """The type of model the id applies to""" + type: LikeableType + ): [User] +} + +"""Submission status""" +enum SubmissionStatus { + PENDING + REJECTED + PARTIALLY_ACCEPTED + ACCEPTED +} + +"""Submission sort enums""" +enum SubmissionSort { + ID + ID_DESC +} + +"""Media submission""" +type MediaSubmission { + """The id of the submission""" + id: Int! + + """User submitter of the submission""" + submitter: User + + """Data Mod assigned to handle the submission""" + assignee: User + + """Status of the submission""" + status: SubmissionStatus + submitterStats: Json + notes: String + source: String + changes: [String] + + """Whether the submission is locked""" + locked: Boolean + media: Media + submission: Media + characters: [MediaSubmissionComparison] + staff: [MediaSubmissionComparison] + studios: [MediaSubmissionComparison] + relations: [MediaEdge] + externalLinks: [MediaSubmissionComparison] + createdAt: Int +} + +"""Media submission with comparison to current data""" +type MediaSubmissionComparison { + submission: MediaSubmissionEdge + character: MediaCharacter + staff: StaffEdge + studio: StudioEdge + externalLink: MediaExternalLink +} + +type MediaSubmissionEdge { + """The id of the direct submission""" + id: Int + characterRole: CharacterRole + staffRole: String + roleNotes: String + dubGroup: String + characterName: String + isMain: Boolean + character: Character + characterSubmission: Character + voiceActor: Staff + voiceActorSubmission: Staff + staff: Staff + staffSubmission: Staff + studio: Studio + externalLink: MediaExternalLink + media: Media +} + +"""Internal - Media characters separated""" +type MediaCharacter { + """The id of the connection""" + id: Int + + """The characters role in the media""" + role: CharacterRole + roleNotes: String + dubGroup: String + + """Media specific character name""" + characterName: String + + """The characters in the media voiced by the parent actor""" + character: Character + + """The voice actor of the character""" + voiceActor: Staff +} + +"""A submission for a character that features in an anime or manga""" +type CharacterSubmission { + """The id of the submission""" + id: Int! + + """Character that the submission is referencing""" + character: Character + + """The character submission changes""" + submission: Character + + """Submitter for the submission""" + submitter: User + + """Data Mod assigned to handle the submission""" + assignee: User + + """Status of the submission""" + status: SubmissionStatus + + """Inner details of submission status""" + notes: String + source: String + + """Whether the submission is locked""" + locked: Boolean + createdAt: Int +} + +"""A submission for a staff that features in an anime or manga""" +type StaffSubmission { + """The id of the submission""" + id: Int! + + """Staff that the submission is referencing""" + staff: Staff + + """The staff submission changes""" + submission: Staff + + """Submitter for the submission""" + submitter: User + + """Data Mod assigned to handle the submission""" + assignee: User + + """Status of the submission""" + status: SubmissionStatus + + """Inner details of submission status""" + notes: String + source: String + + """Whether the submission is locked""" + locked: Boolean + createdAt: Int +} + +"""Feed of mod edit activity""" +type RevisionHistory { + """The id of the media""" + id: Int! + + """The action taken on the objects""" + action: RevisionHistoryAction + + """A JSON object of the fields that changed""" + changes: Json + + """The user who made the edit to the object""" + user: User + + """The media the mod feed entry references""" + media: Media + + """The character the mod feed entry references""" + character: Character + + """The staff member the mod feed entry references""" + staff: Staff + + """The studio the mod feed entry references""" + studio: Studio + + """The external link source the mod feed entry references""" + externalLink: MediaExternalLink + + """When the mod feed entry was created""" + createdAt: Int +} + +"""Revision history actions""" +enum RevisionHistoryAction { + CREATE + EDIT +} + +type Report { + id: Int! + reporter: User + reported: User + reason: String + + """When the entry data was created""" + createdAt: Int + cleared: Boolean +} + +type ModAction { + """The id of the action""" + id: Int! + user: User + mod: User + type: ModActionType + objectId: Int + objectType: String + data: String + createdAt: Int! +} + +enum ModActionType { + NOTE + BAN + DELETE + EDIT + EXPIRE + REPORT + RESET + ANON +} + +"""The official titles of the media in various languages""" +input MediaTitleInput { + """The romanization of the native language title""" + romaji: String + + """The official english title""" + english: String + + """Official title in it's native language""" + native: String +} + +input AiringScheduleInput { + airingAt: Int + episode: Int + timeUntilAiring: Int +} + +"""An external link to another site related to the media""" +input MediaExternalLinkInput { + """The id of the external link""" + id: Int! + + """The url of the external link""" + url: String! + + """The site location of the external link""" + site: String! +} + +"""The names of the character""" +input CharacterNameInput { + """The character's given name""" + first: String + + """The character's middle name""" + middle: String + + """The character's surname""" + last: String + + """The character's full name in their native language""" + native: String + + """Other names the character might be referred by""" + alternative: [String] + + """Other names the character might be referred to as but are spoilers""" + alternativeSpoiler: [String] +} + +type CharacterSubmissionConnection { + edges: [CharacterSubmissionEdge] + nodes: [CharacterSubmission] + + """The pagination information""" + pageInfo: PageInfo +} + +"""CharacterSubmission connection edge""" +type CharacterSubmissionEdge { + node: CharacterSubmission + + """The characters role in the media""" + role: CharacterRole + + """The voice actors of the character""" + voiceActors: [Staff] + + """The submitted voice actors of the character""" + submittedVoiceActors: [StaffSubmission] +} + +"""The names of the staff member""" +input StaffNameInput { + """The person's given name""" + first: String + + """The person's middle name""" + middle: String + + """The person's surname""" + last: String + + """The person's full name in their native language""" + native: String + + """Other names the character might be referred by""" + alternative: [String] +} + +"""User data for moderators""" +type UserModData { + alts: [User] + bans: Json + ip: Json + counts: Json + privacy: Int + email: String +} diff --git a/src/oguri/__init__.py b/src/oguri/__init__.py new file mode 100644 index 0000000..3720668 --- /dev/null +++ b/src/oguri/__init__.py @@ -0,0 +1,92 @@ +from anilist_client import Client +from anilist_client.custom_fields import ( + AiringScheduleFields, + MediaFields, + MediaTitleFields, + PageFields, +) +from anilist_client.custom_queries import Query +from datetime import datetime + + +async def main() -> int: + client = Client(url="https://graphql.anilist.co") + airing_schedules_query = Query.page().fields( + PageFields.airing_schedules().fields( + AiringScheduleFields.airing_at, + AiringScheduleFields.episode, + AiringScheduleFields.media().fields( + MediaFields.title().fields( + MediaTitleFields.english(), + MediaTitleFields.romaji(), + MediaTitleFields.native(), + ) + ), + ) + ) + + try: + response = await client.query( + airing_schedules_query, operation_name="get_airing_schedules" + ) + + if response: + page = response.get("Page") + + if page: + airing_schedules = page.get("airingSchedules") + + if airing_schedules: + for schedule in airing_schedules: + airing_at = schedule.get("airingAt") + episode = schedule.get("episode") + titles = schedule.get("media").get("title") + title = ( + titles.get("english") + or titles.get("romaji") + or titles.get("native") + ) + + if airing_at: + airing_at_date = datetime.fromtimestamp(airing_at) + relative_airing_at = relative_time(airing_at_date) + to_print = f"{title} Ep. {episode} " + + if datetime.now() > airing_at_date: + to_print += f"has already aired {relative_airing_at}" + else: + to_print += f"is airing at {airing_at_date}" + + print(to_print) + except Exception as exception: + print(exception) + + return 1 + + return 0 + + +def relative_time(date): + now = datetime.now() + delta = now - date + + if delta.days > 365: + return f"{delta.days // 365} years ago" + elif delta.days > 30: + return f"{delta.days // 30} months ago" + elif delta.days > 7: + return f"{delta.days // 7} weeks ago" + elif delta.days > 1: + return f"{delta.days} days ago" + elif delta.seconds > 3600: + return f"{delta.seconds // 3600} hours ago" + elif delta.seconds > 60: + return f"{delta.seconds // 60} minutes ago" + else: + return f"{delta.seconds} seconds ago" + + +def main_script(): + import asyncio + + asyncio.run(main()) diff --git a/src/oguri/__main__.py b/src/oguri/__main__.py new file mode 100644 index 0000000..7b4d22f --- /dev/null +++ b/src/oguri/__main__.py @@ -0,0 +1,5 @@ +import oguri +import sys +import asyncio + +sys.exit(asyncio.run(oguri.main())) |