diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8900cd93..96244532 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -# Copyright (c) 2022 Contributors to the Suwayomi project +# Copyright (c) 2023 Contributors to the Suwayomi project # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index dbce4de2..5ab9d253 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,3 +1,12 @@ +# Copyright (c) 2022 Contributors to the Suwayomi project +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + name: Lint on: diff --git a/.prettierignore b/.prettierignore index b18c5162..c3d71b12 100644 --- a/.prettierignore +++ b/.prettierignore @@ -13,3 +13,4 @@ node_modules pnpm-lock.yaml package-lock.json yarn.lock +schema.graphql \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 6d021bdf..1ca5693e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -117,5 +117,8 @@ }, "[svelte]": { "editor.defaultFormatter": "esbenp.prettier-vscode" - } + }, + "licenser.license": "MPLv2", + "licenser.projectName": "Suwayomi project", + "licenser.author": "Contributors to the Suwayomi project" } diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..dbdb0fa8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at https://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index d72c2ab7..24613714 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/docker-compose-example.yml b/docker-compose-example.yml index cd059314..b7df7028 100644 --- a/docker-compose-example.yml +++ b/docker-compose-example.yml @@ -20,5 +20,5 @@ services: - VITE_URL=http://tachidesk:4567 volumes: - '.:/app' - command: /bin/sh -c "npm i && npm run dev -- --host" + command: /bin/sh -c "bun i && bun run dev --host" restart: unless-stopped diff --git a/schema.graphql b/schema.graphql index 19b8eb11..df667e4c 100644 --- a/schema.graphql +++ b/schema.graphql @@ -1,7 +1,7 @@ schema { - query: Query - mutation: Mutation - subscription: Subscription + query: Query + mutation: Mutation + subscription: Subscription } "A location in a connection that can be used for resuming pagination." scalar Cursor @@ -9,1491 +9,1408 @@ scalar Cursor scalar LongString "A file part in a multipart request" scalar Upload -type AboutPayload { - buildTime: LongString! - buildType: String! - discord: String! - github: String! - name: String! - revision: String! - version: String! +type AboutServerPayload { + buildTime: LongString! + buildType: String! + discord: String! + github: String! + name: String! + revision: String! + version: String! } type BackupRestoreStatus { - mangaProgress: Int! - state: BackupRestoreState! - totalManga: Int! + mangaProgress: Int! + state: BackupRestoreState! + totalManga: Int! } type CategoryEdge implements Edge { - cursor: Cursor! - node: CategoryType! + cursor: Cursor! + node: CategoryType! } type CategoryMetaType implements MetaType { - categoryId: Int! - key: String! - value: String! - category: CategoryType! + categoryId: Int! + key: String! + value: String! + category: CategoryType! } type CategoryNodeList implements NodeList { - edges: [CategoryEdge!]! - nodes: [CategoryType!]! - pageInfo: PageInfo! - totalCount: Int! + edges: [CategoryEdge!]! + nodes: [CategoryType!]! + pageInfo: PageInfo! + totalCount: Int! } type CategoryType { - default: Boolean! - id: Int! - includeInUpdate: IncludeInUpdate! - name: String! - order: Int! - mangas: MangaNodeList! - meta: [CategoryMetaType!]! + default: Boolean! + id: Int! + includeInUpdate: IncludeInUpdate! + name: String! + order: Int! + mangas: MangaNodeList! + meta: [CategoryMetaType!]! } type ChapterEdge implements Edge { - cursor: Cursor! - node: ChapterType! + cursor: Cursor! + node: ChapterType! } type ChapterMetaType implements MetaType { - chapterId: Int! - key: String! - value: String! - chapter: ChapterType! + chapterId: Int! + key: String! + value: String! + chapter: ChapterType! } type ChapterNodeList implements NodeList { - edges: [ChapterEdge!]! - nodes: [ChapterType!]! - pageInfo: PageInfo! - totalCount: Int! + edges: [ChapterEdge!]! + nodes: [ChapterType!]! + pageInfo: PageInfo! + totalCount: Int! } type ChapterType { - chapterNumber: Float! - fetchedAt: LongString! - id: Int! - isBookmarked: Boolean! - isDownloaded: Boolean! - isRead: Boolean! - lastPageRead: Int! - lastReadAt: LongString! - mangaId: Int! - name: String! - pageCount: Int! - realUrl: String - scanlator: String - sourceOrder: Int! - uploadDate: LongString! - url: String! - manga: MangaType! - meta: [ChapterMetaType!]! + chapterNumber: Float! + fetchedAt: LongString! + id: Int! + isBookmarked: Boolean! + isDownloaded: Boolean! + isRead: Boolean! + lastPageRead: Int! + lastReadAt: LongString! + mangaId: Int! + name: String! + pageCount: Int! + realUrl: String + scanlator: String + sourceOrder: Int! + uploadDate: LongString! + url: String! + manga: MangaType! + meta: [ChapterMetaType!]! } type CheckBoxFilter { - default: Boolean! - name: String! + default: Boolean! + name: String! } type CheckBoxPreference { - currentValue: Boolean - default: Boolean! - key: String! - summary: String - title: String! - visible: Boolean! + currentValue: Boolean + default: Boolean! + key: String! + summary: String + title: String! + visible: Boolean! } type CheckForServerUpdatesPayload { - channel: String! - tag: String! - url: String! + channel: String! + tag: String! + url: String! } type ClearDownloaderPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type CreateBackupPayload { - clientMutationId: String - url: String! + clientMutationId: String + url: String! } type CreateCategoryPayload { - category: CategoryType! - clientMutationId: String + category: CategoryType! + clientMutationId: String } type DeleteCategoryMetaPayload { - category: CategoryType! - clientMutationId: String - meta: CategoryMetaType + category: CategoryType! + clientMutationId: String + meta: CategoryMetaType } type DeleteCategoryPayload { - category: CategoryType - clientMutationId: String - mangas: [MangaType!]! + category: CategoryType + clientMutationId: String + mangas: [MangaType!]! } type DeleteChapterMetaPayload { - chapter: ChapterType! - clientMutationId: String - meta: ChapterMetaType + chapter: ChapterType! + clientMutationId: String + meta: ChapterMetaType } type DeleteDownloadedChapterPayload { - chapters: ChapterType! - clientMutationId: String + chapters: ChapterType! + clientMutationId: String } type DeleteDownloadedChaptersPayload { - chapters: [ChapterType!]! - clientMutationId: String + chapters: [ChapterType!]! + clientMutationId: String } type DeleteGlobalMetaPayload { - clientMutationId: String - meta: GlobalMetaType + clientMutationId: String + meta: GlobalMetaType } type DeleteMangaMetaPayload { - clientMutationId: String - manga: MangaType! - meta: MangaMetaType + clientMutationId: String + manga: MangaType! + meta: MangaMetaType } type DequeueChapterDownloadPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type DequeueChapterDownloadsPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type DownloadAheadPayload { - clientMutationId: String + clientMutationId: String } type DownloadEdge implements Edge { - cursor: Cursor! - node: DownloadType! + cursor: Cursor! + node: DownloadType! } type DownloadNodeList implements NodeList { - edges: [DownloadEdge!]! - nodes: [DownloadType!]! - pageInfo: PageInfo! - totalCount: Int! + edges: [DownloadEdge!]! + nodes: [DownloadType!]! + pageInfo: PageInfo! + totalCount: Int! } type DownloadStatus { - queue: [DownloadType!]! - state: DownloaderState! + queue: [DownloadType!]! + state: DownloaderState! } type DownloadType { - progress: Float! - state: DownloadState! - tries: Int! - chapter: ChapterType! - manga: MangaType! + progress: Float! + state: DownloadState! + tries: Int! + chapter: ChapterType! + manga: MangaType! } type EditTextPreference { - currentValue: String - default: String - dialogMessage: String - dialogTitle: String - key: String! - summary: String - text: String - title: String - visible: Boolean! + currentValue: String + default: String + dialogMessage: String + dialogTitle: String + key: String! + summary: String + text: String + title: String + visible: Boolean! } type EnqueueChapterDownloadPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type EnqueueChapterDownloadsPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type ExtensionEdge implements Edge { - cursor: Cursor! - node: ExtensionType! + cursor: Cursor! + node: ExtensionType! } type ExtensionNodeList implements NodeList { - edges: [ExtensionEdge!]! - nodes: [ExtensionType!]! - pageInfo: PageInfo! - totalCount: Int! + edges: [ExtensionEdge!]! + nodes: [ExtensionType!]! + pageInfo: PageInfo! + totalCount: Int! } type ExtensionType { - apkName: String! - hasUpdate: Boolean! - iconUrl: String! - isInstalled: Boolean! - isNsfw: Boolean! - isObsolete: Boolean! - lang: String! - name: String! - pkgName: String! - versionCode: Int! - versionName: String! - source: SourceNodeList! + apkName: String! + hasUpdate: Boolean! + iconUrl: String! + isInstalled: Boolean! + isNsfw: Boolean! + isObsolete: Boolean! + lang: String! + name: String! + pkgName: String! + versionCode: Int! + versionName: String! + source: SourceNodeList! } type FetchChapterPagesPayload { - chapter: ChapterType! - clientMutationId: String - pages: [String!]! + chapter: ChapterType! + clientMutationId: String + pages: [String!]! } type FetchChaptersPayload { - chapters: [ChapterType!]! - clientMutationId: String + chapters: [ChapterType!]! + clientMutationId: String } type FetchExtensionsPayload { - clientMutationId: String - extensions: [ExtensionType!]! + clientMutationId: String + extensions: [ExtensionType!]! } type FetchMangaPayload { - clientMutationId: String - manga: MangaType! + clientMutationId: String + manga: MangaType! } type FetchSourceMangaPayload { - clientMutationId: String - hasNextPage: Boolean! - mangas: [MangaType!]! + clientMutationId: String + hasNextPage: Boolean! + mangas: [MangaType!]! } type GlobalMetaNodeList implements NodeList { - edges: [MetaEdge!]! - nodes: [GlobalMetaType!]! - pageInfo: PageInfo! - totalCount: Int! + edges: [MetaEdge!]! + nodes: [GlobalMetaType!]! + pageInfo: PageInfo! + totalCount: Int! } type GlobalMetaType implements MetaType { - key: String! - value: String! + key: String! + value: String! } type GroupFilter { - filters: [Filter!]! - name: String! + filters: [Filter!]! + name: String! } type HeaderFilter { - name: String! + name: String! } type InstallExternalExtensionPayload { - clientMutationId: String - extension: ExtensionType! + clientMutationId: String + extension: ExtensionType! } type LastUpdateTimestampPayload { - timestamp: LongString! + timestamp: LongString! } type ListPreference { - currentValue: String - default: String - entries: [String!]! - entryValues: [String!]! - key: String! - summary: String - title: String - visible: Boolean! + currentValue: String + default: String + entries: [String!]! + entryValues: [String!]! + key: String! + summary: String + title: String + visible: Boolean! } type MangaEdge implements Edge { - cursor: Cursor! - node: MangaType! + cursor: Cursor! + node: MangaType! } type MangaMetaType implements MetaType { - key: String! - mangaId: Int! - value: String! - manga: MangaType! + key: String! + mangaId: Int! + value: String! + manga: MangaType! } type MangaNodeList implements NodeList { - edges: [MangaEdge!]! - nodes: [MangaType!]! - pageInfo: PageInfo! - totalCount: Int! + edges: [MangaEdge!]! + nodes: [MangaType!]! + pageInfo: PageInfo! + totalCount: Int! } type MangaType { - artist: String - author: String - chaptersLastFetchedAt: LongString - description: String - genre: [String!]! - id: Int! - inLibrary: Boolean! - inLibraryAt: LongString! - initialized: Boolean! - lastFetchedAt: LongString - realUrl: String - sourceId: LongString! - status: MangaStatus! - thumbnailUrl: String - title: String! - url: String! - age: LongString - categories: CategoryNodeList! - chapters: ChapterNodeList! - chaptersAge: LongString - downloadCount: Int! - lastReadChapter: ChapterType - meta: [MangaMetaType!]! - source: SourceType - unreadCount: Int! + artist: String + author: String + chaptersLastFetchedAt: LongString + description: String + genre: [String!]! + id: Int! + inLibrary: Boolean! + inLibraryAt: LongString! + initialized: Boolean! + lastFetchedAt: LongString + realUrl: String + sourceId: LongString! + status: MangaStatus! + thumbnailUrl: String + title: String! + url: String! + age: LongString + categories: CategoryNodeList! + chapters: ChapterNodeList! + chaptersAge: LongString + downloadCount: Int! + lastReadChapter: ChapterType + meta: [MangaMetaType!]! + source: SourceType + unreadCount: Int! } type MetaEdge implements Edge { - cursor: Cursor! - node: GlobalMetaType! + cursor: Cursor! + node: GlobalMetaType! } type MultiSelectListPreference { - currentValue: [String!] - default: [String!] - dialogMessage: String - dialogTitle: String - entries: [String!]! - entryValues: [String!]! - key: String! - summary: String - title: String - visible: Boolean! + currentValue: [String!] + default: [String!] + dialogMessage: String + dialogTitle: String + entries: [String!]! + entryValues: [String!]! + key: String! + summary: String + title: String + visible: Boolean! } type Mutation { - createBackup(input: CreateBackupInput): CreateBackupPayload! - restoreBackup(input: RestoreBackupInput!): RestoreBackupPayload! - createCategory(input: CreateCategoryInput!): CreateCategoryPayload! - deleteCategory(input: DeleteCategoryInput!): DeleteCategoryPayload! - deleteCategoryMeta(input: DeleteCategoryMetaInput!): DeleteCategoryMetaPayload! - setCategoryMeta(input: SetCategoryMetaInput!): SetCategoryMetaPayload! - updateCategories(input: UpdateCategoriesInput!): UpdateCategoriesPayload! - updateCategory(input: UpdateCategoryInput!): UpdateCategoryPayload! - updateCategoryOrder(input: UpdateCategoryOrderInput!): UpdateCategoryOrderPayload! - updateMangaCategories(input: UpdateMangaCategoriesInput!): UpdateMangaCategoriesPayload! - updateMangasCategories(input: UpdateMangasCategoriesInput!): UpdateMangasCategoriesPayload! - deleteChapterMeta(input: DeleteChapterMetaInput!): DeleteChapterMetaPayload! - fetchChapterPages(input: FetchChapterPagesInput!): FetchChapterPagesPayload! - fetchChapters(input: FetchChaptersInput!): FetchChaptersPayload! - setChapterMeta(input: SetChapterMetaInput!): SetChapterMetaPayload! - updateChapter(input: UpdateChapterInput!): UpdateChapterPayload! - updateChapters(input: UpdateChaptersInput!): UpdateChaptersPayload! - clearDownloader(input: ClearDownloaderInput!): ClearDownloaderPayload! - deleteDownloadedChapter(input: DeleteDownloadedChapterInput!): DeleteDownloadedChapterPayload! - deleteDownloadedChapters(input: DeleteDownloadedChaptersInput!): DeleteDownloadedChaptersPayload! - dequeueChapterDownload(input: DequeueChapterDownloadInput!): DequeueChapterDownloadPayload! - dequeueChapterDownloads(input: DequeueChapterDownloadsInput!): DequeueChapterDownloadsPayload! - downloadAhead(input: DownloadAheadInput!): DownloadAheadPayload! - enqueueChapterDownload(input: EnqueueChapterDownloadInput!): EnqueueChapterDownloadPayload! - enqueueChapterDownloads(input: EnqueueChapterDownloadsInput!): EnqueueChapterDownloadsPayload! - reorderChapterDownload(input: ReorderChapterDownloadInput!): ReorderChapterDownloadPayload! - startDownloader(input: StartDownloaderInput!): StartDownloaderPayload! - stopDownloader(input: StopDownloaderInput!): StopDownloaderPayload! - fetchExtensions(input: FetchExtensionsInput!): FetchExtensionsPayload! - installExternalExtension(input: InstallExternalExtensionInput!): InstallExternalExtensionPayload! - updateExtension(input: UpdateExtensionInput!): UpdateExtensionPayload! - updateExtensions(input: UpdateExtensionsInput!): UpdateExtensionsPayload! - updateWebUI(input: WebUIUpdateInput!): WebUIUpdatePayload! - deleteMangaMeta(input: DeleteMangaMetaInput!): DeleteMangaMetaPayload! - fetchManga(input: FetchMangaInput!): FetchMangaPayload! - setMangaMeta(input: SetMangaMetaInput!): SetMangaMetaPayload! - updateManga(input: UpdateMangaInput!): UpdateMangaPayload! - updateMangas(input: UpdateMangasInput!): UpdateMangasPayload! - deleteGlobalMeta(input: DeleteGlobalMetaInput!): DeleteGlobalMetaPayload! - setGlobalMeta(input: SetGlobalMetaInput!): SetGlobalMetaPayload! - resetSettings(input: ResetSettingsInput!): ResetSettingsPayload! - setSettings(input: SetSettingsInput!): SetSettingsPayload! - fetchSourceManga(input: FetchSourceMangaInput!): FetchSourceMangaPayload! - updateSourcePreference(input: UpdateSourcePreferenceInput!): UpdateSourcePreferencePayload! - updateCategoryManga(input: UpdateCategoryMangaInput!): UpdateCategoryMangaPayload! - updateLibraryManga(input: UpdateLibraryMangaInput!): UpdateLibraryMangaPayload! - updateStop(input: UpdateStopInput!): UpdateStopPayload! + createBackup(input: CreateBackupInput): CreateBackupPayload! + restoreBackup(input: RestoreBackupInput!): RestoreBackupPayload! + createCategory(input: CreateCategoryInput!): CreateCategoryPayload! + deleteCategory(input: DeleteCategoryInput!): DeleteCategoryPayload! + deleteCategoryMeta(input: DeleteCategoryMetaInput!): DeleteCategoryMetaPayload! + setCategoryMeta(input: SetCategoryMetaInput!): SetCategoryMetaPayload! + updateCategories(input: UpdateCategoriesInput!): UpdateCategoriesPayload! + updateCategory(input: UpdateCategoryInput!): UpdateCategoryPayload! + updateCategoryOrder(input: UpdateCategoryOrderInput!): UpdateCategoryOrderPayload! + updateMangaCategories(input: UpdateMangaCategoriesInput!): UpdateMangaCategoriesPayload! + updateMangasCategories(input: UpdateMangasCategoriesInput!): UpdateMangasCategoriesPayload! + deleteChapterMeta(input: DeleteChapterMetaInput!): DeleteChapterMetaPayload! + fetchChapterPages(input: FetchChapterPagesInput!): FetchChapterPagesPayload! + fetchChapters(input: FetchChaptersInput!): FetchChaptersPayload! + setChapterMeta(input: SetChapterMetaInput!): SetChapterMetaPayload! + updateChapter(input: UpdateChapterInput!): UpdateChapterPayload! + updateChapters(input: UpdateChaptersInput!): UpdateChaptersPayload! + clearDownloader(input: ClearDownloaderInput!): ClearDownloaderPayload! + deleteDownloadedChapter(input: DeleteDownloadedChapterInput!): DeleteDownloadedChapterPayload! + deleteDownloadedChapters(input: DeleteDownloadedChaptersInput!): DeleteDownloadedChaptersPayload! + dequeueChapterDownload(input: DequeueChapterDownloadInput!): DequeueChapterDownloadPayload! + dequeueChapterDownloads(input: DequeueChapterDownloadsInput!): DequeueChapterDownloadsPayload! + downloadAhead(input: DownloadAheadInput!): DownloadAheadPayload! + enqueueChapterDownload(input: EnqueueChapterDownloadInput!): EnqueueChapterDownloadPayload! + enqueueChapterDownloads(input: EnqueueChapterDownloadsInput!): EnqueueChapterDownloadsPayload! + reorderChapterDownload(input: ReorderChapterDownloadInput!): ReorderChapterDownloadPayload! + startDownloader(input: StartDownloaderInput!): StartDownloaderPayload! + stopDownloader(input: StopDownloaderInput!): StopDownloaderPayload! + fetchExtensions(input: FetchExtensionsInput!): FetchExtensionsPayload! + installExternalExtension(input: InstallExternalExtensionInput!): InstallExternalExtensionPayload! + updateExtension(input: UpdateExtensionInput!): UpdateExtensionPayload! + updateExtensions(input: UpdateExtensionsInput!): UpdateExtensionsPayload! + updateWebUI(input: WebUIUpdateInput!): WebUIUpdatePayload! + deleteMangaMeta(input: DeleteMangaMetaInput!): DeleteMangaMetaPayload! + fetchManga(input: FetchMangaInput!): FetchMangaPayload! + setMangaMeta(input: SetMangaMetaInput!): SetMangaMetaPayload! + updateManga(input: UpdateMangaInput!): UpdateMangaPayload! + updateMangas(input: UpdateMangasInput!): UpdateMangasPayload! + deleteGlobalMeta(input: DeleteGlobalMetaInput!): DeleteGlobalMetaPayload! + setGlobalMeta(input: SetGlobalMetaInput!): SetGlobalMetaPayload! + resetSettings(input: ResetSettingsInput!): ResetSettingsPayload! + setSettings(input: SetSettingsInput!): SetSettingsPayload! + fetchSourceManga(input: FetchSourceMangaInput!): FetchSourceMangaPayload! + updateSourcePreference(input: UpdateSourcePreferenceInput!): UpdateSourcePreferencePayload! + updateCategoryManga(input: UpdateCategoryMangaInput!): UpdateCategoryMangaPayload! + updateLibraryManga(input: UpdateLibraryMangaInput!): UpdateLibraryMangaPayload! + updateStop(input: UpdateStopInput!): UpdateStopPayload! } type PageInfo { - "When paginating forwards, the cursor to continue." - endCursor: Cursor - "When paginating forwards, are there more items?" - hasNextPage: Boolean! - "When paginating backwards, are there more items?" - hasPreviousPage: Boolean! - "When paginating backwards, the cursor to continue." - startCursor: Cursor + "When paginating forwards, the cursor to continue." + endCursor: Cursor + "When paginating forwards, are there more items?" + hasNextPage: Boolean! + "When paginating backwards, are there more items?" + hasPreviousPage: Boolean! + "When paginating backwards, the cursor to continue." + startCursor: Cursor } type PartialSettingsType implements Settings { - autoDownloadAheadLimit: Int - autoDownloadNewChapters: Boolean - backupInterval: Int - backupPath: String - backupTTL: Int - backupTime: String - basicAuthEnabled: Boolean - basicAuthPassword: String - basicAuthUsername: String - debugLogsEnabled: Boolean - downloadAsCbz: Boolean - downloadsPath: String - electronPath: String - excludeCompleted: Boolean - excludeEntryWithUnreadChapters: Boolean - excludeNotStarted: Boolean - excludeUnreadChapters: Boolean - globalUpdateInterval: Float - gqlDebugLogsEnabled: Boolean - initialOpenInBrowserEnabled: Boolean - ip: String - localSourcePath: String - maxSourcesInParallel: Int - port: Int - socksProxyEnabled: Boolean - socksProxyHost: String - socksProxyPort: String - systemTrayEnabled: Boolean - updateMangas: Boolean - webUIChannel: WebUIChannel - webUIFlavor: WebUIFlavor - webUIInterface: WebUIInterface - webUIUpdateCheckInterval: Float + autoDownloadAheadLimit: Int + autoDownloadNewChapters: Boolean + backupInterval: Int + backupPath: String + backupTTL: Int + backupTime: String + basicAuthEnabled: Boolean + basicAuthPassword: String + basicAuthUsername: String + debugLogsEnabled: Boolean + downloadAsCbz: Boolean + downloadsPath: String + electronPath: String + excludeCompleted: Boolean + excludeEntryWithUnreadChapters: Boolean + excludeNotStarted: Boolean + excludeUnreadChapters: Boolean + globalUpdateInterval: Float + gqlDebugLogsEnabled: Boolean + initialOpenInBrowserEnabled: Boolean + ip: String + localSourcePath: String + maxSourcesInParallel: Int + port: Int + socksProxyEnabled: Boolean + socksProxyHost: String + socksProxyPort: String + systemTrayEnabled: Boolean + updateMangas: Boolean + webUIChannel: WebUIChannel + webUIFlavor: WebUIFlavor + webUIInterface: WebUIInterface + webUIUpdateCheckInterval: Float } type Query { - restoreStatus(id: String!): BackupRestoreStatus - validateBackup(input: ValidateBackupInput!): ValidateBackupResult! - categories( - condition: CategoryConditionInput - filter: CategoryFilterInput - orderBy: CategoryOrderBy - orderByType: SortOrder - before: Cursor - after: Cursor - first: Int - last: Int - offset: Int - ): CategoryNodeList! - category(id: Int!): CategoryType! - chapter(id: Int!): ChapterType! - chapters( - condition: ChapterConditionInput - filter: ChapterFilterInput - orderBy: ChapterOrderBy - orderByType: SortOrder - before: Cursor - after: Cursor - first: Int - last: Int - offset: Int - ): ChapterNodeList! - downloadStatus: DownloadStatus! - extension(pkgName: String!): ExtensionType! - extensions( - condition: ExtensionConditionInput - filter: ExtensionFilterInput - orderBy: ExtensionOrderBy - orderByType: SortOrder - before: Cursor - after: Cursor - first: Int - last: Int - offset: Int - ): ExtensionNodeList! - about: AboutPayload! - checkForServerUpdates: [CheckForServerUpdatesPayload!]! - checkForWebUIUpdate: WebUIUpdateInfo! - getWebUIUpdateStatus: WebUIUpdateStatus! - manga(id: Int!): MangaType! - mangas( - condition: MangaConditionInput - filter: MangaFilterInput - orderBy: MangaOrderBy - orderByType: SortOrder - before: Cursor - after: Cursor - first: Int - last: Int - offset: Int - ): MangaNodeList! - meta(key: String!): GlobalMetaType! - metas( - condition: MetaConditionInput - filter: MetaFilterInput - orderBy: MetaOrderBy - orderByType: SortOrder - before: Cursor - after: Cursor - first: Int - last: Int - offset: Int - ): GlobalMetaNodeList! - settings: SettingsType! - source(id: LongString!): SourceType! - sources( - condition: SourceConditionInput - filter: SourceFilterInput - orderBy: SourceOrderBy - orderByType: SortOrder - before: Cursor - after: Cursor - first: Int - last: Int - offset: Int - ): SourceNodeList! - lastUpdateTimestamp: LastUpdateTimestampPayload! - updateStatus: UpdateStatus! + restoreStatus(id: String!): BackupRestoreStatus + validateBackup(input: ValidateBackupInput!): ValidateBackupResult! + categories(condition: CategoryConditionInput, filter: CategoryFilterInput, orderBy: CategoryOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): CategoryNodeList! + category(id: Int!): CategoryType! + chapter(id: Int!): ChapterType! + chapters(condition: ChapterConditionInput, filter: ChapterFilterInput, orderBy: ChapterOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): ChapterNodeList! + downloadStatus: DownloadStatus! + extension(pkgName: String!): ExtensionType! + extensions(condition: ExtensionConditionInput, filter: ExtensionFilterInput, orderBy: ExtensionOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): ExtensionNodeList! + aboutServer: AboutServerPayload! + aboutWebUI: WebUIUpdateInfo! + checkForServerUpdates: [CheckForServerUpdatesPayload!]! + checkForWebUIUpdate: WebUIUpdateInfo! + getWebUIUpdateStatus: WebUIUpdateStatus! + manga(id: Int!): MangaType! + mangas(condition: MangaConditionInput, filter: MangaFilterInput, orderBy: MangaOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): MangaNodeList! + meta(key: String!): GlobalMetaType! + metas(condition: MetaConditionInput, filter: MetaFilterInput, orderBy: MetaOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): GlobalMetaNodeList! + settings: SettingsType! + source(id: LongString!): SourceType! + sources(condition: SourceConditionInput, filter: SourceFilterInput, orderBy: SourceOrderBy, orderByType: SortOrder, before: Cursor, after: Cursor, first: Int, last: Int, offset: Int): SourceNodeList! + lastUpdateTimestamp: LastUpdateTimestampPayload! + updateStatus: UpdateStatus! } type ReorderChapterDownloadPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type ResetSettingsPayload { - clientMutationId: String - settings: SettingsType! + clientMutationId: String + settings: SettingsType! } type RestoreBackupPayload { - clientMutationId: String - id: String! - status: BackupRestoreStatus + clientMutationId: String + id: String! + status: BackupRestoreStatus } type SelectFilter { - default: Int! - name: String! - values: [String!]! + default: Int! + name: String! + values: [String!]! } type SeparatorFilter { - name: String! + name: String! } type SetCategoryMetaPayload { - clientMutationId: String - meta: CategoryMetaType! + clientMutationId: String + meta: CategoryMetaType! } type SetChapterMetaPayload { - clientMutationId: String - meta: ChapterMetaType! + clientMutationId: String + meta: ChapterMetaType! } type SetGlobalMetaPayload { - clientMutationId: String - meta: GlobalMetaType! + clientMutationId: String + meta: GlobalMetaType! } type SetMangaMetaPayload { - clientMutationId: String - meta: MangaMetaType! + clientMutationId: String + meta: MangaMetaType! } type SetSettingsPayload { - clientMutationId: String - settings: SettingsType! + clientMutationId: String + settings: SettingsType! } type SettingsType implements Settings { - autoDownloadAheadLimit: Int! - autoDownloadNewChapters: Boolean! - backupInterval: Int! - backupPath: String! - backupTTL: Int! - backupTime: String! - basicAuthEnabled: Boolean! - basicAuthPassword: String! - basicAuthUsername: String! - debugLogsEnabled: Boolean! - downloadAsCbz: Boolean! - downloadsPath: String! - electronPath: String! - excludeCompleted: Boolean! - excludeEntryWithUnreadChapters: Boolean! - excludeNotStarted: Boolean! - excludeUnreadChapters: Boolean! - globalUpdateInterval: Float! - gqlDebugLogsEnabled: Boolean! - initialOpenInBrowserEnabled: Boolean! - ip: String! - localSourcePath: String! - maxSourcesInParallel: Int! - port: Int! - socksProxyEnabled: Boolean! - socksProxyHost: String! - socksProxyPort: String! - systemTrayEnabled: Boolean! - updateMangas: Boolean! - webUIChannel: WebUIChannel! - webUIFlavor: WebUIFlavor! - webUIInterface: WebUIInterface! - webUIUpdateCheckInterval: Float! + autoDownloadAheadLimit: Int! + autoDownloadNewChapters: Boolean! + backupInterval: Int! + backupPath: String! + backupTTL: Int! + backupTime: String! + basicAuthEnabled: Boolean! + basicAuthPassword: String! + basicAuthUsername: String! + debugLogsEnabled: Boolean! + downloadAsCbz: Boolean! + downloadsPath: String! + electronPath: String! + excludeCompleted: Boolean! + excludeEntryWithUnreadChapters: Boolean! + excludeNotStarted: Boolean! + excludeUnreadChapters: Boolean! + globalUpdateInterval: Float! + gqlDebugLogsEnabled: Boolean! + initialOpenInBrowserEnabled: Boolean! + ip: String! + localSourcePath: String! + maxSourcesInParallel: Int! + port: Int! + socksProxyEnabled: Boolean! + socksProxyHost: String! + socksProxyPort: String! + systemTrayEnabled: Boolean! + updateMangas: Boolean! + webUIChannel: WebUIChannel! + webUIFlavor: WebUIFlavor! + webUIInterface: WebUIInterface! + webUIUpdateCheckInterval: Float! } type SortFilter { - default: SortSelection - name: String! - values: [String!]! + default: SortSelection + name: String! + values: [String!]! } type SortSelection { - ascending: Boolean! - index: Int! + ascending: Boolean! + index: Int! } type SourceEdge implements Edge { - cursor: Cursor! - node: SourceType! + cursor: Cursor! + node: SourceType! } type SourceNodeList implements NodeList { - edges: [SourceEdge!]! - nodes: [SourceType!]! - pageInfo: PageInfo! - totalCount: Int! + edges: [SourceEdge!]! + nodes: [SourceType!]! + pageInfo: PageInfo! + totalCount: Int! } type SourceType { - displayName: String! - iconUrl: String! - id: LongString! - isConfigurable: Boolean! - isNsfw: Boolean! - lang: String! - name: String! - supportsLatest: Boolean! - extension: ExtensionType! - filters: [Filter!]! - manga: MangaNodeList! - preferences: [Preference!]! + displayName: String! + iconUrl: String! + id: LongString! + isConfigurable: Boolean! + isNsfw: Boolean! + lang: String! + name: String! + supportsLatest: Boolean! + extension: ExtensionType! + filters: [Filter!]! + manga: MangaNodeList! + preferences: [Preference!]! } type StartDownloaderPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type StopDownloaderPayload { - clientMutationId: String - downloadStatus: DownloadStatus! + clientMutationId: String + downloadStatus: DownloadStatus! } type Subscription { - downloadChanged: DownloadStatus! - webUIUpdateStatusChange: WebUIUpdateStatus! - updateStatusChanged: UpdateStatus! + downloadChanged: DownloadStatus! + webUIUpdateStatusChange: WebUIUpdateStatus! + updateStatusChanged: UpdateStatus! } type SwitchPreference { - currentValue: Boolean - default: Boolean! - key: String! - summary: String - title: String! - visible: Boolean! + currentValue: Boolean + default: Boolean! + key: String! + summary: String + title: String! + visible: Boolean! } type TextFilter { - default: String! - name: String! + default: String! + name: String! } type TriStateFilter { - default: TriState! - name: String! + default: TriState! + name: String! } type UpdateCategoriesPayload { - categories: [CategoryType!]! - clientMutationId: String + categories: [CategoryType!]! + clientMutationId: String } type UpdateCategoryMangaPayload { - clientMutationId: String - updateStatus: UpdateStatus! + clientMutationId: String + updateStatus: UpdateStatus! } type UpdateCategoryOrderPayload { - categories: [CategoryType!]! - clientMutationId: String + categories: [CategoryType!]! + clientMutationId: String } type UpdateCategoryPayload { - category: CategoryType! - clientMutationId: String + category: CategoryType! + clientMutationId: String } type UpdateChapterPayload { - chapter: ChapterType! - clientMutationId: String + chapter: ChapterType! + clientMutationId: String } type UpdateChaptersPayload { - chapters: [ChapterType!]! - clientMutationId: String + chapters: [ChapterType!]! + clientMutationId: String } type UpdateExtensionPayload { - clientMutationId: String - extension: ExtensionType! + clientMutationId: String + extension: ExtensionType! } type UpdateExtensionsPayload { - clientMutationId: String - extensions: [ExtensionType!]! + clientMutationId: String + extensions: [ExtensionType!]! } type UpdateLibraryMangaPayload { - clientMutationId: String - updateStatus: UpdateStatus! + clientMutationId: String + updateStatus: UpdateStatus! } type UpdateMangaCategoriesPayload { - clientMutationId: String - manga: MangaType! + clientMutationId: String + manga: MangaType! } type UpdateMangaPayload { - clientMutationId: String - manga: MangaType! + clientMutationId: String + manga: MangaType! } type UpdateMangasCategoriesPayload { - clientMutationId: String - mangas: [MangaType!]! + clientMutationId: String + mangas: [MangaType!]! } type UpdateMangasPayload { - clientMutationId: String - mangas: [MangaType!]! + clientMutationId: String + mangas: [MangaType!]! } type UpdateSourcePreferencePayload { - clientMutationId: String - preferences: [Preference!]! - source: SourceType! + clientMutationId: String + preferences: [Preference!]! + source: SourceType! } type UpdateStatus { - completeJobs: UpdateStatusType! - failedJobs: UpdateStatusType! - isRunning: Boolean! - pendingJobs: UpdateStatusType! - runningJobs: UpdateStatusType! - skippedCategories: UpdateStatusCategoryType! - skippedJobs: UpdateStatusType! - updatingCategories: UpdateStatusCategoryType! + completeJobs: UpdateStatusType! + failedJobs: UpdateStatusType! + isRunning: Boolean! + pendingJobs: UpdateStatusType! + runningJobs: UpdateStatusType! + skippedCategories: UpdateStatusCategoryType! + skippedJobs: UpdateStatusType! + updatingCategories: UpdateStatusCategoryType! } type UpdateStatusCategoryType { - categories: CategoryNodeList! + categories: CategoryNodeList! } type UpdateStatusType { - mangas: MangaNodeList! + mangas: MangaNodeList! } type UpdateStopPayload { - clientMutationId: String + clientMutationId: String } type ValidateBackupResult { - missingSources: [ValidateBackupSource!]! + missingSources: [ValidateBackupSource!]! } type ValidateBackupSource { - id: LongString! - name: String! + id: LongString! + name: String! } type WebUIUpdateInfo { - channel: String! - tag: String! - updateAvailable: Boolean! + channel: String! + tag: String! + updateAvailable: Boolean! } type WebUIUpdatePayload { - clientMutationId: String - updateStatus: WebUIUpdateStatus! + clientMutationId: String + updateStatus: WebUIUpdateStatus! } type WebUIUpdateStatus { - info: WebUIUpdateInfo! - progress: Int! - state: UpdateState! + info: WebUIUpdateInfo! + progress: Int! + state: UpdateState! } interface Edge { - "A cursor for use in pagination." - cursor: Cursor! - "The [T] at the end of the edge." - node: Node! + "A cursor for use in pagination." + cursor: Cursor! + "The [T] at the end of the edge." + node: Node! } interface MetaType { - key: String! - value: String! + key: String! + value: String! } interface NodeList { - "A list of edges which contains the [T] and cursor to aid in pagination." - edges: [Edge!]! - "A list of [T] objects." - nodes: [Node!]! - "Information to aid in pagination." - pageInfo: PageInfo! - "The count of all nodes you could get from the connection." - totalCount: Int! + "A list of edges which contains the [T] and cursor to aid in pagination." + edges: [Edge!]! + "A list of [T] objects." + nodes: [Node!]! + "Information to aid in pagination." + pageInfo: PageInfo! + "The count of all nodes you could get from the connection." + totalCount: Int! } interface Settings { - autoDownloadAheadLimit: Int - autoDownloadNewChapters: Boolean - backupInterval: Int - backupPath: String - backupTTL: Int - backupTime: String - basicAuthEnabled: Boolean - basicAuthPassword: String - basicAuthUsername: String - debugLogsEnabled: Boolean - downloadAsCbz: Boolean - downloadsPath: String - electronPath: String - excludeCompleted: Boolean - excludeEntryWithUnreadChapters: Boolean - excludeNotStarted: Boolean - excludeUnreadChapters: Boolean - globalUpdateInterval: Float - gqlDebugLogsEnabled: Boolean - initialOpenInBrowserEnabled: Boolean - ip: String - localSourcePath: String - maxSourcesInParallel: Int - port: Int - socksProxyEnabled: Boolean - socksProxyHost: String - socksProxyPort: String - systemTrayEnabled: Boolean - updateMangas: Boolean - webUIChannel: WebUIChannel - webUIFlavor: WebUIFlavor - webUIInterface: WebUIInterface - webUIUpdateCheckInterval: Float -} -union Filter = - CheckBoxFilter - | GroupFilter - | HeaderFilter - | SelectFilter - | SeparatorFilter - | SortFilter - | TextFilter - | TriStateFilter -union Node = - CategoryMetaType - | CategoryType - | ChapterMetaType - | ChapterType - | DownloadType - | ExtensionType - | GlobalMetaType - | MangaMetaType - | MangaType - | PartialSettingsType - | SettingsType - | SourceType -union Preference = - CheckBoxPreference - | EditTextPreference - | ListPreference - | MultiSelectListPreference - | SwitchPreference + autoDownloadAheadLimit: Int + autoDownloadNewChapters: Boolean + backupInterval: Int + backupPath: String + backupTTL: Int + backupTime: String + basicAuthEnabled: Boolean + basicAuthPassword: String + basicAuthUsername: String + debugLogsEnabled: Boolean + downloadAsCbz: Boolean + downloadsPath: String + electronPath: String + excludeCompleted: Boolean + excludeEntryWithUnreadChapters: Boolean + excludeNotStarted: Boolean + excludeUnreadChapters: Boolean + globalUpdateInterval: Float + gqlDebugLogsEnabled: Boolean + initialOpenInBrowserEnabled: Boolean + ip: String + localSourcePath: String + maxSourcesInParallel: Int + port: Int + socksProxyEnabled: Boolean + socksProxyHost: String + socksProxyPort: String + systemTrayEnabled: Boolean + updateMangas: Boolean + webUIChannel: WebUIChannel + webUIFlavor: WebUIFlavor + webUIInterface: WebUIInterface + webUIUpdateCheckInterval: Float +} +union Filter = CheckBoxFilter | GroupFilter | HeaderFilter | SelectFilter | SeparatorFilter | SortFilter | TextFilter | TriStateFilter +union Node = CategoryMetaType | CategoryType | ChapterMetaType | ChapterType | DownloadType | ExtensionType | GlobalMetaType | MangaMetaType | MangaType | PartialSettingsType | SettingsType | SourceType +union Preference = CheckBoxPreference | EditTextPreference | ListPreference | MultiSelectListPreference | SwitchPreference enum BackupRestoreState { - IDLE - SUCCESS - FAILURE - RESTORING_CATEGORIES - RESTORING_MANGA + IDLE + SUCCESS + FAILURE + RESTORING_CATEGORIES + RESTORING_MANGA } enum CategoryOrderBy { - ID - NAME - ORDER + ID + NAME + ORDER } enum ChapterOrderBy { - ID - SOURCE_ORDER - NAME - UPLOAD_DATE - CHAPTER_NUMBER - LAST_READ_AT - FETCHED_AT + ID + SOURCE_ORDER + NAME + UPLOAD_DATE + CHAPTER_NUMBER + LAST_READ_AT + FETCHED_AT } enum DownloadState { - QUEUED - DOWNLOADING - FINISHED - ERROR + QUEUED + DOWNLOADING + FINISHED + ERROR } enum DownloaderState { - STARTED - STOPPED + STARTED + STOPPED } enum ExtensionOrderBy { - PKG_NAME - NAME - APK_NAME + PKG_NAME + NAME + APK_NAME } enum FetchSourceMangaType { - SEARCH - POPULAR - LATEST + SEARCH + POPULAR + LATEST } enum IncludeInUpdate { - EXCLUDE - INCLUDE - UNSET + EXCLUDE + INCLUDE + UNSET } enum MangaOrderBy { - ID - TITLE - IN_LIBRARY_AT - LAST_FETCHED_AT + ID + TITLE + IN_LIBRARY_AT + LAST_FETCHED_AT } enum MangaStatus { - UNKNOWN - ONGOING - COMPLETED - LICENSED - PUBLISHING_FINISHED - CANCELLED - ON_HIATUS + UNKNOWN + ONGOING + COMPLETED + LICENSED + PUBLISHING_FINISHED + CANCELLED + ON_HIATUS } enum MetaOrderBy { - KEY - VALUE + KEY + VALUE } enum SortOrder { - ASC - DESC - ASC_NULLS_FIRST - DESC_NULLS_FIRST - ASC_NULLS_LAST - DESC_NULLS_LAST + ASC + DESC + ASC_NULLS_FIRST + DESC_NULLS_FIRST + ASC_NULLS_LAST + DESC_NULLS_LAST } enum SourceOrderBy { - ID - NAME - LANG + ID + NAME + LANG } enum TriState { - IGNORE - INCLUDE - EXCLUDE + IGNORE + INCLUDE + EXCLUDE } enum UpdateState { - STOPPED - DOWNLOADING - FINISHED - ERROR + STOPPED + DOWNLOADING + FINISHED + ERROR } enum WebUIChannel { - BUNDLED - STABLE - PREVIEW + BUNDLED + STABLE + PREVIEW } enum WebUIFlavor { - WEBUI - CUSTOM + WEBUI + CUSTOM } enum WebUIInterface { - BROWSER - ELECTRON + BROWSER + ELECTRON } input BooleanFilterInput { - distinctFrom: Boolean - equalTo: Boolean - greaterThan: Boolean - greaterThanOrEqualTo: Boolean - in: [Boolean!] - isNull: Boolean - lessThan: Boolean - lessThanOrEqualTo: Boolean - notDistinctFrom: Boolean - notEqualTo: Boolean - notIn: [Boolean!] + distinctFrom: Boolean + equalTo: Boolean + greaterThan: Boolean + greaterThanOrEqualTo: Boolean + in: [Boolean!] + isNull: Boolean + lessThan: Boolean + lessThanOrEqualTo: Boolean + notDistinctFrom: Boolean + notEqualTo: Boolean + notIn: [Boolean!] } input CategoryConditionInput { - default: Boolean - id: Int - name: String - order: Int + default: Boolean + id: Int + name: String + order: Int } input CategoryFilterInput { - and: [CategoryFilterInput!] - default: BooleanFilterInput - id: IntFilterInput - name: StringFilterInput - not: CategoryFilterInput - or: [CategoryFilterInput!] - order: IntFilterInput + and: [CategoryFilterInput!] + default: BooleanFilterInput + id: IntFilterInput + name: StringFilterInput + not: CategoryFilterInput + or: [CategoryFilterInput!] + order: IntFilterInput } input CategoryMetaTypeInput { - categoryId: Int! - key: String! - value: String! + categoryId: Int! + key: String! + value: String! } input ChapterConditionInput { - chapterNumber: Float - fetchedAt: LongString - id: Int - isBookmarked: Boolean - isDownloaded: Boolean - isRead: Boolean - lastPageRead: Int - lastReadAt: LongString - mangaId: Int - name: String - pageCount: Int - realUrl: String - scanlator: String - sourceOrder: Int - uploadDate: LongString - url: String + chapterNumber: Float + fetchedAt: LongString + id: Int + isBookmarked: Boolean + isDownloaded: Boolean + isRead: Boolean + lastPageRead: Int + lastReadAt: LongString + mangaId: Int + name: String + pageCount: Int + realUrl: String + scanlator: String + sourceOrder: Int + uploadDate: LongString + url: String } input ChapterFilterInput { - and: [ChapterFilterInput!] - chapterNumber: FloatFilterInput - fetchedAt: LongFilterInput - id: IntFilterInput - inLibrary: BooleanFilterInput - isBookmarked: BooleanFilterInput - isDownloaded: BooleanFilterInput - isRead: BooleanFilterInput - lastPageRead: IntFilterInput - lastReadAt: LongFilterInput - mangaId: IntFilterInput - name: StringFilterInput - not: ChapterFilterInput - or: [ChapterFilterInput!] - pageCount: IntFilterInput - realUrl: StringFilterInput - scanlator: StringFilterInput - sourceOrder: IntFilterInput - uploadDate: LongFilterInput - url: StringFilterInput + and: [ChapterFilterInput!] + chapterNumber: FloatFilterInput + fetchedAt: LongFilterInput + id: IntFilterInput + inLibrary: BooleanFilterInput + isBookmarked: BooleanFilterInput + isDownloaded: BooleanFilterInput + isRead: BooleanFilterInput + lastPageRead: IntFilterInput + lastReadAt: LongFilterInput + mangaId: IntFilterInput + name: StringFilterInput + not: ChapterFilterInput + or: [ChapterFilterInput!] + pageCount: IntFilterInput + realUrl: StringFilterInput + scanlator: StringFilterInput + sourceOrder: IntFilterInput + uploadDate: LongFilterInput + url: StringFilterInput } input ChapterMetaTypeInput { - chapterId: Int! - key: String! - value: String! + chapterId: Int! + key: String! + value: String! } input ClearDownloaderInput { - clientMutationId: String + clientMutationId: String } input CreateBackupInput { - clientMutationId: String - includeCategories: Boolean - includeChapters: Boolean + clientMutationId: String + includeCategories: Boolean + includeChapters: Boolean } input CreateCategoryInput { - clientMutationId: String - default: Boolean - includeInUpdate: IncludeInUpdate - name: String! - order: Int + clientMutationId: String + default: Boolean + includeInUpdate: IncludeInUpdate + name: String! + order: Int } input DeleteCategoryInput { - categoryId: Int! - clientMutationId: String + categoryId: Int! + clientMutationId: String } input DeleteCategoryMetaInput { - categoryId: Int! - clientMutationId: String - key: String! + categoryId: Int! + clientMutationId: String + key: String! } input DeleteChapterMetaInput { - chapterId: Int! - clientMutationId: String - key: String! + chapterId: Int! + clientMutationId: String + key: String! } input DeleteDownloadedChapterInput { - clientMutationId: String - id: Int! + clientMutationId: String + id: Int! } input DeleteDownloadedChaptersInput { - clientMutationId: String - ids: [Int!]! + clientMutationId: String + ids: [Int!]! } input DeleteGlobalMetaInput { - clientMutationId: String - key: String! + clientMutationId: String + key: String! } input DeleteMangaMetaInput { - clientMutationId: String - key: String! - mangaId: Int! + clientMutationId: String + key: String! + mangaId: Int! } input DequeueChapterDownloadInput { - clientMutationId: String - id: Int! + clientMutationId: String + id: Int! } input DequeueChapterDownloadsInput { - clientMutationId: String - ids: [Int!]! + clientMutationId: String + ids: [Int!]! } input DownloadAheadInput { - clientMutationId: String - latestReadChapterIds: [Int!] - mangaIds: [Int!]! + clientMutationId: String + latestReadChapterIds: [Int!] + mangaIds: [Int!]! } input EnqueueChapterDownloadInput { - clientMutationId: String - id: Int! + clientMutationId: String + id: Int! } input EnqueueChapterDownloadsInput { - clientMutationId: String - ids: [Int!]! + clientMutationId: String + ids: [Int!]! } input ExtensionConditionInput { - apkName: String - hasUpdate: Boolean - iconUrl: String - isInstalled: Boolean - isNsfw: Boolean - isObsolete: Boolean - lang: String - name: String - pkgName: String - versionCode: Int - versionName: String + apkName: String + hasUpdate: Boolean + iconUrl: String + isInstalled: Boolean + isNsfw: Boolean + isObsolete: Boolean + lang: String + name: String + pkgName: String + versionCode: Int + versionName: String } input ExtensionFilterInput { - and: [ExtensionFilterInput!] - apkName: StringFilterInput - hasUpdate: BooleanFilterInput - iconUrl: StringFilterInput - isInstalled: BooleanFilterInput - isNsfw: BooleanFilterInput - isObsolete: BooleanFilterInput - lang: StringFilterInput - name: StringFilterInput - not: ExtensionFilterInput - or: [ExtensionFilterInput!] - pkgName: StringFilterInput - versionCode: IntFilterInput - versionName: StringFilterInput + and: [ExtensionFilterInput!] + apkName: StringFilterInput + hasUpdate: BooleanFilterInput + iconUrl: StringFilterInput + isInstalled: BooleanFilterInput + isNsfw: BooleanFilterInput + isObsolete: BooleanFilterInput + lang: StringFilterInput + name: StringFilterInput + not: ExtensionFilterInput + or: [ExtensionFilterInput!] + pkgName: StringFilterInput + versionCode: IntFilterInput + versionName: StringFilterInput } input FetchChapterPagesInput { - chapterId: Int! - clientMutationId: String + chapterId: Int! + clientMutationId: String } input FetchChaptersInput { - clientMutationId: String - mangaId: Int! + clientMutationId: String + mangaId: Int! } input FetchExtensionsInput { - clientMutationId: String + clientMutationId: String } input FetchMangaInput { - clientMutationId: String - id: Int! + clientMutationId: String + id: Int! } input FetchSourceMangaInput { - clientMutationId: String - filters: [FilterChangeInput!] - page: Int! - query: String - source: LongString! - type: FetchSourceMangaType! + clientMutationId: String + filters: [FilterChangeInput!] + page: Int! + query: String + source: LongString! + type: FetchSourceMangaType! } input FilterChangeInput { - checkBoxState: Boolean - groupChange: FilterChangeInput - position: Int! - selectState: Int - sortState: SortSelectionInput - textState: String - triState: TriState + checkBoxState: Boolean + groupChange: FilterChangeInput + position: Int! + selectState: Int + sortState: SortSelectionInput + textState: String + triState: TriState } input FloatFilterInput { - distinctFrom: Float - equalTo: Float - greaterThan: Float - greaterThanOrEqualTo: Float - in: [Float!] - isNull: Boolean - lessThan: Float - lessThanOrEqualTo: Float - notDistinctFrom: Float - notEqualTo: Float - notIn: [Float!] + distinctFrom: Float + equalTo: Float + greaterThan: Float + greaterThanOrEqualTo: Float + in: [Float!] + isNull: Boolean + lessThan: Float + lessThanOrEqualTo: Float + notDistinctFrom: Float + notEqualTo: Float + notIn: [Float!] } input GlobalMetaTypeInput { - key: String! - value: String! + key: String! + value: String! } input InstallExternalExtensionInput { - clientMutationId: String - extensionFile: Upload! + clientMutationId: String + extensionFile: Upload! } input IntFilterInput { - distinctFrom: Int - equalTo: Int - greaterThan: Int - greaterThanOrEqualTo: Int - in: [Int!] - isNull: Boolean - lessThan: Int - lessThanOrEqualTo: Int - notDistinctFrom: Int - notEqualTo: Int - notIn: [Int!] + distinctFrom: Int + equalTo: Int + greaterThan: Int + greaterThanOrEqualTo: Int + in: [Int!] + isNull: Boolean + lessThan: Int + lessThanOrEqualTo: Int + notDistinctFrom: Int + notEqualTo: Int + notIn: [Int!] } input LongFilterInput { - distinctFrom: LongString - equalTo: LongString - greaterThan: LongString - greaterThanOrEqualTo: LongString - in: [LongString!] - isNull: Boolean - lessThan: LongString - lessThanOrEqualTo: LongString - notDistinctFrom: LongString - notEqualTo: LongString - notIn: [LongString!] + distinctFrom: LongString + equalTo: LongString + greaterThan: LongString + greaterThanOrEqualTo: LongString + in: [LongString!] + isNull: Boolean + lessThan: LongString + lessThanOrEqualTo: LongString + notDistinctFrom: LongString + notEqualTo: LongString + notIn: [LongString!] } input MangaConditionInput { - artist: String - author: String - categoryIds: [Int!] - chaptersLastFetchedAt: LongString - description: String - genre: [String!] - id: Int - inLibrary: Boolean - inLibraryAt: LongString - initialized: Boolean - lastFetchedAt: LongString - realUrl: String - sourceId: LongString - status: MangaStatus - thumbnailUrl: String - title: String - url: String + artist: String + author: String + categoryIds: [Int!] + chaptersLastFetchedAt: LongString + description: String + genre: [String!] + id: Int + inLibrary: Boolean + inLibraryAt: LongString + initialized: Boolean + lastFetchedAt: LongString + realUrl: String + sourceId: LongString + status: MangaStatus + thumbnailUrl: String + title: String + url: String } input MangaFilterInput { - and: [MangaFilterInput!] - artist: StringFilterInput - author: StringFilterInput - categoryId: IntFilterInput - chaptersLastFetchedAt: LongFilterInput - description: StringFilterInput - genre: StringFilterInput - id: IntFilterInput - inLibrary: BooleanFilterInput - inLibraryAt: LongFilterInput - initialized: BooleanFilterInput - lastFetchedAt: LongFilterInput - not: MangaFilterInput - or: [MangaFilterInput!] - realUrl: StringFilterInput - sourceId: LongFilterInput - status: MangaStatusFilterInput - thumbnailUrl: StringFilterInput - title: StringFilterInput - url: StringFilterInput + and: [MangaFilterInput!] + artist: StringFilterInput + author: StringFilterInput + categoryId: IntFilterInput + chaptersLastFetchedAt: LongFilterInput + description: StringFilterInput + genre: StringFilterInput + id: IntFilterInput + inLibrary: BooleanFilterInput + inLibraryAt: LongFilterInput + initialized: BooleanFilterInput + lastFetchedAt: LongFilterInput + not: MangaFilterInput + or: [MangaFilterInput!] + realUrl: StringFilterInput + sourceId: LongFilterInput + status: MangaStatusFilterInput + thumbnailUrl: StringFilterInput + title: StringFilterInput + url: StringFilterInput } input MangaMetaTypeInput { - key: String! - mangaId: Int! - value: String! + key: String! + mangaId: Int! + value: String! } input MangaStatusFilterInput { - distinctFrom: MangaStatus - equalTo: MangaStatus - greaterThan: MangaStatus - greaterThanOrEqualTo: MangaStatus - in: [MangaStatus!] - isNull: Boolean - lessThan: MangaStatus - lessThanOrEqualTo: MangaStatus - notDistinctFrom: MangaStatus - notEqualTo: MangaStatus - notIn: [MangaStatus!] + distinctFrom: MangaStatus + equalTo: MangaStatus + greaterThan: MangaStatus + greaterThanOrEqualTo: MangaStatus + in: [MangaStatus!] + isNull: Boolean + lessThan: MangaStatus + lessThanOrEqualTo: MangaStatus + notDistinctFrom: MangaStatus + notEqualTo: MangaStatus + notIn: [MangaStatus!] } input MetaConditionInput { - key: String - value: String + key: String + value: String } input MetaFilterInput { - and: [MetaFilterInput!] - key: StringFilterInput - not: MetaFilterInput - or: [MetaFilterInput!] - value: StringFilterInput + and: [MetaFilterInput!] + key: StringFilterInput + not: MetaFilterInput + or: [MetaFilterInput!] + value: StringFilterInput } input PartialSettingsTypeInput { - autoDownloadAheadLimit: Int - autoDownloadNewChapters: Boolean - backupInterval: Int - backupPath: String - backupTTL: Int - backupTime: String - basicAuthEnabled: Boolean - basicAuthPassword: String - basicAuthUsername: String - debugLogsEnabled: Boolean - downloadAsCbz: Boolean - downloadsPath: String - electronPath: String - excludeCompleted: Boolean - excludeEntryWithUnreadChapters: Boolean - excludeNotStarted: Boolean - excludeUnreadChapters: Boolean - globalUpdateInterval: Float - gqlDebugLogsEnabled: Boolean - initialOpenInBrowserEnabled: Boolean - ip: String - localSourcePath: String - maxSourcesInParallel: Int - port: Int - socksProxyEnabled: Boolean - socksProxyHost: String - socksProxyPort: String - systemTrayEnabled: Boolean - updateMangas: Boolean - webUIChannel: WebUIChannel - webUIFlavor: WebUIFlavor - webUIInterface: WebUIInterface - webUIUpdateCheckInterval: Float + autoDownloadAheadLimit: Int + autoDownloadNewChapters: Boolean + backupInterval: Int + backupPath: String + backupTTL: Int + backupTime: String + basicAuthEnabled: Boolean + basicAuthPassword: String + basicAuthUsername: String + debugLogsEnabled: Boolean + downloadAsCbz: Boolean + downloadsPath: String + electronPath: String + excludeCompleted: Boolean + excludeEntryWithUnreadChapters: Boolean + excludeNotStarted: Boolean + excludeUnreadChapters: Boolean + globalUpdateInterval: Float + gqlDebugLogsEnabled: Boolean + initialOpenInBrowserEnabled: Boolean + ip: String + localSourcePath: String + maxSourcesInParallel: Int + port: Int + socksProxyEnabled: Boolean + socksProxyHost: String + socksProxyPort: String + systemTrayEnabled: Boolean + updateMangas: Boolean + webUIChannel: WebUIChannel + webUIFlavor: WebUIFlavor + webUIInterface: WebUIInterface + webUIUpdateCheckInterval: Float } input ReorderChapterDownloadInput { - chapterId: Int! - clientMutationId: String - to: Int! + chapterId: Int! + clientMutationId: String + to: Int! } input ResetSettingsInput { - clientMutationId: String + clientMutationId: String } input RestoreBackupInput { - backup: Upload! - clientMutationId: String + backup: Upload! + clientMutationId: String } input SetCategoryMetaInput { - clientMutationId: String - meta: CategoryMetaTypeInput! + clientMutationId: String + meta: CategoryMetaTypeInput! } input SetChapterMetaInput { - clientMutationId: String - meta: ChapterMetaTypeInput! + clientMutationId: String + meta: ChapterMetaTypeInput! } input SetGlobalMetaInput { - clientMutationId: String - meta: GlobalMetaTypeInput! + clientMutationId: String + meta: GlobalMetaTypeInput! } input SetMangaMetaInput { - clientMutationId: String - meta: MangaMetaTypeInput! + clientMutationId: String + meta: MangaMetaTypeInput! } input SetSettingsInput { - clientMutationId: String - settings: PartialSettingsTypeInput! + clientMutationId: String + settings: PartialSettingsTypeInput! } input SortSelectionInput { - ascending: Boolean! - index: Int! + ascending: Boolean! + index: Int! } input SourceConditionInput { - id: LongString - isNsfw: Boolean - lang: String - name: String + id: LongString + isNsfw: Boolean + lang: String + name: String } input SourceFilterInput { - and: [SourceFilterInput!] - id: LongFilterInput - isNsfw: BooleanFilterInput - lang: StringFilterInput - name: StringFilterInput - not: SourceFilterInput - or: [SourceFilterInput!] + and: [SourceFilterInput!] + id: LongFilterInput + isNsfw: BooleanFilterInput + lang: StringFilterInput + name: StringFilterInput + not: SourceFilterInput + or: [SourceFilterInput!] } input SourcePreferenceChangeInput { - checkBoxState: Boolean - editTextState: String - listState: String - multiSelectState: [String!] - position: Int! - switchState: Boolean + checkBoxState: Boolean + editTextState: String + listState: String + multiSelectState: [String!] + position: Int! + switchState: Boolean } input StartDownloaderInput { - clientMutationId: String + clientMutationId: String } input StopDownloaderInput { - clientMutationId: String + clientMutationId: String } input StringFilterInput { - distinctFrom: String - distinctFromInsensitive: String - endsWith: String - endsWithInsensitive: String - equalTo: String - greaterThan: String - greaterThanInsensitive: String - greaterThanOrEqualTo: String - greaterThanOrEqualToInsensitive: String - in: [String!] - inInsensitive: [String!] - includes: String - includesInsensitive: String - isNull: Boolean - lessThan: String - lessThanInsensitive: String - lessThanOrEqualTo: String - lessThanOrEqualToInsensitive: String - like: String - likeInsensitive: String - notDistinctFrom: String - notDistinctFromInsensitive: String - notEndsWith: String - notEndsWithInsensitive: String - notEqualTo: String - notIn: [String!] - notInInsensitive: [String!] - notIncludes: String - notIncludesInsensitive: String - notLike: String - notLikeInsensitive: String - notStartsWith: String - notStartsWithInsensitive: String - startsWith: String - startsWithInsensitive: String + distinctFrom: String + distinctFromInsensitive: String + endsWith: String + endsWithInsensitive: String + equalTo: String + greaterThan: String + greaterThanInsensitive: String + greaterThanOrEqualTo: String + greaterThanOrEqualToInsensitive: String + in: [String!] + inInsensitive: [String!] + includes: String + includesInsensitive: String + isNull: Boolean + lessThan: String + lessThanInsensitive: String + lessThanOrEqualTo: String + lessThanOrEqualToInsensitive: String + like: String + likeInsensitive: String + notDistinctFrom: String + notDistinctFromInsensitive: String + notEndsWith: String + notEndsWithInsensitive: String + notEqualTo: String + notIn: [String!] + notInInsensitive: [String!] + notIncludes: String + notIncludesInsensitive: String + notLike: String + notLikeInsensitive: String + notStartsWith: String + notStartsWithInsensitive: String + startsWith: String + startsWithInsensitive: String } input UpdateCategoriesInput { - clientMutationId: String - ids: [Int!]! - patch: UpdateCategoryPatchInput! + clientMutationId: String + ids: [Int!]! + patch: UpdateCategoryPatchInput! } input UpdateCategoryInput { - clientMutationId: String - id: Int! - patch: UpdateCategoryPatchInput! + clientMutationId: String + id: Int! + patch: UpdateCategoryPatchInput! } input UpdateCategoryMangaInput { - categories: [Int!]! - clientMutationId: String + categories: [Int!]! + clientMutationId: String } input UpdateCategoryOrderInput { - clientMutationId: String - id: Int! - position: Int! + clientMutationId: String + id: Int! + position: Int! } input UpdateCategoryPatchInput { - default: Boolean - includeInUpdate: IncludeInUpdate - name: String + default: Boolean + includeInUpdate: IncludeInUpdate + name: String } input UpdateChapterInput { - clientMutationId: String - id: Int! - patch: UpdateChapterPatchInput! + clientMutationId: String + id: Int! + patch: UpdateChapterPatchInput! } input UpdateChapterPatchInput { - isBookmarked: Boolean - isRead: Boolean - lastPageRead: Int + isBookmarked: Boolean + isRead: Boolean + lastPageRead: Int } input UpdateChaptersInput { - clientMutationId: String - ids: [Int!]! - patch: UpdateChapterPatchInput! + clientMutationId: String + ids: [Int!]! + patch: UpdateChapterPatchInput! } input UpdateExtensionInput { - clientMutationId: String - id: String! - patch: UpdateExtensionPatchInput! + clientMutationId: String + id: String! + patch: UpdateExtensionPatchInput! } input UpdateExtensionPatchInput { - install: Boolean - uninstall: Boolean - update: Boolean + install: Boolean + uninstall: Boolean + update: Boolean } input UpdateExtensionsInput { - clientMutationId: String - ids: [String!]! - patch: UpdateExtensionPatchInput! + clientMutationId: String + ids: [String!]! + patch: UpdateExtensionPatchInput! } input UpdateLibraryMangaInput { - clientMutationId: String + clientMutationId: String } input UpdateMangaCategoriesInput { - clientMutationId: String - id: Int! - patch: UpdateMangaCategoriesPatchInput! + clientMutationId: String + id: Int! + patch: UpdateMangaCategoriesPatchInput! } input UpdateMangaCategoriesPatchInput { - addToCategories: [Int!] - clearCategories: Boolean - removeFromCategories: [Int!] + addToCategories: [Int!] + clearCategories: Boolean + removeFromCategories: [Int!] } input UpdateMangaInput { - clientMutationId: String - id: Int! - patch: UpdateMangaPatchInput! + clientMutationId: String + id: Int! + patch: UpdateMangaPatchInput! } input UpdateMangaPatchInput { - inLibrary: Boolean + inLibrary: Boolean } input UpdateMangasCategoriesInput { - clientMutationId: String - ids: [Int!]! - patch: UpdateMangaCategoriesPatchInput! + clientMutationId: String + ids: [Int!]! + patch: UpdateMangaCategoriesPatchInput! } input UpdateMangasInput { - clientMutationId: String - ids: [Int!]! - patch: UpdateMangaPatchInput! + clientMutationId: String + ids: [Int!]! + patch: UpdateMangaPatchInput! } input UpdateSourcePreferenceInput { - change: SourcePreferenceChangeInput! - clientMutationId: String - source: LongString! + change: SourcePreferenceChangeInput! + clientMutationId: String + source: LongString! } input UpdateStopInput { - clientMutationId: String + clientMutationId: String } input ValidateBackupInput { - backup: Upload! + backup: Upload! } input WebUIUpdateInput { - clientMutationId: String + clientMutationId: String } "Exposes a URL that specifies the behaviour of this scalar." directive @specifiedBy( - "The URL that specifies the behaviour of this scalar." - url: String! -) on SCALAR + "The URL that specifies the behaviour of this scalar." + url: String! + ) on SCALAR + diff --git a/src/app.d.ts b/src/app.d.ts index 133335b2..d2595c49 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,3 +1,9 @@ +// Copyright (c) 2023 Contributors to the Suwayomi project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + // See https://kit.svelte.dev/docs/types#app // for information about these interfaces // and what to do when importing types diff --git a/src/app.html b/src/app.html index 2f0e07e5..1c4f2bf9 100644 --- a/src/app.html +++ b/src/app.html @@ -1,3 +1,11 @@ + + diff --git a/src/app.postcss b/src/app.postcss index 5927371a..d8dd7f34 100644 --- a/src/app.postcss +++ b/src/app.postcss @@ -1,3 +1,11 @@ +/** + * Copyright (c) 2023 Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + @tailwind base; @tailwind components; @tailwind utilities; diff --git a/src/gql/Fragments.gql b/src/gql/Fragments.gql index 54276cbd..0fc2171f 100644 --- a/src/gql/Fragments.gql +++ b/src/gql/Fragments.gql @@ -1,3 +1,12 @@ +# // Copyright (c) 2023 Contributors to the Suwayomi project +# // +# // This Source Code Form is subject to the terms of the Mozilla Public +# // License, v. 2.0. If a copy of the MPL was not distributed with this +# // file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# // This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# // For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + fragment ChapterTypeFragment on ChapterType { isBookmarked isDownloaded diff --git a/src/gql/Mutations.gql b/src/gql/Mutations.gql index db8fcfad..275efe6a 100644 --- a/src/gql/Mutations.gql +++ b/src/gql/Mutations.gql @@ -1,3 +1,12 @@ +# // Copyright (c) 2023 Contributors to the Suwayomi project +# // +# // This Source Code Form is subject to the terms of the Mozilla Public +# // License, v. 2.0. If a copy of the MPL was not distributed with this +# // file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# // This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# // For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + mutation fetchExtensions { fetchExtensions(input: {}) { extensions { diff --git a/src/gql/Queries.gql b/src/gql/Queries.gql index e97dd571..cc851afe 100644 --- a/src/gql/Queries.gql +++ b/src/gql/Queries.gql @@ -1,3 +1,12 @@ +# // Copyright (c) 2023 Contributors to the Suwayomi project +# // +# // This Source Code Form is subject to the terms of the Mozilla Public +# // License, v. 2.0. If a copy of the MPL was not distributed with this +# // file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# // This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# // For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + query categories($notEqualTo: Int = null) { categories(filter: { id: { notEqualTo: $notEqualTo } }) { nodes { @@ -342,7 +351,7 @@ query ConditionalChaptersOfGivenManga( } query about { - about { + aboutServer { buildTime buildType discord diff --git a/src/gql/Subscriptions.gql b/src/gql/Subscriptions.gql index 8026abcc..6f33d391 100644 --- a/src/gql/Subscriptions.gql +++ b/src/gql/Subscriptions.gql @@ -1,3 +1,12 @@ +# // Copyright (c) 2023 Contributors to the Suwayomi project +# // +# // This Source Code Form is subject to the terms of the Mozilla Public +# // License, v. 2.0. If a copy of the MPL was not distributed with this +# // file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# // This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# // For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + subscription downloadChanged { downloadChanged { queue { diff --git a/src/lib/MountTitleAction.ts b/src/lib/MountTitleAction.ts index 55722b68..e0d9442e 100644 --- a/src/lib/MountTitleAction.ts +++ b/src/lib/MountTitleAction.ts @@ -1,3 +1,9 @@ +// Copyright (c) 2023 Contributors to the Suwayomi project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + import { afterUpdate, onDestroy } from 'svelte'; import { action as actionStore, title as titleStore, type ComponentWritable } from './simpleStores'; diff --git a/src/lib/apollo.ts b/src/lib/apollo.ts index 8588df61..9267215c 100644 --- a/src/lib/apollo.ts +++ b/src/lib/apollo.ts @@ -1,8 +1,9 @@ -/* - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - */ +// Copyright (c) 2023 Contributors to the Suwayomi project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + import { ApolloClient, InMemoryCache, split, type ApolloLink } from '@apollo/client/core'; import { createUploadLink } from 'apollo-upload-client'; import { GraphQLWsLink } from '@apollo/client/link/subscriptions'; diff --git a/src/lib/components/IconButton.svelte b/src/lib/components/IconButton.svelte index 2058caef..eb4c560c 100644 --- a/src/lib/components/IconButton.svelte +++ b/src/lib/components/IconButton.svelte @@ -1,3 +1,11 @@ + + @@ -134,16 +136,13 @@ {JSON.stringify($extensions.error)} {:else if groupExtensions}
- {#each groupExtensions as Langset} - {#if Langset[1].length} -

- {ISOLanguages.find((ele) => ele.code.toLowerCase() === Langset[0].toLowerCase()) - ?.nativeName ?? Langset[0]} -

- {#each Langset[1] as ext (ext.pkgName)} - - {/each} - {/if} + {#each groupExtensions as [lang, sause]} +

+ {FindLangName(lang)} +

+ {#each sause as ext (ext.pkgName)} + + {/each} {/each}
{/if} diff --git a/src/routes/(app)/browse/extensions/ExtensionCard.svelte b/src/routes/(app)/browse/extensions/ExtensionCard.svelte index 497a5425..9b6b88d8 100644 --- a/src/routes/(app)/browse/extensions/ExtensionCard.svelte +++ b/src/routes/(app)/browse/extensions/ExtensionCard.svelte @@ -1,3 +1,11 @@ + + @@ -76,10 +85,9 @@ {/each} {:else if groupSources} - {#each groupSources.filter((ele) => ele[1].length) as [Lang, sous]} + {#each groupSources as [lang, sous]}
- {ISOLanguages.find((ele) => ele.code.toLowerCase() === Lang.toLowerCase())?.nativeName ?? - Lang} + {FindLangName(lang)}
+