From 3a91092fbfad18693cf87ba254a2c819cea2e574 Mon Sep 17 00:00:00 2001 From: Nicholas W Date: Sun, 4 Aug 2024 00:00:32 -0700 Subject: [PATCH] Schema updates from August 3 (#1) * Update: formatting * Fix: libraryItemController `play` endpoint + Endpoints cannot have optional path parameters + Moved schemas to `components` section * Fix: MeController optional path parameters * Fix: Books do not have `episodeId` in `mediaProgress` * Fix: `PlaybackSession` oneOf between book and podcast * Update: bundled spec * Fix: `allowReserved` in LibraryItem include query * Add: tags to AuthController endpoints * Fix: summary of play endpoints * Update: bundled spec --- docs/controllers/AuthController.yaml | 7 +- docs/controllers/LibraryItemController.yaml | 192 +++++++++----- docs/controllers/MeController.yaml | 250 +++++++++--------- docs/controllers/SessionController.yaml | 266 ++++++++++---------- docs/objects/Bookmarks.yaml | 4 +- docs/objects/LibraryItem.yaml | 20 +- docs/objects/Media.yaml | 70 ++++-- docs/objects/entities/Device.yaml | 40 +-- docs/objects/entities/PlaybackSession.yaml | 81 ++++-- docs/objects/files/AudioFile.yaml | 31 ++- docs/objects/metadata/BookMetadata.yaml | 35 +-- docs/openapi.json | Bin 353792 -> 177228 bytes docs/root.yaml | 6 +- 13 files changed, 561 insertions(+), 441 deletions(-) diff --git a/docs/controllers/AuthController.yaml b/docs/controllers/AuthController.yaml index 62c71b1c1..0b148feea 100644 --- a/docs/controllers/AuthController.yaml +++ b/docs/controllers/AuthController.yaml @@ -4,6 +4,8 @@ paths: summary: Login to the server description: Logs in a client to the server, returning information about the user and server. operationId: login + tags: + - Auth requestBody: required: true content: @@ -15,9 +17,6 @@ paths: $ref: '../objects/entities/User.yaml#/components/schemas/username' password: $ref: '../objects/entities/User.yaml#/components/schemas/password' - required: - - username - - password responses: '200': description: Success @@ -40,6 +39,8 @@ paths: summary: Logout from the server description: Logs out a client from the server. If the socketId parameter is provided, the server removes the socket from the client list. operationId: logout + tags: + - Auth requestBody: required: true content: diff --git a/docs/controllers/LibraryItemController.yaml b/docs/controllers/LibraryItemController.yaml index 6a3a34670..013b94a6f 100644 --- a/docs/controllers/LibraryItemController.yaml +++ b/docs/controllers/LibraryItemController.yaml @@ -1,3 +1,69 @@ +components: + schemas: + parameters: + include: + in: query + name: include + description: A comma separated list of what to include with the library item. The options are progress, rssfeed, authors (for books), and downloads (for podcasts). expanded must be 1 for include to have an effect. + allowReserved: true + schema: + type: string + expanded: + in: query + name: expanded + description: Whether to return Library Item Expanded instead. 0 for false, 1 for true. + schema: + type: integer + example: 1 + episode: + in: query + name: episode + description: If requesting progress for a podcast, the episode ID to get progress for. + schema: + $ref: '../objects/mediaTypes/Podcast.yaml#/components/schemas/podcastId' + deviceInfo: + in: query + name: deviceInfo + description: The device information to send to the server. + schema: + $ref: '../objects/entities/Device.yaml#/components/schemas/deviceInfo' + forceDirectPlay: + in: query + name: forceDirectPlay + description: Whether to force direct play of the library item. + schema: + type: boolean + example: false + forceTranscode: + in: query + name: forceTranscode + description: Whether to force transcoding of the library item. + schema: + type: boolean + example: false + supportedMimeTypes: + in: query + name: supportedMimeTypes + description: The supported mime types for the device. + schema: + type: array + items: + type: string + mediaPlayer: + in: query + name: mediaPlayer + description: The media player to use. + schema: + type: string + responses: + libraryItem404: + description: Not Found + content: + text/html: + schema: + type: string + description: The library item does not exist. + example: Not Found paths: /api/items/{id}: parameters: @@ -14,32 +80,50 @@ paths: tags: - LibraryItem parameters: - - in: query - name: include - description: A comma separated list of what to include with the library item. The options are progress, rssfeed, authors (for books), and downloads (for podcasts). expanded must be 1 for include to have an effect. - schema: - type: string - - in: query - name: expanded - description: Whether to return Library Item Expanded instead. 0 for false, 1 for true. - schema: - type: integer - example: 1 - - in: query - name: episode - description: If requesting progress for a podcast, the episode ID to get progress for. - schema: - $ref: '../objects/mediaTypes/Podcast.yaml#/components/schemas/podcastId' + - $ref: '#/components/schemas/parameters/include' + - $ref: '#/components/schemas/parameters/expanded' + - $ref: '#/components/schemas/parameters/episode' responses: '200': - description: OK - content: - application/json: - schema: - type: object - description: TODO - oneOf: - - $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItem' + description: OK + content: + application/json: + schema: + type: object + description: TODO + oneOf: + - $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItem' + '404': + $ref: '#/components/responses/libraryItem404' + /api/items/{id}/play: + parameters: + - name: id + in: path + description: The ID of the library item. + required: true + schema: + $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItemId' + post: + operationId: playLibraryItem + summary: Play a library item + description: Play a library item by ID. + tags: + - LibraryItem + parameters: + - $ref: '#/components/schemas/parameters/deviceInfo' + - $ref: '#/components/schemas/parameters/forceDirectPlay' + - $ref: '#/components/schemas/parameters/forceTranscode' + - $ref: '#/components/schemas/parameters/supportedMimeTypes' + - $ref: '#/components/schemas/parameters/mediaPlayer' + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionExpanded' + '404': + $ref: '#/components/responses/libraryItem404' /api/items/{id}/play/{episodeId}: parameters: - name: id @@ -51,57 +135,27 @@ paths: - name: episodeId in: path description: The ID of the episode to play. - required: false + required: true schema: $ref: '../objects/mediaTypes/Podcast.yaml#/components/schemas/podcastId' post: - operationId: playLibraryItem - summary: Play a library item. - description: Play a library item. + operationId: playLibraryItemPodcastEpisode + summary: Play a podcast episode + description: Play a podcast by library item ID and episode ID. tags: - LibraryItem parameters: - - in: query - name: deviceInfo - description: The device information to send to the server. - schema: - $ref: '../objects/entities/Device.yaml#/components/schemas/deviceInfo' - - in: query - name: forceDirectPlay - description: Whether to force direct play of the library item. - schema: - type: boolean - example: false - - in: query - name: forceTranscode - description: Whether to force transcoding of the library item. - schema: - type: boolean - example: false - - in: query - name: supportedMimeTypes - description: The supported mime types for the device. - schema: - type: array - items: - type: string - - in: query - name: mediaPlayer - description: The media player to use. - schema: - type: string + - $ref: '#/components/schemas/parameters/deviceInfo' + - $ref: '#/components/schemas/parameters/forceDirectPlay' + - $ref: '#/components/schemas/parameters/forceTranscode' + - $ref: '#/components/schemas/parameters/supportedMimeTypes' + - $ref: '#/components/schemas/parameters/mediaPlayer' responses: '200': - description: OK - content: - application/json: - schema: - $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionExpanded' + description: OK + content: + application/json: + schema: + $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionExpanded' '404': - description: Not Found - content: - text/html: - schema: - type: string - description: The library item does not have any audio tracks to play. - example: Not Found + $ref: '#/components/responses/libraryItem404' diff --git a/docs/controllers/MeController.yaml b/docs/controllers/MeController.yaml index b461ea886..6cf1c5a72 100644 --- a/docs/controllers/MeController.yaml +++ b/docs/controllers/MeController.yaml @@ -4,6 +4,14 @@ components: description: The total time listened in seconds. type: integer example: 123456 + responses: + me404: + description: Not Found + content: + html/text: + schema: + type: string + example: Not Found paths: /api/me: get: @@ -14,11 +22,34 @@ paths: - Me responses: '200': - description: Success - content: - application/json: - schema: - $ref: '../objects/entities/User.yaml#/components/schemas/user' + description: Success + content: + application/json: + schema: + $ref: '../objects/entities/User.yaml#/components/schemas/user' + /api/me/progress/{libraryItemId}: + parameters: + - name: libraryItemId + in: path + description: The ID of the library item. + required: true + schema: + $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItemId' + get: + operationId: getProgressLibraryItem + summary: Get the user's progress for a library item. + description: Get the user's progress for a library item. + tags: + - Me + responses: + '200': + description: OK + content: + application/json: + schema: + $ref: '../objects/Media.yaml#/components/schemas/mediaProgress' + '404': + $ref: '#/components/responses/me404' /api/me/progress/{libraryItemId}/{episodeId}: parameters: - name: libraryItemId @@ -30,57 +61,24 @@ paths: - name: episodeId in: path description: The ID of the episode to get progress for. - required: false + required: true schema: $ref: '../objects/mediaTypes/Podcast.yaml#/components/schemas/podcastId' get: - operationId: getProgress - summary: Get the user's progress for a library item. - description: Get the user's progress for a library item. + operationId: getProgressPodcastEpisode + summary: Get the user's progress for a podcast episode. + description: Get the user's progress for a podcast episode. tags: - Me responses: '200': - description: OK - content: - application/json: - schema: - $ref: '../objects/Media.yaml#/components/schemas/mediaProgress' + description: OK + content: + application/json: + schema: + $ref: '../objects/Media.yaml#/components/schemas/mediaProgressPodcastEpisode' '404': - description: Not Found - content: - html/text: - schema: - type: string - example: Not Found - /api/me/progress/{mediaId}: - parameters: - - name: mediaId - in: path - description: The ID of the media progress. - required: true - schema: - $ref: '../objects/Media.yaml#/components/schemas/mediaProgressId' - get: - operationId: getProgressById - summary: Get the user's progress for a media item. - description: Get the user's progress for a media item. - tags: - - Me - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '../objects/Media.yaml#/components/schemas/mediaProgress' - '404': - description: Not Found - content: - html/text: - schema: - type: string - example: Not Found + $ref: '#/components/responses/me404' /api/me/listening-sessions: get: operationId: getListeningSessions @@ -94,32 +92,32 @@ paths: description: The number of items per page. required: true schema: - $ref: '../schemas.yaml#/components/schemas/limit' + $ref: '../schemas.yaml#/components/schemas/limit' - name: page in: query description: The page number (zero indexed) to return. required: true schema: - $ref: '../schemas.yaml#/components/schemas/page' + $ref: '../schemas.yaml#/components/schemas/page' responses: '200': - description: OK - content: - application/json: - schema: - type: object - properties: - total: - $ref: '../schemas.yaml#/components/schemas/total' - numPages: - description: The number of pages. - type: integer - itemsPerPage: - $ref: '../schemas.yaml#/components/schemas/limit' - sessions: - type: array - items: - $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSession' + description: OK + content: + application/json: + schema: + type: object + properties: + total: + $ref: '../schemas.yaml#/components/schemas/total' + numPages: + description: The number of pages. + type: integer + itemsPerPage: + $ref: '../schemas.yaml#/components/schemas/limit' + sessions: + type: array + items: + $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSession' /api/me/items-in-progress: get: operationId: getItemsInProgress @@ -133,26 +131,26 @@ paths: description: The number of items to return. required: false schema: - $ref: '../schemas.yaml#/components/schemas/limit' + $ref: '../schemas.yaml#/components/schemas/limit' responses: '200': - description: OK - content: - application/json: - schema: - type: object - properties: - total: - $ref: '../schemas.yaml#/components/schemas/total' - numPages: - description: The number of pages. - type: integer - itemsPerPage: - $ref: '../schemas.yaml#/components/schemas/limit' - items: - type: array - items: - $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItemMinified' + description: OK + content: + application/json: + schema: + type: object + properties: + total: + $ref: '../schemas.yaml#/components/schemas/total' + numPages: + description: The number of pages. + type: integer + itemsPerPage: + $ref: '../schemas.yaml#/components/schemas/limit' + items: + type: array + items: + $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItemMinified' /api/me/listening-stats: get: operationId: getListeningStats @@ -162,46 +160,46 @@ paths: - Me responses: '200': - description: OK - content: - application/json: - schema: + description: OK + content: + application/json: + schema: + type: object + properties: + totalTime: + $ref: '#/components/schemas/totalTime' + items: + type: object + description: A list of library items the user has listened to, keyed by their item IDs. + additionalProperties: type: object properties: - totalTime: - $ref: '#/components/schemas/totalTime' - items: - type: object - description: A list of library items the user has listened to, keyed by their item IDs. - additionalProperties: - type: object - properties: - id: - type: string - description: The ID of the library item. - timeListening: - type: integer - description: The time (in seconds) the user listened to this library item. - mediaMetadata: - oneOf: - - $ref: '../objects/metadata/BookMetadata.yaml#/components/schemas/bookMetadata' - - $ref: '../objects/metadata/PodcastMetadata.yaml#/components/schemas/PodcastMetadata' - days: - type: object - description: A mapping of days to total listening times. - additionalProperties: - type: integer - description: The total time (in seconds) listened to on that day. - dayOfWeek: - type: object - description: A mapping of days of the week to total listening times. - additionalProperties: - type: integer - description: The total time (in seconds) listened to on that day of the week. - today: - type: integer - description: The time (in seconds) the user has listened to library items today. - recentSessions: - type: array - items: - $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSession' + id: + type: string + description: The ID of the library item. + timeListening: + type: integer + description: The time (in seconds) the user listened to this library item. + mediaMetadata: + oneOf: + - $ref: '../objects/metadata/BookMetadata.yaml#/components/schemas/bookMetadata' + - $ref: '../objects/metadata/PodcastMetadata.yaml#/components/schemas/PodcastMetadata' + days: + type: object + description: A mapping of days to total listening times. + additionalProperties: + type: integer + description: The total time (in seconds) listened to on that day. + dayOfWeek: + type: object + description: A mapping of days of the week to total listening times. + additionalProperties: + type: integer + description: The total time (in seconds) listened to on that day of the week. + today: + type: integer + description: The time (in seconds) the user has listened to library items today. + recentSessions: + type: array + items: + $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSession' diff --git a/docs/controllers/SessionController.yaml b/docs/controllers/SessionController.yaml index 3a1f17057..20c97e403 100644 --- a/docs/controllers/SessionController.yaml +++ b/docs/controllers/SessionController.yaml @@ -18,41 +18,41 @@ paths: description: The current time of the session. required: true schema: - $ref: '../schemas.yaml#/components/schemas/durationSec' + $ref: '../schemas.yaml#/components/schemas/durationSec' - name: timeListened in: query description: The time listened to the session. required: true schema: - $ref: '../schemas.yaml#/components/schemas/durationSec' + $ref: '../schemas.yaml#/components/schemas/durationSec' - name: duration in: query description: The duration of the session. required: true schema: - $ref: '../schemas.yaml#/components/schemas/durationSec' + $ref: '../schemas.yaml#/components/schemas/durationSec' responses: '200': - description: OK - content: - html/text: - schema: - type: string - example: OK + description: OK + content: + html/text: + schema: + type: string + example: OK '404': - description: No listening session with the provided ID is open, or the session belongs to another user. - content: - html/text: - schema: - type: string - example: Not Found + description: No listening session with the provided ID is open, or the session belongs to another user. + content: + html/text: + schema: + type: string + example: Not Found '500': - description: There was an error syncing the session. - content: - html/text: - schema: - type: string - example: Internal Server Error + description: There was an error syncing the session. + content: + html/text: + schema: + type: string + example: Internal Server Error /api/sessions/{id}: delete: operationId: deleteSession @@ -69,26 +69,26 @@ paths: $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionId' responses: '200': - description: OK - content: - html/text: - schema: - type: string - example: OK + description: OK + content: + html/text: + schema: + type: string + example: OK '403': - description: A user with delete permissions is required to delete sessions. - content: - html/text: - schema: - type: string - example: Forbidden + description: A user with delete permissions is required to delete sessions. + content: + html/text: + schema: + type: string + example: Forbidden '404': - description: No listening session with the provided ID was found. - content: - html/text: - schema: - type: string - example: Not Found + description: No listening session with the provided ID was found. + content: + html/text: + schema: + type: string + example: Not Found /api/session/{id}/close: post: operationId: closeSession @@ -123,103 +123,103 @@ paths: $ref: '../schemas.yaml#/components/schemas/durationSec' responses: '200': - description: OK - content: - html/text: - schema: - type: string - example: OK + description: OK + content: + html/text: + schema: + type: string + example: OK '404': - description: No listening session with the provided ID is open, or the session belongs to another user. - content: - html/text: - schema: - type: string - example: Not Found + description: No listening session with the provided ID is open, or the session belongs to another user. + content: + html/text: + schema: + type: string + example: Not Found /api/session/{id}: get: - operationId: getSession - summary: Get a listening session. - description: Get a listening session. - tags: - - Session - parameters: - - name: id - in: path - description: The ID of the session. - required: true + operationId: getSession + summary: Get a listening session. + description: Get a listening session. + tags: + - Session + parameters: + - name: id + in: path + description: The ID of the session. + required: true + schema: + $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionId' + responses: + '200': + description: OK + content: + application/json: schema: - $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionId' - responses: - '200': - description: OK - content: - application/json: - schema: - $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionExpanded' - '404': - description: No listening session with the provided ID was found. - content: - html/text: - schema: - type: string - example: Not Found + $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSessionExpanded' + '404': + description: No listening session with the provided ID was found. + content: + html/text: + schema: + type: string + example: Not Found /api/sessions: get: - operationId: getSessions - summary: Get all listening sessions. - description: Get all listening sessions. - tags: - - Session - parameters: - - name: user - in: query - description: The ID of the user to filter listening sessions by. - required: false - schema: - $ref: '../objects/entities/User.yaml#/components/schemas/userId' - - name: itemsPerPage - in: query - description: The number of items to return. - required: false - schema: - $ref: '../schemas.yaml#/components/schemas/limit' - - name: page - in: query - description: The page number (zero indexed) to return. - required: false - schema: - $ref: '../schemas.yaml#/components/schemas/page' - responses: - '200': - description: OK - content: - application/json: - schema: - type: object - properties: - results: - type: array - items: - $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItemBase' - total: - $ref: '../schemas.yaml#/components/schemas/total' - itemsPerPage: - $ref: '../schemas.yaml#/components/schemas/limit' - numPages: - description: The number of pages. - type: integer - example: 10 - userFilter: - description: If provided, the `user` parameter. - sessions: - type: array - items: - $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSession' - '404': - description: No listening sessions were found. - content: - html/text: - schema: - type: string - example: Not Found + operationId: getSessions + summary: Get all listening sessions. + description: Get all listening sessions. + tags: + - Session + parameters: + - name: user + in: query + description: The ID of the user to filter listening sessions by. + required: false + schema: + $ref: '../objects/entities/User.yaml#/components/schemas/userId' + - name: itemsPerPage + in: query + description: The number of items to return. + required: false + schema: + $ref: '../schemas.yaml#/components/schemas/limit' + - name: page + in: query + description: The page number (zero indexed) to return. + required: false + schema: + $ref: '../schemas.yaml#/components/schemas/page' + responses: + '200': + description: OK + content: + application/json: + schema: + type: object + properties: + results: + type: array + items: + $ref: '../objects/LibraryItem.yaml#/components/schemas/libraryItemBase' + total: + $ref: '../schemas.yaml#/components/schemas/total' + itemsPerPage: + $ref: '../schemas.yaml#/components/schemas/limit' + numPages: + description: The number of pages. + type: integer + example: 10 + userFilter: + description: If provided, the `user` parameter. + sessions: + type: array + items: + $ref: '../objects/entities/PlaybackSession.yaml#/components/schemas/playbackSession' + '404': + description: No listening sessions were found. + content: + html/text: + schema: + type: string + example: Not Found diff --git a/docs/objects/Bookmarks.yaml b/docs/objects/Bookmarks.yaml index 0099b42cc..07fd3256b 100644 --- a/docs/objects/Bookmarks.yaml +++ b/docs/objects/Bookmarks.yaml @@ -7,7 +7,7 @@ components: bookmark: properties: libraryItemId: - $ref: 'LibraryItem.yaml#/components/schemas/libraryItemId' + $ref: './LibraryItem.yaml#/components/schemas/libraryItemId' title: type: string description: The title of the bookmark. @@ -15,4 +15,4 @@ components: time: $ref: '#/components/schemas/time' createdAt: - $ref: '../schemas.yaml#/components/schemas/createdAt' \ No newline at end of file + $ref: '../schemas.yaml#/components/schemas/createdAt' diff --git a/docs/objects/LibraryItem.yaml b/docs/objects/LibraryItem.yaml index ecf70127c..51eb25623 100644 --- a/docs/objects/LibraryItem.yaml +++ b/docs/objects/LibraryItem.yaml @@ -67,16 +67,16 @@ components: media: $ref: './mediaTypes/media.yaml#/components/schemas/mediaMinified' libraryItem: - type: object - description: A single item on the server, like a book or podcast. - allOf: - - $ref: '#/components/schemas/libraryItemBase' - - type: object - properties: - libraryFiles: - type: array - items: - $ref: './files/AudioFile.yaml#/components/schemas/libraryFile' + type: object + description: A single item on the server, like a book or podcast. + allOf: + - $ref: '#/components/schemas/libraryItemBase' + - type: object + properties: + libraryFiles: + type: array + items: + $ref: './files/AudioFile.yaml#/components/schemas/libraryFile' libraryItemSequence: type: object description: A single item on the server, like a book or podcast. Includes series sequence information. diff --git a/docs/objects/Media.yaml b/docs/objects/Media.yaml index 0809ef97e..f1414b593 100644 --- a/docs/objects/Media.yaml +++ b/docs/objects/Media.yaml @@ -5,38 +5,72 @@ components: description: The ID of the media progress. example: e4bb1afb-4a4f-4dd6-8be0-e615d233185b format: uuid + progress: + type: number + description: The user's progress in the media item. + example: 0.5 + currentTime: + type: number + description: The user's current time in the media item. + example: 0.5 + isFinished: + type: boolean + description: Whether the user has finished the media item. + example: false + hideFromContinueListening: + type: boolean + description: Whether the media item should be hidden from the continue listening section. + example: false + finishedAt: + type: integer + nullable: true + description: The time (in ms since POSIX epoch) when the media was finished. Will be null if the media has is not finished. + example: 1616239000 mediaProgress: type: object properties: id: $ref: '#/components/schemas/mediaProgressId' libraryItemId: - $ref: 'LibraryItem.yaml#/components/schemas/libraryItemId' - episodeId: - $ref: 'mediaTypes/Podcast.yaml#/components/schemas/podcastId' + $ref: './LibraryItem.yaml#/components/schemas/libraryItemId' duration: $ref: '../schemas.yaml#/components/schemas/durationSec' progress: - type: number - description: The user's progress in the media item. - example: 0.5 + $ref: '#/components/schemas/progress' currentTime: - type: number - description: The user's current time in the media item. - example: 0.5 + $ref: '#/components/schemas/currentTime' isFinished: - type: boolean - description: Whether the user has finished the media item. - example: false + $ref: '#/components/schemas/isFinished' hideFromContinueListening: - type: boolean - description: Whether the media item should be hidden from the continue listening section. - example: false + $ref: '#/components/schemas/hideFromContinueListening' lastUpdate: $ref: '../schemas.yaml#/components/schemas/updatedAt' startedAt: $ref: '../schemas.yaml#/components/schemas/createdAt' finishedAt: - type: integer - description: The time (in ms since POSIX epoch) when the media was finished. Will be null if the media has is not finished. - example: 1616239000 \ No newline at end of file + $ref: '#/components/schemas/finishedAt' + mediaProgressPodcastEpisode: + type: object + properties: + id: + $ref: '#/components/schemas/mediaProgressId' + libraryItemId: + $ref: './LibraryItem.yaml#/components/schemas/libraryItemId' + episodeId: + $ref: './mediaTypes/Podcast.yaml#/components/schemas/podcastId' + duration: + $ref: '../schemas.yaml#/components/schemas/durationSec' + progress: + $ref: '#/components/schemas/progress' + currentTime: + $ref: '#/components/schemas/currentTime' + isFinished: + $ref: '#/components/schemas/isFinished' + hideFromContinueListening: + $ref: '#/components/schemas/hideFromContinueListening' + lastUpdate: + $ref: '../schemas.yaml#/components/schemas/updatedAt' + startedAt: + $ref: '../schemas.yaml#/components/schemas/createdAt' + finishedAt: + $ref: '#/components/schemas/finishedAt' diff --git a/docs/objects/entities/Device.yaml b/docs/objects/entities/Device.yaml index 17e99b277..89bdfcf2a 100644 --- a/docs/objects/entities/Device.yaml +++ b/docs/objects/entities/Device.yaml @@ -11,32 +11,32 @@ components: clientName: description: The client name. type: string - example: "Audible" + example: 'Audible' manufacturer: description: The manufacturer of the device. type: string - example: "Apple" + example: 'Apple' model: - description: The model of the device. - type: string - example: "iPhone 12" + description: The model of the device. + type: string + example: 'iPhone 12' sdkVersion: description: For an Android client, the Android SDK version of the client. type: integer example: 49 deviceInfo: - description: The device information to send to the server. - type: object - properties: - deviceId: - $ref: '#/components/schemas/deviceId' - clientVersion: - $ref: '#/components/schemas/clientVersion' - clientName: - $ref: '#/components/schemas/clientName' - manufacturer: - $ref: '#/components/schemas/manufacturer' - model: - $ref: '#/components/schemas/model' - sdkVersion: - $ref: '#/components/schemas/sdkVersion' + description: The device information to send to the server. + type: object + properties: + deviceId: + $ref: '#/components/schemas/deviceId' + clientVersion: + $ref: '#/components/schemas/clientVersion' + clientName: + $ref: '#/components/schemas/clientName' + manufacturer: + $ref: '#/components/schemas/manufacturer' + model: + $ref: '#/components/schemas/model' + sdkVersion: + $ref: '#/components/schemas/sdkVersion' diff --git a/docs/objects/entities/PlaybackSession.yaml b/docs/objects/entities/PlaybackSession.yaml index 17004fb9f..a43d38b5b 100644 --- a/docs/objects/entities/PlaybackSession.yaml +++ b/docs/objects/entities/PlaybackSession.yaml @@ -7,6 +7,17 @@ components: playbackSession: type: object description: A playback session object. + oneOf: + - $ref: '#/components/schemas/playbackSessionBook' + - $ref: '#/components/schemas/playbackSessionPodcast' + discriminator: + propertyName: mediaType + mapping: + book: '#/components/schemas/playbackSessionBook' + podcast: '#/components/schemas/playbackSessionPodcast' + playbackSessionBase: + type: object + description: Base playback session object. properties: id: $ref: '#/components/schemas/playbackSessionId' @@ -16,20 +27,8 @@ components: $ref: '../Library.yaml#/components/schemas/libraryId' libraryItemId: $ref: '../LibraryItem.yaml#/components/schemas/libraryItemId' - episodeId: - $ref: '../mediaTypes/Podcast.yaml#/components/schemas/podcastId' mediaType: $ref: '../mediaTypes/media.yaml#/components/schemas/mediaType' - mediaMetadata: - description: The metadata of the media. - oneOf: - - $ref: '../mediaTypes/Book.yaml#/components/schemas/bookMinified' - - $ref: '../mediaTypes/Podcast.yaml#/components/schemas/Podcast' - chapters: - description: The chapters of the media. - type: array - items: - $ref: '../metadata/BookMetadata.yaml#/components/schemas/bookChapter' displayTitle: description: The display title of the media. type: string @@ -66,19 +65,67 @@ components: $ref: '../../schemas.yaml#/components/schemas/createdAt' updatedAt: $ref: '../../schemas.yaml#/components/schemas/updatedAt' - playbackSessionExpanded: - description: Expanded playback session schema. + playbackSessionBook: + description: Book playback session schema. allOf: - - $ref: '#/components/schemas/playbackSession' + - $ref: '#/components/schemas/playbackSessionBase' + - properties: + mediaMetadata: + $ref: '../metadata/BookMetadata.yaml#/components/schemas/bookMetadata' + chapters: + description: The chapters of the media. + type: array + items: + $ref: '../metadata/BookMetadata.yaml#/components/schemas/bookChapter' + playbackSessionPodcast: + description: Podcast playback session schema. + allOf: + - $ref: '#/components/schemas/playbackSessionBase' + - properties: + mediaMetadata: + $ref: '../metadata/PodcastMetadata.yaml#/components/schemas/PodcastMetadata' + episodeId: + $ref: '../mediaTypes/Podcast.yaml#/components/schemas/podcastId' + playbackSessionExpanded: + type: object + description: A playback session object. + oneOf: + - $ref: '#/components/schemas/playbackSessionBookExpanded' + - $ref: '#/components/schemas/playbackSessionPodcastExpanded' + discriminator: + propertyName: mediaType + mapping: + book: '#/components/schemas/playbackSessionBookExpanded' + podcast: '#/components/schemas/playbackSessionPodcastExpanded' + playbackSessionBookExpanded: + description: Expanded book playback session schema. + allOf: + - $ref: '#/components/schemas/playbackSessionBook' - properties: audioTracks: description: The audio tracks of the media. type: array items: - $ref: '../files/AudioTrack.yaml#/components/schemas/AudioTrack' + $ref: '../files/AudioTrack.yaml#/components/schemas/AudioTrack' videoTrack: description: The video track of the media. TODO type: object nullable: true libraryItem: - $ref: '../LibraryItem.yaml#/components/schemas/libraryItem' + $ref: '../LibraryItem.yaml#/components/schemas/libraryItem' + playbackSessionPodcastExpanded: + description: Expanded podcast playback session schema. + allOf: + - $ref: '#/components/schemas/playbackSessionPodcast' + - properties: + audioTracks: + description: The audio tracks of the media. + type: array + items: + $ref: '../files/AudioTrack.yaml#/components/schemas/AudioTrack' + videoTrack: + description: The video track of the media. TODO + type: object + nullable: true + libraryItem: + $ref: '../LibraryItem.yaml#/components/schemas/libraryItem' diff --git a/docs/objects/files/AudioFile.yaml b/docs/objects/files/AudioFile.yaml index 6092af262..6ffa3affc 100644 --- a/docs/objects/files/AudioFile.yaml +++ b/docs/objects/files/AudioFile.yaml @@ -93,19 +93,18 @@ components: type: string example: audio/mpeg libraryFile: - type: object - description: A library file. Includes the path and metadata of the file. - properties: - ino: - $ref: '../../schemas.yaml#/components/schemas/inode' - addedAt: - $ref: '../../schemas.yaml#/components/schemas/addedAt' - updatedAt: - $ref: '../../schemas.yaml#/components/schemas/updatedAt' - fileType: - description: The type of file. - type: string - example: audio - metadata: - $ref: '../metadata/FileMetadata.yaml#/components/schemas/fileMetadata' - + type: object + description: A library file. Includes the path and metadata of the file. + properties: + ino: + $ref: '../../schemas.yaml#/components/schemas/inode' + addedAt: + $ref: '../../schemas.yaml#/components/schemas/addedAt' + updatedAt: + $ref: '../../schemas.yaml#/components/schemas/updatedAt' + fileType: + description: The type of file. + type: string + example: audio + metadata: + $ref: '../metadata/FileMetadata.yaml#/components/schemas/fileMetadata' diff --git a/docs/objects/metadata/BookMetadata.yaml b/docs/objects/metadata/BookMetadata.yaml index 142012553..0fed0a919 100644 --- a/docs/objects/metadata/BookMetadata.yaml +++ b/docs/objects/metadata/BookMetadata.yaml @@ -24,7 +24,7 @@ components: type: array items: type: string - example: ["Fantasy", "Sci-Fi", "Nonfiction: History"] + example: ['Fantasy', 'Sci-Fi', 'Nonfiction: History'] publishedYear: description: The year the book was published. Will be null if unknown. type: string @@ -44,23 +44,9 @@ components: type: string nullable: true example: >- - The masterpiece that started Terry Goodkind's New York Times bestselling - epic Sword of Truth In the aftermath of the brutal murder of his father, - a mysterious woman, Kahlan Amnell, appears in Richard Cypher's forest - sanctuary seeking help...and more. His world, his very beliefs, are - shattered when ancient debts come due with thundering violence. In a - dark age it takes courage to live, and more than mere courage to - challenge those who hold dominion, Richard and Kahlan must take up that - challenge or become the next victims. Beyond awaits a bewitching land - where even the best of their hearts could betray them. Yet, Richard - fears nothing so much as what secrets his sword might reveal about his - own soul. Falling in love would destroy them - for reasons Richard can't - imagine and Kahlan dare not say. In their darkest hour, hunted - relentlessly, tormented by treachery and loss, Kahlan calls upon Richard - to reach beyond his sword - to invoke within himself something more - noble. Neither knows that the rules of battle have just changed...or - that their time has run out. Wizard's First Rule is the beginning. One - book. One Rule. Witness the birth of a legend. + The masterpiece that started Terry Goodkind's New York Times bestselling epic Sword of Truth In the aftermath of the brutal murder of his father, a mysterious woman, Kahlan Amnell, appears in Richard Cypher's forest sanctuary seeking help...and more. His world, his very beliefs, are shattered when ancient debts come due with thundering violence. In a dark age it takes courage to live, and more than mere courage to challenge those who hold dominion, Richard and Kahlan must take up that challenge or become the next victims. Beyond awaits a bewitching land where even the best of their hearts could betray them. Yet, Richard fears nothing so much as what secrets his sword might reveal about his own soul. Falling in love would destroy them - for reasons Richard can't imagine and Kahlan dare not say. In their darkest hour, hunted relentlessly, tormented by treachery and loss, Kahlan calls upon Richard to reach beyond his sword - to invoke within himself something more noble. Neither knows that the rules of battle have just changed...or that their time has run out. Wizard's First Rule is the beginning. One book. One Rule. Witness the birth of a legend. + + isbn: description: The ISBN of the book. Will be null if unknown. type: string @@ -79,14 +65,14 @@ components: type: boolean example: false abridged: - description: Whether the book is abridged. - type: boolean - example: false + description: Whether the book is abridged. + type: boolean + example: false bookMetadataMinified: type: object description: The minified metadata for a book in the database. allOf: - - $ref : '#/components/schemas/bookMetadataBase' + - $ref: '#/components/schemas/bookMetadataBase' - type: object properties: titleIgnorePrefix: @@ -141,10 +127,9 @@ components: narrators: type: array items: - type: string - example: Sam Tsoutsouvas + type: string + example: Sam Tsoutsouvas series: type: array items: $ref: '../entities/Series.yaml#/components/schemas/seriesSequence' - diff --git a/docs/openapi.json b/docs/openapi.json index 97ce3d814827371d8afee1ed3080965b5fba1ec1..13ea22f6805c71dd33d7270b62ca285c9afbc901 100644 GIT binary patch literal 177228 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 Du{2OP literal 353792 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 diff --git a/docs/root.yaml b/docs/root.yaml index b93d88a68..5dc49e604 100644 --- a/docs/root.yaml +++ b/docs/root.yaml @@ -83,14 +83,16 @@ paths: $ref: './controllers/AuthController.yaml#/paths/~1logout' /api/items/{id}: $ref: './controllers/LibraryItemController.yaml#/paths/~1api~1items~1{id}' + /api/items/{id}/play: + $ref: './controllers/LibraryItemController.yaml#/paths/~1api~1items~1{id}~1play' /api/items/{id}/play/{episodeId}: $ref: './controllers/LibraryItemController.yaml#/paths/~1api~1items~1{id}~1play~1{episodeId}' /api/me: $ref: './controllers/MeController.yaml#/paths/~1api~1me' + /api/me/progress/{libraryItemId}: + $ref: './controllers/MeController.yaml#/paths/~1api~1me~1progress~1{libraryItemId}' /api/me/progress/{libraryItemId}/{episodeId}: $ref: './controllers/MeController.yaml#/paths/~1api~1me~1progress~1{libraryItemId}~1{episodeId}' - /api/me/progress/{mediaId}: - $ref: './controllers/MeController.yaml#/paths/~1api~1me~1progress~1{mediaId}' /api/session/{id}/sync: $ref: './controllers/SessionController.yaml#/paths/~1api~1session~1{id}~1sync' /api/sessions/{id}: