Compare commits

...

6 Commits

Author SHA1 Message Date
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
108 changed files with 4681 additions and 7201 deletions

1
.gitignore vendored
View File

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

File diff suppressed because one or more lines are too long

View File

@@ -11,11 +11,13 @@ generation:
requestResponseComponentNamesFeb2024: true
auth:
oAuth2ClientCredentialsEnabled: true
oAuth2PasswordEnabled: false
go:
version: 0.15.0
version: 0.17.2
additionalDependencies: {}
allowUnknownFieldsInWeakUnions: false
clientServerStatusCodesAsErrors: true
defaultErrorName: SDKError
flattenGlobalSecurity: true
imports:
option: openapi

View File

@@ -1,4 +1,4 @@
speakeasyVersion: 1.406.0
speakeasyVersion: 1.476.0
sources:
my-source:
sourceNamespace: my-source
@@ -9,19 +9,19 @@ sources:
- main
plexapi:
sourceNamespace: plexapi
sourceRevisionDigest: sha256:c6ab8f13847c7cdc4ab3752f517164d7da08266726255aa0d614b1eaea66fb0e
sourceBlobDigest: sha256:64c7694915a0828aeb256d10d2fa0ea477681785b818916b6681be8cc5ffb93b
sourceRevisionDigest: sha256:b146684d2d813daa8ba29e432a12334838753d0b20183beca8178a74ec4d895a
sourceBlobDigest: sha256:58f51c4319fcda931d63950fd926e8650e20a2e1375e356bf3a930111e246a58
tags:
- latest
- main
- speakeasy-sdk-regen-1737763744
targets:
plexgo:
source: plexapi
sourceNamespace: plexapi
sourceRevisionDigest: sha256:c6ab8f13847c7cdc4ab3752f517164d7da08266726255aa0d614b1eaea66fb0e
sourceBlobDigest: sha256:64c7694915a0828aeb256d10d2fa0ea477681785b818916b6681be8cc5ffb93b
sourceRevisionDigest: sha256:b146684d2d813daa8ba29e432a12334838753d0b20183beca8178a74ec4d895a
sourceBlobDigest: sha256:58f51c4319fcda931d63950fd926e8650e20a2e1375e356bf3a930111e246a58
codeSamplesNamespace: code-samples-go-plexgo
codeSamplesRevisionDigest: sha256:9ae03dbe12a6438ac7667de48bf864bbeb4b470bd87b38555484879a998889ba
codeSamplesRevisionDigest: sha256:a9b4a5597cc8dc7e97e7ce3e68de850538878f6a879c0b400ae0d4757f7f8743
workflow:
workflowVersion: 1.0.0
speakeasyVersion: latest

154
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] -->
## 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] -->
<!-- Start SDK Installation [installation] -->
@@ -76,16 +84,12 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
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)
if err != nil {
log.Fatal(err)
@@ -250,16 +254,12 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
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(
retry.Config{
Strategy: "backoff",
@@ -293,6 +293,8 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
plexgo.WithRetryConfig(
retry.Config{
@@ -306,14 +308,8 @@ func main() {
RetryConnectionErrors: false,
}),
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)
if err != nil {
log.Fatal(err)
@@ -335,11 +331,11 @@ By Default, an API error will return `sdkerrors.SDKError`. When custom error res
For example, the `GetServerCapabilities` function may return the following errors:
| Error Type | Status Code | Content Type |
| ------------------------------------------- | ------------------------------------------- | ------------------------------------------- |
| sdkerrors.GetServerCapabilitiesBadRequest | 400 | application/json |
| sdkerrors.GetServerCapabilitiesUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4XX, 5XX | \*/\* |
| Error Type | Status Code | Content Type |
| ------------------------------------------- | ----------- | ---------------- |
| sdkerrors.GetServerCapabilitiesBadRequest | 400 | application/json |
| sdkerrors.GetServerCapabilitiesUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4XX, 5XX | \*/\* |
### Example
@@ -355,16 +351,12 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
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)
if err != nil {
@@ -394,58 +386,16 @@ func main() {
<!-- Start Server Selection [server] -->
## 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:
| # | Server | Variables |
| - | ------ | --------- |
| 0 | `{protocol}://{ip}:{port}` | `protocol` (default is `https`), `ip` (default is `10.10.10.47`), `port` (default is `32400`) |
#### Example
```go
package main
import (
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
s := plexgo.New(
plexgo.WithServerIndex(0),
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)
if err != nil {
log.Fatal(err)
}
if res.Object != nil {
// handle response
}
}
```
#### 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`
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:
* `WithProtocol(protocol ServerProtocol)`
* `WithIP(ip string)`
* `WithPort(port string)`
### 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 also be overridden globally using the `WithServerURL(serverURL string)` option when initializing the SDK client instance. For example:
```go
package main
@@ -456,17 +406,13 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
plexgo.WithServerURL("{protocol}://{ip}:{port}"),
plexgo.WithServerURL("https://10.10.10.47:32400"),
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)
if err != nil {
log.Fatal(err)
@@ -492,16 +438,12 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
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"))
if err != nil {
log.Fatal(err)
@@ -550,9 +492,9 @@ This can be a convenient way to configure timeouts, cookies, proxies, custom hea
This SDK supports the following security scheme globally:
| Name | Type | Scheme |
| ------------- | ------------- | ------------- |
| `AccessToken` | apiKey | API key |
| Name | Type | Scheme |
| ------------- | ------ | ------- |
| `AccessToken` | apiKey | API key |
You can configure it using the `WithSecurity` option when initializing the SDK client instance. For example:
```go
@@ -565,16 +507,12 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
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)
if err != nil {
log.Fatal(err)

View File

@@ -942,4 +942,64 @@ Based on:
### Generated
- [go v0.15.0] .
### 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 - .

View File

@@ -9,16 +9,12 @@ import (
)
func main() {
ctx := context.Background()
s := plexgo.New(
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)
if err != nil {
log.Fatal(err)

View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http"
"net/url"
)
@@ -56,7 +54,12 @@ 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")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -84,21 +87,15 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -107,7 +104,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -120,7 +121,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -181,21 +186,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
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 {
case httpRes.StatusCode == 200:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -207,17 +202,16 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
res.Object = &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -230,17 +224,16 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -253,28 +246,29 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -308,7 +302,12 @@ 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)
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -336,21 +335,15 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -359,7 +352,11 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -372,7 +369,11 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -433,22 +434,12 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -461,17 +452,16 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -484,28 +474,29 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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/sdkerrors"
"github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http"
"net/url"
)
@@ -55,7 +53,12 @@ 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")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -87,21 +90,15 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -110,7 +107,11 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -123,7 +124,11 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -184,22 +189,12 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -212,17 +207,16 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -235,28 +229,29 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -291,7 +286,12 @@ 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")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -323,21 +323,15 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -346,7 +340,11 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -359,7 +357,11 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -420,22 +422,12 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -448,17 +440,16 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -471,28 +462,29 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -512,7 +504,6 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
o := operations.Options{}
supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries,
operations.SupportedOptionTimeout,
}
@@ -555,21 +546,15 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -578,7 +563,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -591,7 +580,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -652,21 +645,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
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 {
case httpRes.StatusCode == 200:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -678,17 +661,16 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
res.UserPlexAccount = &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -701,17 +683,16 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -724,28 +705,29 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -763,17 +745,8 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
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{}
supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries,
operations.SupportedOptionTimeout,
}
@@ -816,25 +789,21 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
}
req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent)
req.Header.Set("Content-Type", reqContentType)
if 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
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -843,7 +812,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -856,7 +829,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -917,21 +894,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
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 {
case httpRes.StatusCode == 201:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -943,17 +910,16 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
res.UserPlexAccount = &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -966,17 +932,16 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -989,28 +954,29 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}

342
butler.go
View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http"
"net/url"
)
@@ -50,7 +48,12 @@ 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")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -78,21 +81,15 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -101,7 +98,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -114,7 +115,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -175,21 +180,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
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 {
case httpRes.StatusCode == 200:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -201,17 +196,16 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
res.Object = &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -224,17 +218,16 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -247,28 +240,29 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -302,7 +296,12 @@ 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")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -330,21 +329,15 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -353,7 +346,11 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -366,7 +363,11 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -427,22 +428,12 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -455,17 +446,16 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -478,28 +468,29 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -529,7 +520,12 @@ 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")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -557,21 +553,15 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -580,7 +570,11 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -593,7 +587,11 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -654,22 +652,12 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -682,17 +670,16 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -705,28 +692,29 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -764,7 +752,12 @@ 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)
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -792,21 +785,15 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -815,7 +802,11 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -828,7 +819,11 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -889,16 +884,6 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
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 {
case httpRes.StatusCode == 200:
fallthrough
@@ -906,7 +891,7 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -919,17 +904,16 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -942,28 +926,29 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -997,7 +982,12 @@ 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)
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -1025,21 +1015,15 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -1048,7 +1032,11 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -1061,7 +1049,11 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -1122,22 +1114,12 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -1150,17 +1132,16 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -1173,30 +1154,31 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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 @@
# 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
Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
## Values
| Name | Value |
| --------------------- | --------------------- |
| `FlattenSeasonsFalse` | 0 |
| `FlattenSeasonsTrue` | 1 |
| Name | Value |
| ------------------------------ | ------------------------------ |
| `FlattenSeasonsLibraryDefault` | -1 |
| `FlattenSeasonsHide` | 0 |
| `FlattenSeasonsShow` | 1 |

View File

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

View File

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

View File

@@ -1,9 +1,12 @@
# GetLibraryItemsFlattenSeasons
Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
## Values
| Name | Value |
| ------------------------------------ | ------------------------------------ |
| `GetLibraryItemsFlattenSeasonsFalse` | 0 |
| `GetLibraryItemsFlattenSeasonsTrue` | 1 |
| Name | Value |
| --------------------------------------------- | --------------------------------------------- |
| `GetLibraryItemsFlattenSeasonsLibraryDefault` | -1 |
| `GetLibraryItemsFlattenSeasonsHide` | 0 |
| `GetLibraryItemsFlattenSeasonsShow` | 1 |

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 |
| `ViewMode` | **int* | :heavy_minus_sign: | N/A | 65592 |
| `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/> | |

View File

@@ -23,8 +23,10 @@
| `Year` | **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. |
| `FlattenSeasons` | [*operations.GetLibraryItemsFlattenSeasons](../../models/operations/getlibraryitemsflattenseasons.md) | :heavy_minus_sign: | N/A | 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 |
| `FlattenSeasons` | [*operations.GetLibraryItemsFlattenSeasons](../../models/operations/getlibraryitemsflattenseasons.md) | :heavy_minus_sign: | Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). | 1 |
| `EpisodeSort` | [*operations.GetLibraryItemsEpisodeSort](../../models/operations/getlibraryitemsepisodesort.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.GetLibraryItemsEnableCreditsMarkerGeneration](../../models/operations/getlibraryitemsenablecreditsmarkergeneration.md) | :heavy_minus_sign: | Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). | -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/>tvdbAiring = TheTVDB (Aired),<br/>tvdbDvd = TheTVDB (DVD),<br/>tvdbAbsolute = TheTVDB (Absolute)).<br/> | tvdbDvd |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/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 |

View File

@@ -16,4 +16,7 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `GetLibraryItemsQueryParamTypeMovie` | 1 |
| `GetLibraryItemsQueryParamTypeTvShow` | 2 |
| `GetLibraryItemsQueryParamTypeSeason` | 3 |
| `GetLibraryItemsQueryParamTypeEpisode` | 4 |
| `GetLibraryItemsQueryParamTypeEpisode` | 4 |
| `GetLibraryItemsQueryParamTypeAudio` | 8 |
| `GetLibraryItemsQueryParamTypeAlbum` | 9 |
| `GetLibraryItemsQueryParamTypeTrack` | 10 |

View File

@@ -1,20 +1,20 @@
# 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)).
Setting that indicates the episode ordering for the show
None = Library default,
tmdbAiring = The Movie Database (Aired),
tvdbAiring = TheTVDB (Aired),
tvdbDvd = TheTVDB (DVD),
tvdbAbsolute = TheTVDB (Absolute)).
## Values
| Name | Value |
| --------------------------------------- | --------------------------------------- |
| `GetLibraryItemsShowOrderingNone` | None |
| `GetLibraryItemsShowOrderingTmdbAiring` | tmdbAiring |
| `GetLibraryItemsShowOrderingAired` | aired |
| `GetLibraryItemsShowOrderingDvd` | dvd |
| `GetLibraryItemsShowOrderingAbsolute` | absolute |
| Name | Value |
| ----------------------------------------- | ----------------------------------------- |
| `GetLibraryItemsShowOrderingNone` | None |
| `GetLibraryItemsShowOrderingTmdbAiring` | tmdbAiring |
| `GetLibraryItemsShowOrderingTvdbAiring` | tvdbAiring |
| `GetLibraryItemsShowOrderingTvdbDvd` | tvdbDvd |
| `GetLibraryItemsShowOrderingTvdbAbsolute` | tvdbAbsolute |

View File

@@ -14,6 +14,11 @@
| `LibrarySectionTitle` | **string* | :heavy_minus_sign: | N/A | Movies |
| `LibrarySectionID` | **int* | :heavy_minus_sign: | N/A | 1 |
| `LibrarySectionKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/1 |
| `GrandparentTitle` | **string* | :heavy_minus_sign: | The name of the album artist for the track when audio, and the name of the TV show for the episode when video. | |
| `ParentTitle` | **string* | :heavy_minus_sign: | The name of the album for the track when audio, and the name of the season for the episode when TV show. | |
| `OriginalTitle` | **string* | :heavy_minus_sign: | The orginal untranslated name of the media item when non-english. | |
| `Index` | **int64* | :heavy_minus_sign: | The index starting from 0 of this media item in the MetaData array. | |
| `ParentIndex` | **int64* | :heavy_minus_sign: | The parent index starting from 0 of this media item in the parent MetaData array. | |
| `ContentRating` | **string* | :heavy_minus_sign: | N/A | PG-13 |
| `Summary` | **string* | :heavy_minus_sign: | N/A | Serenity continues the story of the TV series it was based upon ("Firefly"). River Tam had a secret - one in which she's not even aware - so dangerous, no one's safe, as an Alliance operative's sent to capture her, and all others are considered irrelevant to his job. |
| `Rating` | **float64* | :heavy_minus_sign: | N/A | 8.2 |

View File

@@ -1,12 +0,0 @@
# GetPinGlobals
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientName` | **string* | :heavy_minus_sign: | The name of the client application. (Plex Web, Plex Media Server, etc.) | Plex for Roku |
| `DeviceNickname` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 |
| `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |
| `Platform` | **string* | :heavy_minus_sign: | The platform of the client application. | Roku |

View File

@@ -6,7 +6,7 @@
| Field | Type | Required | Description | Example |
| ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Strong` | **bool* | :heavy_minus_sign: | Determines the kind of code returned by the API call<br/>Strong codes are used for Pin authentication flows<br/>Non-Strong codes are used for `Plex.tv/link`<br/> | |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientID` | *string* | :heavy_check_mark: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientName` | **string* | :heavy_minus_sign: | The name of the client application. (Plex Web, Plex Media Server, etc.) | Plex for Roku |
| `DeviceNickname` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 |
| `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |

View File

@@ -16,4 +16,7 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `GetPlaylistContentsQueryParamTypeMovie` | 1 |
| `GetPlaylistContentsQueryParamTypeTvShow` | 2 |
| `GetPlaylistContentsQueryParamTypeSeason` | 3 |
| `GetPlaylistContentsQueryParamTypeEpisode` | 4 |
| `GetPlaylistContentsQueryParamTypeEpisode` | 4 |
| `GetPlaylistContentsQueryParamTypeAudio` | 8 |
| `GetPlaylistContentsQueryParamTypeAlbum` | 9 |
| `GetPlaylistContentsQueryParamTypeTrack` | 10 |

View File

@@ -23,8 +23,10 @@
| `Year` | **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. |
| `FlattenSeasons` | [*operations.FlattenSeasons](../../models/operations/flattenseasons.md) | :heavy_minus_sign: | N/A | 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/> | dvd |
| `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 |
| `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/>tvdbAiring = TheTVDB (Aired),<br/>tvdbDvd = TheTVDB (DVD),<br/>tvdbAbsolute = TheTVDB (Absolute)).<br/> | tvdbDvd |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/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 |

View File

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

View File

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

View File

@@ -1,9 +1,12 @@
# GetSearchAllLibrariesFlattenSeasons
Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
## Values
| Name | Value |
| ------------------------------------------ | ------------------------------------------ |
| `GetSearchAllLibrariesFlattenSeasonsFalse` | 0 |
| `GetSearchAllLibrariesFlattenSeasonsTrue` | 1 |
| Name | Value |
| --------------------------------------------------- | --------------------------------------------------- |
| `GetSearchAllLibrariesFlattenSeasonsLibraryDefault` | -1 |
| `GetSearchAllLibrariesFlattenSeasonsHide` | 0 |
| `GetSearchAllLibrariesFlattenSeasonsShow` | 1 |

View File

@@ -1,8 +0,0 @@
# GetSearchAllLibrariesGlobals
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |

View File

@@ -23,8 +23,10 @@
| `Year` | **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. |
| `FlattenSeasons` | [*operations.GetSearchAllLibrariesFlattenSeasons](../../models/operations/getsearchalllibrariesflattenseasons.md) | :heavy_minus_sign: | N/A | 1 |
| `ShowOrdering` | [*operations.GetSearchAllLibrariesShowOrdering](../../models/operations/getsearchalllibrariesshowordering.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 |
| `FlattenSeasons` | [*operations.GetSearchAllLibrariesFlattenSeasons](../../models/operations/getsearchalllibrariesflattenseasons.md) | :heavy_minus_sign: | Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). | 1 |
| `EpisodeSort` | [*operations.GetSearchAllLibrariesEpisodeSort](../../models/operations/getsearchalllibrariesepisodesort.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.GetSearchAllLibrariesEnableCreditsMarkerGeneration](../../models/operations/getsearchalllibrariesenablecreditsmarkergeneration.md) | :heavy_minus_sign: | Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). | -1 |
| `ShowOrdering` | [*operations.GetSearchAllLibrariesShowOrdering](../../models/operations/getsearchalllibrariesshowordering.md) | :heavy_minus_sign: | Setting that indicates the episode ordering for the show<br/>None = Library default,<br/>tmdbAiring = The Movie Database (Aired),<br/>tvdbAiring = TheTVDB (Aired),<br/>tvdbDvd = TheTVDB (DVD),<br/>tvdbAbsolute = TheTVDB (Absolute)).<br/> | tvdbDvd |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/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 |

View File

@@ -6,7 +6,7 @@
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `Query` | *string* | :heavy_check_mark: | The search query term. | |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientID` | *string* | :heavy_check_mark: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `Limit` | **int64* | :heavy_minus_sign: | Limit the number of results returned. | |
| `SearchTypes` | [][operations.SearchTypes](../../models/operations/searchtypes.md) | :heavy_minus_sign: | A comma-separated list of search types to include. Valid values are: movies, music, otherVideos, people, tv.<br/> | movies,music,otherVideos,people,tv |
| `IncludeCollections` | [*operations.QueryParamIncludeCollections](../../models/operations/queryparamincludecollections.md) | :heavy_minus_sign: | Whether to include collections in the search results. | 1 |

View File

@@ -1,20 +1,20 @@
# GetSearchAllLibrariesShowOrdering
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)).
Setting that indicates the episode ordering for the show
None = Library default,
tmdbAiring = The Movie Database (Aired),
tvdbAiring = TheTVDB (Aired),
tvdbDvd = TheTVDB (DVD),
tvdbAbsolute = TheTVDB (Absolute)).
## Values
| Name | Value |
| --------------------------------------------- | --------------------------------------------- |
| `GetSearchAllLibrariesShowOrderingNone` | None |
| `GetSearchAllLibrariesShowOrderingTmdbAiring` | tmdbAiring |
| `GetSearchAllLibrariesShowOrderingAired` | aired |
| `GetSearchAllLibrariesShowOrderingDvd` | dvd |
| `GetSearchAllLibrariesShowOrderingAbsolute` | absolute |
| Name | Value |
| ----------------------------------------------- | ----------------------------------------------- |
| `GetSearchAllLibrariesShowOrderingNone` | None |
| `GetSearchAllLibrariesShowOrderingTmdbAiring` | tmdbAiring |
| `GetSearchAllLibrariesShowOrderingTvdbAiring` | tvdbAiring |
| `GetSearchAllLibrariesShowOrderingTvdbDvd` | tvdbDvd |
| `GetSearchAllLibrariesShowOrderingTvdbAbsolute` | tvdbAbsolute |

View File

@@ -16,4 +16,7 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `GetSearchLibraryQueryParamTypeMovie` | 1 |
| `GetSearchLibraryQueryParamTypeTvShow` | 2 |
| `GetSearchLibraryQueryParamTypeSeason` | 3 |
| `GetSearchLibraryQueryParamTypeEpisode` | 4 |
| `GetSearchLibraryQueryParamTypeEpisode` | 4 |
| `GetSearchLibraryQueryParamTypeAudio` | 8 |
| `GetSearchLibraryQueryParamTypeAlbum` | 9 |
| `GetSearchLibraryQueryParamTypeTrack` | 10 |

View File

@@ -1,8 +0,0 @@
# GetServerResourcesGlobals
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |

View File

@@ -8,4 +8,4 @@
| `IncludeHTTPS` | [*operations.IncludeHTTPS](../../models/operations/includehttps.md) | :heavy_minus_sign: | Include Https entries in the results | 1 |
| `IncludeRelay` | [*operations.IncludeRelay](../../models/operations/includerelay.md) | :heavy_minus_sign: | Include Relay addresses in the results <br/>E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400<br/> | 1 |
| `IncludeIPv6` | [*operations.IncludeIPv6](../../models/operations/includeipv6.md) | :heavy_minus_sign: | Include IPv6 entries in the results | 1 |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientID` | *string* | :heavy_check_mark: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |

View File

@@ -3,42 +3,43 @@
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| `AddedAt` | **int* | :heavy_minus_sign: | N/A | 1705543312 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 |
| `Duration` | **int* | :heavy_minus_sign: | N/A | 186240 |
| `GrandparentArt` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 |
| `GrandparentGUID` | **string* | :heavy_minus_sign: | N/A | plex://artist/5d07bbfd403c6402904a6480 |
| `GrandparentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904 |
| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | N/A | 39904 |
| `GrandparentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/thumb/1705310687 |
| `GrandparentTitle` | **string* | :heavy_minus_sign: | N/A | Green Day |
| `GUID` | **string* | :heavy_minus_sign: | N/A | plex://track/6535834f71f22f36f71a8e8f |
| `Index` | **int* | :heavy_minus_sign: | N/A | 1 |
| `Key` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67085 |
| `LibrarySectionID` | **string* | :heavy_minus_sign: | N/A | 3 |
| `LibrarySectionKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/3 |
| `LibrarySectionTitle` | **string* | :heavy_minus_sign: | N/A | Music |
| `MusicAnalysisVersion` | **string* | :heavy_minus_sign: | N/A | 1 |
| `ParentGUID` | **string* | :heavy_minus_sign: | N/A | plex://album/65394d6d472b8ab03ef47f12 |
| `ParentIndex` | **int* | :heavy_minus_sign: | N/A | 1 |
| `ParentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084 |
| `ParentRatingKey` | **string* | :heavy_minus_sign: | N/A | 67084 |
| `ParentStudio` | **string* | :heavy_minus_sign: | N/A | Reprise Records |
| `ParentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 |
| `ParentTitle` | **string* | :heavy_minus_sign: | N/A | Saviors |
| `ParentYear` | **int* | :heavy_minus_sign: | N/A | 2024 |
| `RatingCount` | **int* | :heavy_minus_sign: | N/A | 45885 |
| `RatingKey` | **string* | :heavy_minus_sign: | N/A | 67085 |
| `SessionKey` | **string* | :heavy_minus_sign: | N/A | 203 |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 |
| `Title` | **string* | :heavy_minus_sign: | N/A | The American Dream Is Killing Me |
| `TitleSort` | **string* | :heavy_minus_sign: | N/A | American Dream Is Killing Me |
| `Type` | **string* | :heavy_minus_sign: | N/A | track |
| `UpdatedAt` | **int* | :heavy_minus_sign: | N/A | 1705543314 |
| `ViewOffset` | **int* | :heavy_minus_sign: | N/A | 1000 |
| `Media` | [][operations.GetSessionsMedia](../../models/operations/getsessionsmedia.md) | :heavy_minus_sign: | N/A | |
| `User` | [*operations.GetSessionsUser](../../models/operations/getsessionsuser.md) | :heavy_minus_sign: | N/A | |
| `Player` | [*operations.Player](../../models/operations/player.md) | :heavy_minus_sign: | N/A | |
| `Session` | [*operations.Session](../../models/operations/session.md) | :heavy_minus_sign: | N/A | |
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `AddedAt` | **int* | :heavy_minus_sign: | N/A | 1705543312 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 |
| `Duration` | **int* | :heavy_minus_sign: | N/A | 186240 |
| `GrandparentArt` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 |
| `GrandparentGUID` | **string* | :heavy_minus_sign: | N/A | plex://artist/5d07bbfd403c6402904a6480 |
| `GrandparentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904 |
| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | N/A | 39904 |
| `GrandparentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/thumb/1705310687 |
| `GrandparentTitle` | **string* | :heavy_minus_sign: | N/A | Green Day |
| `GUID` | **string* | :heavy_minus_sign: | N/A | plex://track/6535834f71f22f36f71a8e8f |
| `Index` | **int* | :heavy_minus_sign: | N/A | 1 |
| `Key` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67085 |
| `LibrarySectionID` | **string* | :heavy_minus_sign: | N/A | 3 |
| `LibrarySectionKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/3 |
| `LibrarySectionTitle` | **string* | :heavy_minus_sign: | N/A | Music |
| `MusicAnalysisVersion` | **string* | :heavy_minus_sign: | N/A | 1 |
| `OriginalTitle` | **string* | :heavy_minus_sign: | The original untranslated name of the media item when non-english, or the track artist if an audio Item has an album artist | The American Dream Is Killing Me |
| `ParentGUID` | **string* | :heavy_minus_sign: | N/A | plex://album/65394d6d472b8ab03ef47f12 |
| `ParentIndex` | **int* | :heavy_minus_sign: | N/A | 1 |
| `ParentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084 |
| `ParentRatingKey` | **string* | :heavy_minus_sign: | N/A | 67084 |
| `ParentStudio` | **string* | :heavy_minus_sign: | N/A | Reprise Records |
| `ParentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 |
| `ParentTitle` | **string* | :heavy_minus_sign: | N/A | Saviors |
| `ParentYear` | **int* | :heavy_minus_sign: | N/A | 2024 |
| `RatingCount` | **int* | :heavy_minus_sign: | N/A | 45885 |
| `RatingKey` | **string* | :heavy_minus_sign: | N/A | 67085 |
| `SessionKey` | **string* | :heavy_minus_sign: | N/A | 203 |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 |
| `Title` | **string* | :heavy_minus_sign: | N/A | The American Dream Is Killing Me |
| `TitleSort` | **string* | :heavy_minus_sign: | N/A | American Dream Is Killing Me |
| `Type` | **string* | :heavy_minus_sign: | N/A | track |
| `UpdatedAt` | **int* | :heavy_minus_sign: | N/A | 1705543314 |
| `ViewOffset` | **int* | :heavy_minus_sign: | N/A | 1000 |
| `Media` | [][operations.GetSessionsMedia](../../models/operations/getsessionsmedia.md) | :heavy_minus_sign: | N/A | |
| `User` | [*operations.GetSessionsUser](../../models/operations/getsessionsuser.md) | :heavy_minus_sign: | N/A | |
| `Player` | [*operations.Player](../../models/operations/player.md) | :heavy_minus_sign: | N/A | |
| `Session` | [*operations.Session](../../models/operations/session.md) | :heavy_minus_sign: | N/A | |

View File

@@ -1,12 +0,0 @@
# GetTokenByPinIDGlobals
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientName` | **string* | :heavy_minus_sign: | The name of the client application. (Plex Web, Plex Media Server, etc.) | Plex for Roku |
| `DeviceNickname` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 |
| `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |
| `Platform` | **string* | :heavy_minus_sign: | The platform of the client application. | Roku |

View File

@@ -6,7 +6,7 @@
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `PinID` | *int64* | :heavy_check_mark: | The PinID to retrieve an access token for | |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientID` | *string* | :heavy_check_mark: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientName` | **string* | :heavy_minus_sign: | The name of the client application. (Plex Web, Plex Media Server, etc.) | Plex for Roku |
| `DeviceNickname` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 |
| `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |

File diff suppressed because one or more lines are too long

View File

@@ -8,8 +8,8 @@ Logged in user details
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AdsConsent` | *bool* | :heavy_check_mark: | Unknown | |
| `AdsConsentReminderAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | Unknown | |
| `AdsConsentSetAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | Unknown | |
| `AdsConsentReminderAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `AdsConsentSetAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `Anonymous` | **bool* | :heavy_minus_sign: | Unknown | |
| `AuthToken` | *string* | :heavy_check_mark: | The account token | CxoUzBTSV5hsxjTpFKaf |
| `BackupCodesCreated` | **bool* | :heavy_minus_sign: | If the two-factor authentication backup codes have been created | |

View File

@@ -16,4 +16,7 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `GetTopWatchedContentQueryParamTypeMovie` | 1 |
| `GetTopWatchedContentQueryParamTypeTvShow` | 2 |
| `GetTopWatchedContentQueryParamTypeSeason` | 3 |
| `GetTopWatchedContentQueryParamTypeEpisode` | 4 |
| `GetTopWatchedContentQueryParamTypeEpisode` | 4 |
| `GetTopWatchedContentQueryParamTypeAudio` | 8 |
| `GetTopWatchedContentQueryParamTypeAlbum` | 9 |
| `GetTopWatchedContentQueryParamTypeTrack` | 10 |

View File

@@ -1,12 +0,0 @@
# PostUsersSignInDataGlobals
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientName` | **string* | :heavy_minus_sign: | The name of the client application. (Plex Web, Plex Media Server, etc.) | Plex for Roku |
| `DeviceNickname` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 |
| `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |
| `Platform` | **string* | :heavy_minus_sign: | The platform of the client application. | Roku |

View File

@@ -5,7 +5,7 @@
| Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `ClientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientID` | *string* | :heavy_check_mark: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `ClientName` | **string* | :heavy_minus_sign: | The name of the client application. (Plex Web, Plex Media Server, etc.) | Plex for Roku |
| `DeviceNickname` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 |
| `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |

File diff suppressed because one or more lines are too long

View File

@@ -8,8 +8,8 @@ Returns the user account data with a valid auth token
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AdsConsent` | *bool* | :heavy_check_mark: | Unknown | |
| `AdsConsentReminderAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | Unknown | |
| `AdsConsentSetAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | Unknown | |
| `AdsConsentReminderAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `AdsConsentSetAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `Anonymous` | **bool* | :heavy_minus_sign: | Unknown | |
| `AuthToken` | *string* | :heavy_check_mark: | The account token | CxoUzBTSV5hsxjTpFKaf |
| `BackupCodesCreated` | **bool* | :heavy_minus_sign: | If the two-factor authentication backup codes have been created | |

View File

@@ -16,4 +16,7 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `QueryParamTypeMovie` | 1 |
| `QueryParamTypeTvShow` | 2 |
| `QueryParamTypeSeason` | 3 |
| `QueryParamTypeEpisode` | 4 |
| `QueryParamTypeEpisode` | 4 |
| `QueryParamTypeAudio` | 8 |
| `QueryParamTypeAlbum` | 9 |
| `QueryParamTypeTrack` | 10 |

View File

@@ -1,20 +1,20 @@
# ShowOrdering
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)).
Setting that indicates the episode ordering for the show
None = Library default,
tmdbAiring = The Movie Database (Aired),
tvdbAiring = TheTVDB (Aired),
tvdbDvd = TheTVDB (DVD),
tvdbAbsolute = TheTVDB (Absolute)).
## Values
| Name | Value |
| ------------------------ | ------------------------ |
| `ShowOrderingNone` | None |
| `ShowOrderingTmdbAiring` | tmdbAiring |
| `ShowOrderingAired` | aired |
| `ShowOrderingDvd` | dvd |
| `ShowOrderingAbsolute` | absolute |
| Name | Value |
| -------------------------- | -------------------------- |
| `ShowOrderingNone` | None |
| `ShowOrderingTmdbAiring` | tmdbAiring |
| `ShowOrderingTvdbAiring` | tvdbAiring |
| `ShowOrderingTvdbDvd` | tvdbDvd |
| `ShowOrderingTvdbAbsolute` | tvdbAbsolute |

View File

@@ -25,4 +25,5 @@ A key representing a specific tag within the section.
| `TagRating` | rating |
| `TagResolution` | resolution |
| `TagFirstCharacter` | firstCharacter |
| `TagFolder` | folder |
| `TagFolder` | folder |
| `TagAlbums` | albums |

View File

@@ -16,4 +16,7 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `TypeMovie` | 1 |
| `TypeTvShow` | 2 |
| `TypeSeason` | 3 |
| `TypeEpisode` | 4 |
| `TypeEpisode` | 4 |
| `TypeAudio` | 8 |
| `TypeAlbum` | 9 |
| `TypeTrack` | 10 |

View File

@@ -27,22 +27,18 @@ Get Server Activities
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Activities.GetServerActivities(ctx)
if err != nil {
log.Fatal(err)
@@ -82,22 +78,18 @@ Cancel Server Activities
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Activities.CancelServerActivities(ctx, "25b71ed5-0f9d-461c-baa7-d404e9e10d3e")
if err != nil {
log.Fatal(err)

View File

@@ -24,23 +24,19 @@ This endpoint provides the caller with a temporary token with the same access le
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Authentication.GetTransientToken(ctx, operations.GetTransientTokenQueryParamTypeDelegation, operations.ScopeAll)
if err != nil {
log.Fatal(err)
@@ -84,22 +80,18 @@ Note: requires Plex Media Server >= 1.15.4.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Authentication.GetSourceConnectionInformation(ctx, "provider://provider-identifier")
if err != nil {
log.Fatal(err)
@@ -140,22 +132,18 @@ Get the User data from the provided X-Plex-Token
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Authentication.GetTokenDetails(ctx)
if err != nil {
log.Fatal(err)
@@ -195,26 +183,27 @@ Sign in user with username and password and return user data with Plex authentic
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
s := plexgo.New(
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()
s := plexgo.New()
res, err := s.Authentication.PostUsersSignInData(ctx, operations.PostUsersSignInDataRequest{
ClientID: "3381b62b-9ab7-4e37-827b-203e9809eb58",
ClientName: plexgo.String("Plex for Roku"),
DeviceNickname: plexgo.String("Roku 3"),
ClientVersion: plexgo.String("2.4.1"),
Platform: plexgo.String("Roku"),
RequestBody: &operations.PostUsersSignInDataRequestBody{
Login: "username@email.com",
Password: "password123",
RememberMe: plexgo.Bool(false),
VerificationCode: plexgo.String("123456"),
},
})

View File

@@ -24,22 +24,18 @@ Returns a list of butler tasks
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Butler.GetButlerTasks(ctx)
if err != nil {
log.Fatal(err)
@@ -84,22 +80,18 @@ This endpoint will attempt to start all Butler tasks that are enabled in the set
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Butler.StartAllTasks(ctx)
if err != nil {
log.Fatal(err)
@@ -140,22 +132,18 @@ This endpoint will stop all currently running tasks and remove any scheduled tas
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Butler.StopAllTasks(ctx)
if err != nil {
log.Fatal(err)
@@ -200,23 +188,19 @@ This endpoint will attempt to start a single Butler task that is enabled in the
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Butler.StartTask(ctx, operations.TaskNameCleanOldBundles)
if err != nil {
log.Fatal(err)
@@ -258,23 +242,19 @@ This endpoint will stop a currently running task by name, or remove it from the
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Butler.StopTask(ctx, operations.PathParamTaskNameBackupDatabase)
if err != nil {
log.Fatal(err)

View File

@@ -22,22 +22,18 @@ Get Global Hubs filtered by the parameters provided.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Hubs.GetGlobalHubs(ctx, nil, nil)
if err != nil {
log.Fatal(err)
@@ -80,23 +76,19 @@ This endpoint will return the recently added content.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Hubs.GetRecentlyAdded(ctx, operations.GetRecentlyAddedRequest{
ContentDirectoryID: 470161,
SectionID: plexgo.Int64(2),
@@ -143,22 +135,18 @@ This endpoint will return a list of library specific hubs
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Hubs.GetLibraryHubs(ctx, 6728.76, nil, nil)
if err != nil {
log.Fatal(err)

View File

@@ -32,22 +32,18 @@ This resource returns hash values for local files
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetFileHash(ctx, "file://C:\Image.png&type=13", nil)
if err != nil {
log.Fatal(err)
@@ -90,23 +86,19 @@ This endpoint will return the recently added content.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetRecentlyAddedLibrary(ctx, operations.GetRecentlyAddedLibraryRequest{
ContentDirectoryID: plexgo.Int64(2),
PinnedContentDirectoryID: []int64{
@@ -174,22 +166,18 @@ This allows a client to provide a rich interface around the media (e.g. allow so
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetAllLibraries(ctx)
if err != nil {
log.Fatal(err)
@@ -268,23 +256,20 @@ Each type in the library comes with a set of filters and sorts, aiding in buildi
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetLibraryDetails(ctx, 9518, nil)
res, err := s.Library.GetLibraryDetails(ctx, 9518, operations.IncludeDetailsZero.ToPointer())
if err != nil {
log.Fatal(err)
}
@@ -325,22 +310,18 @@ Delete a library using a specific section id
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.DeleteLibrary(ctx, 9518)
if err != nil {
log.Fatal(err)
@@ -393,6 +374,7 @@ Fetches details from a specific section of the library identified by a section k
- `resolution`: Items categorized by resolution.
- `firstCharacter`: Items categorized by the first letter.
- `folder`: Items categorized by folder.
- `albums`: Items categorized by album.
### Example Usage
@@ -401,23 +383,19 @@ Fetches details from a specific section of the library identified by a section k
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetLibraryItems(ctx, operations.GetLibraryItemsRequest{
Tag: operations.TagEdition,
IncludeGuids: operations.IncludeGuidsEnable.ToPointer(),
@@ -467,23 +445,19 @@ This endpoint Refreshes all the Metadata of the library.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetRefreshLibraryMetadata(ctx, 9518, operations.ForceOne.ToPointer())
if err != nil {
log.Fatal(err)
@@ -543,23 +517,19 @@ Each type in the library comes with a set of filters and sorts, aiding in buildi
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetSearchLibrary(ctx, 9518, operations.GetSearchLibraryQueryParamTypeTvShow)
if err != nil {
log.Fatal(err)
@@ -602,25 +572,22 @@ Search the provided query across all library sections, or a single section, and
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetSearchAllLibraries(ctx, operations.GetSearchAllLibrariesRequest{
Query: "<value>",
ClientID: "3381b62b-9ab7-4e37-827b-203e9809eb58",
SearchTypes: []operations.SearchTypes{
operations.SearchTypesPeople,
},
@@ -667,22 +634,18 @@ This endpoint will return the metadata of a library item specified with the rati
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetMetaDataByRatingKey(ctx, 9518)
if err != nil {
log.Fatal(err)
@@ -724,22 +687,18 @@ This endpoint will return the children of of a library item specified with the r
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetMetadataChildren(ctx, 1539.14, plexgo.String("Stream"))
if err != nil {
log.Fatal(err)
@@ -782,23 +741,19 @@ This endpoint will return the top watched content from libraries of a certain ty
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetTopWatchedContent(ctx, operations.GetTopWatchedContentQueryParamTypeTvShow, plexgo.Int64(1))
if err != nil {
log.Fatal(err)
@@ -841,22 +796,18 @@ This endpoint will return the on deck content.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Library.GetOnDeck(ctx)
if err != nil {
log.Fatal(err)

View File

@@ -23,23 +23,19 @@ This endpoint will write a single-line log message, including a level and source
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Log.LogLine(ctx, operations.LevelThree, "Test log message", "Postman")
if err != nil {
log.Fatal(err)
@@ -103,22 +99,18 @@ Ensure each parameter is properly URL-encoded to avoid interpretation issues.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Log.LogMultiLine(ctx, "level=4&message=Test%20message%201&source=postman\n" +
"level=3&message=Test%20message%202&source=postman\n" +
"level=1&message=Test%20message%203&source=postman")
@@ -162,22 +154,18 @@ This endpoint will enable all Plex Media Serverlogs to be sent to the Papertrail
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Log.EnablePaperTrail(ctx)
if err != nil {
log.Fatal(err)

View File

@@ -24,22 +24,18 @@ This will mark the provided media key as Played.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Media.MarkPlayed(ctx, 59398)
if err != nil {
log.Fatal(err)
@@ -80,22 +76,18 @@ This will mark the provided media key as Unplayed.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Media.MarkUnplayed(ctx, 59398)
if err != nil {
log.Fatal(err)
@@ -137,22 +129,18 @@ This API command can be used to update the play progress of a media item.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Media.UpdatePlayProgress(ctx, "<key>", 90000, "played")
if err != nil {
log.Fatal(err)
@@ -195,23 +183,19 @@ Gets the banner image of the media item
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Media.GetBannerImage(ctx, operations.GetBannerImageRequest{
RatingKey: 9518,
Width: 396,
@@ -259,23 +243,19 @@ Gets the thumbnail image of the media item
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Media.GetThumbImage(ctx, operations.GetThumbImageRequest{
RatingKey: 9518,
Width: 396,

View File

@@ -34,28 +34,24 @@ Create a new playlist. By default the playlist is blank. To create a playlist al
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.CreatePlaylist(ctx, operations.CreatePlaylistRequest{
Title: "<value>",
Type: operations.CreatePlaylistQueryParamTypePhoto,
Smart: operations.SmartOne,
URI: "https://inborn-brochure.biz",
URI: "https://hoarse-testing.info/",
})
if err != nil {
log.Fatal(err)
@@ -96,22 +92,18 @@ Get All Playlists given the specified filters.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.GetPlaylists(ctx, nil, nil)
if err != nil {
log.Fatal(err)
@@ -155,22 +147,18 @@ Smart playlist details contain the `content` attribute. This is the content URI
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.GetPlaylist(ctx, 4109.48)
if err != nil {
log.Fatal(err)
@@ -212,22 +200,18 @@ This endpoint will delete a playlist
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.DeletePlaylist(ctx, 216.22)
if err != nil {
log.Fatal(err)
@@ -269,22 +253,18 @@ From PMS version 1.9.1 clients can also edit playlist metadata using this endpoi
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.UpdatePlaylist(ctx, 3915, nil, nil)
if err != nil {
log.Fatal(err)
@@ -331,23 +311,19 @@ Note that for dumb playlists, items have a `playlistItemID` attribute which is u
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.GetPlaylistContents(ctx, 5004.46, operations.GetPlaylistContentsQueryParamTypeTvShow)
if err != nil {
log.Fatal(err)
@@ -390,22 +366,18 @@ Clears a playlist, only works with dumb playlists. Returns the playlist.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.ClearPlaylistContents(ctx, 1893.18)
if err != nil {
log.Fatal(err)
@@ -448,22 +420,18 @@ With a smart playlist, passing a new `uri` parameter replaces the rules for the
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.AddPlaylistContents(ctx, 8502.01, "server://12345/com.plexapp.plugins.library/library/metadata/1", plexgo.Float64(123))
if err != nil {
log.Fatal(err)
@@ -507,23 +475,19 @@ Imports m3u playlists by passing a path on the server to scan for m3u-formatted
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Playlists.UploadPlaylist(ctx, "/home/barkley/playlist.m3u", operations.QueryParamForceZero, 1)
if err != nil {
log.Fatal(err)

View File

@@ -26,22 +26,18 @@ Get Companions Data
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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)
if err != nil {
log.Fatal(err)
@@ -81,22 +77,18 @@ Get friends of provided auth token.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetUserFriends(ctx)
if err != nil {
log.Fatal(err)
@@ -136,21 +128,16 @@ Returns the geolocation and locale data of the caller
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
s := plexgo.New(
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()
s := plexgo.New()
res, err := s.Plex.GetGeoData(ctx)
if err != nil {
log.Fatal(err)
@@ -190,22 +177,18 @@ Retrieves the home data for the authenticated user, including details like home
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetHomeData(ctx)
if err != nil {
log.Fatal(err)
@@ -245,24 +228,20 @@ Get Plex server access tokens and server connections
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetServerResources(ctx, operations.IncludeHTTPSEnable.ToPointer(), operations.IncludeRelayEnable.ToPointer(), operations.IncludeIPv6Enable.ToPointer(), plexgo.String("3381b62b-9ab7-4e37-827b-203e9809eb58"))
res, err := s.Plex.GetServerResources(ctx, "3381b62b-9ab7-4e37-827b-203e9809eb58", operations.IncludeHTTPSEnable.ToPointer(), operations.IncludeRelayEnable.ToPointer(), operations.IncludeIPv6Enable.ToPointer())
if err != nil {
log.Fatal(err)
}
@@ -277,10 +256,10 @@ func main() {
| Parameter | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | |
| `clientID` | *string* | :heavy_check_mark: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `includeHTTPS` | [*operations.IncludeHTTPS](../../models/operations/includehttps.md) | :heavy_minus_sign: | Include Https entries in the results | 1 |
| `includeRelay` | [*operations.IncludeRelay](../../models/operations/includerelay.md) | :heavy_minus_sign: | Include Relay addresses in the results <br/>E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400<br/> | 1 |
| `includeIPv6` | [*operations.IncludeIPv6](../../models/operations/includeipv6.md) | :heavy_minus_sign: | Include IPv6 entries in the results | 1 |
| `clientID` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client (UUID, serial number, or other unique device ID) | 3381b62b-9ab7-4e37-827b-203e9809eb58 |
| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | |
### Response
@@ -305,23 +284,25 @@ Retrieve a Pin ID from Plex.tv to use for authentication flows
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
s := plexgo.New(
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.GetPin(ctx, operations.GetPinRequest{})
s := plexgo.New()
res, err := s.Plex.GetPin(ctx, operations.GetPinRequest{
Strong: plexgo.Bool(false),
ClientID: "3381b62b-9ab7-4e37-827b-203e9809eb58",
ClientName: plexgo.String("Plex for Roku"),
DeviceNickname: plexgo.String("Roku 3"),
ClientVersion: plexgo.String("2.4.1"),
Platform: plexgo.String("Roku"),
})
if err != nil {
log.Fatal(err)
}
@@ -360,24 +341,24 @@ Retrieve an Access Token from Plex.tv after the Pin has been authenticated
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
s := plexgo.New(
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()
s := plexgo.New()
res, err := s.Plex.GetTokenByPinID(ctx, operations.GetTokenByPinIDRequest{
PinID: 408895,
ClientID: "3381b62b-9ab7-4e37-827b-203e9809eb58",
ClientName: plexgo.String("Plex for Roku"),
DeviceNickname: plexgo.String("Roku 3"),
ClientVersion: plexgo.String("2.4.1"),
Platform: plexgo.String("Roku"),
})
if err != nil {
log.Fatal(err)

View File

@@ -26,3 +26,6 @@ The following SDKs are generated from the OpenAPI Specification. They are automa
| PHP | [GitHub](https://github.com/LukeHagar/plexphp) | [Releases](https://github.com/LukeHagar/plexphp/releases) | - |
| Java | [GitHub](https://github.com/LukeHagar/plexjava) | [Releases](https://github.com/LukeHagar/plexjava/releases) | - |
| C# | [GitHub](https://github.com/LukeHagar/plexcsharp) | [Releases](https://github.com/LukeHagar/plexcsharp/releases) | -
### Available Operations

View File

@@ -34,22 +34,18 @@ This request is intended to be very fast, and called as the user types.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Search.PerformSearch(ctx, "dylan", nil, plexgo.Float64(5))
if err != nil {
log.Fatal(err)
@@ -96,22 +92,18 @@ Results, as well as their containing per-type hubs, contain a `distance` attribu
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Search.PerformVoiceSearch(ctx, "dead+poop", nil, plexgo.Float64(5))
if err != nil {
log.Fatal(err)
@@ -154,22 +146,18 @@ This will search the database for the string provided.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Search.GetSearchResults(ctx, "110")
if err != nil {
log.Fatal(err)

View File

@@ -28,22 +28,18 @@ Get Server Capabilities
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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)
if err != nil {
log.Fatal(err)
@@ -83,22 +79,18 @@ Get Server Preferences
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetServerPreferences(ctx)
if err != nil {
log.Fatal(err)
@@ -138,22 +130,18 @@ Get Available Clients
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetAvailableClients(ctx)
if err != nil {
log.Fatal(err)
@@ -193,22 +181,18 @@ Get Devices
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetDevices(ctx)
if err != nil {
log.Fatal(err)
@@ -248,21 +232,16 @@ This request is useful to determine if the server is online or offline
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
s := plexgo.New(
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()
s := plexgo.New()
res, err := s.Server.GetServerIdentity(ctx)
if err != nil {
log.Fatal(err)
@@ -301,22 +280,18 @@ Returns MyPlex Account Information
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetMyPlexAccount(ctx)
if err != nil {
log.Fatal(err)
@@ -357,23 +332,19 @@ Plex's Photo transcoder is used throughout the service to serve images at specif
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetResizedPhoto(ctx, operations.GetResizedPhotoRequest{
Width: 110,
Height: 165,
@@ -422,22 +393,18 @@ Retrieves media providers and their features from the Plex server.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetMediaProviders(ctx, "CV5xoxjTpFKUzBTShsaf")
if err != nil {
log.Fatal(err)
@@ -478,22 +445,18 @@ Get Server List
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.GetServerList(ctx)
if err != nil {
log.Fatal(err)

View File

@@ -23,22 +23,18 @@ This will retrieve the "Now Playing" Information of the PMS.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Sessions.GetSessions(ctx)
if err != nil {
log.Fatal(err)
@@ -78,23 +74,19 @@ This will Retrieve a listing of all history views.
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Sessions.GetSessionHistory(ctx, plexgo.String("viewedAt:desc"), plexgo.Int64(1), &operations.QueryParamFilter{}, plexgo.Int64(12))
if err != nil {
log.Fatal(err)
@@ -138,22 +130,18 @@ Get Transcode Sessions
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Sessions.GetTranscodeSessions(ctx)
if err != nil {
log.Fatal(err)
@@ -193,22 +181,18 @@ Stop a Transcode Session
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Sessions.StopTranscodeSession(ctx, "zz7llzqlx8w9vnrsbnwhbmep")
if err != nil {
log.Fatal(err)

View File

@@ -22,22 +22,18 @@ This will return the media statistics for the server
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Statistics.GetStatistics(ctx, plexgo.Int64(4))
if err != nil {
log.Fatal(err)
@@ -78,22 +74,18 @@ This will return the resources for the server
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Statistics.GetResourcesStatistics(ctx, plexgo.Int64(4))
if err != nil {
log.Fatal(err)
@@ -134,22 +126,18 @@ This will return the bandwidth statistics for the server
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Statistics.GetBandwidthStatistics(ctx, plexgo.Int64(4))
if err != nil {
log.Fatal(err)

View File

@@ -23,22 +23,18 @@ Querying status of updates
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Updater.GetUpdateStatus(ctx)
if err != nil {
log.Fatal(err)
@@ -78,23 +74,19 @@ Checking for updates
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Updater.CheckForUpdates(ctx, operations.DownloadOne.ToPointer())
if err != nil {
log.Fatal(err)
@@ -136,23 +128,19 @@ Note that these two parameters are effectively mutually exclusive. The `tonight`
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Updater.ApplyUpdates(ctx, operations.TonightOne.ToPointer(), operations.SkipOne.ToPointer())
if err != nil {
log.Fatal(err)

View File

@@ -21,23 +21,19 @@ Get the timeline for a media item
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Video.GetTimeline(ctx, operations.GetTimelineRequest{
RatingKey: 23409,
Key: "/library/metadata/23409",
@@ -89,23 +85,19 @@ Begin a Universal Transcode Session
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Video.StartUniversalTranscode(ctx, operations.StartUniversalTranscodeRequest{
HasMDE: 1,
Path: "/library/metadata/23409",

View File

@@ -20,23 +20,19 @@ Get User Watchlist
package main
import(
"github.com/LukeHagar/plexgo"
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
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.Watchlist.GetWatchList(ctx, operations.GetWatchListRequest{
Filter: operations.FilterAvailable,
XPlexContainerStart: plexgo.Int(0),

5
go.mod
View File

@@ -2,7 +2,4 @@ module github.com/LukeHagar/plexgo
go 1.20
require (
github.com/cenkalti/backoff/v4 v4.2.0
github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05
)
require github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05

2
go.sum
View File

@@ -1,4 +1,2 @@
github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05 h1:S92OBrGuLLZsyM5ybUzgc/mPjIYk2AZqufieooe98uw=
github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05/go.mod h1:M9R1FoZ3y//hwwnJtO51ypFGwm8ZfpxPT/ZLtO1mcgQ=

208
hubs.go
View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http"
"net/url"
)
@@ -55,7 +53,12 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
}
}
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, "/hubs")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -87,21 +90,15 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -110,7 +107,11 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -123,7 +124,11 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -184,21 +189,11 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
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 {
case httpRes.StatusCode == 200:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -210,17 +205,16 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
res.Object = &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -233,17 +227,16 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -256,28 +249,29 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -307,7 +301,12 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
}
}
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, "/hubs/home/recentlyAdded")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -339,21 +338,15 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -362,7 +355,11 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -375,7 +372,11 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -436,21 +437,11 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
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 {
case httpRes.StatusCode == 200:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -462,11 +453,10 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
res.Object = &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
@@ -474,20 +464,22 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
case httpRes.StatusCode == 401:
fallthrough
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -523,7 +515,12 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
}
}
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, "/hubs/sections/{sectionId}", request, nil)
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -555,21 +552,15 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -578,7 +569,11 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -591,7 +586,11 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -652,21 +651,11 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
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 {
case httpRes.StatusCode == 200:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -678,17 +667,16 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
res.Object = &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -701,17 +689,16 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -724,28 +711,29 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}

View File

@@ -1,51 +0,0 @@
// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
package globals
type Globals struct {
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// The version of the client application.
ClientVersion *string `header:"style=simple,explode=false,name=X-Plex-Version"`
// The platform of the client application.
Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"`
// A relatively friendly name for the client device
DeviceNickname *string `header:"style=simple,explode=false,name=X-Plex-Device"`
}
func (o *Globals) GetClientID() *string {
if o == nil {
return nil
}
return o.ClientID
}
func (o *Globals) GetClientName() *string {
if o == nil {
return nil
}
return o.ClientName
}
func (o *Globals) GetClientVersion() *string {
if o == nil {
return nil
}
return o.ClientVersion
}
func (o *Globals) GetPlatform() *string {
if o == nil {
return nil
}
return o.Platform
}
func (o *Globals) GetDeviceNickname() *string {
if o == nil {
return nil
}
return o.DeviceNickname
}

16
internal/utils/env.go Normal file
View File

@@ -0,0 +1,16 @@
// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
package utils
import (
"os"
)
// GetEnv returns the value of the environment variable named by the key or the defaultValue if the environment variable is not set.
func GetEnv(name, defaultValue string) string {
value := os.Getenv(name)
if value == "" {
return defaultValue
}
return value
}

View File

@@ -214,7 +214,11 @@ func populateDeepObjectParamsStruct(qsValues url.Values, priorScope string, stru
continue
}
scope := priorScope + "[" + qpTag.ParamName + "]"
scope := priorScope
if !qpTag.Inline {
scope = priorScope + "[" + qpTag.ParamName + "]"
}
switch fieldValue.Kind() {
case reflect.Array, reflect.Slice:
@@ -252,6 +256,13 @@ type paramTag struct {
Explode bool
ParamName string
Serialization string
// Inline is a special case for union/oneOf. When a wrapper struct type is
// used, each union/oneOf value field should be inlined (e.g. not appended
// in deepObject style with the name) as if the value was directly on the
// parent struct field. Without this annotation, the value would not be
// encoded by downstream logic that requires the struct field tag.
Inline bool
}
func parseQueryParamTag(field reflect.StructField) *paramTag {

View File

@@ -166,7 +166,7 @@ func encodeMultipartFormData(w io.Writer, data interface{}) (string, error) {
tag := parseMultipartFormTag(field)
if tag.File {
if err := encodeMultipartFormDataFile(writer, fieldType, valType); err != nil {
if err := encodeMultipartFormDataFile(writer, tag.Name, fieldType, valType); err != nil {
writer.Close()
return "", err
}
@@ -211,12 +211,11 @@ func encodeMultipartFormData(w io.Writer, data interface{}) (string, error) {
return writer.FormDataContentType(), nil
}
func encodeMultipartFormDataFile(w *multipart.Writer, fieldType reflect.Type, valType reflect.Value) error {
func encodeMultipartFormDataFile(w *multipart.Writer, fieldName string, fieldType reflect.Type, valType reflect.Value) error {
if fieldType.Kind() != reflect.Struct {
return fmt.Errorf("invalid type %s for multipart/form-data file", valType.Type())
}
var fieldName string
var fileName string
var reader io.Reader
@@ -236,12 +235,11 @@ func encodeMultipartFormDataFile(w *multipart.Writer, fieldType reflect.Type, va
reader = val.Interface().(io.Reader)
}
} else {
fieldName = tag.Name
fileName = val.String()
}
}
if fieldName == "" || fileName == "" || reader == nil {
if fileName == "" || reader == nil {
return fmt.Errorf("invalid multipart/form-data file")
}

View File

@@ -7,7 +7,8 @@ import (
"errors"
"fmt"
"github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"math"
"math/rand"
"net/http"
"net/url"
"strconv"
@@ -15,8 +16,6 @@ import (
"time"
)
var errRequestFailed = errors.New("request failed")
// Deprecated: Use retry.BackoffStrategy instead.
type BackoffStrategy = retry.BackoffStrategy
@@ -28,34 +27,27 @@ type Retries struct {
StatusCodes []string
}
func Retry(ctx context.Context, r Retries, action func() (*http.Response, error)) (*http.Response, error) {
func Retry(ctx context.Context, r Retries, operation func() (*http.Response, error)) (*http.Response, error) {
switch r.Config.Strategy {
case "backoff":
if r.Config.Backoff == nil {
return action()
return operation()
}
config := backoff.NewExponentialBackOff()
config.InitialInterval = time.Duration(r.Config.Backoff.InitialInterval) * time.Millisecond
config.MaxInterval = time.Duration(r.Config.Backoff.MaxInterval) * time.Millisecond
config.Multiplier = r.Config.Backoff.Exponent
config.MaxElapsedTime = time.Duration(r.Config.Backoff.MaxElapsedTime) * time.Millisecond
config.Reset()
var resp *http.Response
err := backoff.Retry(func() error {
err := retryWithBackoff(ctx, r.Config.Backoff, func() error {
if resp != nil {
resp.Body.Close()
}
select {
case <-ctx.Done():
return backoff.Permanent(ctx.Err())
return retry.Permanent(ctx.Err())
default:
}
res, err := action()
res, err := operation()
if err != nil {
urlError := new(url.Error)
if errors.As(err, &urlError) {
@@ -64,7 +56,7 @@ func Retry(ctx context.Context, r Retries, action func() (*http.Response, error)
}
}
return backoff.Permanent(err)
return retry.Permanent(err)
}
resp = res
if res == nil {
@@ -81,7 +73,7 @@ func Retry(ctx context.Context, r Retries, action func() (*http.Response, error)
s := res.StatusCode / 100
if s >= codeRange && s < codeRange+1 {
return errRequestFailed
return retry.TemporaryFromResponse("request failed", res)
}
} else {
parsedCode, err := strconv.Atoi(code)
@@ -90,7 +82,7 @@ func Retry(ctx context.Context, r Retries, action func() (*http.Response, error)
}
if res.StatusCode == parsedCode {
return errRequestFailed
return retry.TemporaryFromResponse("request failed", res)
}
}
}
@@ -98,13 +90,131 @@ func Retry(ctx context.Context, r Retries, action func() (*http.Response, error)
resp = res
return nil
}, config)
if err != nil && !errors.Is(err, errRequestFailed) {
})
var tempErr *retry.TemporaryError
if err != nil && !errors.As(err, &tempErr) {
return nil, err
}
return resp, nil
default:
return action()
return operation()
}
}
func retryWithBackoff(ctx context.Context, s *retry.BackoffStrategy, operation func() error) error {
var (
err error
next time.Duration
attempt int
start = time.Now()
maxElapsedTime = time.Duration(s.MaxElapsedTime) * time.Millisecond
)
timer := &defaultTimer{}
defer func() {
timer.Stop()
}()
for {
err = operation()
if err == nil {
return nil
}
var permanent *retry.PermanentError
if errors.As(err, &permanent) {
return permanent.Unwrap()
}
if time.Since(start) >= maxElapsedTime {
return err
}
var temporary *retry.TemporaryError
if errors.As(err, &temporary) {
next = temporary.RetryAfter()
}
if next <= 0 {
next = nextInterval(s, attempt)
}
timer.Start(next)
select {
case <-ctx.Done():
return ctx.Err()
case <-timer.C():
}
attempt += 1
}
}
type Timer interface {
Start(duration time.Duration)
Stop()
C() <-chan time.Time
}
// defaultTimer implements Timer interface using time.Timer
type defaultTimer struct {
timer *time.Timer
}
// C returns the timers channel which receives the current time when the timer fires.
func (t *defaultTimer) C() <-chan time.Time {
return t.timer.C
}
// Start starts the timer to fire after the given duration
func (t *defaultTimer) Start(duration time.Duration) {
if t.timer == nil {
t.timer = time.NewTimer(duration)
return
}
if !t.timer.Stop() {
select {
case <-t.timer.C:
default:
}
}
t.timer.Reset(duration)
}
// Stop is called when the timer is not used anymore and resources may be freed.
func (t *defaultTimer) Stop() {
if t.timer != nil {
t.timer.Stop()
}
}
func nextInterval(s *retry.BackoffStrategy, attempt int) time.Duration {
initialInterval := float64(time.Duration(s.InitialInterval) * time.Millisecond)
maxInterval := float64(time.Duration(s.MaxInterval) * time.Millisecond)
exponent := s.Exponent
jitterFactor := float64(0.25)
interval := initialInterval * math.Pow(float64(attempt+1), exponent)
jitter := rand.Float64() * jitterFactor * interval
if rand.Float64() < 0.5 {
jitter = -1 * jitter
}
interval = interval + jitter
if interval <= 0 {
interval = initialInterval
}
if interval > maxInterval {
interval = maxInterval
}
return time.Duration(interval)
}

View File

@@ -3,10 +3,12 @@
package utils
import (
"bytes"
"context"
"fmt"
"io"
"math/big"
"net/http"
"reflect"
"regexp"
"strconv"
@@ -125,6 +127,7 @@ func parseStructTag(tagKey string, field reflect.StructField) map[string]string
func parseParamTag(tagKey string, field reflect.StructField, defaultStyle string, defaultExplode bool) *paramTag {
// example `{tagKey}:"style=simple,explode=false,name=apiID"`
// example `{tagKey}:"inline"`
values := parseStructTag(tagKey, field)
if values == nil {
return nil
@@ -138,6 +141,8 @@ func parseParamTag(tagKey string, field reflect.StructField, defaultStyle string
for k, v := range values {
switch k {
case "inline":
tag.Inline = v == "true"
case "style":
tag.Style = v
case "explode":
@@ -228,3 +233,15 @@ func contains(arr []string, str string) bool {
}
return false
}
func ConsumeRawBody(res *http.Response) ([]byte, error) {
rawBody, err := io.ReadAll(res.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
res.Body.Close()
res.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}

File diff suppressed because it is too large Load Diff

207
log.go
View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http"
"net/url"
)
@@ -56,7 +54,12 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
}
}
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, "/log")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -88,21 +91,15 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -111,7 +108,11 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -124,7 +125,11 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -185,22 +190,12 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -213,17 +208,16 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -236,28 +230,29 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -307,7 +302,12 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
}
}
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, "/log")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -335,27 +335,23 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
}
req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent)
req.Header.Set("Content-Type", reqContentType)
if reqContentType != "" {
req.Header.Set("Content-Type", reqContentType)
}
if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil {
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -364,7 +360,11 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -377,7 +377,11 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -438,22 +442,12 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -466,17 +460,16 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -489,28 +482,29 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -540,7 +534,12 @@ func (s *Log) EnablePaperTrail(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, "/log/networked")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -568,21 +567,15 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -591,7 +584,11 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -604,7 +601,11 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -665,22 +666,12 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -693,17 +684,16 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -716,30 +706,31 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
}
case httpRes.StatusCode == 403:
fallthrough
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}

343
media.go
View File

@@ -11,8 +11,6 @@ import (
"github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4"
"io"
"net/http"
"net/url"
)
@@ -54,7 +52,12 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, 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, "/:/scrobble")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -86,21 +89,15 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -109,7 +106,11 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -122,7 +123,11 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -183,22 +188,12 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -211,17 +206,16 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -234,28 +228,29 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -289,7 +284,12 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
}
}
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, "/:/unscrobble")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -321,21 +321,15 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -344,7 +338,11 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -357,7 +355,11 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -418,22 +420,12 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -446,17 +438,16 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -469,28 +460,29 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -526,7 +518,12 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
}
}
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, "/:/progress")
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -558,21 +555,15 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -581,7 +572,11 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -594,7 +589,11 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -655,22 +654,12 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
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 {
case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -683,17 +672,16 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -706,28 +694,29 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -757,7 +746,12 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
}
}
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, "/library/metadata/{ratingKey}/banner", request, nil)
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -791,21 +785,15 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -814,7 +802,11 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -827,7 +819,11 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -888,16 +884,6 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
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 {
case httpRes.StatusCode == 200:
res.Headers = httpRes.Header
@@ -908,17 +894,16 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
return res, nil
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -931,17 +916,16 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -954,28 +938,29 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}
@@ -1005,7 +990,12 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
}
}
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, "/library/metadata/{ratingKey}/thumb", request, nil)
if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err)
@@ -1039,21 +1029,15 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
return nil, err
}
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries
if retryConfig == nil {
if globalRetryConfig != nil {
retryConfig = globalRetryConfig
} else {
retryConfig = &retry.Config{
Strategy: "backoff", Backoff: &retry.BackoffStrategy{
InitialInterval: 500,
MaxInterval: 60000,
Exponent: 1.5,
MaxElapsedTime: 3600000,
},
RetryConnectionErrors: true,
}
}
}
@@ -1062,7 +1046,11 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
httpRes, err = utils.Retry(ctx, utils.Retries{
Config: retryConfig,
StatusCodes: []string{
"5XX",
"429",
"500",
"502",
"503",
"504",
},
}, func() (*http.Response, error) {
if req.Body != nil {
@@ -1075,7 +1063,11 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
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)
@@ -1136,16 +1128,6 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
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 {
case httpRes.StatusCode == 200:
res.Headers = httpRes.Header
@@ -1156,17 +1138,16 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
return res, nil
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -1179,17 +1160,16 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
@@ -1202,28 +1182,29 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
out.RawResponse = httpRes
return nil, &out
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
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:
fallthrough
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
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 {
return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default:
rawBody, err := getRawBody()
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil {
return nil, err
}
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
}

View File

@@ -10,7 +10,7 @@ type GetBandwidthStatisticsRequest struct {
// The timespan to retrieve statistics for
// the exact meaning of this parameter is not known
//
Timespan *int64 `queryParam:"style=form,explode=true,name=Timespan"`
Timespan *int64 `queryParam:"style=form,explode=true,name=timespan"`
}
func (o *GetBandwidthStatisticsRequest) GetTimespan() *int64 {

View File

@@ -33,6 +33,7 @@ const (
TagResolution Tag = "resolution"
TagFirstCharacter Tag = "firstCharacter"
TagFolder Tag = "folder"
TagAlbums Tag = "albums"
)
func (e Tag) ToPointer() *Tag {
@@ -81,6 +82,8 @@ func (e *Tag) UnmarshalJSON(data []byte) error {
case "firstCharacter":
fallthrough
case "folder":
fallthrough
case "albums":
*e = Tag(v)
return nil
default:
@@ -128,6 +131,9 @@ const (
GetLibraryItemsQueryParamTypeTvShow GetLibraryItemsQueryParamType = 2
GetLibraryItemsQueryParamTypeSeason GetLibraryItemsQueryParamType = 3
GetLibraryItemsQueryParamTypeEpisode GetLibraryItemsQueryParamType = 4
GetLibraryItemsQueryParamTypeAudio GetLibraryItemsQueryParamType = 8
GetLibraryItemsQueryParamTypeAlbum GetLibraryItemsQueryParamType = 9
GetLibraryItemsQueryParamTypeTrack GetLibraryItemsQueryParamType = 10
)
func (e GetLibraryItemsQueryParamType) ToPointer() *GetLibraryItemsQueryParamType {
@@ -146,6 +152,12 @@ func (e *GetLibraryItemsQueryParamType) UnmarshalJSON(data []byte) error {
case 3:
fallthrough
case 4:
fallthrough
case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = GetLibraryItemsQueryParamType(v)
return nil
default:
@@ -617,11 +629,13 @@ func (e *GetLibraryItemsLibraryType) UnmarshalJSON(data []byte) error {
}
}
// GetLibraryItemsFlattenSeasons - Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
type GetLibraryItemsFlattenSeasons string
const (
GetLibraryItemsFlattenSeasonsFalse GetLibraryItemsFlattenSeasons = "0"
GetLibraryItemsFlattenSeasonsTrue GetLibraryItemsFlattenSeasons = "1"
GetLibraryItemsFlattenSeasonsLibraryDefault GetLibraryItemsFlattenSeasons = "-1"
GetLibraryItemsFlattenSeasonsHide GetLibraryItemsFlattenSeasons = "0"
GetLibraryItemsFlattenSeasonsShow GetLibraryItemsFlattenSeasons = "1"
)
func (e GetLibraryItemsFlattenSeasons) ToPointer() *GetLibraryItemsFlattenSeasons {
@@ -633,6 +647,8 @@ func (e *GetLibraryItemsFlattenSeasons) UnmarshalJSON(data []byte) error {
return err
}
switch v {
case "-1":
fallthrough
case "0":
fallthrough
case "1":
@@ -643,20 +659,77 @@ func (e *GetLibraryItemsFlattenSeasons) UnmarshalJSON(data []byte) error {
}
}
// GetLibraryItemsEpisodeSort - Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first).
type GetLibraryItemsEpisodeSort string
const (
GetLibraryItemsEpisodeSortLibraryDefault GetLibraryItemsEpisodeSort = "-1"
GetLibraryItemsEpisodeSortOldestFirst GetLibraryItemsEpisodeSort = "0"
GetLibraryItemsEpisodeSortNewestFirst GetLibraryItemsEpisodeSort = "1"
)
func (e GetLibraryItemsEpisodeSort) ToPointer() *GetLibraryItemsEpisodeSort {
return &e
}
func (e *GetLibraryItemsEpisodeSort) UnmarshalJSON(data []byte) error {
var v string
if err := json.Unmarshal(data, &v); err != nil {
return err
}
switch v {
case "-1":
fallthrough
case "0":
fallthrough
case "1":
*e = GetLibraryItemsEpisodeSort(v)
return nil
default:
return fmt.Errorf("invalid value for GetLibraryItemsEpisodeSort: %v", v)
}
}
// GetLibraryItemsEnableCreditsMarkerGeneration - Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled).
type GetLibraryItemsEnableCreditsMarkerGeneration string
const (
GetLibraryItemsEnableCreditsMarkerGenerationLibraryDefault GetLibraryItemsEnableCreditsMarkerGeneration = "-1"
GetLibraryItemsEnableCreditsMarkerGenerationDisabled GetLibraryItemsEnableCreditsMarkerGeneration = "0"
)
func (e GetLibraryItemsEnableCreditsMarkerGeneration) ToPointer() *GetLibraryItemsEnableCreditsMarkerGeneration {
return &e
}
func (e *GetLibraryItemsEnableCreditsMarkerGeneration) UnmarshalJSON(data []byte) error {
var v string
if err := json.Unmarshal(data, &v); err != nil {
return err
}
switch v {
case "-1":
fallthrough
case "0":
*e = GetLibraryItemsEnableCreditsMarkerGeneration(v)
return nil
default:
return fmt.Errorf("invalid value for GetLibraryItemsEnableCreditsMarkerGeneration: %v", v)
}
}
// 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)).
// tvdbAiring = TheTVDB (Aired),
// tvdbDvd = TheTVDB (DVD),
// tvdbAbsolute = TheTVDB (Absolute)).
type GetLibraryItemsShowOrdering string
const (
GetLibraryItemsShowOrderingNone GetLibraryItemsShowOrdering = "None"
GetLibraryItemsShowOrderingTmdbAiring GetLibraryItemsShowOrdering = "tmdbAiring"
GetLibraryItemsShowOrderingAired GetLibraryItemsShowOrdering = "aired"
GetLibraryItemsShowOrderingDvd GetLibraryItemsShowOrdering = "dvd"
GetLibraryItemsShowOrderingAbsolute GetLibraryItemsShowOrdering = "absolute"
GetLibraryItemsShowOrderingNone GetLibraryItemsShowOrdering = "None"
GetLibraryItemsShowOrderingTmdbAiring GetLibraryItemsShowOrdering = "tmdbAiring"
GetLibraryItemsShowOrderingTvdbAiring GetLibraryItemsShowOrdering = "tvdbAiring"
GetLibraryItemsShowOrderingTvdbDvd GetLibraryItemsShowOrdering = "tvdbDvd"
GetLibraryItemsShowOrderingTvdbAbsolute GetLibraryItemsShowOrdering = "tvdbAbsolute"
)
func (e GetLibraryItemsShowOrdering) ToPointer() *GetLibraryItemsShowOrdering {
@@ -672,11 +745,11 @@ func (e *GetLibraryItemsShowOrdering) UnmarshalJSON(data []byte) error {
fallthrough
case "tmdbAiring":
fallthrough
case "aired":
case "tvdbAiring":
fallthrough
case "dvd":
case "tvdbDvd":
fallthrough
case "absolute":
case "tvdbAbsolute":
*e = GetLibraryItemsShowOrdering(v)
return nil
default:
@@ -1630,23 +1703,28 @@ type GetLibraryItemsMetadata struct {
LibrarySectionKey *string `json:"librarySectionKey,omitempty"`
// The type of media content
//
Type GetLibraryItemsLibraryType `json:"type"`
Title string `json:"title"`
Slug *string `json:"slug,omitempty"`
ContentRating *string `json:"contentRating,omitempty"`
Summary string `json:"summary"`
Rating *float64 `json:"rating,omitempty"`
AudienceRating *float64 `json:"audienceRating,omitempty"`
Year *int `json:"year,omitempty"`
SeasonCount *int `json:"seasonCount,omitempty"`
Tagline *string `json:"tagline,omitempty"`
FlattenSeasons *GetLibraryItemsFlattenSeasons `default:"0" json:"flattenSeasons"`
Type GetLibraryItemsLibraryType `json:"type"`
Title string `json:"title"`
Slug *string `json:"slug,omitempty"`
ContentRating *string `json:"contentRating,omitempty"`
Summary string `json:"summary"`
Rating *float64 `json:"rating,omitempty"`
AudienceRating *float64 `json:"audienceRating,omitempty"`
Year *int `json:"year,omitempty"`
SeasonCount *int `json:"seasonCount,omitempty"`
Tagline *string `json:"tagline,omitempty"`
// Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
FlattenSeasons *GetLibraryItemsFlattenSeasons `json:"flattenSeasons,omitempty"`
// Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first).
EpisodeSort *GetLibraryItemsEpisodeSort `json:"episodeSort,omitempty"`
// Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled).
EnableCreditsMarkerGeneration *GetLibraryItemsEnableCreditsMarkerGeneration `json:"enableCreditsMarkerGeneration,omitempty"`
// 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)).
// tvdbAiring = TheTVDB (Aired),
// tvdbDvd = TheTVDB (DVD),
// tvdbAbsolute = TheTVDB (Absolute)).
//
ShowOrdering *GetLibraryItemsShowOrdering `json:"showOrdering,omitempty"`
Thumb *string `json:"thumb,omitempty"`
@@ -1857,6 +1935,20 @@ func (o *GetLibraryItemsMetadata) GetFlattenSeasons() *GetLibraryItemsFlattenSea
return o.FlattenSeasons
}
func (o *GetLibraryItemsMetadata) GetEpisodeSort() *GetLibraryItemsEpisodeSort {
if o == nil {
return nil
}
return o.EpisodeSort
}
func (o *GetLibraryItemsMetadata) GetEnableCreditsMarkerGeneration() *GetLibraryItemsEnableCreditsMarkerGeneration {
if o == nil {
return nil
}
return o.EnableCreditsMarkerGeneration
}
func (o *GetLibraryItemsMetadata) GetShowOrdering() *GetLibraryItemsShowOrdering {
if o == nil {
return nil
@@ -2596,7 +2688,7 @@ type GetLibraryItemsMediaContainer struct {
ViewGroup string `json:"viewGroup"`
ViewMode *int `json:"viewMode,omitempty"`
MixedParents *bool `json:"mixedParents,omitempty"`
Metadata []GetLibraryItemsMetadata `json:"Metadata"`
Metadata []GetLibraryItemsMetadata `json:"Metadata,omitempty"`
// The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.
//
Meta *GetLibraryItemsMeta `json:"Meta,omitempty"`
@@ -2751,7 +2843,7 @@ func (o *GetLibraryItemsMediaContainer) GetMixedParents() *bool {
func (o *GetLibraryItemsMediaContainer) GetMetadata() []GetLibraryItemsMetadata {
if o == nil {
return []GetLibraryItemsMetadata{}
return nil
}
return o.Metadata
}

View File

@@ -782,15 +782,25 @@ func (o *Producer) GetThumb() *string {
}
type GetMetaDataByRatingKeyMetadata struct {
RatingKey *string `json:"ratingKey,omitempty"`
Key *string `json:"key,omitempty"`
GUID *string `json:"guid,omitempty"`
Studio *string `json:"studio,omitempty"`
Type *string `json:"type,omitempty"`
Title *string `json:"title,omitempty"`
LibrarySectionTitle *string `json:"librarySectionTitle,omitempty"`
LibrarySectionID *int `json:"librarySectionID,omitempty"`
LibrarySectionKey *string `json:"librarySectionKey,omitempty"`
RatingKey *string `json:"ratingKey,omitempty"`
Key *string `json:"key,omitempty"`
GUID *string `json:"guid,omitempty"`
Studio *string `json:"studio,omitempty"`
Type *string `json:"type,omitempty"`
Title *string `json:"title,omitempty"`
LibrarySectionTitle *string `json:"librarySectionTitle,omitempty"`
LibrarySectionID *int `json:"librarySectionID,omitempty"`
LibrarySectionKey *string `json:"librarySectionKey,omitempty"`
// The name of the album artist for the track when audio, and the name of the TV show for the episode when video.
GrandparentTitle *string `json:"grandparentTitle,omitempty"`
// The name of the album for the track when audio, and the name of the season for the episode when TV show.
ParentTitle *string `json:"parentTitle,omitempty"`
// The orginal untranslated name of the media item when non-english.
OriginalTitle *string `json:"originalTitle,omitempty"`
// The index starting from 0 of this media item in the MetaData array.
Index *int64 `json:"index,omitempty"`
// The parent index starting from 0 of this media item in the parent MetaData array.
ParentIndex *int64 `json:"parentIndex,omitempty"`
ContentRating *string `json:"contentRating,omitempty"`
Summary *string `json:"summary,omitempty"`
Rating *float64 `json:"rating,omitempty"`
@@ -891,6 +901,41 @@ func (o *GetMetaDataByRatingKeyMetadata) GetLibrarySectionKey() *string {
return o.LibrarySectionKey
}
func (o *GetMetaDataByRatingKeyMetadata) GetGrandparentTitle() *string {
if o == nil {
return nil
}
return o.GrandparentTitle
}
func (o *GetMetaDataByRatingKeyMetadata) GetParentTitle() *string {
if o == nil {
return nil
}
return o.ParentTitle
}
func (o *GetMetaDataByRatingKeyMetadata) GetOriginalTitle() *string {
if o == nil {
return nil
}
return o.OriginalTitle
}
func (o *GetMetaDataByRatingKeyMetadata) GetIndex() *int64 {
if o == nil {
return nil
}
return o.Index
}
func (o *GetMetaDataByRatingKeyMetadata) GetParentIndex() *int64 {
if o == nil {
return nil
}
return o.ParentIndex
}
func (o *GetMetaDataByRatingKeyMetadata) GetContentRating() *string {
if o == nil {
return nil

View File

@@ -12,54 +12,6 @@ var GetPinServerList = []string{
"https://plex.tv/api/v2",
}
type GetPinGlobals struct {
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// A relatively friendly name for the client device
DeviceNickname *string `header:"style=simple,explode=false,name=X-Plex-Device"`
// The version of the client application.
ClientVersion *string `header:"style=simple,explode=false,name=X-Plex-Version"`
// The platform of the client application.
Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"`
}
func (o *GetPinGlobals) GetClientID() *string {
if o == nil {
return nil
}
return o.ClientID
}
func (o *GetPinGlobals) GetClientName() *string {
if o == nil {
return nil
}
return o.ClientName
}
func (o *GetPinGlobals) GetDeviceNickname() *string {
if o == nil {
return nil
}
return o.DeviceNickname
}
func (o *GetPinGlobals) GetClientVersion() *string {
if o == nil {
return nil
}
return o.ClientVersion
}
func (o *GetPinGlobals) GetPlatform() *string {
if o == nil {
return nil
}
return o.Platform
}
type GetPinRequest struct {
// Determines the kind of code returned by the API call
// Strong codes are used for Pin authentication flows
@@ -67,7 +19,7 @@ type GetPinRequest struct {
//
Strong *bool `default:"false" queryParam:"style=form,explode=true,name=strong"`
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
ClientID string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// A relatively friendly name for the client device
@@ -96,9 +48,9 @@ func (o *GetPinRequest) GetStrong() *bool {
return o.Strong
}
func (o *GetPinRequest) GetClientID() *string {
func (o *GetPinRequest) GetClientID() string {
if o == nil {
return nil
return ""
}
return o.ClientID
}

View File

@@ -23,6 +23,9 @@ const (
GetPlaylistContentsQueryParamTypeTvShow GetPlaylistContentsQueryParamType = 2
GetPlaylistContentsQueryParamTypeSeason GetPlaylistContentsQueryParamType = 3
GetPlaylistContentsQueryParamTypeEpisode GetPlaylistContentsQueryParamType = 4
GetPlaylistContentsQueryParamTypeAudio GetPlaylistContentsQueryParamType = 8
GetPlaylistContentsQueryParamTypeAlbum GetPlaylistContentsQueryParamType = 9
GetPlaylistContentsQueryParamTypeTrack GetPlaylistContentsQueryParamType = 10
)
func (e GetPlaylistContentsQueryParamType) ToPointer() *GetPlaylistContentsQueryParamType {
@@ -41,6 +44,12 @@ func (e *GetPlaylistContentsQueryParamType) UnmarshalJSON(data []byte) error {
case 3:
fallthrough
case 4:
fallthrough
case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = GetPlaylistContentsQueryParamType(v)
return nil
default:

View File

@@ -23,6 +23,9 @@ const (
TypeTvShow Type = 2
TypeSeason Type = 3
TypeEpisode Type = 4
TypeAudio Type = 8
TypeAlbum Type = 9
TypeTrack Type = 10
)
func (e Type) ToPointer() *Type {
@@ -41,6 +44,12 @@ func (e *Type) UnmarshalJSON(data []byte) error {
case 3:
fallthrough
case 4:
fallthrough
case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = Type(v)
return nil
default:
@@ -529,11 +538,13 @@ func (e *GetRecentlyAddedHubsType) UnmarshalJSON(data []byte) error {
}
}
// FlattenSeasons - Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
type FlattenSeasons string
const (
FlattenSeasonsFalse FlattenSeasons = "0"
FlattenSeasonsTrue FlattenSeasons = "1"
FlattenSeasonsLibraryDefault FlattenSeasons = "-1"
FlattenSeasonsHide FlattenSeasons = "0"
FlattenSeasonsShow FlattenSeasons = "1"
)
func (e FlattenSeasons) ToPointer() *FlattenSeasons {
@@ -545,6 +556,8 @@ func (e *FlattenSeasons) UnmarshalJSON(data []byte) error {
return err
}
switch v {
case "-1":
fallthrough
case "0":
fallthrough
case "1":
@@ -555,20 +568,77 @@ func (e *FlattenSeasons) UnmarshalJSON(data []byte) error {
}
}
// EpisodeSort - Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first).
type EpisodeSort string
const (
EpisodeSortLibraryDefault EpisodeSort = "-1"
EpisodeSortOldestFirst EpisodeSort = "0"
EpisodeSortNewestFirst EpisodeSort = "1"
)
func (e EpisodeSort) ToPointer() *EpisodeSort {
return &e
}
func (e *EpisodeSort) UnmarshalJSON(data []byte) error {
var v string
if err := json.Unmarshal(data, &v); err != nil {
return err
}
switch v {
case "-1":
fallthrough
case "0":
fallthrough
case "1":
*e = EpisodeSort(v)
return nil
default:
return fmt.Errorf("invalid value for EpisodeSort: %v", v)
}
}
// EnableCreditsMarkerGeneration - Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled).
type EnableCreditsMarkerGeneration string
const (
EnableCreditsMarkerGenerationLibraryDefault EnableCreditsMarkerGeneration = "-1"
EnableCreditsMarkerGenerationDisabled EnableCreditsMarkerGeneration = "0"
)
func (e EnableCreditsMarkerGeneration) ToPointer() *EnableCreditsMarkerGeneration {
return &e
}
func (e *EnableCreditsMarkerGeneration) UnmarshalJSON(data []byte) error {
var v string
if err := json.Unmarshal(data, &v); err != nil {
return err
}
switch v {
case "-1":
fallthrough
case "0":
*e = EnableCreditsMarkerGeneration(v)
return nil
default:
return fmt.Errorf("invalid value for EnableCreditsMarkerGeneration: %v", v)
}
}
// ShowOrdering - 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)).
// tvdbAiring = TheTVDB (Aired),
// tvdbDvd = TheTVDB (DVD),
// tvdbAbsolute = TheTVDB (Absolute)).
type ShowOrdering string
const (
ShowOrderingNone ShowOrdering = "None"
ShowOrderingTmdbAiring ShowOrdering = "tmdbAiring"
ShowOrderingAired ShowOrdering = "aired"
ShowOrderingDvd ShowOrdering = "dvd"
ShowOrderingAbsolute ShowOrdering = "absolute"
ShowOrderingNone ShowOrdering = "None"
ShowOrderingTmdbAiring ShowOrdering = "tmdbAiring"
ShowOrderingTvdbAiring ShowOrdering = "tvdbAiring"
ShowOrderingTvdbDvd ShowOrdering = "tvdbDvd"
ShowOrderingTvdbAbsolute ShowOrdering = "tvdbAbsolute"
)
func (e ShowOrdering) ToPointer() *ShowOrdering {
@@ -584,11 +654,11 @@ func (e *ShowOrdering) UnmarshalJSON(data []byte) error {
fallthrough
case "tmdbAiring":
fallthrough
case "aired":
case "tvdbAiring":
fallthrough
case "dvd":
case "tvdbDvd":
fallthrough
case "absolute":
case "tvdbAbsolute":
*e = ShowOrdering(v)
return nil
default:
@@ -1552,13 +1622,18 @@ type GetRecentlyAddedMetadata struct {
Year *int `json:"year,omitempty"`
SeasonCount *int `json:"seasonCount,omitempty"`
Tagline *string `json:"tagline,omitempty"`
FlattenSeasons *FlattenSeasons `default:"0" json:"flattenSeasons"`
// Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
FlattenSeasons *FlattenSeasons `json:"flattenSeasons,omitempty"`
// Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first).
EpisodeSort *EpisodeSort `json:"episodeSort,omitempty"`
// Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled).
EnableCreditsMarkerGeneration *EnableCreditsMarkerGeneration `json:"enableCreditsMarkerGeneration,omitempty"`
// 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)).
// tvdbAiring = TheTVDB (Aired),
// tvdbDvd = TheTVDB (DVD),
// tvdbAbsolute = TheTVDB (Absolute)).
//
ShowOrdering *ShowOrdering `json:"showOrdering,omitempty"`
Thumb *string `json:"thumb,omitempty"`
@@ -1769,6 +1844,20 @@ func (o *GetRecentlyAddedMetadata) GetFlattenSeasons() *FlattenSeasons {
return o.FlattenSeasons
}
func (o *GetRecentlyAddedMetadata) GetEpisodeSort() *EpisodeSort {
if o == nil {
return nil
}
return o.EpisodeSort
}
func (o *GetRecentlyAddedMetadata) GetEnableCreditsMarkerGeneration() *EnableCreditsMarkerGeneration {
if o == nil {
return nil
}
return o.EnableCreditsMarkerGeneration
}
func (o *GetRecentlyAddedMetadata) GetShowOrdering() *ShowOrdering {
if o == nil {
return nil

View File

@@ -23,6 +23,9 @@ const (
QueryParamTypeTvShow QueryParamType = 2
QueryParamTypeSeason QueryParamType = 3
QueryParamTypeEpisode QueryParamType = 4
QueryParamTypeAudio QueryParamType = 8
QueryParamTypeAlbum QueryParamType = 9
QueryParamTypeTrack QueryParamType = 10
)
func (e QueryParamType) ToPointer() *QueryParamType {
@@ -41,6 +44,12 @@ func (e *QueryParamType) UnmarshalJSON(data []byte) error {
case 3:
fallthrough
case 4:
fallthrough
case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = QueryParamType(v)
return nil
default:

View File

@@ -10,7 +10,7 @@ type GetResourcesStatisticsRequest struct {
// The timespan to retrieve statistics for
// the exact meaning of this parameter is not known
//
Timespan *int64 `queryParam:"style=form,explode=true,name=Timespan"`
Timespan *int64 `queryParam:"style=form,explode=true,name=timespan"`
}
func (o *GetResourcesStatisticsRequest) GetTimespan() *int64 {

View File

@@ -10,18 +10,6 @@ import (
"net/http"
)
type GetSearchAllLibrariesGlobals struct {
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
}
func (o *GetSearchAllLibrariesGlobals) GetClientID() *string {
if o == nil {
return nil
}
return o.ClientID
}
type SearchTypes string
const (
@@ -115,7 +103,7 @@ type GetSearchAllLibrariesRequest struct {
// The search query term.
Query string `queryParam:"style=form,explode=true,name=query"`
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
ClientID string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// Limit the number of results returned.
Limit *int64 `queryParam:"style=form,explode=true,name=limit"`
// A comma-separated list of search types to include. Valid values are: movies, music, otherVideos, people, tv.
@@ -145,9 +133,9 @@ func (o *GetSearchAllLibrariesRequest) GetQuery() string {
return o.Query
}
func (o *GetSearchAllLibrariesRequest) GetClientID() *string {
func (o *GetSearchAllLibrariesRequest) GetClientID() string {
if o == nil {
return nil
return ""
}
return o.ClientID
}
@@ -213,11 +201,13 @@ func (e *GetSearchAllLibrariesType) UnmarshalJSON(data []byte) error {
}
}
// GetSearchAllLibrariesFlattenSeasons - Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
type GetSearchAllLibrariesFlattenSeasons string
const (
GetSearchAllLibrariesFlattenSeasonsFalse GetSearchAllLibrariesFlattenSeasons = "0"
GetSearchAllLibrariesFlattenSeasonsTrue GetSearchAllLibrariesFlattenSeasons = "1"
GetSearchAllLibrariesFlattenSeasonsLibraryDefault GetSearchAllLibrariesFlattenSeasons = "-1"
GetSearchAllLibrariesFlattenSeasonsHide GetSearchAllLibrariesFlattenSeasons = "0"
GetSearchAllLibrariesFlattenSeasonsShow GetSearchAllLibrariesFlattenSeasons = "1"
)
func (e GetSearchAllLibrariesFlattenSeasons) ToPointer() *GetSearchAllLibrariesFlattenSeasons {
@@ -229,6 +219,8 @@ func (e *GetSearchAllLibrariesFlattenSeasons) UnmarshalJSON(data []byte) error {
return err
}
switch v {
case "-1":
fallthrough
case "0":
fallthrough
case "1":
@@ -239,20 +231,77 @@ func (e *GetSearchAllLibrariesFlattenSeasons) UnmarshalJSON(data []byte) error {
}
}
// GetSearchAllLibrariesEpisodeSort - Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first).
type GetSearchAllLibrariesEpisodeSort string
const (
GetSearchAllLibrariesEpisodeSortLibraryDefault GetSearchAllLibrariesEpisodeSort = "-1"
GetSearchAllLibrariesEpisodeSortOldestFirst GetSearchAllLibrariesEpisodeSort = "0"
GetSearchAllLibrariesEpisodeSortNewestFirst GetSearchAllLibrariesEpisodeSort = "1"
)
func (e GetSearchAllLibrariesEpisodeSort) ToPointer() *GetSearchAllLibrariesEpisodeSort {
return &e
}
func (e *GetSearchAllLibrariesEpisodeSort) UnmarshalJSON(data []byte) error {
var v string
if err := json.Unmarshal(data, &v); err != nil {
return err
}
switch v {
case "-1":
fallthrough
case "0":
fallthrough
case "1":
*e = GetSearchAllLibrariesEpisodeSort(v)
return nil
default:
return fmt.Errorf("invalid value for GetSearchAllLibrariesEpisodeSort: %v", v)
}
}
// GetSearchAllLibrariesEnableCreditsMarkerGeneration - Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled).
type GetSearchAllLibrariesEnableCreditsMarkerGeneration string
const (
GetSearchAllLibrariesEnableCreditsMarkerGenerationLibraryDefault GetSearchAllLibrariesEnableCreditsMarkerGeneration = "-1"
GetSearchAllLibrariesEnableCreditsMarkerGenerationDisabled GetSearchAllLibrariesEnableCreditsMarkerGeneration = "0"
)
func (e GetSearchAllLibrariesEnableCreditsMarkerGeneration) ToPointer() *GetSearchAllLibrariesEnableCreditsMarkerGeneration {
return &e
}
func (e *GetSearchAllLibrariesEnableCreditsMarkerGeneration) UnmarshalJSON(data []byte) error {
var v string
if err := json.Unmarshal(data, &v); err != nil {
return err
}
switch v {
case "-1":
fallthrough
case "0":
*e = GetSearchAllLibrariesEnableCreditsMarkerGeneration(v)
return nil
default:
return fmt.Errorf("invalid value for GetSearchAllLibrariesEnableCreditsMarkerGeneration: %v", v)
}
}
// GetSearchAllLibrariesShowOrdering - 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)).
// tvdbAiring = TheTVDB (Aired),
// tvdbDvd = TheTVDB (DVD),
// tvdbAbsolute = TheTVDB (Absolute)).
type GetSearchAllLibrariesShowOrdering string
const (
GetSearchAllLibrariesShowOrderingNone GetSearchAllLibrariesShowOrdering = "None"
GetSearchAllLibrariesShowOrderingTmdbAiring GetSearchAllLibrariesShowOrdering = "tmdbAiring"
GetSearchAllLibrariesShowOrderingAired GetSearchAllLibrariesShowOrdering = "aired"
GetSearchAllLibrariesShowOrderingDvd GetSearchAllLibrariesShowOrdering = "dvd"
GetSearchAllLibrariesShowOrderingAbsolute GetSearchAllLibrariesShowOrdering = "absolute"
GetSearchAllLibrariesShowOrderingNone GetSearchAllLibrariesShowOrdering = "None"
GetSearchAllLibrariesShowOrderingTmdbAiring GetSearchAllLibrariesShowOrdering = "tmdbAiring"
GetSearchAllLibrariesShowOrderingTvdbAiring GetSearchAllLibrariesShowOrdering = "tvdbAiring"
GetSearchAllLibrariesShowOrderingTvdbDvd GetSearchAllLibrariesShowOrdering = "tvdbDvd"
GetSearchAllLibrariesShowOrderingTvdbAbsolute GetSearchAllLibrariesShowOrdering = "tvdbAbsolute"
)
func (e GetSearchAllLibrariesShowOrdering) ToPointer() *GetSearchAllLibrariesShowOrdering {
@@ -268,11 +317,11 @@ func (e *GetSearchAllLibrariesShowOrdering) UnmarshalJSON(data []byte) error {
fallthrough
case "tmdbAiring":
fallthrough
case "aired":
case "tvdbAiring":
fallthrough
case "dvd":
case "tvdbDvd":
fallthrough
case "absolute":
case "tvdbAbsolute":
*e = GetSearchAllLibrariesShowOrdering(v)
return nil
default:
@@ -1226,23 +1275,28 @@ type GetSearchAllLibrariesMetadata struct {
LibrarySectionKey *string `json:"librarySectionKey,omitempty"`
// The type of media content
//
Type GetSearchAllLibrariesType `json:"type"`
Title string `json:"title"`
Slug *string `json:"slug,omitempty"`
ContentRating *string `json:"contentRating,omitempty"`
Summary string `json:"summary"`
Rating *float64 `json:"rating,omitempty"`
AudienceRating *float64 `json:"audienceRating,omitempty"`
Year *int `json:"year,omitempty"`
SeasonCount *int `json:"seasonCount,omitempty"`
Tagline *string `json:"tagline,omitempty"`
FlattenSeasons *GetSearchAllLibrariesFlattenSeasons `default:"0" json:"flattenSeasons"`
Type GetSearchAllLibrariesType `json:"type"`
Title string `json:"title"`
Slug *string `json:"slug,omitempty"`
ContentRating *string `json:"contentRating,omitempty"`
Summary string `json:"summary"`
Rating *float64 `json:"rating,omitempty"`
AudienceRating *float64 `json:"audienceRating,omitempty"`
Year *int `json:"year,omitempty"`
SeasonCount *int `json:"seasonCount,omitempty"`
Tagline *string `json:"tagline,omitempty"`
// Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
FlattenSeasons *GetSearchAllLibrariesFlattenSeasons `json:"flattenSeasons,omitempty"`
// Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first).
EpisodeSort *GetSearchAllLibrariesEpisodeSort `json:"episodeSort,omitempty"`
// Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled).
EnableCreditsMarkerGeneration *GetSearchAllLibrariesEnableCreditsMarkerGeneration `json:"enableCreditsMarkerGeneration,omitempty"`
// 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)).
// tvdbAiring = TheTVDB (Aired),
// tvdbDvd = TheTVDB (DVD),
// tvdbAbsolute = TheTVDB (Absolute)).
//
ShowOrdering *GetSearchAllLibrariesShowOrdering `json:"showOrdering,omitempty"`
Thumb *string `json:"thumb,omitempty"`
@@ -1453,6 +1507,20 @@ func (o *GetSearchAllLibrariesMetadata) GetFlattenSeasons() *GetSearchAllLibrari
return o.FlattenSeasons
}
func (o *GetSearchAllLibrariesMetadata) GetEpisodeSort() *GetSearchAllLibrariesEpisodeSort {
if o == nil {
return nil
}
return o.EpisodeSort
}
func (o *GetSearchAllLibrariesMetadata) GetEnableCreditsMarkerGeneration() *GetSearchAllLibrariesEnableCreditsMarkerGeneration {
if o == nil {
return nil
}
return o.EnableCreditsMarkerGeneration
}
func (o *GetSearchAllLibrariesMetadata) GetShowOrdering() *GetSearchAllLibrariesShowOrdering {
if o == nil {
return nil

View File

@@ -21,6 +21,9 @@ const (
GetSearchLibraryQueryParamTypeTvShow GetSearchLibraryQueryParamType = 2
GetSearchLibraryQueryParamTypeSeason GetSearchLibraryQueryParamType = 3
GetSearchLibraryQueryParamTypeEpisode GetSearchLibraryQueryParamType = 4
GetSearchLibraryQueryParamTypeAudio GetSearchLibraryQueryParamType = 8
GetSearchLibraryQueryParamTypeAlbum GetSearchLibraryQueryParamType = 9
GetSearchLibraryQueryParamTypeTrack GetSearchLibraryQueryParamType = 10
)
func (e GetSearchLibraryQueryParamType) ToPointer() *GetSearchLibraryQueryParamType {
@@ -39,6 +42,12 @@ func (e *GetSearchLibraryQueryParamType) UnmarshalJSON(data []byte) error {
case 3:
fallthrough
case 4:
fallthrough
case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = GetSearchLibraryQueryParamType(v)
return nil
default:

View File

@@ -14,18 +14,6 @@ var GetServerResourcesServerList = []string{
"https://plex.tv/api/v2",
}
type GetServerResourcesGlobals struct {
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
}
func (o *GetServerResourcesGlobals) GetClientID() *string {
if o == nil {
return nil
}
return o.ClientID
}
// IncludeHTTPS - Include Https entries in the results
type IncludeHTTPS int
@@ -118,7 +106,7 @@ type GetServerResourcesRequest struct {
// Include IPv6 entries in the results
IncludeIPv6 *IncludeIPv6 `default:"0" queryParam:"style=form,explode=true,name=includeIPv6"`
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
ClientID string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
}
func (g GetServerResourcesRequest) MarshalJSON() ([]byte, error) {
@@ -153,9 +141,9 @@ func (o *GetServerResourcesRequest) GetIncludeIPv6() *IncludeIPv6 {
return o.IncludeIPv6
}
func (o *GetServerResourcesRequest) GetClientID() *string {
func (o *GetServerResourcesRequest) GetClientID() string {
if o == nil {
return nil
return ""
}
return o.ClientID
}

View File

@@ -497,43 +497,45 @@ func (o *Session) GetLocation() *string {
}
type GetSessionsMetadata struct {
AddedAt *int `json:"addedAt,omitempty"`
Art *string `json:"art,omitempty"`
Duration *int `json:"duration,omitempty"`
GrandparentArt *string `json:"grandparentArt,omitempty"`
GrandparentGUID *string `json:"grandparentGuid,omitempty"`
GrandparentKey *string `json:"grandparentKey,omitempty"`
GrandparentRatingKey *string `json:"grandparentRatingKey,omitempty"`
GrandparentThumb *string `json:"grandparentThumb,omitempty"`
GrandparentTitle *string `json:"grandparentTitle,omitempty"`
GUID *string `json:"guid,omitempty"`
Index *int `json:"index,omitempty"`
Key *string `json:"key,omitempty"`
LibrarySectionID *string `json:"librarySectionID,omitempty"`
LibrarySectionKey *string `json:"librarySectionKey,omitempty"`
LibrarySectionTitle *string `json:"librarySectionTitle,omitempty"`
MusicAnalysisVersion *string `json:"musicAnalysisVersion,omitempty"`
ParentGUID *string `json:"parentGuid,omitempty"`
ParentIndex *int `json:"parentIndex,omitempty"`
ParentKey *string `json:"parentKey,omitempty"`
ParentRatingKey *string `json:"parentRatingKey,omitempty"`
ParentStudio *string `json:"parentStudio,omitempty"`
ParentThumb *string `json:"parentThumb,omitempty"`
ParentTitle *string `json:"parentTitle,omitempty"`
ParentYear *int `json:"parentYear,omitempty"`
RatingCount *int `json:"ratingCount,omitempty"`
RatingKey *string `json:"ratingKey,omitempty"`
SessionKey *string `json:"sessionKey,omitempty"`
Thumb *string `json:"thumb,omitempty"`
Title *string `json:"title,omitempty"`
TitleSort *string `json:"titleSort,omitempty"`
Type *string `json:"type,omitempty"`
UpdatedAt *int `json:"updatedAt,omitempty"`
ViewOffset *int `json:"viewOffset,omitempty"`
Media []GetSessionsMedia `json:"Media,omitempty"`
User *GetSessionsUser `json:"User,omitempty"`
Player *Player `json:"Player,omitempty"`
Session *Session `json:"Session,omitempty"`
AddedAt *int `json:"addedAt,omitempty"`
Art *string `json:"art,omitempty"`
Duration *int `json:"duration,omitempty"`
GrandparentArt *string `json:"grandparentArt,omitempty"`
GrandparentGUID *string `json:"grandparentGuid,omitempty"`
GrandparentKey *string `json:"grandparentKey,omitempty"`
GrandparentRatingKey *string `json:"grandparentRatingKey,omitempty"`
GrandparentThumb *string `json:"grandparentThumb,omitempty"`
GrandparentTitle *string `json:"grandparentTitle,omitempty"`
GUID *string `json:"guid,omitempty"`
Index *int `json:"index,omitempty"`
Key *string `json:"key,omitempty"`
LibrarySectionID *string `json:"librarySectionID,omitempty"`
LibrarySectionKey *string `json:"librarySectionKey,omitempty"`
LibrarySectionTitle *string `json:"librarySectionTitle,omitempty"`
MusicAnalysisVersion *string `json:"musicAnalysisVersion,omitempty"`
// The original untranslated name of the media item when non-english, or the track artist if an audio Item has an album artist
OriginalTitle *string `json:"originalTitle,omitempty"`
ParentGUID *string `json:"parentGuid,omitempty"`
ParentIndex *int `json:"parentIndex,omitempty"`
ParentKey *string `json:"parentKey,omitempty"`
ParentRatingKey *string `json:"parentRatingKey,omitempty"`
ParentStudio *string `json:"parentStudio,omitempty"`
ParentThumb *string `json:"parentThumb,omitempty"`
ParentTitle *string `json:"parentTitle,omitempty"`
ParentYear *int `json:"parentYear,omitempty"`
RatingCount *int `json:"ratingCount,omitempty"`
RatingKey *string `json:"ratingKey,omitempty"`
SessionKey *string `json:"sessionKey,omitempty"`
Thumb *string `json:"thumb,omitempty"`
Title *string `json:"title,omitempty"`
TitleSort *string `json:"titleSort,omitempty"`
Type *string `json:"type,omitempty"`
UpdatedAt *int `json:"updatedAt,omitempty"`
ViewOffset *int `json:"viewOffset,omitempty"`
Media []GetSessionsMedia `json:"Media,omitempty"`
User *GetSessionsUser `json:"User,omitempty"`
Player *Player `json:"Player,omitempty"`
Session *Session `json:"Session,omitempty"`
}
func (o *GetSessionsMetadata) GetAddedAt() *int {
@@ -648,6 +650,13 @@ func (o *GetSessionsMetadata) GetMusicAnalysisVersion() *string {
return o.MusicAnalysisVersion
}
func (o *GetSessionsMetadata) GetOriginalTitle() *string {
if o == nil {
return nil
}
return o.OriginalTitle
}
func (o *GetSessionsMetadata) GetParentGUID() *string {
if o == nil {
return nil

View File

@@ -10,7 +10,7 @@ type GetStatisticsRequest struct {
// The timespan to retrieve statistics for
// the exact meaning of this parameter is not known
//
Timespan *int64 `queryParam:"style=form,explode=true,name=Timespan"`
Timespan *int64 `queryParam:"style=form,explode=true,name=timespan"`
}
func (o *GetStatisticsRequest) GetTimespan() *int64 {

View File

@@ -12,59 +12,11 @@ var GetTokenByPinIDServerList = []string{
"https://plex.tv/api/v2",
}
type GetTokenByPinIDGlobals struct {
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// A relatively friendly name for the client device
DeviceNickname *string `header:"style=simple,explode=false,name=X-Plex-Device"`
// The version of the client application.
ClientVersion *string `header:"style=simple,explode=false,name=X-Plex-Version"`
// The platform of the client application.
Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"`
}
func (o *GetTokenByPinIDGlobals) GetClientID() *string {
if o == nil {
return nil
}
return o.ClientID
}
func (o *GetTokenByPinIDGlobals) GetClientName() *string {
if o == nil {
return nil
}
return o.ClientName
}
func (o *GetTokenByPinIDGlobals) GetDeviceNickname() *string {
if o == nil {
return nil
}
return o.DeviceNickname
}
func (o *GetTokenByPinIDGlobals) GetClientVersion() *string {
if o == nil {
return nil
}
return o.ClientVersion
}
func (o *GetTokenByPinIDGlobals) GetPlatform() *string {
if o == nil {
return nil
}
return o.Platform
}
type GetTokenByPinIDRequest struct {
// The PinID to retrieve an access token for
PinID int64 `pathParam:"style=simple,explode=false,name=pinID"`
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
ClientID string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// A relatively friendly name for the client device
@@ -82,9 +34,9 @@ func (o *GetTokenByPinIDRequest) GetPinID() int64 {
return o.PinID
}
func (o *GetTokenByPinIDRequest) GetClientID() *string {
func (o *GetTokenByPinIDRequest) GetClientID() string {
if o == nil {
return nil
return ""
}
return o.ClientID
}

View File

@@ -7,7 +7,6 @@ import (
"fmt"
"github.com/LukeHagar/plexgo/internal/utils"
"net/http"
"time"
)
var GetTokenDetailsServerList = []string{
@@ -498,11 +497,9 @@ func (o *GetTokenDetailsSubscription) GetPlan() *string {
// GetTokenDetailsUserPlexAccount - Logged in user details
type GetTokenDetailsUserPlexAccount struct {
// Unknown
AdsConsent *bool `json:"adsConsent"`
// Unknown
AdsConsentReminderAt *time.Time `json:"adsConsentReminderAt"`
// Unknown
AdsConsentSetAt *time.Time `json:"adsConsentSetAt"`
AdsConsent *bool `json:"adsConsent"`
AdsConsentReminderAt *int64 `json:"adsConsentReminderAt"`
AdsConsentSetAt *int64 `json:"adsConsentSetAt"`
// Unknown
Anonymous *bool `default:"false" json:"anonymous"`
// The account token
@@ -547,7 +544,7 @@ type GetTokenDetailsUserPlexAccount struct {
MaxHomeSize int `json:"maxHomeSize"`
// [Might be removed] The hashed Plex Home PIN
//
// Deprecated field: This will be removed in a future release, please migrate away from it as soon as possible.
// Deprecated: This will be removed in a future release, please migrate away from it as soon as possible.
Pin *string `json:"pin,omitempty"`
Profile UserProfile `json:"profile"`
// If the account has a Plex Home PIN enabled
@@ -597,14 +594,14 @@ func (o *GetTokenDetailsUserPlexAccount) GetAdsConsent() *bool {
return o.AdsConsent
}
func (o *GetTokenDetailsUserPlexAccount) GetAdsConsentReminderAt() *time.Time {
func (o *GetTokenDetailsUserPlexAccount) GetAdsConsentReminderAt() *int64 {
if o == nil {
return nil
}
return o.AdsConsentReminderAt
}
func (o *GetTokenDetailsUserPlexAccount) GetAdsConsentSetAt() *time.Time {
func (o *GetTokenDetailsUserPlexAccount) GetAdsConsentSetAt() *int64 {
if o == nil {
return nil
}

View File

@@ -23,6 +23,9 @@ const (
GetTopWatchedContentQueryParamTypeTvShow GetTopWatchedContentQueryParamType = 2
GetTopWatchedContentQueryParamTypeSeason GetTopWatchedContentQueryParamType = 3
GetTopWatchedContentQueryParamTypeEpisode GetTopWatchedContentQueryParamType = 4
GetTopWatchedContentQueryParamTypeAudio GetTopWatchedContentQueryParamType = 8
GetTopWatchedContentQueryParamTypeAlbum GetTopWatchedContentQueryParamType = 9
GetTopWatchedContentQueryParamTypeTrack GetTopWatchedContentQueryParamType = 10
)
func (e GetTopWatchedContentQueryParamType) ToPointer() *GetTopWatchedContentQueryParamType {
@@ -41,6 +44,12 @@ func (e *GetTopWatchedContentQueryParamType) UnmarshalJSON(data []byte) error {
case 3:
fallthrough
case 4:
fallthrough
case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = GetTopWatchedContentQueryParamType(v)
return nil
default:

View File

@@ -12,7 +12,6 @@ import (
var ErrUnsupportedOption = errors.New("unsupported option")
const (
SupportedOptionServerURL = "serverURL"
SupportedOptionRetries = "retries"
SupportedOptionTimeout = "timeout"
SupportedOptionAcceptHeaderOverride = "acceptHeaderOverride"
@@ -36,6 +35,7 @@ type Options struct {
Timeout *time.Duration
AcceptHeaderOverride *AcceptHeaderEnum
URLOverride *string
SetHeaders map[string]string
}
type Option func(*Options, ...string) error
@@ -43,10 +43,6 @@ type Option func(*Options, ...string) error
// WithServerURL allows providing an alternative server URL.
func WithServerURL(serverURL string) Option {
return func(opts *Options, supportedOptions ...string) error {
if !utils.Contains(supportedOptions, SupportedOptionServerURL) {
return ErrUnsupportedOption
}
opts.ServerURL = &serverURL
return nil
}
@@ -55,10 +51,6 @@ func WithServerURL(serverURL string) Option {
// WithTemplatedServerURL allows providing an alternative server URL with templated parameters.
func WithTemplatedServerURL(serverURL string, params map[string]string) Option {
return func(opts *Options, supportedOptions ...string) error {
if !utils.Contains(supportedOptions, SupportedOptionServerURL) {
return ErrUnsupportedOption
}
if params != nil {
serverURL = utils.ReplaceParameters(serverURL, params)
}
@@ -114,3 +106,12 @@ func WithURLOverride(urlOverride string) Option {
return nil
}
}
// WithSetHeaders takes a map of headers that will applied to a request. If the
// request contains headers that are in the map then they will be overwritten.
func WithSetHeaders(hdrs map[string]string) Option {
return func(opts *Options, supportedOptions ...string) error {
opts.SetHeaders = hdrs
return nil
}
}

View File

@@ -7,61 +7,12 @@ import (
"fmt"
"github.com/LukeHagar/plexgo/internal/utils"
"net/http"
"time"
)
var PostUsersSignInDataServerList = []string{
"https://plex.tv/api/v2",
}
type PostUsersSignInDataGlobals struct {
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// A relatively friendly name for the client device
DeviceNickname *string `header:"style=simple,explode=false,name=X-Plex-Device"`
// The version of the client application.
ClientVersion *string `header:"style=simple,explode=false,name=X-Plex-Version"`
// The platform of the client application.
Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"`
}
func (o *PostUsersSignInDataGlobals) GetClientID() *string {
if o == nil {
return nil
}
return o.ClientID
}
func (o *PostUsersSignInDataGlobals) GetClientName() *string {
if o == nil {
return nil
}
return o.ClientName
}
func (o *PostUsersSignInDataGlobals) GetDeviceNickname() *string {
if o == nil {
return nil
}
return o.DeviceNickname
}
func (o *PostUsersSignInDataGlobals) GetClientVersion() *string {
if o == nil {
return nil
}
return o.ClientVersion
}
func (o *PostUsersSignInDataGlobals) GetPlatform() *string {
if o == nil {
return nil
}
return o.Platform
}
// PostUsersSignInDataRequestBody - Login credentials
type PostUsersSignInDataRequestBody struct {
Login string `form:"name=login"`
@@ -111,7 +62,7 @@ func (o *PostUsersSignInDataRequestBody) GetVerificationCode() *string {
type PostUsersSignInDataRequest struct {
// An opaque identifier unique to the client (UUID, serial number, or other unique device ID)
ClientID *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
ClientID string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"`
// The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// A relatively friendly name for the client device
@@ -124,9 +75,9 @@ type PostUsersSignInDataRequest struct {
RequestBody *PostUsersSignInDataRequestBody `request:"mediaType=application/x-www-form-urlencoded"`
}
func (o *PostUsersSignInDataRequest) GetClientID() *string {
func (o *PostUsersSignInDataRequest) GetClientID() string {
if o == nil {
return nil
return ""
}
return o.ClientID
}
@@ -832,11 +783,9 @@ type Trials struct {
// PostUsersSignInDataUserPlexAccount - Returns the user account data with a valid auth token
type PostUsersSignInDataUserPlexAccount struct {
// Unknown
AdsConsent *bool `json:"adsConsent"`
// Unknown
AdsConsentReminderAt *time.Time `json:"adsConsentReminderAt"`
// Unknown
AdsConsentSetAt *time.Time `json:"adsConsentSetAt"`
AdsConsent *bool `json:"adsConsent"`
AdsConsentReminderAt *int64 `json:"adsConsentReminderAt"`
AdsConsentSetAt *int64 `json:"adsConsentSetAt"`
// Unknown
Anonymous *bool `default:"false" json:"anonymous"`
// The account token
@@ -881,7 +830,7 @@ type PostUsersSignInDataUserPlexAccount struct {
MaxHomeSize int `json:"maxHomeSize"`
// [Might be removed] The hashed Plex Home PIN
//
// Deprecated field: This will be removed in a future release, please migrate away from it as soon as possible.
// Deprecated: This will be removed in a future release, please migrate away from it as soon as possible.
Pin *string `json:"pin,omitempty"`
Profile PostUsersSignInDataUserProfile `json:"profile"`
// If the account has a Plex Home PIN enabled
@@ -933,14 +882,14 @@ func (o *PostUsersSignInDataUserPlexAccount) GetAdsConsent() *bool {
return o.AdsConsent
}
func (o *PostUsersSignInDataUserPlexAccount) GetAdsConsentReminderAt() *time.Time {
func (o *PostUsersSignInDataUserPlexAccount) GetAdsConsentReminderAt() *int64 {
if o == nil {
return nil
}
return o.AdsConsentReminderAt
}
func (o *PostUsersSignInDataUserPlexAccount) GetAdsConsentSetAt() *time.Time {
func (o *PostUsersSignInDataUserPlexAccount) GetAdsConsentSetAt() *int64 {
if o == nil {
return nil
}

File diff suppressed because it is too large Load Diff

499
plex.go

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,6 @@ import (
"context"
"encoding/json"
"fmt"
"github.com/LukeHagar/plexgo/internal/globals"
"github.com/LukeHagar/plexgo/internal/hooks"
"github.com/LukeHagar/plexgo/internal/utils"
"github.com/LukeHagar/plexgo/models/components"
@@ -58,7 +57,6 @@ type sdkConfiguration struct {
SDKVersion string
GenVersion string
UserAgent string
Globals globals.Globals
RetryConfig *retry.Config
Hooks *hooks.Hooks
Timeout *time.Duration
@@ -281,41 +279,6 @@ func WithSecuritySource(security func(context.Context) (components.Security, err
}
}
// WithClientID allows setting the ClientID parameter for all supported operations
func WithClientID(clientID string) SDKOption {
return func(sdk *PlexAPI) {
sdk.sdkConfiguration.Globals.ClientID = &clientID
}
}
// WithClientName allows setting the ClientName parameter for all supported operations
func WithClientName(clientName string) SDKOption {
return func(sdk *PlexAPI) {
sdk.sdkConfiguration.Globals.ClientName = &clientName
}
}
// WithClientVersion allows setting the ClientVersion parameter for all supported operations
func WithClientVersion(clientVersion string) SDKOption {
return func(sdk *PlexAPI) {
sdk.sdkConfiguration.Globals.ClientVersion = &clientVersion
}
}
// WithPlatform allows setting the Platform parameter for all supported operations
func WithPlatform(platform string) SDKOption {
return func(sdk *PlexAPI) {
sdk.sdkConfiguration.Globals.Platform = &platform
}
}
// WithDeviceNickname allows setting the DeviceNickname parameter for all supported operations
func WithDeviceNickname(deviceNickname string) SDKOption {
return func(sdk *PlexAPI) {
sdk.sdkConfiguration.Globals.DeviceNickname = &deviceNickname
}
}
func WithRetryConfig(retryConfig retry.Config) SDKOption {
return func(sdk *PlexAPI) {
sdk.sdkConfiguration.RetryConfig = &retryConfig
@@ -335,10 +298,9 @@ func New(opts ...SDKOption) *PlexAPI {
sdkConfiguration: sdkConfiguration{
Language: "go",
OpenAPIDocVersion: "0.0.3",
SDKVersion: "0.15.0",
GenVersion: "2.429.0",
UserAgent: "speakeasy-sdk/go 0.15.0 2.429.0 0.0.3 github.com/LukeHagar/plexgo",
Globals: globals.Globals{},
SDKVersion: "0.17.2",
GenVersion: "2.496.0",
UserAgent: "speakeasy-sdk/go 0.17.2 2.496.0 0.0.3 github.com/LukeHagar/plexgo",
ServerDefaults: []map[string]string{
{
"protocol": "https",

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