Compare commits

...

15 Commits

Author SHA1 Message Date
speakeasybot
4bcd080211 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.526.6 2025-03-31 17:31:23 +00:00
Luke Hagar
2e0f3b64ea Update workflow.yaml 2025-03-31 12:04:45 -05:00
speakeasybot
9b0ac863a4 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.513.4 2025-03-10 00:10:03 +00:00
speakeasybot
33fe0755b5 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.513.4 2025-03-08 00:09:26 +00:00
speakeasybot
1cfc2d604f ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.488.0 2025-02-11 00:10:34 +00:00
speakeasybot
ef0d39928c ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.487.1 2025-02-08 00:10:21 +00:00
speakeasybot
d2a1c188d5 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.487.0 2025-02-07 00:10:35 +00:00
speakeasybot
6db5d8fb30 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.484.1 2025-02-06 00:10:27 +00:00
speakeasybot
89fbd6238e ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.476.2 2025-01-28 00:10:16 +00:00
speakeasybot
7af7441ac7 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.476.0 2025-01-25 00:10:13 +00:00
speakeasybot
d1945b544b ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.459.2 2024-12-23 00:10:53 +00:00
speakeasybot
16bb49d558 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.459.2 2024-12-21 00:10:31 +00:00
speakeasybot
4bea7ae0d8 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.438.3 2024-11-14 00:10:23 +00:00
speakeasybot
da5491e935 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.438.1 2024-11-12 00:10:16 +00:00
speakeasybot
aeebf438e1 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.406.0 2024-10-04 00:10:38 +00:00
309 changed files with 18644 additions and 10801 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
.speakeasy/reports
# .gitignore # .gitignore

File diff suppressed because one or more lines are too long

View File

@@ -7,15 +7,19 @@ generation:
useClassNamesForArrayFields: true useClassNamesForArrayFields: true
fixes: fixes:
nameResolutionDec2023: true nameResolutionDec2023: true
nameResolutionFeb2025: false
parameterOrderingFeb2024: true parameterOrderingFeb2024: true
requestResponseComponentNamesFeb2024: true requestResponseComponentNamesFeb2024: true
securityFeb2025: false
auth: auth:
oAuth2ClientCredentialsEnabled: true oAuth2ClientCredentialsEnabled: true
oAuth2PasswordEnabled: false
go: go:
version: 0.15.0 version: 0.19.3
additionalDependencies: {} additionalDependencies: {}
allowUnknownFieldsInWeakUnions: false allowUnknownFieldsInWeakUnions: false
clientServerStatusCodesAsErrors: true clientServerStatusCodesAsErrors: true
defaultErrorName: SDKError
flattenGlobalSecurity: true flattenGlobalSecurity: true
imports: imports:
option: openapi option: openapi

View File

@@ -1,4 +1,4 @@
speakeasyVersion: 1.406.0 speakeasyVersion: 1.526.6
sources: sources:
my-source: my-source:
sourceNamespace: my-source sourceNamespace: my-source
@@ -9,19 +9,19 @@ sources:
- main - main
plexapi: plexapi:
sourceNamespace: plexapi sourceNamespace: plexapi
sourceRevisionDigest: sha256:c6ab8f13847c7cdc4ab3752f517164d7da08266726255aa0d614b1eaea66fb0e sourceRevisionDigest: sha256:cffb18feaa0523b300655a6f0073caad99133b143f5a420fddbb1e1efe47bcaf
sourceBlobDigest: sha256:64c7694915a0828aeb256d10d2fa0ea477681785b818916b6681be8cc5ffb93b sourceBlobDigest: sha256:1737023e29cd9cf36c07ccd8c8c48c47e14f47ce22b4d6ba9ee241afbbd8f351
tags: tags:
- latest - latest
- main - speakeasy-sdk-regen-1743442207
targets: targets:
plexgo: plexgo:
source: plexapi source: plexapi
sourceNamespace: plexapi sourceNamespace: plexapi
sourceRevisionDigest: sha256:c6ab8f13847c7cdc4ab3752f517164d7da08266726255aa0d614b1eaea66fb0e sourceRevisionDigest: sha256:cffb18feaa0523b300655a6f0073caad99133b143f5a420fddbb1e1efe47bcaf
sourceBlobDigest: sha256:64c7694915a0828aeb256d10d2fa0ea477681785b818916b6681be8cc5ffb93b sourceBlobDigest: sha256:1737023e29cd9cf36c07ccd8c8c48c47e14f47ce22b4d6ba9ee241afbbd8f351
codeSamplesNamespace: code-samples-go-plexgo codeSamplesNamespace: code-samples-go-plexgo
codeSamplesRevisionDigest: sha256:9ae03dbe12a6438ac7667de48bf864bbeb4b470bd87b38555484879a998889ba codeSamplesRevisionDigest: sha256:b83144bbe1d84087f2f495b945e4b14a898f0ccb54cd57e5036b79f4f0370344
workflow: workflow:
workflowVersion: 1.0.0 workflowVersion: 1.0.0
speakeasyVersion: latest speakeasyVersion: latest
@@ -37,3 +37,5 @@ workflow:
output: codeSamples.yaml output: codeSamples.yaml
registry: registry:
location: registry.speakeasyapi.dev/plexapi/plexapi/code-samples-go-plexgo location: registry.speakeasyapi.dev/plexapi/plexapi/code-samples-go-plexgo
labelOverride:
fixedValue: PlexGO

View File

@@ -12,3 +12,5 @@ targets:
output: codeSamples.yaml output: codeSamples.yaml
registry: registry:
location: registry.speakeasyapi.dev/plexapi/plexapi/code-samples-go-plexgo location: registry.speakeasyapi.dev/plexapi/plexapi/code-samples-go-plexgo
labelOverride:
fixedValue: PlexGO

132
README.md
View File

@@ -40,16 +40,24 @@ The following SDKs are generated from the OpenAPI Specification. They are automa
<!-- Start Table of Contents [toc] --> <!-- Start Table of Contents [toc] -->
## Table of Contents ## Table of Contents
<!-- $toc-max-depth=2 -->
* [github.com/LukeHagar/plexgo](#githubcomlukehagarplexgo)
* [Plex Media Server OpenAPI Specification](#plex-media-server-openapi-specification)
* [Documentation](#documentation)
* [SDKs](#sdks)
* [SDK Installation](#sdk-installation)
* [SDK Example Usage](#sdk-example-usage)
* [Available Resources and Operations](#available-resources-and-operations)
* [Retries](#retries)
* [Error Handling](#error-handling)
* [Server Selection](#server-selection)
* [Custom HTTP Client](#custom-http-client)
* [Authentication](#authentication)
* [Special Types](#special-types)
* [Development](#development)
* [Maturity](#maturity)
* [Contributions](#contributions)
* [SDK Installation](#sdk-installation)
* [SDK Example Usage](#sdk-example-usage)
* [Available Resources and Operations](#available-resources-and-operations)
* [Retries](#retries)
* [Error Handling](#error-handling)
* [Server Selection](#server-selection)
* [Custom HTTP Client](#custom-http-client)
* [Authentication](#authentication)
* [Special Types](#special-types)
<!-- End Table of Contents [toc] --> <!-- End Table of Contents [toc] -->
<!-- Start SDK Installation [installation] --> <!-- Start SDK Installation [installation] -->
@@ -76,16 +84,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -138,13 +142,16 @@ func main() {
* [GetLibraryDetails](docs/sdks/library/README.md#getlibrarydetails) - Get Library Details * [GetLibraryDetails](docs/sdks/library/README.md#getlibrarydetails) - Get Library Details
* [DeleteLibrary](docs/sdks/library/README.md#deletelibrary) - Delete Library Section * [DeleteLibrary](docs/sdks/library/README.md#deletelibrary) - Delete Library Section
* [GetLibraryItems](docs/sdks/library/README.md#getlibraryitems) - Get Library Items * [GetLibraryItems](docs/sdks/library/README.md#getlibraryitems) - Get Library Items
* [GetAllMediaLibrary](docs/sdks/library/README.md#getallmedialibrary) - Get all media of library
* [GetRefreshLibraryMetadata](docs/sdks/library/README.md#getrefreshlibrarymetadata) - Refresh Metadata Of The Library * [GetRefreshLibraryMetadata](docs/sdks/library/README.md#getrefreshlibrarymetadata) - Refresh Metadata Of The Library
* [GetSearchLibrary](docs/sdks/library/README.md#getsearchlibrary) - Search Library * [GetSearchLibrary](docs/sdks/library/README.md#getsearchlibrary) - Search Library
* [GetGenresLibrary](docs/sdks/library/README.md#getgenreslibrary) - Get Genres of library media
* [GetCountriesLibrary](docs/sdks/library/README.md#getcountrieslibrary) - Get Countries of library media
* [GetActorsLibrary](docs/sdks/library/README.md#getactorslibrary) - Get Actors of library media
* [GetSearchAllLibraries](docs/sdks/library/README.md#getsearchalllibraries) - Search All Libraries * [GetSearchAllLibraries](docs/sdks/library/README.md#getsearchalllibraries) - Search All Libraries
* [GetMetaDataByRatingKey](docs/sdks/library/README.md#getmetadatabyratingkey) - Get Metadata by RatingKey * [GetMediaMetaData](docs/sdks/library/README.md#getmediametadata) - Get Media Metadata
* [GetMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children * [GetMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children
* [GetTopWatchedContent](docs/sdks/library/README.md#gettopwatchedcontent) - Get Top Watched Content * [GetTopWatchedContent](docs/sdks/library/README.md#gettopwatchedcontent) - Get Top Watched Content
* [GetOnDeck](docs/sdks/library/README.md#getondeck) - Get On Deck
### [Log](docs/sdks/log/README.md) ### [Log](docs/sdks/log/README.md)
@@ -220,6 +227,10 @@ func main() {
* [CheckForUpdates](docs/sdks/updater/README.md#checkforupdates) - Checking for updates * [CheckForUpdates](docs/sdks/updater/README.md#checkforupdates) - Checking for updates
* [ApplyUpdates](docs/sdks/updater/README.md#applyupdates) - Apply Updates * [ApplyUpdates](docs/sdks/updater/README.md#applyupdates) - Apply Updates
### [Users](docs/sdks/users/README.md)
* [GetUsers](docs/sdks/users/README.md#getusers) - Get list of all connected users
### [Video](docs/sdks/video/README.md) ### [Video](docs/sdks/video/README.md)
* [GetTimeline](docs/sdks/video/README.md#gettimeline) - Get the timeline for a media item * [GetTimeline](docs/sdks/video/README.md#gettimeline) - Get the timeline for a media item
@@ -250,16 +261,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx, operations.WithRetries( res, err := s.Server.GetServerCapabilities(ctx, operations.WithRetries(
retry.Config{ retry.Config{
Strategy: "backoff", Strategy: "backoff",
@@ -293,6 +300,8 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithRetryConfig( plexgo.WithRetryConfig(
retry.Config{ retry.Config{
@@ -306,14 +315,8 @@ func main() {
RetryConnectionErrors: false, RetryConnectionErrors: false,
}), }),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -336,7 +339,7 @@ By Default, an API error will return `sdkerrors.SDKError`. When custom error res
For example, the `GetServerCapabilities` function may return the following errors: For example, the `GetServerCapabilities` function may return the following errors:
| Error Type | Status Code | Content Type | | Error Type | Status Code | Content Type |
| ------------------------------------------- | ------------------------------------------- | ------------------------------------------- | | ------------------------------------------- | ----------- | ---------------- |
| sdkerrors.GetServerCapabilitiesBadRequest | 400 | application/json | | sdkerrors.GetServerCapabilitiesBadRequest | 400 | application/json |
| sdkerrors.GetServerCapabilitiesUnauthorized | 401 | application/json | | sdkerrors.GetServerCapabilitiesUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4XX, 5XX | \*/\* | | sdkerrors.SDKError | 4XX, 5XX | \*/\* |
@@ -355,16 +358,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
@@ -394,13 +393,15 @@ func main() {
<!-- Start Server Selection [server] --> <!-- Start Server Selection [server] -->
## Server Selection ## Server Selection
### Select Server by Index ### Server Variables
You can override the default server globally using the `WithServerIndex` option when initializing the SDK client instance. The selected server will then be used as the default on the operations that use it. This table lists the indexes associated with the available servers: The default server `{protocol}://{ip}:{port}` contains variables and is set to `https://10.10.10.47:32400` by default. To override default values, the following options are available when initializing the SDK client instance:
| # | Server | Variables | | Variable | Option | Supported Values | Default | Description |
| - | ------ | --------- | | ---------- | --------------------------------------- | -------------------------- | --------------- | ---------------------------------------------- |
| 0 | `{protocol}://{ip}:{port}` | `protocol` (default is `https`), `ip` (default is `10.10.10.47`), `port` (default is `32400`) | | `protocol` | `WithProtocol(protocol ServerProtocol)` | - `"http"`<br/>- `"https"` | `"https"` | The protocol to use for the server connection |
| `ip` | `WithIP(ip string)` | string | `"10.10.10.47"` | The IP address or hostname of your Plex Server |
| `port` | `WithPort(port string)` | string | `"32400"` | The port of your Plex Server |
#### Example #### Example
@@ -414,17 +415,15 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithServerIndex(0), plexgo.WithProtocol("https"),
plexgo.WithIP("e0c3:bcc0:6bac:dccc:c4ec:34b1:ca98:4cb9"),
plexgo.WithPort("40311"),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -436,16 +435,9 @@ func main() {
``` ```
#### Variables
Some of the server options above contain variables. If you want to set the values of those variables, the following options are provided for doing so:
* `WithProtocol plexgo.ServerProtocol`
* `WithIP string`
* `WithPort string`
### Override Server URL Per-Client ### Override Server URL Per-Client
The default server can also be overridden globally using the `WithServerURL` option when initializing the SDK client instance. For example: The default server can be overridden globally using the `WithServerURL(serverURL string)` option when initializing the SDK client instance. For example:
```go ```go
package main package main
@@ -456,17 +448,13 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithServerURL("{protocol}://{ip}:{port}"), plexgo.WithServerURL("https://10.10.10.47:32400"),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -492,16 +480,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Plex.GetCompanionsData(ctx, operations.WithServerURL("https://plex.tv/api/v2")) res, err := s.Plex.GetCompanionsData(ctx, operations.WithServerURL("https://plex.tv/api/v2"))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -551,7 +535,7 @@ This can be a convenient way to configure timeouts, cookies, proxies, custom hea
This SDK supports the following security scheme globally: This SDK supports the following security scheme globally:
| Name | Type | Scheme | | Name | Type | Scheme |
| ------------- | ------------- | ------------- | | ------------- | ------ | ------- |
| `AccessToken` | apiKey | API key | | `AccessToken` | apiKey | API key |
You can configure it using the `WithSecurity` option when initializing the SDK client instance. For example: You can configure it using the `WithSecurity` option when initializing the SDK client instance. For example:
@@ -565,16 +549,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -943,3 +943,143 @@ Based on:
- [go v0.15.0] . - [go v0.15.0] .
### Releases ### Releases
- [Go v0.15.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.15.0 - . - [Go v0.15.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.15.0 - .
## 2024-10-04 00:09:04
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.406.0 (2.429.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.15.1] .
### Releases
- [Go v0.15.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.15.1 - .
## 2024-11-12 00:08:55
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.438.1 (2.457.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.16.0] .
### Releases
- [Go v0.16.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.16.0 - .
## 2024-11-14 00:09:05
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.438.3 (2.457.9) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.16.1] .
### Releases
- [Go v0.16.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.16.1 - .
## 2024-12-21 00:09:02
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.459.2 (2.483.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.0] .
### Releases
- [Go v0.17.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.0 - .
## 2024-12-23 00:09:31
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.459.2 (2.483.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.1] .
### Releases
- [Go v0.17.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.1 - .
## 2025-01-25 00:08:47
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.476.0 (2.496.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.2] .
### Releases
- [Go v0.17.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.2 - .
## 2025-01-28 00:08:53
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.476.2 (2.495.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.3] .
### Releases
- [Go v0.17.3] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.3 - .
## 2025-02-06 00:09:00
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.484.1 (2.503.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.4] .
### Releases
- [Go v0.17.4] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.4 - .
## 2025-02-07 00:09:08
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.487.0 (2.506.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.18.0] .
### Releases
- [Go v0.18.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.18.0 - .
## 2025-02-08 00:08:51
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.487.1 (2.506.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.18.1] .
### Releases
- [Go v0.18.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.18.1 - .
## 2025-02-11 00:09:00
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.488.0 (2.506.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.0] .
### Releases
- [Go v0.19.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.0 - .
## 2025-03-08 00:07:57
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.513.4 (2.545.4) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.1] .
### Releases
- [Go v0.19.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.1 - .
## 2025-03-10 00:08:31
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.513.4 (2.545.4) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.2] .
### Releases
- [Go v0.19.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.2 - .
## 2025-03-31 17:29:50
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.526.6 (2.563.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.3] .
### Releases
- [Go v0.19.3] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.3 - .

View File

@@ -9,16 +9,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry" "github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -37,13 +35,6 @@ func newActivities(sdkConfig sdkConfiguration) *Activities {
// GetServerActivities - Get Server Activities // GetServerActivities - Get Server Activities
// Get Server Activities // Get Server Activities
func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations.Option) (*operations.GetServerActivitiesResponse, error) { func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations.Option) (*operations.GetServerActivitiesResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
@@ -56,12 +47,25 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/activities") opURL, err := url.JoinPath(baseURL, "/activities")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "getServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -84,21 +88,15 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -107,7 +105,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -120,7 +122,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -181,21 +187,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -207,17 +203,16 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
res.Object = &out res.Object = &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -230,17 +225,16 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -253,28 +247,29 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -285,13 +280,6 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
// CancelServerActivities - Cancel Server Activities // CancelServerActivities - Cancel Server Activities
// Cancel Server Activities // Cancel Server Activities
func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID string, opts ...operations.Option) (*operations.CancelServerActivitiesResponse, error) { func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID string, opts ...operations.Option) (*operations.CancelServerActivitiesResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "cancelServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.CancelServerActivitiesRequest{ request := operations.CancelServerActivitiesRequest{
ActivityUUID: activityUUID, ActivityUUID: activityUUID,
} }
@@ -308,12 +296,25 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := utils.GenerateURL(ctx, baseURL, "/activities/{activityUUID}", request, nil) opURL, err := utils.GenerateURL(ctx, baseURL, "/activities/{activityUUID}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "cancelServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -336,21 +337,15 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -359,7 +354,11 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -372,7 +371,11 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -433,22 +436,12 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -461,17 +454,16 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -484,28 +476,29 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }

View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry" "github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -31,13 +29,6 @@ func newAuthentication(sdkConfig sdkConfiguration) *Authentication {
// GetTransientToken - Get a Transient Token // GetTransientToken - Get a Transient Token
// This endpoint provides the caller with a temporary token with the same access level as the caller's token. These tokens are valid for up to 48 hours and are destroyed if the server instance is restarted. // This endpoint provides the caller with a temporary token with the same access level as the caller's token. These tokens are valid for up to 48 hours and are destroyed if the server instance is restarted.
func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations.GetTransientTokenQueryParamType, scope operations.Scope, opts ...operations.Option) (*operations.GetTransientTokenResponse, error) { func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations.GetTransientTokenQueryParamType, scope operations.Scope, opts ...operations.Option) (*operations.GetTransientTokenResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getTransientToken",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.GetTransientTokenRequest{ request := operations.GetTransientTokenRequest{
Type: type_, Type: type_,
Scope: scope, Scope: scope,
@@ -55,12 +46,25 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/security/token") opURL, err := url.JoinPath(baseURL, "/security/token")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "getTransientToken",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -87,21 +91,15 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -110,7 +108,11 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -123,7 +125,11 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -184,22 +190,12 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -212,17 +208,16 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -235,28 +230,29 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -268,13 +264,6 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
// If a caller requires connection details and a transient token for a source that is known to the server, for example a cloud media provider or shared PMS, then this endpoint can be called. This endpoint is only accessible with either an admin token or a valid transient token generated from an admin token. // If a caller requires connection details and a transient token for a source that is known to the server, for example a cloud media provider or shared PMS, then this endpoint can be called. This endpoint is only accessible with either an admin token or a valid transient token generated from an admin token.
// Note: requires Plex Media Server >= 1.15.4. // Note: requires Plex Media Server >= 1.15.4.
func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, source string, opts ...operations.Option) (*operations.GetSourceConnectionInformationResponse, error) { func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, source string, opts ...operations.Option) (*operations.GetSourceConnectionInformationResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getSourceConnectionInformation",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.GetSourceConnectionInformationRequest{ request := operations.GetSourceConnectionInformationRequest{
Source: source, Source: source,
} }
@@ -291,12 +280,25 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/security/resources") opURL, err := url.JoinPath(baseURL, "/security/resources")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "getSourceConnectionInformation",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -323,21 +325,15 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -346,7 +342,11 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -359,7 +359,11 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -420,22 +424,12 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -448,17 +442,16 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -471,28 +464,29 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -503,16 +497,8 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
// GetTokenDetails - Get Token Details // GetTokenDetails - Get Token Details
// Get the User data from the provided X-Plex-Token // Get the User data from the provided X-Plex-Token
func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations.Option) (*operations.GetTokenDetailsResponse, error) { func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations.Option) (*operations.GetTokenDetailsResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getTokenDetails",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
operations.SupportedOptionTimeout, operations.SupportedOptionTimeout,
} }
@@ -533,6 +519,14 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "getTokenDetails",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -555,21 +549,15 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -578,7 +566,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -591,7 +583,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -652,21 +648,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -678,17 +664,16 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
res.UserPlexAccount = &out res.UserPlexAccount = &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -701,17 +686,16 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -724,28 +708,29 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -756,24 +741,8 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
// PostUsersSignInData - Get User Sign In Data // PostUsersSignInData - Get User Sign In Data
// Sign in user with username and password and return user data with Plex authentication token // Sign in user with username and password and return user data with Plex authentication token
func (s *Authentication) PostUsersSignInData(ctx context.Context, request operations.PostUsersSignInDataRequest, opts ...operations.Option) (*operations.PostUsersSignInDataResponse, error) { func (s *Authentication) PostUsersSignInData(ctx context.Context, request operations.PostUsersSignInDataRequest, opts ...operations.Option) (*operations.PostUsersSignInDataResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "post-users-sign-in-data",
OAuth2Scopes: []string{},
SecuritySource: nil,
}
globals := operations.PostUsersSignInDataGlobals{
ClientID: s.sdkConfiguration.Globals.ClientID,
ClientName: s.sdkConfiguration.Globals.ClientName,
DeviceNickname: s.sdkConfiguration.Globals.DeviceNickname,
ClientVersion: s.sdkConfiguration.Globals.ClientVersion,
Platform: s.sdkConfiguration.Globals.Platform,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
operations.SupportedOptionTimeout, operations.SupportedOptionTimeout,
} }
@@ -794,6 +763,13 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "post-users-sign-in-data",
OAuth2Scopes: []string{},
SecuritySource: nil,
}
bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "RequestBody", "form", `request:"mediaType=application/x-www-form-urlencoded"`) bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "RequestBody", "form", `request:"mediaType=application/x-www-form-urlencoded"`)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -816,25 +792,21 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
} }
req.Header.Set("Accept", "application/json") req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent)
if reqContentType != "" {
req.Header.Set("Content-Type", reqContentType) req.Header.Set("Content-Type", reqContentType)
}
utils.PopulateHeaders(ctx, req, request, globals) utils.PopulateHeaders(ctx, req, request, nil)
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -843,7 +815,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -856,7 +832,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -917,21 +897,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 201: case httpRes.StatusCode == 201:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -943,17 +913,16 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
res.UserPlexAccount = &out res.UserPlexAccount = &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -966,17 +935,16 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -989,28 +957,29 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }

417
butler.go
View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry" "github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -31,13 +29,6 @@ func newButler(sdkConfig sdkConfiguration) *Butler {
// GetButlerTasks - Get Butler tasks // GetButlerTasks - Get Butler tasks
// Returns a list of butler tasks // Returns a list of butler tasks
func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option) (*operations.GetButlerTasksResponse, error) { func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option) (*operations.GetButlerTasksResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getButlerTasks",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
@@ -50,12 +41,25 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/butler") opURL, err := url.JoinPath(baseURL, "/butler")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "getButlerTasks",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -78,21 +82,15 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -101,7 +99,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -114,7 +116,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -175,21 +181,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -201,17 +197,16 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
res.Object = &out res.Object = &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -224,17 +219,16 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -247,28 +241,29 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -283,13 +278,6 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
// 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. // 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. // 4. If we are outside the configured window, the task will start immediately.
func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (*operations.StartAllTasksResponse, error) { func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (*operations.StartAllTasksResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "startAllTasks",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
@@ -302,12 +290,25 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/butler") opURL, err := url.JoinPath(baseURL, "/butler")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "startAllTasks",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -330,21 +331,15 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -353,7 +348,11 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -366,7 +365,11 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -427,22 +430,12 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -455,17 +448,16 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -478,28 +470,29 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -510,13 +503,6 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
// StopAllTasks - Stop all Butler tasks // StopAllTasks - Stop all Butler tasks
// This endpoint will stop all currently running tasks and remove any scheduled tasks from the queue. // This endpoint will stop all currently running tasks and remove any scheduled tasks from the queue.
func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*operations.StopAllTasksResponse, error) { func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*operations.StopAllTasksResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "stopAllTasks",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
@@ -529,12 +515,25 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/butler") opURL, err := url.JoinPath(baseURL, "/butler")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "stopAllTasks",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -557,21 +556,15 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -580,7 +573,11 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -593,7 +590,11 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -654,22 +655,12 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -682,17 +673,16 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -705,28 +695,29 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -741,13 +732,6 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
// 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. // 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. // 4. If we are outside the configured window, the task will start immediately.
func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, opts ...operations.Option) (*operations.StartTaskResponse, error) { func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, opts ...operations.Option) (*operations.StartTaskResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "startTask",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.StartTaskRequest{ request := operations.StartTaskRequest{
TaskName: taskName, TaskName: taskName,
} }
@@ -764,12 +748,25 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{taskName}", request, nil) opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{taskName}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "startTask",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -792,21 +789,15 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -815,7 +806,11 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -828,7 +823,11 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -889,16 +888,6 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
fallthrough fallthrough
@@ -906,7 +895,7 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -919,17 +908,16 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -942,28 +930,29 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -974,13 +963,6 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
// StopTask - Stop a single Butler task // StopTask - Stop a single Butler task
// 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. // 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.
func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTaskName, opts ...operations.Option) (*operations.StopTaskResponse, error) { func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTaskName, opts ...operations.Option) (*operations.StopTaskResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "stopTask",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.StopTaskRequest{ request := operations.StopTaskRequest{
TaskName: taskName, TaskName: taskName,
} }
@@ -997,12 +979,25 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{taskName}", request, nil) opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{taskName}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
BaseURL: baseURL,
Context: ctx,
OperationID: "stopTask",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -1025,21 +1020,15 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
if globalRetryConfig != nil { if globalRetryConfig != nil {
retryConfig = globalRetryConfig retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
} }
} }
@@ -1048,7 +1037,11 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
httpRes, err = utils.Retry(ctx, utils.Retries{ httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig, Config: retryConfig,
StatusCodes: []string{ StatusCodes: []string{
"5XX", "429",
"500",
"502",
"503",
"504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil {
@@ -1061,7 +1054,11 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -1122,22 +1119,12 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1150,17 +1137,16 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1173,30 +1159,31 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 404: case httpRes.StatusCode == 404:
fallthrough fallthrough
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
# AllLibraries
Indicates if the user has access to all libraries.
## Values
| Name | Value |
| --------------------- | --------------------- |
| `AllLibrariesDisable` | 0 |
| `AllLibrariesEnable` | 1 |

View File

@@ -0,0 +1,11 @@
# AllowCameraUpload
Indicates if the user is allowed to upload from a camera.
## Values
| Name | Value |
| -------------------------- | -------------------------- |
| `AllowCameraUploadDisable` | 0 |
| `AllowCameraUploadEnable` | 1 |

View File

@@ -0,0 +1,11 @@
# AllowChannels
Indicates if the user has access to channels.
## Values
| Name | Value |
| ---------------------- | ---------------------- |
| `AllowChannelsDisable` | 0 |
| `AllowChannelsEnable` | 1 |

View File

@@ -0,0 +1,11 @@
# AllowSubtitleAdmin
Indicates if the user can manage subtitles.
## Values
| Name | Value |
| --------------------------- | --------------------------- |
| `AllowSubtitleAdminDisable` | 0 |
| `AllowSubtitleAdminEnable` | 1 |

View File

@@ -0,0 +1,11 @@
# AllowSync
Indicates if the user is allowed to sync media.
## Values
| Name | Value |
| ------------------ | ------------------ |
| `AllowSyncDisable` | 0 |
| `AllowSyncEnable` | 1 |

View File

@@ -0,0 +1,11 @@
# AllowTuners
Indicates if the user is allowed to use tuners.
## Values
| Name | Value |
| -------------------- | -------------------- |
| `AllowTunersDisable` | 0 |
| `AllowTunersEnable` | 1 |

View File

@@ -4,5 +4,5 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | Working NL Subs | | `Tag` | *string* | :heavy_check_mark: | The user-made collection this media item belongs to | My Awesome Collection |

View File

@@ -1,8 +1,12 @@
# Country # Country
The filter query string for country media items.
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------------ | ------------------------ | ------------------------ | ------------------------ | ------------------------ | | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | United States of America | | `ID` | *int64* | :heavy_check_mark: | N/A | 259 |
| `Tag` | *string* | :heavy_check_mark: | The country of origin of this media item | United States of America |
| `Filter` | **string* | :heavy_minus_sign: | N/A | country=19 |

View File

@@ -4,5 +4,5 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | -------------------- | -------------------- | -------------------- | -------------------- | -------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | James Cameron | | `Tag` | *string* | :heavy_check_mark: | The role of Director | Danny Boyle |

View File

@@ -0,0 +1,11 @@
# EnableCreditsMarkerGeneration
Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled).
## Values
| Name | Value |
| --------------------------------------------- | --------------------------------------------- |
| `EnableCreditsMarkerGenerationLibraryDefault` | -1 |
| `EnableCreditsMarkerGenerationDisabled` | 0 |

View File

@@ -0,0 +1,12 @@
# EpisodeSort
Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first).
## Values
| Name | Value |
| --------------------------- | --------------------------- |
| `EpisodeSortLibraryDefault` | -1 |
| `EpisodeSortOldestFirst` | 0 |
| `EpisodeSortNewestFirst` | 1 |

View File

@@ -1,9 +1,12 @@
# FlattenSeasons # FlattenSeasons
Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
## Values ## Values
| Name | Value | | Name | Value |
| --------------------- | --------------------- | | ------------------------------ | ------------------------------ |
| `FlattenSeasonsFalse` | 0 | | `FlattenSeasonsLibraryDefault` | -1 |
| `FlattenSeasonsTrue` | 1 | | `FlattenSeasonsHide` | 0 |
| `FlattenSeasonsShow` | 1 |

View File

@@ -1,8 +1,12 @@
# Genre # Genre
The filter query string for similar items.
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | Adventure | | `ID` | *int64* | :heavy_check_mark: | N/A | 259 |
| `Filter` | *string* | :heavy_check_mark: | N/A | genre=19 |
| `Tag` | *string* | :heavy_check_mark: | The genre name of this media-item<br/> | Crime |

View File

@@ -0,0 +1,11 @@
# GetActorsLibraryDirectory
## Fields
| Field | Type | Required | Description | Example |
| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `FastKey` | *string* | :heavy_check_mark: | A fast lookup key for the actor relative url. | /library/sections/2/all?actor=134671 |
| `Thumb` | *string* | :heavy_check_mark: | URL for the thumbnail image of the actor. | https://metadata-static.plex.tv/e/people/e2a915b537ef720252b6d408bc1f91b3.jpg |
| `Key` | *string* | :heavy_check_mark: | A unique key representing the actor. | 134671 |
| `Title` | *string* | :heavy_check_mark: | The name of the actor. | Aaron Paul |

View File

@@ -0,0 +1,20 @@
# GetActorsLibraryMediaContainer
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `Size` | *int* | :heavy_check_mark: | Number of media items returned in this response. | 50 |
| `AllowSync` | *bool* | :heavy_check_mark: | Indicates whether syncing is allowed. | false |
| `Art` | *string* | :heavy_check_mark: | URL for the background artwork of the media container. | /:/resources/show-fanart.jpg |
| `Identifier` | *string* | :heavy_check_mark: | An plugin identifier for the media container. | com.plexapp.plugins.library |
| `MediaTagPrefix` | *string* | :heavy_check_mark: | The prefix used for media tag resource paths. | /system/bundle/media/flags/ |
| `MediaTagVersion` | *int64* | :heavy_check_mark: | The version number for media tags. | 1734362201 |
| `Nocache` | *bool* | :heavy_check_mark: | Specifies whether caching is disabled. | true |
| `Thumb` | *string* | :heavy_check_mark: | URL for the thumbnail image of the media container. | /:/resources/show.png |
| `Title1` | *string* | :heavy_check_mark: | The primary title of the media container. | TV Series |
| `Title2` | *string* | :heavy_check_mark: | The secondary title of the media container. | By Starring Actor |
| `ViewGroup` | *string* | :heavy_check_mark: | Identifier for the view group layout. | secondary |
| `ViewMode` | *string* | :heavy_check_mark: | Identifier for the view mode. | 131131 |
| `Directory` | [][operations.GetActorsLibraryDirectory](../../models/operations/getactorslibrarydirectory.md) | :heavy_minus_sign: | An array of actor entries for media items. | |

View File

@@ -0,0 +1,22 @@
# GetActorsLibraryQueryParamType
The type of media to retrieve or filter by.
1 = movie
2 = show
3 = season
4 = episode
E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
## Values
| Name | Value |
| --------------------------------------- | --------------------------------------- |
| `GetActorsLibraryQueryParamTypeMovie` | 1 |
| `GetActorsLibraryQueryParamTypeTvShow` | 2 |
| `GetActorsLibraryQueryParamTypeSeason` | 3 |
| `GetActorsLibraryQueryParamTypeEpisode` | 4 |
| `GetActorsLibraryQueryParamTypeAudio` | 8 |
| `GetActorsLibraryQueryParamTypeAlbum` | 9 |
| `GetActorsLibraryQueryParamTypeTrack` | 10 |

View File

@@ -0,0 +1,9 @@
# GetActorsLibraryRequest
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |
| `Type` | [operations.GetActorsLibraryQueryParamType](../../models/operations/getactorslibraryqueryparamtype.md) | :heavy_check_mark: | The type of media to retrieve or filter by.<br/>1 = movie<br/>2 = show<br/>3 = season<br/>4 = episode<br/>E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries<br/> | 2 |

View File

@@ -0,0 +1,11 @@
# GetActorsLibraryResponse
## Fields
| Field | Type | Required | Description |
| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation |
| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing |
| `Object` | [*operations.GetActorsLibraryResponseBody](../../models/operations/getactorslibraryresponsebody.md) | :heavy_minus_sign: | Successful response containing media container data. |

View File

@@ -0,0 +1,10 @@
# GetActorsLibraryResponseBody
Successful response containing media container data.
## Fields
| Field | Type | Required | Description |
| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `MediaContainer` | [*operations.GetActorsLibraryMediaContainer](../../models/operations/getactorslibrarymediacontainer.md) | :heavy_minus_sign: | N/A |

View File

@@ -0,0 +1,12 @@
# GetAllMediaLibraryActiveDirection
The direction of the sort. Can be either `asc` or `desc`.
## Values
| Name | Value |
| --------------------------------------------- | --------------------------------------------- |
| `GetAllMediaLibraryActiveDirectionAscending` | asc |
| `GetAllMediaLibraryActiveDirectionDescending` | desc |

View File

@@ -0,0 +1,8 @@
# GetAllMediaLibraryCollection
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------- |
| `Tag` | *string* | :heavy_check_mark: | The user-made collection this media item belongs to | My Awesome Collection |

View File

@@ -0,0 +1,8 @@
# GetAllMediaLibraryCountry
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| `Tag` | *string* | :heavy_check_mark: | The country of origin of this media item | United States of America |

View File

@@ -0,0 +1,12 @@
# GetAllMediaLibraryDefaultDirection
The direction of the sort. Can be either `asc` or `desc`.
## Values
| Name | Value |
| ---------------------------------------------- | ---------------------------------------------- |
| `GetAllMediaLibraryDefaultDirectionAscending` | asc |
| `GetAllMediaLibraryDefaultDirectionDescending` | desc |

View File

@@ -0,0 +1,8 @@
# GetAllMediaLibraryDirector
## Fields
| Field | Type | Required | Description | Example |
| -------------------- | -------------------- | -------------------- | -------------------- | -------------------- |
| `Tag` | *string* | :heavy_check_mark: | The role of Director | Danny Boyle |

View File

@@ -0,0 +1,11 @@
# GetAllMediaLibraryField
## Fields
| Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| `Key` | *string* | :heavy_check_mark: | N/A | show.title |
| `Title` | *string* | :heavy_check_mark: | N/A | Show Title |
| `Type` | *string* | :heavy_check_mark: | N/A | string |
| `SubType` | **string* | :heavy_minus_sign: | N/A | rating |

View File

@@ -0,0 +1,9 @@
# GetAllMediaLibraryFieldType
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| `Type` | *string* | :heavy_check_mark: | N/A | tag |
| `Operator` | [][operations.GetAllMediaLibraryOperator](../../models/operations/getallmedialibraryoperator.md) | :heavy_check_mark: | N/A | |

View File

@@ -0,0 +1,13 @@
# GetAllMediaLibraryFilter
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- |
| `Filter` | *string* | :heavy_check_mark: | N/A | genre |
| `FilterType` | *string* | :heavy_check_mark: | N/A | string |
| `Key` | *string* | :heavy_check_mark: | N/A | /library/sections/2/genre?type=2 |
| `Title` | *string* | :heavy_check_mark: | N/A | Genre |
| `Type` | *string* | :heavy_check_mark: | N/A | filter |
| `Advanced` | **bool* | :heavy_minus_sign: | N/A | true |

View File

@@ -0,0 +1,8 @@
# GetAllMediaLibraryGenre
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- |
| `Tag` | *string* | :heavy_check_mark: | The genre name of this media-item<br/> | Crime |

View File

@@ -0,0 +1,8 @@
# GetAllMediaLibraryGuids
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `ID` | **string* | :heavy_minus_sign: | The unique identifier for the Guid. Can be imdb://tt0286347, tmdb://1763, tvdb://2337<br/> | tvdb://2337 |

View File

@@ -0,0 +1,11 @@
# GetAllMediaLibraryHasThumbnail
Indicates if the part has a thumbnail.
## Values
| Name | Value |
| ------------------------------------- | ------------------------------------- |
| `GetAllMediaLibraryHasThumbnailFalse` | 0 |
| `GetAllMediaLibraryHasThumbnailTrue` | 1 |

View File

@@ -0,0 +1,10 @@
# GetAllMediaLibraryImage
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `Alt` | *string* | :heavy_check_mark: | N/A | Episode 1 |
| `Type` | [operations.GetAllMediaLibraryLibraryResponseType](../../models/operations/getallmedialibrarylibraryresponsetype.md) | :heavy_check_mark: | N/A | background |
| `URL` | *string* | :heavy_check_mark: | N/A | /library/metadata/45521/thumb/1644710589 |

View File

@@ -0,0 +1,19 @@
# GetAllMediaLibraryLibraryOptimizedForStreaming
Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true
## Supported Types
### GetAllMediaLibraryOptimizedForStreaming1
```go
getAllMediaLibraryLibraryOptimizedForStreaming := operations.CreateGetAllMediaLibraryLibraryOptimizedForStreamingGetAllMediaLibraryOptimizedForStreaming1(operations.GetAllMediaLibraryOptimizedForStreaming1{/* values here */})
```
###
```go
getAllMediaLibraryLibraryOptimizedForStreaming := operations.CreateGetAllMediaLibraryLibraryOptimizedForStreamingBoolean(bool{/* values here */})
```

View File

@@ -0,0 +1,11 @@
# GetAllMediaLibraryLibraryResponseType
## Values
| Name | Value |
| -------------------------------------------------- | -------------------------------------------------- |
| `GetAllMediaLibraryLibraryResponseTypeCoverPoster` | coverPoster |
| `GetAllMediaLibraryLibraryResponseTypeBackground` | background |
| `GetAllMediaLibraryLibraryResponseTypeSnapshot` | snapshot |
| `GetAllMediaLibraryLibraryResponseTypeClearLogo` | clearLogo |

View File

@@ -0,0 +1,16 @@
# GetAllMediaLibraryLibraryType
The type of media content
## Values
| Name | Value |
| -------------------------------------- | -------------------------------------- |
| `GetAllMediaLibraryLibraryTypeMovie` | movie |
| `GetAllMediaLibraryLibraryTypeTvShow` | show |
| `GetAllMediaLibraryLibraryTypeSeason` | season |
| `GetAllMediaLibraryLibraryTypeEpisode` | episode |
| `GetAllMediaLibraryLibraryTypeArtist` | artist |
| `GetAllMediaLibraryLibraryTypeAlbum` | album |

View File

@@ -0,0 +1,26 @@
# GetAllMediaLibraryMedia
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `ID` | *int64* | :heavy_check_mark: | Unique media identifier. | 387322 |
| `Duration` | **int* | :heavy_minus_sign: | Duration of the media in milliseconds. | 9610350 |
| `Bitrate` | **int* | :heavy_minus_sign: | Bitrate in bits per second. | 25512 |
| `Width` | **int* | :heavy_minus_sign: | Video width in pixels. | 3840 |
| `Height` | **int* | :heavy_minus_sign: | Video height in pixels. | 1602 |
| `AspectRatio` | **float32* | :heavy_minus_sign: | Aspect ratio of the video. | 2.35 |
| `AudioChannels` | **int* | :heavy_minus_sign: | Number of audio channels. | 6 |
| `DisplayOffset` | **int* | :heavy_minus_sign: | N/A | 50 |
| `AudioCodec` | **string* | :heavy_minus_sign: | Audio codec used. | eac3 |
| `VideoCodec` | **string* | :heavy_minus_sign: | Video codec used. | hevc |
| `VideoResolution` | **string* | :heavy_minus_sign: | Video resolution (e.g., 4k). | 4k |
| `Container` | **string* | :heavy_minus_sign: | File container type. | mkv |
| `VideoFrameRate` | **string* | :heavy_minus_sign: | Frame rate of the video. Values found include NTSC, PAL, 24p<br/> | 24p |
| `VideoProfile` | **string* | :heavy_minus_sign: | Video profile (e.g., main 10). | main 10 |
| `HasVoiceActivity` | **bool* | :heavy_minus_sign: | Indicates whether voice activity is detected. | false |
| `AudioProfile` | **string* | :heavy_minus_sign: | The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). | dts |
| `OptimizedForStreaming` | [*operations.GetAllMediaLibraryOptimizedForStreaming](../../models/operations/getallmedialibraryoptimizedforstreaming.md) | :heavy_minus_sign: | Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true | |
| `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false |
| `Part` | [][operations.GetAllMediaLibraryPart](../../models/operations/getallmedialibrarypart.md) | :heavy_minus_sign: | An array of parts for this media item. | |

View File

@@ -0,0 +1,26 @@
# GetAllMediaLibraryMediaContainer
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| `Size` | *int* | :heavy_check_mark: | Number of media items returned in this response. | 50 |
| `TotalSize` | *int* | :heavy_check_mark: | Total number of media items in the library. | 50 |
| `Offset` | *int64* | :heavy_check_mark: | Offset value for pagination. | 0 |
| `AllowSync` | *bool* | :heavy_check_mark: | Indicates whether syncing is allowed. | false |
| `Art` | *string* | :heavy_check_mark: | URL for the background artwork of the media container. | /:/resources/show-fanart.jpg |
| `Content` | *string* | :heavy_check_mark: | The content type or mode. | secondary |
| `Identifier` | *string* | :heavy_check_mark: | An plugin identifier for the media container. | com.plexapp.plugins.library |
| `LibrarySectionID` | *int64* | :heavy_check_mark: | The unique identifier for the library section. | 2 |
| `LibrarySectionTitle` | *string* | :heavy_check_mark: | The title of the library section. | TV Series |
| `LibrarySectionUUID` | **string* | :heavy_minus_sign: | The universally unique identifier for the library section. | e69655a2-ef48-4aba-bb19-0cc34d1e7d36 |
| `MediaTagPrefix` | *string* | :heavy_check_mark: | The prefix used for media tag resource paths. | /system/bundle/media/flags/ |
| `MediaTagVersion` | *int64* | :heavy_check_mark: | The version number for media tags. | 1734362201 |
| `Thumb` | *string* | :heavy_check_mark: | URL for the thumbnail image of the media container. | /:/resources/show.png |
| `Nocache` | *bool* | :heavy_check_mark: | Specifies whether caching is disabled. | true |
| `Title1` | *string* | :heavy_check_mark: | The primary title of the media container. | TV Series |
| `Title2` | *string* | :heavy_check_mark: | The secondary title of the media container. | By Starring Actor |
| `ViewGroup` | *string* | :heavy_check_mark: | Identifier for the view group layout. | secondary |
| `Meta` | [*operations.GetAllMediaLibraryMeta](../../models/operations/getallmedialibrarymeta.md) | :heavy_minus_sign: | The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.<br/> | |
| `Metadata` | [][operations.GetAllMediaLibraryMetadata](../../models/operations/getallmedialibrarymetadata.md) | :heavy_minus_sign: | An array of metadata items. | |

View File

@@ -1,11 +1,12 @@
# GetMetaDataByRatingKeyBadRequest # GetAllMediaLibraryMeta
The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.
Bad Request - A parameter was not specified, or was specified incorrectly.
## Fields ## Fields
| Field | Type | Required | Description | | Field | Type | Required | Description |
| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| `Errors` | [][sdkerrors.GetMetaDataByRatingKeyErrors](../../models/sdkerrors/getmetadatabyratingkeyerrors.md) | :heavy_minus_sign: | N/A | | `Type` | [][operations.GetAllMediaLibraryType](../../models/operations/getallmedialibrarytype.md) | :heavy_minus_sign: | N/A |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | | `FieldType` | [][operations.GetAllMediaLibraryFieldType](../../models/operations/getallmedialibraryfieldtype.md) | :heavy_minus_sign: | N/A |

View File

@@ -0,0 +1,74 @@
# GetAllMediaLibraryMetadata
Unknown
## Fields
| Field | Type | Required | Description | Example |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `RatingKey` | *string* | :heavy_check_mark: | The rating key (Media ID) of this media item. Note: Although this is always an integer, it is represented as a string in the API. | 58683 |
| `Key` | *string* | :heavy_check_mark: | The unique key for the media item. | /library/metadata/58683 |
| `GUID` | *string* | :heavy_check_mark: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 |
| `Slug` | *string* | :heavy_check_mark: | A URLfriendly version of the media title. | 4-for-texas |
| `Studio` | **string* | :heavy_minus_sign: | The studio that produced the media item. | 20th Century Studios |
| `Type` | [operations.GetAllMediaLibraryLibraryType](../../models/operations/getallmedialibrarylibrarytype.md) | :heavy_check_mark: | N/A | movie |
| `Title` | *string* | :heavy_check_mark: | The title of the media item. | Avatar: The Way of Water |
| `TitleSort` | *string* | :heavy_check_mark: | The sort title used for ordering media items. | Whale |
| `ContentRating` | **string* | :heavy_minus_sign: | The content rating for the media item. | PG-13 |
| `Summary` | *string* | :heavy_check_mark: | A synopsis of the media item. | Jake Sully lives with his newfound family formed on the extrasolar moon Pandora.<br/>Once a familiar threat returns to finish what was previously started, Jake must<br/>work with Neytiri and the army of the Na'vi race to protect their home.<br/> |
| `Rating` | *float32* | :heavy_check_mark: | The critic rating for the media item. | 7.6 |
| `AudienceRating` | *float64* | :heavy_check_mark: | The audience rating for the media item. | 9.2 |
| `Year` | **int* | :heavy_minus_sign: | The release year of the media item. | 2022 |
| `Tagline` | *string* | :heavy_check_mark: | A brief tagline for the media item. | Return to Pandora. |
| `Thumb` | *string* | :heavy_check_mark: | The thumbnail image URL for the media item. | /library/metadata/58683/thumb/1703239236 |
| `Art` | *string* | :heavy_check_mark: | The art image URL for the media item. | /library/metadata/58683/art/1703239236 |
| `Theme` | *string* | :heavy_check_mark: | The theme URL for the media item. | /library/metadata/1/theme/1705636920 |
| `Index` | *int* | :heavy_check_mark: | The index position of the media item. | 1 |
| `LeafCount` | **int* | :heavy_minus_sign: | The number of leaf items (end nodes) under this media item. | 14 |
| `ViewedLeafCount` | **int* | :heavy_minus_sign: | The number of leaf items that have been viewed. | 0 |
| `ChildCount` | *int* | :heavy_check_mark: | The number of child items associated with this media item. | 1 |
| `SeasonCount` | *int* | :heavy_check_mark: | The total number of seasons (for TV shows). | 2022 |
| `Duration` | *int* | :heavy_check_mark: | The duration of the media item in milliseconds. | 11558112 |
| `OriginallyAvailableAt` | [types.Date](../../types/date.md) | :heavy_check_mark: | The original release date of the media item. | 2022-12-14 |
| `AddedAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `UpdatedAt` | **int64* | :heavy_minus_sign: | Unix epoch datetime in seconds | 1556281940 |
| `AudienceRatingImage` | **string* | :heavy_minus_sign: | The URL for the audience rating image. | rottentomatoes://image.rating.upright |
| `ChapterSource` | **string* | :heavy_minus_sign: | The source from which chapter data is derived. | media |
| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | The primary extra key associated with this media item. | /library/metadata/58684 |
| `OriginalTitle` | **string* | :heavy_minus_sign: | The original title of the media item (if different). | 映画 ブラッククローバー 魔法帝の剣 |
| `ParentRatingKey` | **string* | :heavy_minus_sign: | The rating key of the parent media item. | 66 |
| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The rating key of the grandparent media item. | 66 |
| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 |
| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 |
| `GrandparentSlug` | **string* | :heavy_minus_sign: | The slug for the grandparent media item. | alice-in-borderland-2020 |
| `GrandparentKey` | **string* | :heavy_minus_sign: | The key of the grandparent media item. | /library/metadata/66 |
| `ParentKey` | **string* | :heavy_minus_sign: | The key of the parent media item. | /library/metadata/66 |
| `GrandparentTitle` | **string* | :heavy_minus_sign: | The title of the grandparent media item. | Caprica |
| `GrandparentThumb` | **string* | :heavy_minus_sign: | The thumbnail URL for the grandparent media item. | /library/metadata/66/thumb/1705716261 |
| `GrandparentTheme` | **string* | :heavy_minus_sign: | The theme URL for the grandparent media item. | /library/metadata/66/theme/1705716261 |
| `GrandparentArt` | **string* | :heavy_minus_sign: | The art URL for the grandparent media item. | /library/metadata/66/art/1705716261 |
| `ParentTitle` | **string* | :heavy_minus_sign: | The title of the parent media item. | Caprica |
| `ParentIndex` | **int* | :heavy_minus_sign: | The index position of the parent media item. | 1 |
| `ParentThumb` | **string* | :heavy_minus_sign: | The thumbnail URL for the parent media item. | /library/metadata/66/thumb/1705716261 |
| `RatingImage` | **string* | :heavy_minus_sign: | The URL for the rating image. | rottentomatoes://image.rating.ripe |
| `ViewCount` | **int* | :heavy_minus_sign: | The number of times this media item has been viewed. | 1 |
| `ViewOffset` | **int* | :heavy_minus_sign: | The current playback offset (in milliseconds). | 5222500 |
| `SkipCount` | **int* | :heavy_minus_sign: | The number of times this media item has been skipped. | 1 |
| `Subtype` | **string* | :heavy_minus_sign: | A classification that further describes the type of media item. For example, 'clip' indicates that the item is a short video clip. | clip |
| `LastRatedAt` | **int64* | :heavy_minus_sign: | The Unix timestamp representing the last time the item was rated. | 1721813113 |
| `CreatedAtAccuracy` | **string* | :heavy_minus_sign: | The accuracy of the creation timestamp. This value indicates the format(s) provided (for example, 'epoch,local' means both epoch and local time formats are available). | epoch,local |
| `CreatedAtTZOffset` | **string* | :heavy_minus_sign: | The time zone offset for the creation timestamp, represented as a string. This offset indicates the difference from UTC. | 0 |
| `LastViewedAt` | **int* | :heavy_minus_sign: | Unix timestamp for when the media item was last viewed. | 1682752242 |
| `UserRating` | **float32* | :heavy_minus_sign: | The rating provided by a user for the item. This value is expressed as a decimal number. | 10 |
| `Image` | [][operations.GetAllMediaLibraryImage](../../models/operations/getallmedialibraryimage.md) | :heavy_minus_sign: | N/A | |
| `UltraBlurColors` | [*operations.GetAllMediaLibraryUltraBlurColors](../../models/operations/getallmedialibraryultrablurcolors.md) | :heavy_minus_sign: | N/A | |
| `Media` | [][operations.GetAllMediaLibraryMedia](../../models/operations/getallmedialibrarymedia.md) | :heavy_minus_sign: | N/A | |
| `Genre` | [][operations.GetAllMediaLibraryGenre](../../models/operations/getallmedialibrarygenre.md) | :heavy_minus_sign: | N/A | |
| `Country` | [][operations.GetAllMediaLibraryCountry](../../models/operations/getallmedialibrarycountry.md) | :heavy_minus_sign: | N/A | |
| `Director` | [][operations.GetAllMediaLibraryDirector](../../models/operations/getallmedialibrarydirector.md) | :heavy_minus_sign: | N/A | |
| `Writer` | [][operations.GetAllMediaLibraryWriter](../../models/operations/getallmedialibrarywriter.md) | :heavy_minus_sign: | N/A | |
| `Role` | [][operations.GetAllMediaLibraryRole](../../models/operations/getallmedialibraryrole.md) | :heavy_minus_sign: | N/A | |
| `Guids` | [][operations.GetAllMediaLibraryGuids](../../models/operations/getallmedialibraryguids.md) | :heavy_minus_sign: | N/A | |
| `Collection` | [][operations.GetAllMediaLibraryCollection](../../models/operations/getallmedialibrarycollection.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,9 @@
# GetAllMediaLibraryOperator
## Fields
| Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| `Key` | *string* | :heavy_check_mark: | N/A | = |
| `Title` | *string* | :heavy_check_mark: | N/A | is |

View File

@@ -0,0 +1,19 @@
# GetAllMediaLibraryOptimizedForStreaming
Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true
## Supported Types
### OptimizedForStreaming1
```go
getAllMediaLibraryOptimizedForStreaming := operations.CreateGetAllMediaLibraryOptimizedForStreamingOptimizedForStreaming1(operations.OptimizedForStreaming1{/* values here */})
```
###
```go
getAllMediaLibraryOptimizedForStreaming := operations.CreateGetAllMediaLibraryOptimizedForStreamingBoolean(bool{/* values here */})
```

View File

@@ -0,0 +1,9 @@
# GetAllMediaLibraryOptimizedForStreaming1
## Values
| Name | Value |
| ---------------------------------------------- | ---------------------------------------------- |
| `GetAllMediaLibraryOptimizedForStreaming1Zero` | 0 |
| `GetAllMediaLibraryOptimizedForStreaming1One` | 1 |

View File

@@ -0,0 +1,23 @@
# GetAllMediaLibraryPart
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
| `Accessible` | **bool* | :heavy_minus_sign: | Indicates if the part is accessible. | true |
| `Exists` | **bool* | :heavy_minus_sign: | Indicates if the part exists. | true |
| `ID` | *int64* | :heavy_check_mark: | Unique part identifier. | 418385 |
| `Key` | *string* | :heavy_check_mark: | Key to access this part. | /library/parts/418385/1735864239/file.mkv |
| `Indexes` | **string* | :heavy_minus_sign: | N/A | sd |
| `Duration` | **int* | :heavy_minus_sign: | Duration of the part in milliseconds. | 9610350 |
| `File` | *string* | :heavy_check_mark: | File path for the part. | /mnt/Movies_1/W/Wicked (2024).mkv |
| `Size` | *int64* | :heavy_check_mark: | File size in bytes. | 30649952104 |
| `PacketLength` | **int* | :heavy_minus_sign: | N/A | 188 |
| `Container` | **string* | :heavy_minus_sign: | Container format of the part. | mkv |
| `VideoProfile` | **string* | :heavy_minus_sign: | Video profile for the part. | main 10 |
| `AudioProfile` | **string* | :heavy_minus_sign: | The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). | dts |
| `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false |
| `OptimizedForStreaming` | [*operations.GetAllMediaLibraryLibraryOptimizedForStreaming](../../models/operations/getallmedialibrarylibraryoptimizedforstreaming.md) | :heavy_minus_sign: | Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true | |
| `HasThumbnail` | [*operations.GetAllMediaLibraryHasThumbnail](../../models/operations/getallmedialibraryhasthumbnail.md) | :heavy_minus_sign: | N/A | 1 |
| `Stream` | [][operations.GetAllMediaLibraryStream](../../models/operations/getallmedialibrarystream.md) | :heavy_minus_sign: | An array of streams for this part. | |

View File

@@ -0,0 +1,12 @@
# GetAllMediaLibraryQueryParamIncludeMeta
Adds the Meta object to the response
## Values
| Name | Value |
| ------------------------------------------------ | ------------------------------------------------ |
| `GetAllMediaLibraryQueryParamIncludeMetaDisable` | 0 |
| `GetAllMediaLibraryQueryParamIncludeMetaEnable` | 1 |

View File

@@ -0,0 +1,22 @@
# GetAllMediaLibraryQueryParamType
The type of media to retrieve or filter by.
1 = movie
2 = show
3 = season
4 = episode
E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
## Values
| Name | Value |
| ----------------------------------------- | ----------------------------------------- |
| `GetAllMediaLibraryQueryParamTypeMovie` | 1 |
| `GetAllMediaLibraryQueryParamTypeTvShow` | 2 |
| `GetAllMediaLibraryQueryParamTypeSeason` | 3 |
| `GetAllMediaLibraryQueryParamTypeEpisode` | 4 |
| `GetAllMediaLibraryQueryParamTypeAudio` | 8 |
| `GetAllMediaLibraryQueryParamTypeAlbum` | 9 |
| `GetAllMediaLibraryQueryParamTypeTrack` | 10 |

View File

@@ -0,0 +1,16 @@
# GetAllMediaLibraryRequest
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |
| `Type` | [operations.GetAllMediaLibraryQueryParamType](../../models/operations/getallmedialibraryqueryparamtype.md) | :heavy_check_mark: | The type of media to retrieve or filter by.<br/>1 = movie<br/>2 = show<br/>3 = season<br/>4 = episode<br/>E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries<br/> | 2 |
| `IncludeMeta` | [*operations.GetAllMediaLibraryQueryParamIncludeMeta](../../models/operations/getallmedialibraryqueryparamincludemeta.md) | :heavy_minus_sign: | Adds the Meta object to the response<br/> | 1 |
| `IncludeGuids` | [*operations.QueryParamIncludeGuids](../../models/operations/queryparamincludeguids.md) | :heavy_minus_sign: | Adds the Guid object to the response<br/> | 1 |
| `IncludeAdvanced` | [*operations.IncludeAdvanced](../../models/operations/includeadvanced.md) | :heavy_minus_sign: | N/A | 1 |
| `IncludeCollections` | [*operations.QueryParamIncludeCollections](../../models/operations/queryparamincludecollections.md) | :heavy_minus_sign: | N/A | 1 |
| `IncludeExternalMedia` | [*operations.QueryParamIncludeExternalMedia](../../models/operations/queryparamincludeexternalmedia.md) | :heavy_minus_sign: | N/A | 1 |
| `XPlexContainerStart` | **int* | :heavy_minus_sign: | The index of the first item to return. If not specified, the first item will be returned.<br/>If the number of items exceeds the limit, the response will be paginated.<br/>By default this is 0<br/> | 0 |
| `XPlexContainerSize` | **int* | :heavy_minus_sign: | The number of items to return. If not specified, all items will be returned.<br/>If the number of items exceeds the limit, the response will be paginated.<br/>By default this is 50<br/> | 50 |

View File

@@ -0,0 +1,11 @@
# GetAllMediaLibraryResponse
## Fields
| Field | Type | Required | Description |
| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation |
| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing |
| `Object` | [*operations.GetAllMediaLibraryResponseBody](../../models/operations/getallmedialibraryresponsebody.md) | :heavy_minus_sign: | Successful response containing media container data. |

View File

@@ -0,0 +1,10 @@
# GetAllMediaLibraryResponseBody
Successful response containing media container data.
## Fields
| Field | Type | Required | Description |
| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `MediaContainer` | [*operations.GetAllMediaLibraryMediaContainer](../../models/operations/getallmedialibrarymediacontainer.md) | :heavy_minus_sign: | N/A |

View File

@@ -0,0 +1,8 @@
# GetAllMediaLibraryRole
## Fields
| Field | Type | Required | Description | Example |
| ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- |
| `Tag` | *string* | :heavy_check_mark: | The display tag for the actor (typically the actor's name). | Teller |

View File

@@ -0,0 +1,15 @@
# GetAllMediaLibrarySort
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `Default` | **string* | :heavy_minus_sign: | N/A | asc |
| `Active` | **bool* | :heavy_minus_sign: | N/A | false |
| `ActiveDirection` | [*operations.GetAllMediaLibraryActiveDirection](../../models/operations/getallmedialibraryactivedirection.md) | :heavy_minus_sign: | The direction of the sort. Can be either `asc` or `desc`.<br/> | asc |
| `DefaultDirection` | [*operations.GetAllMediaLibraryDefaultDirection](../../models/operations/getallmedialibrarydefaultdirection.md) | :heavy_minus_sign: | The direction of the sort. Can be either `asc` or `desc`.<br/> | asc |
| `DescKey` | **string* | :heavy_minus_sign: | N/A | titleSort:desc |
| `FirstCharacterKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/2/firstCharacter |
| `Key` | *string* | :heavy_check_mark: | N/A | titleSort |
| `Title` | *string* | :heavy_check_mark: | N/A | Title |

View File

@@ -0,0 +1,56 @@
# GetAllMediaLibraryStream
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- |
| `ID` | *int64* | :heavy_check_mark: | Unique stream identifier. | 1002625 |
| `StreamType` | *int* | :heavy_check_mark: | Stream type (1=video, 2=audio, 3=subtitle). | 1 |
| `Default` | **bool* | :heavy_minus_sign: | Indicates if this stream is default. | true |
| `Codec` | *string* | :heavy_check_mark: | Codec used by the stream. | hevc |
| `Index` | *int* | :heavy_check_mark: | Index of the stream. | 0 |
| `Bitrate` | **int* | :heavy_minus_sign: | Bitrate of the stream. | 24743 |
| `Language` | **string* | :heavy_minus_sign: | Language of the stream. | English |
| `LanguageTag` | **string* | :heavy_minus_sign: | Language tag (e.g., en). | en |
| `LanguageCode` | **string* | :heavy_minus_sign: | ISO language code. | eng |
| `HeaderCompression` | **bool* | :heavy_minus_sign: | Indicates whether header compression is enabled. | true |
| `DOVIBLCompatID` | **int* | :heavy_minus_sign: | Dolby Vision BL compatibility ID. | 1 |
| `DOVIBLPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision BL is present. | true |
| `DOVIELPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision EL is present. | false |
| `DOVILevel` | **int* | :heavy_minus_sign: | Dolby Vision level. | 6 |
| `DOVIPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision is present. | true |
| `DOVIProfile` | **int* | :heavy_minus_sign: | Dolby Vision profile. | 8 |
| `DOVIRPUPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision RPU is present. | true |
| `DOVIVersion` | **string* | :heavy_minus_sign: | Dolby Vision version. | 1.0 |
| `BitDepth` | **int* | :heavy_minus_sign: | Bit depth of the video stream. | 10 |
| `ChromaLocation` | **string* | :heavy_minus_sign: | Chroma sample location. | topleft |
| `ChromaSubsampling` | **string* | :heavy_minus_sign: | Chroma subsampling format. | 4:2:0 |
| `CodedHeight` | **int* | :heavy_minus_sign: | Coded video height. | 1608 |
| `CodedWidth` | **int* | :heavy_minus_sign: | Coded video width. | 3840 |
| `ClosedCaptions` | **bool* | :heavy_minus_sign: | N/A | true |
| `ColorPrimaries` | **string* | :heavy_minus_sign: | Color primaries used. | bt2020 |
| `ColorRange` | **string* | :heavy_minus_sign: | Color range (e.g., tv). | tv |
| `ColorSpace` | **string* | :heavy_minus_sign: | Color space. | bt2020nc |
| `ColorTrc` | **string* | :heavy_minus_sign: | Color transfer characteristics. | smpte2084 |
| `FrameRate` | **float32* | :heavy_minus_sign: | Frame rate of the stream. | 23.976 |
| `Height` | **int* | :heavy_minus_sign: | Height of the video stream. | 1602 |
| `Level` | **int* | :heavy_minus_sign: | Video level. | 150 |
| `Original` | **bool* | :heavy_minus_sign: | Indicates if this is the original stream. | true |
| `HasScalingMatrix` | **bool* | :heavy_minus_sign: | N/A | false |
| `Profile` | **string* | :heavy_minus_sign: | Video profile. | main 10 |
| `ScanType` | **string* | :heavy_minus_sign: | N/A | progressive |
| `EmbeddedInVideo` | **string* | :heavy_minus_sign: | N/A | progressive |
| `RefFrames` | **int* | :heavy_minus_sign: | Number of reference frames. | 1 |
| `Width` | **int* | :heavy_minus_sign: | Width of the video stream. | 3840 |
| `DisplayTitle` | *string* | :heavy_check_mark: | Display title for the stream. | 4K DoVi/HDR10 (HEVC Main 10) |
| `ExtendedDisplayTitle` | *string* | :heavy_check_mark: | Extended display title for the stream. | 4K DoVi/HDR10 (HEVC Main 10) |
| `Selected` | **bool* | :heavy_minus_sign: | Indicates if this stream is selected (applicable for audio streams). | true |
| `Forced` | **bool* | :heavy_minus_sign: | N/A | true |
| `Channels` | **int* | :heavy_minus_sign: | Number of audio channels (for audio streams). | 6 |
| `AudioChannelLayout` | **string* | :heavy_minus_sign: | Audio channel layout. | 5.1(side) |
| `SamplingRate` | **int* | :heavy_minus_sign: | Sampling rate for the audio stream. | 48000 |
| `CanAutoSync` | **bool* | :heavy_minus_sign: | Indicates if the stream can auto-sync. | false |
| `HearingImpaired` | **bool* | :heavy_minus_sign: | Indicates if the stream is for the hearing impaired. | true |
| `Dub` | **bool* | :heavy_minus_sign: | Indicates if the stream is a dub. | true |
| `Title` | **string* | :heavy_minus_sign: | Optional title for the stream (e.g., language variant). | SDH |

View File

@@ -0,0 +1,15 @@
# GetAllMediaLibraryType
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| `Key` | *string* | :heavy_check_mark: | N/A | /library/sections/2/all?type=2 |
| `Type` | *string* | :heavy_check_mark: | N/A | filter |
| `Subtype` | **string* | :heavy_minus_sign: | N/A | clip |
| `Title` | *string* | :heavy_check_mark: | N/A | TV Shows |
| `Active` | *bool* | :heavy_check_mark: | N/A | false |
| `Filter` | [][operations.GetAllMediaLibraryFilter](../../models/operations/getallmedialibraryfilter.md) | :heavy_minus_sign: | N/A | |
| `Sort` | [][operations.GetAllMediaLibrarySort](../../models/operations/getallmedialibrarysort.md) | :heavy_minus_sign: | N/A | |
| `Field` | [][operations.GetAllMediaLibraryField](../../models/operations/getallmedialibraryfield.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,11 @@
# GetAllMediaLibraryUltraBlurColors
## Fields
| Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| `TopLeft` | *string* | :heavy_check_mark: | N/A | 11333b |
| `TopRight` | *string* | :heavy_check_mark: | N/A | 0a232d |
| `BottomRight` | *string* | :heavy_check_mark: | N/A | 73958 |
| `BottomLeft` | *string* | :heavy_check_mark: | N/A | 1f5066 |

View File

@@ -0,0 +1,8 @@
# GetAllMediaLibraryWriter
## Fields
| Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| `Tag` | *string* | :heavy_check_mark: | The role of Writer | Jamie P. Hanson |

View File

@@ -0,0 +1,10 @@
# GetCountriesLibraryDirectory
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- | ------------------------------------- |
| `FastKey` | *string* | :heavy_check_mark: | N/A | /library/sections/2/all?country=15491 |
| `Key` | *string* | :heavy_check_mark: | N/A | 15491 |
| `Title` | *string* | :heavy_check_mark: | N/A | Japan |

View File

@@ -0,0 +1,20 @@
# GetCountriesLibraryMediaContainer
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `Size` | *int* | :heavy_check_mark: | Number of media items returned in this response. | 50 |
| `AllowSync` | *bool* | :heavy_check_mark: | Indicates whether syncing is allowed. | false |
| `Art` | *string* | :heavy_check_mark: | URL for the background artwork of the media container. | /:/resources/show-fanart.jpg |
| `Content` | *string* | :heavy_check_mark: | The content type or mode. | secondary |
| `Identifier` | *string* | :heavy_check_mark: | An plugin identifier for the media container. | com.plexapp.plugins.library |
| `MediaTagPrefix` | *string* | :heavy_check_mark: | The prefix used for media tag resource paths. | /system/bundle/media/flags/ |
| `MediaTagVersion` | *int64* | :heavy_check_mark: | The version number for media tags. | 1734362201 |
| `Nocache` | *bool* | :heavy_check_mark: | Specifies whether caching is disabled. | true |
| `Thumb` | *string* | :heavy_check_mark: | URL for the thumbnail image of the media container. | /:/resources/show.png |
| `Title1` | *string* | :heavy_check_mark: | The primary title of the media container. | TV Series |
| `Title2` | *string* | :heavy_check_mark: | The secondary title of the media container. | By Starring Actor |
| `ViewGroup` | *string* | :heavy_check_mark: | Identifier for the view group layout. | secondary |
| `Directory` | [][operations.GetCountriesLibraryDirectory](../../models/operations/getcountrieslibrarydirectory.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,22 @@
# GetCountriesLibraryQueryParamType
The type of media to retrieve or filter by.
1 = movie
2 = show
3 = season
4 = episode
E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
## Values
| Name | Value |
| ------------------------------------------ | ------------------------------------------ |
| `GetCountriesLibraryQueryParamTypeMovie` | 1 |
| `GetCountriesLibraryQueryParamTypeTvShow` | 2 |
| `GetCountriesLibraryQueryParamTypeSeason` | 3 |
| `GetCountriesLibraryQueryParamTypeEpisode` | 4 |
| `GetCountriesLibraryQueryParamTypeAudio` | 8 |
| `GetCountriesLibraryQueryParamTypeAlbum` | 9 |
| `GetCountriesLibraryQueryParamTypeTrack` | 10 |

View File

@@ -0,0 +1,9 @@
# GetCountriesLibraryRequest
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |
| `Type` | [operations.GetCountriesLibraryQueryParamType](../../models/operations/getcountrieslibraryqueryparamtype.md) | :heavy_check_mark: | The type of media to retrieve or filter by.<br/>1 = movie<br/>2 = show<br/>3 = season<br/>4 = episode<br/>E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries<br/> | 2 |

View File

@@ -0,0 +1,11 @@
# GetCountriesLibraryResponse
## Fields
| Field | Type | Required | Description |
| --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation |
| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing |
| `Object` | [*operations.GetCountriesLibraryResponseBody](../../models/operations/getcountrieslibraryresponsebody.md) | :heavy_minus_sign: | Successful response containing media container data. |

View File

@@ -0,0 +1,10 @@
# GetCountriesLibraryResponseBody
Successful response containing media container data.
## Fields
| Field | Type | Required | Description |
| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `MediaContainer` | [*operations.GetCountriesLibraryMediaContainer](../../models/operations/getcountrieslibrarymediacontainer.md) | :heavy_minus_sign: | N/A |

View File

@@ -0,0 +1,11 @@
# GetGenresLibraryDirectory
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------- | --------------------------------- | --------------------------------- | --------------------------------- | --------------------------------- |
| `FastKey` | *string* | :heavy_check_mark: | N/A | /library/sections/10/all?genre=89 |
| `Key` | *string* | :heavy_check_mark: | N/A | 89 |
| `Title` | *string* | :heavy_check_mark: | N/A | Action |
| `Type` | *string* | :heavy_check_mark: | N/A | genre |

View File

@@ -0,0 +1,20 @@
# GetGenresLibraryMediaContainer
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `Size` | *int* | :heavy_check_mark: | Number of media items returned in this response. | 50 |
| `AllowSync` | *bool* | :heavy_check_mark: | Indicates whether syncing is allowed. | false |
| `Art` | *string* | :heavy_check_mark: | URL for the background artwork of the media container. | /:/resources/show-fanart.jpg |
| `Content` | *string* | :heavy_check_mark: | The content type or mode. | secondary |
| `Identifier` | *string* | :heavy_check_mark: | An plugin identifier for the media container. | com.plexapp.plugins.library |
| `MediaTagPrefix` | *string* | :heavy_check_mark: | The prefix used for media tag resource paths. | /system/bundle/media/flags/ |
| `MediaTagVersion` | *int64* | :heavy_check_mark: | The version number for media tags. | 1734362201 |
| `Nocache` | *bool* | :heavy_check_mark: | Specifies whether caching is disabled. | true |
| `Thumb` | *string* | :heavy_check_mark: | URL for the thumbnail image of the media container. | /:/resources/show.png |
| `Title1` | *string* | :heavy_check_mark: | The primary title of the media container. | TV Series |
| `Title2` | *string* | :heavy_check_mark: | The secondary title of the media container. | By Starring Actor |
| `ViewGroup` | *string* | :heavy_check_mark: | Identifier for the view group layout. | secondary |
| `Directory` | [][operations.GetGenresLibraryDirectory](../../models/operations/getgenreslibrarydirectory.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,22 @@
# GetGenresLibraryQueryParamType
The type of media to retrieve or filter by.
1 = movie
2 = show
3 = season
4 = episode
E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
## Values
| Name | Value |
| --------------------------------------- | --------------------------------------- |
| `GetGenresLibraryQueryParamTypeMovie` | 1 |
| `GetGenresLibraryQueryParamTypeTvShow` | 2 |
| `GetGenresLibraryQueryParamTypeSeason` | 3 |
| `GetGenresLibraryQueryParamTypeEpisode` | 4 |
| `GetGenresLibraryQueryParamTypeAudio` | 8 |
| `GetGenresLibraryQueryParamTypeAlbum` | 9 |
| `GetGenresLibraryQueryParamTypeTrack` | 10 |

View File

@@ -0,0 +1,9 @@
# GetGenresLibraryRequest
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |
| `Type` | [operations.GetGenresLibraryQueryParamType](../../models/operations/getgenreslibraryqueryparamtype.md) | :heavy_check_mark: | The type of media to retrieve or filter by.<br/>1 = movie<br/>2 = show<br/>3 = season<br/>4 = episode<br/>E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries<br/> | 2 |

View File

@@ -0,0 +1,11 @@
# GetGenresLibraryResponse
## Fields
| Field | Type | Required | Description |
| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation |
| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing |
| `Object` | [*operations.GetGenresLibraryResponseBody](../../models/operations/getgenreslibraryresponsebody.md) | :heavy_minus_sign: | Successful response containing media container data. |

View File

@@ -0,0 +1,10 @@
# GetGenresLibraryResponseBody
Successful response containing media container data.
## Fields
| Field | Type | Required | Description |
| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `MediaContainer` | [*operations.GetGenresLibraryMediaContainer](../../models/operations/getgenreslibrarymediacontainer.md) | :heavy_minus_sign: | N/A |

View File

@@ -10,3 +10,4 @@
| `Key` | *string* | :heavy_check_mark: | N/A | /library/sections/2/genre?type=2 | | `Key` | *string* | :heavy_check_mark: | N/A | /library/sections/2/genre?type=2 |
| `Title` | *string* | :heavy_check_mark: | N/A | Genre | | `Title` | *string* | :heavy_check_mark: | N/A | Genre |
| `Type` | *string* | :heavy_check_mark: | N/A | filter | | `Type` | *string* | :heavy_check_mark: | N/A | filter |
| `Advanced` | **bool* | :heavy_minus_sign: | N/A | true |

View File

@@ -1,9 +0,0 @@
# GetLibraryItemsFlattenSeasons
## Values
| Name | Value |
| ------------------------------------ | ------------------------------------ |
| `GetLibraryItemsFlattenSeasonsFalse` | 0 |
| `GetLibraryItemsFlattenSeasonsTrue` | 1 |

View File

@@ -12,3 +12,5 @@ The type of media content
| `GetLibraryItemsLibraryTypeTvShow` | show | | `GetLibraryItemsLibraryTypeTvShow` | show |
| `GetLibraryItemsLibraryTypeSeason` | season | | `GetLibraryItemsLibraryTypeSeason` | season |
| `GetLibraryItemsLibraryTypeEpisode` | episode | | `GetLibraryItemsLibraryTypeEpisode` | episode |
| `GetLibraryItemsLibraryTypeArtist` | artist |
| `GetLibraryItemsLibraryTypeAlbum` | album |

View File

@@ -29,5 +29,5 @@ The Meta object is only included in the response if the `includeMeta` parameter
| `ViewGroup` | *string* | :heavy_check_mark: | N/A | movie | | `ViewGroup` | *string* | :heavy_check_mark: | N/A | movie |
| `ViewMode` | **int* | :heavy_minus_sign: | N/A | 65592 | | `ViewMode` | **int* | :heavy_minus_sign: | N/A | 65592 |
| `MixedParents` | **bool* | :heavy_minus_sign: | N/A | true | | `MixedParents` | **bool* | :heavy_minus_sign: | N/A | true |
| `Metadata` | [][operations.GetLibraryItemsMetadata](../../models/operations/getlibraryitemsmetadata.md) | :heavy_check_mark: | N/A | | | `Metadata` | [][operations.GetLibraryItemsMetadata](../../models/operations/getlibraryitemsmetadata.md) | :heavy_minus_sign: | N/A | |
| `Meta` | [*operations.GetLibraryItemsMeta](../../models/operations/getlibraryitemsmeta.md) | :heavy_minus_sign: | The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.<br/> | | | `Meta` | [*operations.GetLibraryItemsMeta](../../models/operations/getlibraryitemsmeta.md) | :heavy_minus_sign: | The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.<br/> | |

View File

@@ -1,8 +0,0 @@
# GetLibraryItemsMediaGUID
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| `ID` | *string* | :heavy_check_mark: | Can be one of the following formats:<br/>imdb://tt13015952, tmdb://2434012, tvdb://7945991<br/> | imdb://tt13015952 |

View File

@@ -23,8 +23,10 @@
| `Year` | **int* | :heavy_minus_sign: | N/A | 2022 | | `Year` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 | | `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. | | `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. |
| `FlattenSeasons` | [*operations.GetLibraryItemsFlattenSeasons](../../models/operations/getlibraryitemsflattenseasons.md) | :heavy_minus_sign: | N/A | 1 | | `FlattenSeasons` | [*operations.FlattenSeasons](../../models/operations/flattenseasons.md) | :heavy_minus_sign: | Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). | 1 |
| `ShowOrdering` | [*operations.GetLibraryItemsShowOrdering](../../models/operations/getlibraryitemsshowordering.md) | :heavy_minus_sign: | Setting that indicates the episode ordering for the show <br/>None = Library default, <br/>tmdbAiring = The Movie Database (Aired), <br/>aired = TheTVDB (Aired), <br/>dvd = TheTVDB (DVD), <br/>absolute = TheTVDB (Absolute)).<br/> | dvd | | `EpisodeSort` | [*operations.EpisodeSort](../../models/operations/episodesort.md) | :heavy_minus_sign: | Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first). | 0 |
| `EnableCreditsMarkerGeneration` | [*operations.EnableCreditsMarkerGeneration](../../models/operations/enablecreditsmarkergeneration.md) | :heavy_minus_sign: | Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). | -1 |
| `ShowOrdering` | [*operations.ShowOrdering](../../models/operations/showordering.md) | :heavy_minus_sign: | Setting that indicates the episode ordering for the show.<br/>None = Library default,<br/>tmdbAiring = The Movie Database (Aired),<br/>aired = TheTVDB (Aired),<br/>dvd = TheTVDB (DVD),<br/>absolute = TheTVDB (Absolute)).<br/> | absolute |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 | | `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 | | `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 |
| `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 | | `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 |
@@ -53,9 +55,9 @@
| `Collection` | [][operations.GetLibraryItemsCollection](../../models/operations/getlibraryitemscollection.md) | :heavy_minus_sign: | N/A | | | `Collection` | [][operations.GetLibraryItemsCollection](../../models/operations/getlibraryitemscollection.md) | :heavy_minus_sign: | N/A | |
| `Role` | [][operations.GetLibraryItemsRole](../../models/operations/getlibraryitemsrole.md) | :heavy_minus_sign: | N/A | | | `Role` | [][operations.GetLibraryItemsRole](../../models/operations/getlibraryitemsrole.md) | :heavy_minus_sign: | N/A | |
| `Location` | [][operations.GetLibraryItemsLocation](../../models/operations/getlibraryitemslocation.md) | :heavy_minus_sign: | N/A | | | `Location` | [][operations.GetLibraryItemsLocation](../../models/operations/getlibraryitemslocation.md) | :heavy_minus_sign: | N/A | |
| `MediaGUID` | [][operations.GetLibraryItemsMediaGUID](../../models/operations/getlibraryitemsmediaguid.md) | :heavy_minus_sign: | The Guid object is only included in the response if the `includeGuids` parameter is set to `1`.<br/> | | | `MediaGUID` | [][operations.MediaGUID](../../models/operations/mediaguid.md) | :heavy_minus_sign: | The Guid object is only included in the response if the `includeGuids` parameter is set to `1`.<br/> | |
| `UltraBlurColors` | [*operations.GetLibraryItemsUltraBlurColors](../../models/operations/getlibraryitemsultrablurcolors.md) | :heavy_minus_sign: | N/A | | | `UltraBlurColors` | [*operations.GetLibraryItemsUltraBlurColors](../../models/operations/getlibraryitemsultrablurcolors.md) | :heavy_minus_sign: | N/A | |
| `MetaDataRating` | [][operations.GetLibraryItemsMetaDataRating](../../models/operations/getlibraryitemsmetadatarating.md) | :heavy_minus_sign: | N/A | | | `MetaDataRating` | [][operations.MetaDataRating](../../models/operations/metadatarating.md) | :heavy_minus_sign: | N/A | |
| `Image` | [][operations.GetLibraryItemsImage](../../models/operations/getlibraryitemsimage.md) | :heavy_minus_sign: | N/A | | | `Image` | [][operations.GetLibraryItemsImage](../../models/operations/getlibraryitemsimage.md) | :heavy_minus_sign: | N/A | |
| `TitleSort` | **string* | :heavy_minus_sign: | N/A | Whale | | `TitleSort` | **string* | :heavy_minus_sign: | N/A | Whale |
| `ViewCount` | **int* | :heavy_minus_sign: | N/A | 1 | | `ViewCount` | **int* | :heavy_minus_sign: | N/A | 1 |

View File

@@ -1,10 +0,0 @@
# GetLibraryItemsMetaDataRating
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- |
| `Image` | *string* | :heavy_check_mark: | A URI or path to the rating image. | themoviedb://image.rating |
| `Value` | *float32* | :heavy_check_mark: | The value of the rating. | 3 |
| `Type` | *string* | :heavy_check_mark: | The type of rating (e.g., audience, critic). | audience |

View File

@@ -1,6 +1,6 @@
# GetLibraryItemsQueryParamType # GetLibraryItemsQueryParamType
The type of media to retrieve. The type of media to retrieve or filter by.
1 = movie 1 = movie
2 = show 2 = show
3 = season 3 = season
@@ -17,3 +17,6 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `GetLibraryItemsQueryParamTypeTvShow` | 2 | | `GetLibraryItemsQueryParamTypeTvShow` | 2 |
| `GetLibraryItemsQueryParamTypeSeason` | 3 | | `GetLibraryItemsQueryParamTypeSeason` | 3 |
| `GetLibraryItemsQueryParamTypeEpisode` | 4 | | `GetLibraryItemsQueryParamTypeEpisode` | 4 |
| `GetLibraryItemsQueryParamTypeAudio` | 8 |
| `GetLibraryItemsQueryParamTypeAlbum` | 9 |
| `GetLibraryItemsQueryParamTypeTrack` | 10 |

View File

@@ -4,10 +4,10 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Tag` | [operations.Tag](../../models/operations/tag.md) | :heavy_check_mark: | A key representing a specific tag within the section. | | | `Tag` | [operations.Tag](../../models/operations/tag.md) | :heavy_check_mark: | A key representing a specific tag within the section. | |
| `IncludeGuids` | [*operations.IncludeGuids](../../models/operations/includeguids.md) | :heavy_minus_sign: | Adds the Guids object to the response<br/> | 1 | | `IncludeGuids` | [*operations.IncludeGuids](../../models/operations/includeguids.md) | :heavy_minus_sign: | Adds the Guids object to the response<br/> | 1 |
| `Type` | [*operations.GetLibraryItemsQueryParamType](../../models/operations/getlibraryitemsqueryparamtype.md) | :heavy_minus_sign: | The type of media to retrieve.<br/>1 = movie<br/>2 = show<br/>3 = season<br/>4 = episode<br/>E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries<br/> | 2 | | `Type` | [operations.GetLibraryItemsQueryParamType](../../models/operations/getlibraryitemsqueryparamtype.md) | :heavy_check_mark: | The type of media to retrieve or filter by.<br/>1 = movie<br/>2 = show<br/>3 = season<br/>4 = episode<br/>E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries<br/> | 2 |
| `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 | | `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |
| `IncludeMeta` | [*operations.GetLibraryItemsQueryParamIncludeMeta](../../models/operations/getlibraryitemsqueryparamincludemeta.md) | :heavy_minus_sign: | Adds the Meta object to the response<br/> | 1 | | `IncludeMeta` | [*operations.GetLibraryItemsQueryParamIncludeMeta](../../models/operations/getlibraryitemsqueryparamincludemeta.md) | :heavy_minus_sign: | Adds the Meta object to the response<br/> | 1 |
| `XPlexContainerStart` | **int* | :heavy_minus_sign: | The index of the first item to return. If not specified, the first item will be returned.<br/>If the number of items exceeds the limit, the response will be paginated.<br/>By default this is 0<br/> | 0 | | `XPlexContainerStart` | **int* | :heavy_minus_sign: | The index of the first item to return. If not specified, the first item will be returned.<br/>If the number of items exceeds the limit, the response will be paginated.<br/>By default this is 0<br/> | 0 |

View File

@@ -1,20 +0,0 @@
# GetLibraryItemsShowOrdering
Setting that indicates the episode ordering for the show
None = Library default,
tmdbAiring = The Movie Database (Aired),
aired = TheTVDB (Aired),
dvd = TheTVDB (DVD),
absolute = TheTVDB (Absolute)).
## Values
| Name | Value |
| --------------------------------------- | --------------------------------------- |
| `GetLibraryItemsShowOrderingNone` | None |
| `GetLibraryItemsShowOrderingTmdbAiring` | tmdbAiring |
| `GetLibraryItemsShowOrderingAired` | aired |
| `GetLibraryItemsShowOrderingDvd` | dvd |
| `GetLibraryItemsShowOrderingAbsolute` | absolute |

View File

@@ -6,7 +6,8 @@
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `Key` | *string* | :heavy_check_mark: | N/A | /library/sections/2/all?type=2 | | `Key` | *string* | :heavy_check_mark: | N/A | /library/sections/2/all?type=2 |
| `Type` | *string* | :heavy_check_mark: | N/A | show | | `Type` | *string* | :heavy_check_mark: | N/A | filter |
| `Subtype` | **string* | :heavy_minus_sign: | N/A | clip |
| `Title` | *string* | :heavy_check_mark: | N/A | TV Shows | | `Title` | *string* | :heavy_check_mark: | N/A | TV Shows |
| `Active` | *bool* | :heavy_check_mark: | N/A | false | | `Active` | *bool* | :heavy_check_mark: | N/A | false |
| `Filter` | [][operations.GetLibraryItemsFilter](../../models/operations/getlibraryitemsfilter.md) | :heavy_minus_sign: | N/A | | | `Filter` | [][operations.GetLibraryItemsFilter](../../models/operations/getlibraryitemsfilter.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,10 @@
# GetMediaMetaDataCountry
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- |
| `ID` | *int* | :heavy_check_mark: | The unique country identifier. | 58591 |
| `Filter` | *string* | :heavy_check_mark: | The filter string for the country. | country=58591 |
| `Tag` | *string* | :heavy_check_mark: | The country name. | United States of America |

View File

@@ -0,0 +1,13 @@
# GetMediaMetaDataDirector
## Fields
| Field | Type | Required | Description | Example |
| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `ID` | *int64* | :heavy_check_mark: | The unique role identifier. | 109501 |
| `Filter` | *string* | :heavy_check_mark: | The filter string for the role. | actor=109501 |
| `Tag` | *string* | :heavy_check_mark: | The actor's name. | Bob Odenkirk |
| `TagKey` | *string* | :heavy_check_mark: | A key associated with the actor tag. | 5d77683254f42c001f8c3f69 |
| `Role` | **string* | :heavy_minus_sign: | The character name or role. | Jimmy McGill |
| `Thumb` | **string* | :heavy_minus_sign: | URL for the role thumbnail image. | https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg |

View File

@@ -0,0 +1,10 @@
# GetMediaMetaDataGenre
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- | -------------------------------- |
| `ID` | *int64* | :heavy_check_mark: | The unique genre identifier. | 1057 |
| `Filter` | *string* | :heavy_check_mark: | The filter string for the genre. | genre=1057 |
| `Tag` | *string* | :heavy_check_mark: | The genre name. | Crime |

View File

@@ -1,8 +1,8 @@
# GetOnDeckGuids # GetMediaMetaDataGuids
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| `ID` | **string* | :heavy_minus_sign: | N/A | imdb://tt13303712 | | `ID` | *string* | :heavy_check_mark: | The GUID value. | imdb://tt3032476 |

View File

@@ -0,0 +1,11 @@
# GetMediaMetaDataHasThumbnail
Indicates if the part has a thumbnail.
## Values
| Name | Value |
| ----------------------------------- | ----------------------------------- |
| `GetMediaMetaDataHasThumbnailFalse` | 0 |
| `GetMediaMetaDataHasThumbnailTrue` | 1 |

View File

@@ -0,0 +1,10 @@
# GetMediaMetaDataImage
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- |
| `Alt` | *string* | :heavy_check_mark: | Alternate text for the image. | Better Call Saul |
| `Type` | *string* | :heavy_check_mark: | The type of image (e.g., coverPoster, background, clearLogo). | coverPoster |
| `URL` | *string* | :heavy_check_mark: | The URL of the image. | /library/metadata/44288/thumb/1736487993 |

View File

@@ -0,0 +1,19 @@
# GetMediaMetaDataLibraryOptimizedForStreaming
Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true
## Supported Types
### GetMediaMetaDataOptimizedForStreamingLibrary1
```go
getMediaMetaDataLibraryOptimizedForStreaming := operations.CreateGetMediaMetaDataLibraryOptimizedForStreamingGetMediaMetaDataOptimizedForStreamingLibrary1(operations.GetMediaMetaDataOptimizedForStreamingLibrary1{/* values here */})
```
###
```go
getMediaMetaDataLibraryOptimizedForStreaming := operations.CreateGetMediaMetaDataLibraryOptimizedForStreamingBoolean(bool{/* values here */})
```

View File

@@ -0,0 +1,8 @@
# GetMediaMetaDataLocation
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- |
| `Path` | *string* | :heavy_check_mark: | The file path for the location. | /TV Shows/Better Call Saul |

View File

@@ -0,0 +1,26 @@
# GetMediaMetaDataMedia
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `ID` | *int64* | :heavy_check_mark: | Unique media identifier. | 387322 |
| `Duration` | **int* | :heavy_minus_sign: | Duration of the media in milliseconds. | 9610350 |
| `Bitrate` | **int* | :heavy_minus_sign: | Bitrate in bits per second. | 25512 |
| `Width` | **int* | :heavy_minus_sign: | Video width in pixels. | 3840 |
| `Height` | **int* | :heavy_minus_sign: | Video height in pixels. | 1602 |
| `AspectRatio` | **float32* | :heavy_minus_sign: | Aspect ratio of the video. | 2.35 |
| `AudioChannels` | **int* | :heavy_minus_sign: | Number of audio channels. | 6 |
| `DisplayOffset` | **int* | :heavy_minus_sign: | N/A | 50 |
| `AudioCodec` | **string* | :heavy_minus_sign: | Audio codec used. | eac3 |
| `VideoCodec` | **string* | :heavy_minus_sign: | Video codec used. | hevc |
| `VideoResolution` | **string* | :heavy_minus_sign: | Video resolution (e.g., 4k). | 4k |
| `Container` | **string* | :heavy_minus_sign: | File container type. | mkv |
| `VideoFrameRate` | **string* | :heavy_minus_sign: | Frame rate of the video. Values found include NTSC, PAL, 24p<br/> | 24p |
| `VideoProfile` | **string* | :heavy_minus_sign: | Video profile (e.g., main 10). | main 10 |
| `HasVoiceActivity` | **bool* | :heavy_minus_sign: | Indicates whether voice activity is detected. | false |
| `AudioProfile` | **string* | :heavy_minus_sign: | The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). | dts |
| `OptimizedForStreaming` | [*operations.GetMediaMetaDataOptimizedForStreaming](../../models/operations/getmediametadataoptimizedforstreaming.md) | :heavy_minus_sign: | Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true | |
| `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false |
| `Part` | [][operations.GetMediaMetaDataPart](../../models/operations/getmediametadatapart.md) | :heavy_minus_sign: | An array of parts for this media item. | |

View File

@@ -0,0 +1,16 @@
# GetMediaMetaDataMediaContainer
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| `Size` | *int* | :heavy_check_mark: | Number of media items returned in this response. | 50 |
| `AllowSync` | *bool* | :heavy_check_mark: | Indicates whether syncing is allowed. | false |
| `Identifier` | *string* | :heavy_check_mark: | An plugin identifier for the media container. | com.plexapp.plugins.library |
| `LibrarySectionID` | *int64* | :heavy_check_mark: | The unique identifier for the library section. | 2 |
| `LibrarySectionTitle` | *string* | :heavy_check_mark: | The title of the library section. | TV Series |
| `LibrarySectionUUID` | **string* | :heavy_minus_sign: | The universally unique identifier for the library section. | e69655a2-ef48-4aba-bb19-0cc34d1e7d36 |
| `MediaTagPrefix` | *string* | :heavy_check_mark: | The prefix used for media tag resource paths. | /system/bundle/media/flags/ |
| `MediaTagVersion` | *int64* | :heavy_check_mark: | The version number for media tags. | 1734362201 |
| `Metadata` | [][operations.GetMediaMetaDataMetadata](../../models/operations/getmediametadatametadata.md) | :heavy_check_mark: | An array of metadata items. | |

View File

@@ -0,0 +1,68 @@
# GetMediaMetaDataMetadata
## Fields
| Field | Type | Required | Description | Example |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `RatingKey` | *string* | :heavy_check_mark: | The rating key of the metadata item. | 44288 |
| `ParentRatingKey` | **string* | :heavy_minus_sign: | The rating key of the parent of this metadata item. | 48047 |
| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The rating key of the grandparent of this metadata item. | 45520 |
| `ParentGUID` | **string* | :heavy_minus_sign: | A GUID identifying the parent entity (e.g., season) for the item. | plex://season/618b89208dde18df707ad15c |
| `GrandparentGUID` | **string* | :heavy_minus_sign: | A GUID identifying the grandparent entity (e.g., show). | plex://show/5e16253691c20300412003a8 |
| `GrandparentSlug` | **string* | :heavy_minus_sign: | A URL-friendly identifier (slug) for the grandparent entity. | alice-in-borderland-2020 |
| `GrandparentKey` | **string* | :heavy_minus_sign: | A key identifying the grandparent metadata in the library. | /library/metadata/45520 |
| `ParentKey` | **string* | :heavy_minus_sign: | A key identifying the parent metadata in the library. | /library/metadata/48047 |
| `Key` | *string* | :heavy_check_mark: | The API key to access metadata details. | /library/metadata/44288/children |
| `GUID` | *string* | :heavy_check_mark: | The globally unique identifier for the item. | plex://show/5d9c08254eefaa001f5d6dcb |
| `Slug` | **string* | :heavy_minus_sign: | A URL-friendly identifier for the item. | better-call-saul |
| `Studio` | **string* | :heavy_minus_sign: | The studio that produced the content. | Sony Pictures Television |
| `Type` | *string* | :heavy_check_mark: | The type of content (e.g., show, movie). | show |
| `Title` | *string* | :heavy_check_mark: | The title of the content. | Better Call Saul |
| `OriginalTitle` | **string* | :heavy_minus_sign: | The original title of the content. | Wicked: Part I |
| `LibrarySectionTitle` | *string* | :heavy_check_mark: | The title of the library section. | TV Series |
| `LibrarySectionID` | *int64* | :heavy_check_mark: | The ID of the library section. | 2 |
| `LibrarySectionKey` | *string* | :heavy_check_mark: | The key of the library section. | /library/sections/2 |
| `ContentRating` | **string* | :heavy_minus_sign: | The content rating (e.g., TV-MA). | TV-MA |
| `Summary` | *string* | :heavy_check_mark: | A summary of the content. | Before Saul Goodman, he was Jimmy McGill. And if you're calling Jimmy, you're in real trouble. The prequel to "Breaking Bad" follows small-time attorney, Jimmy McGill, as he transforms into Walter White's morally challenged lawyer, Saul Goodman. |
| `Index` | **int64* | :heavy_minus_sign: | The index or order of the item. | 1 |
| `GrandparentTitle` | **string* | :heavy_minus_sign: | The title of the grandparent entity (typically the show's title). | Alice in Borderland |
| `ParentTitle` | **string* | :heavy_minus_sign: | The title of the parent entity (typically the season's title). | Season 2 |
| `AudienceRating` | **float32* | :heavy_minus_sign: | The audience rating for the content. | 8.7 |
| `ViewCount` | **int64* | :heavy_minus_sign: | The number of times the item has been viewed. | 4 |
| `SkipCount` | **int64* | :heavy_minus_sign: | The number of times the item has been skipped. | 1 |
| `LastViewedAt` | **int64* | :heavy_minus_sign: | Unix timestamp of when the item was last viewed. | 1625764795 |
| `Year` | *int* | :heavy_check_mark: | The release year. | 2015 |
| `Rating` | **float32* | :heavy_minus_sign: | The general rating | 6 |
| `RatingImage` | **string* | :heavy_minus_sign: | The URL or identifier for the rating image (e.g., Rotten Tomatoes rating image). | rottentomatoes://image.rating.ripe |
| `Tagline` | **string* | :heavy_minus_sign: | The tagline of the content. | Make the call |
| `ChapterSource` | **string* | :heavy_minus_sign: | N/A | media |
| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/134704 |
| `Thumb` | *string* | :heavy_check_mark: | URL of the thumbnail image. | /library/metadata/44288/thumb/1736487993 |
| `Art` | *string* | :heavy_check_mark: | URL of the art image. | /library/metadata/44288/art/1736487993 |
| `Theme` | **string* | :heavy_minus_sign: | URL of the theme image. | /library/metadata/44288/theme/1736487993 |
| `Duration` | *int* | :heavy_check_mark: | Duration of the content in milliseconds. | 2700000 |
| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | The original release date. | 2015-02-08 |
| `LeafCount` | **int64* | :heavy_minus_sign: | The total number of episodes (or leaves). | 63 |
| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | The number of episodes that have been viewed. | 4 |
| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items. | 6 |
| `AddedAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `UpdatedAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `AudienceRatingImage` | **string* | :heavy_minus_sign: | The URL for the audience rating image. | themoviedb://image.rating |
| `ParentIndex` | **int64* | :heavy_minus_sign: | The index number of the parent entity, which could indicate its order or position. | 2 |
| `ParentThumb` | **string* | :heavy_minus_sign: | The URL of the parent's thumbnail image. | /library/metadata/48047/thumb/1671800243 |
| `GrandparentThumb` | **string* | :heavy_minus_sign: | The URL of the grandparent's thumbnail image. | /library/metadata/45520/thumb/1736488003 |
| `GrandparentArt` | **string* | :heavy_minus_sign: | The URL of the grandparent's art image. | /library/metadata/45520/art/1736488003 |
| `Media` | [][operations.GetMediaMetaDataMedia](../../models/operations/getmediametadatamedia.md) | :heavy_minus_sign: | N/A | |
| `Image` | [][operations.GetMediaMetaDataImage](../../models/operations/getmediametadataimage.md) | :heavy_check_mark: | An array of image objects. | |
| `UltraBlurColors` | [operations.GetMediaMetaDataUltraBlurColors](../../models/operations/getmediametadataultrablurcolors.md) | :heavy_check_mark: | N/A | |
| `Genre` | [][operations.GetMediaMetaDataGenre](../../models/operations/getmediametadatagenre.md) | :heavy_minus_sign: | An array of genre tags. | |
| `Country` | [][operations.GetMediaMetaDataCountry](../../models/operations/getmediametadatacountry.md) | :heavy_minus_sign: | An array of country tags. | |
| `Guids` | [][operations.GetMediaMetaDataGuids](../../models/operations/getmediametadataguids.md) | :heavy_minus_sign: | An array of GUID objects. | |
| `Ratings` | [][operations.Ratings](../../models/operations/ratings.md) | :heavy_minus_sign: | An array of rating objects. | |
| `Role` | [][operations.GetMediaMetaDataRole](../../models/operations/getmediametadatarole.md) | :heavy_minus_sign: | An array of Actor roles. | |
| `Director` | [][operations.GetMediaMetaDataDirector](../../models/operations/getmediametadatadirector.md) | :heavy_minus_sign: | An array of Director roles. | |
| `Writer` | [][operations.GetMediaMetaDataWriter](../../models/operations/getmediametadatawriter.md) | :heavy_minus_sign: | An array of Writer roles. | |
| `Producer` | [][operations.GetMediaMetaDataProducer](../../models/operations/getmediametadataproducer.md) | :heavy_minus_sign: | An array of Writer roles. | |
| `Similar` | [][operations.GetMediaMetaDataSimilar](../../models/operations/getmediametadatasimilar.md) | :heavy_minus_sign: | An array of similar content objects. | |
| `Location` | [][operations.GetMediaMetaDataLocation](../../models/operations/getmediametadatalocation.md) | :heavy_minus_sign: | An array of location objects. | |

View File

@@ -0,0 +1,19 @@
# GetMediaMetaDataOptimizedForStreaming
Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true
## Supported Types
### GetMediaMetaDataOptimizedForStreaming1
```go
getMediaMetaDataOptimizedForStreaming := operations.CreateGetMediaMetaDataOptimizedForStreamingGetMediaMetaDataOptimizedForStreaming1(operations.GetMediaMetaDataOptimizedForStreaming1{/* values here */})
```
###
```go
getMediaMetaDataOptimizedForStreaming := operations.CreateGetMediaMetaDataOptimizedForStreamingBoolean(bool{/* values here */})
```

Some files were not shown because too many files have changed in this diff Show More