From e325023fd7e95649143d1de4a9dfaaa5ff228c78 Mon Sep 17 00:00:00 2001 From: luke-hagar-sp <98849695+luke-hagar-sp@users.noreply.github.com> Date: Mon, 27 Mar 2023 09:28:25 -0500 Subject: [PATCH] Plex Open API Spec --- .vscode/settings.json | 5 + package.json | 5 + plex-api-spec-dereferenced.yaml | 440 +++++++++++++++++++++ plex-api-spec.yaml | 0 referenced/paths/activities-cancel.yaml | 23 ++ referenced/paths/activities.yaml | 15 + referenced/paths/butler-task.yaml | 77 ++++ referenced/paths/butler.yaml | 29 ++ referenced/paths/root.yaml | 15 + referenced/paths/updater-apply.yaml | 33 ++ referenced/paths/updater-check.yaml | 21 + referenced/paths/updater-status.yaml | 11 + referenced/plex-api-spec.yaml | 75 ++++ referenced/responses/401.yaml | 1 + referenced/schemas/ServerActivities.yaml | 31 ++ referenced/schemas/ServerCapabilities.yaml | 116 ++++++ 16 files changed, 897 insertions(+) create mode 100644 .vscode/settings.json create mode 100644 package.json create mode 100644 plex-api-spec-dereferenced.yaml delete mode 100644 plex-api-spec.yaml create mode 100644 referenced/paths/activities-cancel.yaml create mode 100644 referenced/paths/activities.yaml create mode 100644 referenced/paths/butler-task.yaml create mode 100644 referenced/paths/butler.yaml create mode 100644 referenced/paths/root.yaml create mode 100644 referenced/paths/updater-apply.yaml create mode 100644 referenced/paths/updater-check.yaml create mode 100644 referenced/paths/updater-status.yaml create mode 100644 referenced/plex-api-spec.yaml create mode 100644 referenced/responses/401.yaml create mode 100644 referenced/schemas/ServerActivities.yaml create mode 100644 referenced/schemas/ServerCapabilities.yaml diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..c69b64ff --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "yaml.schemas": { + "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/schemas/v3.1/schema.json": "file:///Users/luke.hagar/Documents/GitHub/plex-api-spec/paths/root.yaml" + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..f74bf2df --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "build": "redocly bundle ./referenced/plex-api-spec.yaml -o ./plex-api-spec-dereferenced.yaml -d" + } +} diff --git a/plex-api-spec-dereferenced.yaml b/plex-api-spec-dereferenced.yaml new file mode 100644 index 00000000..8ca09999 --- /dev/null +++ b/plex-api-spec-dereferenced.yaml @@ -0,0 +1,440 @@ +openapi: 3.0.1 +info: + title: Plex-API + description: An Open API Spec for interacting with Plex.tv and Plex Servers + version: 0.0.1 + contact: + name: Luke Hagar + email: Lukeslakemail@gmail.com + url: https://www.LukeHagar.com +servers: + - url: '{Protocol}://{Local IP}:{Port}' + variables: + Protocol: + enum: + - http + - https + default: http + description: The protocl to use with your plex server + Local IP: + default: 10.10.10.47 + description: The Local IP Address of your plex server + Port: + default: '32400' + description: The port to access your plex server + - url: https://plex.tv/api/v2 +security: + - PlexToken: [] +components: + securitySchemes: + PlexToken: + type: apiKey + in: header + name: X-Plex-Token + schemas: + ServerCapabilities: + type: object + properties: &ref_0 + MediaContainer: + type: object + properties: + size: + type: number + allowCameraUpload: + type: boolean + allowChannelAccess: + type: boolean + allowMediaDeletion: + type: boolean + allowSharing: + type: boolean + allowSync: + type: boolean + allowTuners: + type: boolean + backgroundProcessing: + type: boolean + certificate: + type: boolean + companionProxy: + type: boolean + countryCode: + type: string + diagnostics: + type: string + eventStream: + type: boolean + friendlyName: + type: string + hubSearch: + type: boolean + itemClusters: + type: boolean + livetv: + type: number + machineIdentifier: + type: string + mediaProviders: + type: boolean + multiuser: + type: boolean + musicAnalysis: + type: number + myPlex: + type: boolean + myPlexMappingState: + type: string + myPlexSigninState: + type: string + myPlexSubscription: + type: boolean + myPlexUsername: + type: string + offlineTranscode: + type: number + ownerFeatures: + type: string + photoAutoTag: + type: boolean + platform: + type: string + platformVersion: + type: string + pluginHost: + type: boolean + pushNotifications: + type: boolean + readOnlyLibraries: + type: boolean + streamingBrainABRVersion: + type: number + streamingBrainVersion: + type: number + sync: + type: boolean + transcoderActiveVideoSessions: + type: number + transcoderAudio: + type: boolean + transcoderLyrics: + type: boolean + transcoderPhoto: + type: boolean + transcoderSubtitles: + type: boolean + transcoderVideo: + type: boolean + transcoderVideoBitrates: + type: string + transcoderVideoQualities: + type: string + transcoderVideoResolutions: + type: string + updatedAt: + type: number + updater: + type: boolean + version: + type: string + voiceSearch: + type: boolean + Directory: + type: array + items: + type: object + properties: + count: + type: number + key: + type: string + title: + type: string + ServerActivities: + type: object + properties: &ref_1 + MediaContainer: + type: object + properties: + size: + type: number + Activity: + type: array + items: + type: object + properties: + uuid: + type: string + type: + type: string + cancellable: + type: boolean + userID: + type: number + title: + type: string + subtitle: + type: string + progress: + type: number + Context: + type: object + properties: + librarySectionID: + type: string + responses: + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. +paths: + /: + get: + tags: + - Server + summary: Server Capabilities + description: Server Capabilities + operationId: serverCapabilities + responses: + '200': + description: The Server Capabilities + content: + application/json: + schema: + type: object + properties: *ref_0 + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /activities: + get: + tags: + - Activities + summary: Server Activities + description: Server Activities + operationId: serverActivities + responses: + '200': + description: The Server Activities + content: + application/json: + schema: + type: object + properties: *ref_1 + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /activities/{activityUUID}: + delete: + tags: + - Activities + summary: Cancel Server Activities + description: Cancel Server Activities + operationId: cancelServerActivities + parameters: + - name: activityUUID + description: The UUID of the activity to cancel. + in: path + schema: + type: string + example: 25b71ed5-0f9d-461c-baa7-d404e9e10d3e + required: true + responses: + '200': + description: The Server Activity was canceled + content: + application/json: + schema: + type: object + properties: *ref_1 + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /updater/status: + get: + tags: + - Updater + summary: Querying status of updates + description: Querying status of updates + operationId: queryingUpdateStatus + responses: + '200': + description: The Server Updates + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /updater/check: + put: + tags: + - Updater + summary: Checking for updates + description: Checking for updates + operationId: checkingforUpdates + parameters: + - name: download + description: Indicate that you want to start download any updates found. + required: false + in: query + schema: + enum: + - 0 + - 1 + example: 1 + responses: + '200': + description: '' + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /updater/apply: + put: + tags: + - Updater + summary: Applying updates + description: | + Note that these two parameters are effectively mutually exclusive. The `tonight` parameter takes precedence and `skip` will be ignored if `tonight` is also passed + operationId: applyingUpdates + parameters: + - name: tonight + description: Indicate that you want the update to run during the next Butler execution. Omitting this or setting it to false indicates that the update should install + required: false + in: query + schema: + enum: + - 0 + - 1 + example: 1 + - name: skip + description: Indicate that the latest version should be marked as skipped. The entry for this version will have the `state` set to `skipped`. + required: false + in: query + schema: + enum: + - 0 + - 1 + example: 1 + responses: + '200': + description: If the update process started correctly + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + '500': + description: If the update process failed to start + /butler: + post: + tags: + - Butler + summary: Start all Butler tasks + description: | + This endpoint will attempt to start all Butler tasks that are enabled in the settings. Butler tasks normally run automatically during a time window configured on the server's Settings page but can be manually started using this endpoint. Tasks will run with the following criteria: + 1. Any tasks not scheduled to run on the current day will be skipped. + 2. If a task is configured to run at a random time during the configured window and we are outside that window, the task will start immediately. + 3. If a task is configured to run at a random time during the configured window and we are within that window, the task will be scheduled at a random time within the window. + 4. If we are outside the configured window, the task will start immediately. + operationId: startAllButlerTasks + responses: + '200': + description: All tasks were started + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + delete: + tags: + - Butler + summary: Stop all Butler tasks + description: | + This endpoint will stop all currently running tasks and remove any scheduled tasks from the queue. + operationId: stopAllButlerTasks + responses: + '200': + description: All tasks were stopped + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + /butler/{taskName}: + post: + tags: + - Butler + summary: Start a single Butler task + description: | + This endpoint will attempt to start a single Butler task that is enabled in the settings. Butler tasks normally run automatically during a time window configured on the server's Settings page but can be manually started using this endpoint. Tasks will run with the following criteria: + 1. Any tasks not scheduled to run on the current day will be skipped. + 2. If a task is configured to run at a random time during the configured window and we are outside that window, the task will start immediately. + 3. If a task is configured to run at a random time during the configured window and we are within that window, the task will be scheduled at a random time within the window. + 4. If we are outside the configured window, the task will start immediately. + operationId: startAButlerTasks + parameters: + - name: taskName + description: the name of the task to be started. + in: path + schema: + type: string + enum: + - BackupDatabase + - BuildGracenoteCollections + - CheckForUpdates + - CleanOldBundles + - CleanOldCacheFiles + - DeepMediaAnalysis + - GenerateAutoTags + - GenerateChapterThumbs + - GenerateMediaIndexFiles + - OptimizeDatabase + - RefreshLibraries + - RefreshLocalMedia + - RefreshPeriodicMetadata + - UpgradeMediaAnalysis + required: true + responses: + '200': + description: The task was started successfully + '202': + description: The task was already running. + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + delete: + tags: + - Butler + summary: Stop a single Butler task + description: | + This endpoint will stop a currently running task by name, or remove it from the list of scheduled tasks if it exists. See the section above for a list of task names for this endpoint. + operationId: stopAButlerTasks + parameters: + - name: taskName + description: The name of the task to be started. + in: path + schema: + type: string + enum: + - BackupDatabase + - BuildGracenoteCollections + - CheckForUpdates + - CleanOldBundles + - CleanOldCacheFiles + - DeepMediaAnalysis + - GenerateAutoTags + - GenerateChapterThumbs + - GenerateMediaIndexFiles + - OptimizeDatabase + - RefreshLibraries + - RefreshLocalMedia + - RefreshPeriodicMetadata + - UpgradeMediaAnalysis + required: true + responses: + '200': + description: The task was stopped + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + '404': + description: The task was not running +tags: + - name: Activities + description: | + Activities are awesome. They provide a way to monitor and control asynchronous operations on the server. In order to receive real-time updates for activities, a client would normally subscribe via either EventSource or Websocket endpoints. + Activities are associated with HTTP replies via a special `X-Plex-Activity` header which contains the UUID of the activity. + Activities are optional cancellable. If cancellable, they may be cancelled via the `DELETE` endpoint. Other details: + - They can contain a `progress` (from 0 to 100) marking the percent completion of the activity. + - They must contain an `type` which is used by clients to distinguish the specific activity. + - They may contain a `Context` object with attributes which associate the activity with various specific entities (items, libraries, etc.) + - The may contain a `Response` object which attributes which represent the result of the asynchronous operation. + - name: Butler + description: | + Butler is the task manager of the plex ecosystem. + - name: Server + description: | + Operations against the Plex Media Server System. + - name: Updater + description: | + This describes the API for searching and applying updates to the Plex Media Server. + Updates to the status can be observed via the Event API. diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml deleted file mode 100644 index e69de29b..00000000 diff --git a/referenced/paths/activities-cancel.yaml b/referenced/paths/activities-cancel.yaml new file mode 100644 index 00000000..ddf11542 --- /dev/null +++ b/referenced/paths/activities-cancel.yaml @@ -0,0 +1,23 @@ +delete: + tags: + - Activities + summary: Cancel Server Activities + description: Cancel Server Activities + operationId: cancelServerActivities + parameters: + - name: activityUUID + description: The UUID of the activity to cancel. + in: path + schema: + type: string + example: 25b71ed5-0f9d-461c-baa7-d404e9e10d3e + required: true + responses: + "200": + description: The Server Activity was canceled + content: + application/json: + schema: + $ref: "../schemas/ServerActivities.yaml" + "401": + $ref: "../responses/401.yaml" diff --git a/referenced/paths/activities.yaml b/referenced/paths/activities.yaml new file mode 100644 index 00000000..915c378f --- /dev/null +++ b/referenced/paths/activities.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Activities + summary: Server Activities + description: Server Activities + operationId: serverActivities + responses: + "200": + description: The Server Activities + content: + application/json: + schema: + $ref: "../schemas/ServerActivities.yaml" + "401": + $ref: "../responses/401.yaml" diff --git a/referenced/paths/butler-task.yaml b/referenced/paths/butler-task.yaml new file mode 100644 index 00000000..08b1b2f0 --- /dev/null +++ b/referenced/paths/butler-task.yaml @@ -0,0 +1,77 @@ +post: + tags: + - Butler + summary: Start a single Butler task + description: | + This endpoint will attempt to start a single Butler task that is enabled in the settings. Butler tasks normally run automatically during a time window configured on the server's Settings page but can be manually started using this endpoint. Tasks will run with the following criteria: + 1. Any tasks not scheduled to run on the current day will be skipped. + 2. If a task is configured to run at a random time during the configured window and we are outside that window, the task will start immediately. + 3. If a task is configured to run at a random time during the configured window and we are within that window, the task will be scheduled at a random time within the window. + 4. If we are outside the configured window, the task will start immediately. + operationId: startAButlerTasks + parameters: + - name: taskName + description: the name of the task to be started. + in: path + schema: + type: string + enum: + - BackupDatabase + - BuildGracenoteCollections + - CheckForUpdates + - CleanOldBundles + - CleanOldCacheFiles + - DeepMediaAnalysis + - GenerateAutoTags + - GenerateChapterThumbs + - GenerateMediaIndexFiles + - OptimizeDatabase + - RefreshLibraries + - RefreshLocalMedia + - RefreshPeriodicMetadata + - UpgradeMediaAnalysis + required: true + responses: + "200": + description: The task was started successfully + "401": + $ref: "../responses/401.yaml" + "202": + description: The task was already running. + +delete: + tags: + - Butler + summary: Stop a single Butler task + description: | + This endpoint will stop a currently running task by name, or remove it from the list of scheduled tasks if it exists. See the section above for a list of task names for this endpoint. + operationId: stopAButlerTasks + parameters: + - name: taskName + description: The name of the task to be started. + in: path + schema: + type: string + enum: + - BackupDatabase + - BuildGracenoteCollections + - CheckForUpdates + - CleanOldBundles + - CleanOldCacheFiles + - DeepMediaAnalysis + - GenerateAutoTags + - GenerateChapterThumbs + - GenerateMediaIndexFiles + - OptimizeDatabase + - RefreshLibraries + - RefreshLocalMedia + - RefreshPeriodicMetadata + - UpgradeMediaAnalysis + required: true + responses: + "200": + description: The task was stopped + "401": + $ref: "../responses/401.yaml" + "404": + description: The task was not running diff --git a/referenced/paths/butler.yaml b/referenced/paths/butler.yaml new file mode 100644 index 00000000..126d674a --- /dev/null +++ b/referenced/paths/butler.yaml @@ -0,0 +1,29 @@ +post: + tags: + - Butler + summary: Start all Butler tasks + description: | + This endpoint will attempt to start all Butler tasks that are enabled in the settings. Butler tasks normally run automatically during a time window configured on the server's Settings page but can be manually started using this endpoint. Tasks will run with the following criteria: + 1. Any tasks not scheduled to run on the current day will be skipped. + 2. If a task is configured to run at a random time during the configured window and we are outside that window, the task will start immediately. + 3. If a task is configured to run at a random time during the configured window and we are within that window, the task will be scheduled at a random time within the window. + 4. If we are outside the configured window, the task will start immediately. + operationId: startAllButlerTasks + responses: + "200": + description: All tasks were started + "401": + $ref: "../responses/401.yaml" + +delete: + tags: + - Butler + summary: Stop all Butler tasks + description: | + This endpoint will stop all currently running tasks and remove any scheduled tasks from the queue. + operationId: stopAllButlerTasks + responses: + "200": + description: All tasks were stopped + "401": + $ref: "../responses/401.yaml" diff --git a/referenced/paths/root.yaml b/referenced/paths/root.yaml new file mode 100644 index 00000000..6d6310d3 --- /dev/null +++ b/referenced/paths/root.yaml @@ -0,0 +1,15 @@ +get: + tags: + - Server + summary: Server Capabilities + description: Server Capabilities + operationId: serverCapabilities + responses: + "200": + description: The Server Capabilities + content: + application/json: + schema: + $ref: "../schemas/ServerCapabilities.yaml" + "401": + $ref: "../responses/401.yaml" diff --git a/referenced/paths/updater-apply.yaml b/referenced/paths/updater-apply.yaml new file mode 100644 index 00000000..dbc3c5ab --- /dev/null +++ b/referenced/paths/updater-apply.yaml @@ -0,0 +1,33 @@ +put: + tags: + - Updater + summary: Applying updates + description: | + Note that these two parameters are effectively mutually exclusive. The `tonight` parameter takes precedence and `skip` will be ignored if `tonight` is also passed + operationId: applyingUpdates + parameters: + - name: tonight + description: Indicate that you want the update to run during the next Butler execution. Omitting this or setting it to false indicates that the update should install + required: false + in: query + schema: + enum: + - 0 + - 1 + example: 1 + - name: skip + description: Indicate that the latest version should be marked as skipped. The entry for this version will have the `state` set to `skipped`. + required: false + in: query + schema: + enum: + - 0 + - 1 + example: 1 + responses: + "200": + description: If the update process started correctly + "401": + $ref: "../responses/401.yaml" + "500": + description: If the update process failed to start diff --git a/referenced/paths/updater-check.yaml b/referenced/paths/updater-check.yaml new file mode 100644 index 00000000..963c3a89 --- /dev/null +++ b/referenced/paths/updater-check.yaml @@ -0,0 +1,21 @@ +put: + tags: + - Updater + summary: Checking for updates + description: Checking for updates + operationId: checkingforUpdates + parameters: + - name: download + description: Indicate that you want to start download any updates found. + required: false + in: query + schema: + enum: + - 0 + - 1 + example: 1 + responses: + "200": + description: "" + "401": + $ref: "../responses/401.yaml" diff --git a/referenced/paths/updater-status.yaml b/referenced/paths/updater-status.yaml new file mode 100644 index 00000000..0628abab --- /dev/null +++ b/referenced/paths/updater-status.yaml @@ -0,0 +1,11 @@ +get: + tags: + - Updater + summary: Querying status of updates + description: Querying status of updates + operationId: queryingUpdateStatus + responses: + "200": + description: The Server Updates + "401": + $ref: "../responses/401.yaml" diff --git a/referenced/plex-api-spec.yaml b/referenced/plex-api-spec.yaml new file mode 100644 index 00000000..f7a5a004 --- /dev/null +++ b/referenced/plex-api-spec.yaml @@ -0,0 +1,75 @@ +openapi: 3.0.1 + +info: + title: Plex-API + description: An Open API Spec for interacting with Plex.tv and Plex Servers + version: "0.0.1" + contact: + name: Luke Hagar + email: Lukeslakemail@gmail.com + url: "https://www.LukeHagar.com" + +servers: + - url: "{Protocol}://{Local IP}:{Port}" + variables: + Protocol: + enum: + - http + - https + default: http + description: The protocl to use with your plex server + Local IP: + default: 10.10.10.47 + description: The Local IP Address of your plex server + Port: + default: "32400" + description: The port to access your plex server + +security: + - PlexToken: [] + +components: + securitySchemes: + PlexToken: # arbitrary name for the security scheme + type: apiKey + in: header # can be "header", "query" or "cookie" + name: X-Plex-Token # name of the header, query parameter or cookie + +paths: + /: + $ref: "./paths/root.yaml" + /activities: + $ref: "./paths/activities.yaml" + /activities/{activityUUID}: + $ref: "./paths/activities-cancel.yaml" + /updater/status: + $ref: "./paths/updater-status.yaml" + /updater/check: + $ref: "./paths/updater-check.yaml" + /updater/apply: + $ref: "./paths/updater-apply.yaml" + /butler: + $ref: "./paths/butler.yaml" + /butler/{taskName}: + $ref: "./paths/butler-task.yaml" + +tags: + - name: Activities + description: | + Activities are awesome. They provide a way to monitor and control asynchronous operations on the server. In order to receive real-time updates for activities, a client would normally subscribe via either EventSource or Websocket endpoints. + Activities are associated with HTTP replies via a special `X-Plex-Activity` header which contains the UUID of the activity. + Activities are optional cancellable. If cancellable, they may be cancelled via the `DELETE` endpoint. Other details: + - They can contain a `progress` (from 0 to 100) marking the percent completion of the activity. + - They must contain an `type` which is used by clients to distinguish the specific activity. + - They may contain a `Context` object with attributes which associate the activity with various specific entities (items, libraries, etc.) + - The may contain a `Response` object which attributes which represent the result of the asynchronous operation. + - name: Butler + description: | + Butler is the task manager of the Plex Media Server Ecosystem. + - name: Server + description: | + Operations against the Plex Media Server System. + - name: Updater + description: | + This describes the API for searching and applying updates to the Plex Media Server. + Updates to the status can be observed via the Event API. diff --git a/referenced/responses/401.yaml b/referenced/responses/401.yaml new file mode 100644 index 00000000..6a83f1a9 --- /dev/null +++ b/referenced/responses/401.yaml @@ -0,0 +1 @@ +description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. diff --git a/referenced/schemas/ServerActivities.yaml b/referenced/schemas/ServerActivities.yaml new file mode 100644 index 00000000..6a447da9 --- /dev/null +++ b/referenced/schemas/ServerActivities.yaml @@ -0,0 +1,31 @@ +type: object +properties: + MediaContainer: + type: object + properties: + size: + type: number + Activity: + type: array + items: + type: object + properties: + uuid: + type: string + type: + type: string + cancellable: + type: boolean + userID: + type: number + title: + type: string + subtitle: + type: string + progress: + type: number + Context: + type: object + properties: + librarySectionID: + type: string diff --git a/referenced/schemas/ServerCapabilities.yaml b/referenced/schemas/ServerCapabilities.yaml new file mode 100644 index 00000000..37d7b51f --- /dev/null +++ b/referenced/schemas/ServerCapabilities.yaml @@ -0,0 +1,116 @@ +type: object +properties: + MediaContainer: + type: object + properties: + size: + type: number + allowCameraUpload: + type: boolean + allowChannelAccess: + type: boolean + allowMediaDeletion: + type: boolean + allowSharing: + type: boolean + allowSync: + type: boolean + allowTuners: + type: boolean + backgroundProcessing: + type: boolean + certificate: + type: boolean + companionProxy: + type: boolean + countryCode: + type: string + diagnostics: + type: string + eventStream: + type: boolean + friendlyName: + type: string + hubSearch: + type: boolean + itemClusters: + type: boolean + livetv: + type: number + machineIdentifier: + type: string + mediaProviders: + type: boolean + multiuser: + type: boolean + musicAnalysis: + type: number + myPlex: + type: boolean + myPlexMappingState: + type: string + myPlexSigninState: + type: string + myPlexSubscription: + type: boolean + myPlexUsername: + type: string + offlineTranscode: + type: number + ownerFeatures: + type: string + photoAutoTag: + type: boolean + platform: + type: string + platformVersion: + type: string + pluginHost: + type: boolean + pushNotifications: + type: boolean + readOnlyLibraries: + type: boolean + streamingBrainABRVersion: + type: number + streamingBrainVersion: + type: number + sync: + type: boolean + transcoderActiveVideoSessions: + type: number + transcoderAudio: + type: boolean + transcoderLyrics: + type: boolean + transcoderPhoto: + type: boolean + transcoderSubtitles: + type: boolean + transcoderVideo: + type: boolean + transcoderVideoBitrates: + type: string + transcoderVideoQualities: + type: string + transcoderVideoResolutions: + type: string + updatedAt: + type: number + updater: + type: boolean + version: + type: string + voiceSearch: + type: boolean + Directory: + type: array + items: + type: object + properties: + count: + type: number + key: + type: string + title: + type: string