Compare commits

...

44 Commits

Author SHA1 Message Date
speakeasybot
06ae97fe29 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.598.3 2025-08-07 00:13:14 +00:00
speakeasybot
5848325f97 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.598.0 2025-08-06 00:13:08 +00:00
speakeasybot
82e9da0574 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.558.1 2025-06-10 00:12:09 +00:00
speakeasybot
8c4caee48d ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.555.3 2025-06-05 00:12:09 +00:00
speakeasybot
d9f461ec33 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.542.3 2025-05-06 00:11:47 +00:00
speakeasybot
9b882120dd ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.542.0 2025-05-02 00:11:38 +00:00
speakeasybot
673a771f04 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.535.1 2025-04-19 17:13:50 +00:00
speakeasybot
216a94fe7d ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.535.1 2025-04-18 23:01:17 +00:00
speakeasybot
88d690ffc2 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.531.4 2025-04-15 00:11:29 +00:00
speakeasybot
48a739d923 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.529.1 2025-04-07 00:11:42 +00:00
speakeasybot
8b50020e1e ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.528.1 2025-04-03 21:57:04 +00:00
speakeasybot
4bcd080211 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.526.6 2025-03-31 17:31:23 +00:00
Luke Hagar
2e0f3b64ea Update workflow.yaml 2025-03-31 12:04:45 -05:00
speakeasybot
9b0ac863a4 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.513.4 2025-03-10 00:10:03 +00:00
speakeasybot
33fe0755b5 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.513.4 2025-03-08 00:09:26 +00:00
speakeasybot
1cfc2d604f ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.488.0 2025-02-11 00:10:34 +00:00
speakeasybot
ef0d39928c ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.487.1 2025-02-08 00:10:21 +00:00
speakeasybot
d2a1c188d5 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.487.0 2025-02-07 00:10:35 +00:00
speakeasybot
6db5d8fb30 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.484.1 2025-02-06 00:10:27 +00:00
speakeasybot
89fbd6238e ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.476.2 2025-01-28 00:10:16 +00:00
speakeasybot
7af7441ac7 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.476.0 2025-01-25 00:10:13 +00:00
speakeasybot
d1945b544b ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.459.2 2024-12-23 00:10:53 +00:00
speakeasybot
16bb49d558 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.459.2 2024-12-21 00:10:31 +00:00
speakeasybot
4bea7ae0d8 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.438.3 2024-11-14 00:10:23 +00:00
speakeasybot
da5491e935 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.438.1 2024-11-12 00:10:16 +00:00
speakeasybot
aeebf438e1 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.406.0 2024-10-04 00:10:38 +00:00
speakeasybot
dc815780a6 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.406.0 2024-10-03 00:10:47 +00:00
speakeasybot
636840a553 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.405.6 2024-10-01 00:11:35 +00:00
speakeasybot
c65c9e0cae ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.402.14 2024-09-26 00:10:34 +00:00
speakeasybot
95df2396e7 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.401.2 2024-09-22 00:11:12 +00:00
speakeasybot
f52d81d1f6 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.401.2 2024-09-21 00:10:16 +00:00
speakeasybot
d83bd96c5f ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.399.2 2024-09-19 00:11:05 +00:00
speakeasybot
2289036c2b ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.399.2 2024-09-18 15:03:35 +00:00
speakeasybot
a7eedd3598 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.399.1 2024-09-18 14:12:18 +00:00
speakeasybot
e579b8d23b ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.399.0 2024-09-18 03:04:05 +00:00
speakeasybot
fd429e38e0 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.397.2 2024-09-16 18:37:41 +00:00
Luke Hagar
2b4a59f67f Update workflow.yaml 2024-09-16 13:13:31 -05:00
speakeasybot
6268a854c1 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.396.9 2024-09-16 00:11:15 +00:00
speakeasybot
d061e9c253 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.396.9 2024-09-15 00:11:43 +00:00
speakeasybot
fcfb68eec7 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.396.9 2024-09-14 00:10:26 +00:00
speakeasybot
37dabea51a ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.396.6 2024-09-13 00:11:01 +00:00
speakeasybot
f47e4b689b ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.396.2 2024-09-12 00:10:54 +00:00
speakeasybot
04130d41d4 ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.395.1 2024-09-11 00:10:56 +00:00
speakeasybot
393db01a6c ci: regenerated with OpenAPI Doc , Speakeasy CLI 1.394.0 2024-09-10 00:11:01 +00:00
713 changed files with 31486 additions and 11836 deletions

4
.gitignore vendored
View File

@@ -1 +1,5 @@
.DS_Store
**/.speakeasy/temp/
**/.speakeasy/logs/
.speakeasy/reports
# .gitignore # .gitignore

File diff suppressed because one or more lines are too long

View File

@@ -4,18 +4,29 @@ generation:
maintainOpenAPIOrder: true maintainOpenAPIOrder: true
usageSnippets: usageSnippets:
optionalPropertyRendering: withExample optionalPropertyRendering: withExample
sdkInitStyle: constructor
useClassNamesForArrayFields: true useClassNamesForArrayFields: true
fixes: fixes:
nameResolutionDec2023: true nameResolutionDec2023: true
nameResolutionFeb2025: false
parameterOrderingFeb2024: true parameterOrderingFeb2024: true
requestResponseComponentNamesFeb2024: true requestResponseComponentNamesFeb2024: true
securityFeb2025: false
sharedErrorComponentsApr2025: false
auth: auth:
oAuth2ClientCredentialsEnabled: true oAuth2ClientCredentialsEnabled: true
oAuth2PasswordEnabled: false
tests:
generateTests: true
generateNewTests: false
skipResponseBodyAssertions: false
go: go:
version: 0.11.2 version: 0.24.1
additionalDependencies: {} additionalDependencies: {}
allowUnknownFieldsInWeakUnions: false allowUnknownFieldsInWeakUnions: false
baseErrorName: PlexAPIError
clientServerStatusCodesAsErrors: true clientServerStatusCodesAsErrors: true
defaultErrorName: SDKError
flattenGlobalSecurity: true flattenGlobalSecurity: true
imports: imports:
option: openapi option: openapi
@@ -28,6 +39,8 @@ go:
inputModelSuffix: input inputModelSuffix: input
maxMethodParams: 4 maxMethodParams: 4
methodArguments: require-security-and-request methodArguments: require-security-and-request
modulePath: ""
outputModelSuffix: output outputModelSuffix: output
packageName: github.com/LukeHagar/plexgo packageName: github.com/LukeHagar/plexgo
responseFormat: envelope responseFormat: envelope
sdkPackageName: ""

View File

@@ -1,33 +1,41 @@
speakeasyVersion: 1.393.2 speakeasyVersion: 1.598.3
sources: sources:
my-source: my-source:
sourceNamespace: my-source sourceNamespace: my-source
sourceRevisionDigest: sha256:289c5a73965c8fa779f32919d1353d0d275163982c0a0f5525ef4146c462a486 sourceRevisionDigest: sha256:92a2a2049bfbf67bea601a6b1b77d274e83a2d3b6968a0bc02dc290b21c7689d
sourceBlobDigest: sha256:f7e2709f52370dff16c1851a7a4e44a89f2e978e9cae335bffc10625950b3bd9 sourceBlobDigest: sha256:f7e2709f52370dff16c1851a7a4e44a89f2e978e9cae335bffc10625950b3bd9
tags: tags:
- latest - latest
- main - main
plexapi:
sourceNamespace: plexapi
sourceRevisionDigest: sha256:b4fa89a3571fbdcb4228800772a5fe1c292170babcd3e055161ae54402f89577
sourceBlobDigest: sha256:f84dd2bfdaea4074454cea3c7fbc6c9e05515c5e9e961abb4923b77f8faf48f1
tags:
- latest
- speakeasy-sdk-regen-1754525524
targets: targets:
plexgo: plexgo:
source: my-source source: plexapi
sourceNamespace: my-source sourceNamespace: plexapi
sourceRevisionDigest: sha256:289c5a73965c8fa779f32919d1353d0d275163982c0a0f5525ef4146c462a486 sourceRevisionDigest: sha256:b4fa89a3571fbdcb4228800772a5fe1c292170babcd3e055161ae54402f89577
sourceBlobDigest: sha256:f7e2709f52370dff16c1851a7a4e44a89f2e978e9cae335bffc10625950b3bd9 sourceBlobDigest: sha256:f84dd2bfdaea4074454cea3c7fbc6c9e05515c5e9e961abb4923b77f8faf48f1
codeSamplesNamespace: code-samples-go-plexgo codeSamplesNamespace: code-samples-go-plexgo
codeSamplesRevisionDigest: sha256:37430719f4245ba94b523786b463eb86951bde2ec93c8ba2fb1658de2199f94e codeSamplesRevisionDigest: sha256:b3b33cad9d51c5c7b91f0fb005d52d487405e8a7a6e60663cec67546202aac78
outLocation: /github/workspace/repo
workflow: workflow:
workflowVersion: 1.0.0 workflowVersion: 1.0.0
speakeasyVersion: latest speakeasyVersion: latest
sources: sources:
my-source: plexapi:
inputs: inputs:
- location: registry.speakeasyapi.dev/lukehagar/lukehagar/plex-api:main - location: registry.speakeasyapi.dev/plexapi/plexapi/plexapi:main
targets: targets:
plexgo: plexgo:
target: go target: go
source: my-source source: plexapi
codeSamples: codeSamples:
output: codeSamples.yaml output: codeSamples.yaml
registry: registry:
location: registry.speakeasyapi.dev/lukehagar/lukehagar/code-samples-go-plexgo location: registry.speakeasyapi.dev/plexapi/plexapi/code-samples-go-plexgo
labelOverride:
fixedValue: PlexGO

View File

@@ -1,14 +1,16 @@
workflowVersion: 1.0.0 workflowVersion: 1.0.0
speakeasyVersion: latest speakeasyVersion: latest
sources: sources:
my-source: plexapi:
inputs: inputs:
- location: registry.speakeasyapi.dev/lukehagar/lukehagar/plex-api:main - location: registry.speakeasyapi.dev/plexapi/plexapi/plexapi:main
targets: targets:
plexgo: plexgo:
target: go target: go
source: my-source source: plexapi
codeSamples: codeSamples:
output: codeSamples.yaml output: codeSamples.yaml
registry: registry:
location: registry.speakeasyapi.dev/lukehagar/lukehagar/code-samples-go-plexgo location: registry.speakeasyapi.dev/plexapi/plexapi/code-samples-go-plexgo
labelOverride:
fixedValue: PlexGO

322
README.md
View File

@@ -11,21 +11,53 @@
## Summary ## Summary
Plex-API: An Open API Spec for interacting with Plex.tv and Plex Media Server Plex-API: An Open API Spec for interacting with Plex.tv and Plex Media Server
# Plex Media Server OpenAPI Specification
An Open Source OpenAPI Specification for Plex Media Server
Automation and SDKs provided by [Speakeasy](https://speakeasyapi.dev/)
## Documentation
[API Documentation](https://plexapi.dev)
## SDKs
The following SDKs are generated from the OpenAPI Specification. They are automatically generated and may not be fully tested. If you find any issues, please open an issue on the [main specification Repository](https://github.com/LukeHagar/plex-api-spec).
| Language | Repository | Releases | Other |
| --------------------- | ------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------- |
| Python | [GitHub](https://github.com/LukeHagar/plexpy) | [PyPI](https://pypi.org/project/plex-api-client/) | - |
| JavaScript/TypeScript | [GitHub](https://github.com/LukeHagar/plexjs) | [NPM](https://www.npmjs.com/package/@lukehagar/plexjs) \ [JSR](https://jsr.io/@lukehagar/plexjs) | - |
| Go | [GitHub](https://github.com/LukeHagar/plexgo) | [Releases](https://github.com/LukeHagar/plexgo/releases) | [GoDoc](https://pkg.go.dev/github.com/LukeHagar/plexgo) |
| Ruby | [GitHub](https://github.com/LukeHagar/plexruby) | [Releases](https://github.com/LukeHagar/plexruby/releases) | - |
| Swift | [GitHub](https://github.com/LukeHagar/plexswift) | [Releases](https://github.com/LukeHagar/plexswift/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) | - |
| C# | [GitHub](https://github.com/LukeHagar/plexcsharp) | [Releases](https://github.com/LukeHagar/plexcsharp/releases) | -
<!-- End Summary [summary] --> <!-- End Summary [summary] -->
<!-- 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)
* [Global Parameters](#global-parameters)
* [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] -->
@@ -52,12 +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.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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)
@@ -73,36 +105,21 @@ func main() {
<!-- Start Available Resources and Operations [operations] --> <!-- Start Available Resources and Operations [operations] -->
## Available Resources and Operations ## Available Resources and Operations
### [Server](docs/sdks/server/README.md) <details open>
<summary>Available methods</summary>
* [GetServerCapabilities](docs/sdks/server/README.md#getservercapabilities) - Get Server Capabilities
* [GetServerPreferences](docs/sdks/server/README.md#getserverpreferences) - Get Server Preferences
* [GetAvailableClients](docs/sdks/server/README.md#getavailableclients) - Get Available Clients
* [GetDevices](docs/sdks/server/README.md#getdevices) - Get Devices
* [GetServerIdentity](docs/sdks/server/README.md#getserveridentity) - Get Server Identity
* [GetMyPlexAccount](docs/sdks/server/README.md#getmyplexaccount) - Get MyPlex Account
* [GetResizedPhoto](docs/sdks/server/README.md#getresizedphoto) - Get a Resized Photo
* [GetMediaProviders](docs/sdks/server/README.md#getmediaproviders) - Get Media Providers
* [GetServerList](docs/sdks/server/README.md#getserverlist) - Get Server List
### [Media](docs/sdks/media/README.md)
* [MarkPlayed](docs/sdks/media/README.md#markplayed) - Mark Media Played
* [MarkUnplayed](docs/sdks/media/README.md#markunplayed) - Mark Media Unplayed
* [UpdatePlayProgress](docs/sdks/media/README.md#updateplayprogress) - Update Media Play Progress
* [GetBannerImage](docs/sdks/media/README.md#getbannerimage) - Get Banner Image
* [GetThumbImage](docs/sdks/media/README.md#getthumbimage) - Get Thumb Image
### [Video](docs/sdks/video/README.md)
* [GetTimeline](docs/sdks/video/README.md#gettimeline) - Get the timeline for a media item
* [StartUniversalTranscode](docs/sdks/video/README.md#startuniversaltranscode) - Start Universal Transcode
### [Activities](docs/sdks/activities/README.md) ### [Activities](docs/sdks/activities/README.md)
* [GetServerActivities](docs/sdks/activities/README.md#getserveractivities) - Get Server Activities * [GetServerActivities](docs/sdks/activities/README.md#getserveractivities) - Get Server Activities
* [CancelServerActivities](docs/sdks/activities/README.md#cancelserveractivities) - Cancel Server Activities * [CancelServerActivities](docs/sdks/activities/README.md#cancelserveractivities) - Cancel Server Activities
### [Authentication](docs/sdks/authentication/README.md)
* [GetTransientToken](docs/sdks/authentication/README.md#gettransienttoken) - Get a Transient Token
* [GetSourceConnectionInformation](docs/sdks/authentication/README.md#getsourceconnectioninformation) - Get Source Connection Information
* [GetTokenDetails](docs/sdks/authentication/README.md#gettokendetails) - Get Token Details
* [PostUsersSignInData](docs/sdks/authentication/README.md#postuserssignindata) - Get User Sign In Data
### [Butler](docs/sdks/butler/README.md) ### [Butler](docs/sdks/butler/README.md)
* [GetButlerTasks](docs/sdks/butler/README.md#getbutlertasks) - Get Butler tasks * [GetButlerTasks](docs/sdks/butler/README.md#getbutlertasks) - Get Butler tasks
@@ -111,45 +128,34 @@ func main() {
* [StartTask](docs/sdks/butler/README.md#starttask) - Start a single Butler task * [StartTask](docs/sdks/butler/README.md#starttask) - Start a single Butler task
* [StopTask](docs/sdks/butler/README.md#stoptask) - Stop a single Butler task * [StopTask](docs/sdks/butler/README.md#stoptask) - Stop a single Butler task
### [Plex](docs/sdks/plex/README.md)
* [GetCompanionsData](docs/sdks/plex/README.md#getcompanionsdata) - Get Companions Data
* [GetUserFriends](docs/sdks/plex/README.md#getuserfriends) - Get list of friends of the user logged in
* [GetGeoData](docs/sdks/plex/README.md#getgeodata) - Get Geo Data
* [GetHomeData](docs/sdks/plex/README.md#gethomedata) - Get Plex Home Data
* [GetServerResources](docs/sdks/plex/README.md#getserverresources) - Get Server Resources
* [GetPin](docs/sdks/plex/README.md#getpin) - Get a Pin
* [GetTokenByPinID](docs/sdks/plex/README.md#gettokenbypinid) - Get Access Token by PinId
### [Hubs](docs/sdks/hubs/README.md) ### [Hubs](docs/sdks/hubs/README.md)
* [GetGlobalHubs](docs/sdks/hubs/README.md#getglobalhubs) - Get Global Hubs * [GetGlobalHubs](docs/sdks/hubs/README.md#getglobalhubs) - Get Global Hubs
* [GetRecentlyAdded](docs/sdks/hubs/README.md#getrecentlyadded) - Get Recently Added
* [GetLibraryHubs](docs/sdks/hubs/README.md#getlibraryhubs) - Get library specific hubs * [GetLibraryHubs](docs/sdks/hubs/README.md#getlibraryhubs) - Get library specific hubs
### [Search](docs/sdks/search/README.md)
* [PerformSearch](docs/sdks/search/README.md#performsearch) - Perform a search
* [PerformVoiceSearch](docs/sdks/search/README.md#performvoicesearch) - Perform a voice search
* [GetSearchResults](docs/sdks/search/README.md#getsearchresults) - Get Search Results
### [Library](docs/sdks/library/README.md) ### [Library](docs/sdks/library/README.md)
* [GetFileHash](docs/sdks/library/README.md#getfilehash) - Get Hash Value * [GetFileHash](docs/sdks/library/README.md#getfilehash) - Get Hash Value
* [GetRecentlyAdded](docs/sdks/library/README.md#getrecentlyadded) - Get Recently Added * [GetRecentlyAddedLibrary](docs/sdks/library/README.md#getrecentlyaddedlibrary) - Get Recently Added
* [GetAllLibraries](docs/sdks/library/README.md#getalllibraries) - Get All Libraries * [GetAllLibraries](docs/sdks/library/README.md#getalllibraries) - Get All Libraries
* [GetLibraryDetails](docs/sdks/library/README.md#getlibrarydetails) - Get Library Details * [GetLibraryDetails](docs/sdks/library/README.md#getlibrarydetails) - Get Library Details
* [DeleteLibrary](docs/sdks/library/README.md#deletelibrary) - Delete Library Section * [DeleteLibrary](docs/sdks/library/README.md#deletelibrary) - Delete Library Section
* [GetLibraryItems](docs/sdks/library/README.md#getlibraryitems) - Get Library Items * [GetLibraryItems](docs/sdks/library/README.md#getlibraryitems) - Get Library Items
* [GetLibrarySectionsAll](docs/sdks/library/README.md#getlibrarysectionsall) - Get Library section media by tag ALL
* [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
* [GetMetaDataByRatingKey](docs/sdks/library/README.md#getmetadatabyratingkey) - Get Metadata by RatingKey * [GetGenresLibrary](docs/sdks/library/README.md#getgenreslibrary) - Get Genres of library media
* [GetCountriesLibrary](docs/sdks/library/README.md#getcountrieslibrary) - Get Countries of library media
* [GetActorsLibrary](docs/sdks/library/README.md#getactorslibrary) - Get Actors of library media
* [GetSearchAllLibraries](docs/sdks/library/README.md#getsearchalllibraries) - Search All Libraries
* [GetMediaMetaData](docs/sdks/library/README.md#getmediametadata) - Get Media Metadata
* [GetMediaArts](docs/sdks/library/README.md#getmediaarts) - Get Media Background Artwork
* [PostMediaArts](docs/sdks/library/README.md#postmediaarts) - Upload Media Background Artwork
* [GetMediaPosters](docs/sdks/library/README.md#getmediaposters) - Get Media Posters
* [PostMediaPoster](docs/sdks/library/README.md#postmediaposter) - Upload Media Poster
* [GetMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children * [GetMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children
* [GetTopWatchedContent](docs/sdks/library/README.md#gettopwatchedcontent) - Get Top Watched Content * [GetTopWatchedContent](docs/sdks/library/README.md#gettopwatchedcontent) - Get Top Watched Content
* [GetOnDeck](docs/sdks/library/README.md#getondeck) - Get On Deck
### [Watchlist](docs/sdks/watchlist/README.md)
* [GetWatchList](docs/sdks/watchlist/README.md#getwatchlist) - Get User Watchlist
### [Log](docs/sdks/log/README.md) ### [Log](docs/sdks/log/README.md)
@@ -157,6 +163,14 @@ func main() {
* [LogMultiLine](docs/sdks/log/README.md#logmultiline) - Logging a multi-line message * [LogMultiLine](docs/sdks/log/README.md#logmultiline) - Logging a multi-line message
* [EnablePaperTrail](docs/sdks/log/README.md#enablepapertrail) - Enabling Papertrail * [EnablePaperTrail](docs/sdks/log/README.md#enablepapertrail) - Enabling Papertrail
### [Media](docs/sdks/media/README.md)
* [MarkPlayed](docs/sdks/media/README.md#markplayed) - Mark Media Played
* [MarkUnplayed](docs/sdks/media/README.md#markunplayed) - Mark Media Unplayed
* [UpdatePlayProgress](docs/sdks/media/README.md#updateplayprogress) - Update Media Play Progress
* [GetBannerImage](docs/sdks/media/README.md#getbannerimage) - Get Banner Image
* [GetThumbImage](docs/sdks/media/README.md#getthumbimage) - Get Thumb Image
### [Playlists](docs/sdks/playlists/README.md) ### [Playlists](docs/sdks/playlists/README.md)
* [CreatePlaylist](docs/sdks/playlists/README.md#createplaylist) - Create a Playlist * [CreatePlaylist](docs/sdks/playlists/README.md#createplaylist) - Create a Playlist
@@ -169,18 +183,34 @@ func main() {
* [AddPlaylistContents](docs/sdks/playlists/README.md#addplaylistcontents) - Adding to a Playlist * [AddPlaylistContents](docs/sdks/playlists/README.md#addplaylistcontents) - Adding to a Playlist
* [UploadPlaylist](docs/sdks/playlists/README.md#uploadplaylist) - Upload Playlist * [UploadPlaylist](docs/sdks/playlists/README.md#uploadplaylist) - Upload Playlist
### [Authentication](docs/sdks/authentication/README.md) ### [Plex](docs/sdks/plex/README.md)
* [GetTransientToken](docs/sdks/authentication/README.md#gettransienttoken) - Get a Transient Token * [GetCompanionsData](docs/sdks/plex/README.md#getcompanionsdata) - Get Companions Data
* [GetSourceConnectionInformation](docs/sdks/authentication/README.md#getsourceconnectioninformation) - Get Source Connection Information * [GetUserFriends](docs/sdks/plex/README.md#getuserfriends) - Get list of friends of the user logged in
* [GetTokenDetails](docs/sdks/authentication/README.md#gettokendetails) - Get Token Details * [GetGeoData](docs/sdks/plex/README.md#getgeodata) - Get Geo Data
* [PostUsersSignInData](docs/sdks/authentication/README.md#postuserssignindata) - Get User Sign In Data * [GetHomeData](docs/sdks/plex/README.md#gethomedata) - Get Plex Home Data
* [GetServerResources](docs/sdks/plex/README.md#getserverresources) - Get Server Resources
* [GetPin](docs/sdks/plex/README.md#getpin) - Get a Pin
* [GetTokenByPinID](docs/sdks/plex/README.md#gettokenbypinid) - Get Access Token by PinId
### [Statistics](docs/sdks/statistics/README.md)
* [GetStatistics](docs/sdks/statistics/README.md#getstatistics) - Get Media Statistics ### [Search](docs/sdks/search/README.md)
* [GetResourcesStatistics](docs/sdks/statistics/README.md#getresourcesstatistics) - Get Resources Statistics
* [GetBandwidthStatistics](docs/sdks/statistics/README.md#getbandwidthstatistics) - Get Bandwidth Statistics * [PerformSearch](docs/sdks/search/README.md#performsearch) - Perform a search
* [PerformVoiceSearch](docs/sdks/search/README.md#performvoicesearch) - Perform a voice search
* [GetSearchResults](docs/sdks/search/README.md#getsearchresults) - Get Search Results
### [Server](docs/sdks/server/README.md)
* [GetServerCapabilities](docs/sdks/server/README.md#getservercapabilities) - Get Server Capabilities
* [GetServerPreferences](docs/sdks/server/README.md#getserverpreferences) - Get Server Preferences
* [GetAvailableClients](docs/sdks/server/README.md#getavailableclients) - Get Available Clients
* [GetDevices](docs/sdks/server/README.md#getdevices) - Get Devices
* [GetServerIdentity](docs/sdks/server/README.md#getserveridentity) - Get Server Identity
* [GetMyPlexAccount](docs/sdks/server/README.md#getmyplexaccount) - Get MyPlex Account
* [GetResizedPhoto](docs/sdks/server/README.md#getresizedphoto) - Get a Resized Photo
* [GetMediaProviders](docs/sdks/server/README.md#getmediaproviders) - Get Media Providers
* [GetServerList](docs/sdks/server/README.md#getserverlist) - Get Server List
### [Sessions](docs/sdks/sessions/README.md) ### [Sessions](docs/sdks/sessions/README.md)
@@ -189,11 +219,32 @@ func main() {
* [GetTranscodeSessions](docs/sdks/sessions/README.md#gettranscodesessions) - Get Transcode Sessions * [GetTranscodeSessions](docs/sdks/sessions/README.md#gettranscodesessions) - Get Transcode Sessions
* [StopTranscodeSession](docs/sdks/sessions/README.md#stoptranscodesession) - Stop a Transcode Session * [StopTranscodeSession](docs/sdks/sessions/README.md#stoptranscodesession) - Stop a Transcode Session
### [Statistics](docs/sdks/statistics/README.md)
* [GetStatistics](docs/sdks/statistics/README.md#getstatistics) - Get Media Statistics
* [GetResourcesStatistics](docs/sdks/statistics/README.md#getresourcesstatistics) - Get Resources Statistics
* [GetBandwidthStatistics](docs/sdks/statistics/README.md#getbandwidthstatistics) - Get Bandwidth Statistics
### [Updater](docs/sdks/updater/README.md) ### [Updater](docs/sdks/updater/README.md)
* [GetUpdateStatus](docs/sdks/updater/README.md#getupdatestatus) - Querying status of updates * [GetUpdateStatus](docs/sdks/updater/README.md#getupdatestatus) - Querying status of updates
* [CheckForUpdates](docs/sdks/updater/README.md#checkforupdates) - Checking for updates * [CheckForUpdates](docs/sdks/updater/README.md#checkforupdates) - Checking for updates
* [ApplyUpdates](docs/sdks/updater/README.md#applyupdates) - Apply Updates * [ApplyUpdates](docs/sdks/updater/README.md#applyupdates) - Apply Updates
### [Users](docs/sdks/users/README.md)
* [GetUsers](docs/sdks/users/README.md#getusers) - Get list of all connected users
### [Video](docs/sdks/video/README.md)
* [GetTimeline](docs/sdks/video/README.md#gettimeline) - Get the timeline for a media item
* [StartUniversalTranscode](docs/sdks/video/README.md#startuniversaltranscode) - Start Universal Transcode
### [Watchlist](docs/sdks/watchlist/README.md)
* [GetWatchList](docs/sdks/watchlist/README.md#getwatchlist) - Get User Watchlist
</details>
<!-- End Available Resources and Operations [operations] --> <!-- End Available Resources and Operations [operations] -->
<!-- Start Retries [retries] --> <!-- Start Retries [retries] -->
@@ -214,12 +265,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.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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",
@@ -253,6 +304,8 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithRetryConfig( plexgo.WithRetryConfig(
retry.Config{ retry.Config{
@@ -266,10 +319,8 @@ func main() {
RetryConnectionErrors: false, RetryConnectionErrors: false,
}), }),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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)
@@ -285,13 +336,17 @@ func main() {
<!-- Start Error Handling [errors] --> <!-- Start Error Handling [errors] -->
## Error Handling ## Error Handling
Handling errors in this SDK should largely match your expectations. All operations return a response object or an error, they will never return both. When specified by the OpenAPI spec document, the SDK will return the appropriate subclass. Handling errors in this SDK should largely match your expectations. All operations return a response object or an error, they will never return both.
| Error Object | Status Code | Content Type | By Default, an API error will return `sdkerrors.SDKError`. When custom error responses are specified for an operation, the SDK may also return their associated error. You can refer to respective *Errors* tables in SDK docs for more details on possible error types for each operation.
| ------------------------------------------- | ------------------------------------------- | ------------------------------------------- |
| sdkerrors.GetServerCapabilitiesBadRequest | 400 | application/json | For example, the `GetServerCapabilities` function may return the following errors:
| sdkerrors.GetServerCapabilitiesUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4xx-5xx | */* | | Error Type | Status Code | Content Type |
| ------------------------------------------- | ----------- | ---------------- |
| sdkerrors.GetServerCapabilitiesBadRequest | 400 | application/json |
| sdkerrors.GetServerCapabilitiesUnauthorized | 401 | application/json |
| sdkerrors.SDKError | 4XX, 5XX | \*/\* |
### Example ### Example
@@ -307,12 +362,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.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
ctx := context.Background()
res, err := s.Server.GetServerCapabilities(ctx) res, err := s.Server.GetServerCapabilities(ctx)
if err != nil { if err != nil {
@@ -342,13 +397,15 @@ func main() {
<!-- Start Server Selection [server] --> <!-- Start Server Selection [server] -->
## Server Selection ## Server Selection
### Select Server by Index ### Server Variables
You can override the default server globally using the `WithServerIndex` option when initializing the SDK client instance. The selected server will then be used as the default on the operations that use it. This table lists the indexes associated with the available servers: The default server `{protocol}://{ip}:{port}` contains variables and is set to `https://10.10.10.47:32400` by default. To override default values, the following options are available when initializing the SDK client instance:
| # | Server | Variables | | Variable | Option | Supported Values | Default | Description |
| - | ------ | --------- | | ---------- | --------------------------------------- | -------------------------- | --------------- | ---------------------------------------------- |
| 0 | `{protocol}://{ip}:{port}` | `protocol` (default is `https`), `ip` (default is `10.10.10.47`), `port` (default is `32400`) | | `protocol` | `WithProtocol(protocol ServerProtocol)` | - `"http"`<br/>- `"https"` | `"https"` | The protocol to use for the server connection |
| `ip` | `WithIP(ip string)` | string | `"10.10.10.47"` | The IP address or hostname of your Plex Server |
| `port` | `WithPort(port string)` | string | `"32400"` | The port of your Plex Server |
#### Example #### Example
@@ -362,13 +419,15 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithServerIndex(0), plexgo.WithProtocol("https"),
plexgo.WithIP("4982:bc2a:b4f8:efb5:2394:5bc3:ab4f:0e6d"),
plexgo.WithPort("44765"),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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)
@@ -380,16 +439,9 @@ func main() {
``` ```
#### Variables
Some of the server options above contain variables. If you want to set the values of those variables, the following options are provided for doing so:
* `WithProtocol plexgo.ServerProtocol`
* `WithIP string`
* `WithPort string`
### Override Server URL Per-Client ### Override Server URL Per-Client
The default server can also be overridden globally using the `WithServerURL` option when initializing the SDK client instance. For example: The default server can be overridden globally using the `WithServerURL(serverURL string)` option when initializing the SDK client instance. For example:
```go ```go
package main package main
@@ -400,13 +452,13 @@ import (
) )
func main() { func main() {
ctx := context.Background()
s := plexgo.New( s := plexgo.New(
plexgo.WithServerURL("{protocol}://{ip}:{port}"), plexgo.WithServerURL("https://10.10.10.47:32400"),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"), plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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)
@@ -432,13 +484,13 @@ 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.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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)
} }
@@ -467,12 +519,13 @@ The built-in `net/http` client satisfies this interface and a default client bas
import ( import (
"net/http" "net/http"
"time" "time"
"github.com/myorg/your-go-sdk"
"github.com/LukeHagar/plexgo"
) )
var ( var (
httpClient = &http.Client{Timeout: 30 * time.Second} httpClient = &http.Client{Timeout: 30 * time.Second}
sdkClient = sdk.New(sdk.WithClient(httpClient)) sdkClient = plexgo.New(plexgo.WithClient(httpClient))
) )
``` ```
@@ -486,9 +539,9 @@ This can be a convenient way to configure timeouts, cookies, proxies, custom hea
This SDK supports the following security scheme globally: This SDK supports the following security scheme globally:
| Name | Type | Scheme | | Name | Type | Scheme |
| ------------- | ------------- | ------------- | | ------------- | ------ | ------- |
| `AccessToken` | apiKey | API key | | `AccessToken` | apiKey | API key |
You can configure it using the `WithSecurity` option when initializing the SDK client instance. For example: You can configure it using the `WithSecurity` option when initializing the SDK client instance. For example:
```go ```go
@@ -501,12 +554,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.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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)
@@ -545,57 +598,6 @@ d6 := types.MustDateFromString("2019-01-01") // returns types.Date and panics on
``` ```
<!-- End Special Types [types] --> <!-- End Special Types [types] -->
<!-- Start Global Parameters [global-parameters] -->
## Global Parameters
A parameter is configured globally. This parameter may be set on the SDK client instance itself during initialization. When configured as an option during SDK initialization, This global value will be used as the default on the operations that use it. When such operations are called, there is a place in each to override the global value, if needed.
For example, you can set `X-Plex-Client-Identifier` to `"gcgzw5rz2xovp84b4vha3a40"` at SDK initialization and then you do not have to pass the same value on calls to operations like `GetServerResources`. But if you want to do so you may, which will locally override the global setting. See the example code below for a demonstration.
### Available Globals
The following global parameter is available.
| Name | Type | Required | Description |
| ---- | ---- |:--------:| ----------- |
| XPlexClientIdentifier | string | | The unique identifier for the client application
This is used to track the client application and its usage
(UUID, serial number, or other number unique per device)
|
### Example
```go
package main
import (
"context"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
s := plexgo.New(
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
plexgo.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
)
ctx := context.Background()
res, err := s.Plex.GetServerResources(ctx, plexgo.String("gcgzw5rz2xovp84b4vha3a40"), operations.IncludeHTTPSOne.ToPointer(), operations.IncludeRelayOne.ToPointer(), operations.IncludeIPv6One.ToPointer())
if err != nil {
log.Fatal(err)
}
if res.PlexDevices != nil {
// handle response
}
}
```
<!-- End Global Parameters [global-parameters] -->
<!-- Placeholder for Future Speakeasy SDK Sections --> <!-- Placeholder for Future Speakeasy SDK Sections -->
# Development # Development

View File

@@ -772,4 +772,424 @@ Based on:
### Generated ### Generated
- [go v0.11.2] . - [go v0.11.2] .
### Releases ### Releases
- [Go v0.11.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.2 - . - [Go v0.11.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.2 - .
## 2024-09-10 00:08:55
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.394.0 (2.413.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.3] .
### Releases
- [Go v0.11.3] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.3 - .
## 2024-09-11 00:08:50
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.395.1 (2.415.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.4] .
### Releases
- [Go v0.11.4] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.4 - .
## 2024-09-12 00:08:45
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.396.2 (2.415.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.5] .
### Releases
- [Go v0.11.5] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.5 - .
## 2024-09-13 00:08:56
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.396.6 (2.415.6) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.6] .
### Releases
- [Go v0.11.6] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.6 - .
## 2024-09-14 00:08:16
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.396.9 (2.415.7) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.7] .
### Releases
- [Go v0.11.7] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.7 - .
## 2024-09-15 00:09:40
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.396.9 (2.415.7) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.8] .
### Releases
- [Go v0.11.8] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.8 - .
## 2024-09-16 00:09:14
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.396.9 (2.415.7) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.9] .
### Releases
- [Go v0.11.9] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.9 - .
## 2024-09-16 18:35:29
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.397.2 (2.415.8) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.10] .
### Releases
- [Go v0.11.10] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.10 - .
## 2024-09-18 03:01:47
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.399.0 (2.415.8) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.11] .
### Releases
- [Go v0.11.11] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.11 - .
## 2024-09-18 14:09:58
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.399.1 (2.415.8) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.12] .
### Releases
- [Go v0.11.12] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.12 - .
## 2024-09-18 15:01:19
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.399.2 (2.416.6) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.13] .
### Releases
- [Go v0.11.13] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.13 - .
## 2024-09-19 00:08:52
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.399.2 (2.416.6) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.11.14] .
### Releases
- [Go v0.11.14] https://github.com/LukeHagar/plexgo/releases/tag/v0.11.14 - .
## 2024-09-21 00:08:46
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.401.2 (2.421.3) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.12.0] .
### Releases
- [Go v0.12.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.12.0 - .
## 2024-09-22 00:09:45
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.401.2 (2.421.3) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.12.1] .
### Releases
- [Go v0.12.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.12.1 - .
## 2024-09-26 00:09:00
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.402.14 (2.422.22) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.13.0] .
### Releases
- [Go v0.13.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.13.0 - .
## 2024-10-01 00:10:01
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.405.6 (2.428.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.14.0] .
### Releases
- [Go v0.14.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.14.0 - .
## 2024-10-03 00:09:11
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.406.0 (2.429.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.15.0] .
### Releases
- [Go v0.15.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.15.0 - .
## 2024-10-04 00:09:04
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.406.0 (2.429.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.15.1] .
### Releases
- [Go v0.15.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.15.1 - .
## 2024-11-12 00:08:55
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.438.1 (2.457.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.16.0] .
### Releases
- [Go v0.16.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.16.0 - .
## 2024-11-14 00:09:05
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.438.3 (2.457.9) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.16.1] .
### Releases
- [Go v0.16.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.16.1 - .
## 2024-12-21 00:09:02
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.459.2 (2.483.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.0] .
### Releases
- [Go v0.17.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.0 - .
## 2024-12-23 00:09:31
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.459.2 (2.483.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.1] .
### Releases
- [Go v0.17.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.1 - .
## 2025-01-25 00:08:47
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.476.0 (2.496.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.2] .
### Releases
- [Go v0.17.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.2 - .
## 2025-01-28 00:08:53
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.476.2 (2.495.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.3] .
### Releases
- [Go v0.17.3] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.3 - .
## 2025-02-06 00:09:00
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.484.1 (2.503.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.17.4] .
### Releases
- [Go v0.17.4] https://github.com/LukeHagar/plexgo/releases/tag/v0.17.4 - .
## 2025-02-07 00:09:08
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.487.0 (2.506.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.18.0] .
### Releases
- [Go v0.18.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.18.0 - .
## 2025-02-08 00:08:51
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.487.1 (2.506.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.18.1] .
### Releases
- [Go v0.18.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.18.1 - .
## 2025-02-11 00:09:00
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.488.0 (2.506.0) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.0] .
### Releases
- [Go v0.19.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.0 - .
## 2025-03-08 00:07:57
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.513.4 (2.545.4) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.1] .
### Releases
- [Go v0.19.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.1 - .
## 2025-03-10 00:08:31
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.513.4 (2.545.4) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.2] .
### Releases
- [Go v0.19.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.2 - .
## 2025-03-31 17:29:50
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.526.6 (2.563.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.19.3] .
### Releases
- [Go v0.19.3] https://github.com/LukeHagar/plexgo/releases/tag/v0.19.3 - .
## 2025-04-03 21:55:33
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.528.1 (2.565.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.20.0] .
### Releases
- [Go v0.20.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.20.0 - .
## 2025-04-07 00:10:20
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.529.1 (2.566.5) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.20.1] .
### Releases
- [Go v0.20.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.20.1 - .
## 2025-04-15 00:10:03
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.531.4 (2.570.4) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.20.2] .
### Releases
- [Go v0.20.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.20.2 - .
## 2025-04-18 22:59:48
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.535.1 (2.585.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.20.3] .
### Releases
- [Go v0.20.3] https://github.com/LukeHagar/plexgo/releases/tag/v0.20.3 - .
## 2025-04-19 17:12:25
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.535.1 (2.585.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.21.0] .
### Releases
- [Go v0.21.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.21.0 - .
## 2025-05-02 00:10:13
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.542.0 (2.596.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.21.1] .
### Releases
- [Go v0.21.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.21.1 - .
## 2025-05-06 00:10:17
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.542.3 (2.597.9) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.21.2] .
### Releases
- [Go v0.21.2] https://github.com/LukeHagar/plexgo/releases/tag/v0.21.2 - .
## 2025-06-05 00:10:42
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.555.3 (2.620.2) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.22.0] .
### Releases
- [Go v0.22.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.22.0 - .
## 2025-06-10 00:10:47
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.558.1 (2.623.4) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.23.0] .
### Releases
- [Go v0.23.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.23.0 - .
## 2025-08-06 00:11:40
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.598.0 (2.674.1) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.24.0] .
### Releases
- [Go v0.24.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.24.0 - .
## 2025-08-07 00:11:47
### Changes
Based on:
- OpenAPI Doc
- Speakeasy CLI 1.598.3 (2.674.3) https://github.com/speakeasy-api/speakeasy
### Generated
- [go v0.24.1] .
### Releases
- [Go v0.24.1] https://github.com/LukeHagar/plexgo/releases/tag/v0.24.1 - .

View File

@@ -9,12 +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.WithXPlexClientIdentifier("gcgzw5rz2xovp84b4vha3a40"),
) )
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

@@ -6,12 +6,12 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"github.com/LukeHagar/plexgo/internal/config"
"github.com/LukeHagar/plexgo/internal/hooks" "github.com/LukeHagar/plexgo/internal/hooks"
"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"
"io"
"net/http" "net/http"
"net/url" "net/url"
) )
@@ -24,25 +24,22 @@ import (
// - They may contain a `Context` object with attributes which associate the activity with various specific entities (items, libraries, etc.) // - They may contain a `Context` object with attributes which associate the activity with various specific entities (items, libraries, etc.)
// - The may contain a `Response` object which attributes which represent the result of the asynchronous operation. // - The may contain a `Response` object which attributes which represent the result of the asynchronous operation.
type Activities struct { type Activities struct {
sdkConfiguration sdkConfiguration rootSDK *PlexAPI
sdkConfiguration config.SDKConfiguration
hooks *hooks.Hooks
} }
func newActivities(sdkConfig sdkConfiguration) *Activities { func newActivities(rootSDK *PlexAPI, sdkConfig config.SDKConfiguration, hooks *hooks.Hooks) *Activities {
return &Activities{ return &Activities{
rootSDK: rootSDK,
sdkConfiguration: sdkConfig, sdkConfiguration: sdkConfig,
hooks: hooks,
} }
} }
// GetServerActivities - Get Server Activities // GetServerActivities - Get Server Activities
// Get Server Activities // Get Server Activities
func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations.Option) (*operations.GetServerActivitiesResponse, error) { func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations.Option) (*operations.GetServerActivitiesResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
@@ -55,12 +52,27 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/activities") opURL, err := url.JoinPath(baseURL, "/activities")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
SDK: s.rootSDK,
SDKConfiguration: s.sdkConfiguration,
BaseURL: baseURL,
Context: ctx,
OperationID: "getServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -83,6 +95,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 {
@@ -103,17 +119,23 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
"504", "504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
copyBody, err := req.GetBody() copyBody, err := req.GetBody()
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Body = copyBody req.Body = copyBody
} }
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.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)
@@ -124,7 +146,7 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
} }
return httpRes, err return httpRes, err
}) })
@@ -132,13 +154,13 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
if err != nil { if err != nil {
return nil, err return nil, err
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
} else { } else {
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -151,17 +173,17 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
return nil, err return nil, err
} else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) {
_httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} else if _httpRes != nil { } else if _httpRes != nil {
httpRes = _httpRes httpRes = _httpRes
} }
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -174,21 +196,11 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -200,17 +212,16 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
res.Object = &out res.Object = &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -223,17 +234,16 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -246,28 +256,29 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -278,13 +289,6 @@ func (s *Activities) GetServerActivities(ctx context.Context, opts ...operations
// CancelServerActivities - Cancel Server Activities // CancelServerActivities - Cancel Server Activities
// Cancel Server Activities // Cancel Server Activities
func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID string, opts ...operations.Option) (*operations.CancelServerActivitiesResponse, error) { func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID string, opts ...operations.Option) (*operations.CancelServerActivitiesResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "cancelServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.CancelServerActivitiesRequest{ request := operations.CancelServerActivitiesRequest{
ActivityUUID: activityUUID, ActivityUUID: activityUUID,
} }
@@ -301,12 +305,27 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := utils.GenerateURL(ctx, baseURL, "/activities/{activityUUID}", request, nil) opURL, err := utils.GenerateURL(ctx, baseURL, "/activities/{activityUUID}", request, nil)
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
SDK: s.rootSDK,
SDKConfiguration: s.sdkConfiguration,
BaseURL: baseURL,
Context: ctx,
OperationID: "cancelServerActivities",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -329,6 +348,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 {
@@ -349,17 +372,23 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
"504", "504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
copyBody, err := req.GetBody() copyBody, err := req.GetBody()
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Body = copyBody req.Body = copyBody
} }
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.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)
@@ -370,7 +399,7 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
} }
return httpRes, err return httpRes, err
}) })
@@ -378,13 +407,13 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
if err != nil { if err != nil {
return nil, err return nil, err
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
} else { } else {
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -397,17 +426,17 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
return nil, err return nil, err
} else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) {
_httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} else if _httpRes != nil { } else if _httpRes != nil {
httpRes = _httpRes httpRes = _httpRes
} }
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -420,22 +449,12 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -448,17 +467,16 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -471,28 +489,29 @@ func (s *Activities) CancelServerActivities(ctx context.Context, activityUUID st
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }

View File

@@ -6,37 +6,34 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"github.com/LukeHagar/plexgo/internal/config"
"github.com/LukeHagar/plexgo/internal/hooks" "github.com/LukeHagar/plexgo/internal/hooks"
"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"
"io"
"net/http" "net/http"
"net/url" "net/url"
) )
// Authentication - API Calls regarding authentication for Plex Media Server // Authentication - API Calls regarding authentication for Plex Media Server
type Authentication struct { type Authentication struct {
sdkConfiguration sdkConfiguration rootSDK *PlexAPI
sdkConfiguration config.SDKConfiguration
hooks *hooks.Hooks
} }
func newAuthentication(sdkConfig sdkConfiguration) *Authentication { func newAuthentication(rootSDK *PlexAPI, sdkConfig config.SDKConfiguration, hooks *hooks.Hooks) *Authentication {
return &Authentication{ return &Authentication{
rootSDK: rootSDK,
sdkConfiguration: sdkConfig, sdkConfiguration: sdkConfig,
hooks: hooks,
} }
} }
// GetTransientToken - Get a Transient Token // GetTransientToken - Get a Transient Token
// This endpoint provides the caller with a temporary token with the same access level as the caller's token. These tokens are valid for up to 48 hours and are destroyed if the server instance is restarted. // This endpoint provides the caller with a temporary token with the same access level as the caller's token. These tokens are valid for up to 48 hours and are destroyed if the server instance is restarted.
func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations.GetTransientTokenQueryParamType, scope operations.Scope, opts ...operations.Option) (*operations.GetTransientTokenResponse, error) { func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations.GetTransientTokenQueryParamType, scope operations.Scope, opts ...operations.Option) (*operations.GetTransientTokenResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getTransientToken",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.GetTransientTokenRequest{ request := operations.GetTransientTokenRequest{
Type: type_, Type: type_,
Scope: scope, Scope: scope,
@@ -54,12 +51,27 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/security/token") opURL, err := url.JoinPath(baseURL, "/security/token")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
SDK: s.rootSDK,
SDKConfiguration: s.sdkConfiguration,
BaseURL: baseURL,
Context: ctx,
OperationID: "getTransientToken",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -86,6 +98,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 {
@@ -106,17 +122,23 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
"504", "504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
copyBody, err := req.GetBody() copyBody, err := req.GetBody()
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Body = copyBody req.Body = copyBody
} }
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.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)
@@ -127,7 +149,7 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
} }
return httpRes, err return httpRes, err
}) })
@@ -135,13 +157,13 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
if err != nil { if err != nil {
return nil, err return nil, err
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
} else { } else {
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -154,17 +176,17 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
return nil, err return nil, err
} else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) {
_httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} else if _httpRes != nil { } else if _httpRes != nil {
httpRes = _httpRes httpRes = _httpRes
} }
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -177,22 +199,12 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -205,17 +217,16 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -228,28 +239,29 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -261,13 +273,6 @@ func (s *Authentication) GetTransientToken(ctx context.Context, type_ operations
// If a caller requires connection details and a transient token for a source that is known to the server, for example a cloud media provider or shared PMS, then this endpoint can be called. This endpoint is only accessible with either an admin token or a valid transient token generated from an admin token. // If a caller requires connection details and a transient token for a source that is known to the server, for example a cloud media provider or shared PMS, then this endpoint can be called. This endpoint is only accessible with either an admin token or a valid transient token generated from an admin token.
// Note: requires Plex Media Server >= 1.15.4. // Note: requires Plex Media Server >= 1.15.4.
func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, source string, opts ...operations.Option) (*operations.GetSourceConnectionInformationResponse, error) { func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, source string, opts ...operations.Option) (*operations.GetSourceConnectionInformationResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getSourceConnectionInformation",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
request := operations.GetSourceConnectionInformationRequest{ request := operations.GetSourceConnectionInformationRequest{
Source: source, Source: source,
} }
@@ -284,12 +289,27 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
} }
} }
baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) var baseURL string
if o.ServerURL == nil {
baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
} else {
baseURL = *o.ServerURL
}
opURL, err := url.JoinPath(baseURL, "/security/resources") opURL, err := url.JoinPath(baseURL, "/security/resources")
if err != nil { if err != nil {
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
SDK: s.rootSDK,
SDKConfiguration: s.sdkConfiguration,
BaseURL: baseURL,
Context: ctx,
OperationID: "getSourceConnectionInformation",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -316,6 +336,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 {
@@ -336,17 +360,23 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
"504", "504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
copyBody, err := req.GetBody() copyBody, err := req.GetBody()
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Body = copyBody req.Body = copyBody
} }
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.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)
@@ -357,7 +387,7 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
} }
return httpRes, err return httpRes, err
}) })
@@ -365,13 +395,13 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
if err != nil { if err != nil {
return nil, err return nil, err
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
} else { } else {
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -384,17 +414,17 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
return nil, err return nil, err
} else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) {
_httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} else if _httpRes != nil { } else if _httpRes != nil {
httpRes = _httpRes httpRes = _httpRes
} }
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -407,22 +437,12 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -435,17 +455,16 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -458,28 +477,29 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -490,16 +510,8 @@ func (s *Authentication) GetSourceConnectionInformation(ctx context.Context, sou
// GetTokenDetails - Get Token Details // GetTokenDetails - Get Token Details
// Get the User data from the provided X-Plex-Token // Get the User data from the provided X-Plex-Token
func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations.Option) (*operations.GetTokenDetailsResponse, error) { func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations.Option) (*operations.GetTokenDetailsResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "getTokenDetails",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
operations.SupportedOptionTimeout, operations.SupportedOptionTimeout,
} }
@@ -520,6 +532,16 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
SDK: s.rootSDK,
SDKConfiguration: s.sdkConfiguration,
BaseURL: baseURL,
Context: ctx,
OperationID: "getTokenDetails",
OAuth2Scopes: []string{},
SecuritySource: s.sdkConfiguration.Security,
}
timeout := o.Timeout timeout := o.Timeout
if timeout == nil { if timeout == nil {
timeout = s.sdkConfiguration.Timeout timeout = s.sdkConfiguration.Timeout
@@ -542,6 +564,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 {
@@ -562,17 +588,23 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
"504", "504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
copyBody, err := req.GetBody() copyBody, err := req.GetBody()
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Body = copyBody req.Body = copyBody
} }
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.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)
@@ -583,7 +615,7 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
} }
return httpRes, err return httpRes, err
}) })
@@ -591,13 +623,13 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
if err != nil { if err != nil {
return nil, err return nil, err
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
} else { } else {
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -610,17 +642,17 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
return nil, err return nil, err
} else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) {
_httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} else if _httpRes != nil { } else if _httpRes != nil {
httpRes = _httpRes httpRes = _httpRes
} }
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -633,21 +665,11 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 200: case httpRes.StatusCode == 200:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -659,17 +681,16 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
res.UserPlexAccount = &out res.UserPlexAccount = &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -682,17 +703,16 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -705,28 +725,29 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }
@@ -736,26 +757,9 @@ func (s *Authentication) GetTokenDetails(ctx context.Context, opts ...operations
// PostUsersSignInData - Get User Sign In Data // PostUsersSignInData - Get User Sign In Data
// Sign in user with username and password and return user data with Plex authentication token // Sign in user with username and password and return user data with Plex authentication token
func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIdentifier *string, requestBody *operations.PostUsersSignInDataRequestBody, opts ...operations.Option) (*operations.PostUsersSignInDataResponse, error) { func (s *Authentication) PostUsersSignInData(ctx context.Context, request operations.PostUsersSignInDataRequest, opts ...operations.Option) (*operations.PostUsersSignInDataResponse, error) {
hookCtx := hooks.HookContext{
Context: ctx,
OperationID: "post-users-sign-in-data",
OAuth2Scopes: []string{},
SecuritySource: nil,
}
request := operations.PostUsersSignInDataRequest{
XPlexClientIdentifier: xPlexClientIdentifier,
RequestBody: requestBody,
}
globals := operations.PostUsersSignInDataGlobals{
XPlexClientIdentifier: s.sdkConfiguration.Globals.XPlexClientIdentifier,
}
o := operations.Options{} o := operations.Options{}
supportedOptions := []string{ supportedOptions := []string{
operations.SupportedOptionServerURL,
operations.SupportedOptionRetries, operations.SupportedOptionRetries,
operations.SupportedOptionTimeout, operations.SupportedOptionTimeout,
} }
@@ -776,6 +780,15 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
return nil, fmt.Errorf("error generating URL: %w", err) return nil, fmt.Errorf("error generating URL: %w", err)
} }
hookCtx := hooks.HookContext{
SDK: s.rootSDK,
SDKConfiguration: s.sdkConfiguration,
BaseURL: baseURL,
Context: ctx,
OperationID: "post-users-sign-in-data",
OAuth2Scopes: []string{},
SecuritySource: nil,
}
bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "RequestBody", "form", `request:"mediaType=application/x-www-form-urlencoded"`) bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "RequestBody", "form", `request:"mediaType=application/x-www-form-urlencoded"`)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -798,10 +811,14 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
} }
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.PopulateQueryParams(ctx, req, request, globals); err != nil { utils.PopulateHeaders(ctx, req, request, nil)
return nil, fmt.Errorf("error populating query params: %w", err)
for k, v := range o.SetHeaders {
req.Header.Set(k, v)
} }
globalRetryConfig := s.sdkConfiguration.RetryConfig globalRetryConfig := s.sdkConfiguration.RetryConfig
@@ -824,17 +841,23 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
"504", "504",
}, },
}, func() (*http.Response, error) { }, func() (*http.Response, error) {
if req.Body != nil { if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
copyBody, err := req.GetBody() copyBody, err := req.GetBody()
if err != nil { if err != nil {
return nil, err return nil, err
} }
req.Body = copyBody req.Body = copyBody
} }
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.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)
@@ -845,7 +868,7 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
} }
return httpRes, err return httpRes, err
}) })
@@ -853,13 +876,13 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
if err != nil { if err != nil {
return nil, err return nil, err
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
} else { } else {
req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -872,17 +895,17 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
err = fmt.Errorf("error sending request: no response") err = fmt.Errorf("error sending request: no response")
} }
_, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
return nil, err return nil, err
} else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) {
_httpRes, err := s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} else if _httpRes != nil { } else if _httpRes != nil {
httpRes = _httpRes httpRes = _httpRes
} }
} else { } else {
httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -895,21 +918,11 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
RawResponse: httpRes, RawResponse: httpRes,
} }
getRawBody := func() ([]byte, error) {
rawBody, err := io.ReadAll(httpRes.Body)
if err != nil {
return nil, fmt.Errorf("error reading response body: %w", err)
}
httpRes.Body.Close()
httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody))
return rawBody, nil
}
switch { switch {
case httpRes.StatusCode == 201: case httpRes.StatusCode == 201:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -921,17 +934,16 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
res.UserPlexAccount = &out res.UserPlexAccount = &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 400: case httpRes.StatusCode == 400:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -944,17 +956,16 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode == 401: case httpRes.StatusCode == 401:
switch { switch {
case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -967,28 +978,29 @@ func (s *Authentication) PostUsersSignInData(ctx context.Context, xPlexClientIde
out.RawResponse = httpRes out.RawResponse = httpRes
return nil, &out return nil, &out
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
} }
case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
fallthrough rawBody, err := utils.ConsumeRawBody(httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: if err != nil {
rawBody, err := getRawBody() return nil, err
}
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
default: default:
rawBody, err := getRawBody() rawBody, err := utils.ConsumeRawBody(httpRes)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
} }

447
butler.go

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
# Action
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------ | ------------------------------ | ------------------------------ | ------------------------------ | ------------------------------ |
| `ID` | *string* | :heavy_check_mark: | N/A | addToContinueWatching |
| `Key` | *string* | :heavy_check_mark: | N/A | /actions/addToContinueWatching |

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,11 @@
# Attributes
Attributes associated with the marker.
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- |
| `ID` | *int64* | :heavy_check_mark: | The identifier for the attributes. | 306970 |
| `Version` | **int64* | :heavy_minus_sign: | The version number of the marker attributes. | 4 |

View File

@@ -5,7 +5,7 @@ The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign aud
## Values ## Values
| Name | Value | | Name | Value |
| ------------------------ | ------------------------ | | --------------------------- | --------------------------- |
| `AutoSelectSubtitleZero` | 0 | | `AutoSelectSubtitleDisable` | 0 |
| `AutoSelectSubtitleOne` | 1 | | `AutoSelectSubtitleEnable` | 1 |

View File

@@ -0,0 +1,15 @@
# Chapter
The thumbnail for the chapter
## Fields
| Field | Type | Required | Description | Example |
| ------------------------------------ | ------------------------------------ | ------------------------------------ | ------------------------------------ | ------------------------------------ |
| `ID` | *int64* | :heavy_check_mark: | N/A | 4 |
| `Filter` | *string* | :heavy_check_mark: | N/A | thumb=4 |
| `Index` | *int64* | :heavy_check_mark: | N/A | 1 |
| `StartTimeOffset` | *int64* | :heavy_check_mark: | N/A | 0 |
| `EndTimeOffset` | *int64* | :heavy_check_mark: | N/A | 100100 |
| `Thumb` | *string* | :heavy_check_mark: | N/A | /library/media/46883/chapterImages/1 |

View File

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

View File

@@ -3,12 +3,12 @@
## Fields ## Fields
| Field | Type | Required | Description | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------- |
| `Protocol` | *string* | :heavy_check_mark: | N/A | | `Protocol` | [operations.Protocol](../../models/operations/protocol.md) | :heavy_check_mark: | The protocol used for the connection (http, https, etc) | http |
| `Address` | *string* | :heavy_check_mark: | N/A | | `Address` | *string* | :heavy_check_mark: | The (ip) address or domain name used for the connection | |
| `Port` | *float64* | :heavy_check_mark: | N/A | | `Port` | *int* | :heavy_check_mark: | The port used for the connection | |
| `URI` | *string* | :heavy_check_mark: | N/A | | `URI` | *string* | :heavy_check_mark: | The full URI of the connection | |
| `Local` | *bool* | :heavy_check_mark: | N/A | | `Local` | *bool* | :heavy_check_mark: | If the connection is local address | |
| `Relay` | *bool* | :heavy_check_mark: | N/A | | `Relay` | *bool* | :heavy_check_mark: | If the connection is relayed through plex.direct | |
| `IPv6` | *bool* | :heavy_check_mark: | N/A | | `IPv6` | *bool* | :heavy_check_mark: | If the connection is using IPv6 | |

View File

@@ -1,8 +1,12 @@
# Country # Country
The filter query string for country media items.
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------------ | ------------------------ | ------------------------ | ------------------------ | ------------------------ | | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | United States of America | | `ID` | *int* | :heavy_check_mark: | The unique identifier for the country.<br/>NOTE: This is different for each Plex server and is not globally unique.<br/> | 259 |
| `Tag` | *string* | :heavy_check_mark: | The country of origin of this media item | United States of America |
| `Filter` | *string* | :heavy_check_mark: | N/A | country=19 |

View File

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

View File

@@ -1,11 +1,11 @@
# DefaultSubtitleAccessibility # DefaultSubtitleAccessibility
The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only shown non-SDH subtitles) The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles)
## Values ## Values
| Name | Value | | Name | Value |
| ---------------------------------- | ---------------------------------- | | ------------------------------------- | ------------------------------------- |
| `DefaultSubtitleAccessibilityZero` | 0 | | `DefaultSubtitleAccessibilityDisable` | 0 |
| `DefaultSubtitleAccessibilityOne` | 1 | | `DefaultSubtitleAccessibilityEnable` | 1 |

View File

@@ -5,7 +5,7 @@ The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer
## Values ## Values
| Name | Value | | Name | Value |
| --------------------------- | --------------------------- | | ------------------------------ | ------------------------------ |
| `DefaultSubtitleForcedZero` | 0 | | `DefaultSubtitleForcedDisable` | 0 |
| `DefaultSubtitleForcedOne` | 1 | | `DefaultSubtitleForcedEnable` | 1 |

View File

@@ -3,6 +3,10 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | Peyton Reed | | `ID` | *int* | :heavy_check_mark: | Unique identifier for the director. | 126522 |
| `Filter` | *string* | :heavy_check_mark: | The filter string used to query this director. | director=235876 |
| `Tag` | *string* | :heavy_check_mark: | The role of Director | Danny Boyle |
| `TagKey` | *string* | :heavy_check_mark: | A unique 24-character hexadecimal key associated with the director's tag, used for internal identification. | 5d776831151a60001f24d031 |
| `Thumb` | **string* | :heavy_minus_sign: | The absolute URL of the thumbnail image for the director. | https://metadata-static.plex.tv/8/people/8d65fa96804802e08f2de09fe014408e.jpg |

View File

@@ -0,0 +1,8 @@
# Extras
## Fields
| Field | Type | Required | Description | Example |
| ----------------------- | ----------------------- | ----------------------- | ----------------------- | ----------------------- |
| `Size` | **int64* | :heavy_minus_sign: | The size of the extras. | 1 |

View File

@@ -3,8 +3,12 @@
## Fields ## Fields
| Field | Type | Required | Description | | Field | Type | Required | Description | Example |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| `Key` | **string* | :heavy_minus_sign: | N/A | | `Key` | **string* | :heavy_minus_sign: | N/A | |
| `Type` | **string* | :heavy_minus_sign: | N/A | | `Type` | *string* | :heavy_check_mark: | N/A | |
| `Directory` | [][operations.GetMediaProvidersDirectory](../../models/operations/getmediaprovidersdirectory.md) | :heavy_minus_sign: | N/A | | `Flavor` | **string* | :heavy_minus_sign: | N/A | global |
| `ScrobbleKey` | **string* | :heavy_minus_sign: | N/A | /:/scrobble/new |
| `UnscrobbleKey` | **string* | :heavy_minus_sign: | N/A | /:/unscrobble/new |
| `Directory` | [][operations.GetMediaProvidersDirectory](../../models/operations/getmediaprovidersdirectory.md) | :heavy_minus_sign: | N/A | |
| `Action` | [][operations.Action](../../models/operations/action.md) | :heavy_minus_sign: | N/A | |

View File

@@ -1,66 +0,0 @@
# Features
## Values
| Name | Value |
| --------------------------------------------- | --------------------------------------------- |
| `FeaturesAndroidDolbyVision` | Android - Dolby Vision |
| `FeaturesAndroidPiP` | Android - PiP |
| `FeaturesCuSunset` | CU Sunset |
| `FeaturesHrkEnableEur` | HRK_enable_EUR |
| `FeaturesTrebleShowFeatures` | TREBLE-show-features |
| `FeaturesAdCountdownTimer` | ad-countdown-timer |
| `FeaturesAdaptiveBitrate` | adaptive_bitrate |
| `FeaturesAmazonLoopDebug` | amazon-loop-debug |
| `FeaturesAvodAdAnalysis` | avod-ad-analysis |
| `FeaturesAvodNewMedia` | avod-new-media |
| `FeaturesBlacklistGetSignin` | blacklist_get_signin |
| `FeaturesClientRadioStations` | client-radio-stations |
| `FeaturesCloudflareTurnstileRequired` | cloudflare-turnstile-required |
| `FeaturesCollections` | collections |
| `FeaturesCommentsAndRepliesPushNotifications` | comments_and_replies_push_notifications |
| `FeaturesCommunityAccessPlexTv` | community_access_plex_tv |
| `FeaturesCompanionsSonos` | companions_sonos |
| `FeaturesCustomHomeRemoval` | custom-home-removal |
| `FeaturesDisableHomeUserFriendships` | disable_home_user_friendships |
| `FeaturesDisableSharingFriendships` | disable_sharing_friendships |
| `FeaturesDrmSupport` | drm_support |
| `FeaturesExcludeRestrictions` | exclude restrictions |
| `FeaturesFederatedAuth` | federated-auth |
| `FeaturesFriendRequestPushNotifications` | friend_request_push_notifications |
| `FeaturesGuidedUpgrade` | guided-upgrade |
| `FeaturesHome` | home |
| `FeaturesIncreasePasswordComplexity` | increase-password-complexity |
| `FeaturesIos14PrivacyBanner` | ios14-privacy-banner |
| `FeaturesIterableNotificationTokens` | iterable-notification-tokens |
| `FeaturesKeepPaymentMethod` | keep-payment-method |
| `FeaturesKevinBacon` | kevin-bacon |
| `FeaturesKoreaConsent` | korea-consent |
| `FeaturesLeIsrgRootX1` | le_isrg_root_x1 |
| `FeaturesLetsEncrypt` | lets_encrypt |
| `FeaturesLightningDvrPivot` | lightning-dvr-pivot |
| `FeaturesLiveTvSupportIncompleteSegments` | live-tv-support-incomplete-segments |
| `FeaturesLivetv` | livetv |
| `FeaturesMetadataSearch` | metadata_search |
| `FeaturesNewPlexPassPrices` | new_plex_pass_prices |
| `FeaturesNewsProviderSunsetModal` | news-provider-sunset-modal |
| `FeaturesPhotosFavorites` | photos-favorites |
| `FeaturesPhotosMetadataEdition` | photos-metadata-edition |
| `FeaturesPmsHealth` | pms_health |
| `FeaturesRadio` | radio |
| `FeaturesRateLimitClientToken` | rate-limit-client-token |
| `FeaturesScrobblingServicePlexTv` | scrobbling-service-plex-tv |
| `FeaturesSharedServerNotification` | shared_server_notification |
| `FeaturesSharedSourceNotification` | shared_source_notification |
| `FeaturesSigninWithApple` | signin_with_apple |
| `FeaturesSpringServeAdProvider` | spring_serve_ad_provider |
| `FeaturesTranscoderCache` | transcoder_cache |
| `FeaturesTunerSharing` | tuner-sharing |
| `FeaturesTwoFactorAuthentication` | two-factor-authentication |
| `FeaturesUnsupportedtuners` | unsupportedtuners |
| `FeaturesUpgrade3ds2` | upgrade-3ds2 |
| `FeaturesVodSchema` | vod-schema |
| `FeaturesVodCloudflare` | vod_cloudflare |
| `FeaturesWatchTogetherInvite` | watch-together-invite |
| `FeaturesWebServerDashboard` | web_server_dashboard |

View File

@@ -5,7 +5,7 @@
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | ------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| `Key` | **string* | :heavy_minus_sign: | N/A | label | | `Key` | *string* | :heavy_check_mark: | N/A | show.title |
| `Title` | **string* | :heavy_minus_sign: | N/A | Label | | `Title` | *string* | :heavy_check_mark: | N/A | Show Title |
| `Type` | **string* | :heavy_minus_sign: | N/A | tag | | `Type` | *string* | :heavy_check_mark: | N/A | string |
| `SubType` | **string* | :heavy_minus_sign: | N/A | bitrate | | `SubType` | **string* | :heavy_minus_sign: | N/A | rating |

View File

@@ -5,5 +5,5 @@
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `Type` | **string* | :heavy_minus_sign: | N/A | resolution | | `Type` | *string* | :heavy_check_mark: | N/A | tag |
| `Operator` | [][operations.Operator](../../models/operations/operator.md) | :heavy_minus_sign: | N/A | | | `Operator` | [][operations.Operator](../../models/operations/operator.md) | :heavy_check_mark: | N/A | |

View File

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

View File

@@ -1,8 +1,12 @@
# Genre # Genre
The filter query string for similar items.
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | Comedy | | `ID` | *int* | :heavy_check_mark: | The unique identifier for the genre.<br/>NOTE: This is different for each Plex server and is not globally unique.<br/> | 259 |
| `Filter` | *string* | :heavy_check_mark: | N/A | genre=19 |
| `Tag` | *string* | :heavy_check_mark: | The genre name of this media-item<br/> | Crime |

View File

@@ -13,7 +13,7 @@ Geo location data
| `City` | *string* | :heavy_check_mark: | The name of the city. | Amsterdam | | `City` | *string* | :heavy_check_mark: | The name of the city. | Amsterdam |
| `EuropeanUnionMember` | **bool* | :heavy_minus_sign: | Indicates if the country is a member of the European Union. | true | | `EuropeanUnionMember` | **bool* | :heavy_minus_sign: | Indicates if the country is a member of the European Union. | true |
| `TimeZone` | *string* | :heavy_check_mark: | The time zone of the country. | America/St_Thomas | | `TimeZone` | *string* | :heavy_check_mark: | The time zone of the country. | America/St_Thomas |
| `PostalCode` | *int64* | :heavy_check_mark: | The postal code of the location. | 802 | | `PostalCode` | *string* | :heavy_check_mark: | The postal code of the location. | 802 |
| `InPrivacyRestrictedCountry` | **bool* | :heavy_minus_sign: | Indicates if the country has privacy restrictions. | true | | `InPrivacyRestrictedCountry` | **bool* | :heavy_minus_sign: | Indicates if the country has privacy restrictions. | true |
| `InPrivacyRestrictedRegion` | **bool* | :heavy_minus_sign: | Indicates if the region has privacy restrictions. | true | | `InPrivacyRestrictedRegion` | **bool* | :heavy_minus_sign: | Indicates if the region has privacy restrictions. | true |
| `Subdivisions` | *string* | :heavy_check_mark: | The name of the primary administrative subdivision. | Saint Thomas | | `Subdivisions` | *string* | :heavy_check_mark: | The name of the primary administrative subdivision. | Saint Thomas |

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -3,26 +3,26 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `AllowSync` | **bool* | :heavy_minus_sign: | N/A | true | | `AllowSync` | *bool* | :heavy_check_mark: | Indicates whether syncing is allowed. | false |
| `Art` | **string* | :heavy_minus_sign: | N/A | /:/resources/movie-fanart.jpg | | `Art` | *string* | :heavy_check_mark: | URL for the background artwork of the media container. | /:/resources/show-fanart.jpg |
| `Composite` | **string* | :heavy_minus_sign: | N/A | /library/sections/1/composite/1705615584 | | `Composite` | *string* | :heavy_check_mark: | The relative path to the composite media item. | /library/sections/1/composite/1743824484 |
| `Filters` | **bool* | :heavy_minus_sign: | N/A | true | | `Filters` | *bool* | :heavy_check_mark: | UNKNOWN | true |
| `Refreshing` | **bool* | :heavy_minus_sign: | N/A | false | | `Refreshing` | *bool* | :heavy_check_mark: | Indicates whether the library is currently being refreshed or updated | true |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /:/resources/movie.png | | `Thumb` | *string* | :heavy_check_mark: | URL for the thumbnail image of the media container. | /:/resources/show.png |
| `Key` | **string* | :heavy_minus_sign: | N/A | 1 | | `Key` | *string* | :heavy_check_mark: | The library key representing the unique identifier | 1 |
| `Type` | **string* | :heavy_minus_sign: | N/A | movie | | `Type` | [operations.GetAllLibrariesType](../../models/operations/getalllibrariestype.md) | :heavy_check_mark: | N/A | movie |
| `Title` | **string* | :heavy_minus_sign: | N/A | Movies | | `Title` | *string* | :heavy_check_mark: | The title of the library | Movies |
| `Agent` | **string* | :heavy_minus_sign: | N/A | tv.plex.agents.movie | | `Agent` | *string* | :heavy_check_mark: | The Plex agent used to match and retrieve media metadata. | tv.plex.agents.movie |
| `Scanner` | **string* | :heavy_minus_sign: | N/A | Plex Movie | | `Scanner` | *string* | :heavy_check_mark: | UNKNOWN | Plex Movie |
| `Language` | **string* | :heavy_minus_sign: | N/A | en-US | | `Language` | *string* | :heavy_check_mark: | The Plex library language that has been set | en-US |
| `UUID` | **string* | :heavy_minus_sign: | N/A | 322a231a-b7f7-49f5-920f-14c61199cd30 | | `UUID` | *string* | :heavy_check_mark: | The universally unique identifier for the library. | e69655a2-ef48-4aba-bb19-01e7d3cc34d6 |
| `UpdatedAt` | **int64* | :heavy_minus_sign: | Unix epoch datetime | 1556281940 | | `UpdatedAt` | *int64* | :heavy_check_mark: | Unix epoch datetime in seconds | 1556281940 |
| `CreatedAt` | **int64* | :heavy_minus_sign: | Unix epoch datetime | 1556281940 | | `CreatedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 |
| `ScannedAt` | **int64* | :heavy_minus_sign: | Unix epoch datetime | 1556281940 | | `ScannedAt` | *int64* | :heavy_check_mark: | Unix epoch datetime in seconds | 1556281940 |
| `Content` | **bool* | :heavy_minus_sign: | N/A | true | | `Content` | *bool* | :heavy_check_mark: | UNKNOWN | true |
| `Directory` | **bool* | :heavy_minus_sign: | N/A | true | | `Directory` | *bool* | :heavy_check_mark: | UNKNOWN | true |
| `ContentChangedAt` | **int* | :heavy_minus_sign: | N/A | 3192854 | | `ContentChangedAt` | *int64* | :heavy_check_mark: | Timestamp (in seconds) representing the last time the content was modified.<br/>NOTE: Some Plex server have some absurd values for this field, like 8457612157633039800 so it should be int64<br/> | 9173960 |
| `Hidden` | **int* | :heavy_minus_sign: | N/A | 0 | | `Hidden` | [*operations.Hidden](../../models/operations/hidden.md) | :heavy_minus_sign: | The Plex library visibility setting | 1 |
| `Location` | [][operations.Location](../../models/operations/location.md) | :heavy_minus_sign: | N/A | | | `Location` | [][operations.GetAllLibrariesLocation](../../models/operations/getalllibrarieslocation.md) | :heavy_check_mark: | N/A | |

View File

@@ -0,0 +1,9 @@
# GetAllLibrariesLocation
## Fields
| Field | Type | Required | Description | Example |
| --------------------------- | --------------------------- | --------------------------- | --------------------------- | --------------------------- |
| `ID` | *int* | :heavy_check_mark: | The ID of the location. | 1 |
| `Path` | *string* | :heavy_check_mark: | The path to the media item. | /Movies |

View File

@@ -5,7 +5,7 @@
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| `Size` | *int* | :heavy_check_mark: | N/A | 5 | | `Size` | *int* | :heavy_check_mark: | Number of media items returned in this response. | 50 |
| `AllowSync` | *bool* | :heavy_check_mark: | N/A | false | | `AllowSync` | *bool* | :heavy_check_mark: | Indicates whether syncing is allowed. | false |
| `Title1` | *string* | :heavy_check_mark: | N/A | Plex Library | | `Title1` | *string* | :heavy_check_mark: | The primary title of the media container. | TV Series |
| `Directory` | [][operations.GetAllLibrariesDirectory](../../models/operations/getalllibrariesdirectory.md) | :heavy_minus_sign: | N/A | | | `Directory` | [][operations.GetAllLibrariesDirectory](../../models/operations/getalllibrariesdirectory.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,19 @@
# GetAllLibrariesType
The library type
## Values
| Name | Value |
| ------------------------------- | ------------------------------- |
| `GetAllLibrariesTypeMovie` | movie |
| `GetAllLibrariesTypeTvShow` | show |
| `GetAllLibrariesTypeSeason` | season |
| `GetAllLibrariesTypeEpisode` | episode |
| `GetAllLibrariesTypeArtist` | artist |
| `GetAllLibrariesTypeAlbum` | album |
| `GetAllLibrariesTypeTrack` | track |
| `GetAllLibrariesTypePhotoAlbum` | photoalbum |
| `GetAllLibrariesTypePhoto` | photo |
| `GetAllLibrariesTypeCollection` | collection |

View File

@@ -10,4 +10,4 @@
| `Height` | *int64* | :heavy_check_mark: | N/A | 396 | | `Height` | *int64* | :heavy_check_mark: | N/A | 396 |
| `MinSize` | *int64* | :heavy_check_mark: | N/A | 1 | | `MinSize` | *int64* | :heavy_check_mark: | N/A | 1 |
| `Upscale` | *int64* | :heavy_check_mark: | N/A | 1 | | `Upscale` | *int64* | :heavy_check_mark: | N/A | 1 |
| `XPlexToken` | *string* | :heavy_check_mark: | Plex Authentication Token | CV5xoxjTpFKUzBTShsaf | | `XPlexToken` | *string* | :heavy_check_mark: | An authentication token, obtained from plex.tv | CV5xoxjTpFKUzBTShsaf |

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -13,7 +13,7 @@ Geo location data
| `City` | *string* | :heavy_check_mark: | The name of the city. | Amsterdam | | `City` | *string* | :heavy_check_mark: | The name of the city. | Amsterdam |
| `EuropeanUnionMember` | **bool* | :heavy_minus_sign: | Indicates if the country is a member of the European Union. | true | | `EuropeanUnionMember` | **bool* | :heavy_minus_sign: | Indicates if the country is a member of the European Union. | true |
| `TimeZone` | *string* | :heavy_check_mark: | The time zone of the country. | America/St_Thomas | | `TimeZone` | *string* | :heavy_check_mark: | The time zone of the country. | America/St_Thomas |
| `PostalCode` | *int64* | :heavy_check_mark: | The postal code of the location. | 802 | | `PostalCode` | *string* | :heavy_check_mark: | The postal code of the location. | 802 |
| `InPrivacyRestrictedCountry` | **bool* | :heavy_minus_sign: | Indicates if the country has privacy restrictions. | true | | `InPrivacyRestrictedCountry` | **bool* | :heavy_minus_sign: | Indicates if the country has privacy restrictions. | true |
| `InPrivacyRestrictedRegion` | **bool* | :heavy_minus_sign: | Indicates if the region has privacy restrictions. | true | | `InPrivacyRestrictedRegion` | **bool* | :heavy_minus_sign: | Indicates if the region has privacy restrictions. | true |
| `Subdivisions` | *string* | :heavy_check_mark: | The name of the primary administrative subdivision. | Saint Thomas | | `Subdivisions` | *string* | :heavy_check_mark: | The name of the primary administrative subdivision. | Saint Thomas |

View File

@@ -0,0 +1,11 @@
# GetLibraryDetailsField
## Fields
| Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ |
| `Key` | **string* | :heavy_minus_sign: | N/A | label |
| `Title` | **string* | :heavy_minus_sign: | N/A | Label |
| `Type` | **string* | :heavy_minus_sign: | N/A | tag |
| `SubType` | **string* | :heavy_minus_sign: | N/A | bitrate |

View File

@@ -0,0 +1,9 @@
# GetLibraryDetailsFieldType
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `Type` | **string* | :heavy_minus_sign: | N/A | resolution |
| `Operator` | [][operations.GetLibraryDetailsOperator](../../models/operations/getlibrarydetailsoperator.md) | :heavy_minus_sign: | N/A | |

View File

@@ -19,4 +19,4 @@
| `ViewMode` | **int* | :heavy_minus_sign: | N/A | 65592 | | `ViewMode` | **int* | :heavy_minus_sign: | N/A | 65592 |
| `Directory` | [][operations.GetLibraryDetailsDirectory](../../models/operations/getlibrarydetailsdirectory.md) | :heavy_minus_sign: | N/A | | | `Directory` | [][operations.GetLibraryDetailsDirectory](../../models/operations/getlibrarydetailsdirectory.md) | :heavy_minus_sign: | N/A | |
| `Type` | [][operations.GetLibraryDetailsType](../../models/operations/getlibrarydetailstype.md) | :heavy_minus_sign: | N/A | | | `Type` | [][operations.GetLibraryDetailsType](../../models/operations/getlibrarydetailstype.md) | :heavy_minus_sign: | N/A | |
| `FieldType` | [][operations.FieldType](../../models/operations/fieldtype.md) | :heavy_minus_sign: | N/A | | | `FieldType` | [][operations.GetLibraryDetailsFieldType](../../models/operations/getlibrarydetailsfieldtype.md) | :heavy_minus_sign: | N/A | |

View File

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

View File

@@ -3,7 +3,7 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | 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 | | `IncludeDetails` | [*operations.IncludeDetails](../../models/operations/includedetails.md) | :heavy_minus_sign: | Whether or not to include details for a section (types, filters, and sorts).<br/>Only exists for backwards compatibility, media providers other than the server libraries have it on always.<br/> | |
| `IncludeDetails` | [*operations.IncludeDetails](../../models/operations/includedetails.md) | :heavy_minus_sign: | Whether or not to include details for a section (types, filters, and sorts). <br/>Only exists for backwards compatibility, media providers other than the server libraries have it on always.<br/> | | | `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,13 @@
# GetLibraryDetailsSort
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- | ---------------------------------- |
| `Default` | **string* | :heavy_minus_sign: | N/A | asc |
| `DefaultDirection` | **string* | :heavy_minus_sign: | N/A | desc |
| `DescKey` | **string* | :heavy_minus_sign: | N/A | random:desc |
| `FirstCharacterKey` | **string* | :heavy_minus_sign: | N/A | /library/sections/1/firstCharacter |
| `Key` | **string* | :heavy_minus_sign: | N/A | random |
| `Title` | **string* | :heavy_minus_sign: | N/A | Randomly |

View File

@@ -10,5 +10,5 @@
| `Title` | **string* | :heavy_minus_sign: | N/A | Movies | | `Title` | **string* | :heavy_minus_sign: | N/A | Movies |
| `Active` | **bool* | :heavy_minus_sign: | N/A | false | | `Active` | **bool* | :heavy_minus_sign: | N/A | false |
| `Filter` | [][operations.GetLibraryDetailsFilter](../../models/operations/getlibrarydetailsfilter.md) | :heavy_minus_sign: | N/A | | | `Filter` | [][operations.GetLibraryDetailsFilter](../../models/operations/getlibrarydetailsfilter.md) | :heavy_minus_sign: | N/A | |
| `Sort` | [][operations.Sort](../../models/operations/sort.md) | :heavy_minus_sign: | N/A | | | `Sort` | [][operations.GetLibraryDetailsSort](../../models/operations/getlibrarydetailssort.md) | :heavy_minus_sign: | N/A | |
| `Field` | [][operations.Field](../../models/operations/field.md) | :heavy_minus_sign: | N/A | | | `Field` | [][operations.GetLibraryDetailsField](../../models/operations/getlibrarydetailsfield.md) | :heavy_minus_sign: | N/A | |

View File

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

View File

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

View File

@@ -3,6 +3,7 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------------ | ------------------------ | ------------------------ | ------------------------ | ------------------------ | | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | United States of America | | `ID` | *int* | :heavy_check_mark: | The unique identifier for the country.<br/>NOTE: This is different for each Plex server and is not globally unique.<br/> | 259 |
| `Tag` | *string* | :heavy_check_mark: | The country of origin of this media item | United States of America |

View File

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

View File

@@ -3,6 +3,8 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | James Cameron | | `ID` | *int* | :heavy_check_mark: | Unique identifier for the director. | 126522 |
| `Tag` | *string* | :heavy_check_mark: | The role of Director | Danny Boyle |
| `Thumb` | **string* | :heavy_minus_sign: | The absolute URL of the thumbnail image for the director. | https://metadata-static.plex.tv/8/people/8d65fa96804802e08f2de09fe014408e.jpg |

View File

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

View File

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

View File

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

View File

@@ -3,6 +3,7 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | Adventure | | `ID` | *int* | :heavy_check_mark: | The unique identifier for the genre.<br/>NOTE: This is different for each Plex server and is not globally unique.<br/> | 259 |
| `Tag` | *string* | :heavy_check_mark: | The genre name of this media-item<br/> | Crime |

View File

@@ -0,0 +1,8 @@
# GetLibraryItemsGuids
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://<br/> | {<br/>"imdbExample": {<br/>"summary": "IMDB example",<br/>"value": "imdb://tt13015952"<br/>},<br/>"tmdbExample": {<br/>"summary": "TMDB example",<br/>"value": "tmdb://2434012"<br/>},<br/>"tvdbExample": {<br/>"summary": "TVDB example",<br/>"value": "tvdb://7945991"<br/>}<br/>} |

View File

@@ -0,0 +1,12 @@
# GetLibraryItemsHasThumbnail
Indicates if the part has a thumbnail.
## Values
| Name | Value |
| ---------------------------------- | ---------------------------------- |
| `GetLibraryItemsHasThumbnailFalse` | 0 |
| `GetLibraryItemsHasThumbnailTrue` | 1 |

View File

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

View File

@@ -0,0 +1,20 @@
# GetLibraryItemsLibraryOptimizedForStreaming
Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true
## Supported Types
### GetLibraryItemsOptimizedForStreaming1
```go
getLibraryItemsLibraryOptimizedForStreaming := operations.CreateGetLibraryItemsLibraryOptimizedForStreamingGetLibraryItemsOptimizedForStreaming1(operations.GetLibraryItemsOptimizedForStreaming1{/* values here */})
```
###
```go
getLibraryItemsLibraryOptimizedForStreaming := operations.CreateGetLibraryItemsLibraryOptimizedForStreamingBoolean(bool{/* values here */})
```

View File

@@ -0,0 +1,11 @@
# GetLibraryItemsLibraryResponseType
## Values
| Name | Value |
| ----------------------------------------------- | ----------------------------------------------- |
| `GetLibraryItemsLibraryResponseTypeCoverPoster` | coverPoster |
| `GetLibraryItemsLibraryResponseTypeBackground` | background |
| `GetLibraryItemsLibraryResponseTypeSnapshot` | snapshot |
| `GetLibraryItemsLibraryResponseTypeClearLogo` | clearLogo |

View File

@@ -0,0 +1,14 @@
# GetLibraryItemsLibraryType
## Fields
| Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| `Key` | *string* | :heavy_check_mark: | N/A | /library/sections/2/all?type=2 |
| `Type` | *string* | :heavy_check_mark: | N/A | show |
| `Title` | *string* | :heavy_check_mark: | N/A | TV Shows |
| `Active` | *bool* | :heavy_check_mark: | N/A | false |
| `Filter` | [][operations.GetLibraryItemsFilter](../../models/operations/getlibraryitemsfilter.md) | :heavy_minus_sign: | N/A | |
| `Sort` | [][operations.GetLibraryItemsSort](../../models/operations/getlibraryitemssort.md) | :heavy_minus_sign: | N/A | |
| `Field` | [][operations.GetLibraryItemsField](../../models/operations/getlibraryitemsfield.md) | :heavy_minus_sign: | N/A | |

View File

@@ -0,0 +1,10 @@
# GetLibraryItemsLocation
The folder path for the media item.
## Fields
| Field | Type | Required | Description | Example |
| ------------------------- | ------------------------- | ------------------------- | ------------------------- | ------------------------- |
| `Path` | *string* | :heavy_check_mark: | N/A | /TV Shows/Clarkson's Farm |

View File

@@ -3,19 +3,24 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ID` | **int* | :heavy_minus_sign: | N/A | 119534 | | `ID` | *int64* | :heavy_check_mark: | Unique media identifier. | 387322 |
| `Duration` | **int* | :heavy_minus_sign: | N/A | 11558112 | | `Duration` | **int* | :heavy_minus_sign: | Duration of the media in milliseconds. | 9610350 |
| `Bitrate` | **int* | :heavy_minus_sign: | N/A | 25025 | | `Bitrate` | **int* | :heavy_minus_sign: | Bitrate in bits per second. | 25512 |
| `Width` | **int* | :heavy_minus_sign: | N/A | 3840 | | `Width` | **int* | :heavy_minus_sign: | Video width in pixels. | 3840 |
| `Height` | **int* | :heavy_minus_sign: | N/A | 2072 | | `Height` | **int* | :heavy_minus_sign: | Video height in pixels. | 1602 |
| `AspectRatio` | **float64* | :heavy_minus_sign: | N/A | 1.85 | | `AspectRatio` | **float32* | :heavy_minus_sign: | Aspect ratio of the video. | 2.35 |
| `AudioChannels` | **int* | :heavy_minus_sign: | N/A | 6 | | `AudioChannels` | **int* | :heavy_minus_sign: | Number of audio channels. | 6 |
| `AudioCodec` | **string* | :heavy_minus_sign: | N/A | eac3 | | `DisplayOffset` | **int* | :heavy_minus_sign: | N/A | 50 |
| `VideoCodec` | **string* | :heavy_minus_sign: | N/A | hevc | | `AudioCodec` | **string* | :heavy_minus_sign: | Audio codec used. | aac |
| `VideoResolution` | **string* | :heavy_minus_sign: | N/A | 4k | | `VideoCodec` | **string* | :heavy_minus_sign: | Video codec used. | hevc |
| `Container` | **string* | :heavy_minus_sign: | N/A | mkv | | `VideoResolution` | **string* | :heavy_minus_sign: | Video resolution (e.g., 4k). | 4k |
| `VideoFrameRate` | **string* | :heavy_minus_sign: | N/A | 24p | | `Container` | **string* | :heavy_minus_sign: | Container format of the media. | mp4 |
| `VideoProfile` | **string* | :heavy_minus_sign: | N/A | main 10 | | `VideoFrameRate` | **string* | :heavy_minus_sign: | Frame rate of the video. Values found include NTSC, PAL, 24p<br/> | 24p |
| `Part` | [][operations.GetLibraryItemsPart](../../models/operations/getlibraryitemspart.md) | :heavy_minus_sign: | N/A | | | `VideoProfile` | **string* | :heavy_minus_sign: | Video profile (e.g., main 10). | main 10 |
| `HasVoiceActivity` | **bool* | :heavy_minus_sign: | Indicates whether voice activity is detected. | false |
| `AudioProfile` | **string* | :heavy_minus_sign: | The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). | dts |
| `OptimizedForStreaming` | [*operations.GetLibraryItemsOptimizedForStreaming](../../models/operations/getlibraryitemsoptimizedforstreaming.md) | :heavy_minus_sign: | Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true | |
| `Has64bitOffsets` | **bool* | :heavy_minus_sign: | Indicates whether the media has 64-bit offsets.<br/>This is relevant for media files that may require larger offsets than what 32-bit integers can provide.<br/> | false |
| `Part` | [][operations.GetLibraryItemsPart](../../models/operations/getlibraryitemspart.md) | :heavy_minus_sign: | N/A | |

View File

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

View File

@@ -0,0 +1,12 @@
# GetLibraryItemsMeta
The Meta object is only included in the response if the `includeMeta` parameter is set to `1`.
## Fields
| Field | Type | Required | Description |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| `Type` | [][operations.GetLibraryItemsLibraryType](../../models/operations/getlibraryitemslibrarytype.md) | :heavy_minus_sign: | N/A |
| `FieldType` | [][operations.GetLibraryItemsFieldType](../../models/operations/getlibraryitemsfieldtype.md) | :heavy_minus_sign: | N/A |

View File

@@ -1,64 +1,88 @@
# GetLibraryItemsMetadata # GetLibraryItemsMetadata
Unknown
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `RatingKey` | **string* | :heavy_minus_sign: | N/A | 58683 | | `RatingKey` | *string* | :heavy_check_mark: | The rating key (Media ID) of this media item. Note: Although this is always an integer, it is represented as a string in the API. | 58683 |
| `Key` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683 | | `Key` | *string* | :heavy_check_mark: | The unique key for the media item. | /library/metadata/58683 |
| `GUID` | **string* | :heavy_minus_sign: | N/A | plex://movie/5d7768ba96b655001fdc0408 | | `GUID` | *string* | :heavy_check_mark: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 |
| `Studio` | **string* | :heavy_minus_sign: | N/A | 20th Century Studios | | `Slug` | *string* | :heavy_check_mark: | A URLfriendly version of the media title. | 4-for-texas |
| `Type` | **string* | :heavy_minus_sign: | N/A | movie | | `Studio` | **string* | :heavy_minus_sign: | The studio that produced the media item. | 20th Century Studios |
| `Title` | **string* | :heavy_minus_sign: | N/A | Avatar: The Way of Water | | `Type` | [operations.GetLibraryItemsType](../../models/operations/getlibraryitemstype.md) | :heavy_check_mark: | N/A | movie |
| `ContentRating` | **string* | :heavy_minus_sign: | N/A | PG-13 | | `Title` | *string* | :heavy_check_mark: | The title of the media item. | Avatar: The Way of Water |
| `Summary` | **string* | :heavy_minus_sign: | N/A | Jake Sully lives with his newfound family formed on the extrasolar moon Pandora. Once a familiar threat returns to finish what was previously started, Jake must work with Neytiri and the army of the Na'vi race to protect their home. | | `Banner` | *string* | :heavy_check_mark: | The banner image URL for the media item. | /library/metadata/58683/banner/1703239236 |
| `Rating` | **float64* | :heavy_minus_sign: | N/A | 7.6 | | `TitleSort` | *string* | :heavy_check_mark: | The sort title used for ordering media items. | Whale |
| `AudienceRating` | **float64* | :heavy_minus_sign: | N/A | 9.2 | | `ContentRating` | **string* | :heavy_minus_sign: | The content rating for the media item. | PG-13 |
| `Year` | **int* | :heavy_minus_sign: | N/A | 2022 | | `Summary` | *string* | :heavy_check_mark: | A synopsis of the media item. | Jake Sully lives with his newfound family formed on the extrasolar moon Pandora.<br/>Once a familiar threat returns to finish what was previously started, Jake must<br/>work with Neytiri and the army of the Na'vi race to protect their home.<br/> |
| `Tagline` | **string* | :heavy_minus_sign: | N/A | Return to Pandora. | | `Rating` | *float32* | :heavy_check_mark: | The critic rating for the media item. | 7.6 |
| `Thumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/thumb/1703239236 | | `AudienceRating` | *float64* | :heavy_check_mark: | The audience rating for the media item. | 9.2 |
| `Art` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58683/art/1703239236 | | `Year` | **int* | :heavy_minus_sign: | The release year of the media item. | 2022 |
| `Duration` | **int* | :heavy_minus_sign: | N/A | 11558112 | | `Tagline` | *string* | :heavy_check_mark: | A brief tagline for the media item. | Return to Pandora. |
| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | N/A | 2022-12-14 00:00:00 +0000 UTC | | `Thumb` | *string* | :heavy_check_mark: | The thumbnail image URL for the media item. | /library/metadata/58683/thumb/1703239236 |
| `AddedAt` | **int* | :heavy_minus_sign: | N/A | 1680457607 | | `Art` | *string* | :heavy_check_mark: | The art image URL for the media item. | /library/metadata/58683/art/1703239236 |
| `UpdatedAt` | **int* | :heavy_minus_sign: | N/A | 1703239236 | | `Theme` | *string* | :heavy_check_mark: | The theme URL for the media item. | /library/metadata/1/theme/1705636920 |
| `AudienceRatingImage` | **string* | :heavy_minus_sign: | N/A | rottentomatoes://image.rating.upright | | `Index` | *int* | :heavy_check_mark: | The index position of the media item. | 1 |
| `ChapterSource` | **string* | :heavy_minus_sign: | N/A | media | | `LeafCount` | **int* | :heavy_minus_sign: | The number of leaf items (end nodes) under this media item. | 14 |
| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/58684 | | `ViewedLeafCount` | **int* | :heavy_minus_sign: | The number of leaf items that have been viewed. | 0 |
| `RatingImage` | **string* | :heavy_minus_sign: | N/A | rottentomatoes://image.rating.ripe | | `ChildCount` | *int* | :heavy_check_mark: | The number of child items associated with this media item. | 1 |
| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | N/A | 66 | | `SeasonCount` | *int* | :heavy_check_mark: | The total number of seasons (for TV shows). | 2022 |
| `GrandparentGUID` | **string* | :heavy_minus_sign: | N/A | plex://show/5d9c081b170e24001f2a7be4 | | `Duration` | *int* | :heavy_check_mark: | The duration of the media item in milliseconds. | 11558112 |
| `GrandparentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/66 | | `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | The original release date of the media item. | 2022-12-14 |
| `GrandparentTitle` | **string* | :heavy_minus_sign: | N/A | Caprica | | `AddedAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 |
| `GrandparentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/66/thumb/1705716261 | | `UpdatedAt` | **int64* | :heavy_minus_sign: | Unix epoch datetime in seconds | 1556281940 |
| `GrandparentArt` | **string* | :heavy_minus_sign: | N/A | /library/metadata/66/art/1705716261 | | `AudienceRatingImage` | **string* | :heavy_minus_sign: | The URL for the audience rating image. | rottentomatoes://image.rating.upright |
| `GrandparentTheme` | **string* | :heavy_minus_sign: | N/A | /library/metadata/66/theme/1705716261 | | `ChapterSource` | **string* | :heavy_minus_sign: | The source from which chapter data is derived. | media |
| `Media` | [][operations.GetLibraryItemsMedia](../../models/operations/getlibraryitemsmedia.md) | :heavy_minus_sign: | N/A | | | `PrimaryExtraKey` | **string* | :heavy_minus_sign: | The primary extra key associated with this media item. | /library/metadata/58684 |
| `Genre` | [][operations.GetLibraryItemsGenre](../../models/operations/getlibraryitemsgenre.md) | :heavy_minus_sign: | N/A | | | `OriginalTitle` | **string* | :heavy_minus_sign: | The original title of the media item (if different). | 映画 ブラッククローバー 魔法帝の剣 |
| `Country` | [][operations.GetLibraryItemsCountry](../../models/operations/getlibraryitemscountry.md) | :heavy_minus_sign: | N/A | | | `ParentRatingKey` | **string* | :heavy_minus_sign: | The rating key of the parent media item. | 66 |
| `Director` | [][operations.GetLibraryItemsDirector](../../models/operations/getlibraryitemsdirector.md) | :heavy_minus_sign: | N/A | | | `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The rating key of the grandparent media item. | 66 |
| `Writer` | [][operations.GetLibraryItemsWriter](../../models/operations/getlibraryitemswriter.md) | :heavy_minus_sign: | N/A | | | `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 |
| `Role` | [][operations.GetLibraryItemsRole](../../models/operations/getlibraryitemsrole.md) | :heavy_minus_sign: | N/A | | | `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 |
| `TitleSort` | **string* | :heavy_minus_sign: | N/A | Whale | | `GrandparentSlug` | **string* | :heavy_minus_sign: | The slug for the grandparent media item. | alice-in-borderland-2020 |
| `ViewCount` | **int* | :heavy_minus_sign: | N/A | 1 | | `GrandparentKey` | **string* | :heavy_minus_sign: | The key of the grandparent media item. | /library/metadata/66 |
| `LastViewedAt` | **int* | :heavy_minus_sign: | N/A | 1682752242 | | `ParentKey` | **string* | :heavy_minus_sign: | The key of the parent media item. | /library/metadata/66 |
| `OriginalTitle` | **string* | :heavy_minus_sign: | N/A | 映画 ブラッククローバー 魔法帝の剣 | | `GrandparentTitle` | **string* | :heavy_minus_sign: | The title of the grandparent media item. | Caprica |
| `ViewOffset` | **int* | :heavy_minus_sign: | N/A | 5222500 | | `GrandparentThumb` | **string* | :heavy_minus_sign: | The thumbnail URL for the grandparent media item. | /library/metadata/66/thumb/1705716261 |
| `SkipCount` | **int* | :heavy_minus_sign: | N/A | 1 | | `GrandparentTheme` | **string* | :heavy_minus_sign: | The theme URL for the grandparent media item. | /library/metadata/66/theme/1705716261 |
| `Index` | **int* | :heavy_minus_sign: | N/A | 1 | | `GrandparentArt` | **string* | :heavy_minus_sign: | The art URL for the grandparent media item. | /library/metadata/66/art/1705716261 |
| `Theme` | **string* | :heavy_minus_sign: | N/A | /library/metadata/1/theme/1705636920 | | `ParentTitle` | **string* | :heavy_minus_sign: | The title of the parent media item. | Caprica |
| `LeafCount` | **int* | :heavy_minus_sign: | N/A | 14 | | `ParentIndex` | **int* | :heavy_minus_sign: | The index position of the parent media item. | 1 |
| `ViewedLeafCount` | **int* | :heavy_minus_sign: | N/A | 0 | | `ParentThumb` | **string* | :heavy_minus_sign: | The thumbnail URL for the parent media item. | /library/metadata/66/thumb/1705716261 |
| `ChildCount` | **int* | :heavy_minus_sign: | N/A | 1 | | `RatingImage` | **string* | :heavy_minus_sign: | The URL for the rating image. | rottentomatoes://image.rating.ripe |
| `HasPremiumExtras` | **string* | :heavy_minus_sign: | N/A | 1 | | `ViewCount` | **int* | :heavy_minus_sign: | The number of times this media item has been viewed. | 1 |
| `HasPremiumPrimaryExtra` | **string* | :heavy_minus_sign: | N/A | 1 | | `ViewOffset` | **int* | :heavy_minus_sign: | The current playback offset (in milliseconds). | 5222500 |
| `ParentRatingKey` | **string* | :heavy_minus_sign: | N/A | 66 | | `SkipCount` | **int* | :heavy_minus_sign: | The number of times this media item has been skipped. | 1 |
| `ParentGUID` | **string* | :heavy_minus_sign: | N/A | plex://show/5d9c081b170e24001f2a7be4 | | `Subtype` | **string* | :heavy_minus_sign: | A classification that further describes the type of media item. For example, 'clip' indicates that the item is a short video clip. | clip |
| `ParentStudio` | **string* | :heavy_minus_sign: | N/A | UCP | | `LastRatedAt` | **int64* | :heavy_minus_sign: | The Unix timestamp representing the last time the item was rated. | 1721813113 |
| `ParentKey` | **string* | :heavy_minus_sign: | N/A | /library/metadata/66 | | `CreatedAtAccuracy` | **string* | :heavy_minus_sign: | The accuracy of the creation timestamp. This value indicates the format(s) provided (for example, 'epoch,local' means both epoch and local time formats are available). | epoch,local |
| `ParentTitle` | **string* | :heavy_minus_sign: | N/A | Caprica | | `CreatedAtTZOffset` | **string* | :heavy_minus_sign: | The time zone offset for the creation timestamp, represented as a string. This offset indicates the difference from UTC. | 0 |
| `ParentIndex` | **int* | :heavy_minus_sign: | N/A | 1 | | `LastViewedAt` | **int* | :heavy_minus_sign: | Unix timestamp for when the media item was last viewed. | 1682752242 |
| `ParentYear` | **int* | :heavy_minus_sign: | N/A | 2010 | | `UserRating` | **float32* | :heavy_minus_sign: | The rating provided by a user for the item. This value is expressed as a decimal number. | 10 |
| `ParentThumb` | **string* | :heavy_minus_sign: | N/A | /library/metadata/66/thumb/1705716261 | | `Image` | [][operations.GetLibraryItemsImage](../../models/operations/getlibraryitemsimage.md) | :heavy_minus_sign: | N/A | |
| `ParentTheme` | **string* | :heavy_minus_sign: | N/A | /library/metadata/66/theme/1705716261 | | `UltraBlurColors` | [*operations.GetLibraryItemsUltraBlurColors](../../models/operations/getlibraryitemsultrablurcolors.md) | :heavy_minus_sign: | N/A | |
| `Guids` | [][operations.GetLibraryItemsGuids](../../models/operations/getlibraryitemsguids.md) | :heavy_minus_sign: | N/A | |
| `LibrarySectionID` | **int64* | :heavy_minus_sign: | The identifier for the library section. | 1 |
| `LibrarySectionTitle` | **string* | :heavy_minus_sign: | The title of the library section. | Movies |
| `LibrarySectionKey` | **string* | :heavy_minus_sign: | The key corresponding to the library section. | /library/sections/1 |
| `ShowOrdering` | [*operations.ShowOrdering](../../models/operations/showordering.md) | :heavy_minus_sign: | Setting that indicates the episode ordering for the show.<br/>Options:<br/> - None = Library default<br/> - tmdbAiring = The Movie Database (Aired)<br/> - aired = TheTVDB (Aired)<br/> - dvd = TheTVDB (DVD)<br/> - absolute = TheTVDB (Absolute)<br/> | absolute |
| `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).<br/> | 1 |
| `SkipChildren` | **bool* | :heavy_minus_sign: | Indicates whether child items should be skipped. | false |
| `Media` | [][operations.GetLibraryItemsMedia](../../models/operations/getlibraryitemsmedia.md) | :heavy_minus_sign: | N/A | |
| `Genre` | [][operations.GetLibraryItemsGenre](../../models/operations/getlibraryitemsgenre.md) | :heavy_minus_sign: | N/A | |
| `Country` | [][operations.GetLibraryItemsCountry](../../models/operations/getlibraryitemscountry.md) | :heavy_minus_sign: | N/A | |
| `Director` | [][operations.GetLibraryItemsDirector](../../models/operations/getlibraryitemsdirector.md) | :heavy_minus_sign: | N/A | |
| `Writer` | [][operations.GetLibraryItemsWriter](../../models/operations/getlibraryitemswriter.md) | :heavy_minus_sign: | N/A | |
| `Producer` | [][operations.GetLibraryItemsProducer](../../models/operations/getlibraryitemsproducer.md) | :heavy_minus_sign: | N/A | |
| `Collection` | [][operations.GetLibraryItemsCollection](../../models/operations/getlibraryitemscollection.md) | :heavy_minus_sign: | N/A | |
| `Role` | [][operations.GetLibraryItemsRole](../../models/operations/getlibraryitemsrole.md) | :heavy_minus_sign: | N/A | |
| `Ratings` | [][operations.Ratings](../../models/operations/ratings.md) | :heavy_minus_sign: | N/A | |
| `Similar` | [][operations.GetLibraryItemsSimilar](../../models/operations/getlibraryitemssimilar.md) | :heavy_minus_sign: | N/A | |
| `Location` | [][operations.GetLibraryItemsLocation](../../models/operations/getlibraryitemslocation.md) | :heavy_minus_sign: | N/A | |
| `Chapter` | [][operations.Chapter](../../models/operations/chapter.md) | :heavy_minus_sign: | N/A | |
| `Marker` | [][operations.Marker](../../models/operations/marker.md) | :heavy_minus_sign: | N/A | |
| `Extras` | [*operations.Extras](../../models/operations/extras.md) | :heavy_minus_sign: | N/A | |

View File

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

View File

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

View File

@@ -0,0 +1,9 @@
# GetLibraryItemsOptimizedForStreaming1
## Values
| Name | Value |
| ------------------------------------------- | ------------------------------------------- |
| `GetLibraryItemsOptimizedForStreaming1Zero` | 0 |
| `GetLibraryItemsOptimizedForStreaming1One` | 1 |

View File

@@ -3,12 +3,20 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `ID` | **int* | :heavy_minus_sign: | N/A | 119542 | | `Accessible` | **bool* | :heavy_minus_sign: | Indicates if the part is accessible. | true |
| `Key` | **string* | :heavy_minus_sign: | N/A | /library/parts/119542/1680457526/file.mkv | | `Exists` | **bool* | :heavy_minus_sign: | Indicates if the part exists. | true |
| `Duration` | **int* | :heavy_minus_sign: | N/A | 11558112 | | `ID` | *int64* | :heavy_check_mark: | Unique part identifier. | 418385 |
| `File` | **string* | :heavy_minus_sign: | N/A | /movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv | | `Key` | **string* | :heavy_minus_sign: | Key to access this part. | /library/parts/418385/1735864239/file.mkv |
| `Size` | **int64* | :heavy_minus_sign: | N/A | 36158371307 | | `Indexes` | **string* | :heavy_minus_sign: | N/A | sd |
| `Container` | **string* | :heavy_minus_sign: | N/A | mkv | | `Duration` | **int* | :heavy_minus_sign: | Duration of the part in milliseconds. | 9610350 |
| `VideoProfile` | **string* | :heavy_minus_sign: | N/A | main 10 | | `File` | **string* | :heavy_minus_sign: | File path for the part. | /mnt/Movies_1/W/Wicked (2024).mkv |
| `Size` | **int64* | :heavy_minus_sign: | File size in bytes. | 30649952104 |
| `PacketLength` | **int* | :heavy_minus_sign: | N/A | 188 |
| `Container` | **string* | :heavy_minus_sign: | Container format of the part. | mkv |
| `VideoProfile` | **string* | :heavy_minus_sign: | Video profile for the part. | main 10 |
| `AudioProfile` | **string* | :heavy_minus_sign: | The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). | dts |
| `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false |
| `OptimizedForStreaming` | [*operations.GetLibraryItemsLibraryOptimizedForStreaming](../../models/operations/getlibraryitemslibraryoptimizedforstreaming.md) | :heavy_minus_sign: | Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true<br/> | |
| `HasThumbnail` | [*operations.GetLibraryItemsHasThumbnail](../../models/operations/getlibraryitemshasthumbnail.md) | :heavy_minus_sign: | N/A | 1 |

View File

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

View File

@@ -0,0 +1,12 @@
# GetLibraryItemsQueryParamIncludeMeta
Adds the Meta object to the response
## Values
| Name | Value |
| --------------------------------------------- | --------------------------------------------- |
| `GetLibraryItemsQueryParamIncludeMetaDisable` | 0 |
| `GetLibraryItemsQueryParamIncludeMetaEnable` | 1 |

View File

@@ -0,0 +1,24 @@
# GetLibraryItemsQueryParamType
The type of media to retrieve or filter by.
1 = movie
2 = show
3 = season
4 = episode
E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
## Values
| Name | Value |
| ----------------------------------------- | ----------------------------------------- |
| `GetLibraryItemsQueryParamTypeMovie` | 1 |
| `GetLibraryItemsQueryParamTypeTvShow` | 2 |
| `GetLibraryItemsQueryParamTypeSeason` | 3 |
| `GetLibraryItemsQueryParamTypeEpisode` | 4 |
| `GetLibraryItemsQueryParamTypeArtist` | 5 |
| `GetLibraryItemsQueryParamTypeAlbum` | 6 |
| `GetLibraryItemsQueryParamTypeTrack` | 7 |
| `GetLibraryItemsQueryParamTypePhotoAlbum` | 8 |
| `GetLibraryItemsQueryParamTypePhoto` | 9 |

View File

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

View File

@@ -3,6 +3,9 @@
## Fields ## Fields
| Field | Type | Required | Description | Example | | Field | Type | Required | Description | Example |
| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| `Tag` | **string* | :heavy_minus_sign: | N/A | Sigourney Weaver | | `ID` | *int* | :heavy_check_mark: | The unique identifier for the role.<br/>NOTE: This is different for each Plex server and is not globally unique.<br/> | 126522 |
| `Tag` | *string* | :heavy_check_mark: | The display tag for the actor (typically the actor's name). | Teller |
| `Role` | **string* | :heavy_minus_sign: | The role played by the actor in the media item. | Self - Judge |
| `Thumb` | **string* | :heavy_minus_sign: | The absolute URL of the thumbnail image for the actor. | https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg |

View File

@@ -0,0 +1,10 @@
# GetLibraryItemsSimilar
## Fields
| Field | Type | Required | Description | Example |
| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
| `ID` | *int64* | :heavy_check_mark: | The unique similar item identifier. | 26 |
| `Filter` | *string* | :heavy_check_mark: | The filter string for similar items. | similar=26 |
| `Tag` | *string* | :heavy_check_mark: | The tag or title of the similar content. | Breaking Bad |

View File

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

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