* WebP Covers + Series Detail Enhancements (#1652) * Implemented save covers as webp. Reworked screen to provide more information up front about webp and what browsers can support it. * cleaned up pages to use compact numbering and made compact numbering expand into one decimal place (20.5K) * Fixed an issue with adding new device * If a book has an invalid language set, drop the language altogether rather than reading in a corrupted entry. * Ensure genres and tags render alphabetically. Improved support for partial volumes in Comic parser. * Ensure all people, tags, collections, and genres are in alphabetical order. * Moved some code to Extensions to clean up code. * More unit tests * Cleaned up release year filter css * Tweaked some code in all series to make bulk deletes cleaner on the UI. * Trying out want to read and unread count on series detail page * Added Want to Read button for series page to make it easy to see when something is in want to read list and toggle it. Added tooltips instead of title to buttons, but they don't style correctly. Added a continue point under cover image. * Code smells * Bump versions by dotnet-bump-version. * Fixed Series Relations Schema (#1654) * Bump loader-utils from 2.0.2 to 2.0.3 in /UI/Web Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.3/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.2...v2.0.3) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Fixed is want to read coming back as a string and not working correctly. * Changed from to Continue to be more explicit * Added the first migration which exports data as a csv in temp/. This is the backup in case data is lost in the migration. * Note for later * Fixed the migration for the series relation so when deleting any series on any edge of the relationship, the SeriesRelation row deletes. * Change buttons back to titles on series detail page * Wrote the code to import relations from the backup. * Added an additional version check to avoid file io on migration. * Code cleanup Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * Fresh Nightly Installs Work (#1659) * Bump loader-utils from 2.0.3 to 2.0.4 in /UI/Web Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Removed a very old cgecj from Nov 2021 when data/appsettings was moved to config/ * Added some notes about migration * Removed a file that shouldn't have been there. Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * Library Settings Modal + New Library Settings (#1660) * Bump loader-utils from 2.0.3 to 2.0.4 in /UI/Web Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Fixed want to read button on series detail not performing the correct action * Started the library settings. Added ability to update a cover image for a library. Updated backup db to also copy reading list (and now library) cover images. * Integrated Edit Library into new settings (not tested) and hooked up a wizard-like flow for new library. * Fixed a missing update event in backend when updating a library. * Disable Save when form invalid. Do inline validation on Library name when user types to ensure the name is valid. * Trim library names before you check anything * General code cleanup * Implemented advanced settings for library (include in dashboard, search, recommended) and ability to turn off folder watching for individual libraries. Refactored some code to streamline perf in some flows. * Removed old components replaced with new modal * Code smells Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * UX Alignment and bugfixes (#1663) * Refactored the design of reading list page to follow more in line with list view. Added release date on the reading list items, if it's set in underlying chapter. Fixed a bug where reordering the list items could sometimes not update correctly with drag and drop. * Removed a bug marker that I just fixed * When generating library covers, make them much smaller as they are only ever icons. * Fixed library settings not showing the correct image. * Fixed a bug where duplicate collection tags could be created. Fixed a bug where collection tag normalized title was being set to uppercase. Redesigned the edit collection tag modal to align with new library settings and provide inline name checks. * Updated edit reading list modal to align with new library settings modal pattern. Refactored the backend to ensure it flows correctly without allowing duplicate names. Don't show Continue point on series detail if the whole series is read. * Added some more unit tests around continue point * Fixed a bug on series detail when bulk selecting between volume and chapters, the code which determines which chapters are selected didn't take into account mixed layout for Storyline tab. * Refactored to generate an OpenAPI spec at root of Kavita. This will be loaded by a new API site for easy hosting. Deprecated EnableSwaggerUi preference as after validation new system works, this will be removed and instances can use our hosting to hit their server (or run a debug build). * Test GA * Reverted GA and instead do it in the build step. This will just force developers to commit it in. * GA please work * Removed redundant steps from test since build already does it. * Try another GA * Moved all test actions into initial build step, which should drastically cut down on time. Only run sonar if the secret is present (so not for forks). Updated build requirements for develop and stable docker pushes. * Fixed env variable * Okay not possible to do secrets in if statement * Fixed the build step to output the openapi.json where it's expected. * Fixed GA (#1664) * Bump versions by dotnet-bump-version. * Applied new _components layout structure to Kavita. All except manga as there is an open PR that drastically changes that module. (#1666) * [Experimental] Split Renderers - Double & Double (Manga) fixes (#1667) * Updated swiper and some packages for reported security issues * Fixed reading lists promotion not working * Refactor RenameFileForCopy to use iterative recursion, rather than functional. * Ensured that bookmarks are fetched and ordered by Created date. * Fixed a bug where bookmarks were coming back in the correct order, but due to filenames, would not sort correctly. * Default installs to Debug log level given errors users have and Debug not being too noisy * Added jumpbar to bookmarks page * Now added jumpbar to bookmarks * Refactored some code into pipes and added some debug messaging for prefetcher * Try loading next and prev chapter's first/last page to cache so it renders faster * Updated GetImage to do a bound check on max page. Fixed a critical bug in how manga reader updates image elements src to prefetch/load pages. I was not creating a new reference which broke Angular's ability to update DOM on changes. * Refactored the image setting code to use a single method which tries to use a cached image always. * Refactored code to use getPage which favors cache and simplifies image creation code * Started the work to split the canvas renderer into it's own component * Refactored a lot of common methods into a service for the reader to support the upcoming renderer split * Moved components to nested folder. Refactored more code to streamline image sending to child renderer. Added notes across the code to help streamline flow of data and who owns what. * Swapped out SQLite for Memory, but the one from hangfire. Added DisableConcurrentExecution on ProcessChange to avoid duplication when multiple threads execute at once. * Basic split right to left is working with canvas renderer * Left to right and right to left now work * Fixed a bug where pagesplitoption wasn't being updated when modifying menu * Canvas rendering still has a bug with switching between right to left -> left to right on the re-render, it will choose a bad state. All else works fine with it. * Updated canvas renderer to implement the ImageRenderer interface * Canvas renderer is done * Setup single renderer. Need to figure out how to share CSS between renderers and also share some global stuff, like image height. * Refactored code so that image-container is within the renderers themselves. Still broken in scaling, but working towards a solution. * Added double click to shortcut menu * Moved image containers within the renderers * Pushing up for Robbie * nothing new * Move common css to a single scss file * More css consolidation * Fixed a npe in isWideImage * Refactored page updates to renderers to include max pages. Rewrote most of renderer into observables. * Moved bookmark for second page to double renderer * Started hooking in double renderer renderPage() * Fixed height scaling, but now canvas renderer is broken again * Fixed a bug with canvas renderer not moving to next page. Streamlined the code for getting page amounts from the dfferent renderers * Added double click to bookmark for canvas * Stashing the code and taking a break * Nothing much, buffer is still broken * Got double renderer to render at least one page * Double renderer now has access to 5 images at any time, so it can make appropriate decisions on when to render double pages. * Fixed up double rendererer moving backward page calc * Forward logic seems to be working * Cleaned up dead code after testing * Moved a few loggers in folder watching to trace * Everything seems to work fine, time to do double manga renderer * Moved some css around and added the reverse double component * Only execute renderer's pipes when in the correct mode * Still working on double renderer * Fixed scaling issues on double * Updating double logic - Fixed: Fixed an issue where a second page would render when current page was wide. * Hooked up double renderer * Made changes but not sure if im making progress * double manga fixes * Claned some of robbies code * Fixing last page bug * Library Settings Modal + New Library Settings (#1660) * Bump loader-utils from 2.0.3 to 2.0.4 in /UI/Web Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Fixed want to read button on series detail not performing the correct action * Started the library settings. Added ability to update a cover image for a library. Updated backup db to also copy reading list (and now library) cover images. * Integrated Edit Library into new settings (not tested) and hooked up a wizard-like flow for new library. * Fixed a missing update event in backend when updating a library. * Disable Save when form invalid. Do inline validation on Library name when user types to ensure the name is valid. * Trim library names before you check anything * General code cleanup * Implemented advanced settings for library (include in dashboard, search, recommended) and ability to turn off folder watching for individual libraries. Refactored some code to streamline perf in some flows. * Removed old components replaced with new modal * Code smells Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * UX Alignment and bugfixes (#1663) * Refactored the design of reading list page to follow more in line with list view. Added release date on the reading list items, if it's set in underlying chapter. Fixed a bug where reordering the list items could sometimes not update correctly with drag and drop. * Removed a bug marker that I just fixed * When generating library covers, make them much smaller as they are only ever icons. * Fixed library settings not showing the correct image. * Fixed a bug where duplicate collection tags could be created. Fixed a bug where collection tag normalized title was being set to uppercase. Redesigned the edit collection tag modal to align with new library settings and provide inline name checks. * Updated edit reading list modal to align with new library settings modal pattern. Refactored the backend to ensure it flows correctly without allowing duplicate names. Don't show Continue point on series detail if the whole series is read. * Added some more unit tests around continue point * Fixed a bug on series detail when bulk selecting between volume and chapters, the code which determines which chapters are selected didn't take into account mixed layout for Storyline tab. * Refactored to generate an OpenAPI spec at root of Kavita. This will be loaded by a new API site for easy hosting. Deprecated EnableSwaggerUi preference as after validation new system works, this will be removed and instances can use our hosting to hit their server (or run a debug build). * Test GA * Reverted GA and instead do it in the build step. This will just force developers to commit it in. * GA please work * Removed redundant steps from test since build already does it. * Try another GA * Moved all test actions into initial build step, which should drastically cut down on time. Only run sonar if the secret is present (so not for forks). Updated build requirements for develop and stable docker pushes. * Fixed env variable * Okay not possible to do secrets in if statement * Fixed the build step to output the openapi.json where it's expected. * Fixed GA (#1664) * Bump versions by dotnet-bump-version. * Applied new _components layout structure to Kavita. All except manga as there is an open PR that drastically changes that module. (#1666) * Fixed typeahead and updated manga reader to new layout structure * Fixed book reader fonts lookups * Fixed up some build issues * Fixed a bad import of css image * Some cleanup and rewrote how we log out data. * Renderer can be null on first load when performing some work. * Library Settings Modal + New Library Settings (#1660) * Bump loader-utils from 2.0.3 to 2.0.4 in /UI/Web Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Fixed want to read button on series detail not performing the correct action * Started the library settings. Added ability to update a cover image for a library. Updated backup db to also copy reading list (and now library) cover images. * Integrated Edit Library into new settings (not tested) and hooked up a wizard-like flow for new library. * Fixed a missing update event in backend when updating a library. * Disable Save when form invalid. Do inline validation on Library name when user types to ensure the name is valid. * Trim library names before you check anything * General code cleanup * Implemented advanced settings for library (include in dashboard, search, recommended) and ability to turn off folder watching for individual libraries. Refactored some code to streamline perf in some flows. * Removed old components replaced with new modal * Code smells Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * UX Alignment and bugfixes (#1663) * Refactored the design of reading list page to follow more in line with list view. Added release date on the reading list items, if it's set in underlying chapter. Fixed a bug where reordering the list items could sometimes not update correctly with drag and drop. * Removed a bug marker that I just fixed * When generating library covers, make them much smaller as they are only ever icons. * Fixed library settings not showing the correct image. * Fixed a bug where duplicate collection tags could be created. Fixed a bug where collection tag normalized title was being set to uppercase. Redesigned the edit collection tag modal to align with new library settings and provide inline name checks. * Updated edit reading list modal to align with new library settings modal pattern. Refactored the backend to ensure it flows correctly without allowing duplicate names. Don't show Continue point on series detail if the whole series is read. * Added some more unit tests around continue point * Fixed a bug on series detail when bulk selecting between volume and chapters, the code which determines which chapters are selected didn't take into account mixed layout for Storyline tab. * Refactored to generate an OpenAPI spec at root of Kavita. This will be loaded by a new API site for easy hosting. Deprecated EnableSwaggerUi preference as after validation new system works, this will be removed and instances can use our hosting to hit their server (or run a debug build). * Test GA * Reverted GA and instead do it in the build step. This will just force developers to commit it in. * GA please work * Removed redundant steps from test since build already does it. * Try another GA * Moved all test actions into initial build step, which should drastically cut down on time. Only run sonar if the secret is present (so not for forks). Updated build requirements for develop and stable docker pushes. * Fixed env variable * Okay not possible to do secrets in if statement * Fixed the build step to output the openapi.json where it's expected. * Applied new _components layout structure to Kavita. All except manga as there is an open PR that drastically changes that module. (#1666) * Post merge cleanup * Again moving the file Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * Basic Stats (#1673) * Refactored ResponseCache profiles into consts * Refactored code to use an extension method for getting user library ids. * Started server statistics, added a charting library, and added a table sort column (not finished) * Refactored code and have a fully working example of sortable headers. Still doesn't work with default sorting state, will work on that later. * Implemented file size, but it's too expensive, so commented out. * Added a migration to provide extension and length/size information in the DB to allow for faster stat apis. * Added the ability to force a library scan from library settings. * Refactored some apis to provide more of a file breakdown rather than just file size. * Working on visualization of file breakdown * Fixed the file breakdown visual * Fixed up 2 visualizations * Added back an api for member names, started work on top reads * Hooked up the other library types and username/days. * Preparing to remove top reads and refactor into Top users * Added LibraryId to AppUserProgress to help with complex lookups. * Added the new libraryId hook into some stats methods * Updated api methods to use libraryId for progress * More places where LibraryId is needed * Added some high level server stats * Got a ton done on server stats * Updated default theme (dark) to be the default root variables. This will allow user themes to override just what they want, rather than maintain their own css variables. * Implemented a monster query for top users by reading time. It's very slow and can be cleaned up likely. * Hooked up top reads. Code needs a big refactor. Handing off for Robbie treatment and I'll switch to User stats. * Implemented last 5 recently read series (broken) and added some basic css * Fixed recently read query * Cleanup the css a bit, Robbie we need you * More css love * Cleaned up DTOs that aren't needed anymore * Fixed top readers query * When calculating top readers, don't include read events where nothing is read (0 pages) * Hooked up the date into GetTopUsers * Hooked top readers up with days and refactored and cleaned up componets not used * Fixed up query * Started on a day by day breakdown, but going to take a break from stats. * Added a temp task to run some migration manually for stats to work * Ensure OPDS-PS uses new libraryId for progress reporting * Fixed a code smell * Adding some styling * adding more styles * Removed some debug stuff from user stats * Bump qs from 6.5.2 to 6.5.3 in /UI/Web Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3) --- updated-dependencies: - dependency-name: qs dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Tweaked some code for bad data cases * Refactored a chapter lookup to remove un-needed Volume join in 5 places across the code. * API push Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * Hooked up the API layer to be able to extract images from PDF again for Tachiyomi explicitly (#1686) * Bump versions by dotnet-bump-version. * OPDS Enhancements (#1687) * Bump express from 4.17.2 to 4.18.2 in /UI/Web Bumps [express](https://github.com/expressjs/express) from 4.17.2 to 4.18.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.17.2...4.18.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Bump decode-uri-component from 0.2.0 to 0.2.2 in /UI/Web Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Bump qs and express in /UI/Web Bumps [qs](https://github.com/ljharb/qs) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together. Updates `qs` from 6.5.3 to 6.11.0 - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.3...v6.11.0) Updates `express` from 4.17.2 to 4.18.2 - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.17.2...4.18.2) --- updated-dependencies: - dependency-name: qs dependency-type: indirect - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Added genre and authors to Series level, added summary to volume and chapter level. Force order on reading list title as Chunky enforces their own sort order and doesn't respect the spec. * Moved all the reading list formatting logic to the backend. This allows us to re-use the UI logic for OPDS streams. * Fixed a broken unit test * Code smells Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * Epub Table of Generation fixes for Sigil (#1689) * Fixed generating table of contents where key lookup could fail with how Sigil packs the epubs. * Tweaked Kavita's fallback ToC generation (when one doesn't exist in the epub) to also use CoalesceKey. * Code smells * Bump versions by dotnet-bump-version. * File Dimension API (#1690) * Implemented an api for getting file dimensions for a given chapter. This is for CDisplayEx integration. This might be usable in Double Renderer. * Added the cached filename for new API * Bump versions by dotnet-bump-version. * Send Non books to your Devices (#1691) * Only restrict non-epub/pdf for Kindle devices on Send To. * Removed restriction to email non-epub/pdfs to devices. * Bump versions by dotnet-bump-version. * Misc UI Tweaks (#1692) * Added a timeAgo pipe which shows live updates for a few areas. * Fixed some wording on stats page. Changed Total People count to just work on distinct names and not count multiple for different roles. * Tweaked the compact number so it only shows one decimal * Fixed a bug * Bump versions by dotnet-bump-version. * Reader Refactor Part 2 (#1694) * Updated swiper and some packages for reported security issues * Fixed reading lists promotion not working * Refactor RenameFileForCopy to use iterative recursion, rather than functional. * Ensured that bookmarks are fetched and ordered by Created date. * Fixed a bug where bookmarks were coming back in the correct order, but due to filenames, would not sort correctly. * Default installs to Debug log level given errors users have and Debug not being too noisy * Added jumpbar to bookmarks page * Now added jumpbar to bookmarks * Refactored some code into pipes and added some debug messaging for prefetcher * Try loading next and prev chapter's first/last page to cache so it renders faster * Updated GetImage to do a bound check on max page. Fixed a critical bug in how manga reader updates image elements src to prefetch/load pages. I was not creating a new reference which broke Angular's ability to update DOM on changes. * Refactored the image setting code to use a single method which tries to use a cached image always. * Refactored code to use getPage which favors cache and simplifies image creation code * Started the work to split the canvas renderer into it's own component * Refactored a lot of common methods into a service for the reader to support the upcoming renderer split * Moved components to nested folder. Refactored more code to streamline image sending to child renderer. Added notes across the code to help streamline flow of data and who owns what. * Swapped out SQLite for Memory, but the one from hangfire. Added DisableConcurrentExecution on ProcessChange to avoid duplication when multiple threads execute at once. * Basic split right to left is working with canvas renderer * Left to right and right to left now work * Fixed a bug where pagesplitoption wasn't being updated when modifying menu * Canvas rendering still has a bug with switching between right to left -> left to right on the re-render, it will choose a bad state. All else works fine with it. * Updated canvas renderer to implement the ImageRenderer interface * Canvas renderer is done * Setup single renderer. Need to figure out how to share CSS between renderers and also share some global stuff, like image height. * Refactored code so that image-container is within the renderers themselves. Still broken in scaling, but working towards a solution. * Added double click to shortcut menu * Moved image containers within the renderers * Pushing up for Robbie * nothing new * Move common css to a single scss file * More css consolidation * Fixed a npe in isWideImage * Refactored page updates to renderers to include max pages. Rewrote most of renderer into observables. * Moved bookmark for second page to double renderer * Started hooking in double renderer renderPage() * Fixed height scaling, but now canvas renderer is broken again * Fixed a bug with canvas renderer not moving to next page. Streamlined the code for getting page amounts from the dfferent renderers * Added double click to bookmark for canvas * Stashing the code and taking a break * Nothing much, buffer is still broken * Got double renderer to render at least one page * Double renderer now has access to 5 images at any time, so it can make appropriate decisions on when to render double pages. * Fixed up double rendererer moving backward page calc * Forward logic seems to be working * Cleaned up dead code after testing * Moved a few loggers in folder watching to trace * Everything seems to work fine, time to do double manga renderer * Moved some css around and added the reverse double component * Only execute renderer's pipes when in the correct mode * Still working on double renderer * Fixed scaling issues on double * Updating double logic - Fixed: Fixed an issue where a second page would render when current page was wide. * Hooked up double renderer * Made changes but not sure if im making progress * double manga fixes * Claned some of robbies code * Fixing last page bug * Library Settings Modal + New Library Settings (#1660) * Bump loader-utils from 2.0.3 to 2.0.4 in /UI/Web Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Fixed want to read button on series detail not performing the correct action * Started the library settings. Added ability to update a cover image for a library. Updated backup db to also copy reading list (and now library) cover images. * Integrated Edit Library into new settings (not tested) and hooked up a wizard-like flow for new library. * Fixed a missing update event in backend when updating a library. * Disable Save when form invalid. Do inline validation on Library name when user types to ensure the name is valid. * Trim library names before you check anything * General code cleanup * Implemented advanced settings for library (include in dashboard, search, recommended) and ability to turn off folder watching for individual libraries. Refactored some code to streamline perf in some flows. * Removed old components replaced with new modal * Code smells Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * UX Alignment and bugfixes (#1663) * Refactored the design of reading list page to follow more in line with list view. Added release date on the reading list items, if it's set in underlying chapter. Fixed a bug where reordering the list items could sometimes not update correctly with drag and drop. * Removed a bug marker that I just fixed * When generating library covers, make them much smaller as they are only ever icons. * Fixed library settings not showing the correct image. * Fixed a bug where duplicate collection tags could be created. Fixed a bug where collection tag normalized title was being set to uppercase. Redesigned the edit collection tag modal to align with new library settings and provide inline name checks. * Updated edit reading list modal to align with new library settings modal pattern. Refactored the backend to ensure it flows correctly without allowing duplicate names. Don't show Continue point on series detail if the whole series is read. * Added some more unit tests around continue point * Fixed a bug on series detail when bulk selecting between volume and chapters, the code which determines which chapters are selected didn't take into account mixed layout for Storyline tab. * Refactored to generate an OpenAPI spec at root of Kavita. This will be loaded by a new API site for easy hosting. Deprecated EnableSwaggerUi preference as after validation new system works, this will be removed and instances can use our hosting to hit their server (or run a debug build). * Test GA * Reverted GA and instead do it in the build step. This will just force developers to commit it in. * GA please work * Removed redundant steps from test since build already does it. * Try another GA * Moved all test actions into initial build step, which should drastically cut down on time. Only run sonar if the secret is present (so not for forks). Updated build requirements for develop and stable docker pushes. * Fixed env variable * Okay not possible to do secrets in if statement * Fixed the build step to output the openapi.json where it's expected. * Fixed GA (#1664) * Bump versions by dotnet-bump-version. * Applied new _components layout structure to Kavita. All except manga as there is an open PR that drastically changes that module. (#1666) * Fixed typeahead and updated manga reader to new layout structure * Fixed book reader fonts lookups * Fixed up some build issues * Fixed a bad import of css image * Some cleanup and rewrote how we log out data. * Renderer can be null on first load when performing some work. * Library Settings Modal + New Library Settings (#1660) * Bump loader-utils from 2.0.3 to 2.0.4 in /UI/Web Bumps [loader-utils](https://github.com/webpack/loader-utils) from 2.0.3 to 2.0.4. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v2.0.4/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v2.0.3...v2.0.4) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Fixed want to read button on series detail not performing the correct action * Started the library settings. Added ability to update a cover image for a library. Updated backup db to also copy reading list (and now library) cover images. * Integrated Edit Library into new settings (not tested) and hooked up a wizard-like flow for new library. * Fixed a missing update event in backend when updating a library. * Disable Save when form invalid. Do inline validation on Library name when user types to ensure the name is valid. * Trim library names before you check anything * General code cleanup * Implemented advanced settings for library (include in dashboard, search, recommended) and ability to turn off folder watching for individual libraries. Refactored some code to streamline perf in some flows. * Removed old components replaced with new modal * Code smells Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * UX Alignment and bugfixes (#1663) * Refactored the design of reading list page to follow more in line with list view. Added release date on the reading list items, if it's set in underlying chapter. Fixed a bug where reordering the list items could sometimes not update correctly with drag and drop. * Removed a bug marker that I just fixed * When generating library covers, make them much smaller as they are only ever icons. * Fixed library settings not showing the correct image. * Fixed a bug where duplicate collection tags could be created. Fixed a bug where collection tag normalized title was being set to uppercase. Redesigned the edit collection tag modal to align with new library settings and provide inline name checks. * Updated edit reading list modal to align with new library settings modal pattern. Refactored the backend to ensure it flows correctly without allowing duplicate names. Don't show Continue point on series detail if the whole series is read. * Added some more unit tests around continue point * Fixed a bug on series detail when bulk selecting between volume and chapters, the code which determines which chapters are selected didn't take into account mixed layout for Storyline tab. * Refactored to generate an OpenAPI spec at root of Kavita. This will be loaded by a new API site for easy hosting. Deprecated EnableSwaggerUi preference as after validation new system works, this will be removed and instances can use our hosting to hit their server (or run a debug build). * Test GA * Reverted GA and instead do it in the build step. This will just force developers to commit it in. * GA please work * Removed redundant steps from test since build already does it. * Try another GA * Moved all test actions into initial build step, which should drastically cut down on time. Only run sonar if the secret is present (so not for forks). Updated build requirements for develop and stable docker pushes. * Fixed env variable * Okay not possible to do secrets in if statement * Fixed the build step to output the openapi.json where it's expected. * Applied new _components layout structure to Kavita. All except manga as there is an open PR that drastically changes that module. (#1666) * Post merge cleanup * Again moving the file * Fixed an issue with switching to double renderer and the image not loading for cover image. * Fixed double manga last page repeating twice * Added ability to quickly save a few settings to user preferences from manga reader * Fixed up some success messaging * Single image and canvas could stack, last page on double wouldn't render. * Stashing code, want to work on something else * Suppress a concurrency issue when opening a fresh chapter to read. * Refactored a function into a pipe * Took care of one TODO * Tightened up the logic around single renderer handling fit to screen images. * Added some code to see how long api takes on average. * First pass integration of page dimensions into single renderer and base code * Canvas renderer pass for new page dimensions * On time left, don't use the word left again * Moved the page dimension code into manga service to make it seemless * Hooked in a replacement for image based isWide * Canvas renderer is working again * Double renderer now follows how Komga does it to keep it simple. * Double renderer is working really well so far. * don't use nbsp * Added response caching to file-dimensions and chapter info api * Allow chapter info to send back file dimensions optionally * Fixed an issue with dimensions api locking files on Windows * Refactored all code to use isWidePage * More fixes and cleanup * More double reverse logic * Recently Read stats page will allow you to click the items. Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * More Reader Fixes (#1696) * Fixed resizing or layout changes causing page change on double reader * Implemented the debug log pattern on double renderers. Fixed a case when navigation backwards and showing only one page. Updated so go to page or slider update will handle selecting the right page number for pair display. * All Spread cases for double working * Cleanup dead code * Ensure we can jump to last page * Bump versions by dotnet-bump-version. * Reading History (#1699) * Added new stat graph for pages read over time for all users. * Switched to reading events rather than pages read to get a better scale * Changed query to use Created date as LastModified wont work since I just did a migration on all rows. * Small cleanup on graph * Read by day completed and ready for user stats page. * Changed the initial stat report to be in 1 day, to avoid people trying and ditching the software from muddying up the stats. * Cleaned up stats page such that stats around series show their image and tweaked some layout and wordings * Fixed recently read order * Put read history on user profile * Final cleanup, Robbie needs to do a CSS pass before release. * Bump versions by dotnet-bump-version. * Performance Improvements and Some Polish (#1702) * Auto scale reading timeline * Added benchmarks for SharpImage and NetVips. When an epub has a malformed page, catch the error and present it better to the user. * Added a hint for an upcoming feature * Slightly sped up word count for epubs * Added one more test to reflect actual code. * Some light cleanup * Use compact number for stat lists * Fixed brightness being broken on manga reader * Replaced CoverToWebP SharpImage version with NetVips which is MUCH lighter on memory and CPU. * Added last modified on the progress dto for CdDisplayEx. * Code cleanup * Forgot one cleanup * Bump versions by dotnet-bump-version. * Holiday Changes (#1706) * Fixed a bug on bookmark mode not finding correct image for prefetcher. * Fixed up the edit series relationship modal on tablet viewports. * On double page mode, only bookmark 1 page if only 1 pages is renderered on screen. * Added percentage read of a given library and average hours read per week to user stats. * Fixed a bug in the reader with paging in bookmark mode * Added a "This Week" option to top readers history * Added date ranges for reading time. Added dates that don't have anything, but might remove. * On phone, when applying a metadata filter, when clicking apply, collapse the filter automatically. * Disable jump bar and the resuming from last spot when a custom sort is applied. * Ensure all Regex.Replace or Matches have timeouts set * Bump versions by dotnet-bump-version. * First PR of the new year (#1717) * Fixed a bug on bookmark mode not finding correct image for prefetcher. * Fixed up the edit series relationship modal on tablet viewports. * On double page mode, only bookmark 1 page if only 1 pages is renderered on screen. * Added percentage read of a given library and average hours read per week to user stats. * Fixed a bug in the reader with paging in bookmark mode * Added a "This Week" option to top readers history * Added date ranges for reading time. Added dates that don't have anything, but might remove. * On phone, when applying a metadata filter, when clicking apply, collapse the filter automatically. * Disable jump bar and the resuming from last spot when a custom sort is applied. * Ensure all Regex.Replace or Matches have timeouts set * Fixed a long standing bug where fit to height on tablets wouldn't center the image * Streamlined url parsing to be more reliable * Reduced an additional db query in chapter info. * Added a missing task to convert covers to webP and added messaging to help the user understand to run it after modifying the setting. * Changed OPDS to be enabled by default for new installs. This should reduce issues with users being confused about it before it's enabled. * When there are multiple files for a chapter, show a count card on the series detail to help user understand duplicates exist. Made the unread badge smaller to avoid collision. * Added Word Count to user stats and wired up average reading per week. * Fixed word count failing on some epubs * Removed some debug code * Don't give more information than is necessary about file paths for page dimensions. * Fixed a bug where pagination area would be too small when the book's content was less that height on default mode. * Updated Default layout mode to Scroll for books. * Added bytes in the UI and at an API layer for CDisplayEx * Don't log health checks to logs at all. * Changed Word Count to Length to match the way pages work * Made reading time more clear when min hours is 0 * Apply more aggressive coalescing when remapping bad metadata keys for epubs. * Changed the amount of padding between icon and text for side nav item. * Fixed a NPE on book reader (harmless) * Fixed an ordering issue where Volume 1 was a single file but also tagged as Chapter 1 and Volume 2 was Chapter 0. Thus Volume 2 was being selected for continue point when Volume 1 should have been. * When clicking on an activity stream header from dashboard, show the title on the resulting page. * Removed a property that can't be animated * Fixed a typeahead typescript issue * Added Size into Series Info and Added some tooltip and spacing changes to better explain some fields. * Added size for volume drawers and cleaned up some date edge case handling * Fixed an annoying bug where when on mobile opening a view with a metadata filter, Kavita would open the filter automatically. * Bump versions by dotnet-bump-version. * Quick fix for Double Renderer (#1719) * Disable emulate comic book when on single page reader * Fixed a regression where double page renderer wouldn't layout the images correctly * Bump versions by dotnet-bump-version. * Feature/stats finishoff (#1720) * Added ability to click on genres, tags, and people to view all items in a modal. * Made it so we can click and open a filtered search from generic list * Fixed broken epub pagination area due to a typo in a query selector * Added day breakdown, wrapping up stats * Bump versions by dotnet-bump-version. * Docker nonroot (#1650) * Added PUID, PGID and KAVITAUSER variable support in entrypoint.sh * Update the setting of ownership to avoid changing library files * Default to run as root, using user kavita if alternate UID/GID are provided * Only chown config folder and only if needed * Revert chmod on Kavita Co-authored-by: Muggz <mug@passw0rd.org> * Bump versions by dotnet-bump-version. * Manga Reader Work (#1729) * Instead of augmenting prefetcher to move across chapter bounds, let's try to instead just load 5 images (which the browser will cache) from next/prev so when it loads, it's much faster. * Trialing loading next/prev chapters 5 pages to have better next page loading experience. * Tweaked GetChapterInfo API to actually apply conditional includeDimensions parameter. * added a basic language file for upcoming work * Moved the bottom menu up a bit for iOS devices with handlebars. * Fixed fit to width on phones still having a horizontal scrollbar * Fixed a bug where there is extra space under the image when fit to width and on a phone due to pagination going to far. * Changed which variable we use for right pagination calculation * Fixing fit to height - Fixing height calc to account for horizontal scroll bar height. * Added a comment for the height scrollbar fix * Adding screenfull package # Added: - Added screenfull package to handle cross-platform browser fullscreen code # Removed: - Removed custom fullscreen code * Fixed a bug where switching from webtoon reader to other layout modes wouldn't render anything. Webtoon continuous scroll down is now broken. * Fixed it back to how it was and all is good. Need to call detectChanges explicitly. * Removed an additional undeeded save progress call on loadPage * Laid out the test case to move the page snapping to the backend with full unit tests. Current code is broken just like UI layer. * Refactored the snap points into the backend and ensure that it works correctly. * Fixed a broken unit test * Filter out spammy hubs/messages calls in the logs * Swallow all noisy messages that are from RequestLoggingMiddleware when the log level is on Information or above. * Added a common loading component to the app. Have yet to refactor all screens to use this. * Bump json5 from 2.2.0 to 2.2.3 in /UI/Web Bumps [json5](https://github.com/json5/json5) from 2.2.0 to 2.2.3. - [Release notes](https://github.com/json5/json5/releases) - [Changelog](https://github.com/json5/json5/blob/main/CHANGELOG.md) - [Commits](https://github.com/json5/json5/compare/v2.2.0...v2.2.3) --- updated-dependencies: - dependency-name: json5 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> * Alrigned all the loading messages and styles throughout the app * Webtoon reader will use max width of all images to ensure images align well. * On Original scaling mode, users can use the keyboard to scroll around the images without pagination kicking off. * Removed console logs * Fixed a public vs private issue * Fixed an issue around some cached files getting locked due to NetVips holding them during file size calculations. Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump versions by dotnet-bump-version. * [Manga Reader] Swipe Support (#1735) * Fixed a loading indicator that is always on * Started to add swipe directive * Implemented the ability to swipe to navigate pages in manga reader. * Swipe to paginate seems to be working reliably * Removed a bunch of junk from csproj and added a debug menu for testing on phone to smooth out experience. * Fixed a bug where reading list detail wouldn't render the set image of the reading list. * Added some instructions and code to allow connecting to dev instance easier. * Fixed up paging with keyboard where to ensure that when we hit the end of the scroll, we don't go to the next page instantly, but rather make the user press the key once more. * Fixed reading list image not properly renderering on reading list detail page. * Solved the swiping bug, need to play with threshold again. * Swipe is now working. Need to decide if I'm going to support reversing the direction with reading direction. * Hooked up swipe with reading direction code * Cleaned up some direction code to align to a new enum * Feature complete * Bump versions by dotnet-bump-version. * Fix pagination in Manga reader from last PR (#1736) * Added a new Double (No Cover) rendering mode which always has first 2 pages together unless wide. * Removed layout mode for build * Bump versions by dotnet-bump-version. * Better Themes, Stats, and bugfixes (#1740) * Fixed a bug where when clicking on a series rating for first time, the rating wasn't populating in the modal. * Fixed a bug on Scroll mode with immersive mode, the bottom bar could clip with the book body. * Cleanup some uses of var * Refactored text as json into a type so I don't have to copy/paste everywhere * Theme styles now override the defaults and theme owners no longer need to maintain all the variables themselves. Themes can now override the color of the header on mobile devices via --theme-color and Kavita will now update both theme color as well as color scheme. * Fixed a bug where last active on user stats wasn't for the particular user. * Added a more accurate word count calculation and the ability to see the word counts year over year. * Added a new table for long term statistics, like number of files over the years. No views are present for this data, I will add them later. * Bump versions by dotnet-bump-version. * Swipe Issues (#1745) * Updated theme support to be able to customize the tile color dynamically from a theme via --tile-color. In addition, --theme-color will update apple-mobile-web-app-status-bar-style as well as the non-apple variants * Removed --manga-reader-bg-color as it wasn't used anywhere. Fixed double pagination on swipe. * Cleaned up some dead threshold code for swipe. * Started refactoring tests to use an abstract test class. Stopping because I should do on the .net 7 branch to avoid large merge conflicts. Tests need to be re-designed so they can run in parallel. * Fixed a bug in reading lists where when deleting an item, order could be miscalculated. * Started adding new information for stat service. Refactored time spent reading to be more accurate by taking average time against how much of the chapter the user has read. * Hooked up total time reading at server stat level. Don't show fancy graphs on mobile. * Added new stats for v0.7 * Added a test for Clearing want to read * Fixed a few tests that weren't resetting state between runs * Fixed some broken unit tests * Ensure all Series queries sort by a case invariant string. * Added more aggressive caching of images. This will result in a min delay on pages after a cover is changed. * Fixed a bug where if during new word count calculation, new word count is zero, restoring the old count wasn't working. * Cleaned up some of the code for getting time estimates * Fixed a bug where triggering swipe right wasn't working when there was no scroll * Delete the temp folder for creating a download after a full zip is created. * Bump versions by dotnet-bump-version. * Stat hotfix (#1748) * Fixed a bug where a divide by 0 could occur * Email change now requires a password * Bump versions by dotnet-bump-version. * Holiday Bugfixes (#1762) * Don't show "not much going on" when we are actively downloading * Swipe to paginate is now behind a flag in the user preferences. * Added a new server setting for host name, if the server sits behind a reverse proxy. If this is set, email link generation will use it and will not perform any checks on accessibility (thus email will always send) * Refactored the code that checks if the server is accessible to check if host name is set, and thus return rue if so. * Added back the system drawing library for markdown parsing. * Fixed a validation error * Fixed a bug where folder watching could get re-triggered when it was disabled at a server level. * Made the manga reader loader absolute positioned for better visibility * Indentation * Bump versions by dotnet-bump-version. * Angular 15 (#1764) * Updated ngx-virtual-scroller * Removed the karma test config as it's breaking migration * Reverted to pre angular 15 * Upgraded packages and reverted target to ES6 for older devices * It's broken. Need to also find the safari version for old Ipads * Fixes some code in default pipe and many updates to packages. Removed support for old iOS versions as it restricted Kavita from using newer features. Build still broken. * More progress in getting build working on Angular 15. Removed polyfills.ts for new angular config * Remove all.css for icons and use scss instead * Removed stuff that isn't needed * Migrated extended linting to eslint, ran on project and updated issues. Removed a duplicate component that did nothing. Fixed a few places where lifecycle hooks werent being called as interface wasn't implemented. * App builds correctly. Source maps are still needed. * Fixed source maps and removed more testing stuff. I will re-add later in another release when I figure out how to properly tackle dependencies on backend. * Reverted back to old source map definition * Bump versions by dotnet-bump-version. * Angular 15 (#1765) * Refactored some code in BookService to make the code easier to understand * More lint fixes * Use npm ci for installs in pipeline * Fixed build system again by deleting nodejs. New build system uses package-lcok going forward. * Bump versions by dotnet-bump-version. * [skip ci] Misc stuff (#1766) * Refactored some code in BookService to make the code easier to understand * More lint fixes * Use npm ci for installs in pipeline * Fixed build system again by deleting nodejs. New build system uses package-lcok going forward. * Added a test case for Reading Time Estimation calculations * Some cleanup * Added even more testing to try and get scare's issue captured. * Automatic Collection Creation (#1768) * Made the unread badges slightly smaller and rounded on top right. * A bit more tweaks on the not read badges. Looking really nice now. * In order to start the work on managing collections from ScanLoop, I needed to refactor collection apis into the service layer and add unit tests. Removed ToUpper Normalization for new tags. * Hooked up ability to auto generate collections from SeriesGroup metadata tag. * Bump versions by dotnet-bump-version. * Auto Collection Bugfixes (#1769) * SeriesGroup tag can now have comma separated value to allow a series to be a part of multiple collections. * Added a missing unit test * Refactored how collection tags are created to work in the scan loop reliably. * Added a unit test for RemoveTagsWithoutSeries * Fixed a bug in reading list title generation to avoid Volume 0 if the underlying file had a title set. Fixed a misconfigured unit test. * Bump versions by dotnet-bump-version. * Scanner Performance Improvements (#1774) * Refactored the Genre code to be faster and used a dictonary to avoid some lookups. May fix the rare foreign constraint issue. * Refactored tag to the same implementation as Genre. Ensure when grabbing tags from ComicInfo, we normalize and throw out duplicates. * Removed an internal "external" field that was planned for Genres and Tags, but now with new plugin architecture, not needed. * Bump versions by dotnet-bump-version. * Spelling, grammar, and related consistency improvements (#1756) * Spelling, grammar, and word structure improvements * Email service text reworded to account for the Host Name feature * Bump versions by dotnet-bump-version. * Stat Polish (#1775) * SeriesGroup tag can now have comma separated value to allow a series to be a part of multiple collections. * Added a missing unit test * Refactored how collection tags are created to work in the scan loop reliably. * Added a unit test for RemoveTagsWithoutSeries * Fixed a bug in reading list title generation to avoid Volume 0 if the underlying file had a title set. Fixed a misconfigured unit test. * On User stats page, don't show the user selector on reading history, despite if youre an admin. Cleaned up how we show days with 0 reading events to be more clear. * Refactored the name of a component to reflect what it does * Removed plugin not using * Fix an issue where coalescing a key in epub might have multiple html files ending with the key. In this case, let's take the first. * Added PikaPods to the Readme * Tried to fix layout shift for charts, but need Robbie's help * Chart styling # Added: - Added: Added styling to force charts into their respective containers. # Removed: - Removed: Removed code blocking charts from being visible on mobile. * Merge conflict --------- Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> * Bump versions by dotnet-bump-version. * UTC Dates + CDisplayEx API Enhancements (#1781) * Introduced a new claim on the Token to get UserId as well as Username, thus allowing for many places of reduced DB calls. All users will need to reauthenticate. Introduced UTC Dates throughout the application, they are not exposed in all DTOs, that will come later when we fully switch over. For now, Utc dates will be updated along side timezone specific dates. Refactored get-progress/progress api to be 50% faster by reducing how much data is loaded from the query. * Speed up the following apis: collection/search, download/bookmarks, reader/bookmark-info, recommended/quick-reads, recommended/quick-catchup-reads, recommended/highly-rated, recommended/more-in, recommended/rediscover, want-to-read/ * Added a migration to sync all dates with their new UTC counterpart. * Added LastReadingProgressUtc onto ChapterDto for some browsing apis, but not all. Added LastReadingProgressUtc to reading list items. Refactored the migration to run raw SQL which is much faster. * Added LastReadingProgressUtc onto ChapterDto for some browsing apis, but not all. Added LastReadingProgressUtc to reading list items. Refactored the migration to run raw SQL which is much faster. * Fixed the unit tests * Fixed an issue with auto mapper which was causing progress page number to not get sent to UI * series/volume has chapter last reading progress * Added filesize and library name on reading list item dto for CDisplayEx. * Some minor code cleanup * Forgot to fill a field * Bump versions by dotnet-bump-version. * Reading List Fixes (#1784) * Add ability to save readinglist comicinfo fields in Chapter. * Added the appropriate fields and migration for Reading List generation. * Started the reading list code * Started building out the CBL import code with some initial unit tests. * Fixed first unit test * Started refactoring control code into services and writing unit tests for ReadingLists. Found a logic issue around reading list title between create/update. Will be corrected in this branch with unit tests. * Can't figure out how to mock UserManager, so had to uncomment a few tests. * Tooltip for total pages read shows the full number * Tweaked the math a bit for average reading per week. * Fixed up the reading list unit tests. Fixed an issue where when inserting chapters into a blank reading list, the initial reading list item would have an order of 1 instead of 0. * Cleaned up the code to allow the reading list code to be localized easily and fixed up a bug in last PR. * Fixed a sorting issue on reading activity * Tweaked the code around reading list actionables not showing due to some weird filter. * Fixed edit library settings not opening on library detail page * Fixed a bug where reading activity dates would be out of order due to a bug in how charts works. A temp hack has been added. * Disable promotion in edit reading list modal since non-admins can (and should have) been able to use it. * Fixed a bug where non-admins couldn't update their OWN reading lists. Made uploading a cover image for readinglists now check against the user's reading list access to allow non-admin's to set images. * Fixed an issue introduced earlier in PR where adding chapters to reading list could cause order to get skewed. * Fixed another regression from earlier commit * Hooked in Import CBL flow. No functionality yet. * Code is a mess. Shifting how the whole import process is going to be done. Commiting so I can pivot drastically. * Very rough code for first step is done. * Ui has started, I've run out of steam for this feature. * Cleaned up the UI code a bit to make the step tracker nature easier without a dedicated component. * Much flow implementation and tweaking to how validation checks and what is sent back. * Removed import via cbl code as it's not done. Pushing to next release. * Bump versions by dotnet-bump-version. * Allow changing listening ip addresses (#1713) * Allow changing listening ip address * Use Json serialize for appsettings.config saving * BOM * IP Address validation * ip address reset * ValidIpAddress regex * Bump versions by dotnet-bump-version. * Release Testing Time (#1785) * Fixed a bug with getting continue point where there was a single volume unread and a later volume with chapters inside it, the chapters were being picked. * Fixed a bug where resuming from jump key wasn't working (develop) * Cleaned up the spacing * Bump versions by dotnet-bump-version. * Release Testing Bugs (#1790) * Stop showing loading indicator when no next/prev chapter * Fixed a bug where manage collections wasn't named correctly in UI. * Slight tweaks on email flow * Bump versions by dotnet-bump-version. * Release Testing Part 2 (#1794) * Stop showing loading indicator when no next/prev chapter * Fixed a bug where manage collections wasn't named correctly in UI. * Slight tweaks on email flow * Fixed a bug where we were grabbing wrong property for book layout mode * Fixed an issue where pagination area wasn't properly spanning window on different scaling modes. * Fixed a bug where right pagination area wasn't sticking to the right hand side on original scaling * Added a note from reading an epub3 * Reworked some of the readme * Bump versions by dotnet-bump-version. * Small Build Fix (#1795) * Stop showing loading indicator when no next/prev chapter * Fixed a bug where manage collections wasn't named correctly in UI. * Slight tweaks on email flow * Fixed a bug where we were grabbing wrong property for book layout mode * Fixed an issue where pagination area wasn't properly spanning window on different scaling modes. * Fixed a bug where right pagination area wasn't sticking to the right hand side on original scaling * Added a note from reading an epub3 * Reworked some of the readme * Changed the build to ci * Bump versions by dotnet-bump-version. * Final Release Testing (#1796) * Fix some wording * Fixed up stats to have total info on hover * Fixed up a stat card not having clickable hint * Bump versions by dotnet-bump-version. * v0.7 Release * Version bump --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Robbie Davis <robbie@therobbiedavis.com> Co-authored-by: Mike <github@emailisgood.com> Co-authored-by: Muggz <mug@passw0rd.org> Co-authored-by: Domenic Fiore <DomenicF@users.noreply.github.com> Co-authored-by: Kupferhirn <kupferhirn@brokensoft.net>
15001 lines
No EOL
393 KiB
JSON
15001 lines
No EOL
393 KiB
JSON
{
|
|
"openapi": "3.0.1",
|
|
"info": {
|
|
"title": "Kavita",
|
|
"description": "Kavita provides a set of APIs that are authenticated by JWT. JWT token can be copied from local storage.",
|
|
"license": {
|
|
"name": "GPL-3.0",
|
|
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
|
|
},
|
|
"version": "0.7.0.0"
|
|
},
|
|
"servers": [
|
|
{
|
|
"url": "{protocol}://{hostpath}",
|
|
"variables": {
|
|
"protocol": {
|
|
"default": "http",
|
|
"enum": [
|
|
"http",
|
|
"https"
|
|
]
|
|
},
|
|
"hostpath": {
|
|
"default": "localhost:5000"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"paths": {
|
|
"/api/Account/reset-password": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Update a user's password",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ResetPasswordDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ResetPasswordDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ResetPasswordDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/register": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Register the first user (admin) on the server. Will not do anything if an admin is already confirmed",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RegisterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RegisterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RegisterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/login": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Perform a login. Will send JWT Token of the logged in user back.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LoginDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LoginDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LoginDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/refresh-token": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Refreshes the user's JWT token",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TokenRequestDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TokenRequestDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TokenRequestDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TokenRequestDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TokenRequestDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TokenRequestDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/roles": {
|
|
"get": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Get All Roles back. See API.Constants.PolicyConstants",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/reset-api-key": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Resets the API Key assigned with a user",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/update/email": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Initiates the flow to update a user's email address. The email address is not changed in this API. A confirmation link is sent/dumped which will\r\nvalidate the email. It must be confirmed for the email to update.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateEmailDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateEmailDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateEmailDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/update/age-restriction": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateAgeRestrictionDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateAgeRestrictionDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateAgeRestrictionDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/update": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Update the user account. This can only affect Username, Email (will require confirming), Roles, and Library access.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateUserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateUserDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateUserDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/invite-url": {
|
|
"get": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Requests the Invite Url for the UserId. Will return error if user is already validated.",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "withBaseUrl",
|
|
"in": "query",
|
|
"description": "Include the \"https://ip:port/\" in the generated link",
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/invite": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Invites a user to the server. Will generate a setup link for continuing setup. If the server is not accessible, no\r\nemail will be sent.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InviteUserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InviteUserDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/InviteUserDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/confirm-email": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Last step in authentication flow, confirms the email token for email",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmEmailDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmEmailDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmEmailDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/confirm-email-update": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Final step in email update change. Given a confirmation token and the email, this will finish the email change.",
|
|
"description": "This will force connected clients to re-authenticate",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmEmailUpdateDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmEmailUpdateDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmEmailUpdateDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/confirm-password-reset": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmPasswordResetDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmPasswordResetDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmPasswordResetDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/forgot-password": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Will send user a link to update their password to their email or prompt them if not accessible",
|
|
"parameters": [
|
|
{
|
|
"name": "email",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/email-confirmed": {
|
|
"get": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/confirm-migration-email": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmMigrationEmailDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmMigrationEmailDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ConfirmMigrationEmailDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/resend-confirmation-email": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "Resend an invite to a user already invited",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Account/migrate-email": {
|
|
"post": {
|
|
"tags": [
|
|
"Account"
|
|
],
|
|
"summary": "This is similar to invite. Essentially we authenticate the user's password then go through invite email flow",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MigrateUserEmailDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MigrateUserEmailDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MigrateUserEmailDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Admin/exists": {
|
|
"get": {
|
|
"tags": [
|
|
"Admin"
|
|
],
|
|
"summary": "Checks if an admin exists on the system. This is essentially a check to validate if the system has been setup.",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Book/{chapterId}/book-info": {
|
|
"get": {
|
|
"tags": [
|
|
"Book"
|
|
],
|
|
"summary": "Retrieves information for the PDF and Epub reader",
|
|
"description": "This only applies to Epub or PDF files",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "path",
|
|
"description": "",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookInfoDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookInfoDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookInfoDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Book/{chapterId}/book-resources": {
|
|
"get": {
|
|
"tags": [
|
|
"Book"
|
|
],
|
|
"summary": "This is an entry point to fetch resources from within an epub chapter/book.",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "path",
|
|
"description": "",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "file",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Book/{chapterId}/chapters": {
|
|
"get": {
|
|
"tags": [
|
|
"Book"
|
|
],
|
|
"summary": "This will return a list of mappings from ID -> page num. ID will be the xhtml key and page num will be the reading order\r\nthis is used to rewrite anchors in the book text so that we always load properly in our reader.",
|
|
"description": "This is essentially building the table of contents",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "path",
|
|
"description": "",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookChapterItem"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookChapterItem"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookChapterItem"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Book/{chapterId}/book-page": {
|
|
"get": {
|
|
"tags": [
|
|
"Book"
|
|
],
|
|
"summary": "This returns a single page within the epub book. All html will be rewritten to be scoped within our reader,\r\nall css is scoped, etc.",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "path",
|
|
"description": "",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "page",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Collection": {
|
|
"get": {
|
|
"tags": [
|
|
"Collection"
|
|
],
|
|
"summary": "Return a list of all collection tags on the server",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Collection/search": {
|
|
"get": {
|
|
"tags": [
|
|
"Collection"
|
|
],
|
|
"summary": "Searches against the collection tags on the DB and returns matches that meet the search criteria.\r\n<remarks>Search strings will be cleaned of certain fields, like %</remarks>",
|
|
"parameters": [
|
|
{
|
|
"name": "queryString",
|
|
"in": "query",
|
|
"description": "Search term",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Collection/name-exists": {
|
|
"get": {
|
|
"tags": [
|
|
"Collection"
|
|
],
|
|
"summary": "Checks if a collection exists with the name",
|
|
"parameters": [
|
|
{
|
|
"name": "name",
|
|
"in": "query",
|
|
"description": "If empty or null, will return true as that is invalid",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Collection/update": {
|
|
"post": {
|
|
"tags": [
|
|
"Collection"
|
|
],
|
|
"summary": "Updates an existing tag with a new title, promotion status, and summary.\r\n<remarks>UI does not contain controls to update title</remarks>",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Collection/update-for-series": {
|
|
"post": {
|
|
"tags": [
|
|
"Collection"
|
|
],
|
|
"summary": "Adds a collection tag onto multiple Series. If tag id is 0, this will create a new tag.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CollectionTagBulkAddDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CollectionTagBulkAddDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CollectionTagBulkAddDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Collection/update-series": {
|
|
"post": {
|
|
"tags": [
|
|
"Collection"
|
|
],
|
|
"summary": "For a given tag, update the summary if summary has changed and remove a set of series from the tag.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesForTagDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesForTagDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesForTagDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Device/create": {
|
|
"post": {
|
|
"tags": [
|
|
"Device"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateDeviceDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateDeviceDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateDeviceDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Device/update": {
|
|
"post": {
|
|
"tags": [
|
|
"Device"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateDeviceDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateDeviceDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateDeviceDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Device": {
|
|
"delete": {
|
|
"tags": [
|
|
"Device"
|
|
],
|
|
"summary": "Deletes the device from the user",
|
|
"parameters": [
|
|
{
|
|
"name": "deviceId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
},
|
|
"get": {
|
|
"tags": [
|
|
"Device"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DeviceDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DeviceDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DeviceDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Device/send-to": {
|
|
"post": {
|
|
"tags": [
|
|
"Device"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SendToDeviceDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SendToDeviceDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SendToDeviceDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Download/volume-size": {
|
|
"get": {
|
|
"tags": [
|
|
"Download"
|
|
],
|
|
"summary": "For a given volume, return the size in bytes",
|
|
"parameters": [
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Download/chapter-size": {
|
|
"get": {
|
|
"tags": [
|
|
"Download"
|
|
],
|
|
"summary": "For a given chapter, return the size in bytes",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Download/series-size": {
|
|
"get": {
|
|
"tags": [
|
|
"Download"
|
|
],
|
|
"summary": "For a series, return the size in bytes",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Download/volume": {
|
|
"get": {
|
|
"tags": [
|
|
"Download"
|
|
],
|
|
"summary": "Downloads all chapters within a volume. If the chapters are multiple zips, they will all be zipped up.",
|
|
"parameters": [
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Download/chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"Download"
|
|
],
|
|
"summary": "Returns the zip for a single chapter. If the chapter contains multiple files, they will be zipped.",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Download/series": {
|
|
"get": {
|
|
"tags": [
|
|
"Download"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Download/bookmarks": {
|
|
"post": {
|
|
"tags": [
|
|
"Download"
|
|
],
|
|
"summary": "Downloads all bookmarks in a zip for",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DownloadBookmarkDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DownloadBookmarkDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DownloadBookmarkDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Health": {
|
|
"get": {
|
|
"tags": [
|
|
"Health"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/chapter-cover": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns cover image for Chapter",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/library-cover": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns cover image for Library",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/volume-cover": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns cover image for Volume",
|
|
"parameters": [
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/series-cover": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns cover image for Series",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "Id of Series",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/collection-cover": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns cover image for Collection Tag",
|
|
"parameters": [
|
|
{
|
|
"name": "collectionTagId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/readinglist-cover": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns cover image for a Reading List",
|
|
"parameters": [
|
|
{
|
|
"name": "readingListId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/bookmark": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns image for a given bookmark page",
|
|
"description": "This request is served unauthenticated, but user must be passed via api key to validate",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "pageNum",
|
|
"in": "query",
|
|
"description": "Starts at 0",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "apiKey",
|
|
"in": "query",
|
|
"description": "API Key for user. Needed to authenticate request",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Image/cover-upload": {
|
|
"get": {
|
|
"tags": [
|
|
"Image"
|
|
],
|
|
"summary": "Returns a temp coverupload image",
|
|
"parameters": [
|
|
{
|
|
"name": "filename",
|
|
"in": "query",
|
|
"description": "Filename of file. This is used with upload/upload-by-url",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/create": {
|
|
"post": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"summary": "Creates a new Library. Upon library creation, adds new library to all Admin accounts.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateLibraryDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateLibraryDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateLibraryDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/list": {
|
|
"get": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"summary": "Returns a list of directories for a given path. If path is empty, returns root drives.",
|
|
"parameters": [
|
|
{
|
|
"name": "path",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DirectoryDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DirectoryDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DirectoryDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library": {
|
|
"get": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LibraryDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LibraryDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LibraryDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/jump-bar": {
|
|
"get": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/JumpKeyDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/JumpKeyDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/JumpKeyDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/grant-access": {
|
|
"post": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateLibraryForUserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateLibraryForUserDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateLibraryForUserDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/scan": {
|
|
"post": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "force",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": false
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/refresh-metadata": {
|
|
"post": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "force",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": true
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/analyze": {
|
|
"post": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/scan-folder": {
|
|
"post": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"summary": "Given a valid path, will invoke either a Scan Series or Scan Library. If the folder does not exist within Kavita, the request will be ignored",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ScanFolderDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ScanFolderDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ScanFolderDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/delete": {
|
|
"delete": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/name-exists": {
|
|
"get": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"summary": "Checks if the library name exists or not",
|
|
"parameters": [
|
|
{
|
|
"name": "name",
|
|
"in": "query",
|
|
"description": "If empty or null, will return true as that is invalid",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/update": {
|
|
"post": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"summary": "Updates an existing Library with new name, folders, and/or type.",
|
|
"description": "Any folder or type change will invoke a scan.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateLibraryDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateLibraryDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateLibraryDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Library/type": {
|
|
"get": {
|
|
"tags": [
|
|
"Library"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/genres": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"summary": "Fetches genres from the instance",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryIds",
|
|
"in": "query",
|
|
"description": "String separated libraryIds or null for all genres",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/GenreTagDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/GenreTagDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/GenreTagDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/people": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"summary": "Fetches people from the instance",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryIds",
|
|
"in": "query",
|
|
"description": "String separated libraryIds or null for all people",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/tags": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"summary": "Fetches all tags from the instance",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryIds",
|
|
"in": "query",
|
|
"description": "String separated libraryIds or null for all tags",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TagDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TagDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TagDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/age-ratings": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"summary": "Fetches all age ratings from the instance",
|
|
"description": "This API is cached for 1 hour, varying by libraryIds",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryIds",
|
|
"in": "query",
|
|
"description": "String separated libraryIds or null for all ratings",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AgeRatingDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AgeRatingDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AgeRatingDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/publication-status": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"summary": "Fetches all publication status' from the instance",
|
|
"description": "This API is cached for 1 hour, varying by libraryIds",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryIds",
|
|
"in": "query",
|
|
"description": "String separated libraryIds or null for all publication status",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AgeRatingDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AgeRatingDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AgeRatingDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/languages": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"summary": "Fetches all age languages from the libraries passed (or if none passed, all in the server)",
|
|
"description": "This does not perform RBS for the user if they have Library access due to the non-sensitive nature of languages",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryIds",
|
|
"in": "query",
|
|
"description": "String separated libraryIds or null for all ratings",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LanguageDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LanguageDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LanguageDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/all-languages": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LanguageDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LanguageDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LanguageDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Metadata/chapter-summary": {
|
|
"get": {
|
|
"tags": [
|
|
"Metadata"
|
|
],
|
|
"summary": "Returns summary for the chapter",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}": {
|
|
"post": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
},
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/libraries": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/collections": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/collections/{collectionId}": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "collectionId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "pageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/reading-list": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "pageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/reading-list/{readingListId}": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "readingListId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/libraries/{libraryId}": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "pageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/recently-added": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "pageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 1
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/on-deck": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "pageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 1
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/series": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "query",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/search": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/series/{seriesId}": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "seriesId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "seriesId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "volumeId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}/chapter/{chapterId}": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "seriesId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "volumeId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "chapterId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/series/{seriesId}/volume/{volumeId}/chapter/{chapterId}/download/{filename}": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"summary": "Downloads a file",
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"description": "User's API Key",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "seriesId",
|
|
"in": "path",
|
|
"description": "",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "volumeId",
|
|
"in": "path",
|
|
"description": "",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "chapterId",
|
|
"in": "path",
|
|
"description": "",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "filename",
|
|
"in": "path",
|
|
"description": "Not used. Only for Chunky to allow download links",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/image": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "pageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Opds/{apiKey}/favicon": {
|
|
"get": {
|
|
"tags": [
|
|
"Opds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Plugin/authenticate": {
|
|
"post": {
|
|
"tags": [
|
|
"Plugin"
|
|
],
|
|
"summary": "Authenticate with the Server given an apiKey. This will log you in by returning the user object and the JWT token.",
|
|
"description": "This API is not fully built out and may require more information in later releases",
|
|
"parameters": [
|
|
{
|
|
"name": "apiKey",
|
|
"in": "query",
|
|
"description": "API key which will be used to authenticate and return a valid user token back",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "pluginName",
|
|
"in": "query",
|
|
"description": "Name of the Plugin",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/pdf": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns the PDF for the chapterId.",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/image": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns an image for a given chapter. Will perform bounding checks",
|
|
"description": "This will cache the chapter images for reading",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "Chapter Id",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "page",
|
|
"in": "query",
|
|
"description": "Page in question",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "extractPdf",
|
|
"in": "query",
|
|
"description": "Should Kavita extract pdf into images. Defaults to false.",
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": false
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/bookmark-image": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns an image for a given bookmark series. Side effect: This will cache the bookmark images for reading.",
|
|
"description": "We must use api key as bookmarks could be leaked to other users via the API",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "apiKey",
|
|
"in": "query",
|
|
"description": "Api key for the user the bookmarks are on",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"name": "page",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/file-dimensions": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns the file dimensions for all pages in a chapter. If the underlying chapter is PDF, use extractPDF to unpack as images.",
|
|
"description": "This has a side effect of caching the images.\r\n This will only be populated on archive filetypes and not in bookmark mode",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "extractPdf",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": false
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileDimensionDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileDimensionDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileDimensionDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/chapter-info": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns various information about a Chapter. Side effect: This will cache the chapter images for reading.",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "extractPdf",
|
|
"in": "query",
|
|
"description": "Should Kavita extract pdf into images. Defaults to false.",
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": false
|
|
}
|
|
},
|
|
{
|
|
"name": "includeDimensions",
|
|
"in": "query",
|
|
"description": "Include file dimensions. Only useful for image based reading",
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": false
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterInfoDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterInfoDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterInfoDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/bookmark-info": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns various information about all bookmark files for a Series. Side effect: This will cache the bookmark images for reading.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "Series Id for all bookmarks",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkInfoDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkInfoDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkInfoDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-read": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks a Series as read. All volumes and chapters will be marked as read during this process.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-unread": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks a Series as Unread. All volumes and chapters will be marked as unread during this process.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-volume-unread": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks all chapters within a volume as unread",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumeReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumeReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumeReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-volume-read": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks all chapters within a volume as Read",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumeReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumeReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumeReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-multiple-read": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks all chapters within a list of volumes as Read. All volumes must belong to the same Series.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumesReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumesReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumesReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-multiple-unread": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks all chapters within a list of volumes as Unread. All volumes must belong to the same Series.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumesReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumesReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkVolumesReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-multiple-series-read": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks all chapters within a list of series as Read.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-multiple-series-unread": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks all chapters within a list of series as Unread.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/MarkMultipleSeriesAsReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/get-progress": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns Progress (page number) for a chapter for the logged in user",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProgressDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProgressDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProgressDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/progress": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Save page against Chapter for logged in user",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProgressDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProgressDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ProgressDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/continue-point": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Continue point is the chapter which you should start reading again from. If there is no progress on a series, then the first chapter will be returned (non-special unless only specials).\r\nOtherwise, loop through the chapters and volumes in order to find the next chapter which has progress.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/has-progress": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns if the user has reading progress on the Series",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/mark-chapter-until-as-read": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Marks every chapter that is sorted below the passed number as Read. This will not mark any specials as read.",
|
|
"description": "This is built for Tachiyomi and is not expected to be called by any other place",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "chapterNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number",
|
|
"format": "float"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"deprecated": true
|
|
}
|
|
},
|
|
"/api/Reader/chapter-bookmarks": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns a list of bookmarked pages for a given Chapter",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/all-bookmarks": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns a list of all bookmarked pages for a User",
|
|
"requestBody": {
|
|
"description": "Only supports SeriesNameQuery",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/remove-bookmarks": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Removes all bookmarks for all chapters linked to a Series",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RemoveBookmarkForSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/bulk-remove-bookmarks": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Removes all bookmarks for all chapters linked to a Series",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BulkRemoveBookmarkForSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/volume-bookmarks": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns all bookmarked pages for a given volume",
|
|
"parameters": [
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/series-bookmarks": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns all bookmarked pages for a given series",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/bookmark": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Bookmarks a page against a Chapter",
|
|
"description": "This has a side effect of caching the chapter files to disk",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/unbookmark": {
|
|
"post": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Removes a bookmarked page for a Chapter",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/next-chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns the next logical chapter from the series.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "currentChapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/prev-chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "Returns the previous logical chapter from the series.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "currentChapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Reader/time-left": {
|
|
"get": {
|
|
"tags": [
|
|
"Reader"
|
|
],
|
|
"summary": "For the current user, returns an estimate on how long it would take to finish reading the series.",
|
|
"description": "For Epubs, this does not check words inside a chapter due to overhead so may not work in all cases.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HourEstimateRangeDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HourEstimateRangeDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/HourEstimateRangeDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList": {
|
|
"get": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Fetches a single Reading List",
|
|
"parameters": [
|
|
{
|
|
"name": "readingListId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Deletes a reading list",
|
|
"parameters": [
|
|
{
|
|
"name": "readingListId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/lists": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Returns reading lists (paginated) for a given user.",
|
|
"parameters": [
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "includePromoted",
|
|
"in": "query",
|
|
"description": "Include Promoted Reading Lists along with user's Reading Lists. Defaults to true",
|
|
"schema": {
|
|
"type": "boolean",
|
|
"default": true
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/lists-for-series": {
|
|
"get": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Returns all Reading Lists the user has access to that have a series within it.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/items": {
|
|
"get": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Fetches all reading list items for a given list including rich metadata around series, volume, chapters, and progress",
|
|
"description": "This call is expensive",
|
|
"parameters": [
|
|
{
|
|
"name": "readingListId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListItemDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListItemDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListItemDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/update-position": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Updates an items position",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListPosition"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListPosition"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListPosition"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/delete-item": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Deletes a list item from the list. Will reorder all item positions afterwards",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListPosition"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListPosition"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListPosition"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/remove-read": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Removes all entries that are fully read from the reading list",
|
|
"parameters": [
|
|
{
|
|
"name": "readingListId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/create": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Creates a new List with a unique title. Returns the new ReadingList back",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateReadingListDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateReadingListDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/CreateReadingListDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/update": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Update the properties (title, summary) of a reading list",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/update-by-series": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Adds all chapters from a Series to a reading list",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListBySeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/update-by-multiple": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Adds all chapters from a list of volumes and chapters to a reading list",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByMultipleDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/update-by-multiple-series": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Adds all chapters from a list of series to a reading list",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByMultipleSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/update-by-volume": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByVolumeDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/update-by-chapter": {
|
|
"post": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByChapterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByChapterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateReadingListByChapterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/next-chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Returns the next chapter within the reading list",
|
|
"parameters": [
|
|
{
|
|
"name": "currentChapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "readingListId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/prev-chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Returns the prev chapter within the reading list",
|
|
"parameters": [
|
|
{
|
|
"name": "currentChapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "readingListId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/ReadingList/name-exists": {
|
|
"get": {
|
|
"tags": [
|
|
"ReadingList"
|
|
],
|
|
"summary": "Checks if a reading list exists with the name",
|
|
"parameters": [
|
|
{
|
|
"name": "name",
|
|
"in": "query",
|
|
"description": "If empty or null, will return true as that is invalid",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Recommended/quick-reads": {
|
|
"get": {
|
|
"tags": [
|
|
"Recommended"
|
|
],
|
|
"summary": "Quick Reads are series that should be readable in less than 10 in total and are not Ongoing in release.",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"description": "Library to restrict series to",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Recommended/quick-catchup-reads": {
|
|
"get": {
|
|
"tags": [
|
|
"Recommended"
|
|
],
|
|
"summary": "Quick Catchup Reads are series that should be readable in less than 10 in total and are Ongoing in release.",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"description": "Library to restrict series to",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Recommended/highly-rated": {
|
|
"get": {
|
|
"tags": [
|
|
"Recommended"
|
|
],
|
|
"summary": "Highly Rated based on other users ratings. Will pull series with ratings > 4.0, weighted by count of other users.",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"description": "Library to restrict series to",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Recommended/more-in": {
|
|
"get": {
|
|
"tags": [
|
|
"Recommended"
|
|
],
|
|
"summary": "Chooses a random genre and shows series that are in that without reading progress",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"description": "Library to restrict series to",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "genreId",
|
|
"in": "query",
|
|
"description": "Genre Id",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Recommended/rediscover": {
|
|
"get": {
|
|
"tags": [
|
|
"Recommended"
|
|
],
|
|
"summary": "Series that are fully read by the user in no particular order",
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"description": "Library to restrict series to",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Search/series-for-mangafile": {
|
|
"get": {
|
|
"tags": [
|
|
"Search"
|
|
],
|
|
"summary": "Returns the series for the MangaFile id. If the user does not have access (shouldn't happen by the UI),\r\nthen null is returned",
|
|
"parameters": [
|
|
{
|
|
"name": "mangaFileId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Search/series-for-chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"Search"
|
|
],
|
|
"summary": "Returns the series for the Chapter id. If the user does not have access (shouldn't happen by the UI),\r\nthen null is returned",
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Search/search": {
|
|
"get": {
|
|
"tags": [
|
|
"Search"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "queryString",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SearchResultGroupDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SearchResultGroupDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SearchResultGroupDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Series"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Series"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Series"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/{seriesId}": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Fetches a Series for a given Id",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "path",
|
|
"description": "Series Id to fetch details for",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/delete-multiple": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DeleteSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DeleteSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/DeleteSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/volumes": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Returns All volumes for a series with progress information and Chapters",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/VolumeDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/VolumeDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/VolumeDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/volume": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "volumeId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/VolumeDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/VolumeDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/VolumeDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/chapter-metadata": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "chapterId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterMetadataDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterMetadataDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterMetadataDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/update-rating": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesRatingDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesRatingDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesRatingDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/update": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/recently-added": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/recently-updated-series": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/RecentlyAddedItemDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/RecentlyAddedItemDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/RecentlyAddedItemDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/all": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/on-deck": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Fetches series that are on deck aka have progress on them.",
|
|
"parameters": [
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"description": "Default of 0 meaning all libraries",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/refresh-metadata": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Runs a Cover Image Generation task",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/scan": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Scan a series and force each file to be updated. This should be invoked via the User, hence why we force.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/analyze": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Run a file analysis on the series.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RefreshSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/metadata": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Returns metadata for a given series",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesMetadataDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesMetadataDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesMetadataDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Update series metadata",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesMetadataDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesMetadataDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateSeriesMetadataDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/series-by-collection": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Returns all Series grouped by the passed Collection Id with Pagination.",
|
|
"parameters": [
|
|
{
|
|
"name": "collectionId",
|
|
"in": "query",
|
|
"description": "Collection Id to pull series from",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/series-by-ids": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Fetches Series for a set of Ids. This will check User for permission access and filter out any Ids that don't exist or\r\nthe user does not have access to.",
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesByIdsDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesByIdsDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesByIdsDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/age-rating": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Get the age rating for the API.Entities.Enums.AgeRating enum value",
|
|
"description": "This is cached for an hour",
|
|
"parameters": [
|
|
{
|
|
"name": "ageRating",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/series-detail": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Get a special DTO for Series Detail page.",
|
|
"description": "Do not rely on this API externally. May change without hesitation.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDetailDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDetailDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/SeriesDetailDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/related": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Fetches the related series for a given series",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "relation",
|
|
"in": "query",
|
|
"description": "Type of Relationship to pull back",
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RelationKind"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/all-related": {
|
|
"get": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Returns all related series against the passed series Id",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RelatedSeriesDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RelatedSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/RelatedSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Series/update-related": {
|
|
"post": {
|
|
"tags": [
|
|
"Series"
|
|
],
|
|
"summary": "Update the relations attached to the Series. Does not generate associated Sequel/Prequel pairs on target series.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateRelatedSeriesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateRelatedSeriesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateRelatedSeriesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/restart": {
|
|
"post": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Attempts to Restart the server. Does not work, will shutdown the instance.",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/clear-cache": {
|
|
"post": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Performs an ad-hoc cleanup of Cache",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/cleanup-want-to-read": {
|
|
"post": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Performs an ad-hoc cleanup of Want To Read, by removing want to read series for users, where the series are fully read and in Completed publication status.",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/backup-db": {
|
|
"post": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Performs an ad-hoc backup of the Database",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/analyze-files": {
|
|
"post": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "This is a one time task that needs to be ran for v0.7 statistics to work",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/server-info": {
|
|
"get": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Returns non-sensitive information about the current system",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerInfoDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerInfoDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerInfoDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/convert-bookmarks": {
|
|
"post": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Triggers the scheduling of the convert bookmarks job. Only one job will run at a time.",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/convert-covers": {
|
|
"post": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Triggers the scheduling of the convert covers job. Only one job will run at a time.",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/logs": {
|
|
"get": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/check-update": {
|
|
"get": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Checks for updates, if no updates that are > current version installed, returns null",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateNotificationDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateNotificationDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateNotificationDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/changelog": {
|
|
"get": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/UpdateNotificationDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/UpdateNotificationDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/UpdateNotificationDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/accessible": {
|
|
"get": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"summary": "Is this server accessible to the outside net",
|
|
"description": "If the instance has the HostName set, this will return true whether or not it is accessible externally",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Server/jobs": {
|
|
"get": {
|
|
"tags": [
|
|
"Server"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/JobDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/JobDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/JobDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/base-url": {
|
|
"get": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings": {
|
|
"get": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/reset": {
|
|
"post": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/reset-ip-addresses": {
|
|
"post": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"summary": "Resets the IP Addresses",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/reset-email-url": {
|
|
"post": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"summary": "Resets the email service url",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerSettingDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/test-email-url": {
|
|
"post": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TestEmailDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TestEmailDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/TestEmailDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/EmailTestResultDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/EmailTestResultDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/EmailTestResultDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/task-frequencies": {
|
|
"get": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/library-types": {
|
|
"get": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/log-levels": {
|
|
"get": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Settings/opds-enabled": {
|
|
"get": {
|
|
"tags": [
|
|
"Settings"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/user/{userId}/read": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "path",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserReadStatistics"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserReadStatistics"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserReadStatistics"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/server/stats": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerStatisticsDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerStatisticsDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ServerStatisticsDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/server/count/year": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/server/count/publication-status": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PublicationStatusStatCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PublicationStatusStatCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PublicationStatusStatCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/server/count/manga-format": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MangaFormatStatCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MangaFormatStatCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MangaFormatStatCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/server/top/years": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/server/top/users": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"summary": "Returns users with the top reads in the server",
|
|
"parameters": [
|
|
{
|
|
"name": "days",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TopReadDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TopReadDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TopReadDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/server/file-breakdown": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"summary": "A breakdown of different files, their size, and format",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileExtensionBreakdownDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileExtensionBreakdownDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileExtensionBreakdownDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/reading-count-by-day": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"summary": "Returns reading history events for a give or all users, broken up by day, and format",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "query",
|
|
"description": "If 0, defaults to all users, else just userId",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
},
|
|
{
|
|
"name": "days",
|
|
"in": "query",
|
|
"description": "If 0, defaults to all time, else just those days asked for",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DateTimePagesReadOnADayCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DateTimePagesReadOnADayCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DateTimePagesReadOnADayCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/day-breakdown": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DayOfWeekStatCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DayOfWeekStatCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/DayOfWeekStatCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/user/reading-history": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadHistoryEvent"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadHistoryEvent"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadHistoryEvent"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/pages-per-year": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"summary": "Returns a count of pages read per year for a given userId.",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "query",
|
|
"description": "If userId is 0 and user is not an admin, API will default to userId",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Stats/words-per-year": {
|
|
"get": {
|
|
"tags": [
|
|
"Stats"
|
|
],
|
|
"summary": "Returns a count of words read per year for a given userId.",
|
|
"parameters": [
|
|
{
|
|
"name": "userId",
|
|
"in": "query",
|
|
"description": "If userId is 0 and user is not an admin, API will default to userId",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"default": 0
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Int32StatCount"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Tachiyomi/latest-chapter": {
|
|
"get": {
|
|
"tags": [
|
|
"Tachiyomi"
|
|
],
|
|
"summary": "Given the series Id, this should return the latest chapter that has been fully read.",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"description": "",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Tachiyomi/mark-chapter-until-as-read": {
|
|
"post": {
|
|
"tags": [
|
|
"Tachiyomi"
|
|
],
|
|
"summary": "Marks every chapter that is sorted below the passed number as Read. This will not mark any specials as read.",
|
|
"description": "This is built for Tachiyomi and is not expected to be called by any other place",
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "chapterNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "number",
|
|
"format": "float"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Theme": {
|
|
"get": {
|
|
"tags": [
|
|
"Theme"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SiteThemeDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SiteThemeDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SiteThemeDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Theme/scan": {
|
|
"post": {
|
|
"tags": [
|
|
"Theme"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Theme/update-default": {
|
|
"post": {
|
|
"tags": [
|
|
"Theme"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateDefaultThemeDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateDefaultThemeDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateDefaultThemeDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Theme/download-content": {
|
|
"get": {
|
|
"tags": [
|
|
"Theme"
|
|
],
|
|
"summary": "Returns css content to the UI. UI is expected to escape the content",
|
|
"parameters": [
|
|
{
|
|
"name": "themeId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Upload/upload-by-url": {
|
|
"post": {
|
|
"tags": [
|
|
"Upload"
|
|
],
|
|
"summary": "This stores a file (image) in temp directory for use in a cover image replacement flow.\r\nThis is automatically cleaned up.",
|
|
"requestBody": {
|
|
"description": "Escaped url to download from",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadUrlDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadUrlDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadUrlDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Upload/series": {
|
|
"post": {
|
|
"tags": [
|
|
"Upload"
|
|
],
|
|
"summary": "Replaces series cover image and locks it with a base64 encoded image",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Upload/collection": {
|
|
"post": {
|
|
"tags": [
|
|
"Upload"
|
|
],
|
|
"summary": "Replaces collection tag cover image and locks it with a base64 encoded image",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Upload/reading-list": {
|
|
"post": {
|
|
"tags": [
|
|
"Upload"
|
|
],
|
|
"summary": "Replaces reading list cover image and locks it with a base64 encoded image",
|
|
"description": "This is the only API that can be called by non-admins, but the authenticated user must have a readinglist permission",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Upload/chapter": {
|
|
"post": {
|
|
"tags": [
|
|
"Upload"
|
|
],
|
|
"summary": "Replaces chapter cover image and locks it with a base64 encoded image. This will update the parent volume's cover image.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Upload/library": {
|
|
"post": {
|
|
"tags": [
|
|
"Upload"
|
|
],
|
|
"summary": "Replaces library cover image with a base64 encoded image. If empty string passed, will reset to null.",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Upload/reset-chapter-lock": {
|
|
"post": {
|
|
"tags": [
|
|
"Upload"
|
|
],
|
|
"summary": "Replaces chapter cover image and locks it with a base64 encoded image. This will update the parent volume's cover image.",
|
|
"requestBody": {
|
|
"description": "Does not use Url property",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UploadFileDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/delete-user": {
|
|
"delete": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "username",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users": {
|
|
"get": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/pending": {
|
|
"get": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/myself": {
|
|
"get": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MemberDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/has-reading-progress": {
|
|
"get": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/has-library-access": {
|
|
"get": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "libraryId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/update-preferences": {
|
|
"post": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"requestBody": {
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/get-preferences": {
|
|
"get": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"summary": "Returns the preferences of the user",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/Users/names": {
|
|
"get": {
|
|
"tags": [
|
|
"Users"
|
|
],
|
|
"summary": "Returns a list of the user names within the system",
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/want-to-read": {
|
|
"post": {
|
|
"tags": [
|
|
"WantToRead"
|
|
],
|
|
"summary": "Return all Series that are in the current logged in user's Want to Read list, filtered",
|
|
"parameters": [
|
|
{
|
|
"name": "PageNumber",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
{
|
|
"name": "PageSize",
|
|
"in": "query",
|
|
"description": "If set to 0, will set as MaxInt",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/FilterDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"get": {
|
|
"tags": [
|
|
"WantToRead"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"name": "seriesId",
|
|
"in": "query",
|
|
"schema": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
}
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success",
|
|
"content": {
|
|
"text/plain": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"application/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"type": "boolean"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/want-to-read/add-series": {
|
|
"post": {
|
|
"tags": [
|
|
"WantToRead"
|
|
],
|
|
"summary": "Given a list of Series Ids, add them to the current logged in user's Want To Read list",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateWantToReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateWantToReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateWantToReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/api/want-to-read/remove-series": {
|
|
"post": {
|
|
"tags": [
|
|
"WantToRead"
|
|
],
|
|
"summary": "Given a list of Series Ids, remove them from the current logged in user's Want To Read list",
|
|
"requestBody": {
|
|
"description": "",
|
|
"content": {
|
|
"application/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateWantToReadDto"
|
|
}
|
|
},
|
|
"text/json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateWantToReadDto"
|
|
}
|
|
},
|
|
"application/*+json": {
|
|
"schema": {
|
|
"$ref": "#/components/schemas/UpdateWantToReadDto"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"responses": {
|
|
"200": {
|
|
"description": "Success"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"components": {
|
|
"schemas": {
|
|
"AgeRating": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
-1
|
|
],
|
|
"type": "integer",
|
|
"description": "Represents Age Rating for content.",
|
|
"format": "int32"
|
|
},
|
|
"AgeRatingDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"AgeRestrictionDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"includeUnknowns": {
|
|
"type": "boolean",
|
|
"description": "Are Unknowns explicitly allowed against age rating"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"AppRole": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"normalizedName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"concurrencyStamp": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"userRoles": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserRole"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"AppUser": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"userName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"normalizedUserName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"normalizedEmail": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"emailConfirmed": {
|
|
"type": "boolean"
|
|
},
|
|
"passwordHash": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"securityStamp": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"concurrencyStamp": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"phoneNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"phoneNumberConfirmed": {
|
|
"type": "boolean"
|
|
},
|
|
"twoFactorEnabled": {
|
|
"type": "boolean"
|
|
},
|
|
"lockoutEnd": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"nullable": true
|
|
},
|
|
"lockoutEnabled": {
|
|
"type": "boolean"
|
|
},
|
|
"accessFailedCount": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastActive": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastActiveUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"libraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Library"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"userRoles": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserRole"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"progresses": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserProgress"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"ratings": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserRating"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"userPreferences": {
|
|
"$ref": "#/components/schemas/AppUserPreferences"
|
|
},
|
|
"bookmarks": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserBookmark"
|
|
},
|
|
"description": "Bookmarks associated with this User",
|
|
"nullable": true
|
|
},
|
|
"readingLists": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingList"
|
|
},
|
|
"description": "Reading lists associated with this user",
|
|
"nullable": true
|
|
},
|
|
"wantToRead": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Series"
|
|
},
|
|
"description": "A list of Series the user want's to read",
|
|
"nullable": true
|
|
},
|
|
"devices": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Device"
|
|
},
|
|
"description": "A list of Devices which allows the user to send files to",
|
|
"nullable": true
|
|
},
|
|
"apiKey": {
|
|
"type": "string",
|
|
"description": "An API Key to interact with external services, like OPDS",
|
|
"nullable": true
|
|
},
|
|
"confirmationToken": {
|
|
"type": "string",
|
|
"description": "The confirmation token for the user (invite). This will be set to null after the user confirms.",
|
|
"nullable": true
|
|
},
|
|
"ageRestriction": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"ageRestrictionIncludeUnknowns": {
|
|
"type": "boolean",
|
|
"description": "If an age rating restriction is applied to the account, if Unknowns should be allowed for the user. Defaults to false."
|
|
},
|
|
"rowVersion": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"readOnly": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"AppUserBookmark": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"page": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"fileName": {
|
|
"type": "string",
|
|
"description": "Filename in the Bookmark Directory",
|
|
"nullable": true
|
|
},
|
|
"appUserId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a saved page in a Chapter entity for a given user."
|
|
},
|
|
"AppUserPreferences": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"readingDirection": {
|
|
"$ref": "#/components/schemas/ReadingDirection"
|
|
},
|
|
"scalingOption": {
|
|
"$ref": "#/components/schemas/ScalingOption"
|
|
},
|
|
"pageSplitOption": {
|
|
"$ref": "#/components/schemas/PageSplitOption"
|
|
},
|
|
"readerMode": {
|
|
"$ref": "#/components/schemas/ReaderMode"
|
|
},
|
|
"autoCloseMenu": {
|
|
"type": "boolean",
|
|
"description": "Manga Reader Option: Allow the menu to close after 6 seconds without interaction"
|
|
},
|
|
"showScreenHints": {
|
|
"type": "boolean",
|
|
"description": "Manga Reader Option: Show screen hints to the user on some actions, ie) pagination direction change"
|
|
},
|
|
"emulateBook": {
|
|
"type": "boolean",
|
|
"description": "Manga Reader Option: Emulate a book by applying a shadow effect on the pages"
|
|
},
|
|
"layoutMode": {
|
|
"$ref": "#/components/schemas/LayoutMode"
|
|
},
|
|
"backgroundColor": {
|
|
"type": "string",
|
|
"description": "Manga Reader Option: Background color of the reader",
|
|
"nullable": true
|
|
},
|
|
"swipeToPaginate": {
|
|
"type": "boolean",
|
|
"description": "Manga Reader Option: Should swiping trigger pagination"
|
|
},
|
|
"bookReaderMargin": {
|
|
"type": "integer",
|
|
"description": "Book Reader Option: Override extra Margin",
|
|
"format": "int32"
|
|
},
|
|
"bookReaderLineSpacing": {
|
|
"type": "integer",
|
|
"description": "Book Reader Option: Override line-height",
|
|
"format": "int32"
|
|
},
|
|
"bookReaderFontSize": {
|
|
"type": "integer",
|
|
"description": "Book Reader Option: Override font size",
|
|
"format": "int32"
|
|
},
|
|
"bookReaderFontFamily": {
|
|
"type": "string",
|
|
"description": "Book Reader Option: Maps to the default Kavita font-family (inherit) or an override",
|
|
"nullable": true
|
|
},
|
|
"bookReaderTapToPaginate": {
|
|
"type": "boolean",
|
|
"description": "Book Reader Option: Allows tapping on side of screens to paginate"
|
|
},
|
|
"bookReaderReadingDirection": {
|
|
"$ref": "#/components/schemas/ReadingDirection"
|
|
},
|
|
"theme": {
|
|
"$ref": "#/components/schemas/SiteTheme"
|
|
},
|
|
"bookThemeName": {
|
|
"type": "string",
|
|
"description": "Book Reader Option: The color theme to decorate the book contents",
|
|
"nullable": true
|
|
},
|
|
"bookReaderLayoutMode": {
|
|
"$ref": "#/components/schemas/BookPageLayoutMode"
|
|
},
|
|
"bookReaderImmersiveMode": {
|
|
"type": "boolean",
|
|
"description": "Book Reader Option: A flag that hides the menu-ing system behind a click on the screen. This should be used with tap to paginate, but the app doesn't enforce this."
|
|
},
|
|
"globalPageLayoutMode": {
|
|
"$ref": "#/components/schemas/PageLayoutMode"
|
|
},
|
|
"blurUnreadSummaries": {
|
|
"type": "boolean",
|
|
"description": "UI Site Global Setting: If unread summaries should be blurred until expanded or unless user has read it already"
|
|
},
|
|
"promptForDownloadSize": {
|
|
"type": "boolean",
|
|
"description": "UI Site Global Setting: Should Kavita prompt user to confirm downloads that are greater than 100 MB."
|
|
},
|
|
"noTransitions": {
|
|
"type": "boolean",
|
|
"description": "UI Site Global Setting: Should Kavita disable CSS transitions"
|
|
},
|
|
"appUser": {
|
|
"$ref": "#/components/schemas/AppUser"
|
|
},
|
|
"appUserId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"AppUserProgress": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"description": "Id of Entity",
|
|
"format": "int32"
|
|
},
|
|
"pagesRead": {
|
|
"type": "integer",
|
|
"description": "Pages Read for given Chapter",
|
|
"format": "int32"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"description": "Volume belonging to Chapter",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"description": "Series belonging to Chapter",
|
|
"format": "int32"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"description": "Library belonging to Chapter",
|
|
"format": "int32"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"description": "Chapter",
|
|
"format": "int32"
|
|
},
|
|
"bookScrollId": {
|
|
"type": "string",
|
|
"description": "For Book Reader, represents the nearest passed anchor on the screen that can be used to resume scroll point\r\non next load",
|
|
"nullable": true
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"description": "When this was first created",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"description": "Last date this was updated",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"appUser": {
|
|
"$ref": "#/components/schemas/AppUser"
|
|
},
|
|
"appUserId": {
|
|
"type": "integer",
|
|
"description": "User this progress belongs to",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents the progress a single user has on a given Chapter."
|
|
},
|
|
"AppUserRating": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"rating": {
|
|
"type": "integer",
|
|
"description": "A number between 0-5 that represents how good a series is.",
|
|
"format": "int32"
|
|
},
|
|
"review": {
|
|
"type": "string",
|
|
"description": "A short summary the user can write when giving their review.",
|
|
"nullable": true
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"appUserId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"appUser": {
|
|
"$ref": "#/components/schemas/AppUser"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"AppUserRole": {
|
|
"type": "object",
|
|
"properties": {
|
|
"userId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"roleId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"user": {
|
|
"$ref": "#/components/schemas/AppUser"
|
|
},
|
|
"role": {
|
|
"$ref": "#/components/schemas/AppRole"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"BookChapterItem": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Name of the Chapter",
|
|
"nullable": true
|
|
},
|
|
"part": {
|
|
"type": "string",
|
|
"description": "A part represents the id of the anchor so we can scroll to it. 01_values.xhtml#h_sVZPaxUSy/",
|
|
"nullable": true
|
|
},
|
|
"page": {
|
|
"type": "integer",
|
|
"description": "Page Number to load for the chapter",
|
|
"format": "int32"
|
|
},
|
|
"children": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookChapterItem"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"BookInfoDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"bookTitle": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesFormat": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"seriesName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"chapterNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"volumeNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"isSpecial": {
|
|
"type": "boolean"
|
|
},
|
|
"chapterTitle": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"BookPageLayoutMode": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"BookmarkDto": {
|
|
"required": [
|
|
"chapterId",
|
|
"page",
|
|
"seriesId",
|
|
"volumeId"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"page": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"BookmarkInfoDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"seriesFormat": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryType": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"BulkRemoveBookmarkForSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"Chapter": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"range": {
|
|
"type": "string",
|
|
"description": "Range of numbers. Chapter 2-4 -> \"2-4\". Chapter 2 -> \"2\".",
|
|
"nullable": true
|
|
},
|
|
"number": {
|
|
"type": "string",
|
|
"description": "Smallest number of the Range. Can be a partial like Chapter 4.5",
|
|
"nullable": true
|
|
},
|
|
"files": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MangaFile"
|
|
},
|
|
"description": "The files that represent this Chapter",
|
|
"nullable": true
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "Relative path to the (managed) image file representing the cover image",
|
|
"nullable": true
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"description": "Total number of pages in all MangaFiles",
|
|
"format": "int32"
|
|
},
|
|
"isSpecial": {
|
|
"type": "boolean",
|
|
"description": "If this Chapter contains files that could only be identified as Series or has Special Identifier from filename"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Used for books/specials to display custom title. For non-specials/books, will be set to API.Entities.Chapter.Range",
|
|
"nullable": true
|
|
},
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"titleName": {
|
|
"type": "string",
|
|
"description": "Chapter title",
|
|
"nullable": true
|
|
},
|
|
"releaseDate": {
|
|
"type": "string",
|
|
"description": "Date which chapter was released",
|
|
"format": "date-time"
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"description": "Summary for the Chapter/Issue",
|
|
"nullable": true
|
|
},
|
|
"language": {
|
|
"type": "string",
|
|
"description": "Language for the Chapter/Issue",
|
|
"nullable": true
|
|
},
|
|
"totalCount": {
|
|
"type": "integer",
|
|
"description": "Total number of issues or volumes in the series",
|
|
"format": "int32"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"description": "Number of the Total Count (progress the Series is complete)",
|
|
"format": "int32"
|
|
},
|
|
"seriesGroup": {
|
|
"type": "string",
|
|
"description": "SeriesGroup tag in ComicInfo",
|
|
"nullable": true
|
|
},
|
|
"storyArc": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"storyArcNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"alternateNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"alternateSeries": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"alternateCount": {
|
|
"type": "integer",
|
|
"description": "Not currently used in Kavita",
|
|
"format": "int32"
|
|
},
|
|
"wordCount": {
|
|
"type": "integer",
|
|
"description": "Total Word count of all chapters in this chapter.",
|
|
"format": "int64"
|
|
},
|
|
"minHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"maxHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"avgHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"people": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Person"
|
|
},
|
|
"description": "All people attached at a Chapter level. Usually Comics will have different people per issue.",
|
|
"nullable": true
|
|
},
|
|
"genres": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Genre"
|
|
},
|
|
"description": "Genres for the Chapter",
|
|
"nullable": true
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Tag"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"userProgress": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserProgress"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"volume": {
|
|
"$ref": "#/components/schemas/Volume"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ChapterDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"range": {
|
|
"type": "string",
|
|
"description": "Range of chapters. Chapter 2-4 -> \"2-4\". Chapter 2 -> \"2\".",
|
|
"nullable": true
|
|
},
|
|
"number": {
|
|
"type": "string",
|
|
"description": "Smallest number of the Range.",
|
|
"nullable": true
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"description": "Total number of pages in all MangaFiles",
|
|
"format": "int32"
|
|
},
|
|
"isSpecial": {
|
|
"type": "boolean",
|
|
"description": "If this Chapter contains files that could only be identified as Series or has Special Identifier from filename"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Used for books/specials to display custom title. For non-specials/books, will be set to API.DTOs.ChapterDto.Range",
|
|
"nullable": true
|
|
},
|
|
"files": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MangaFileDto"
|
|
},
|
|
"description": "The files that represent this Chapter",
|
|
"nullable": true
|
|
},
|
|
"pagesRead": {
|
|
"type": "integer",
|
|
"description": "Calculated at API time. Number of pages read for this Chapter for logged in user.",
|
|
"format": "int32"
|
|
},
|
|
"lastReadingProgressUtc": {
|
|
"type": "string",
|
|
"description": "The last time a chapter was read by current authenticated user",
|
|
"format": "date-time"
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean",
|
|
"description": "If the Cover Image is locked for this entity"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"description": "Volume Id this Chapter belongs to",
|
|
"format": "int32"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"description": "When chapter was created",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"releaseDate": {
|
|
"type": "string",
|
|
"description": "When the chapter was released.",
|
|
"format": "date-time"
|
|
},
|
|
"titleName": {
|
|
"type": "string",
|
|
"description": "Title of the Chapter/Issue",
|
|
"nullable": true
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"description": "Summary of the Chapter",
|
|
"nullable": true
|
|
},
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"wordCount": {
|
|
"type": "integer",
|
|
"description": "Total words in a Chapter (books only)",
|
|
"format": "int64"
|
|
},
|
|
"volumeTitle": {
|
|
"type": "string",
|
|
"description": "Formatted Volume title ie) Volume 2.",
|
|
"nullable": true
|
|
},
|
|
"minHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"maxHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"avgHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "A Chapter is the lowest grouping of a reading medium. A Chapter contains a set of MangaFiles which represents the underlying\r\nfile (abstracted from type)."
|
|
},
|
|
"ChapterInfoDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"chapterNumber": {
|
|
"type": "string",
|
|
"description": "The Chapter Number",
|
|
"nullable": true
|
|
},
|
|
"volumeNumber": {
|
|
"type": "string",
|
|
"description": "The Volume Number",
|
|
"nullable": true
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"description": "Volume entity Id",
|
|
"format": "int32"
|
|
},
|
|
"seriesName": {
|
|
"type": "string",
|
|
"description": "Series Name",
|
|
"nullable": true
|
|
},
|
|
"seriesFormat": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"description": "Series entity Id",
|
|
"format": "int32"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"description": "Library entity Id",
|
|
"format": "int32"
|
|
},
|
|
"libraryType": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"chapterTitle": {
|
|
"type": "string",
|
|
"description": "Chapter's title if set via ComicInfo.xml (Title field)",
|
|
"nullable": true
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"description": "Total Number of pages in this Chapter",
|
|
"format": "int32"
|
|
},
|
|
"fileName": {
|
|
"type": "string",
|
|
"description": "File name of the chapter",
|
|
"nullable": true
|
|
},
|
|
"isSpecial": {
|
|
"type": "boolean",
|
|
"description": "If this is marked as a special in Kavita"
|
|
},
|
|
"subtitle": {
|
|
"type": "string",
|
|
"description": "The subtitle to render on the reader",
|
|
"nullable": true
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Series Title",
|
|
"nullable": true
|
|
},
|
|
"pageDimensions": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileDimensionDto"
|
|
},
|
|
"description": "List of all files with their inner archive structure maintained in filename and dimensions",
|
|
"nullable": true
|
|
},
|
|
"doublePairs": {
|
|
"type": "object",
|
|
"additionalProperties": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "For Double Page reader, this will contain snap points to ensure the reader always resumes on correct page",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Information about the Chapter for the Reader to render"
|
|
},
|
|
"ChapterMetadataDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"writers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"coverArtists": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"publishers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"characters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"pencillers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"inkers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"colorists": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"letterers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"editors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"translators": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"genres": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/GenreTagDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TagDto"
|
|
},
|
|
"description": "Collection of all Tags from underlying chapters for a Series",
|
|
"nullable": true
|
|
},
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"releaseDate": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"publicationStatus": {
|
|
"$ref": "#/components/schemas/PublicationStatus"
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"description": "Summary for the Chapter/Issue",
|
|
"nullable": true
|
|
},
|
|
"language": {
|
|
"type": "string",
|
|
"description": "Language for the Chapter/Issue",
|
|
"nullable": true
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"description": "Number in the TotalCount of issues",
|
|
"format": "int32"
|
|
},
|
|
"totalCount": {
|
|
"type": "integer",
|
|
"description": "Total number of issues for the series",
|
|
"format": "int32"
|
|
},
|
|
"wordCount": {
|
|
"type": "integer",
|
|
"description": "Number of Words for this chapter. Only applies to Epub",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Exclusively metadata about a given chapter"
|
|
},
|
|
"CollectionTag": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Visible title of the Tag",
|
|
"nullable": true
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "Absolute path to the (managed) image file",
|
|
"nullable": true
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean",
|
|
"description": "Denotes if the CoverImage has been overridden by the user. If so, it will not be updated during normal scan operations."
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"description": "A description of the tag",
|
|
"nullable": true
|
|
},
|
|
"normalizedTitle": {
|
|
"type": "string",
|
|
"description": "A normalized string used to check if the tag already exists in the DB",
|
|
"nullable": true
|
|
},
|
|
"promoted": {
|
|
"type": "boolean",
|
|
"description": "A promoted collection tag will allow all linked seriesMetadata's Series to show for all users."
|
|
},
|
|
"seriesMetadatas": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesMetadata"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"rowVersion": {
|
|
"type": "integer",
|
|
"description": "Not Used due to not using concurrency update",
|
|
"format": "int32",
|
|
"readOnly": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a user entered field that is used as a tagging and grouping mechanism"
|
|
},
|
|
"CollectionTagBulkAddDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"collectionTagId": {
|
|
"type": "integer",
|
|
"description": "Collection Tag Id",
|
|
"format": "int32"
|
|
},
|
|
"collectionTagTitle": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"seriesIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "Series Ids to add onto Collection Tag",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"CollectionTagDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"promoted": {
|
|
"type": "boolean"
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "The cover image string. This is used on Frontend to show or hide the Cover Image",
|
|
"nullable": true
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ConfirmEmailDto": {
|
|
"required": [
|
|
"email",
|
|
"password",
|
|
"token",
|
|
"username"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"token": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"password": {
|
|
"maxLength": 32,
|
|
"minLength": 6,
|
|
"type": "string"
|
|
},
|
|
"username": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ConfirmEmailUpdateDto": {
|
|
"required": [
|
|
"email",
|
|
"token"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"token": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ConfirmMigrationEmailDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"token": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ConfirmPasswordResetDto": {
|
|
"required": [
|
|
"email",
|
|
"password",
|
|
"token"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"token": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"password": {
|
|
"maxLength": 32,
|
|
"minLength": 6,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"CreateDeviceDto": {
|
|
"required": [
|
|
"emailAddress",
|
|
"name",
|
|
"platform"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"platform": {
|
|
"$ref": "#/components/schemas/DevicePlatform"
|
|
},
|
|
"emailAddress": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"CreateLibraryDto": {
|
|
"required": [
|
|
"folders",
|
|
"name",
|
|
"type"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"folders": {
|
|
"minItems": 1,
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"CreateReadingListDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"DateTimePagesReadOnADayCount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"type": "string",
|
|
"description": "The day of the readings",
|
|
"format": "date-time"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"description": "Number of pages read",
|
|
"format": "int64"
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"DayOfWeek": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"DayOfWeekStatCount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"$ref": "#/components/schemas/DayOfWeek"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"DeleteSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"Device": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"ipAddress": {
|
|
"type": "string",
|
|
"description": "Last Seen IP Address of the device",
|
|
"nullable": true
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "A name given to this device",
|
|
"nullable": true,
|
|
"example": "Pixel 3a, John's Kindle"
|
|
},
|
|
"emailAddress": {
|
|
"type": "string",
|
|
"description": "An email address associated with the device (ie Kindle). Will be used with Send to functionality",
|
|
"nullable": true
|
|
},
|
|
"platform": {
|
|
"$ref": "#/components/schemas/DevicePlatform"
|
|
},
|
|
"appUserId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"appUser": {
|
|
"$ref": "#/components/schemas/AppUser"
|
|
},
|
|
"lastUsed": {
|
|
"type": "string",
|
|
"description": "Last time this device was used to send a file",
|
|
"format": "date-time"
|
|
},
|
|
"lastUsedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "A Device is an entity that can receive data from Kavita (kindle)"
|
|
},
|
|
"DeviceDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"description": "The device Id",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "A name given to this device",
|
|
"nullable": true,
|
|
"example": "Pixel 3a, John's Kindle"
|
|
},
|
|
"emailAddress": {
|
|
"type": "string",
|
|
"description": "An email address associated with the device (ie Kindle). Will be used with Send to functionality",
|
|
"nullable": true
|
|
},
|
|
"platform": {
|
|
"$ref": "#/components/schemas/DevicePlatform"
|
|
},
|
|
"lastUsed": {
|
|
"type": "string",
|
|
"description": "Last time this device was used to send a file",
|
|
"format": "date-time"
|
|
},
|
|
"lastUsedUtc": {
|
|
"type": "string",
|
|
"description": "Last time this device was used to send a file",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "A Device is an entity that can receive data from Kavita (kindle)"
|
|
},
|
|
"DevicePlatform": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2,
|
|
3
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"DirectoryDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Name of the directory",
|
|
"nullable": true
|
|
},
|
|
"fullPath": {
|
|
"type": "string",
|
|
"description": "Full Directory Path",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"DownloadBookmarkDto": {
|
|
"required": [
|
|
"bookmarks"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"bookmarks": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/BookmarkDto"
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"EmailTestResultDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"successful": {
|
|
"type": "boolean"
|
|
},
|
|
"errorMessage": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents if Test Email Service URL was successful or not and if any error occured"
|
|
},
|
|
"FileDimensionDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"width": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"height": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"pageNumber": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"fileName": {
|
|
"type": "string",
|
|
"description": "The filename of the cached file. If this was nested in a subfolder, the foldername will be appended with _",
|
|
"nullable": true,
|
|
"example": "chapter01_page01.png"
|
|
},
|
|
"isWide": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"FileExtensionBreakdownDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"totalFileSize": {
|
|
"type": "integer",
|
|
"description": "Total bytes for all files",
|
|
"format": "int64"
|
|
},
|
|
"fileBreakdown": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileExtensionDto"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"FileExtensionDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"extension": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"totalSize": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"totalFiles": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"FileFormatDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"extension": {
|
|
"type": "string",
|
|
"description": "The extension with the ., in lowercase",
|
|
"nullable": true
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"FilterDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"formats": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"description": "The type of Formats you want to be returned. An empty list will return all formats back",
|
|
"nullable": true
|
|
},
|
|
"readStatus": {
|
|
"$ref": "#/components/schemas/ReadStatus"
|
|
},
|
|
"libraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of library ids to restrict search to. Defaults to all libraries by passing empty list",
|
|
"nullable": true
|
|
},
|
|
"genres": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Genre ids to restrict search to. Defaults to all genres by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"writers": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Writers to restrict search to. Defaults to all Writers by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"penciller": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Penciller ids to restrict search to. Defaults to all Pencillers by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"inker": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Inker ids to restrict search to. Defaults to all Inkers by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"colorist": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Colorist ids to restrict search to. Defaults to all Colorists by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"letterer": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Letterer ids to restrict search to. Defaults to all Letterers by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"coverArtist": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of CoverArtist ids to restrict search to. Defaults to all CoverArtists by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"editor": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Editor ids to restrict search to. Defaults to all Editors by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"publisher": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Publisher ids to restrict search to. Defaults to all Publishers by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"character": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Character ids to restrict search to. Defaults to all Characters by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"translators": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Translator ids to restrict search to. Defaults to all Translatorss by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"collectionTags": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Collection Tag ids to restrict search to. Defaults to all Collection Tags by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Tag ids to restrict search to. Defaults to all Tags by passing an empty list",
|
|
"nullable": true
|
|
},
|
|
"rating": {
|
|
"type": "integer",
|
|
"description": "Will return back everything with the rating and above\r\nAPI.Entities.AppUserRating.Rating",
|
|
"format": "int32"
|
|
},
|
|
"sortOptions": {
|
|
"$ref": "#/components/schemas/SortOptions"
|
|
},
|
|
"ageRating": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"description": "Age Ratings. Empty list will return everything back",
|
|
"nullable": true
|
|
},
|
|
"languages": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "Languages (ISO 639-1 code) to filter by. Empty list will return everything back",
|
|
"nullable": true
|
|
},
|
|
"publicationStatus": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PublicationStatus"
|
|
},
|
|
"description": "Publication statuses to filter by. Empty list will return everything back",
|
|
"nullable": true
|
|
},
|
|
"seriesNameQuery": {
|
|
"type": "string",
|
|
"description": "An optional name string to filter by. Empty string will ignore.",
|
|
"nullable": true
|
|
},
|
|
"releaseYearRange": {
|
|
"$ref": "#/components/schemas/Int32Range"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"FolderPath": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"lastScanned": {
|
|
"type": "string",
|
|
"description": "Used when scanning to see if we can skip if nothing has changed",
|
|
"format": "date-time"
|
|
},
|
|
"library": {
|
|
"$ref": "#/components/schemas/Library"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"Genre": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"normalizedTitle": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"seriesMetadatas": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesMetadata"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"chapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Chapter"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"GenreTagDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"HourEstimateRangeDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"minHours": {
|
|
"type": "integer",
|
|
"description": "Min hours to read the selection",
|
|
"format": "int32"
|
|
},
|
|
"maxHours": {
|
|
"type": "integer",
|
|
"description": "Max hours to read the selection",
|
|
"format": "int32"
|
|
},
|
|
"avgHours": {
|
|
"type": "integer",
|
|
"description": "Estimated average hours to read the selection",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "A range of time to read a selection (series, chapter, etc)"
|
|
},
|
|
"Int32Range": {
|
|
"type": "object",
|
|
"properties": {
|
|
"min": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"max": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a range between two int/float/double"
|
|
},
|
|
"Int32StatCount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"InviteUserDto": {
|
|
"required": [
|
|
"email"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"roles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "List of Roles to assign to user. If admin not present, Pleb will be applied.\r\nIf admin present, all libraries will be granted access and will ignore those from DTO.",
|
|
"nullable": true
|
|
},
|
|
"libraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of libraries to grant access to",
|
|
"nullable": true
|
|
},
|
|
"ageRestriction": {
|
|
"$ref": "#/components/schemas/AgeRestrictionDto"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"JobDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "string",
|
|
"description": "Job Id",
|
|
"nullable": true
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Human Readable title for the Job",
|
|
"nullable": true
|
|
},
|
|
"createdAt": {
|
|
"type": "string",
|
|
"description": "When the job was created",
|
|
"format": "date-time",
|
|
"nullable": true
|
|
},
|
|
"lastExecution": {
|
|
"type": "string",
|
|
"description": "Last time the job was run",
|
|
"format": "date-time",
|
|
"nullable": true
|
|
},
|
|
"createdAtUtc": {
|
|
"type": "string",
|
|
"description": "When the job was created",
|
|
"format": "date-time",
|
|
"nullable": true
|
|
},
|
|
"lastExecutionUtc": {
|
|
"type": "string",
|
|
"description": "Last time the job was run",
|
|
"format": "date-time",
|
|
"nullable": true
|
|
},
|
|
"cron": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"JumpKeyDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"size": {
|
|
"type": "integer",
|
|
"description": "Number of items in this Key",
|
|
"format": "int32"
|
|
},
|
|
"key": {
|
|
"type": "string",
|
|
"description": "Code to use in URL (url encoded)",
|
|
"nullable": true
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "What is visible to user",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents an individual button in a Jump Bar"
|
|
},
|
|
"LanguageDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"isoCode": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"LayoutMode": {
|
|
"enum": [
|
|
1,
|
|
2,
|
|
3
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"Library": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"type": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"folderWatching": {
|
|
"type": "boolean",
|
|
"description": "If Folder Watching is enabled for this library"
|
|
},
|
|
"includeInDashboard": {
|
|
"type": "boolean",
|
|
"description": "Include Library series on Dashboard Streams"
|
|
},
|
|
"includeInRecommended": {
|
|
"type": "boolean",
|
|
"description": "Include Library series on Recommended Streams"
|
|
},
|
|
"includeInSearch": {
|
|
"type": "boolean",
|
|
"description": "Include library series in Search"
|
|
},
|
|
"manageCollections": {
|
|
"type": "boolean",
|
|
"description": "Should this library create and manage collections from Metadata"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastScanned": {
|
|
"type": "string",
|
|
"description": "Last time Library was scanned",
|
|
"format": "date-time"
|
|
},
|
|
"folders": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FolderPath"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"appUsers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUser"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"series": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Series"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"LibraryDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"lastScanned": {
|
|
"type": "string",
|
|
"description": "Last time Library was scanned",
|
|
"format": "date-time"
|
|
},
|
|
"type": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "An optional Cover Image or null",
|
|
"nullable": true
|
|
},
|
|
"folderWatching": {
|
|
"type": "boolean",
|
|
"description": "If Folder Watching is enabled for this library"
|
|
},
|
|
"includeInDashboard": {
|
|
"type": "boolean",
|
|
"description": "Include Library series on Dashboard Streams"
|
|
},
|
|
"includeInRecommended": {
|
|
"type": "boolean",
|
|
"description": "Include Library series on Recommended Streams"
|
|
},
|
|
"manageCollections": {
|
|
"type": "boolean",
|
|
"description": "Should this library create and manage collections from Metadata"
|
|
},
|
|
"includeInSearch": {
|
|
"type": "boolean",
|
|
"description": "Include library series in Search"
|
|
},
|
|
"folders": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"LibraryDtoICount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"$ref": "#/components/schemas/LibraryDto"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"LibraryType": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"LoginDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"username": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MangaFile": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"filePath": {
|
|
"type": "string",
|
|
"description": "Absolute path to the archive file",
|
|
"nullable": true
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"description": "Number of pages for the given file",
|
|
"format": "int32"
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"bytes": {
|
|
"type": "integer",
|
|
"description": "How many bytes make up this file",
|
|
"format": "int64"
|
|
},
|
|
"extension": {
|
|
"type": "string",
|
|
"description": "File extension",
|
|
"nullable": true
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"description": "Last time underlying file was modified",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastFileAnalysis": {
|
|
"type": "string",
|
|
"description": "Last time file analysis ran on this file",
|
|
"format": "date-time"
|
|
},
|
|
"lastFileAnalysisUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"chapter": {
|
|
"$ref": "#/components/schemas/Chapter"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a wrapper to the underlying file. This provides information around file, like number of pages, format, etc."
|
|
},
|
|
"MangaFileDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"filePath": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"bytes": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MangaFormat": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4
|
|
],
|
|
"type": "integer",
|
|
"description": "Represents the format of the file",
|
|
"format": "int32"
|
|
},
|
|
"MangaFormatStatCount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MarkMultipleSeriesAsReadDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MarkReadDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MarkVolumeReadDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"MarkVolumesReadDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"volumeIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of Volumes to mark read",
|
|
"nullable": true
|
|
},
|
|
"chapterIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of additional Chapters to mark as read",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "This is used for bulk updating a set of volume and or chapters in one go"
|
|
},
|
|
"MemberDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"username": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"ageRestriction": {
|
|
"$ref": "#/components/schemas/AgeRestrictionDto"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastActive": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"libraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LibraryDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"roles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a member of a Kavita server."
|
|
},
|
|
"MigrateUserEmailDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"username": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"sendEmail": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"PageLayoutMode": {
|
|
"enum": [
|
|
0,
|
|
1
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"PageSplitOption": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2,
|
|
3
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"Person": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"normalizedName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"role": {
|
|
"$ref": "#/components/schemas/PersonRole"
|
|
},
|
|
"seriesMetadatas": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesMetadata"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"chapterMetadatas": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Chapter"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"PersonDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"role": {
|
|
"$ref": "#/components/schemas/PersonRole"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"PersonRole": {
|
|
"enum": [
|
|
1,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"ProgressDto": {
|
|
"required": [
|
|
"chapterId",
|
|
"libraryId",
|
|
"pageNum",
|
|
"seriesId",
|
|
"volumeId"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"pageNum": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"bookScrollId": {
|
|
"type": "string",
|
|
"description": "For EPUB reader, this can be an optional string of the id of a part marker, to help resume reading position\r\non pages that combine multiple \"chapters\".",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"PublicationStatus": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"PublicationStatusStatCount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"$ref": "#/components/schemas/PublicationStatus"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ReadHistoryEvent": {
|
|
"type": "object",
|
|
"properties": {
|
|
"userId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"userName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"readDate": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a single User's reading event"
|
|
},
|
|
"ReadStatus": {
|
|
"type": "object",
|
|
"properties": {
|
|
"notRead": {
|
|
"type": "boolean"
|
|
},
|
|
"inProgress": {
|
|
"type": "boolean"
|
|
},
|
|
"read": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents the Reading Status. This is a flag and allows multiple statues"
|
|
},
|
|
"ReaderMode": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"ReadingDirection": {
|
|
"enum": [
|
|
0,
|
|
1
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"ReadingList": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"normalizedTitle": {
|
|
"type": "string",
|
|
"description": "A normalized string used to check if the reading list already exists in the DB",
|
|
"nullable": true
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"promoted": {
|
|
"type": "boolean",
|
|
"description": "Reading lists that are promoted are only done by admins"
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "Absolute path to the (managed) image file",
|
|
"nullable": true
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"items": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListItem"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"appUserId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"appUser": {
|
|
"$ref": "#/components/schemas/AppUser"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "This is a collection of API.Entities.ReadingListItem which represent individual chapters and an order."
|
|
},
|
|
"ReadingListDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"promoted": {
|
|
"type": "boolean",
|
|
"description": "Reading lists that are promoted are only done by admins"
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "This is used to tell the UI if it should request a Cover Image or not. If null or empty, it has not been set.",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ReadingListItem": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"order": {
|
|
"type": "integer",
|
|
"description": "Order of the chapter within a Reading List",
|
|
"format": "int32"
|
|
},
|
|
"readingList": {
|
|
"$ref": "#/components/schemas/ReadingList"
|
|
},
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"series": {
|
|
"$ref": "#/components/schemas/Series"
|
|
},
|
|
"volume": {
|
|
"$ref": "#/components/schemas/Volume"
|
|
},
|
|
"chapter": {
|
|
"$ref": "#/components/schemas/Chapter"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ReadingListItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"order": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"seriesFormat": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"pagesRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"pagesTotal": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"chapterTitleName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"volumeNumber": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryType": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"libraryName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"releaseDate": {
|
|
"type": "string",
|
|
"description": "Release Date from Chapter",
|
|
"format": "date-time"
|
|
},
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"description": "Used internally only",
|
|
"format": "int32"
|
|
},
|
|
"lastReadingProgressUtc": {
|
|
"type": "string",
|
|
"description": "The last time a reading list item (underlying chapter) was read by current authenticated user",
|
|
"format": "date-time"
|
|
},
|
|
"fileSize": {
|
|
"type": "integer",
|
|
"description": "File size of underlying item",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"RecentlyAddedItemDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryType": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "This will automatically map to Volume X, Chapter Y, etc.",
|
|
"nullable": true
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"description": "Chapter Id if this is a chapter. Not guaranteed to be set.",
|
|
"format": "int32"
|
|
},
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"description": "Volume Id if this is a chapter. Not guaranteed to be set.",
|
|
"format": "int32"
|
|
},
|
|
"id": {
|
|
"type": "integer",
|
|
"description": "This is used only on the UI. It is just index of being added.",
|
|
"format": "int32"
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "A mesh of data for Recently added volume/chapters"
|
|
},
|
|
"RefreshSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"description": "Library Id series belongs to",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"description": "Series Id",
|
|
"format": "int32"
|
|
},
|
|
"forceUpdate": {
|
|
"type": "boolean",
|
|
"description": "Should the task force opening/re-calculation."
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Used for running some task against a Series."
|
|
},
|
|
"RegisterDto": {
|
|
"required": [
|
|
"password",
|
|
"username"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"username": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"description": "An email to register with. Optional. Provides Forgot Password functionality",
|
|
"nullable": true
|
|
},
|
|
"password": {
|
|
"maxLength": 32,
|
|
"minLength": 6,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"RelatedSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"sourceSeriesId": {
|
|
"type": "integer",
|
|
"description": "The parent relationship Series",
|
|
"format": "int32"
|
|
},
|
|
"sequels": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"prequels": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"spinOffs": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"adaptations": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"sideStories": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"characters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"contains": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"others": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"alternativeSettings": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"alternativeVersions": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"doujinshis": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"parent": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"editions": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"RelationKind": {
|
|
"enum": [
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13
|
|
],
|
|
"type": "integer",
|
|
"description": "Represents a relationship between Series",
|
|
"format": "int32"
|
|
},
|
|
"RemoveBookmarkForSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ResetPasswordDto": {
|
|
"required": [
|
|
"password",
|
|
"userName"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"userName": {
|
|
"minLength": 1,
|
|
"type": "string",
|
|
"description": "The Username of the User"
|
|
},
|
|
"password": {
|
|
"maxLength": 32,
|
|
"minLength": 6,
|
|
"type": "string",
|
|
"description": "The new password"
|
|
},
|
|
"oldPassword": {
|
|
"type": "string",
|
|
"description": "The old, existing password. If an admin is performing the change, this is not required. Otherwise, it is.",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ScalingOption": {
|
|
"enum": [
|
|
0,
|
|
1,
|
|
2,
|
|
3
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"ScanFolderDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"apiKey": {
|
|
"type": "string",
|
|
"description": "Api key for a user with Admin permissions",
|
|
"nullable": true
|
|
},
|
|
"folderPath": {
|
|
"type": "string",
|
|
"description": "Folder Path to Scan",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "DTO for requesting a folder to be scanned"
|
|
},
|
|
"SearchResultDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"originalName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"sortName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"localizedName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"libraryName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SearchResultGroupDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"libraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LibraryDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"series": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SearchResultDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"collections": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"readingLists": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ReadingListDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"persons": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"genres": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/GenreTagDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TagDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"files": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/MangaFileDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"chapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents all Search results for a query"
|
|
},
|
|
"SendToDeviceDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"deviceId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapterIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"Series": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "The UI visible Name of the Series. This may or may not be the same as the OriginalName",
|
|
"nullable": true
|
|
},
|
|
"normalizedName": {
|
|
"type": "string",
|
|
"description": "Used internally for name matching. M:API.Services.Tasks.Scanner.Parser.Parser.Normalize(System.String)",
|
|
"nullable": true
|
|
},
|
|
"normalizedLocalizedName": {
|
|
"type": "string",
|
|
"description": "Used internally for localized name matching. M:API.Services.Tasks.Scanner.Parser.Parser.Normalize(System.String)",
|
|
"nullable": true
|
|
},
|
|
"sortName": {
|
|
"type": "string",
|
|
"description": "The name used to sort the Series. By default, will be the same as Name.",
|
|
"nullable": true
|
|
},
|
|
"localizedName": {
|
|
"type": "string",
|
|
"description": "Name in original language (Japanese for Manga). By default, will be same as Name.",
|
|
"nullable": true
|
|
},
|
|
"originalName": {
|
|
"type": "string",
|
|
"description": "Original Name on disk. Not exposed to UI.",
|
|
"nullable": true
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"description": "Time of creation",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"description": "Whenever a modification occurs. Ie) New volumes, removed volumes, title update, etc",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "Absolute path to the (managed) image file",
|
|
"nullable": true
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean",
|
|
"description": "Denotes if the CoverImage has been overridden by the user. If so, it will not be updated during normal scan operations."
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"description": "Sum of all Volume page counts",
|
|
"format": "int32"
|
|
},
|
|
"folderPath": {
|
|
"type": "string",
|
|
"description": "Highest path (that is under library root) that contains the series.",
|
|
"nullable": true
|
|
},
|
|
"lastFolderScanned": {
|
|
"type": "string",
|
|
"description": "Last time the folder was scanned",
|
|
"format": "date-time"
|
|
},
|
|
"lastFolderScannedUtc": {
|
|
"type": "string",
|
|
"description": "Last time the folder was scanned in Utc",
|
|
"format": "date-time"
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"nameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"sortNameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"localizedNameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"lastChapterAdded": {
|
|
"type": "string",
|
|
"description": "When a Chapter was last added onto the Series",
|
|
"format": "date-time"
|
|
},
|
|
"lastChapterAddedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"wordCount": {
|
|
"type": "integer",
|
|
"description": "Total Word count of all chapters in this chapter.",
|
|
"format": "int64"
|
|
},
|
|
"minHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"maxHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"avgHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"metadata": {
|
|
"$ref": "#/components/schemas/SeriesMetadata"
|
|
},
|
|
"ratings": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserRating"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"progress": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/AppUserProgress"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"relations": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesRelation"
|
|
},
|
|
"description": "Relations to other Series, like Sequels, Prequels, etc",
|
|
"nullable": true
|
|
},
|
|
"relationOf": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesRelation"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"volumes": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Volume"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"library": {
|
|
"$ref": "#/components/schemas/Library"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SeriesByIdsDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SeriesDetailDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"specials": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
},
|
|
"description": "Specials for the Series. These will have their title and range cleaned to remove the special marker and prepare",
|
|
"nullable": true
|
|
},
|
|
"chapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
},
|
|
"description": "All Chapters, excluding Specials and single chapters (0 chapter) for a volume",
|
|
"nullable": true
|
|
},
|
|
"volumes": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/VolumeDto"
|
|
},
|
|
"description": "Just the Volumes for the Series (Excludes Volume 0)",
|
|
"nullable": true
|
|
},
|
|
"storylineChapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
},
|
|
"description": "These are chapters that are in Volume 0 and should be read AFTER the volumes",
|
|
"nullable": true
|
|
},
|
|
"unreadCount": {
|
|
"type": "integer",
|
|
"description": "How many chapters are unread",
|
|
"format": "int32"
|
|
},
|
|
"totalCount": {
|
|
"type": "integer",
|
|
"description": "How many chapters are there",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "This is a special DTO for a UI page in Kavita. This performs sorting and grouping and returns exactly what UI requires for layout.\r\nThis is subject to change, do not rely on this Data model."
|
|
},
|
|
"SeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"originalName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"localizedName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"sortName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"pagesRead": {
|
|
"type": "integer",
|
|
"description": "Sum of pages read from linked Volumes. Calculated at API-time.",
|
|
"format": "int32"
|
|
},
|
|
"latestReadDate": {
|
|
"type": "string",
|
|
"description": "DateTime representing last time the series was Read. Calculated at API-time.",
|
|
"format": "date-time"
|
|
},
|
|
"lastChapterAdded": {
|
|
"type": "string",
|
|
"description": "DateTime representing last time a chapter was added to the Series",
|
|
"format": "date-time"
|
|
},
|
|
"userRating": {
|
|
"type": "integer",
|
|
"description": "Rating from logged in user. Calculated at API-time.",
|
|
"format": "int32"
|
|
},
|
|
"userReview": {
|
|
"type": "string",
|
|
"description": "Review from logged in user. Calculated at API-time.",
|
|
"nullable": true
|
|
},
|
|
"format": {
|
|
"$ref": "#/components/schemas/MangaFormat"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"nameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"sortNameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"localizedNameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"wordCount": {
|
|
"type": "integer",
|
|
"description": "Total number of words for the series. Only applies to epubs.",
|
|
"format": "int64"
|
|
},
|
|
"libraryId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"libraryName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"minHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"maxHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"avgHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"folderPath": {
|
|
"type": "string",
|
|
"description": "The highest level folder for this Series",
|
|
"nullable": true
|
|
},
|
|
"lastFolderScanned": {
|
|
"type": "string",
|
|
"description": "The last time the folder for this series was scanned",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SeriesDtoICount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SeriesMetadata": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"collectionTags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTag"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"genres": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Genre"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Tag"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"people": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Person"
|
|
},
|
|
"description": "All people attached at a Series level.",
|
|
"nullable": true
|
|
},
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"releaseYear": {
|
|
"type": "integer",
|
|
"description": "Earliest Year from all chapters",
|
|
"format": "int32"
|
|
},
|
|
"language": {
|
|
"type": "string",
|
|
"description": "Language of the content (BCP-47 code)",
|
|
"nullable": true
|
|
},
|
|
"totalCount": {
|
|
"type": "integer",
|
|
"description": "Total number of issues/volumes in the series",
|
|
"format": "int32"
|
|
},
|
|
"maxCount": {
|
|
"type": "integer",
|
|
"description": "Max number of issues/volumes in the series (Max of Volume/Issue field in ComicInfo)",
|
|
"format": "int32"
|
|
},
|
|
"publicationStatus": {
|
|
"$ref": "#/components/schemas/PublicationStatus"
|
|
},
|
|
"languageLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"summaryLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"ageRatingLocked": {
|
|
"type": "boolean",
|
|
"description": "Locked by user so metadata updates from scan loop will not override AgeRating"
|
|
},
|
|
"publicationStatusLocked": {
|
|
"type": "boolean",
|
|
"description": "Locked by user so metadata updates from scan loop will not override PublicationStatus"
|
|
},
|
|
"genresLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"tagsLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"writerLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"characterLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"coloristLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"editorLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"inkerLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"lettererLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"pencillerLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"publisherLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"translatorLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"coverArtistLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"releaseYearLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"series": {
|
|
"$ref": "#/components/schemas/Series"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"rowVersion": {
|
|
"type": "integer",
|
|
"format": "int32",
|
|
"readOnly": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SeriesMetadataDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"collectionTags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
},
|
|
"description": "Collections the Series belongs to",
|
|
"nullable": true
|
|
},
|
|
"genres": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/GenreTagDto"
|
|
},
|
|
"description": "Genres for the Series",
|
|
"nullable": true
|
|
},
|
|
"tags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/TagDto"
|
|
},
|
|
"description": "Collection of all Tags from underlying chapters for a Series",
|
|
"nullable": true
|
|
},
|
|
"writers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"coverArtists": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"publishers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"characters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"pencillers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"inkers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"colorists": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"letterers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"editors": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"translators": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PersonDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"releaseYear": {
|
|
"type": "integer",
|
|
"description": "Earliest Year from all chapters",
|
|
"format": "int32"
|
|
},
|
|
"language": {
|
|
"type": "string",
|
|
"description": "Language of the content (BCP-47 code)",
|
|
"nullable": true
|
|
},
|
|
"maxCount": {
|
|
"type": "integer",
|
|
"description": "Max number of issues/volumes in the series (Max of Volume/Issue field in ComicInfo)",
|
|
"format": "int32"
|
|
},
|
|
"totalCount": {
|
|
"type": "integer",
|
|
"description": "Total number of issues/volumes for the series",
|
|
"format": "int32"
|
|
},
|
|
"publicationStatus": {
|
|
"$ref": "#/components/schemas/PublicationStatus"
|
|
},
|
|
"languageLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"summaryLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"ageRatingLocked": {
|
|
"type": "boolean",
|
|
"description": "Locked by user so metadata updates from scan loop will not override AgeRating"
|
|
},
|
|
"publicationStatusLocked": {
|
|
"type": "boolean",
|
|
"description": "Locked by user so metadata updates from scan loop will not override PublicationStatus"
|
|
},
|
|
"genresLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"tagsLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"writersLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"charactersLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"coloristsLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"editorsLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"inkersLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"letterersLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"pencillersLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"publishersLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"translatorsLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"coverArtistsLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"releaseYearLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SeriesRelation": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"relationKind": {
|
|
"$ref": "#/components/schemas/RelationKind"
|
|
},
|
|
"targetSeries": {
|
|
"$ref": "#/components/schemas/Series"
|
|
},
|
|
"targetSeriesId": {
|
|
"type": "integer",
|
|
"description": "A is Sequel to B. In this example, TargetSeries is A. B will hold the foreign key.",
|
|
"format": "int32"
|
|
},
|
|
"series": {
|
|
"$ref": "#/components/schemas/Series"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "A relation flows between one series and another.\r\nSeries ---kind---> target"
|
|
},
|
|
"ServerInfoDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"installId": {
|
|
"type": "string",
|
|
"description": "Unique Id that represents a unique install",
|
|
"nullable": true
|
|
},
|
|
"os": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"isDocker": {
|
|
"type": "boolean",
|
|
"description": "If the Kavita install is using Docker"
|
|
},
|
|
"dotnetVersion": {
|
|
"type": "string",
|
|
"description": "Version of .NET instance is running",
|
|
"nullable": true
|
|
},
|
|
"kavitaVersion": {
|
|
"type": "string",
|
|
"description": "Version of Kavita",
|
|
"nullable": true
|
|
},
|
|
"numOfCores": {
|
|
"type": "integer",
|
|
"description": "Number of Cores on the instance",
|
|
"format": "int32"
|
|
},
|
|
"numberOfLibraries": {
|
|
"type": "integer",
|
|
"description": "The number of libraries on the instance",
|
|
"format": "int32"
|
|
},
|
|
"hasBookmarks": {
|
|
"type": "boolean",
|
|
"description": "Does any user have bookmarks"
|
|
},
|
|
"activeSiteTheme": {
|
|
"type": "string",
|
|
"description": "The site theme the install is using",
|
|
"nullable": true
|
|
},
|
|
"mangaReaderMode": {
|
|
"$ref": "#/components/schemas/ReaderMode"
|
|
},
|
|
"numberOfUsers": {
|
|
"type": "integer",
|
|
"description": "Number of users on the install",
|
|
"format": "int32"
|
|
},
|
|
"numberOfCollections": {
|
|
"type": "integer",
|
|
"description": "Number of collections on the install",
|
|
"format": "int32"
|
|
},
|
|
"numberOfReadingLists": {
|
|
"type": "integer",
|
|
"description": "Number of reading lists on the install (Sum of all users)",
|
|
"format": "int32"
|
|
},
|
|
"opdsEnabled": {
|
|
"type": "boolean",
|
|
"description": "Is OPDS enabled"
|
|
},
|
|
"totalFiles": {
|
|
"type": "integer",
|
|
"description": "Total number of files in the instance",
|
|
"format": "int32"
|
|
},
|
|
"totalGenres": {
|
|
"type": "integer",
|
|
"description": "Total number of Genres in the instance",
|
|
"format": "int32"
|
|
},
|
|
"totalPeople": {
|
|
"type": "integer",
|
|
"description": "Total number of People in the instance",
|
|
"format": "int32"
|
|
},
|
|
"storeBookmarksAsWebP": {
|
|
"type": "boolean",
|
|
"description": "Is this instance storing bookmarks as WebP"
|
|
},
|
|
"usersOnCardLayout": {
|
|
"type": "integer",
|
|
"description": "Number of users on this instance using Card Layout",
|
|
"format": "int32"
|
|
},
|
|
"usersOnListLayout": {
|
|
"type": "integer",
|
|
"description": "Number of users on this instance using List Layout",
|
|
"format": "int32"
|
|
},
|
|
"maxSeriesInALibrary": {
|
|
"type": "integer",
|
|
"description": "Max number of Series for any library on the instance",
|
|
"format": "int32"
|
|
},
|
|
"maxVolumesInASeries": {
|
|
"type": "integer",
|
|
"description": "Max number of Volumes for any library on the instance",
|
|
"format": "int32"
|
|
},
|
|
"maxChaptersInASeries": {
|
|
"type": "integer",
|
|
"description": "Max number of Chapters for any library on the instance",
|
|
"format": "int32"
|
|
},
|
|
"usingSeriesRelationships": {
|
|
"type": "boolean",
|
|
"description": "Does this instance have relationships setup between series"
|
|
},
|
|
"mangaReaderBackgroundColors": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"description": "A list of background colors set on the instance",
|
|
"nullable": true
|
|
},
|
|
"mangaReaderPageSplittingModes": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/PageSplitOption"
|
|
},
|
|
"description": "A list of Page Split defaults being used on the instance",
|
|
"nullable": true
|
|
},
|
|
"mangaReaderLayoutModes": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LayoutMode"
|
|
},
|
|
"description": "A list of Layout Mode defaults being used on the instance",
|
|
"nullable": true
|
|
},
|
|
"fileFormats": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/FileFormatDto"
|
|
},
|
|
"description": "A list of file formats existing in the instance",
|
|
"nullable": true
|
|
},
|
|
"usingRestrictedProfiles": {
|
|
"type": "boolean",
|
|
"description": "If there is at least one user that is using an age restricted profile on the instance"
|
|
},
|
|
"usersWithEmulateComicBook": {
|
|
"type": "integer",
|
|
"description": "Number of users using the Emulate Comic Book setting",
|
|
"format": "int32"
|
|
},
|
|
"percentOfLibrariesWithFolderWatchingEnabled": {
|
|
"type": "number",
|
|
"description": "Percent (0.0-1.0) of libraries with folder watching enabled",
|
|
"format": "float"
|
|
},
|
|
"percentOfLibrariesIncludedInSearch": {
|
|
"type": "number",
|
|
"description": "Percent (0.0-1.0) of libraries included in Search",
|
|
"format": "float"
|
|
},
|
|
"percentOfLibrariesIncludedInRecommended": {
|
|
"type": "number",
|
|
"description": "Percent (0.0-1.0) of libraries included in Recommended",
|
|
"format": "float"
|
|
},
|
|
"percentOfLibrariesIncludedInDashboard": {
|
|
"type": "number",
|
|
"description": "Percent (0.0-1.0) of libraries included in Dashboard",
|
|
"format": "float"
|
|
},
|
|
"totalReadingHours": {
|
|
"type": "integer",
|
|
"description": "Total reading hours of all users",
|
|
"format": "int64"
|
|
},
|
|
"storeCoversAsWebP": {
|
|
"type": "boolean",
|
|
"description": "Is the Server saving covers as WebP"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents information about a Kavita Installation"
|
|
},
|
|
"ServerSettingDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cacheDirectory": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"taskScan": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"loggingLevel": {
|
|
"type": "string",
|
|
"description": "Logging level for server. Managed in appsettings.json.",
|
|
"nullable": true
|
|
},
|
|
"taskBackup": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"port": {
|
|
"type": "integer",
|
|
"description": "Port the server listens on. Managed in appsettings.json.",
|
|
"format": "int32"
|
|
},
|
|
"ipAddresses": {
|
|
"type": "string",
|
|
"description": "Comma separated list of ip addresses the server listens on. Managed in appsettings.json",
|
|
"nullable": true
|
|
},
|
|
"allowStatCollection": {
|
|
"type": "boolean",
|
|
"description": "Allows anonymous information to be collected and sent to KavitaStats"
|
|
},
|
|
"enableOpds": {
|
|
"type": "boolean",
|
|
"description": "Enables OPDS connections to be made to the server."
|
|
},
|
|
"baseUrl": {
|
|
"type": "string",
|
|
"description": "Base Url for the kavita. Requires restart to take effect.",
|
|
"nullable": true
|
|
},
|
|
"bookmarksDirectory": {
|
|
"type": "string",
|
|
"description": "Where Bookmarks are stored.",
|
|
"nullable": true
|
|
},
|
|
"emailServiceUrl": {
|
|
"type": "string",
|
|
"description": "Email service to use for the invite user flow, forgot password, etc.",
|
|
"nullable": true
|
|
},
|
|
"installVersion": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"installId": {
|
|
"type": "string",
|
|
"description": "Represents a unique Id to this Kavita installation. Only used in Stats to identify unique installs.",
|
|
"nullable": true
|
|
},
|
|
"convertBookmarkToWebP": {
|
|
"type": "boolean",
|
|
"description": "If the server should save bookmarks as WebP encoding"
|
|
},
|
|
"totalBackups": {
|
|
"type": "integer",
|
|
"description": "The amount of Backups before cleanup",
|
|
"format": "int32"
|
|
},
|
|
"enableFolderWatching": {
|
|
"type": "boolean",
|
|
"description": "If Kavita should watch the library folders and process changes"
|
|
},
|
|
"totalLogs": {
|
|
"type": "integer",
|
|
"description": "Total number of days worth of logs to keep at a given time.",
|
|
"format": "int32"
|
|
},
|
|
"convertCoverToWebP": {
|
|
"type": "boolean",
|
|
"description": "If the server should save covers as WebP encoding"
|
|
},
|
|
"hostName": {
|
|
"type": "string",
|
|
"description": "The Host name (ie Reverse proxy domain name) for the server",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ServerStatisticsDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"chapterCount": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"volumeCount": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"seriesCount": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"totalFiles": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"totalSize": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"totalGenres": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"totalTags": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"totalPeople": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"totalReadingTime": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"mostReadSeries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDtoICount"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"mostPopularSeries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDtoICount"
|
|
},
|
|
"description": "Total users who have started/reading/read per series",
|
|
"nullable": true
|
|
},
|
|
"mostActiveUsers": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/UserDtoICount"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"mostActiveLibraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LibraryDtoICount"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"recentlyRead": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesDto"
|
|
},
|
|
"description": "Last 5 Series read",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SingleStatCount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"type": "number",
|
|
"format": "float"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"SiteTheme": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Name of the Theme",
|
|
"nullable": true
|
|
},
|
|
"normalizedName": {
|
|
"type": "string",
|
|
"description": "Normalized name for lookups",
|
|
"nullable": true
|
|
},
|
|
"fileName": {
|
|
"type": "string",
|
|
"description": "File path to the content. Stored under API.Services.DirectoryService.SiteThemeDirectory.\r\nMust be a .css file",
|
|
"nullable": true
|
|
},
|
|
"isDefault": {
|
|
"type": "boolean",
|
|
"description": "Only one theme can have this. Will auto-set this as default for new user accounts"
|
|
},
|
|
"provider": {
|
|
"$ref": "#/components/schemas/ThemeProvider"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a set of css overrides the user can upload to Kavita and will load into webui"
|
|
},
|
|
"SiteThemeDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "Name of the Theme",
|
|
"nullable": true
|
|
},
|
|
"fileName": {
|
|
"type": "string",
|
|
"description": "File path to the content. Stored under API.Services.DirectoryService.SiteThemeDirectory.\r\nMust be a .css file",
|
|
"nullable": true
|
|
},
|
|
"isDefault": {
|
|
"type": "boolean",
|
|
"description": "Only one theme can have this. Will auto-set this as default for new user accounts"
|
|
},
|
|
"provider": {
|
|
"$ref": "#/components/schemas/ThemeProvider"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"selector": {
|
|
"type": "string",
|
|
"nullable": true,
|
|
"readOnly": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Represents a set of css overrides the user can upload to Kavita and will load into webui"
|
|
},
|
|
"SortField": {
|
|
"enum": [
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"SortOptions": {
|
|
"type": "object",
|
|
"properties": {
|
|
"sortField": {
|
|
"$ref": "#/components/schemas/SortField"
|
|
},
|
|
"isAscending": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Sorting Options for a query"
|
|
},
|
|
"Tag": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"normalizedTitle": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"seriesMetadatas": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SeriesMetadata"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"chapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Chapter"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"TagDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"TestEmailDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"ThemeProvider": {
|
|
"enum": [
|
|
1,
|
|
2
|
|
],
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"TokenRequestDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"token": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"refreshToken": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"TopReadDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"userId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"username": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"comicsTime": {
|
|
"type": "integer",
|
|
"description": "Amount of time read on Comic libraries",
|
|
"format": "int64"
|
|
},
|
|
"booksTime": {
|
|
"type": "integer",
|
|
"description": "Amount of time read on",
|
|
"format": "int64"
|
|
},
|
|
"mangaTime": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateAgeRestrictionDto": {
|
|
"required": [
|
|
"ageRating",
|
|
"includeUnknowns"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"ageRating": {
|
|
"$ref": "#/components/schemas/AgeRating"
|
|
},
|
|
"includeUnknowns": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateDefaultThemeDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"themeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateDeviceDto": {
|
|
"required": [
|
|
"emailAddress",
|
|
"id",
|
|
"name",
|
|
"platform"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"platform": {
|
|
"$ref": "#/components/schemas/DevicePlatform"
|
|
},
|
|
"emailAddress": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateEmailDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"email": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"password": {
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateLibraryDto": {
|
|
"required": [
|
|
"createCollections",
|
|
"folders",
|
|
"folderWatching",
|
|
"id",
|
|
"includeInDashboard",
|
|
"includeInRecommended",
|
|
"includeInSearch",
|
|
"name",
|
|
"type"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"type": {
|
|
"$ref": "#/components/schemas/LibraryType"
|
|
},
|
|
"folders": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
"folderWatching": {
|
|
"type": "boolean"
|
|
},
|
|
"includeInDashboard": {
|
|
"type": "boolean"
|
|
},
|
|
"includeInRecommended": {
|
|
"type": "boolean"
|
|
},
|
|
"includeInSearch": {
|
|
"type": "boolean"
|
|
},
|
|
"createCollections": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateLibraryForUserDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"username": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"selectedLibraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/LibraryDto"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateNotificationDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"currentVersion": {
|
|
"type": "string",
|
|
"description": "Current installed Version",
|
|
"nullable": true
|
|
},
|
|
"updateVersion": {
|
|
"type": "string",
|
|
"description": "Semver of the release version\r\n<example>0.4.3</example>",
|
|
"nullable": true
|
|
},
|
|
"updateBody": {
|
|
"type": "string",
|
|
"description": "Release body in HTML",
|
|
"nullable": true
|
|
},
|
|
"updateTitle": {
|
|
"type": "string",
|
|
"description": "Title of the release",
|
|
"nullable": true
|
|
},
|
|
"updateUrl": {
|
|
"type": "string",
|
|
"description": "Github Url",
|
|
"nullable": true
|
|
},
|
|
"isDocker": {
|
|
"type": "boolean",
|
|
"description": "If this install is within Docker"
|
|
},
|
|
"isPrerelease": {
|
|
"type": "boolean",
|
|
"description": "Is this a pre-release"
|
|
},
|
|
"publishDate": {
|
|
"type": "string",
|
|
"description": "Date of the publish",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "Update Notification denoting a new release available for user to update to"
|
|
},
|
|
"UpdateReadingListByChapterDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"chapterId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateReadingListByMultipleDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"volumeIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"chapterIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateReadingListByMultipleSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateReadingListBySeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateReadingListByVolumeDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"volumeId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateReadingListDto": {
|
|
"required": [
|
|
"readingListId"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"summary": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"promoted": {
|
|
"type": "boolean"
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateReadingListPosition": {
|
|
"required": [
|
|
"readingListId",
|
|
"readingListItemId",
|
|
"toPosition"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"readingListId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"readingListItemId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"fromPosition": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"toPosition": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "DTO for moving a reading list item to another position within the same list"
|
|
},
|
|
"UpdateRelatedSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"adaptations": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"characters": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"contains": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"others": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"prequels": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"sequels": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"sideStories": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"spinOffs": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"alternativeSettings": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"alternativeVersions": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"doujinshis": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"editions": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateSeriesDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"localizedName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"sortName": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"coverImageLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"nameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"sortNameLocked": {
|
|
"type": "boolean"
|
|
},
|
|
"localizedNameLocked": {
|
|
"type": "boolean"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateSeriesForTagDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"tag": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
},
|
|
"seriesIdsToRemove": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateSeriesMetadataDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesMetadata": {
|
|
"$ref": "#/components/schemas/SeriesMetadataDto"
|
|
},
|
|
"collectionTags": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/CollectionTagDto"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateSeriesRatingDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"userRating": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"userReview": {
|
|
"maxLength": 1000,
|
|
"type": "string",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateUserDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"userId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"username": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"roles": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "string"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"libraries": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "A list of libraries to grant access to",
|
|
"nullable": true
|
|
},
|
|
"ageRestriction": {
|
|
"$ref": "#/components/schemas/AgeRestrictionDto"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UpdateWantToReadDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"seriesIds": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"description": "List of Series Ids that will be Added/Removed",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false,
|
|
"description": "A list of Series to pass when working with Want To Read APIs"
|
|
},
|
|
"UploadFileDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"description": "Id of the Entity",
|
|
"format": "int32"
|
|
},
|
|
"url": {
|
|
"type": "string",
|
|
"description": "Base Url encoding of the file to upload from (can be null)",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UploadUrlDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"url": {
|
|
"type": "string",
|
|
"description": "External url",
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UserDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"username": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"email": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"token": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"refreshToken": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"apiKey": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"preferences": {
|
|
"$ref": "#/components/schemas/UserPreferencesDto"
|
|
},
|
|
"ageRestriction": {
|
|
"$ref": "#/components/schemas/AgeRestrictionDto"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UserDtoICount": {
|
|
"type": "object",
|
|
"properties": {
|
|
"value": {
|
|
"$ref": "#/components/schemas/UserDto"
|
|
},
|
|
"count": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UserPreferencesDto": {
|
|
"required": [
|
|
"autoCloseMenu",
|
|
"backgroundColor",
|
|
"blurUnreadSummaries",
|
|
"bookReaderFontFamily",
|
|
"bookReaderFontSize",
|
|
"bookReaderImmersiveMode",
|
|
"bookReaderLayoutMode",
|
|
"bookReaderLineSpacing",
|
|
"bookReaderMargin",
|
|
"bookReaderReadingDirection",
|
|
"bookReaderTapToPaginate",
|
|
"bookReaderThemeName",
|
|
"emulateBook",
|
|
"globalPageLayoutMode",
|
|
"layoutMode",
|
|
"noTransitions",
|
|
"pageSplitOption",
|
|
"promptForDownloadSize",
|
|
"readerMode",
|
|
"readingDirection",
|
|
"scalingOption",
|
|
"showScreenHints",
|
|
"swipeToPaginate"
|
|
],
|
|
"type": "object",
|
|
"properties": {
|
|
"readingDirection": {
|
|
"$ref": "#/components/schemas/ReadingDirection"
|
|
},
|
|
"scalingOption": {
|
|
"$ref": "#/components/schemas/ScalingOption"
|
|
},
|
|
"pageSplitOption": {
|
|
"$ref": "#/components/schemas/PageSplitOption"
|
|
},
|
|
"readerMode": {
|
|
"$ref": "#/components/schemas/ReaderMode"
|
|
},
|
|
"layoutMode": {
|
|
"$ref": "#/components/schemas/LayoutMode"
|
|
},
|
|
"emulateBook": {
|
|
"type": "boolean",
|
|
"description": "Manga Reader Option: Emulate a book by applying a shadow effect on the pages"
|
|
},
|
|
"backgroundColor": {
|
|
"minLength": 1,
|
|
"type": "string",
|
|
"description": "Manga Reader Option: Background color of the reader"
|
|
},
|
|
"swipeToPaginate": {
|
|
"type": "boolean"
|
|
},
|
|
"autoCloseMenu": {
|
|
"type": "boolean",
|
|
"description": "Manga Reader Option: Allow the menu to close after 6 seconds without interaction"
|
|
},
|
|
"showScreenHints": {
|
|
"type": "boolean",
|
|
"description": "Manga Reader Option: Show screen hints to the user on some actions, ie) pagination direction change"
|
|
},
|
|
"bookReaderMargin": {
|
|
"type": "integer",
|
|
"description": "Book Reader Option: Override extra Margin",
|
|
"format": "int32"
|
|
},
|
|
"bookReaderLineSpacing": {
|
|
"type": "integer",
|
|
"description": "Book Reader Option: Override line-height",
|
|
"format": "int32"
|
|
},
|
|
"bookReaderFontSize": {
|
|
"type": "integer",
|
|
"description": "Book Reader Option: Override font size",
|
|
"format": "int32"
|
|
},
|
|
"bookReaderFontFamily": {
|
|
"minLength": 1,
|
|
"type": "string",
|
|
"description": "Book Reader Option: Maps to the default Kavita font-family (inherit) or an override"
|
|
},
|
|
"bookReaderTapToPaginate": {
|
|
"type": "boolean",
|
|
"description": "Book Reader Option: Allows tapping on side of screens to paginate"
|
|
},
|
|
"bookReaderReadingDirection": {
|
|
"$ref": "#/components/schemas/ReadingDirection"
|
|
},
|
|
"theme": {
|
|
"$ref": "#/components/schemas/SiteTheme"
|
|
},
|
|
"bookReaderThemeName": {
|
|
"minLength": 1,
|
|
"type": "string"
|
|
},
|
|
"bookReaderLayoutMode": {
|
|
"$ref": "#/components/schemas/BookPageLayoutMode"
|
|
},
|
|
"bookReaderImmersiveMode": {
|
|
"type": "boolean",
|
|
"description": "Book Reader Option: A flag that hides the menu-ing system behind a click on the screen. This should be used with tap to paginate, but the app doesn't enforce this."
|
|
},
|
|
"globalPageLayoutMode": {
|
|
"$ref": "#/components/schemas/PageLayoutMode"
|
|
},
|
|
"blurUnreadSummaries": {
|
|
"type": "boolean",
|
|
"description": "UI Site Global Setting: If unread summaries should be blurred until expanded or unless user has read it already"
|
|
},
|
|
"promptForDownloadSize": {
|
|
"type": "boolean",
|
|
"description": "UI Site Global Setting: Should Kavita prompt user to confirm downloads that are greater than 100 MB."
|
|
},
|
|
"noTransitions": {
|
|
"type": "boolean",
|
|
"description": "UI Site Global Setting: Should Kavita disable CSS transitions"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"UserReadStatistics": {
|
|
"type": "object",
|
|
"properties": {
|
|
"totalPagesRead": {
|
|
"type": "integer",
|
|
"description": "Total number of pages read",
|
|
"format": "int64"
|
|
},
|
|
"totalWordsRead": {
|
|
"type": "integer",
|
|
"description": "Total number of words read",
|
|
"format": "int64"
|
|
},
|
|
"timeSpentReading": {
|
|
"type": "integer",
|
|
"description": "Total time spent reading based on estimates",
|
|
"format": "int64"
|
|
},
|
|
"chaptersRead": {
|
|
"type": "integer",
|
|
"format": "int64"
|
|
},
|
|
"lastActive": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"avgHoursPerWeekSpentReading": {
|
|
"type": "number",
|
|
"format": "double"
|
|
},
|
|
"percentReadPerLibrary": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/SingleStatCount"
|
|
},
|
|
"nullable": true
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"Volume": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"description": "A String representation of the volume number. Allows for floats.",
|
|
"nullable": true
|
|
},
|
|
"number": {
|
|
"type": "integer",
|
|
"description": "The minimum number in the Name field in Int form",
|
|
"format": "int32"
|
|
},
|
|
"chapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/Chapter"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"createdUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"lastModifiedUtc": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"coverImage": {
|
|
"type": "string",
|
|
"description": "Absolute path to the (managed) image file",
|
|
"nullable": true
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"description": "Total pages of all chapters in this volume",
|
|
"format": "int32"
|
|
},
|
|
"wordCount": {
|
|
"type": "integer",
|
|
"description": "Total Word count of all chapters in this volume.",
|
|
"format": "int64"
|
|
},
|
|
"minHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"maxHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"avgHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"series": {
|
|
"$ref": "#/components/schemas/Series"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
},
|
|
"VolumeDto": {
|
|
"type": "object",
|
|
"properties": {
|
|
"id": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"number": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"name": {
|
|
"type": "string",
|
|
"nullable": true
|
|
},
|
|
"pages": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"pagesRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"lastModified": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"created": {
|
|
"type": "string",
|
|
"format": "date-time"
|
|
},
|
|
"seriesId": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"chapters": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/components/schemas/ChapterDto"
|
|
},
|
|
"nullable": true
|
|
},
|
|
"minHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"maxHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
},
|
|
"avgHoursToRead": {
|
|
"type": "integer",
|
|
"format": "int32"
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"securitySchemes": {
|
|
"Bearer": {
|
|
"type": "apiKey",
|
|
"description": "Please insert JWT with Bearer into field",
|
|
"name": "Authorization",
|
|
"in": "header"
|
|
}
|
|
}
|
|
},
|
|
"security": [
|
|
{
|
|
"Bearer": [ ]
|
|
}
|
|
],
|
|
"tags": [
|
|
{
|
|
"name": "Account",
|
|
"description": "All Account matters"
|
|
},
|
|
{
|
|
"name": "Collection",
|
|
"description": "APIs for Collections"
|
|
},
|
|
{
|
|
"name": "Device",
|
|
"description": "Responsible interacting and creating Devices"
|
|
},
|
|
{
|
|
"name": "Download",
|
|
"description": "All APIs related to downloading entities from the system. Requires Download Role or Admin Role."
|
|
},
|
|
{
|
|
"name": "Image",
|
|
"description": "Responsible for servicing up images stored in Kavita for entities"
|
|
},
|
|
{
|
|
"name": "Reader",
|
|
"description": "For all things regarding reading, mainly focusing on non-Book related entities"
|
|
},
|
|
{
|
|
"name": "Search",
|
|
"description": "Responsible for the Search interface from the UI"
|
|
},
|
|
{
|
|
"name": "Tachiyomi",
|
|
"description": "All APIs are for Tachiyomi extension and app. They have hacks for our implementation and should not be used for any\r\nother purposes."
|
|
},
|
|
{
|
|
"name": "Upload",
|
|
"description": ""
|
|
},
|
|
{
|
|
"name": "WantToRead",
|
|
"description": "Responsible for all things Want To Read"
|
|
}
|
|
]
|
|
} |