diff --git a/API/API.csproj b/API/API.csproj index f2b82968b..4940379da 100644 --- a/API/API.csproj +++ b/API/API.csproj @@ -12,9 +12,9 @@ latestmajor - - - + + + false diff --git a/API/Controllers/CBLController.cs b/API/Controllers/CBLController.cs index 3d1139c9f..e84ef00e2 100644 --- a/API/Controllers/CBLController.cs +++ b/API/Controllers/CBLController.cs @@ -30,25 +30,25 @@ public class CblController : BaseApiController /// The first step in a cbl import. This validates the cbl file that if an import occured, would it be successful. /// If this returns errors, the cbl will always be rejected by Kavita. /// - /// FormBody with parameter name of cbl + /// FormBody with parameter name of cbl + /// Use comic vine matching or not. Defaults to false /// [HttpPost("validate")] - public async Task> ValidateCbl([FromForm(Name = "cbl")] IFormFile file, - [FromForm(Name = "comicVineMatching")] bool comicVineMatching = false) + public async Task> ValidateCbl(IFormFile cbl, bool comicVineMatching = false) { var userId = User.GetUserId(); try { - var cbl = await SaveAndLoadCblFile(file); - var importSummary = await _readingListService.ValidateCblFile(userId, cbl, comicVineMatching); - importSummary.FileName = file.FileName; + var cblReadingList = await SaveAndLoadCblFile(cbl); + var importSummary = await _readingListService.ValidateCblFile(userId, cblReadingList, comicVineMatching); + importSummary.FileName = cbl.FileName; return Ok(importSummary); } catch (ArgumentNullException) { return Ok(new CblImportSummaryDto() { - FileName = file.FileName, + FileName = cbl.FileName, Success = CblImportResult.Fail, Results = new List() { @@ -63,7 +63,7 @@ public class CblController : BaseApiController { return Ok(new CblImportSummaryDto() { - FileName = file.FileName, + FileName = cbl.FileName, Success = CblImportResult.Fail, Results = new List() { @@ -80,25 +80,26 @@ public class CblController : BaseApiController /// /// Performs the actual import (assuming dryRun = false) /// - /// FormBody with parameter name of cbl + /// FormBody with parameter name of cbl /// If true, will only emulate the import but not perform. This should be done to preview what will happen + /// Use comic vine matching or not. Defaults to false /// [HttpPost("import")] - public async Task> ImportCbl([FromForm(Name = "cbl")] IFormFile file, - [FromForm(Name = "dryRun")] bool dryRun = false, [FromForm(Name = "comicVineMatching")] bool comicVineMatching = false) + public async Task> ImportCbl(IFormFile cbl, bool dryRun = false, bool comicVineMatching = false) { try { var userId = User.GetUserId(); - var cbl = await SaveAndLoadCblFile(file); - var importSummary = await _readingListService.CreateReadingListFromCbl(userId, cbl, dryRun, comicVineMatching); - importSummary.FileName = file.FileName; + var cblReadingList = await SaveAndLoadCblFile(cbl); + var importSummary = await _readingListService.CreateReadingListFromCbl(userId, cblReadingList, dryRun, comicVineMatching); + importSummary.FileName = cbl.FileName; + return Ok(importSummary); } catch (ArgumentNullException) { return Ok(new CblImportSummaryDto() { - FileName = file.FileName, + FileName = cbl.FileName, Success = CblImportResult.Fail, Results = new List() { @@ -113,7 +114,7 @@ public class CblController : BaseApiController { return Ok(new CblImportSummaryDto() { - FileName = file.FileName, + FileName = cbl.FileName, Success = CblImportResult.Fail, Results = new List() { diff --git a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html index 1be1d0f7e..169e22803 100644 --- a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html +++ b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.html @@ -29,7 +29,7 @@
- image diff --git a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts index 0ae69300a..b2dcf497b 100644 --- a/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts +++ b/UI/Web/src/app/manga-reader/_components/infinite-scroller/infinite-scroller.component.ts @@ -25,7 +25,6 @@ import { WebtoonImage } from '../../_models/webtoon-image'; import { ManagaReaderService } from '../../_service/managa-reader.service'; import {takeUntilDestroyed} from "@angular/core/rxjs-interop"; import {TranslocoDirective} from "@ngneat/transloco"; -import {MangaReaderComponent} from "../manga-reader/manga-reader.component"; import {InfiniteScrollModule} from "ngx-infinite-scroll"; import {ReaderSetting} from "../../_models/reader-setting"; import {SafeStylePipe} from "../../../_pipes/safe-style.pipe"; @@ -174,6 +173,14 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, */ debugLogFilter: Array = ['[PREFETCH]', '[Intersection]', '[Visibility]', '[Image Load]']; + /** + * Width override for maunal width control + * 2 observables needed to avoid flickering, probably due to data races, when changing the width + * this allows to precicely define execution order + */ + widthOverride$ : Observable = new Observable(); + widthSliderValue$ : Observable = new Observable(); + get minPageLoaded() { return Math.min(...Object.values(this.imagesLoaded)); } @@ -232,6 +239,31 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, takeUntilDestroyed(this.destroyRef) ); + + this.widthSliderValue$ = this.readerSettings$.pipe( + map(values => (parseInt(values.widthSlider) <= 0) ? '' : values.widthSlider + '%'), + takeUntilDestroyed(this.destroyRef) + ); + + this.widthOverride$ = this.widthSliderValue$; + + //perfom jump so the page stays in view + this.widthSliderValue$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => { + this.currentPageElem = this.document.querySelector('img#page-' + this.pageNum); + if(!this.currentPageElem) + return; + + let images = Array.from(document.querySelectorAll('img[id^="page-"]')) as HTMLImageElement[]; + images.forEach((img) => { + this.renderer.setStyle(img, "width", val); + }); + + this.widthOverride$ = this.widthSliderValue$; + this.prevScrollPosition = this.currentPageElem.getBoundingClientRect().top; + this.currentPageElem.scrollIntoView(); + this.cdRef.markForCheck(); + }); + if (this.goToPage) { this.goToPage.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(page => { const isSamePage = this.pageNum === page; @@ -381,7 +413,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, this.cdRef.markForCheck(); } - if (totalScroll === totalHeight && !this.atBottom) { + if (totalHeight != 0 && totalScroll >= totalHeight && !this.atBottom) { this.atBottom = true; this.cdRef.markForCheck(); this.setPageNum(this.totalPages); @@ -392,6 +424,7 @@ export class InfiniteScrollerComponent implements OnInit, OnChanges, OnDestroy, document.body.scrollTop = this.previousScrollHeightMinusTop + (SPACER_SCROLL_INTO_PX / 2); this.cdRef.markForCheck(); }); + this.checkIfShouldTriggerContinuousReader() } else if (totalScroll >= totalHeight + SPACER_SCROLL_INTO_PX && this.atBottom) { // This if statement will fire once we scroll into the spacer at all this.loadNextChapter.emit(); diff --git a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html index dabfeb095..21b711822 100644 --- a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html +++ b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.html @@ -276,6 +276,18 @@ min="10" max="100" step="1" formControlName="darkness">
+
+ + +
+
diff --git a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts index 6648c6f33..e340723a1 100644 --- a/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts +++ b/UI/Web/src/app/manga-reader/_components/manga-reader/manga-reader.component.ts @@ -398,6 +398,10 @@ export class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy { * Show and log debug information */ debugMode: boolean = false; + /** + * Width override label for maunal width control + */ + widthOverrideLabel$ : Observable = new Observable(); // Renderer interaction readerSettings$!: Observable; @@ -513,6 +517,7 @@ export class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy { autoCloseMenu: new FormControl(this.autoCloseMenu), pageSplitOption: new FormControl(this.pageSplitOption), fittingOption: new FormControl(this.mangaReaderService.translateScalingOption(this.scalingOption)), + widthSlider: new FormControl('none'), layoutMode: new FormControl(this.layoutMode), darkness: new FormControl(100), emulateBook: new FormControl(this.user.preferences.emulateBook), @@ -549,7 +554,51 @@ export class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy { takeUntilDestroyed(this.destroyRef) ).subscribe(() => {}); + //only enable the width override slider under certain conditions + // width mode selected + // splitting is set to fit to screen, otherwise disable + // when disable set the value to 0 + // to use the default of the current single page reader + this.generalSettingsForm.get('pageSplitOption')?.valueChanges.pipe( + tap(val => { + const fitting = this.generalSettingsForm.get('fittingOption')?.value; + const widthOverrideControl = this.generalSettingsForm.get('widthSlider')!; + if (PageSplitOption.FitSplit == val && FITTING_OPTION.WIDTH == fitting) { + widthOverrideControl?.enable(); + } else { + widthOverrideControl?.setValue(0); + widthOverrideControl?.disable(); + } + }), + takeUntilDestroyed(this.destroyRef) + ).subscribe(() => {}); + + //only enable the width override slider under certain conditions + // width mode selected + // splitting is set to fit to screen, otherwise disable + // when disable set the value to 0 + // to use the default of the current single page reader + this.generalSettingsForm.get('fittingOption')?.valueChanges.pipe( + tap(val => { + const splitting = this.generalSettingsForm.get('pageSplitOption')?.value; + const widthOverrideControl = this.generalSettingsForm.get('widthSlider')!; + + if (PageSplitOption.FitSplit == splitting && FITTING_OPTION.WIDTH == val){ + widthOverrideControl?.enable(); + } else { + widthOverrideControl?.setValue(0); + widthOverrideControl?.disable(); + } + }), + takeUntilDestroyed(this.destroyRef) + ).subscribe(() => {}); + + //send the current width override value to the label + this.widthOverrideLabel$ = this.readerSettings$?.pipe( + map(values => (parseInt(values.widthSlider) <= 0) ? '' : values.widthSlider + '%'), + takeUntilDestroyed(this.destroyRef) + ); this.generalSettingsForm.get('layoutMode')?.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(val => { @@ -560,11 +609,13 @@ export class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy { if (this.layoutMode === LayoutMode.Single) { this.generalSettingsForm.get('pageSplitOption')?.setValue(this.user.preferences.pageSplitOption); this.generalSettingsForm.get('pageSplitOption')?.enable(); + this.generalSettingsForm.get('widthSlider')?.enable(); this.generalSettingsForm.get('fittingOption')?.enable(); this.generalSettingsForm.get('emulateBook')?.enable(); } else { this.generalSettingsForm.get('pageSplitOption')?.setValue(PageSplitOption.NoSplit); this.generalSettingsForm.get('pageSplitOption')?.disable(); + this.generalSettingsForm.get('widthSlider')?.disable(); this.generalSettingsForm.get('fittingOption')?.setValue(this.mangaReaderService.translateScalingOption(ScalingOption.FitToHeight)); this.generalSettingsForm.get('fittingOption')?.disable(); this.generalSettingsForm.get('emulateBook')?.enable(); @@ -696,6 +747,7 @@ export class MangaReaderComponent implements OnInit, AfterViewInit, OnDestroy { return { pageSplit: parseInt(this.generalSettingsForm.get('pageSplitOption')?.value, 10), fitting: (this.generalSettingsForm.get('fittingOption')?.value as FITTING_OPTION), + widthSlider: this.generalSettingsForm.get('widthSlider')?.value, layoutMode: this.layoutMode, darkness: parseInt(this.generalSettingsForm.get('darkness')?.value + '', 10) || 100, pagingDirection: this.pagingDirection, diff --git a/UI/Web/src/app/manga-reader/_components/single-renderer/single-renderer.component.html b/UI/Web/src/app/manga-reader/_components/single-renderer/single-renderer.component.html index 8bf38e878..a0ebb4abc 100644 --- a/UI/Web/src/app/manga-reader/_components/single-renderer/single-renderer.component.html +++ b/UI/Web/src/app/manga-reader/_components/single-renderer/single-renderer.component.html @@ -3,6 +3,7 @@ [style.filter]="(darkness$ | async) ?? '' | safeStyle" [style.height]="(imageContainerHeight$ | async) ?? '' | safeStyle"> @if(currentImage) {  = new Observable(); + get ReaderMode() {return ReaderMode;} get LayoutMode() {return LayoutMode;} @@ -67,6 +72,13 @@ export class SingleRendererComponent implements OnInit, ImageRenderer { takeUntilDestroyed(this.destroyRef) ); + //handle manual width + this.widthOverride$ = this.readerSettings$.pipe( + map(values => (parseInt(values.widthSlider) <= 0) ? '' : values.widthSlider + '%'), + takeUntilDestroyed(this.destroyRef) + ); + + this.emulateBookClass$ = this.readerSettings$.pipe( map(data => data.emulateBook), map(enabled => enabled ? 'book-shadow' : ''), diff --git a/UI/Web/src/app/manga-reader/_models/reader-enums.ts b/UI/Web/src/app/manga-reader/_models/reader-enums.ts index f33059a96..b8aec8130 100644 --- a/UI/Web/src/app/manga-reader/_models/reader-enums.ts +++ b/UI/Web/src/app/manga-reader/_models/reader-enums.ts @@ -1,7 +1,7 @@ export enum FITTING_OPTION { HEIGHT = 'full-height', WIDTH = 'full-width', - ORIGINAL = 'original' + ORIGINAL = 'original', } /** @@ -12,9 +12,9 @@ export enum SPLIT_PAGE_PART { LEFT_PART = 'left', RIGHT_PART = 'right' } - + export enum PAGING_DIRECTION { FORWARD = 1, BACKWARDS = -1, } - + diff --git a/UI/Web/src/app/manga-reader/_models/reader-setting.ts b/UI/Web/src/app/manga-reader/_models/reader-setting.ts index 33c3e7ba4..0c2ffddbd 100644 --- a/UI/Web/src/app/manga-reader/_models/reader-setting.ts +++ b/UI/Web/src/app/manga-reader/_models/reader-setting.ts @@ -6,9 +6,10 @@ import { FITTING_OPTION, PAGING_DIRECTION } from "./reader-enums"; export interface ReaderSetting { pageSplit: PageSplitOption; fitting: FITTING_OPTION; + widthSlider: string; layoutMode: LayoutMode; darkness: number; pagingDirection: PAGING_DIRECTION; readerMode: ReaderMode; emulateBook: boolean; -} \ No newline at end of file +} diff --git a/UI/Web/src/assets/langs/en.json b/UI/Web/src/assets/langs/en.json index 8554db786..30f860801 100644 --- a/UI/Web/src/assets/langs/en.json +++ b/UI/Web/src/assets/langs/en.json @@ -1699,6 +1699,8 @@ "image-scaling-label": "Image Scaling", "height": "Height", "width": "Width", + "width-override-label": "Width Override", + "off": "Off", "original": "Original", "auto-close-menu-label": "{{user-preferences.auto-close-menu-label}}", "swipe-enabled-label": "Swipe Enabled", diff --git a/openapi.json b/openapi.json index e94dbbce1..fda248741 100644 --- a/openapi.json +++ b/openapi.json @@ -7,7 +7,7 @@ "name": "GPL-3.0", "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE" }, - "version": "0.8.1.4" + "version": "0.8.1.14" }, "servers": [ { @@ -55,7 +55,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -88,7 +88,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -138,7 +138,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -168,7 +168,7 @@ "summary": "Returns an up-to-date user account", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -218,7 +218,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -248,7 +248,7 @@ "summary": "Get All Roles back. See API.Constants.PolicyConstants", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -288,7 +288,7 @@ "description": "This will log unauthorized requests to Security log", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -338,7 +338,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -369,7 +369,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -402,7 +402,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -434,7 +434,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -484,7 +484,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -534,7 +534,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -585,7 +585,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -616,7 +616,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -656,7 +656,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -685,7 +685,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -733,7 +733,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -774,7 +774,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -804,7 +804,7 @@ "summary": "Returns the OPDS url for this user", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -834,7 +834,7 @@ "summary": "Is the user's current email valid or not", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -864,7 +864,7 @@ "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", + "description": "OK", "content": { "text/plain": { "schema": { @@ -913,7 +913,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -956,7 +956,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1006,7 +1006,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1032,7 +1032,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1092,7 +1092,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1120,63 +1120,31 @@ "Cbl" ], "summary": "The first step in a cbl import. This validates the cbl file that if an import occured, would it be successful.\r\nIf this returns errors, the cbl will always be rejected by Kavita.", + "parameters": [ + { + "name": "comicVineMatching", + "in": "query", + "description": "Use comic vine matching or not. Defaults to false", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { - "ContentType": { - "type": "string" - }, - "ContentDisposition": { - "type": "string" - }, - "Headers": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "Length": { - "type": "integer", - "format": "int64" - }, - "Name": { - "type": "string" - }, - "FileName": { - "type": "string" - }, - "comicVineMatching": { - "type": "boolean", - "default": false + "cbl": { + "type": "string", + "format": "binary" } } }, "encoding": { - "ContentType": { - "style": "form" - }, - "ContentDisposition": { - "style": "form" - }, - "Headers": { - "style": "form" - }, - "Length": { - "style": "form" - }, - "Name": { - "style": "form" - }, - "FileName": { - "style": "form" - }, - "comicVineMatching": { + "cbl": { "style": "form" } } @@ -1185,7 +1153,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1213,70 +1181,40 @@ "Cbl" ], "summary": "Performs the actual import (assuming dryRun = false)", + "parameters": [ + { + "name": "dryRun", + "in": "query", + "description": "If true, will only emulate the import but not perform. This should be done to preview what will happen", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "name": "comicVineMatching", + "in": "query", + "description": "Use comic vine matching or not. Defaults to false", + "schema": { + "type": "boolean", + "default": false + } + } + ], "requestBody": { "content": { "multipart/form-data": { "schema": { "type": "object", "properties": { - "ContentType": { - "type": "string" - }, - "ContentDisposition": { - "type": "string" - }, - "Headers": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "Length": { - "type": "integer", - "format": "int64" - }, - "Name": { - "type": "string" - }, - "FileName": { - "type": "string" - }, - "dryRun": { - "type": "boolean", - "default": false - }, - "comicVineMatching": { - "type": "boolean", - "default": false + "cbl": { + "type": "string", + "format": "binary" } } }, "encoding": { - "ContentType": { - "style": "form" - }, - "ContentDisposition": { - "style": "form" - }, - "Headers": { - "style": "form" - }, - "Length": { - "style": "form" - }, - "Name": { - "style": "form" - }, - "FileName": { - "style": "form" - }, - "dryRun": { - "style": "form" - }, - "comicVineMatching": { + "cbl": { "style": "form" } } @@ -1285,7 +1223,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1325,7 +1263,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1373,7 +1311,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1397,7 +1335,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1456,7 +1394,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1505,7 +1443,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1555,7 +1493,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1588,7 +1526,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1621,7 +1559,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1654,7 +1592,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1687,7 +1625,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1700,7 +1638,7 @@ "summary": "For the authenticated user, if they have an active Kavita+ subscription and a MAL username on record,\r\nfetch their Mal interest stacks (including restacks)", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1759,7 +1697,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1790,7 +1728,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1821,7 +1759,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1845,7 +1783,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } }, @@ -1855,7 +1793,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -1914,7 +1852,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1945,7 +1883,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -1969,7 +1907,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2013,7 +1951,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2057,7 +1995,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2101,7 +2039,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2125,7 +2063,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2147,7 +2085,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2180,7 +2118,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2213,7 +2151,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2225,7 +2163,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2271,7 +2209,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2304,7 +2242,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2354,7 +2292,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2383,7 +2321,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2414,7 +2352,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2445,7 +2383,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2476,7 +2414,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2507,7 +2445,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2538,7 +2476,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2569,7 +2507,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2611,7 +2549,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2641,7 +2579,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2671,7 +2609,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2704,7 +2642,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2727,7 +2665,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2776,7 +2714,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2806,7 +2744,7 @@ "summary": "Return all libraries in the Server", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2856,7 +2794,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2915,7 +2853,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -2965,7 +2903,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -2989,7 +2927,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3019,7 +2957,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3041,7 +2979,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3074,7 +3012,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3096,7 +3034,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3136,7 +3074,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3187,7 +3125,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3211,7 +3149,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3278,7 +3216,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3308,7 +3246,7 @@ "summary": "Has any license", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3337,7 +3275,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } }, @@ -3368,7 +3306,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3399,7 +3337,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3411,7 +3349,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3460,7 +3398,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3526,7 +3464,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3575,7 +3513,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3624,7 +3562,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3674,7 +3612,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3724,7 +3662,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3774,7 +3712,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3813,7 +3751,7 @@ "summary": "Returns all languages Kavita can accept", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3863,7 +3801,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3904,7 +3842,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -3946,7 +3884,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -3985,7 +3923,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } }, @@ -4005,12 +3943,12 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } }, - "/api/Opds/{apiKey}/smart-filter/{filterId}": { + "/api/Opds/{apiKey}/smart-filters/{filterId}": { "get": { "tags": [ "Opds" @@ -4046,7 +3984,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4068,7 +4006,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4090,7 +4028,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4112,7 +4050,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4143,7 +4081,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4165,7 +4103,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4205,7 +4143,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4236,7 +4174,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4267,7 +4205,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4307,7 +4245,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4338,7 +4276,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4377,7 +4315,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4408,7 +4346,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4439,7 +4377,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4468,7 +4406,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4490,7 +4428,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4521,7 +4459,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4561,7 +4499,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4610,7 +4548,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4673,7 +4611,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4751,7 +4689,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4773,7 +4711,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4816,7 +4754,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -4848,7 +4786,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -4899,7 +4837,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -4941,7 +4879,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -4980,7 +4918,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5028,7 +4966,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5079,7 +5017,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5120,7 +5058,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5162,7 +5100,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5196,7 +5134,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5265,7 +5203,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5315,7 +5253,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5365,7 +5303,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5398,7 +5336,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5431,7 +5369,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5464,7 +5402,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5497,7 +5435,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5530,7 +5468,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5563,7 +5501,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5596,7 +5534,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5620,7 +5558,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5670,7 +5608,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5693,7 +5631,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5734,7 +5672,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5775,7 +5713,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5834,7 +5772,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -5893,7 +5831,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5926,7 +5864,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -5950,7 +5888,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6000,7 +5938,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6060,7 +5998,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6093,7 +6031,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6135,7 +6073,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6197,7 +6135,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6242,7 +6180,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6283,7 +6221,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6344,7 +6282,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6378,7 +6316,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6402,7 +6340,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6452,7 +6390,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6500,7 +6438,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6550,7 +6488,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6600,7 +6538,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6651,7 +6589,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6710,7 +6648,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6743,7 +6681,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6767,7 +6705,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6800,7 +6738,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -6850,7 +6788,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6883,7 +6821,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6916,7 +6854,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6949,7 +6887,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -6980,7 +6918,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -7011,7 +6949,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -7035,7 +6973,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7094,7 +7032,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7147,7 +7085,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7190,7 +7128,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7248,7 +7186,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7315,7 +7253,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7382,7 +7320,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7458,7 +7396,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7525,7 +7463,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7584,7 +7522,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7622,7 +7560,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -7635,7 +7573,7 @@ "summary": "Get the current user's AniList token", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7664,7 +7602,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7714,7 +7652,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -7747,7 +7685,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -7777,7 +7715,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7808,7 +7746,7 @@ "description": "Requires admin", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7847,7 +7785,7 @@ "summary": "Clears the scrobbling errors table", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -7899,7 +7837,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7938,7 +7876,7 @@ "summary": "Returns all scrobble holds for the current user", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -7988,7 +7926,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8029,7 +7967,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8070,7 +8008,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -8094,7 +8032,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -8118,7 +8056,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8159,7 +8097,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8186,18 +8124,29 @@ "tags": [ "Search" ], + "summary": "Searches against different entities in the system against a query string", "parameters": [ { "name": "queryString", "in": "query", + "description": "", "schema": { "type": "string" } + }, + { + "name": "includeChapterAndFiles", + "in": "query", + "description": "Include Chapter and Filenames in the entities. This can slow down the search on larger systems", + "schema": { + "type": "boolean", + "default": true + } } ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8276,7 +8225,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8355,7 +8304,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8406,7 +8355,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8446,7 +8395,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8494,7 +8443,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -8518,7 +8467,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8566,7 +8515,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8605,7 +8554,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8644,7 +8593,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8695,7 +8644,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -8728,7 +8677,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -8790,7 +8739,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8869,7 +8818,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8908,7 +8857,7 @@ "summary": "Returns series that were recently updated, like adding or removing a chapter", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -8996,7 +8945,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9084,7 +9033,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9153,7 +9102,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9203,7 +9152,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9236,7 +9185,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9269,7 +9218,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9302,7 +9251,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9326,7 +9275,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9374,7 +9323,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9415,7 +9364,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9473,7 +9422,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9524,7 +9473,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9566,7 +9515,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9633,7 +9582,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9683,7 +9632,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9733,7 +9682,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9771,7 +9720,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9812,7 +9761,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9842,7 +9791,7 @@ "summary": "Performs an ad-hoc cleanup of Cache", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9855,7 +9804,7 @@ "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" + "description": "OK" } } } @@ -9868,7 +9817,7 @@ "summary": "Performs an ad-hoc backup of the Database", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9881,7 +9830,7 @@ "summary": "This is a one time task that needs to be ran for v0.7 statistics to work", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9894,7 +9843,7 @@ "summary": "Returns non-sensitive information about the current system", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9925,7 +9874,7 @@ "description": "This is just for the UI and is extremely lightweight", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -9955,7 +9904,7 @@ "summary": "Triggers the scheduling of the convert media job. This will convert all media to the target encoding (except for PNG). Only one job will run at a time.", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9968,7 +9917,7 @@ "summary": "Downloads all the log files via a zip", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9982,7 +9931,7 @@ "description": "Some users have websocket issues so this is not always reliable to alert the user", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -9995,7 +9944,7 @@ "summary": "Checks for updates, if no updates that are > current version installed, returns null", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10025,7 +9974,7 @@ "summary": "Returns how many versions out of date this install is", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10058,7 +10007,7 @@ "summary": "Pull the Changelog for Kavita from Github and display", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10097,7 +10046,7 @@ "summary": "Returns a list of reoccurring jobs. Scheduled ad-hoc jobs will not be returned.", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10136,7 +10085,7 @@ "summary": "Returns a list of issues found during scanning or reading in which files may have corruption or bad metadata (structural metadata)", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10175,7 +10124,7 @@ "summary": "Deletes all media errors", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -10188,7 +10137,7 @@ "summary": "Bust Kavita+ Cache", "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -10200,7 +10149,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10230,7 +10179,7 @@ "summary": "Returns the server settings", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10276,7 +10225,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10305,7 +10254,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10335,7 +10284,7 @@ "summary": "Resets the IP Addresses", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10365,7 +10314,7 @@ "summary": "Resets the Base url", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10395,7 +10344,7 @@ "summary": "Is the minimum information setup for Email to work", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10425,7 +10374,7 @@ "summary": "All values allowed for Task Scheduling APIs. A custom cron job is not included. Disabled is not applicable for Cleanup.", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10463,7 +10412,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10501,7 +10450,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10539,7 +10488,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10579,7 +10528,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10609,7 +10558,7 @@ "summary": "Sends a test email to see if email settings are hooked up correctly", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10649,7 +10598,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10678,7 +10627,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10707,7 +10656,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10745,7 +10694,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10783,7 +10732,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10821,7 +10770,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10872,7 +10821,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10911,7 +10860,7 @@ "summary": "A breakdown of different files, their size, and format", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -10942,6 +10891,28 @@ } } }, + "/api/Stats/server/file-extension": { + "get": { + "tags": [ + "Stats" + ], + "summary": "Generates a csv of all file paths for a given extension", + "parameters": [ + { + "name": "fileExtension", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, "/api/Stats/reading-count-by-day": { "get": { "tags": [ @@ -10972,7 +10943,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11021,7 +10992,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11069,7 +11040,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11120,7 +11091,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11171,7 +11142,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11210,7 +11181,7 @@ "summary": "Returns for Kavita+ the number of Series that have been processed, errored, and not processed", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11259,7 +11230,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11308,7 +11279,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11347,7 +11318,7 @@ "summary": "Return's the user's external sources", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11406,7 +11377,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11456,7 +11427,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11510,7 +11481,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11551,7 +11522,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -11575,7 +11546,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11625,7 +11596,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -11658,7 +11629,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -11682,7 +11653,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11723,7 +11694,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11773,7 +11744,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -11806,7 +11777,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -11837,7 +11808,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -11861,7 +11832,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11910,7 +11881,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11939,7 +11910,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -11987,7 +11958,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12044,7 +12015,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12067,7 +12038,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12097,7 +12068,7 @@ "summary": "Browse themes that can be used on this server", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12156,7 +12127,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12206,7 +12177,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12256,7 +12227,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12306,7 +12277,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12339,7 +12310,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12373,7 +12344,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12406,7 +12377,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12439,7 +12410,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12472,7 +12443,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12493,7 +12464,7 @@ ], "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -12517,7 +12488,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12555,7 +12526,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12603,7 +12574,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12642,7 +12613,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12690,7 +12661,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12720,7 +12691,7 @@ "summary": "Returns the preferences of the user", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12750,7 +12721,7 @@ "summary": "Returns a list of the user names within the system", "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12829,7 +12800,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12876,7 +12847,7 @@ ], "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -12945,7 +12916,7 @@ }, "responses": { "200": { - "description": "Success", + "description": "OK", "content": { "text/plain": { "schema": { @@ -13004,7 +12975,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -13037,7 +13008,7 @@ }, "responses": { "200": { - "description": "Success" + "description": "OK" } } } @@ -13046,6 +13017,9 @@ "components": { "schemas": { "AgeRatingDto": { + "required": [ + "title" + ], "type": "object", "properties": { "value": { @@ -13079,6 +13053,10 @@ "additionalProperties": false }, "AgeRestrictionDto": { + "required": [ + "ageRating", + "includeUnknowns" + ], "type": "object", "properties": { "ageRating": { @@ -13457,6 +13435,11 @@ "description": "Represents a saved page in a Chapter entity for a given user." }, "AppUserCollection": { + "required": [ + "ageRating", + "normalizedTitle", + "title" + ], "type": "object", "properties": { "id": { @@ -13561,7 +13544,7 @@ }, "missingSeriesFromSource": { "type": "string", - "description": "A
separated string of all missing series", + "description": "A \r\n separated string of all missing series", "nullable": true }, "appUser": { @@ -13656,13 +13639,16 @@ }, "missingSeriesFromSource": { "type": "string", - "description": "A
separated string of all missing series", + "description": "A \r\n separated string of all missing series", "nullable": true } }, "additionalProperties": false }, "AppUserDashboardStream": { + "required": [ + "name" + ], "type": "object", "properties": { "id": { @@ -13711,6 +13697,11 @@ "additionalProperties": false }, "AppUserExternalSource": { + "required": [ + "apiKey", + "host", + "name" + ], "type": "object", "properties": { "id": { @@ -13740,6 +13731,9 @@ "additionalProperties": false }, "AppUserPreferences": { + "required": [ + "theme" + ], "type": "object", "properties": { "id": { @@ -14087,6 +14081,9 @@ "additionalProperties": false }, "AppUserSideNavStream": { + "required": [ + "name" + ], "type": "object", "properties": { "id": { @@ -14150,6 +14147,10 @@ "additionalProperties": false }, "AppUserSmartFilter": { + "required": [ + "filter", + "name" + ], "type": "object", "properties": { "id": { @@ -14177,6 +14178,12 @@ "description": "Represents a Saved user Filter" }, "AppUserTableOfContent": { + "required": [ + "chapterId", + "pageNumber", + "seriesId", + "title" + ], "type": "object", "properties": { "id": { @@ -14249,6 +14256,9 @@ "description": "A personal table of contents for a given user linked with a given book" }, "AppUserWantToRead": { + "required": [ + "seriesId" + ], "type": "object", "properties": { "id": { @@ -14501,6 +14511,10 @@ "additionalProperties": false }, "BulkUpdateSideNavStreamVisibilityDto": { + "required": [ + "ids", + "visibility" + ], "type": "object", "properties": { "ids": { @@ -14611,6 +14625,10 @@ "description": "Represents the summary from the Import of a given CBL" }, "Chapter": { + "required": [ + "number", + "range" + ], "type": "object", "properties": { "id": { @@ -15443,6 +15461,10 @@ "description": "Exclusively metadata about a given chapter" }, "CollectionTag": { + "required": [ + "normalizedTitle", + "title" + ], "type": "object", "properties": { "id": { @@ -15634,6 +15656,14 @@ "additionalProperties": false }, "CreatePersonalToCDto": { + "required": [ + "chapterId", + "libraryId", + "pageNumber", + "seriesId", + "title", + "volumeId" + ], "type": "object", "properties": { "chapterId": { @@ -15678,6 +15708,9 @@ "additionalProperties": false }, "DashboardStreamDto": { + "required": [ + "name" + ], "type": "object", "properties": { "id": { @@ -16075,6 +16108,11 @@ "additionalProperties": false }, "ExternalRecommendation": { + "required": [ + "coverUrl", + "name", + "url" + ], "type": "object", "properties": { "id": { @@ -16134,6 +16172,11 @@ "additionalProperties": false }, "ExternalReview": { + "required": [ + "body", + "bodyJustText", + "provider" + ], "type": "object", "properties": { "id": { @@ -16207,6 +16250,11 @@ "description": "Represents an Externally supplied Review for a given Series" }, "ExternalSeriesDto": { + "required": [ + "coverUrl", + "name", + "url" + ], "type": "object", "properties": { "name": { @@ -16312,6 +16360,12 @@ "description": "External Metadata from Kavita+ for a Series" }, "ExternalSourceDto": { + "required": [ + "apiKey", + "host", + "id", + "name" + ], "type": "object", "properties": { "id": { @@ -16409,6 +16463,10 @@ "additionalProperties": false }, "FileFormatDto": { + "required": [ + "extension", + "format" + ], "type": "object", "properties": { "extension": { @@ -16763,6 +16821,9 @@ "description": "Metadata filtering for v2 API only" }, "FolderPath": { + "required": [ + "path" + ], "type": "object", "properties": { "id": { @@ -16832,6 +16893,10 @@ "description": "A full progress Record from the DB (not all data, only what's needed for API)" }, "Genre": { + "required": [ + "normalizedTitle", + "title" + ], "type": "object", "properties": { "id": { @@ -16864,6 +16929,9 @@ "additionalProperties": false }, "GenreTagDto": { + "required": [ + "title" + ], "type": "object", "properties": { "id": { @@ -17035,6 +17103,10 @@ "description": "Represents an individual button in a Jump Bar" }, "LanguageDto": { + "required": [ + "isoCode", + "title" + ], "type": "object", "properties": { "isoCode": { @@ -17049,6 +17121,9 @@ "additionalProperties": false }, "Library": { + "required": [ + "name" + ], "type": "object", "properties": { "id": { @@ -17343,6 +17418,14 @@ "additionalProperties": false }, "MalStackDto": { + "required": [ + "author", + "restackCount", + "seriesCount", + "stackId", + "title", + "url" + ], "type": "object", "properties": { "title": { @@ -17379,6 +17462,10 @@ "description": "Represents an Interest Stack from MAL" }, "MalUserInfoDto": { + "required": [ + "accessToken", + "username" + ], "type": "object", "properties": { "username": { @@ -17395,6 +17482,9 @@ "description": "Information about a User's MAL connection" }, "MangaFile": { + "required": [ + "filePath" + ], "type": "object", "properties": { "id": { @@ -17484,14 +17574,17 @@ }, "filePath": { "type": "string", + "description": "Absolute path to the archive file (normalized)", "nullable": true }, "pages": { "type": "integer", + "description": "Number of pages for the given file", "format": "int32" }, "bytes": { "type": "integer", + "description": "How many bytes make up this file", "format": "int64" }, "format": { @@ -17509,6 +17602,11 @@ "created": { "type": "string", "format": "date-time" + }, + "extension": { + "type": "string", + "description": "File extension", + "nullable": true } }, "additionalProperties": false @@ -17603,6 +17701,10 @@ "description": "This is used for bulk updating a set of volume and or chapters in one go" }, "MediaErrorDto": { + "required": [ + "extension", + "filePath" + ], "type": "object", "properties": { "extension": { @@ -17710,6 +17812,11 @@ "additionalProperties": false }, "Person": { + "required": [ + "name", + "normalizedName", + "role" + ], "type": "object", "properties": { "id": { @@ -17762,6 +17869,9 @@ "additionalProperties": false }, "PersonDto": { + "required": [ + "name" + ], "type": "object", "properties": { "id": { @@ -17796,6 +17906,11 @@ "additionalProperties": false }, "PersonalToCDto": { + "required": [ + "chapterId", + "pageNumber", + "title" + ], "type": "object", "properties": { "chapterId": { @@ -17926,6 +18041,11 @@ "additionalProperties": false }, "ReadHistoryEvent": { + "required": [ + "chapterNumber", + "seriesName", + "userName" + ], "type": "object", "properties": { "userId": { @@ -17981,6 +18101,11 @@ "description": "Represents the Reading Status. This is a flag and allows multiple statues" }, "ReadingList": { + "required": [ + "ageRating", + "normalizedTitle", + "title" + ], "type": "object", "properties": { "id": { @@ -18284,6 +18409,11 @@ "type": "integer", "description": "File size of underlying item", "format": "int64" + }, + "summary": { + "type": "string", + "description": "The chapter summary", + "nullable": true } }, "additionalProperties": false @@ -18926,6 +19056,14 @@ "additionalProperties": false }, "Series": { + "required": [ + "localizedName", + "name", + "normalizedLocalizedName", + "normalizedName", + "originalName", + "sortName" + ], "type": "object", "properties": { "id": { @@ -19806,6 +19944,16 @@ "description": "A relation flows between one series and another.\r\nSeries ---kind---> target" }, "ServerInfoDto": { + "required": [ + "dotnetVersion", + "fileFormats", + "installId", + "kavitaVersion", + "mangaReaderBackgroundColors", + "mangaReaderLayoutModes", + "mangaReaderPageSplittingModes", + "os" + ], "type": "object", "properties": { "installId": { @@ -20139,6 +20287,17 @@ }, "smtpConfig": { "$ref": "#/components/schemas/SmtpConfigDto" + }, + "firstInstallDate": { + "type": "string", + "description": "The Date Kavita was first installed", + "format": "date-time", + "nullable": true + }, + "firstInstallVersion": { + "type": "string", + "description": "The Version of Kavita on the first run", + "nullable": true } }, "additionalProperties": false @@ -20223,6 +20382,9 @@ "additionalProperties": false }, "SideNavStreamDto": { + "required": [ + "name" + ], "type": "object", "properties": { "id": { @@ -20304,6 +20466,11 @@ "additionalProperties": false }, "SiteTheme": { + "required": [ + "fileName", + "name", + "normalizedName" + ], "type": "object", "properties": { "id": { @@ -20386,6 +20553,11 @@ "description": "Represents a set of css overrides the user can upload to Kavita and will load into webui" }, "SiteThemeDto": { + "required": [ + "fileName", + "name", + "normalizedName" + ], "type": "object", "properties": { "id": { @@ -20452,6 +20624,10 @@ "description": "Represents a set of css overrides the user can upload to Kavita and will load into webui" }, "SmartFilterDto": { + "required": [ + "filter", + "name" + ], "type": "object", "properties": { "id": { @@ -20538,6 +20714,10 @@ "description": "Sorting Options for a query" }, "Tag": { + "required": [ + "normalizedTitle", + "title" + ], "type": "object", "properties": { "id": { @@ -20570,6 +20750,9 @@ "additionalProperties": false }, "TagDto": { + "required": [ + "title" + ], "type": "object", "properties": { "id": { @@ -20811,6 +20994,10 @@ "additionalProperties": false }, "UpdateLibraryForUserDto": { + "required": [ + "selectedLibraries", + "username" + ], "type": "object", "properties": { "username": { @@ -20828,6 +21015,10 @@ "additionalProperties": false }, "UpdateLicenseDto": { + "required": [ + "email", + "license" + ], "type": "object", "properties": { "license": { @@ -20849,6 +21040,14 @@ "additionalProperties": false }, "UpdateNotificationDto": { + "required": [ + "currentVersion", + "publishDate", + "updateBody", + "updateTitle", + "updateUrl", + "updateVersion" + ], "type": "object", "properties": { "currentVersion": { @@ -21359,6 +21558,10 @@ "description": "A list of Series to pass when working with Want To Read APIs" }, "UploadFileDto": { + "required": [ + "id", + "url" + ], "type": "object", "properties": { "id": { @@ -21796,6 +21999,635 @@ "additionalProperties": false, "description": "Represents a User Review for a given Series" }, + "Volume": { + "required": [ + "maxNumber", + "minNumber", + "name" + ], + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string", + "description": "A String representation of the volume number. Allows for floats. Can also include a range (1-2).", + "nullable": true + }, + "lookupName": { + "type": "string", + "description": "This is just the original Parsed volume number for lookups", + "nullable": true + }, + "number": { + "type": "integer", + "description": "The minimum number in the Name field in Int form", + "format": "int32", + "deprecated": true + }, + "minNumber": { + "type": "number", + "description": "The minimum number in the Name field", + "format": "float" + }, + "maxNumber": { + "type": "number", + "description": "The maximum number in the Name field (same as Minimum if Name isn't a range)", + "format": "float" + }, + "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" + }, + "minNumber": { + "type": "number", + "format": "float" + }, + "maxNumber": { + "type": "number", + "format": "float" + }, + "name": { + "type": "string", + "nullable": true + }, + "number": { + "type": "integer", + "description": "This will map to MinNumber. Number was removed in v0.7.13.8/v0.7.14", + "format": "int32", + "deprecated": true + }, + "pages": { + "type": "integer", + "format": "int32" + }, + "pagesRead": { + "type": "integer", + "format": "int32" + }, + "lastModifiedUtc": { + "type": "string", + "format": "date-time" + }, + "createdUtc": { + "type": "string", + "format": "date-time" + }, + "created": { + "type": "string", + "description": "When chapter was created in local server time", + "format": "date-time" + }, + "lastModified": { + "type": "string", + "description": "When chapter was last modified in local server time", + "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": "Cbl", + "description": "Responsible for the CBL import flow" + }, + { + "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": "Filter", + "description": "This is responsible for Filter caching" + }, + { + "name": "Image", + "description": "Responsible for servicing up images stored in Kavita for entities" + }, + { + "name": "Panels", + "description": "For the Panels app explicitly" + }, + { + "name": "Rating", + "description": "Responsible for providing external ratings for Series" + }, + { + "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": "Stream", + "description": "Responsible for anything that deals with Streams (SmartFilters, ExternalSource, DashboardStream, SideNavStream)" + }, + { + "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" + } + ] +} "nullable": true + } + }, + "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", + "bookReaderWritingStyle", + "collapseSeriesRelationships", + "emulateBook", + "globalPageLayoutMode", + "layoutMode", + "locale", + "noTransitions", + "pageSplitOption", + "pdfLayoutMode", + "pdfScrollMode", + "pdfSpreadMode", + "pdfTheme", + "promptForDownloadSize", + "readerMode", + "readingDirection", + "scalingOption", + "shareReviews", + "showScreenHints", + "swipeToPaginate", + "theme" + ], + "type": "object", + "properties": { + "readingDirection": { + "enum": [ + 0, + 1 + ], + "type": "integer", + "description": "Manga Reader Option: What direction should the next/prev page buttons go", + "format": "int32" + }, + "scalingOption": { + "enum": [ + 0, + 1, + 2, + 3 + ], + "type": "integer", + "description": "Manga Reader Option: How should the image be scaled to screen", + "format": "int32" + }, + "pageSplitOption": { + "enum": [ + 0, + 1, + 2, + 3 + ], + "type": "integer", + "description": "Manga Reader Option: Which side of a split image should we show first", + "format": "int32" + }, + "readerMode": { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer", + "description": "Manga Reader Option: How the manga reader should perform paging or reading of the file\r\n\r\nWebtoon uses scrolling to page, LeftRight uses paging by clicking left/right side of reader, UpDown uses paging\r\nby clicking top/bottom sides of reader.\r\n", + "format": "int32" + }, + "layoutMode": { + "enum": [ + 1, + 2, + 3 + ], + "type": "integer", + "description": "Manga Reader Option: How many pages to display in the reader at once", + "format": "int32" + }, + "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", + "description": "Manga Reader Option: Should swiping trigger pagination" + }, + "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": { + "enum": [ + 0, + 1 + ], + "type": "integer", + "description": "Book Reader Option: What direction should the next/prev page buttons go", + "format": "int32" + }, + "bookReaderWritingStyle": { + "enum": [ + 0, + 1 + ], + "type": "integer", + "description": "Book Reader Option: What writing style should be used, horizontal or vertical.", + "format": "int32" + }, + "theme": { + "$ref": "#/components/schemas/SiteThemeDto" + }, + "bookReaderThemeName": { + "minLength": 1, + "type": "string" + }, + "bookReaderLayoutMode": { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer", + "format": "int32" + }, + "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": { + "enum": [ + 0, + 1 + ], + "type": "integer", + "description": "Global Site Option: If the UI should layout items as Cards or List items", + "format": "int32" + }, + "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" + }, + "collapseSeriesRelationships": { + "type": "boolean", + "description": "When showing series, only parent series or series with no relationships will be returned" + }, + "shareReviews": { + "type": "boolean", + "description": "UI Site Global Setting: Should series reviews be shared with all users in the server" + }, + "locale": { + "minLength": 1, + "type": "string", + "description": "UI Site Global Setting: The language locale that should be used for the user" + }, + "pdfTheme": { + "enum": [ + 0, + 1 + ], + "type": "integer", + "description": "PDF Reader: Theme of the Reader", + "format": "int32" + }, + "pdfScrollMode": { + "enum": [ + 0, + 1, + 3 + ], + "type": "integer", + "description": "PDF Reader: Scroll mode of the reader", + "format": "int32" + }, + "pdfLayoutMode": { + "enum": [ + 0, + 2 + ], + "type": "integer", + "description": "PDF Reader: Layout Mode of the reader", + "format": "int32" + }, + "pdfSpreadMode": { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer", + "description": "PDF Reader: Spread Mode of the reader", + "format": "int32" + } + }, + "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 + }, + "UserReviewDto": { + "type": "object", + "properties": { + "tagline": { + "type": "string", + "description": "A tagline for the review", + "nullable": true + }, + "body": { + "type": "string", + "description": "The main review", + "nullable": true + }, + "bodyJustText": { + "type": "string", + "description": "The main body with just text, for review preview", + "nullable": true + }, + "seriesId": { + "type": "integer", + "description": "The series this is for", + "format": "int32" + }, + "libraryId": { + "type": "integer", + "description": "The library this series belongs in", + "format": "int32" + }, + "username": { + "type": "string", + "description": "The user who wrote this", + "nullable": true + }, + "totalVotes": { + "type": "integer", + "format": "int32" + }, + "rating": { + "type": "number", + "format": "float" + }, + "rawBody": { + "type": "string", + "nullable": true + }, + "score": { + "type": "integer", + "description": "How many upvotes this review has gotten", + "format": "int32" + }, + "siteUrl": { + "type": "string", + "description": "If External, the url of the review", + "nullable": true + }, + "isExternal": { + "type": "boolean", + "description": "Does this review come from an external Source" + }, + "provider": { + "enum": [ + 0, + 1, + 2 + ], + "type": "integer", + "description": "If this review is External, which Provider did it come from", + "format": "int32" + } + }, + "additionalProperties": false, + "description": "Represents a User Review for a given Series" + }, "Volume": { "type": "object", "properties": {