Compare commits

..

5 Commits

Author SHA1 Message Date
speakeasybot
6db5d8fb30 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.484.1 2025-02-06 00:10:27 +00:00
speakeasybot
89fbd6238e ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.476.2 2025-01-28 00:10:16 +00:00
speakeasybot
7af7441ac7 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.476.0 2025-01-25 00:10:13 +00:00
speakeasybot
d1945b544b ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.459.2 2024-12-23 00:10:53 +00:00
speakeasybot
16bb49d558 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.459.2 2024-12-21 00:10:31 +00:00
123 changed files with 5089 additions and 4530 deletions

1
.gitignore vendored
View File

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

File diff suppressed because one or more lines are too long

View File

@@ -13,7 +13,7 @@ generation:
oAuth2ClientCredentialsEnabled: true oAuth2ClientCredentialsEnabled: true
oAuth2PasswordEnabled: false oAuth2PasswordEnabled: false
go: go:
version: 0.16.1 version: 0.17.4
additionalDependencies: {} additionalDependencies: {}
allowUnknownFieldsInWeakUnions: false allowUnknownFieldsInWeakUnions: false
clientServerStatusCodesAsErrors: true clientServerStatusCodesAsErrors: true

View File

@@ -1,4 +1,4 @@
speakeasyVersion: 1.438.3 speakeasyVersion: 1.484.1
sources: sources:
my-source: my-source:
sourceNamespace: my-source sourceNamespace: my-source
@@ -9,19 +9,19 @@ sources:
- main - main
plexapi: plexapi:
sourceNamespace: plexapi sourceNamespace: plexapi
sourceRevisionDigest: sha256:37c6bfb15f4154eb89b112465107f20757411f22bd1cc7d0a04335df7127fcb4 sourceRevisionDigest: sha256:0b88c8bfc41def63e19e91fdd4d51bab07cb947cc3d39d2b44e8523a209cec10
sourceBlobDigest: sha256:290473ebc909cada80ff428c685b897f4621cf121397e1417355e06d334e7206 sourceBlobDigest: sha256:89d5b8427d4fb61b25751aebbaf71f9613958e9e91073fc084fed2c2ec62ce55
tags: tags:
- latest - latest
- main - speakeasy-sdk-regen-1738800558
targets: targets:
plexgo: plexgo:
source: plexapi source: plexapi
sourceNamespace: plexapi sourceNamespace: plexapi
sourceRevisionDigest: sha256:37c6bfb15f4154eb89b112465107f20757411f22bd1cc7d0a04335df7127fcb4 sourceRevisionDigest: sha256:0b88c8bfc41def63e19e91fdd4d51bab07cb947cc3d39d2b44e8523a209cec10
sourceBlobDigest: sha256:290473ebc909cada80ff428c685b897f4621cf121397e1417355e06d334e7206 sourceBlobDigest: sha256:89d5b8427d4fb61b25751aebbaf71f9613958e9e91073fc084fed2c2ec62ce55
codeSamplesNamespace: code-samples-go-plexgo codeSamplesNamespace: code-samples-go-plexgo
codeSamplesRevisionDigest: sha256:3d3923d5080a3df76181c5e2c153e6f9c88470f8366cbdea5628bb47fd67fd1b codeSamplesRevisionDigest: sha256:56fbdcee207bdfb0340ee02eaeacfb389357affe2899881837f41fa2b7b5b043
workflow: workflow:
workflowVersion: 1.0.0 workflowVersion: 1.0.0
speakeasyVersion: latest speakeasyVersion: latest

View File

@@ -40,16 +40,24 @@ The following SDKs are generated from the OpenAPI Specification. They are automa
<!-- Start Table of Contents [toc] --> <!-- Start Table of Contents [toc] -->
## Table of Contents ## Table of Contents
<!-- $toc-max-depth=2 -->
* [github.com/LukeHagar/plexgo](#githubcomlukehagarplexgo)
* [Plex Media Server OpenAPI Specification](#plex-media-server-openapi-specification)
* [Documentation](#documentation)
* [SDKs](#sdks)
* [SDK Installation](#sdk-installation)
* [SDK Example Usage](#sdk-example-usage)
* [Available Resources and Operations](#available-resources-and-operations)
* [Retries](#retries)
* [Error Handling](#error-handling)
* [Server Selection](#server-selection)
* [Custom HTTP Client](#custom-http-client)
* [Authentication](#authentication)
* [Special Types](#special-types)
* [Development](#development)
* [Maturity](#maturity)
* [Contributions](#contributions)
* [SDK Installation](#sdk-installation)
* [SDK Example Usage](#sdk-example-usage)
* [Available Resources and Operations](#available-resources-and-operations)
* [Retries](#retries)
* [Error Handling](#error-handling)
* [Server Selection](#server-selection)
* [Custom HTTP Client](#custom-http-client)
* [Authentication](#authentication)
* [Special Types](#special-types)
<!-- End Table of Contents [toc] --> <!-- End Table of Contents [toc] -->
<!-- Start SDK Installation [installation] --> <!-- Start SDK Installation [installation] -->
@@ -76,16 +84,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -140,6 +144,8 @@ func main() {
* [GetLibraryItems](docs/sdks/library/README.md#getlibraryitems) - Get Library Items * [GetLibraryItems](docs/sdks/library/README.md#getlibraryitems) - Get Library Items
* [GetRefreshLibraryMetadata](docs/sdks/library/README.md#getrefreshlibrarymetadata) - Refresh Metadata Of The Library * [GetRefreshLibraryMetadata](docs/sdks/library/README.md#getrefreshlibrarymetadata) - Refresh Metadata Of The Library
* [GetSearchLibrary](docs/sdks/library/README.md#getsearchlibrary) - Search Library * [GetSearchLibrary](docs/sdks/library/README.md#getsearchlibrary) - Search Library
* [GetGenresLibrary](docs/sdks/library/README.md#getgenreslibrary) - Get Genres of library media
* [GetCountriesLibrary](docs/sdks/library/README.md#getcountrieslibrary) - Get Countries of library media
* [GetSearchAllLibraries](docs/sdks/library/README.md#getsearchalllibraries) - Search All Libraries * [GetSearchAllLibraries](docs/sdks/library/README.md#getsearchalllibraries) - Search All Libraries
* [GetMetaDataByRatingKey](docs/sdks/library/README.md#getmetadatabyratingkey) - Get Metadata by RatingKey * [GetMetaDataByRatingKey](docs/sdks/library/README.md#getmetadatabyratingkey) - Get Metadata by RatingKey
* [GetMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children * [GetMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children
@@ -250,16 +256,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx, operations.WithRetries( res, err := s.Server.GetServerCapabilities(ctx, operations.WithRetries(
retry.Config{ retry.Config{
Strategy: "backoff", Strategy: "backoff",
@@ -293,6 +295,8 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithRetryConfig( plexgo.WithRetryConfig(
retry.Config{ retry.Config{
@@ -306,14 +310,8 @@ func main() {
RetryConnectionErrors: false, RetryConnectionErrors: false,
}), }),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -355,16 +353,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
@@ -414,17 +408,13 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithServerURL("https://10.10.10.47:32400"), plexgo.WithServerURL("https://10.10.10.47:32400"),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -450,16 +440,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Plex.GetCompanionsData(ctx, operations.WithServerURL("https://plex.tv/api/v2")) res, err := s.Plex.GetCompanionsData(ctx, operations.WithServerURL("https://plex.tv/api/v2"))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -523,16 +509,12 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -972,4 +972,54 @@ Based on:
### Generated ### Generated
- [go v0.16.1] . - [go v0.16.1] .
### Releases ### Releases
- [Go v0.16.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.16.1 - . - [Go v0.16.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.16.1 - .
## 2024-12-21 00:09:02
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.459.2 (2.483.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.0] .
### Releases
- [Go v0.17.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.0 - .
## 2024-12-23 00:09:31
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.459.2 (2.483.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.1] .
### Releases
- [Go v0.17.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.1 - .
## 2025-01-25 00:08:47
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.476.0 (2.496.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.2] .
### Releases
- [Go v0.17.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.2 - .
## 2025-01-28 00:08:53
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.476.2 (2.495.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.3] .
### Releases
- [Go v0.17.3] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.3 - .
## 2025-02-06 00:09:00
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.484.1 (2.503.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.4] .
### Releases
- [Go v0.17.4] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.4 - .

View File

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

View File

@@ -10,7 +10,7 @@ import (
"github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/internal/utils"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/cenkalti/backoff/v4" "github.com/LukeHagar/plexgo/retry"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -54,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") opURL, err := url.JoinPath(baseURL, "/activities")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -82,6 +87,10 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -112,7 +121,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -240,7 +253,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -285,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) opURL, err := utils.GenerateURL(ctx, baseURL, "/activities/{activityUUID}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -313,6 +335,10 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -343,7 +369,11 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -451,7 +481,11 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {

View File

@@ -10,7 +10,7 @@ import (
"github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/internal/utils"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/cenkalti/backoff/v4" "github.com/LukeHagar/plexgo/retry"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -53,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") opURL, err := url.JoinPath(baseURL, "/security/token")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -85,6 +90,10 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -115,7 +124,11 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -223,7 +236,11 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -269,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") opURL, err := url.JoinPath(baseURL, "/security/resources")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -301,6 +323,10 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -331,7 +357,11 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -439,7 +469,11 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -470,7 +504,6 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
operations.SupportedOptionTimeout, operations.SupportedOptionTimeout,
} }
@@ -513,6 +546,10 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -543,7 +580,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -671,7 +712,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -700,17 +745,8 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
SecuritySource: nil, SecuritySource: nil,
} }
globals := operations.PostUsersSignInDataGlobals{
ClientID: s.sdkConfiguration.Globals.ClientID,
ClientName: s.sdkConfiguration.Globals.ClientName,
DeviceNickname: s.sdkConfiguration.Globals.DeviceNickname,
ClientVersion: s.sdkConfiguration.Globals.ClientVersion,
Platform: s.sdkConfiguration.Globals.Platform,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
operations.SupportedOptionTimeout, operations.SupportedOptionTimeout,
} }
@@ -753,9 +789,15 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
} }
req.Header.Set("Accept", "application/json") req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent)
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 globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
@@ -787,7 +829,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -915,7 +961,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, request operat
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {

117
butler.go
View File

@@ -10,7 +10,7 @@ import (
"github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/internal/utils"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/cenkalti/backoff/v4" "github.com/LukeHagar/plexgo/retry"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -48,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") opURL, err := url.JoinPath(baseURL, "/butler")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -76,6 +81,10 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -106,7 +115,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -234,7 +247,11 @@ func (s *Butler) GetButlerTasks(ctx context.Context, opts ...operations.Option)
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -279,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") opURL, err := url.JoinPath(baseURL, "/butler")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -307,6 +329,10 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -337,7 +363,11 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -445,7 +475,11 @@ func (s *Butler) StartAllTasks(ctx context.Context, opts ...operations.Option) (
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -486,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") opURL, err := url.JoinPath(baseURL, "/butler")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -514,6 +553,10 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -544,7 +587,11 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -652,7 +699,11 @@ func (s *Butler) StopAllTasks(ctx context.Context, opts ...operations.Option) (*
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -701,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) opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{taskName}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -729,6 +785,10 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -759,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) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -869,7 +933,11 @@ func (s *Butler) StartTask(ctx context.Context, taskName operations.TaskName, op
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -914,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) opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{taskName}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -942,6 +1015,10 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -972,7 +1049,11 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -1082,7 +1163,11 @@ func (s *Butler) StopTask(ctx context.Context, taskName operations.PathParamTask
case httpRes.StatusCode == 404: case httpRes.StatusCode == 404:
fallthrough fallthrough
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {

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 # FlattenSeasons
Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
## Values ## Values
| Name | Value | | Name | Value |
| --------------------- | --------------------- | | ------------------------------ | ------------------------------ |
| `FlattenSeasonsFalse` | 0 | | `FlattenSeasonsLibraryDefault` | -1 |
| `FlattenSeasonsTrue` | 1 | | `FlattenSeasonsHide` | 0 |
| `FlattenSeasonsShow` | 1 |

View File

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

View File

@@ -0,0 +1,22 @@
# GetCountriesLibraryMediaContainer
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `Size` | *float64* | :heavy_check_mark: | N/A | 50 |
| `Offset` | **int* | :heavy_minus_sign: | N/A | |
| `TotalSize` | **int* | :heavy_minus_sign: | N/A | |
| `Identifier` | *string* | :heavy_check_mark: | N/A | com.plexapp.plugins.library |
| `AllowSync` | *bool* | :heavy_check_mark: | N/A | false |
| `Art` | *string* | :heavy_check_mark: | N/A | /:/resources/show-fanart.jpg |
| `Content` | *string* | :heavy_check_mark: | N/A | secondary |
| `MediaTagPrefix` | *string* | :heavy_check_mark: | N/A | /system/bundle/media/flags/ |
| `MediaTagVersion` | *int64* | :heavy_check_mark: | N/A | 1734362201 |
| `Nocache` | *bool* | :heavy_check_mark: | N/A | true |
| `Thumb` | *string* | :heavy_check_mark: | N/A | /:/resources/show.png |
| `Title1` | *string* | :heavy_check_mark: | N/A | TV Series |
| `Title2` | *string* | :heavy_check_mark: | N/A | By Country |
| `ViewGroup` | *string* | :heavy_check_mark: | N/A | secondary |
| `Directory` | [][operations.GetCountriesLibraryDirectory](../../models/operations/getcountrieslibrarydirectory.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,8 @@
# GetCountriesLibraryRequest
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,22 @@
# GetGenresLibraryMediaContainer
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `Size` | *float64* | :heavy_check_mark: | N/A | 50 |
| `Offset` | **int* | :heavy_minus_sign: | N/A | |
| `TotalSize` | **int* | :heavy_minus_sign: | N/A | |
| `Identifier` | *string* | :heavy_check_mark: | N/A | com.plexapp.plugins.library |
| `AllowSync` | *bool* | :heavy_check_mark: | N/A | false |
| `Art` | *string* | :heavy_check_mark: | N/A | /:/resources/show-fanart.jpg |
| `Content` | *string* | :heavy_check_mark: | N/A | secondary |
| `MediaTagPrefix` | *string* | :heavy_check_mark: | N/A | /system/bundle/media/flags/ |
| `MediaTagVersion` | *int64* | :heavy_check_mark: | N/A | 1734362201 |
| `Nocache` | *bool* | :heavy_check_mark: | N/A | true |
| `Thumb` | *string* | :heavy_check_mark: | N/A | /:/resources/show.png |
| `Title1` | *string* | :heavy_check_mark: | N/A | TV Shows (Reality) |
| `Title2` | *string* | :heavy_check_mark: | N/A | By Genre |
| `ViewGroup` | *string* | :heavy_check_mark: | N/A | secondary |
| `Directory` | [][operations.GetGenresLibraryDirectory](../../models/operations/getgenreslibrarydirectory.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,8 @@
# GetGenresLibraryRequest
## Fields
| Field | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `SectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |

View File

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

View File

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

View File

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

View File

@@ -23,8 +23,10 @@
| `Year` | **int* | :heavy_minus_sign: | N/A | 2022 | | `Year` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 | | `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. | | `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. |
| `FlattenSeasons` | [*operations.GetLibraryItemsFlattenSeasons](../../models/operations/getlibraryitemsflattenseasons.md) | :heavy_minus_sign: | N/A | 1 | | `FlattenSeasons` | [*operations.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 |
| `ShowOrdering` | [*operations.GetLibraryItemsShowOrdering](../../models/operations/getlibraryitemsshowordering.md) | :heavy_minus_sign: | Setting that indicates the episode ordering for the show <br/>None = Library default, <br/>tmdbAiring = The Movie Database (Aired), <br/>aired = TheTVDB (Aired), <br/>dvd = TheTVDB (DVD), <br/>absolute = TheTVDB (Absolute)).<br/> | dvd | | `EpisodeSort` | [*operations.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/>aired = TheTVDB (Aired),<br/>dvd = TheTVDB (DVD),<br/>absolute = TheTVDB (Absolute)).<br/> | absolute |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 | | `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 | | `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 |
| `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 | | `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 |

View File

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

View File

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

View File

@@ -14,6 +14,11 @@
| `LibrarySectionTitle` | **string* | :heavy_minus_sign: | N/A | Movies | | `LibrarySectionTitle` | **string* | :heavy_minus_sign: | N/A | Movies |
| `LibrarySectionID` | **int* | :heavy_minus_sign: | N/A | 1 | | `LibrarySectionID` | **int* | :heavy_minus_sign: | N/A | 1 |
| `LibrarySectionKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/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 | | `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. | | `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 | | `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 | | 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/> | | | `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 | | `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 | | `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 | | `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |

View File

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

View File

@@ -9,6 +9,6 @@
| `Offset` | **int* | :heavy_minus_sign: | N/A | | | `Offset` | **int* | :heavy_minus_sign: | N/A | |
| `TotalSize` | **int* | :heavy_minus_sign: | N/A | | | `TotalSize` | **int* | :heavy_minus_sign: | N/A | |
| `Identifier` | **string* | :heavy_minus_sign: | N/A | com.plexapp.plugins.library | | `Identifier` | **string* | :heavy_minus_sign: | N/A | com.plexapp.plugins.library |
| `AllowSync` | **bool* | :heavy_minus_sign: | N/A | | | `AllowSync` | **bool* | :heavy_minus_sign: | N/A | false |
| `Meta` | [*operations.Meta](../../models/operations/meta.md) | :heavy_minus_sign: | The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.<br/> | | | `Meta` | [*operations.Meta](../../models/operations/meta.md) | :heavy_minus_sign: | The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.<br/> | |
| `Metadata` | [][operations.GetRecentlyAddedMetadata](../../models/operations/getrecentlyaddedmetadata.md) | :heavy_minus_sign: | N/A | | | `Metadata` | [][operations.GetRecentlyAddedMetadata](../../models/operations/getrecentlyaddedmetadata.md) | :heavy_minus_sign: | N/A | |

View File

@@ -23,8 +23,10 @@
| `Year` | **int* | :heavy_minus_sign: | N/A | 2022 | | `Year` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 | | `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. | | `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. |
| `FlattenSeasons` | [*operations.FlattenSeasons](../../models/operations/flattenseasons.md) | :heavy_minus_sign: | N/A | 1 | | `FlattenSeasons` | [*operations.FlattenSeasons](../../models/operations/flattenseasons.md) | :heavy_minus_sign: | Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). | 1 |
| `ShowOrdering` | [*operations.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 | | `EpisodeSort` | [*operations.EpisodeSort](../../models/operations/episodesort.md) | :heavy_minus_sign: | Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first). | 0 |
| `EnableCreditsMarkerGeneration` | [*operations.EnableCreditsMarkerGeneration](../../models/operations/enablecreditsmarkergeneration.md) | :heavy_minus_sign: | Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). | -1 |
| `ShowOrdering` | [*operations.ShowOrdering](../../models/operations/showordering.md) | :heavy_minus_sign: | Setting that indicates the episode ordering for the show.<br/>None = Library default,<br/>tmdbAiring = The Movie Database (Aired),<br/>aired = TheTVDB (Aired),<br/>dvd = TheTVDB (DVD),<br/>absolute = TheTVDB (Absolute)).<br/> | absolute |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 | | `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 | | `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 |
| `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 | | `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 |

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 # GetSearchAllLibrariesFlattenSeasons
Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
## Values ## Values
| Name | Value | | Name | Value |
| ------------------------------------------ | ------------------------------------------ | | --------------------------------------------------- | --------------------------------------------------- |
| `GetSearchAllLibrariesFlattenSeasonsFalse` | 0 | | `GetSearchAllLibrariesFlattenSeasonsLibraryDefault` | -1 |
| `GetSearchAllLibrariesFlattenSeasonsTrue` | 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 | | `Year` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 | | `SeasonCount` | **int* | :heavy_minus_sign: | N/A | 2022 |
| `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. | | `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. |
| `FlattenSeasons` | [*operations.GetSearchAllLibrariesFlattenSeasons](../../models/operations/getsearchalllibrariesflattenseasons.md) | :heavy_minus_sign: | N/A | 1 | | `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 |
| `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 | | `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/>aired = TheTVDB (Aired),<br/>dvd = TheTVDB (DVD),<br/>absolute = TheTVDB (Absolute)).<br/> | absolute |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 | | `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 | | `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 |
| `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 | | `Banner` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/banner/1703239236 |

View File

@@ -6,7 +6,7 @@
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `Query` | *string* | :heavy_check_mark: | The search query term. | | | `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. | | | `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 | | `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 | | `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 # GetSearchAllLibrariesShowOrdering
Setting that indicates the episode ordering for the show Setting that indicates the episode ordering for the show.
None = Library default, None = Library default,
tmdbAiring = The Movie Database (Aired), tmdbAiring = The Movie Database (Aired),
aired = TheTVDB (Aired), aired = TheTVDB (Aired),
dvd = TheTVDB (DVD), dvd = TheTVDB (DVD),
absolute = TheTVDB (Absolute)). absolute = TheTVDB (Absolute)).
## Values ## Values
| Name | Value | | Name | Value |
| --------------------------------------------- | --------------------------------------------- | | ----------------------------------------------- | ----------------------------------------------- |
| `GetSearchAllLibrariesShowOrderingNone` | None | | `GetSearchAllLibrariesShowOrderingNone` | None |
| `GetSearchAllLibrariesShowOrderingTmdbAiring` | tmdbAiring | | `GetSearchAllLibrariesShowOrderingTmdbAiring` | tmdbAiring |
| `GetSearchAllLibrariesShowOrderingAired` | aired | | `GetSearchAllLibrariesShowOrderingTvdbAired` | aired |
| `GetSearchAllLibrariesShowOrderingDvd` | dvd | | `GetSearchAllLibrariesShowOrderingTvdbDvd` | dvd |
| `GetSearchAllLibrariesShowOrderingAbsolute` | absolute | | `GetSearchAllLibrariesShowOrderingTvdbAbsolute` | absolute |

View File

@@ -17,4 +17,6 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `GetSearchLibraryQueryParamTypeTvShow` | 2 | | `GetSearchLibraryQueryParamTypeTvShow` | 2 |
| `GetSearchLibraryQueryParamTypeSeason` | 3 | | `GetSearchLibraryQueryParamTypeSeason` | 3 |
| `GetSearchLibraryQueryParamTypeEpisode` | 4 | | `GetSearchLibraryQueryParamTypeEpisode` | 4 |
| `GetSearchLibraryQueryParamTypeAudio` | 8 | | `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 | | `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 | | `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 | | `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 ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `AddedAt` | **int* | :heavy_minus_sign: | N/A | 1705543312 | | `AddedAt` | **int* | :heavy_minus_sign: | N/A | 1705543312 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 | | `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 |
| `Duration` | **int* | :heavy_minus_sign: | N/A | 186240 | | `Duration` | **int* | :heavy_minus_sign: | N/A | 186240 |
| `GrandparentArt` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 | | `GrandparentArt` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/art/1705310687 |
| `GrandparentGUID` | **string* | :heavy_minus_sign: | N/A | plex://artist/5d07bbfd403c6402904a6480 | | `GrandparentGUID` | **string* | :heavy_minus_sign: | N/A | plex://artist/5d07bbfd403c6402904a6480 |
| `GrandparentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904 | | `GrandparentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904 |
| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | N/A | 39904 | | `GrandparentRatingKey` | **string* | :heavy_minus_sign: | N/A | 39904 |
| `GrandparentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/thumb/1705310687 | | `GrandparentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/39904/thumb/1705310687 |
| `GrandparentTitle` | **string* | :heavy_minus_sign: | N/A | Green Day | | `GrandparentTitle` | **string* | :heavy_minus_sign: | N/A | Green Day |
| `GUID` | **string* | :heavy_minus_sign: | N/A | plex://track/6535834f71f22f36f71a8e8f | | `GUID` | **string* | :heavy_minus_sign: | N/A | plex://track/6535834f71f22f36f71a8e8f |
| `Index` | **int* | :heavy_minus_sign: | N/A | 1 | | `Index` | **int* | :heavy_minus_sign: | N/A | 1 |
| `Key` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67085 | | `Key` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67085 |
| `LibrarySectionID` | **string* | :heavy_minus_sign: | N/A | 3 | | `LibrarySectionID` | **string* | :heavy_minus_sign: | N/A | 3 |
| `LibrarySectionKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/3 | | `LibrarySectionKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/3 |
| `LibrarySectionTitle` | **string* | :heavy_minus_sign: | N/A | Music | | `LibrarySectionTitle` | **string* | :heavy_minus_sign: | N/A | Music |
| `MusicAnalysisVersion` | **string* | :heavy_minus_sign: | N/A | 1 | | `MusicAnalysisVersion` | **string* | :heavy_minus_sign: | N/A | 1 |
| `ParentGUID` | **string* | :heavy_minus_sign: | N/A | plex://album/65394d6d472b8ab03ef47f12 | | `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 |
| `ParentIndex` | **int* | :heavy_minus_sign: | N/A | 1 | | `ParentGUID` | **string* | :heavy_minus_sign: | N/A | plex://album/65394d6d472b8ab03ef47f12 |
| `ParentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084 | | `ParentIndex` | **int* | :heavy_minus_sign: | N/A | 1 |
| `ParentRatingKey` | **string* | :heavy_minus_sign: | N/A | 67084 | | `ParentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084 |
| `ParentStudio` | **string* | :heavy_minus_sign: | N/A | Reprise Records | | `ParentRatingKey` | **string* | :heavy_minus_sign: | N/A | 67084 |
| `ParentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 | | `ParentStudio` | **string* | :heavy_minus_sign: | N/A | Reprise Records |
| `ParentTitle` | **string* | :heavy_minus_sign: | N/A | Saviors | | `ParentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 |
| `ParentYear` | **int* | :heavy_minus_sign: | N/A | 2024 | | `ParentTitle` | **string* | :heavy_minus_sign: | N/A | Saviors |
| `RatingCount` | **int* | :heavy_minus_sign: | N/A | 45885 | | `ParentYear` | **int* | :heavy_minus_sign: | N/A | 2024 |
| `RatingKey` | **string* | :heavy_minus_sign: | N/A | 67085 | | `RatingCount` | **int* | :heavy_minus_sign: | N/A | 45885 |
| `SessionKey` | **string* | :heavy_minus_sign: | N/A | 203 | | `RatingKey` | **string* | :heavy_minus_sign: | N/A | 67085 |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 | | `SessionKey` | **string* | :heavy_minus_sign: | N/A | 203 |
| `Title` | **string* | :heavy_minus_sign: | N/A | The American Dream Is Killing Me | | `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/67084/thumb/1705543314 |
| `TitleSort` | **string* | :heavy_minus_sign: | N/A | American Dream Is Killing Me | | `Title` | **string* | :heavy_minus_sign: | N/A | The American Dream Is Killing Me |
| `Type` | **string* | :heavy_minus_sign: | N/A | track | | `TitleSort` | **string* | :heavy_minus_sign: | N/A | American Dream Is Killing Me |
| `UpdatedAt` | **int* | :heavy_minus_sign: | N/A | 1705543314 | | `Type` | **string* | :heavy_minus_sign: | N/A | track |
| `ViewOffset` | **int* | :heavy_minus_sign: | N/A | 1000 | | `UpdatedAt` | **int* | :heavy_minus_sign: | N/A | 1705543314 |
| `Media` | [][operations.GetSessionsMedia](../../models/operations/getsessionsmedia.md) | :heavy_minus_sign: | N/A | | | `ViewOffset` | **int* | :heavy_minus_sign: | N/A | 1000 |
| `User` | [*operations.GetSessionsUser](../../models/operations/getsessionsuser.md) | :heavy_minus_sign: | N/A | | | `Media` | [][operations.GetSessionsMedia](../../models/operations/getsessionsmedia.md) | :heavy_minus_sign: | N/A | |
| `Player` | [*operations.Player](../../models/operations/player.md) | :heavy_minus_sign: | N/A | | | `User` | [*operations.GetSessionsUser](../../models/operations/getsessionsuser.md) | :heavy_minus_sign: | N/A | |
| `Session` | [*operations.Session](../../models/operations/session.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 | | Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
| `PinID` | *int64* | :heavy_check_mark: | The PinID to retrieve an access token for | | | `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 | | `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 | | `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 | | `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |

View File

@@ -17,4 +17,6 @@ E.g. A movie library will not return anything with type 3 as there are no season
| `GetTopWatchedContentQueryParamTypeTvShow` | 2 | | `GetTopWatchedContentQueryParamTypeTvShow` | 2 |
| `GetTopWatchedContentQueryParamTypeSeason` | 3 | | `GetTopWatchedContentQueryParamTypeSeason` | 3 |
| `GetTopWatchedContentQueryParamTypeEpisode` | 4 | | `GetTopWatchedContentQueryParamTypeEpisode` | 4 |
| `GetTopWatchedContentQueryParamTypeAudio` | 8 | | `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 | | 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 | | `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 | | `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 | | `ClientVersion` | **string* | :heavy_minus_sign: | The version of the client application. | 2.4.1 |

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,11 @@
# GetCountriesLibraryBadRequest
Bad Request - A parameter was not specified, or was specified incorrectly.
## Fields
| Field | Type | Required | Description |
| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| `Errors` | [][sdkerrors.GetCountriesLibraryErrors](../../models/sdkerrors/getcountrieslibraryerrors.md) | :heavy_minus_sign: | N/A |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing |

View File

@@ -0,0 +1,10 @@
# GetCountriesLibraryErrors
## Fields
| Field | Type | Required | Description | Example |
| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- |
| `Code` | **int* | :heavy_minus_sign: | N/A | 1000 |
| `Message` | **string* | :heavy_minus_sign: | N/A | X-Plex-Client-Identifier is missing |
| `Status` | **int* | :heavy_minus_sign: | N/A | 400 |

View File

@@ -0,0 +1,10 @@
# GetCountriesLibraryLibraryErrors
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- |
| `Code` | **int* | :heavy_minus_sign: | N/A | 1001 |
| `Message` | **string* | :heavy_minus_sign: | N/A | User could not be authenticated |
| `Status` | **int* | :heavy_minus_sign: | N/A | 401 |

View File

@@ -0,0 +1,11 @@
# GetCountriesLibraryUnauthorized
Unauthorized - Returned if the X-Plex-Token is missing from the header or query.
## Fields
| Field | Type | Required | Description |
| ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `Errors` | [][sdkerrors.GetCountriesLibraryLibraryErrors](../../models/sdkerrors/getcountrieslibrarylibraryerrors.md) | :heavy_minus_sign: | N/A |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing |

View File

@@ -0,0 +1,11 @@
# GetGenresLibraryBadRequest
Bad Request - A parameter was not specified, or was specified incorrectly.
## Fields
| Field | Type | Required | Description |
| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `Errors` | [][sdkerrors.GetGenresLibraryErrors](../../models/sdkerrors/getgenreslibraryerrors.md) | :heavy_minus_sign: | N/A |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing |

View File

@@ -0,0 +1,10 @@
# GetGenresLibraryErrors
## Fields
| Field | Type | Required | Description | Example |
| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- |
| `Code` | **int* | :heavy_minus_sign: | N/A | 1000 |
| `Message` | **string* | :heavy_minus_sign: | N/A | X-Plex-Client-Identifier is missing |
| `Status` | **int* | :heavy_minus_sign: | N/A | 400 |

View File

@@ -0,0 +1,10 @@
# GetGenresLibraryLibraryErrors
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- |
| `Code` | **int* | :heavy_minus_sign: | N/A | 1001 |
| `Message` | **string* | :heavy_minus_sign: | N/A | User could not be authenticated |
| `Status` | **int* | :heavy_minus_sign: | N/A | 401 |

View File

@@ -0,0 +1,11 @@
# GetGenresLibraryUnauthorized
Unauthorized - Returned if the X-Plex-Token is missing from the header or query.
## Fields
| Field | Type | Required | Description |
| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| `Errors` | [][sdkerrors.GetGenresLibraryLibraryErrors](../../models/sdkerrors/getgenreslibrarylibraryerrors.md) | :heavy_minus_sign: | N/A |
| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing |

View File

@@ -27,22 +27,18 @@ Get Server Activities
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Activities.GetServerActivities(ctx) res, err := s.Activities.GetServerActivities(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -82,22 +78,18 @@ Cancel Server Activities
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Activities.CancelServerActivities(ctx, "25b71ed5-0f9d-461c-baa7-d404e9e10d3e") res, err := s.Activities.CancelServerActivities(ctx, "25b71ed5-0f9d-461c-baa7-d404e9e10d3e")
if err != nil { if err != nil {
log.Fatal(err) 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 package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Authentication.GetTransientToken(ctx, operations.GetTransientTokenQueryParamTypeDelegation, operations.ScopeAll) res, err := s.Authentication.GetTransientToken(ctx, operations.GetTransientTokenQueryParamTypeDelegation, operations.ScopeAll)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -84,22 +80,18 @@ Note: requires Plex Media Server >= 1.15.4.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Authentication.GetSourceConnectionInformation(ctx, "provider://provider-identifier") res, err := s.Authentication.GetSourceConnectionInformation(ctx, "provider://provider-identifier")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -140,22 +132,18 @@ Get the User data from the provided X-Plex-Token
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Authentication.GetTokenDetails(ctx) res, err := s.Authentication.GetTokenDetails(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -195,23 +183,23 @@ Sign in user with username and password and return user data with Plex authentic
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { 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() ctx := context.Background()
s := plexgo.New()
res, err := s.Authentication.PostUsersSignInData(ctx, operations.PostUsersSignInDataRequest{ 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{ RequestBody: &operations.PostUsersSignInDataRequestBody{
Login: "username@email.com", Login: "username@email.com",
Password: "password123", Password: "password123",

View File

@@ -24,22 +24,18 @@ Returns a list of butler tasks
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Butler.GetButlerTasks(ctx) res, err := s.Butler.GetButlerTasks(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -84,22 +80,18 @@ This endpoint will attempt to start all Butler tasks that are enabled in the set
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Butler.StartAllTasks(ctx) res, err := s.Butler.StartAllTasks(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -140,22 +132,18 @@ This endpoint will stop all currently running tasks and remove any scheduled tas
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Butler.StopAllTasks(ctx) res, err := s.Butler.StopAllTasks(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -200,23 +188,19 @@ This endpoint will attempt to start a single Butler task that is enabled in the
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Butler.StartTask(ctx, operations.TaskNameCleanOldBundles) res, err := s.Butler.StartTask(ctx, operations.TaskNameCleanOldBundles)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -258,23 +242,19 @@ This endpoint will stop a currently running task by name, or remove it from the
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Butler.StopTask(ctx, operations.PathParamTaskNameBackupDatabase) res, err := s.Butler.StopTask(ctx, operations.PathParamTaskNameBackupDatabase)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -22,22 +22,18 @@ Get Global Hubs filtered by the parameters provided.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Hubs.GetGlobalHubs(ctx, nil, nil) res, err := s.Hubs.GetGlobalHubs(ctx, nil, nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -80,30 +76,23 @@ This endpoint will return the recently added content.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Hubs.GetRecentlyAdded(ctx, operations.GetRecentlyAddedRequest{ res, err := s.Hubs.GetRecentlyAdded(ctx, operations.GetRecentlyAddedRequest{
ContentDirectoryID: 470161, ContentDirectoryID: 470161,
SectionID: plexgo.Int64(2), SectionID: plexgo.Int64(2),
Type: operations.TypeTvShow, Type: operations.TypeTvShow,
IncludeMeta: operations.IncludeMetaEnable.ToPointer(),
XPlexContainerStart: plexgo.Int(0),
XPlexContainerSize: plexgo.Int(50),
}) })
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -143,22 +132,18 @@ This endpoint will return a list of library specific hubs
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Hubs.GetLibraryHubs(ctx, 6728.76, nil, nil) res, err := s.Hubs.GetLibraryHubs(ctx, 6728.76, nil, nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -16,6 +16,8 @@ API Calls interacting with Plex Media Server Libraries
* [GetLibraryItems](#getlibraryitems) - Get Library Items * [GetLibraryItems](#getlibraryitems) - Get Library Items
* [GetRefreshLibraryMetadata](#getrefreshlibrarymetadata) - Refresh Metadata Of The Library * [GetRefreshLibraryMetadata](#getrefreshlibrarymetadata) - Refresh Metadata Of The Library
* [GetSearchLibrary](#getsearchlibrary) - Search Library * [GetSearchLibrary](#getsearchlibrary) - Search Library
* [GetGenresLibrary](#getgenreslibrary) - Get Genres of library media
* [GetCountriesLibrary](#getcountrieslibrary) - Get Countries of library media
* [GetSearchAllLibraries](#getsearchalllibraries) - Search All Libraries * [GetSearchAllLibraries](#getsearchalllibraries) - Search All Libraries
* [GetMetaDataByRatingKey](#getmetadatabyratingkey) - Get Metadata by RatingKey * [GetMetaDataByRatingKey](#getmetadatabyratingkey) - Get Metadata by RatingKey
* [GetMetadataChildren](#getmetadatachildren) - Get Items Children * [GetMetadataChildren](#getmetadatachildren) - Get Items Children
@@ -32,22 +34,18 @@ This resource returns hash values for local files
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetFileHash(ctx, "file://C:\Image.png&type=13", nil) res, err := s.Library.GetFileHash(ctx, "file://C:\Image.png&type=13", nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -90,23 +88,19 @@ This endpoint will return the recently added content.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetRecentlyAddedLibrary(ctx, operations.GetRecentlyAddedLibraryRequest{ res, err := s.Library.GetRecentlyAddedLibrary(ctx, operations.GetRecentlyAddedLibraryRequest{
ContentDirectoryID: plexgo.Int64(2), ContentDirectoryID: plexgo.Int64(2),
PinnedContentDirectoryID: []int64{ PinnedContentDirectoryID: []int64{
@@ -125,9 +119,6 @@ func main() {
}, },
SectionID: plexgo.Int64(2), SectionID: plexgo.Int64(2),
Type: operations.QueryParamTypeTvShow, Type: operations.QueryParamTypeTvShow,
IncludeMeta: operations.QueryParamIncludeMetaEnable.ToPointer(),
XPlexContainerStart: plexgo.Int(0),
XPlexContainerSize: plexgo.Int(50),
}) })
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -174,22 +165,18 @@ This allows a client to provide a rich interface around the media (e.g. allow so
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetAllLibraries(ctx) res, err := s.Library.GetAllLibraries(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -268,22 +255,18 @@ Each type in the library comes with a set of filters and sorts, aiding in buildi
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetLibraryDetails(ctx, 9518, nil) res, err := s.Library.GetLibraryDetails(ctx, 9518, nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -325,22 +308,18 @@ Delete a library using a specific section id
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.DeleteLibrary(ctx, 9518) res, err := s.Library.DeleteLibrary(ctx, 9518)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -393,6 +372,7 @@ Fetches details from a specific section of the library identified by a section k
- `resolution`: Items categorized by resolution. - `resolution`: Items categorized by resolution.
- `firstCharacter`: Items categorized by the first letter. - `firstCharacter`: Items categorized by the first letter.
- `folder`: Items categorized by folder. - `folder`: Items categorized by folder.
- `albums`: Items categorized by album.
### Example Usage ### Example Usage
@@ -401,31 +381,23 @@ Fetches details from a specific section of the library identified by a section k
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetLibraryItems(ctx, operations.GetLibraryItemsRequest{ res, err := s.Library.GetLibraryItems(ctx, operations.GetLibraryItemsRequest{
Tag: operations.TagEdition, Tag: operations.TagEdition,
IncludeGuids: operations.IncludeGuidsEnable.ToPointer(),
Type: operations.GetLibraryItemsQueryParamTypeTvShow.ToPointer(), Type: operations.GetLibraryItemsQueryParamTypeTvShow.ToPointer(),
SectionKey: 9518, SectionKey: 9518,
IncludeMeta: operations.GetLibraryItemsQueryParamIncludeMetaEnable.ToPointer(),
XPlexContainerStart: plexgo.Int(0),
XPlexContainerSize: plexgo.Int(50),
}) })
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -467,23 +439,19 @@ This endpoint Refreshes all the Metadata of the library.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetRefreshLibraryMetadata(ctx, 9518, operations.ForceOne.ToPointer()) res, err := s.Library.GetRefreshLibraryMetadata(ctx, 9518, operations.ForceOne.ToPointer())
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -543,23 +511,19 @@ Each type in the library comes with a set of filters and sorts, aiding in buildi
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetSearchLibrary(ctx, 9518, operations.GetSearchLibraryQueryParamTypeTvShow) res, err := s.Library.GetSearchLibrary(ctx, 9518, operations.GetSearchLibraryQueryParamTypeTvShow)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -591,6 +555,112 @@ func main() {
| sdkerrors.GetSearchLibraryUnauthorized | 401 | application/json | | sdkerrors.GetSearchLibraryUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4XX, 5XX | \*/\* | | sdkerrors.SDKError | 4XX, 5XX | \*/\* |
## GetGenresLibrary
Retrieves a list of all the genres that are found for the media in this library.
### Example Usage
```go
package main
import(
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
)
res, err := s.Library.GetGenresLibrary(ctx, 9518)
if err != nil {
log.Fatal(err)
}
if res.Object != nil {
// handle response
}
}
```
### Parameters
| Parameter | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | |
| `sectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |
| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | |
### Response
**[*operations.GetGenresLibraryResponse](../../models/operations/getgenreslibraryresponse.md), error**
### Errors
| Error Type | Status Code | Content Type |
| -------------------------------------- | -------------------------------------- | -------------------------------------- |
| sdkerrors.GetGenresLibraryBadRequest | 400 | application/json |
| sdkerrors.GetGenresLibraryUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4XX, 5XX | \*/\* |
## GetCountriesLibrary
Retrieves a list of all the countries that are found for the media in this library.
### Example Usage
```go
package main
import(
"context"
"github.com/LukeHagar/plexgo"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
)
res, err := s.Library.GetCountriesLibrary(ctx, 9518)
if err != nil {
log.Fatal(err)
}
if res.Object != nil {
// handle response
}
}
```
### Parameters
| Parameter | Type | Required | Description | Example |
| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- |
| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | |
| `sectionKey` | *int* | :heavy_check_mark: | The unique key of the Plex library. <br/>Note: This is unique in the context of the Plex server.<br/> | 9518 |
| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | |
### Response
**[*operations.GetCountriesLibraryResponse](../../models/operations/getcountrieslibraryresponse.md), error**
### Errors
| Error Type | Status Code | Content Type |
| ----------------------------------------- | ----------------------------------------- | ----------------------------------------- |
| sdkerrors.GetCountriesLibraryBadRequest | 400 | application/json |
| sdkerrors.GetCountriesLibraryUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4XX, 5XX | \*/\* |
## GetSearchAllLibraries ## GetSearchAllLibraries
Search the provided query across all library sections, or a single section, and return matches as hubs, split up by type. Search the provided query across all library sections, or a single section, and return matches as hubs, split up by type.
@@ -602,30 +672,25 @@ Search the provided query across all library sections, or a single section, and
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetSearchAllLibraries(ctx, operations.GetSearchAllLibrariesRequest{ res, err := s.Library.GetSearchAllLibraries(ctx, operations.GetSearchAllLibrariesRequest{
Query: "<value>", Query: "<value>",
ClientID: "3381b62b-9ab7-4e37-827b-203e9809eb58",
SearchTypes: []operations.SearchTypes{ SearchTypes: []operations.SearchTypes{
operations.SearchTypesPeople, operations.SearchTypesPeople,
}, },
IncludeCollections: operations.QueryParamIncludeCollectionsEnable.ToPointer(),
IncludeExternalMedia: operations.QueryParamIncludeExternalMediaEnable.ToPointer(),
}) })
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -667,22 +732,18 @@ This endpoint will return the metadata of a library item specified with the rati
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetMetaDataByRatingKey(ctx, 9518) res, err := s.Library.GetMetaDataByRatingKey(ctx, 9518)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -724,22 +785,18 @@ This endpoint will return the children of of a library item specified with the r
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetMetadataChildren(ctx, 1539.14, plexgo.String("Stream")) res, err := s.Library.GetMetadataChildren(ctx, 1539.14, plexgo.String("Stream"))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -782,23 +839,19 @@ This endpoint will return the top watched content from libraries of a certain ty
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetTopWatchedContent(ctx, operations.GetTopWatchedContentQueryParamTypeTvShow, plexgo.Int64(1)) res, err := s.Library.GetTopWatchedContent(ctx, operations.GetTopWatchedContentQueryParamTypeTvShow, plexgo.Int64(1))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -841,22 +894,18 @@ This endpoint will return the on deck content.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Library.GetOnDeck(ctx) res, err := s.Library.GetOnDeck(ctx)
if err != nil { if err != nil {
log.Fatal(err) 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 package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Log.LogLine(ctx, operations.LevelThree, "Test log message", "Postman") res, err := s.Log.LogLine(ctx, operations.LevelThree, "Test log message", "Postman")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -103,22 +99,18 @@ Ensure each parameter is properly URL-encoded to avoid interpretation issues.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Log.LogMultiLine(ctx, "level=4&message=Test%20message%201&source=postman\n" + 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=3&message=Test%20message%202&source=postman\n" +
"level=1&message=Test%20message%203&source=postman") "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 package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Log.EnablePaperTrail(ctx) res, err := s.Log.EnablePaperTrail(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -24,22 +24,18 @@ This will mark the provided media key as Played.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Media.MarkPlayed(ctx, 59398) res, err := s.Media.MarkPlayed(ctx, 59398)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -80,22 +76,18 @@ This will mark the provided media key as Unplayed.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Media.MarkUnplayed(ctx, 59398) res, err := s.Media.MarkUnplayed(ctx, 59398)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -137,22 +129,18 @@ This API command can be used to update the play progress of a media item.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Media.UpdatePlayProgress(ctx, "<key>", 90000, "played") res, err := s.Media.UpdatePlayProgress(ctx, "<key>", 90000, "played")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -195,23 +183,19 @@ Gets the banner image of the media item
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Media.GetBannerImage(ctx, operations.GetBannerImageRequest{ res, err := s.Media.GetBannerImage(ctx, operations.GetBannerImageRequest{
RatingKey: 9518, RatingKey: 9518,
Width: 396, Width: 396,
@@ -259,23 +243,19 @@ Gets the thumbnail image of the media item
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Media.GetThumbImage(ctx, operations.GetThumbImageRequest{ res, err := s.Media.GetThumbImage(ctx, operations.GetThumbImageRequest{
RatingKey: 9518, RatingKey: 9518,
Width: 396, 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 package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.CreatePlaylist(ctx, operations.CreatePlaylistRequest{ res, err := s.Playlists.CreatePlaylist(ctx, operations.CreatePlaylistRequest{
Title: "<value>", Title: "<value>",
Type: operations.CreatePlaylistQueryParamTypePhoto, Type: operations.CreatePlaylistQueryParamTypePhoto,
Smart: operations.SmartOne, Smart: operations.SmartOne,
URI: "https://inborn-brochure.biz", URI: "https://hoarse-testing.info/",
}) })
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -96,22 +92,18 @@ Get All Playlists given the specified filters.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.GetPlaylists(ctx, nil, nil) res, err := s.Playlists.GetPlaylists(ctx, nil, nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -155,22 +147,18 @@ Smart playlist details contain the `content` attribute. This is the content URI
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.GetPlaylist(ctx, 4109.48) res, err := s.Playlists.GetPlaylist(ctx, 4109.48)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -212,22 +200,18 @@ This endpoint will delete a playlist
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.DeletePlaylist(ctx, 216.22) res, err := s.Playlists.DeletePlaylist(ctx, 216.22)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -269,22 +253,18 @@ From PMS version 1.9.1 clients can also edit playlist metadata using this endpoi
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.UpdatePlaylist(ctx, 3915, nil, nil) res, err := s.Playlists.UpdatePlaylist(ctx, 3915, nil, nil)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -331,23 +311,19 @@ Note that for dumb playlists, items have a `playlistItemID` attribute which is u
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.GetPlaylistContents(ctx, 5004.46, operations.GetPlaylistContentsQueryParamTypeTvShow) res, err := s.Playlists.GetPlaylistContents(ctx, 5004.46, operations.GetPlaylistContentsQueryParamTypeTvShow)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -390,22 +366,18 @@ Clears a playlist, only works with dumb playlists. Returns the playlist.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.ClearPlaylistContents(ctx, 1893.18) res, err := s.Playlists.ClearPlaylistContents(ctx, 1893.18)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -448,22 +420,18 @@ With a smart playlist, passing a new `uri` parameter replaces the rules for the
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.AddPlaylistContents(ctx, 8502.01, "server://12345/com.plexapp.plugins.library/library/metadata/1", plexgo.Float64(123)) res, err := s.Playlists.AddPlaylistContents(ctx, 8502.01, "server://12345/com.plexapp.plugins.library/library/metadata/1", plexgo.Float64(123))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -507,23 +475,19 @@ Imports m3u playlists by passing a path on the server to scan for m3u-formatted
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Playlists.UploadPlaylist(ctx, "/home/barkley/playlist.m3u", operations.QueryParamForceZero, 1) res, err := s.Playlists.UploadPlaylist(ctx, "/home/barkley/playlist.m3u", operations.QueryParamForceZero, 1)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -26,22 +26,18 @@ Get Companions Data
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Plex.GetCompanionsData(ctx) res, err := s.Plex.GetCompanionsData(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -81,22 +77,18 @@ Get friends of provided auth token.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Plex.GetUserFriends(ctx) res, err := s.Plex.GetUserFriends(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -136,21 +128,16 @@ Returns the geolocation and locale data of the caller
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { 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() ctx := context.Background()
s := plexgo.New()
res, err := s.Plex.GetGeoData(ctx) res, err := s.Plex.GetGeoData(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -190,22 +177,18 @@ Retrieves the home data for the authenticated user, including details like home
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Plex.GetHomeData(ctx) res, err := s.Plex.GetHomeData(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -245,24 +228,19 @@ Get Plex server access tokens and server connections
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background() res, err := s.Plex.GetServerResources(ctx, "3381b62b-9ab7-4e37-827b-203e9809eb58", nil, nil, nil)
res, err := s.Plex.GetServerResources(ctx, operations.IncludeHTTPSEnable.ToPointer(), operations.IncludeRelayEnable.ToPointer(), operations.IncludeIPv6Enable.ToPointer(), plexgo.String("3381b62b-9ab7-4e37-827b-203e9809eb58"))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -277,10 +255,10 @@ func main() {
| Parameter | Type | Required | Description | Example | | Parameter | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | | | `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 | | `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 | | `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 | | `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. | | | `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | |
### Response ### Response
@@ -305,23 +283,24 @@ Retrieve a Pin ID from Plex.tv to use for authentication flows
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { 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() ctx := context.Background()
res, err := s.Plex.GetPin(ctx, operations.GetPinRequest{})
s := plexgo.New()
res, err := s.Plex.GetPin(ctx, operations.GetPinRequest{
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 { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -360,24 +339,24 @@ Retrieve an Access Token from Plex.tv after the Pin has been authenticated
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { 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() ctx := context.Background()
s := plexgo.New()
res, err := s.Plex.GetTokenByPinID(ctx, operations.GetTokenByPinIDRequest{ res, err := s.Plex.GetTokenByPinID(ctx, operations.GetTokenByPinIDRequest{
PinID: 408895, 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 { if err != nil {
log.Fatal(err) 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) | - | | 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) | - | | 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) | - | C# | [GitHub](https://github.com/LukeHagar/plexcsharp) | [Releases](https://github.com/LukeHagar/plexcsharp/releases) | -
### Available Operations

View File

@@ -34,23 +34,19 @@ This request is intended to be very fast, and called as the user types.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background() res, err := s.Search.PerformSearch(ctx, "dylan", nil, nil)
res, err := s.Search.PerformSearch(ctx, "dylan", nil, plexgo.Float64(5))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -96,23 +92,19 @@ Results, as well as their containing per-type hubs, contain a `distance` attribu
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background() res, err := s.Search.PerformVoiceSearch(ctx, "dead+poop", nil, nil)
res, err := s.Search.PerformVoiceSearch(ctx, "dead+poop", nil, plexgo.Float64(5))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -154,22 +146,18 @@ This will search the database for the string provided.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Search.GetSearchResults(ctx, "110") res, err := s.Search.GetSearchResults(ctx, "110")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

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

View File

@@ -23,22 +23,18 @@ This will retrieve the "Now Playing" Information of the PMS.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Sessions.GetSessions(ctx) res, err := s.Sessions.GetSessions(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -78,23 +74,19 @@ This will Retrieve a listing of all history views.
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Sessions.GetSessionHistory(ctx, plexgo.String("viewedAt:desc"), plexgo.Int64(1), &operations.QueryParamFilter{}, plexgo.Int64(12)) res, err := s.Sessions.GetSessionHistory(ctx, plexgo.String("viewedAt:desc"), plexgo.Int64(1), &operations.QueryParamFilter{}, plexgo.Int64(12))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -138,22 +130,18 @@ Get Transcode Sessions
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Sessions.GetTranscodeSessions(ctx) res, err := s.Sessions.GetTranscodeSessions(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -193,22 +181,18 @@ Stop a Transcode Session
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Sessions.StopTranscodeSession(ctx, "zz7llzqlx8w9vnrsbnwhbmep") res, err := s.Sessions.StopTranscodeSession(ctx, "zz7llzqlx8w9vnrsbnwhbmep")
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -22,22 +22,18 @@ This will return the media statistics for the server
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Statistics.GetStatistics(ctx, plexgo.Int64(4)) res, err := s.Statistics.GetStatistics(ctx, plexgo.Int64(4))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -78,22 +74,18 @@ This will return the resources for the server
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Statistics.GetResourcesStatistics(ctx, plexgo.Int64(4)) res, err := s.Statistics.GetResourcesStatistics(ctx, plexgo.Int64(4))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -134,22 +126,18 @@ This will return the bandwidth statistics for the server
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Statistics.GetBandwidthStatistics(ctx, plexgo.Int64(4)) res, err := s.Statistics.GetBandwidthStatistics(ctx, plexgo.Int64(4))
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -23,22 +23,18 @@ Querying status of updates
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Updater.GetUpdateStatus(ctx) res, err := s.Updater.GetUpdateStatus(ctx)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -78,23 +74,19 @@ Checking for updates
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Updater.CheckForUpdates(ctx, operations.DownloadOne.ToPointer()) res, err := s.Updater.CheckForUpdates(ctx, operations.DownloadOne.ToPointer())
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -136,23 +128,19 @@ Note that these two parameters are effectively mutually exclusive. The `tonight`
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Updater.ApplyUpdates(ctx, operations.TonightOne.ToPointer(), operations.SkipOne.ToPointer()) res, err := s.Updater.ApplyUpdates(ctx, operations.TonightOne.ToPointer(), operations.SkipOne.ToPointer())
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@@ -21,23 +21,19 @@ Get the timeline for a media item
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Video.GetTimeline(ctx, operations.GetTimelineRequest{ res, err := s.Video.GetTimeline(ctx, operations.GetTimelineRequest{
RatingKey: 23409, RatingKey: 23409,
Key: "/library/metadata/23409", Key: "/library/metadata/23409",
@@ -89,23 +85,19 @@ Begin a Universal Transcode Session
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Video.StartUniversalTranscode(ctx, operations.StartUniversalTranscodeRequest{ res, err := s.Video.StartUniversalTranscode(ctx, operations.StartUniversalTranscodeRequest{
HasMDE: 1, HasMDE: 1,
Path: "/library/metadata/23409", Path: "/library/metadata/23409",

View File

@@ -20,27 +20,21 @@ Get User Watchlist
package main package main
import( import(
"github.com/LukeHagar/plexgo"
"context" "context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"log" "log"
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithClientID("3381b62b-9ab7-4e37-827b-203e9809eb58"),
plexgo.WithClientName("Plex for Roku"),
plexgo.WithClientVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithDeviceNickname("Roku 3"),
) )
ctx := context.Background()
res, err := s.Watchlist.GetWatchList(ctx, operations.GetWatchListRequest{ res, err := s.Watchlist.GetWatchList(ctx, operations.GetWatchListRequest{
Filter: operations.FilterAvailable, Filter: operations.FilterAvailable,
XPlexContainerStart: plexgo.Int(0),
XPlexContainerSize: plexgo.Int(50),
XPlexToken: "CV5xoxjTpFKUzBTShsaf", XPlexToken: "CV5xoxjTpFKUzBTShsaf",
}) })
if err != nil { if err != nil {

5
go.mod
View File

@@ -2,7 +2,4 @@ module github.com/LukeHagar/plexgo
go 1.20 go 1.20
require ( require github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05
github.com/cenkalti/backoff/v4 v4.2.0
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 h1:S92OBrGuLLZsyM5ybUzgc/mPjIYk2AZqufieooe98uw=
github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05/go.mod h1:M9R1FoZ3y//hwwnJtO51ypFGwm8ZfpxPT/ZLtO1mcgQ= github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05/go.mod h1:M9R1FoZ3y//hwwnJtO51ypFGwm8ZfpxPT/ZLtO1mcgQ=

71
hubs.go
View File

@@ -10,7 +10,7 @@ import (
"github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/internal/utils"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/cenkalti/backoff/v4" "github.com/LukeHagar/plexgo/retry"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -53,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") opURL, err := url.JoinPath(baseURL, "/hubs")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -85,6 +90,10 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -115,7 +124,11 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -243,7 +256,11 @@ func (s *Hubs) GetGlobalHubs(ctx context.Context, count *float64, onlyTransient
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -284,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") opURL, err := url.JoinPath(baseURL, "/hubs/home/recentlyAdded")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -316,6 +338,10 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -346,7 +372,11 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -434,7 +464,11 @@ func (s *Hubs) GetRecentlyAdded(ctx context.Context, request operations.GetRecen
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
fallthrough fallthrough
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough 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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -481,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) opURL, err := utils.GenerateURL(ctx, baseURL, "/hubs/sections/{sectionId}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -513,6 +552,10 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -543,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) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -671,7 +718,11 @@ func (s *Hubs) GetLibraryHubs(ctx context.Context, sectionID float64, count *flo
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {

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 continue
} }
scope := priorScope + "[" + qpTag.ParamName + "]" scope := priorScope
if !qpTag.Inline {
scope = priorScope + "[" + qpTag.ParamName + "]"
}
switch fieldValue.Kind() { switch fieldValue.Kind() {
case reflect.Array, reflect.Slice: case reflect.Array, reflect.Slice:
@@ -252,6 +256,13 @@ type paramTag struct {
Explode bool Explode bool
ParamName string ParamName string
Serialization 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 { func parseQueryParamTag(field reflect.StructField) *paramTag {

View File

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

View File

@@ -7,7 +7,8 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/LukeHagar/plexgo/retry" "github.com/LukeHagar/plexgo/retry"
"github.com/cenkalti/backoff/v4" "math"
"math/rand"
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
@@ -15,8 +16,6 @@ import (
"time" "time"
) )
var errRequestFailed = errors.New("request failed")
// Deprecated: Use retry.BackoffStrategy instead. // Deprecated: Use retry.BackoffStrategy instead.
type BackoffStrategy = retry.BackoffStrategy type BackoffStrategy = retry.BackoffStrategy
@@ -28,34 +27,27 @@ type Retries struct {
StatusCodes []string 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 { switch r.Config.Strategy {
case "backoff": case "backoff":
if r.Config.Backoff == nil { 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 var resp *http.Response
err := backoff.Retry(func() error { err := retryWithBackoff(ctx, r.Config.Backoff, func() error {
if resp != nil { if resp != nil {
resp.Body.Close() resp.Body.Close()
} }
select { select {
case <-ctx.Done(): case <-ctx.Done():
return backoff.Permanent(ctx.Err()) return retry.Permanent(ctx.Err())
default: default:
} }
res, err := action() res, err := operation()
if err != nil { if err != nil {
urlError := new(url.Error) urlError := new(url.Error)
if errors.As(err, &urlError) { 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 resp = res
if res == nil { if res == nil {
@@ -81,7 +73,7 @@ func Retry(ctx context.Context, r Retries, action func() (*http.Response, error)
s := res.StatusCode / 100 s := res.StatusCode / 100
if s >= codeRange && s < codeRange+1 { if s >= codeRange && s < codeRange+1 {
return errRequestFailed return retry.TemporaryFromResponse("request failed", res)
} }
} else { } else {
parsedCode, err := strconv.Atoi(code) 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 { 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 resp = res
return nil 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 nil, err
} }
return resp, nil return resp, nil
default: 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

@@ -127,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 { func parseParamTag(tagKey string, field reflect.StructField, defaultStyle string, defaultExplode bool) *paramTag {
// example `{tagKey}:"style=simple,explode=false,name=apiID"` // example `{tagKey}:"style=simple,explode=false,name=apiID"`
// example `{tagKey}:"inline"`
values := parseStructTag(tagKey, field) values := parseStructTag(tagKey, field)
if values == nil { if values == nil {
return nil return nil
@@ -140,6 +141,8 @@ func parseParamTag(tagKey string, field reflect.StructField, defaultStyle string
for k, v := range values { for k, v := range values {
switch k { switch k {
case "inline":
tag.Inline = v == "true"
case "style": case "style":
tag.Style = v tag.Style = v
case "explode": case "explode":

File diff suppressed because it is too large Load Diff

75
log.go
View File

@@ -10,7 +10,7 @@ import (
"github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/internal/utils"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/cenkalti/backoff/v4" "github.com/LukeHagar/plexgo/retry"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -54,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") opURL, err := url.JoinPath(baseURL, "/log")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -86,6 +91,10 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -116,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) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -224,7 +237,11 @@ func (s *Log) LogLine(ctx context.Context, level operations.Level, message strin
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -285,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") opURL, err := url.JoinPath(baseURL, "/log")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -313,12 +335,18 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
} }
req.Header.Set("Accept", "application/json") req.Header.Set("Accept", "application/json")
req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent)
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 { if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil {
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -349,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) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -457,7 +489,11 @@ func (s *Log) LogMultiLine(ctx context.Context, request string, opts ...operatio
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -498,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") opURL, err := url.JoinPath(baseURL, "/log/networked")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -526,6 +567,10 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -556,7 +601,11 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -666,7 +715,11 @@ func (s *Log) EnablePaperTrail(ctx context.Context, opts ...operations.Option) (
case httpRes.StatusCode == 403: case httpRes.StatusCode == 403:
fallthrough fallthrough
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough 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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {

117
media.go
View File

@@ -10,7 +10,7 @@ import (
"github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/internal/utils"
"github.com/LukeHagar/plexgo/models/operations" "github.com/LukeHagar/plexgo/models/operations"
"github.com/LukeHagar/plexgo/models/sdkerrors" "github.com/LukeHagar/plexgo/models/sdkerrors"
"github.com/cenkalti/backoff/v4" "github.com/LukeHagar/plexgo/retry"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -52,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") opURL, err := url.JoinPath(baseURL, "/:/scrobble")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -84,6 +89,10 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -114,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) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -222,7 +235,11 @@ func (s *Media) MarkPlayed(ctx context.Context, key float64, opts ...operations.
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -267,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") opURL, err := url.JoinPath(baseURL, "/:/unscrobble")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -299,6 +321,10 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -329,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) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -437,7 +467,11 @@ func (s *Media) MarkUnplayed(ctx context.Context, key float64, opts ...operation
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -484,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") opURL, err := url.JoinPath(baseURL, "/:/progress")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -516,6 +555,10 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -546,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) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -654,7 +701,11 @@ func (s *Media) UpdatePlayProgress(ctx context.Context, key string, time float64
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -695,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) opURL, err := utils.GenerateURL(ctx, baseURL, "/library/metadata/{ratingKey}/banner", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -729,6 +785,10 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -759,7 +819,11 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -881,7 +945,11 @@ func (s *Media) GetBannerImage(ctx context.Context, request operations.GetBanner
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
@@ -922,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) opURL, err := utils.GenerateURL(ctx, baseURL, "/library/metadata/{ratingKey}/thumb", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
@@ -956,6 +1029,10 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
return nil, err return nil, err
} }
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
}
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
retryConfig := o.Retries retryConfig := o.Retries
if retryConfig == nil { if retryConfig == nil {
@@ -986,7 +1063,11 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, backoff.Permanent(err) if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
return nil, err
}
return nil, retry.Permanent(err)
} }
httpRes, err := s.sdkConfiguration.Client.Do(req) httpRes, err := s.sdkConfiguration.Client.Do(req)
@@ -1108,7 +1189,11 @@ func (s *Media) GetThumbImage(ctx context.Context, request operations.GetThumbIm
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
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: case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes) rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {

View File

@@ -0,0 +1,222 @@
// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
package operations
import (
"net/http"
)
type GetCountriesLibraryRequest struct {
// The unique key of the Plex library.
// Note: This is unique in the context of the Plex server.
//
SectionKey int `pathParam:"style=simple,explode=false,name=sectionKey"`
}
func (o *GetCountriesLibraryRequest) GetSectionKey() int {
if o == nil {
return 0
}
return o.SectionKey
}
type GetCountriesLibraryDirectory struct {
FastKey string `json:"fastKey"`
Key string `json:"key"`
Title string `json:"title"`
}
func (o *GetCountriesLibraryDirectory) GetFastKey() string {
if o == nil {
return ""
}
return o.FastKey
}
func (o *GetCountriesLibraryDirectory) GetKey() string {
if o == nil {
return ""
}
return o.Key
}
func (o *GetCountriesLibraryDirectory) GetTitle() string {
if o == nil {
return ""
}
return o.Title
}
type GetCountriesLibraryMediaContainer struct {
Size float64 `json:"size"`
Offset *int `json:"offset,omitempty"`
TotalSize *int `json:"totalSize,omitempty"`
Identifier string `json:"identifier"`
AllowSync bool `json:"allowSync"`
Art string `json:"art"`
Content string `json:"content"`
MediaTagPrefix string `json:"mediaTagPrefix"`
MediaTagVersion int64 `json:"mediaTagVersion"`
Nocache bool `json:"nocache"`
Thumb string `json:"thumb"`
Title1 string `json:"title1"`
Title2 string `json:"title2"`
ViewGroup string `json:"viewGroup"`
Directory []GetCountriesLibraryDirectory `json:"Directory,omitempty"`
}
func (o *GetCountriesLibraryMediaContainer) GetSize() float64 {
if o == nil {
return 0.0
}
return o.Size
}
func (o *GetCountriesLibraryMediaContainer) GetOffset() *int {
if o == nil {
return nil
}
return o.Offset
}
func (o *GetCountriesLibraryMediaContainer) GetTotalSize() *int {
if o == nil {
return nil
}
return o.TotalSize
}
func (o *GetCountriesLibraryMediaContainer) GetIdentifier() string {
if o == nil {
return ""
}
return o.Identifier
}
func (o *GetCountriesLibraryMediaContainer) GetAllowSync() bool {
if o == nil {
return false
}
return o.AllowSync
}
func (o *GetCountriesLibraryMediaContainer) GetArt() string {
if o == nil {
return ""
}
return o.Art
}
func (o *GetCountriesLibraryMediaContainer) GetContent() string {
if o == nil {
return ""
}
return o.Content
}
func (o *GetCountriesLibraryMediaContainer) GetMediaTagPrefix() string {
if o == nil {
return ""
}
return o.MediaTagPrefix
}
func (o *GetCountriesLibraryMediaContainer) GetMediaTagVersion() int64 {
if o == nil {
return 0
}
return o.MediaTagVersion
}
func (o *GetCountriesLibraryMediaContainer) GetNocache() bool {
if o == nil {
return false
}
return o.Nocache
}
func (o *GetCountriesLibraryMediaContainer) GetThumb() string {
if o == nil {
return ""
}
return o.Thumb
}
func (o *GetCountriesLibraryMediaContainer) GetTitle1() string {
if o == nil {
return ""
}
return o.Title1
}
func (o *GetCountriesLibraryMediaContainer) GetTitle2() string {
if o == nil {
return ""
}
return o.Title2
}
func (o *GetCountriesLibraryMediaContainer) GetViewGroup() string {
if o == nil {
return ""
}
return o.ViewGroup
}
func (o *GetCountriesLibraryMediaContainer) GetDirectory() []GetCountriesLibraryDirectory {
if o == nil {
return nil
}
return o.Directory
}
// GetCountriesLibraryResponseBody - Successful response containing media container data.
type GetCountriesLibraryResponseBody struct {
MediaContainer *GetCountriesLibraryMediaContainer `json:"MediaContainer,omitempty"`
}
func (o *GetCountriesLibraryResponseBody) GetMediaContainer() *GetCountriesLibraryMediaContainer {
if o == nil {
return nil
}
return o.MediaContainer
}
type GetCountriesLibraryResponse struct {
// HTTP response content type for this operation
ContentType string
// HTTP response status code for this operation
StatusCode int
// Raw HTTP response; suitable for custom response parsing
RawResponse *http.Response
// Successful response containing media container data.
Object *GetCountriesLibraryResponseBody
}
func (o *GetCountriesLibraryResponse) GetContentType() string {
if o == nil {
return ""
}
return o.ContentType
}
func (o *GetCountriesLibraryResponse) GetStatusCode() int {
if o == nil {
return 0
}
return o.StatusCode
}
func (o *GetCountriesLibraryResponse) GetRawResponse() *http.Response {
if o == nil {
return nil
}
return o.RawResponse
}
func (o *GetCountriesLibraryResponse) GetObject() *GetCountriesLibraryResponseBody {
if o == nil {
return nil
}
return o.Object
}

View File

@@ -0,0 +1,230 @@
// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
package operations
import (
"net/http"
)
type GetGenresLibraryRequest struct {
// The unique key of the Plex library.
// Note: This is unique in the context of the Plex server.
//
SectionKey int `pathParam:"style=simple,explode=false,name=sectionKey"`
}
func (o *GetGenresLibraryRequest) GetSectionKey() int {
if o == nil {
return 0
}
return o.SectionKey
}
type GetGenresLibraryDirectory struct {
FastKey string `json:"fastKey"`
Key string `json:"key"`
Title string `json:"title"`
Type string `json:"type"`
}
func (o *GetGenresLibraryDirectory) GetFastKey() string {
if o == nil {
return ""
}
return o.FastKey
}
func (o *GetGenresLibraryDirectory) GetKey() string {
if o == nil {
return ""
}
return o.Key
}
func (o *GetGenresLibraryDirectory) GetTitle() string {
if o == nil {
return ""
}
return o.Title
}
func (o *GetGenresLibraryDirectory) GetType() string {
if o == nil {
return ""
}
return o.Type
}
type GetGenresLibraryMediaContainer struct {
Size float64 `json:"size"`
Offset *int `json:"offset,omitempty"`
TotalSize *int `json:"totalSize,omitempty"`
Identifier string `json:"identifier"`
AllowSync bool `json:"allowSync"`
Art string `json:"art"`
Content string `json:"content"`
MediaTagPrefix string `json:"mediaTagPrefix"`
MediaTagVersion int64 `json:"mediaTagVersion"`
Nocache bool `json:"nocache"`
Thumb string `json:"thumb"`
Title1 string `json:"title1"`
Title2 string `json:"title2"`
ViewGroup string `json:"viewGroup"`
Directory []GetGenresLibraryDirectory `json:"Directory,omitempty"`
}
func (o *GetGenresLibraryMediaContainer) GetSize() float64 {
if o == nil {
return 0.0
}
return o.Size
}
func (o *GetGenresLibraryMediaContainer) GetOffset() *int {
if o == nil {
return nil
}
return o.Offset
}
func (o *GetGenresLibraryMediaContainer) GetTotalSize() *int {
if o == nil {
return nil
}
return o.TotalSize
}
func (o *GetGenresLibraryMediaContainer) GetIdentifier() string {
if o == nil {
return ""
}
return o.Identifier
}
func (o *GetGenresLibraryMediaContainer) GetAllowSync() bool {
if o == nil {
return false
}
return o.AllowSync
}
func (o *GetGenresLibraryMediaContainer) GetArt() string {
if o == nil {
return ""
}
return o.Art
}
func (o *GetGenresLibraryMediaContainer) GetContent() string {
if o == nil {
return ""
}
return o.Content
}
func (o *GetGenresLibraryMediaContainer) GetMediaTagPrefix() string {
if o == nil {
return ""
}
return o.MediaTagPrefix
}
func (o *GetGenresLibraryMediaContainer) GetMediaTagVersion() int64 {
if o == nil {
return 0
}
return o.MediaTagVersion
}
func (o *GetGenresLibraryMediaContainer) GetNocache() bool {
if o == nil {
return false
}
return o.Nocache
}
func (o *GetGenresLibraryMediaContainer) GetThumb() string {
if o == nil {
return ""
}
return o.Thumb
}
func (o *GetGenresLibraryMediaContainer) GetTitle1() string {
if o == nil {
return ""
}
return o.Title1
}
func (o *GetGenresLibraryMediaContainer) GetTitle2() string {
if o == nil {
return ""
}
return o.Title2
}
func (o *GetGenresLibraryMediaContainer) GetViewGroup() string {
if o == nil {
return ""
}
return o.ViewGroup
}
func (o *GetGenresLibraryMediaContainer) GetDirectory() []GetGenresLibraryDirectory {
if o == nil {
return nil
}
return o.Directory
}
// GetGenresLibraryResponseBody - Successful response containing media container data.
type GetGenresLibraryResponseBody struct {
MediaContainer *GetGenresLibraryMediaContainer `json:"MediaContainer,omitempty"`
}
func (o *GetGenresLibraryResponseBody) GetMediaContainer() *GetGenresLibraryMediaContainer {
if o == nil {
return nil
}
return o.MediaContainer
}
type GetGenresLibraryResponse struct {
// HTTP response content type for this operation
ContentType string
// HTTP response status code for this operation
StatusCode int
// Raw HTTP response; suitable for custom response parsing
RawResponse *http.Response
// Successful response containing media container data.
Object *GetGenresLibraryResponseBody
}
func (o *GetGenresLibraryResponse) GetContentType() string {
if o == nil {
return ""
}
return o.ContentType
}
func (o *GetGenresLibraryResponse) GetStatusCode() int {
if o == nil {
return 0
}
return o.StatusCode
}
func (o *GetGenresLibraryResponse) GetRawResponse() *http.Response {
if o == nil {
return nil
}
return o.RawResponse
}
func (o *GetGenresLibraryResponse) GetObject() *GetGenresLibraryResponseBody {
if o == nil {
return nil
}
return o.Object
}

View File

@@ -33,6 +33,7 @@ const (
TagResolution Tag = "resolution" TagResolution Tag = "resolution"
TagFirstCharacter Tag = "firstCharacter" TagFirstCharacter Tag = "firstCharacter"
TagFolder Tag = "folder" TagFolder Tag = "folder"
TagAlbums Tag = "albums"
) )
func (e Tag) ToPointer() *Tag { func (e Tag) ToPointer() *Tag {
@@ -81,6 +82,8 @@ func (e *Tag) UnmarshalJSON(data []byte) error {
case "firstCharacter": case "firstCharacter":
fallthrough fallthrough
case "folder": case "folder":
fallthrough
case "albums":
*e = Tag(v) *e = Tag(v)
return nil return nil
default: default:
@@ -129,6 +132,8 @@ const (
GetLibraryItemsQueryParamTypeSeason GetLibraryItemsQueryParamType = 3 GetLibraryItemsQueryParamTypeSeason GetLibraryItemsQueryParamType = 3
GetLibraryItemsQueryParamTypeEpisode GetLibraryItemsQueryParamType = 4 GetLibraryItemsQueryParamTypeEpisode GetLibraryItemsQueryParamType = 4
GetLibraryItemsQueryParamTypeAudio GetLibraryItemsQueryParamType = 8 GetLibraryItemsQueryParamTypeAudio GetLibraryItemsQueryParamType = 8
GetLibraryItemsQueryParamTypeAlbum GetLibraryItemsQueryParamType = 9
GetLibraryItemsQueryParamTypeTrack GetLibraryItemsQueryParamType = 10
) )
func (e GetLibraryItemsQueryParamType) ToPointer() *GetLibraryItemsQueryParamType { func (e GetLibraryItemsQueryParamType) ToPointer() *GetLibraryItemsQueryParamType {
@@ -149,6 +154,10 @@ func (e *GetLibraryItemsQueryParamType) UnmarshalJSON(data []byte) error {
case 4: case 4:
fallthrough fallthrough
case 8: case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = GetLibraryItemsQueryParamType(v) *e = GetLibraryItemsQueryParamType(v)
return nil return nil
default: default:
@@ -620,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 type GetLibraryItemsFlattenSeasons string
const ( const (
GetLibraryItemsFlattenSeasonsFalse GetLibraryItemsFlattenSeasons = "0" GetLibraryItemsFlattenSeasonsLibraryDefault GetLibraryItemsFlattenSeasons = "-1"
GetLibraryItemsFlattenSeasonsTrue GetLibraryItemsFlattenSeasons = "1" GetLibraryItemsFlattenSeasonsHide GetLibraryItemsFlattenSeasons = "0"
GetLibraryItemsFlattenSeasonsShow GetLibraryItemsFlattenSeasons = "1"
) )
func (e GetLibraryItemsFlattenSeasons) ToPointer() *GetLibraryItemsFlattenSeasons { func (e GetLibraryItemsFlattenSeasons) ToPointer() *GetLibraryItemsFlattenSeasons {
@@ -636,6 +647,8 @@ func (e *GetLibraryItemsFlattenSeasons) UnmarshalJSON(data []byte) error {
return err return err
} }
switch v { switch v {
case "-1":
fallthrough
case "0": case "0":
fallthrough fallthrough
case "1": case "1":
@@ -646,7 +659,64 @@ func (e *GetLibraryItemsFlattenSeasons) UnmarshalJSON(data []byte) error {
} }
} }
// GetLibraryItemsShowOrdering - Setting that indicates the episode ordering for the show // 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, // None = Library default,
// tmdbAiring = The Movie Database (Aired), // tmdbAiring = The Movie Database (Aired),
// aired = TheTVDB (Aired), // aired = TheTVDB (Aired),
@@ -655,11 +725,11 @@ func (e *GetLibraryItemsFlattenSeasons) UnmarshalJSON(data []byte) error {
type GetLibraryItemsShowOrdering string type GetLibraryItemsShowOrdering string
const ( const (
GetLibraryItemsShowOrderingNone GetLibraryItemsShowOrdering = "None" GetLibraryItemsShowOrderingNone GetLibraryItemsShowOrdering = "None"
GetLibraryItemsShowOrderingTmdbAiring GetLibraryItemsShowOrdering = "tmdbAiring" GetLibraryItemsShowOrderingTmdbAiring GetLibraryItemsShowOrdering = "tmdbAiring"
GetLibraryItemsShowOrderingAired GetLibraryItemsShowOrdering = "aired" GetLibraryItemsShowOrderingTvdbAired GetLibraryItemsShowOrdering = "aired"
GetLibraryItemsShowOrderingDvd GetLibraryItemsShowOrdering = "dvd" GetLibraryItemsShowOrderingTvdbDvd GetLibraryItemsShowOrdering = "dvd"
GetLibraryItemsShowOrderingAbsolute GetLibraryItemsShowOrdering = "absolute" GetLibraryItemsShowOrderingTvdbAbsolute GetLibraryItemsShowOrdering = "absolute"
) )
func (e GetLibraryItemsShowOrdering) ToPointer() *GetLibraryItemsShowOrdering { func (e GetLibraryItemsShowOrdering) ToPointer() *GetLibraryItemsShowOrdering {
@@ -1633,18 +1703,23 @@ type GetLibraryItemsMetadata struct {
LibrarySectionKey *string `json:"librarySectionKey,omitempty"` LibrarySectionKey *string `json:"librarySectionKey,omitempty"`
// The type of media content // The type of media content
// //
Type GetLibraryItemsLibraryType `json:"type"` Type GetLibraryItemsLibraryType `json:"type"`
Title string `json:"title"` Title string `json:"title"`
Slug *string `json:"slug,omitempty"` Slug *string `json:"slug,omitempty"`
ContentRating *string `json:"contentRating,omitempty"` ContentRating *string `json:"contentRating,omitempty"`
Summary string `json:"summary"` Summary string `json:"summary"`
Rating *float64 `json:"rating,omitempty"` Rating *float64 `json:"rating,omitempty"`
AudienceRating *float64 `json:"audienceRating,omitempty"` AudienceRating *float64 `json:"audienceRating,omitempty"`
Year *int `json:"year,omitempty"` Year *int `json:"year,omitempty"`
SeasonCount *int `json:"seasonCount,omitempty"` SeasonCount *int `json:"seasonCount,omitempty"`
Tagline *string `json:"tagline,omitempty"` Tagline *string `json:"tagline,omitempty"`
FlattenSeasons *GetLibraryItemsFlattenSeasons `default:"0" json:"flattenSeasons"` // Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show).
// Setting that indicates the episode ordering for the 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, // None = Library default,
// tmdbAiring = The Movie Database (Aired), // tmdbAiring = The Movie Database (Aired),
// aired = TheTVDB (Aired), // aired = TheTVDB (Aired),
@@ -1860,6 +1935,20 @@ func (o *GetLibraryItemsMetadata) GetFlattenSeasons() *GetLibraryItemsFlattenSea
return o.FlattenSeasons 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 { func (o *GetLibraryItemsMetadata) GetShowOrdering() *GetLibraryItemsShowOrdering {
if o == nil { if o == nil {
return nil return nil

View File

@@ -782,15 +782,25 @@ func (o *Producer) GetThumb() *string {
} }
type GetMetaDataByRatingKeyMetadata struct { type GetMetaDataByRatingKeyMetadata struct {
RatingKey *string `json:"ratingKey,omitempty"` RatingKey *string `json:"ratingKey,omitempty"`
Key *string `json:"key,omitempty"` Key *string `json:"key,omitempty"`
GUID *string `json:"guid,omitempty"` GUID *string `json:"guid,omitempty"`
Studio *string `json:"studio,omitempty"` Studio *string `json:"studio,omitempty"`
Type *string `json:"type,omitempty"` Type *string `json:"type,omitempty"`
Title *string `json:"title,omitempty"` Title *string `json:"title,omitempty"`
LibrarySectionTitle *string `json:"librarySectionTitle,omitempty"` LibrarySectionTitle *string `json:"librarySectionTitle,omitempty"`
LibrarySectionID *int `json:"librarySectionID,omitempty"` LibrarySectionID *int `json:"librarySectionID,omitempty"`
LibrarySectionKey *string `json:"librarySectionKey,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"` ContentRating *string `json:"contentRating,omitempty"`
Summary *string `json:"summary,omitempty"` Summary *string `json:"summary,omitempty"`
Rating *float64 `json:"rating,omitempty"` Rating *float64 `json:"rating,omitempty"`
@@ -891,6 +901,41 @@ func (o *GetMetaDataByRatingKeyMetadata) GetLibrarySectionKey() *string {
return o.LibrarySectionKey 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 { func (o *GetMetaDataByRatingKeyMetadata) GetContentRating() *string {
if o == nil { if o == nil {
return nil return nil

View File

@@ -12,54 +12,6 @@ var GetPinServerList = []string{
"https://plex.tv/api/v2", "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 { type GetPinRequest struct {
// Determines the kind of code returned by the API call // Determines the kind of code returned by the API call
// Strong codes are used for Pin authentication flows // 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"` 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) // 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.) // The name of the client application. (Plex Web, Plex Media Server, etc.)
ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"` ClientName *string `header:"style=simple,explode=false,name=X-Plex-Product"`
// A relatively friendly name for the client device // A relatively friendly name for the client device
@@ -96,9 +48,9 @@ func (o *GetPinRequest) GetStrong() *bool {
return o.Strong return o.Strong
} }
func (o *GetPinRequest) GetClientID() *string { func (o *GetPinRequest) GetClientID() string {
if o == nil { if o == nil {
return nil return ""
} }
return o.ClientID return o.ClientID
} }

View File

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

View File

@@ -24,6 +24,8 @@ const (
TypeSeason Type = 3 TypeSeason Type = 3
TypeEpisode Type = 4 TypeEpisode Type = 4
TypeAudio Type = 8 TypeAudio Type = 8
TypeAlbum Type = 9
TypeTrack Type = 10
) )
func (e Type) ToPointer() *Type { func (e Type) ToPointer() *Type {
@@ -44,6 +46,10 @@ func (e *Type) UnmarshalJSON(data []byte) error {
case 4: case 4:
fallthrough fallthrough
case 8: case 8:
fallthrough
case 9:
fallthrough
case 10:
*e = Type(v) *e = Type(v)
return nil return nil
default: default:
@@ -532,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 type FlattenSeasons string
const ( const (
FlattenSeasonsFalse FlattenSeasons = "0" FlattenSeasonsLibraryDefault FlattenSeasons = "-1"
FlattenSeasonsTrue FlattenSeasons = "1" FlattenSeasonsHide FlattenSeasons = "0"
FlattenSeasonsShow FlattenSeasons = "1"
) )
func (e FlattenSeasons) ToPointer() *FlattenSeasons { func (e FlattenSeasons) ToPointer() *FlattenSeasons {
@@ -548,6 +556,8 @@ func (e *FlattenSeasons) UnmarshalJSON(data []byte) error {
return err return err
} }
switch v { switch v {
case "-1":
fallthrough
case "0": case "0":
fallthrough fallthrough
case "1": case "1":
@@ -558,7 +568,64 @@ func (e *FlattenSeasons) UnmarshalJSON(data []byte) error {
} }
} }
// ShowOrdering - Setting that indicates the episode ordering for the show // 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, // None = Library default,
// tmdbAiring = The Movie Database (Aired), // tmdbAiring = The Movie Database (Aired),
// aired = TheTVDB (Aired), // aired = TheTVDB (Aired),
@@ -567,11 +634,11 @@ func (e *FlattenSeasons) UnmarshalJSON(data []byte) error {
type ShowOrdering string type ShowOrdering string
const ( const (
ShowOrderingNone ShowOrdering = "None" ShowOrderingNone ShowOrdering = "None"
ShowOrderingTmdbAiring ShowOrdering = "tmdbAiring" ShowOrderingTmdbAiring ShowOrdering = "tmdbAiring"
ShowOrderingAired ShowOrdering = "aired" ShowOrderingTvdbAired ShowOrdering = "aired"
ShowOrderingDvd ShowOrdering = "dvd" ShowOrderingTvdbDvd ShowOrdering = "dvd"
ShowOrderingAbsolute ShowOrdering = "absolute" ShowOrderingTvdbAbsolute ShowOrdering = "absolute"
) )
func (e ShowOrdering) ToPointer() *ShowOrdering { func (e ShowOrdering) ToPointer() *ShowOrdering {
@@ -1555,8 +1622,13 @@ type GetRecentlyAddedMetadata struct {
Year *int `json:"year,omitempty"` Year *int `json:"year,omitempty"`
SeasonCount *int `json:"seasonCount,omitempty"` SeasonCount *int `json:"seasonCount,omitempty"`
Tagline *string `json:"tagline,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).
// Setting that indicates the episode ordering for the 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, // None = Library default,
// tmdbAiring = The Movie Database (Aired), // tmdbAiring = The Movie Database (Aired),
// aired = TheTVDB (Aired), // aired = TheTVDB (Aired),
@@ -1772,6 +1844,20 @@ func (o *GetRecentlyAddedMetadata) GetFlattenSeasons() *FlattenSeasons {
return o.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 { func (o *GetRecentlyAddedMetadata) GetShowOrdering() *ShowOrdering {
if o == nil { if o == nil {
return nil return nil

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