diff --git a/docs/README.md b/docs/README.md index 14b1aba25..bc79c3868 100644 --- a/docs/README.md +++ b/docs/README.md @@ -31,3 +31,12 @@ redocly bundle root.yaml > bundled.yaml && \ yq -p yaml -o json bundled.yaml > openapi.json && \ redocly build-docs openapi.json ``` +The OpenAPI specification is generated using [swagger-autogen](https://swagger-autogen.github.io/). + +To regenerate, run: + +``` +node swagger.js +``` + +Generates `docs/swagger-output.json` diff --git a/docs/swagger-output.json b/docs/swagger-output.json new file mode 100644 index 000000000..449420810 --- /dev/null +++ b/docs/swagger-output.json @@ -0,0 +1,6874 @@ +{ + "openapi": "3.0.0", + "info": { + "version": "2.32.1", + "title": "Audiobookshelf API", + "description": "Self-hosted audiobook and podcast server API" + }, + "servers": [ + { + "url": "http://localhost:3333", + "description": "Local development server" + } + ], + "tags": [ + { + "name": "Libraries", + "description": "Library management endpoints" + }, + { + "name": "Library Items", + "description": "Library item management endpoints" + }, + { + "name": "Users", + "description": "User management endpoints" + }, + { + "name": "Collections", + "description": "Collection management endpoints" + }, + { + "name": "Playlists", + "description": "Playlist management endpoints" + }, + { + "name": "Me", + "description": "Current user endpoints" + }, + { + "name": "Backups", + "description": "Backup management endpoints" + }, + { + "name": "Series", + "description": "Series management endpoints" + }, + { + "name": "Authors", + "description": "Author management endpoints" + }, + { + "name": "Sessions", + "description": "Playback session endpoints" + }, + { + "name": "Podcasts", + "description": "Podcast management endpoints" + }, + { + "name": "Notifications", + "description": "Notification management endpoints" + }, + { + "name": "Email", + "description": "Email configuration endpoints" + }, + { + "name": "Search", + "description": "Search endpoints" + }, + { + "name": "Cache", + "description": "Cache management endpoints" + }, + { + "name": "Tools", + "description": "Tool endpoints" + }, + { + "name": "RSS Feeds", + "description": "RSS feed management endpoints" + }, + { + "name": "Custom Metadata Providers", + "description": "Custom metadata provider endpoints" + }, + { + "name": "Misc", + "description": "Miscellaneous endpoints" + }, + { + "name": "Share", + "description": "Media sharing endpoints" + }, + { + "name": "Stats", + "description": "Statistics endpoints" + }, + { + "name": "API Keys", + "description": "API key management endpoints" + }, + { + "name": "File System", + "description": "File system endpoints" + } + ], + "paths": { + "/libraries/": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "responses": { + "default": { + "description": "" + } + } + } + }, + "/libraries": { + "post": { + "tags": [ + "Libraries" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "folders": { + "example": "any" + }, + "settings": { + "example": "any" + }, + "mediaType": { + "example": "any" + }, + "provider": { + "example": "any" + }, + "icon": { + "example": "any" + } + } + } + } + } + } + }, + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/libraries/{id}": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "displayOrder": { + "example": "any" + }, + "provider": { + "example": "any" + }, + "settings": { + "example": "any" + }, + "folders": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/items": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "desc", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "filter", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "minified", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "collapseseries", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/issues": { + "delete": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/episode-downloads": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/series": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "desc", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "filter", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "minified", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/series/{seriesId}": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "seriesId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/collections": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "desc", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "filter", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "minified", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/playlists": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/personalized": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/filterdata": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/search": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "q", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/stats": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/authors": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "desc", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "filter", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "minified", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/narrators": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/narrators/{narratorId}": { + "patch": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "narratorId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "narratorId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/matchall": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/scan": { + "post": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "force", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/recent-episodes": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/opml": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/order": { + "post": { + "tags": [ + "Libraries" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "some((o": { + "example": "any" + }, + "length": { + "example": "any" + } + } + } + } + } + } + } + }, + "/libraries/{id}/remove-metadata": { + "post": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "ext", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/podcast-titles": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/libraries/{id}/download": { + "get": { + "tags": [ + "Libraries" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "ids", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/batch/delete": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "hard", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryItemIds": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/batch/update": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "length": { + "example": "any" + }, + "map((up": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/batch/get": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryItemIds": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/batch/quickmatch": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryItemIds": { + "example": "any" + }, + "options": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/batch/scan": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryItemIds": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/{id}": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "expanded", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "episode", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "hard", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/download": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/media": { + "patch": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "url": { + "example": "any" + }, + "autoDownloadEpisodes": { + "example": "any" + }, + "autoDownloadSchedule": { + "example": "any" + }, + "metadata": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/{id}/cover": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "ts", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "url": { + "example": "any" + } + } + } + } + } + } + }, + "patch": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "cover": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/match": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "overrideCover": { + "example": "any" + }, + "overrideDetails": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/{id}/play": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/play/{episodeId}": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/tracks": { + "patch": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "length": { + "example": "any" + }, + "some((fileData": { + "example": "any" + }, + "map((fileData": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/{id}/scan": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/items/{id}/metadata-object": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/chapters": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "chapters": { + "example": "any" + } + } + } + } + } + } + } + }, + "/items/{id}/ffprobe/{fileid}": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "fileid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/file/{fileid}": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "fileid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "204": { + "description": "No Content" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "fileid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/file/{fileid}/download": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "produces": [ + null + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "fileid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "user-agent", + "in": "header", + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/ebook/{fileid?}": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "fileid?", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "204": { + "description": "No Content" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/items/{id}/ebook/{fileid}/status": { + "patch": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "fileid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/users": { + "post": { + "tags": [ + "Users" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "username": { + "example": "any" + }, + "password": { + "example": "any" + }, + "type": { + "example": "any" + }, + "librariesAccessible": { + "example": "any" + }, + "permissions": { + "example": "any" + }, + "itemTagsSelected": { + "example": "any" + }, + "email": { + "example": "any" + }, + "isActive": { + "example": "any" + } + } + } + } + } + } + }, + "get": { + "tags": [ + "Users" + ], + "description": "", + "parameters": [ + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/users/online": { + "get": { + "tags": [ + "Users" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/users/{id}": { + "get": { + "tags": [ + "Users" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Users" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Users" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/users/{id}/openid-unlink": { + "patch": { + "tags": [ + "Users" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/users/{id}/listening-sessions": { + "get": { + "tags": [ + "Users" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "itemsPerPage", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/users/{id}/listening-stats": { + "get": { + "tags": [ + "Users" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/collections": { + "post": { + "tags": [ + "Collections" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "libraryId": { + "example": "any" + }, + "description": { + "example": "any" + }, + "books": { + "example": "any" + } + } + } + } + } + } + }, + "get": { + "tags": [ + "Collections" + ], + "description": "", + "responses": { + "default": { + "description": "" + } + } + } + }, + "/collections/{id}": { + "get": { + "tags": [ + "Collections" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Collections" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "description": { + "example": "any" + }, + "name": { + "example": "any" + }, + "books": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Collections" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/collections/{id}/book": { + "post": { + "tags": [ + "Collections" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "id": { + "example": "any" + } + } + } + } + } + } + } + }, + "/collections/{id}/book/{bookId}": { + "delete": { + "tags": [ + "Collections" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "bookId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/collections/{id}/batch/add": { + "post": { + "tags": [ + "Collections" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "books": { + "example": "any" + } + } + } + } + } + } + } + }, + "/collections/{id}/batch/remove": { + "post": { + "tags": [ + "Collections" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "books": { + "example": "any" + } + } + } + } + } + } + } + }, + "/playlists": { + "post": { + "tags": [ + "Playlists" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "libraryId": { + "example": "any" + }, + "description": { + "example": "any" + }, + "items": { + "example": "any" + } + } + } + } + } + } + }, + "get": { + "tags": [ + "Playlists" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/playlists/{id}": { + "get": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryId": { + "example": "any" + }, + "userId": { + "example": "any" + }, + "name": { + "example": "any" + }, + "description": { + "example": "any" + }, + "items": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/playlists/{id}/item": { + "post": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryItemId": { + "example": "any" + }, + "episodeId": { + "example": "any" + } + } + } + } + } + } + } + }, + "/playlists/{id}/item/{libraryItemId}/{episodeId?}": { + "delete": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "libraryItemId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId?", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/playlists/{id}/batch/add": { + "post": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "example": "any" + } + } + } + } + } + } + } + }, + "/playlists/{id}/batch/remove": { + "post": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "items": { + "example": "any" + } + } + } + } + } + } + } + }, + "/playlists/collection/{collectionId}": { + "post": { + "tags": [ + "Playlists" + ], + "description": "", + "parameters": [ + { + "name": "collectionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/me": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/me/listening-sessions": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "itemsPerPage", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/me/item/listening-sessions/{libraryItemId}/{episodeId?}": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "libraryItemId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId?", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "itemsPerPage", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/me/listening-stats": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/me/progress/{id}/remove-from-continue-listening": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/me/progress/{id}/{episodeId?}": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId?", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/me/progress/batch/update": { + "patch": { + "tags": [ + "Me" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + } + } + } + }, + "/me/progress/{libraryItemId}/{episodeId?}": { + "patch": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "libraryItemId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId?", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + } + } + } + }, + "/me/progress/{id}": { + "delete": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/me/item/{id}/bookmark": { + "post": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "time": { + "example": "any" + }, + "title": { + "example": "any" + } + } + } + } + } + } + }, + "patch": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "time": { + "example": "any" + }, + "title": { + "example": "any" + } + } + } + } + } + } + } + }, + "/me/item/{id}/bookmark/{time}": { + "delete": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "time", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/me/password": { + "patch": { + "tags": [ + "Me" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "password": { + "example": "any" + }, + "newPassword": { + "example": "any" + } + } + } + } + } + } + } + }, + "/me/items-in-progress": { + "get": { + "tags": [ + "Library Items" + ], + "description": "", + "parameters": [ + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/me/series/{id}/remove-from-continue-listening": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/me/series/{id}/readd-to-continue-listening": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/me/stats/year/{year}": { + "get": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "year", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + } + } + } + }, + "/me/ereader-devices": { + "post": { + "tags": [ + "Me" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ereaderDevices": { + "example": "any" + } + } + } + } + } + } + } + }, + "/backups": { + "get": { + "tags": [ + "Backups" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "Backups" + ], + "description": "", + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/backups/{id}": { + "delete": { + "tags": [ + "Backups" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/backups/{id}/download": { + "get": { + "tags": [ + "Backups" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "204": { + "description": "No Content" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/backups/{id}/apply": { + "get": { + "tags": [ + "Backups" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/backups/upload": { + "post": { + "tags": [ + "Backups" + ], + "description": "", + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/backups/path": { + "patch": { + "tags": [ + "Backups" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "path": { + "example": "any" + } + } + } + } + } + } + } + }, + "/filesystem": { + "get": { + "tags": [ + "File System" + ], + "description": "", + "parameters": [ + { + "name": "path", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "level", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/filesystem/pathexists": { + "post": { + "tags": [ + "File System" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "directory": { + "example": "any" + }, + "folderPath": { + "example": "any" + } + } + } + } + } + } + } + }, + "/authors/{id}": { + "get": { + "tags": [ + "Authors" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Authors" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "Authors" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/authors/{id}/match": { + "post": { + "tags": [ + "Authors" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "region": { + "example": "any" + }, + "asin": { + "example": "any" + }, + "q": { + "example": "any" + } + } + } + } + } + } + } + }, + "/authors/{id}/image": { + "get": { + "tags": [ + "Authors" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "Authors" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "url": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "Authors" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/series/{id}": { + "get": { + "tags": [ + "Series" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Series" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/sessions": { + "get": { + "tags": [ + "Sessions" + ], + "description": "", + "parameters": [ + { + "name": "user", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "desc", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "itemsPerPage", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/sessions/{id}": { + "delete": { + "tags": [ + "Sessions" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/sessions/open": { + "get": { + "tags": [ + "Sessions" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/sessions/batch/delete": { + "post": { + "tags": [ + "Sessions" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "sessions": { + "example": "any" + } + } + } + } + } + } + } + }, + "/session/local": { + "post": { + "tags": [ + "Sessions" + ], + "description": "", + "responses": { + "default": { + "description": "" + } + } + } + }, + "/session/local-all": { + "post": { + "tags": [ + "Sessions" + ], + "description": "", + "responses": { + "default": { + "description": "" + } + } + } + }, + "/session/{id}": { + "get": { + "tags": [ + "Sessions" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/session/{id}/sync": { + "post": { + "tags": [ + "Sessions" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/session/{id}/close": { + "post": { + "tags": [ + "Sessions" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/podcasts": { + "post": { + "tags": [ + "Podcasts" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "media": { + "example": "any" + }, + "libraryId": { + "example": "any" + }, + "folderId": { + "example": "any" + }, + "path": { + "example": "any" + } + } + } + } + } + } + } + }, + "/podcasts/feed": { + "post": { + "tags": [ + "Podcasts" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "rssFeed": { + "example": "any" + } + } + } + } + } + } + } + }, + "/podcasts/opml/parse": { + "post": { + "tags": [ + "Podcasts" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "opmlText": { + "example": "any" + } + } + } + } + } + } + } + }, + "/podcasts/opml/create": { + "post": { + "tags": [ + "Podcasts" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "feeds": { + "example": "any" + }, + "libraryId": { + "example": "any" + }, + "folderId": { + "example": "any" + }, + "autoDownloadEpisodes": { + "example": "any" + } + } + } + } + } + } + } + }, + "/podcasts/{id}/checknew": { + "get": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/podcasts/{id}/downloads": { + "get": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/podcasts/{id}/clear-queue": { + "get": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/podcasts/{id}/search-episode": { + "get": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "title", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/podcasts/{id}/download-episodes": { + "post": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "length": { + "example": "any" + } + } + } + } + } + } + } + }, + "/podcasts/{id}/match-episodes": { + "post": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "override", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/podcasts/{id}/episode/{episodeId}": { + "get": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "patch": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Podcasts" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "episodeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "hard", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/notifications": { + "get": { + "tags": [ + "Notifications" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Notifications" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "Notifications" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/notificationdata": { + "get": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/notifications/test": { + "get": { + "tags": [ + "Notifications" + ], + "description": "", + "parameters": [ + { + "name": "fail", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/notifications/{id}": { + "delete": { + "tags": [ + "Notifications" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Notifications" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/notifications/{id}/test": { + "get": { + "tags": [ + "Notifications" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/emails/settings": { + "get": { + "tags": [ + "Email" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + }, + "patch": { + "tags": [ + "Email" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/emails/test": { + "post": { + "tags": [ + "Email" + ], + "description": "", + "responses": { + "404": { + "description": "Not Found" + } + } + } + }, + "/emails/ereader-devices": { + "post": { + "tags": [ + "Email" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ereaderDevices": { + "example": "any" + } + } + } + } + } + } + } + }, + "/emails/send-ebook-to-device": { + "post": { + "tags": [ + "Email" + ], + "description": "", + "responses": { + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "deviceName": { + "example": "any" + }, + "libraryItemId": { + "example": "any" + } + } + } + } + } + } + } + }, + "/search/covers": { + "get": { + "tags": [ + "Search" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/search/books": { + "get": { + "tags": [ + "Search" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/search/podcast": { + "get": { + "tags": [ + "Search" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/search/authors": { + "get": { + "tags": [ + "Authors" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/search/chapters": { + "get": { + "tags": [ + "Search" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/search/providers": { + "get": { + "tags": [ + "Search" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/cache/purge": { + "post": { + "tags": [ + "Cache" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/cache/items/purge": { + "post": { + "tags": [ + "Library Items" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/tools/item/{id}/encode-m4b": { + "post": { + "tags": [ + "Tools" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "delete": { + "tags": [ + "Tools" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/tools/item/{id}/embed-metadata": { + "post": { + "tags": [ + "Tools" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "forceEmbedChapters", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "backup", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/tools/batch/embed-metadata": { + "post": { + "tags": [ + "Tools" + ], + "description": "", + "parameters": [ + { + "name": "forceEmbedChapters", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "backup", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryItemIds": { + "example": "any" + } + } + } + } + } + } + } + }, + "/feeds": { + "get": { + "tags": [ + "RSS Feeds" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/feeds/item/{itemId}/open": { + "post": { + "tags": [ + "RSS Feeds" + ], + "description": "", + "parameters": [ + { + "name": "itemId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "serverAddress": { + "example": "any" + }, + "slug": { + "example": "any" + } + } + } + } + } + } + } + }, + "/feeds/collection/{collectionId}/open": { + "post": { + "tags": [ + "RSS Feeds" + ], + "description": "", + "parameters": [ + { + "name": "collectionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "serverAddress": { + "example": "any" + }, + "slug": { + "example": "any" + } + } + } + } + } + } + } + }, + "/feeds/series/{seriesId}/open": { + "post": { + "tags": [ + "Series" + ], + "description": "", + "parameters": [ + { + "name": "seriesId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "serverAddress": { + "example": "any" + }, + "slug": { + "example": "any" + } + } + } + } + } + } + } + }, + "/feeds/{id}/close": { + "post": { + "tags": [ + "RSS Feeds" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/custom-metadata-providers": { + "get": { + "tags": [ + "Custom Metadata Providers" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + }, + "post": { + "tags": [ + "Custom Metadata Providers" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "url": { + "example": "any" + }, + "mediaType": { + "example": "any" + }, + "authHeaderValue": { + "example": "any" + } + } + } + } + } + } + } + }, + "/custom-metadata-providers/{id}": { + "delete": { + "tags": [ + "Custom Metadata Providers" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/share/mediaitem": { + "post": { + "tags": [ + "Me" + ], + "description": "", + "responses": { + "201": { + "description": "Created" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "409": { + "description": "Conflict" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "slug": { + "example": "any" + }, + "expiresAt": { + "example": "any" + }, + "mediaItemType": { + "example": "any" + }, + "mediaItemId": { + "example": "any" + }, + "isDownloadable": { + "example": "any" + } + } + } + } + } + } + } + }, + "/share/mediaitem/{id}": { + "delete": { + "tags": [ + "Me" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "No Content" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/stats/year/{year}": { + "get": { + "tags": [ + "Stats" + ], + "description": "", + "parameters": [ + { + "name": "year", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/stats/server": { + "get": { + "tags": [ + "Stats" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/api-keys": { + "get": { + "tags": [ + "API Keys" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + }, + "post": { + "tags": [ + "API Keys" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "500": { + "description": "Internal Server Error" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "expiresIn": { + "example": "any" + }, + "userId": { + "example": "any" + }, + "isActive": { + "example": "any" + } + } + } + } + } + } + } + }, + "/api-keys/{id}": { + "patch": { + "tags": [ + "API Keys" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + }, + "isActive": { + "example": "any" + } + } + } + } + } + } + }, + "delete": { + "tags": [ + "API Keys" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + } + } + }, + "/upload": { + "post": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + }, + "404": { + "description": "Not Found" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "title": { + "example": "any" + }, + "author": { + "example": "any" + }, + "series": { + "example": "any" + }, + "folder": { + "example": "any" + }, + "library": { + "example": "any" + } + } + } + } + } + } + } + }, + "/tasks": { + "get": { + "tags": [ + "Misc" + ], + "description": "", + "parameters": [ + { + "name": "include", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/settings": { + "patch": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "allowIframe": { + "example": "any" + }, + "allowedOrigins": { + "example": "any" + }, + "backupSchedule": { + "example": "any" + } + } + } + } + } + } + } + }, + "/sorting-prefixes": { + "patch": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "sortingPrefixes": { + "example": "any" + } + } + } + } + } + } + } + }, + "/authorize": { + "post": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/tags": { + "get": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/tags/rename": { + "post": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "tag": { + "example": "any" + }, + "newTag": { + "example": "any" + } + } + } + } + } + } + } + }, + "/tags/{tag}": { + "delete": { + "tags": [ + "Misc" + ], + "description": "", + "parameters": [ + { + "name": "tag", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/genres": { + "get": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/genres/rename": { + "post": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "genre": { + "example": "any" + }, + "newGenre": { + "example": "any" + } + } + } + } + } + } + } + }, + "/genres/{genre}": { + "delete": { + "tags": [ + "Misc" + ], + "description": "", + "parameters": [ + { + "name": "genre", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/validate-cron": { + "post": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "expression": { + "example": "any" + } + } + } + } + } + } + } + }, + "/auth-settings": { + "get": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + }, + "patch": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + } + } + }, + "/watcher/update": { + "post": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "403": { + "description": "Forbidden" + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "libraryId": { + "example": "any" + }, + "path": { + "example": "any" + }, + "type": { + "example": "any" + }, + "oldPath": { + "example": "any" + } + } + } + } + } + } + } + }, + "/logger-data": { + "get": { + "tags": [ + "Misc" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "403": { + "description": "Forbidden" + } + } + } + } + }, + "components": { + "securitySchemes": { + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT", + "description": "JWT Authorization header using the Bearer scheme" + }, + "cookieAuth": { + "type": "apiKey", + "in": "cookie", + "name": "token", + "description": "Session cookie authentication" + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "cookieAuth": [] + } + ] +} \ No newline at end of file diff --git a/swagger.js b/swagger.js new file mode 100644 index 000000000..b35997420 --- /dev/null +++ b/swagger.js @@ -0,0 +1,118 @@ +const swaggerAutogen = require('swagger-autogen')({ openapi: '3.0.0' }) +const { version } = require('./package.json') + +const doc = { + info: { + version: version, + title: 'Audiobookshelf API', + description: 'Self-hosted audiobook and podcast server API' + }, + servers: [ + { + url: 'http://localhost:3333', + description: 'Local development server' + } + ], + tags: [ + { name: 'Libraries', description: 'Library management endpoints' }, + { name: 'Library Items', description: 'Library item management endpoints' }, + { name: 'Users', description: 'User management endpoints' }, + { name: 'Collections', description: 'Collection management endpoints' }, + { name: 'Playlists', description: 'Playlist management endpoints' }, + { name: 'Me', description: 'Current user endpoints' }, + { name: 'Backups', description: 'Backup management endpoints' }, + { name: 'Series', description: 'Series management endpoints' }, + { name: 'Authors', description: 'Author management endpoints' }, + { name: 'Sessions', description: 'Playback session endpoints' }, + { name: 'Podcasts', description: 'Podcast management endpoints' }, + { name: 'Notifications', description: 'Notification management endpoints' }, + { name: 'Email', description: 'Email configuration endpoints' }, + { name: 'Search', description: 'Search endpoints' }, + { name: 'Cache', description: 'Cache management endpoints' }, + { name: 'Tools', description: 'Tool endpoints' }, + { name: 'RSS Feeds', description: 'RSS feed management endpoints' }, + { name: 'Custom Metadata Providers', description: 'Custom metadata provider endpoints' }, + { name: 'Misc', description: 'Miscellaneous endpoints' }, + { name: 'Share', description: 'Media sharing endpoints' }, + { name: 'Stats', description: 'Statistics endpoints' }, + { name: 'API Keys', description: 'API key management endpoints' }, + { name: 'File System', description: 'File system endpoints' } + ], + components: { + securitySchemes: { + bearerAuth: { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + description: 'JWT Authorization header using the Bearer scheme' + }, + cookieAuth: { + type: 'apiKey', + in: 'cookie', + name: 'token', + description: 'Session cookie authentication' + } + } + }, + security: [{ bearerAuth: [] }, { cookieAuth: [] }] +} + +const outputFile = './docs/swagger-output.json' +const routes = ['./server/routers/ApiRouter.js'] + +swaggerAutogen(outputFile, routes, doc).then((data) => { + const spec = data.data + const fs = require('fs') + + const tagMap = { + libraries: ['Libraries', /\/libraries/i], + items: ['Library Items', /\/items/i], + users: ['Users', /\/users/i], + collections: ['Collections', /\/collections/i], + playlists: ['Playlists', /\/playlists/i], + me: ['Me', /\/me/i], + backups: ['Backups', /\/backups/i], + series: ['Series', /\/series/i], + authors: ['Authors', /\/authors/i], + sessions: ['Sessions', /\/sessions|\/session/i], + podcasts: ['Podcasts', /\/podcasts/i], + notifications: ['Notifications', /\/notifications/i], + email: ['Email', /\/emails/i], + search: ['Search', /\/search/i], + cache: ['Cache', /\/cache/i], + tools: ['Tools', /\/tools/i], + feeds: ['RSS Feeds', /\/feeds/i], + metadata: ['Custom Metadata Providers', /\/custom-metadata-providers/i], + share: ['Share', /\/share/i], + stats: ['Stats', /\/stats/i], + apikeys: ['API Keys', /\/api-keys/i], + filesystem: ['File System', /\/filesystem/i], + misc: ['Misc', /.*/] + } + + for (const path in spec.paths) { + const pathSpec = spec.paths[path] + + for (const method in pathSpec) { + if (['get', 'post', 'put', 'patch', 'delete'].includes(method)) { + const operation = pathSpec[method] + + for (const key in tagMap) { + const [tagName, pattern] = tagMap[key] + if (pattern.test(path)) { + if (!operation.tags) operation.tags = [] + if (!operation.tags.includes(tagName)) { + operation.tags = [tagName] + } + break + } + } + } + } + } + + fs.writeFileSync(outputFile, JSON.stringify(spec, null, 2)) + + console.log('Swagger documentation generated successfully!') + console.log(`Generated ${Object.keys(spec.paths).length} endpoints`) +}) diff --git a/view-docs.js b/view-docs.js new file mode 100644 index 000000000..f55deec01 --- /dev/null +++ b/view-docs.js @@ -0,0 +1,56 @@ +#!/usr/bin/env node +/** + * View Swagger documentation in browser + * Opens ReDoc documentation for the generated swagger-output.json + */ + +const http = require('http') +const fs = require('fs') +const path = require('path') + +const swaggerPath = path.join(__dirname, 'docs', 'swagger-output.json') +const port = 3004 + +if (!fs.existsSync(swaggerPath)) { + console.error('swagger-output.json not found. Run "node swagger.js" first.') + process.exit(1) +} + +const html = ` + + +
+