aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-06-29 07:25:16 -0700
committerFuwn <[email protected]>2025-06-29 07:25:16 -0700
commit0469c2da8e6ff3acdcd70c8f01157bf3f15a2282 (patch)
treecf65b2cc7a9f0b7309f5971e095e65bce0f4c6ee
downloadoguri-0469c2da8e6ff3acdcd70c8f01157bf3f15a2282.tar.xz
oguri-0469c2da8e6ff3acdcd70c8f01157bf3f15a2282.zip
feat: Initial commit
-rw-r--r--.gitignore13
-rw-r--r--.python-version1
-rw-r--r--LICENSE.txt674
-rw-r--r--justfile11
-rw-r--r--pyproject.toml33
-rw-r--r--requirements-dev.lock67
-rw-r--r--requirements.lock67
-rw-r--r--schema.graphql6451
-rw-r--r--src/oguri/__init__.py92
-rw-r--r--src/oguri/__main__.py5
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()))