diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index d8a1404..9147a2d 100755 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: 3eeea668-4ef4-464e-a888-bdfa023bedf5 management: - docChecksum: 911d74baa0d06121d2ce2c71d94e977a + docChecksum: 37654ea0982ab5e87a9a9576014c9d19 docVersion: 0.0.3 - speakeasyVersion: 1.308.0 - generationVersion: 2.342.2 - releaseVersion: 0.8.2 - configChecksum: f20ca4e1b38909fd8d69b6947315f838 + speakeasyVersion: 1.308.1 + generationVersion: 2.342.6 + releaseVersion: 0.9.0 + configChecksum: d85cf2b27a6bc9ff213089b7d202adf0 repoURL: https://github.com/LukeHagar/plexpy.git repoSubDirectory: . installationURL: https://github.com/LukeHagar/plexpy.git @@ -15,7 +15,7 @@ features: python: additionalDependencies: 0.1.0 constsAndDefaults: 0.1.3 - core: 4.6.10 + core: 4.6.11 flattening: 2.81.1 globalSecurity: 2.83.5 globalSecurityCallbacks: 0.1.0 @@ -26,6 +26,7 @@ features: nameOverrides: 2.81.2 responseFormat: 0.1.0 sdkHooks: 0.1.0 + typeOverrides: 2.81.1 generatedFiles: - src/plex_api/sdkconfiguration.py - src/plex_api/server.py @@ -33,16 +34,17 @@ generatedFiles: - src/plex_api/video.py - src/plex_api/activities.py - src/plex_api/butler.py + - src/plex_api/plex.py - src/plex_api/hubs.py - src/plex_api/search.py - src/plex_api/library.py - src/plex_api/log.py - - src/plex_api/plex.py - src/plex_api/playlists.py - src/plex_api/authentication.py - src/plex_api/statistics.py - src/plex_api/sessions.py - src/plex_api/updater.py + - src/plex_api/watchlist.py - src/plex_api/sdk.py - Makefile - py.typed @@ -74,6 +76,9 @@ generatedFiles: - src/plex_api/models/operations/stopalltasks.py - src/plex_api/models/operations/starttask.py - src/plex_api/models/operations/stoptask.py + - src/plex_api/models/operations/gethomedata.py + - src/plex_api/models/operations/getpin.py + - src/plex_api/models/operations/gettoken.py - src/plex_api/models/operations/getglobalhubs.py - src/plex_api/models/operations/getlibraryhubs.py - src/plex_api/models/operations/performsearch.py @@ -93,8 +98,6 @@ generatedFiles: - src/plex_api/models/operations/logline.py - src/plex_api/models/operations/logmultiline.py - src/plex_api/models/operations/enablepapertrail.py - - src/plex_api/models/operations/getpin.py - - src/plex_api/models/operations/gettoken.py - src/plex_api/models/operations/createplaylist.py - src/plex_api/models/operations/getplaylists.py - src/plex_api/models/operations/getplaylist.py @@ -114,6 +117,7 @@ generatedFiles: - src/plex_api/models/operations/getupdatestatus.py - src/plex_api/models/operations/checkforupdates.py - src/plex_api/models/operations/applyupdates.py + - src/plex_api/models/operations/getwatchlist.py - src/plex_api/models/errors/getservercapabilities.py - src/plex_api/models/errors/getserverpreferences.py - src/plex_api/models/errors/getavailableclients.py @@ -134,6 +138,9 @@ generatedFiles: - src/plex_api/models/errors/stopalltasks.py - src/plex_api/models/errors/starttask.py - src/plex_api/models/errors/stoptask.py + - src/plex_api/models/errors/gethomedata.py + - src/plex_api/models/errors/getpin.py + - src/plex_api/models/errors/gettoken.py - src/plex_api/models/errors/getglobalhubs.py - src/plex_api/models/errors/getlibraryhubs.py - src/plex_api/models/errors/performsearch.py @@ -153,8 +160,6 @@ generatedFiles: - src/plex_api/models/errors/logline.py - src/plex_api/models/errors/logmultiline.py - src/plex_api/models/errors/enablepapertrail.py - - src/plex_api/models/errors/getpin.py - - src/plex_api/models/errors/gettoken.py - src/plex_api/models/errors/createplaylist.py - src/plex_api/models/errors/getplaylists.py - src/plex_api/models/errors/getplaylist.py @@ -174,6 +179,7 @@ generatedFiles: - src/plex_api/models/errors/getupdatestatus.py - src/plex_api/models/errors/checkforupdates.py - src/plex_api/models/errors/applyupdates.py + - src/plex_api/models/errors/getwatchlist.py - src/plex_api/models/components/security.py - src/plex_api/models/internal/globals.py - src/plex_api/models/__init__.py @@ -241,6 +247,18 @@ generatedFiles: - docs/models/operations/pathparamtaskname.md - docs/models/operations/stoptaskrequest.md - docs/models/operations/stoptaskresponse.md + - docs/models/operations/gethomedataresponsebody.md + - docs/models/operations/gethomedataresponse.md + - docs/models/operations/getpinglobals.md + - docs/models/operations/getpinrequest.md + - docs/models/operations/location.md + - docs/models/operations/getpinresponsebody.md + - docs/models/operations/getpinresponse.md + - docs/models/operations/gettokenglobals.md + - docs/models/operations/gettokenrequest.md + - docs/models/operations/gettokenlocation.md + - docs/models/operations/gettokenresponsebody.md + - docs/models/operations/gettokenresponse.md - docs/models/operations/onlytransient.md - docs/models/operations/getglobalhubsrequest.md - docs/models/operations/getglobalhubsmetadata.md @@ -288,7 +306,7 @@ generatedFiles: - docs/models/operations/writer.md - docs/models/operations/country.md - docs/models/operations/role.md - - docs/models/operations/metadata.md + - docs/models/operations/getrecentlyaddedmetadata.md - docs/models/operations/getrecentlyaddedmediacontainer.md - docs/models/operations/getrecentlyaddedresponsebody.md - docs/models/operations/getrecentlyaddedresponse.md @@ -300,7 +318,7 @@ generatedFiles: - docs/models/operations/includedetails.md - docs/models/operations/getlibraryrequest.md - docs/models/operations/getlibrarydirectory.md - - docs/models/operations/filter_.md + - docs/models/operations/getlibraryfilter.md - docs/models/operations/sort.md - docs/models/operations/field.md - docs/models/operations/getlibrarytype.md @@ -367,14 +385,6 @@ generatedFiles: - docs/models/operations/loglineresponse.md - docs/models/operations/logmultilineresponse.md - docs/models/operations/enablepapertrailresponse.md - - docs/models/operations/getpinglobals.md - - docs/models/operations/getpinrequest.md - - docs/models/operations/location.md - - docs/models/operations/getpinresponsebody.md - - docs/models/operations/getpinresponse.md - - docs/models/operations/gettokenglobals.md - - docs/models/operations/gettokenrequest.md - - docs/models/operations/gettokenresponse.md - docs/models/operations/queryparamtype.md - docs/models/operations/smart.md - docs/models/operations/createplaylistrequest.md @@ -464,6 +474,15 @@ generatedFiles: - docs/models/operations/skip.md - docs/models/operations/applyupdatesrequest.md - docs/models/operations/applyupdatesresponse.md + - docs/models/operations/filter_.md + - docs/models/operations/libtype.md + - docs/models/operations/includecollections.md + - docs/models/operations/includeexternalmedia.md + - docs/models/operations/getwatchlistrequest.md + - docs/models/operations/image.md + - docs/models/operations/metadata.md + - docs/models/operations/getwatchlistresponsebody.md + - docs/models/operations/getwatchlistresponse.md - docs/models/errors/errors.md - docs/models/errors/getservercapabilitiesresponsebody.md - docs/models/errors/getserverpreferenceserrors.md @@ -504,6 +523,12 @@ generatedFiles: - docs/models/errors/starttaskresponsebody.md - docs/models/errors/stoptaskerrors.md - docs/models/errors/stoptaskresponsebody.md + - docs/models/errors/gethomedataerrors.md + - docs/models/errors/gethomedataresponsebody.md + - docs/models/errors/getpinerrors.md + - docs/models/errors/getpinresponsebody.md + - docs/models/errors/gettokenerrors.md + - docs/models/errors/gettokenresponsebody.md - docs/models/errors/getglobalhubserrors.md - docs/models/errors/getglobalhubsresponsebody.md - docs/models/errors/getlibraryhubserrors.md @@ -542,10 +567,6 @@ generatedFiles: - docs/models/errors/logmultilineresponsebody.md - docs/models/errors/enablepapertrailerrors.md - docs/models/errors/enablepapertrailresponsebody.md - - docs/models/errors/getpinerrors.md - - docs/models/errors/getpinresponsebody.md - - docs/models/errors/gettokenerrors.md - - docs/models/errors/gettokenresponsebody.md - docs/models/errors/createplaylisterrors.md - docs/models/errors/createplaylistresponsebody.md - docs/models/errors/getplaylistserrors.md @@ -584,6 +605,8 @@ generatedFiles: - docs/models/errors/checkforupdatesresponsebody.md - docs/models/errors/applyupdateserrors.md - docs/models/errors/applyupdatesresponsebody.md + - docs/models/errors/getwatchlisterrors.md + - docs/models/errors/getwatchlistresponsebody.md - docs/models/components/security.md - docs/models/internal/globals.md - docs/sdks/plexapi/README.md @@ -592,16 +615,17 @@ generatedFiles: - docs/sdks/video/README.md - docs/sdks/activities/README.md - docs/sdks/butler/README.md + - docs/sdks/plex/README.md - docs/sdks/hubs/README.md - docs/sdks/search/README.md - docs/sdks/library/README.md - docs/sdks/log/README.md - - docs/sdks/plex/README.md - docs/sdks/playlists/README.md - docs/sdks/authentication/README.md - docs/sdks/statistics/README.md - docs/sdks/sessions/README.md - docs/sdks/updater/README.md + - docs/sdks/watchlist/README.md - USAGE.md - .gitattributes - src/plex_api/_hooks/sdkhooks.py diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 773ffef..5595b02 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -12,7 +12,7 @@ generation: auth: oAuth2ClientCredentialsEnabled: false python: - version: 0.8.2 + version: 0.9.0 additionalDependencies: dependencies: {} extraDependencies: diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index d31a9bf..9339a66 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,9 +1,9 @@ -speakeasyVersion: 1.308.0 +speakeasyVersion: 1.308.1 sources: my-source: sourceNamespace: my-source - sourceRevisionDigest: sha256:0281386c0424f9309c449ac0e8b84e64d4d4b546427c13e890f4a989cb0c9e11 - sourceBlobDigest: sha256:ad868dd074aef16acba0f48666bfc67bfcaf8e9270c51b2112e82afacd223147 + sourceRevisionDigest: sha256:81f7f998cfe018fdd7d478087dd59f1ba5b42fe34c83e644b84219fc32289522 + sourceBlobDigest: sha256:08634d44bed62921029e6a3ef66e9007734e0cd69163e144d07f9688dc752c7a tags: - latest - main @@ -11,8 +11,8 @@ targets: plexpy: source: my-source sourceNamespace: my-source - sourceRevisionDigest: sha256:0281386c0424f9309c449ac0e8b84e64d4d4b546427c13e890f4a989cb0c9e11 - sourceBlobDigest: sha256:ad868dd074aef16acba0f48666bfc67bfcaf8e9270c51b2112e82afacd223147 + sourceRevisionDigest: sha256:81f7f998cfe018fdd7d478087dd59f1ba5b42fe34c83e644b84219fc32289522 + sourceBlobDigest: sha256:08634d44bed62921029e6a3ef66e9007734e0cd69163e144d07f9688dc752c7a outLocation: /github/workspace/repo workflow: workflowVersion: 1.0.0 diff --git a/Makefile b/Makefile index d078bac..5db216a 100644 --- a/Makefile +++ b/Makefile @@ -3,4 +3,4 @@ SHELL := bash publish: - ./scripts/publish.sh \ No newline at end of file + ./scripts/publish.sh \ No newline at end of file diff --git a/README.md b/README.md index 7a6c673..324c081 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,12 @@ if res.object is not None: * [start_task](docs/sdks/butler/README.md#start_task) - Start a single Butler task * [stop_task](docs/sdks/butler/README.md#stop_task) - Stop a single Butler task +### [plex](docs/sdks/plex/README.md) + +* [get_home_data](docs/sdks/plex/README.md#get_home_data) - Get Plex Home Data +* [get_pin](docs/sdks/plex/README.md#get_pin) - Get a Pin +* [get_token](docs/sdks/plex/README.md#get_token) - Get Access Token + ### [hubs](docs/sdks/hubs/README.md) * [get_global_hubs](docs/sdks/hubs/README.md#get_global_hubs) - Get Global Hubs @@ -107,11 +113,6 @@ if res.object is not None: * [log_multi_line](docs/sdks/log/README.md#log_multi_line) - Logging a multi-line message * [enable_paper_trail](docs/sdks/log/README.md#enable_paper_trail) - Enabling Papertrail -### [plex](docs/sdks/plex/README.md) - -* [get_pin](docs/sdks/plex/README.md#get_pin) - Get a Pin -* [get_token](docs/sdks/plex/README.md#get_token) - Get Access Token - ### [playlists](docs/sdks/playlists/README.md) * [create_playlist](docs/sdks/playlists/README.md#create_playlist) - Create a Playlist @@ -145,6 +146,10 @@ if res.object is not None: * [get_update_status](docs/sdks/updater/README.md#get_update_status) - Querying status of updates * [check_for_updates](docs/sdks/updater/README.md#check_for_updates) - Checking for updates * [apply_updates](docs/sdks/updater/README.md#apply_updates) - Apply Updates + +### [watchlist](docs/sdks/watchlist/README.md) + +* [get_watchlist](docs/sdks/watchlist/README.md#get_watchlist) - Get User Watchlist @@ -256,7 +261,7 @@ s = plex_api.PlexAPI( ) -res = s.plex.get_pin(strong=False, x_plex_client_identifier='Postman', server_url="https://plex.tv/api/v2") +res = s.plex.get_pin(x_plex_product='Postman', strong=False, x_plex_client_identifier='Postman', server_url="https://plex.tv/api/v2") if res.object is not None: # handle response @@ -341,7 +346,7 @@ s = plex_api.PlexAPI( ) -res = s.plex.get_pin(strong=False, x_plex_client_identifier='Postman') +res = s.plex.get_pin(x_plex_product='Postman', strong=False, x_plex_client_identifier='Postman') if res.object is not None: # handle response diff --git a/RELEASES.md b/RELEASES.md index d49d009..abe28ab 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -608,4 +608,14 @@ Based on: ### Generated - [python v0.8.2] . ### Releases -- [PyPI v0.8.2] https://pypi.org/project/plex-api-client/0.8.2 - . \ No newline at end of file +- [PyPI v0.8.2] https://pypi.org/project/plex-api-client/0.8.2 - . + +## 2024-06-15 00:22:16 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.308.1 (2.342.6) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.9.0] . +### Releases +- [PyPI v0.9.0] https://pypi.org/project/plex-api-client/0.9.0 - . \ No newline at end of file diff --git a/codeSamples.yaml b/codeSamples.yaml index aee44aa..7388fcc 100644 --- a/codeSamples.yaml +++ b/codeSamples.yaml @@ -3,255 +3,6 @@ info: title: CodeSamples overlay for python target version: 0.0.0 actions: - - target: $["paths"]["/:/timeline"]["get"] - update: - x-codeSamples: - - lang: python - label: getTimeline - source: |- - import plex_api - from plex_api.models import operations - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.video.get_timeline(request=operations.GetTimelineRequest( - rating_key=23409, - key='/library/metadata/23409', - state=operations.State.PLAYING, - has_mde=1, - time=2000, - duration=10000, - context='home:hub.continueWatching', - play_queue_item_id=1, - play_back_time=2000, - row=1, - )) - - if res is not None: - # handle response - pass - - target: $["paths"]["/butler"]["delete"] - update: - x-codeSamples: - - lang: python - label: stopAllTasks - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.butler.stop_all_tasks() - - if res is not None: - # handle response - pass - - target: $["paths"]["/status/sessions"]["get"] - update: - x-codeSamples: - - lang: python - label: getSessions - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.sessions.get_sessions() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/"]["get"] - update: - x-codeSamples: - - lang: python - label: getServerCapabilities - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.server.get_server_capabilities() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/:/progress"]["post"] - update: - x-codeSamples: - - lang: python - label: updatePlayProgress - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.media.update_play_progress(key='', time=90000, state='played') - - if res is not None: - # handle response - pass - - target: $["paths"]["/transcode/sessions/{sessionKey}"]["delete"] - update: - x-codeSamples: - - lang: python - label: stopTranscodeSession - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.sessions.stop_transcode_session(session_key='zz7llzqlx8w9vnrsbnwhbmep') - - if res is not None: - # handle response - pass - - target: $["paths"]["/identity"]["get"] - update: - x-codeSamples: - - lang: python - label: getServerIdentity - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.server.get_server_identity() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/photo/:/transcode"]["get"] - update: - x-codeSamples: - - lang: python - label: getResizedPhoto - source: |- - import plex_api - from plex_api.models import operations - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.server.get_resized_photo(request=operations.GetResizedPhotoRequest( - width=110, - height=165, - opacity=100, - blur=20, - min_size=operations.MinSize.ONE, - upscale=operations.Upscale.ZERO, - url='/library/metadata/49564/thumb/1654258204', - )) - - if res is not None: - # handle response - pass - - target: $["paths"]["/playlists/{playlistID}/items"]["get"] - update: - x-codeSamples: - - lang: python - label: getPlaylistContents - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.playlists.get_playlist_contents(playlist_id=5004.46, type=9403.59) - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/devices"]["get"] - update: - x-codeSamples: - - lang: python - label: getDevices - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.server.get_devices() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/servers"]["get"] - update: - x-codeSamples: - - lang: python - label: getServerList - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.server.get_server_list() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/:/unscrobble"]["get"] - update: - x-codeSamples: - - lang: python - label: markUnplayed - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.media.mark_unplayed(key=59398) - - if res is not None: - # handle response - pass - target: $["paths"]["/activities"]["get"] update: x-codeSamples: @@ -271,6 +22,84 @@ actions: if res.object is not None: # handle response pass + - target: $["paths"]["/library/metadata/{ratingKey}"]["get"] + update: + x-codeSamples: + - lang: python + label: getMetadata + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.library.get_metadata(rating_key=8382.31) + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/home"]["get"] + update: + x-codeSamples: + - lang: python + label: getHomeData + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.plex.get_home_data() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/hubs"]["get"] + update: + x-codeSamples: + - lang: python + label: getGlobalHubs + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.hubs.get_global_hubs(count=1262.49, only_transient=operations.OnlyTransient.ONE) + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/updater/apply"]["put"] + update: + x-codeSamples: + - lang: python + label: applyUpdates + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.updater.apply_updates(tonight=operations.Tonight.ONE, skip=operations.Skip.ONE) + + if res is not None: + # handle response + pass - target: $["paths"]["/butler/{taskName}"]["delete"] update: x-codeSamples: @@ -291,11 +120,11 @@ actions: if res is not None: # handle response pass - - target: $["paths"]["/library/sections/{sectionId}"]["delete"] + - target: $["paths"]["/log/networked"]["get"] update: x-codeSamples: - lang: python - label: deleteLibrary + label: enablePaperTrail source: |- import plex_api @@ -305,18 +134,19 @@ actions: ) - res = s.library.delete_library(section_id=1000) + res = s.log.enable_paper_trail() if res is not None: # handle response pass - - target: $["paths"]["/statistics/media"]["get"] + - target: $["paths"]["/playlists"]["get"] update: x-codeSamples: - lang: python - label: getStatistics + label: getPlaylists source: |- import plex_api + from plex_api.models import operations s = plex_api.PlexAPI( access_token="", @@ -324,19 +154,18 @@ actions: ) - res = s.statistics.get_statistics(timespan=4) + res = s.playlists.get_playlists(playlist_type=operations.PlaylistType.AUDIO, smart=operations.QueryParamSmart.ZERO) if res.object is not None: # handle response pass - - target: $["paths"]["/log"]["get"] + - target: $["paths"]["/playlists/{playlistID}/items"]["put"] update: x-codeSamples: - lang: python - label: logLine + label: addPlaylistContents source: |- import plex_api - from plex_api.models import operations s = plex_api.PlexAPI( access_token="", @@ -344,47 +173,7 @@ actions: ) - res = s.log.log_line(level=operations.Level.THREE, message='Test log message', source='Postman') - - if res is not None: - # handle response - pass - - target: $["paths"]["/updater/check"]["put"] - update: - x-codeSamples: - - lang: python - label: checkForUpdates - source: |- - import plex_api - from plex_api.models import operations - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.updater.check_for_updates(download=operations.Download.ONE) - - if res is not None: - # handle response - pass - - target: $["paths"]["/hubs/sections/{sectionId}"]["get"] - update: - x-codeSamples: - - lang: python - label: getLibraryHubs - source: |- - import plex_api - from plex_api.models import operations - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.hubs.get_library_hubs(section_id=6728.76, count=9010.22, only_transient=operations.QueryParamOnlyTransient.ZERO) + res = s.playlists.add_playlist_contents(playlist_id=8502.01, uri='server://12345/com.plexapp.plugins.library/library/metadata/1', play_queue_id=123) if res.object is not None: # handle response @@ -409,11 +198,11 @@ actions: if res is not None: # handle response pass - - target: $["paths"]["/library/hashes"]["get"] + - target: $["paths"]["/transcode/sessions"]["get"] update: x-codeSamples: - lang: python - label: getFileHash + label: getTranscodeSessions source: |- import plex_api @@ -423,7 +212,45 @@ actions: ) - res = s.library.get_file_hash(url='file://C:\Image.png&type=13', type=4462.17) + res = s.sessions.get_transcode_sessions() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/devices"]["get"] + update: + x-codeSamples: + - lang: python + label: getDevices + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.server.get_devices() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/:/unscrobble"]["get"] + update: + x-codeSamples: + - lang: python + label: markUnplayed + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.media.mark_unplayed(key=59398) if res is not None: # handle response @@ -447,11 +274,11 @@ actions: if res.object is not None: # handle response pass - - target: $["paths"]["/library/sections/{sectionId}/refresh"]["get"] + - target: $["paths"]["/playlists/{playlistID}"]["put"] update: x-codeSamples: - lang: python - label: refreshLibrary + label: updatePlaylist source: |- import plex_api @@ -461,16 +288,16 @@ actions: ) - res = s.library.refresh_library(section_id=934.16) + res = s.playlists.update_playlist(playlist_id=3915, title='', summary='') if res is not None: # handle response pass - - target: $["paths"]["/log/networked"]["get"] + - target: $["paths"]["/:/scrobble"]["get"] update: x-codeSamples: - lang: python - label: enablePaperTrail + label: markPlayed source: |- import plex_api @@ -480,49 +307,11 @@ actions: ) - res = s.log.enable_paper_trail() + res = s.media.mark_played(key=59398) if res is not None: # handle response pass - - target: $["paths"]["/:/prefs"]["get"] - update: - x-codeSamples: - - lang: python - label: getServerPreferences - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.server.get_server_preferences() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/library/metadata/{ratingKey}"]["get"] - update: - x-codeSamples: - - lang: python - label: getMetadata - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.library.get_metadata(rating_key=8382.31) - - if res.object is not None: - # handle response - pass - target: $["paths"]["/hubs/search/voice"]["get"] update: x-codeSamples: @@ -542,13 +331,14 @@ actions: if res is not None: # handle response pass - - target: $["paths"]["/search"]["get"] + - target: $["paths"]["/library/sections/{sectionId}/{tag}"]["get"] update: x-codeSamples: - lang: python - label: getSearchResults + label: getLibraryItems source: |- import plex_api + from plex_api.models import operations s = plex_api.PlexAPI( access_token="", @@ -556,69 +346,11 @@ actions: ) - res = s.search.get_search_results(query='110') + res = s.library.get_library_items(section_id='', tag=operations.Tag.GENRE) if res.object is not None: # handle response pass - - target: $["paths"]["/library/onDeck"]["get"] - update: - x-codeSamples: - - lang: python - label: getOnDeck - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.library.get_on_deck() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/log"]["post"] - update: - x-codeSamples: - - lang: python - label: logMultiLine - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.log.log_multi_line(request='level=4&message=Test%20message%201&source=postman - level=3&message=Test%20message%202&source=postman - level=1&message=Test%20message%203&source=postman') - - if res is not None: - # handle response - pass - - target: $["paths"]["/pins/{pinID}"]["get"] - update: - x-codeSamples: - - lang: python - label: getToken - source: |- - import plex_api - - s = plex_api.PlexAPI( - x_plex_client_identifier='Postman', - ) - - - res = s.plex.get_token(pin_id='', x_plex_client_identifier='Postman') - - if res is not None: - # handle response - pass - target: $["paths"]["/playlists"]["post"] update: x-codeSamples: @@ -644,11 +376,11 @@ actions: if res.object is not None: # handle response pass - - target: $["paths"]["/playlists/{playlistID}/items"]["delete"] + - target: $["paths"]["/identity"]["get"] update: x-codeSamples: - lang: python - label: clearPlaylistContents + label: getServerIdentity source: |- import plex_api @@ -658,7 +390,102 @@ actions: ) - res = s.playlists.clear_playlist_contents(playlist_id=1893.18) + res = s.server.get_server_identity() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/:/progress"]["post"] + update: + x-codeSamples: + - lang: python + label: updatePlayProgress + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.media.update_play_progress(key='', time=90000, state='played') + + if res is not None: + # handle response + pass + - target: $["paths"]["/butler"]["get"] + update: + x-codeSamples: + - lang: python + label: getButlerTasks + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.butler.get_butler_tasks() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/video/:/transcode/universal/start.mpd"]["get"] + update: + x-codeSamples: + - lang: python + label: startUniversalTranscode + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.video.start_universal_transcode(request=operations.StartUniversalTranscodeRequest( + has_mde=1, + path='/library/metadata/23409', + media_index=0, + part_index=0, + protocol='hls', + fast_seek=0, + direct_play=0, + direct_stream=0, + subtitle_size=100, + subtites='burn', + audio_boost=100, + location='lan', + media_buffer_size=102400, + session='zvcage8b7rkioqcm8f4uns4c', + add_debug_overlay=0, + auto_adjust_quality=0, + )) + + if res is not None: + # handle response + pass + - target: $["paths"]["/updater/check"]["put"] + update: + x-codeSamples: + - lang: python + label: checkForUpdates + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.updater.check_for_updates(download=operations.Download.ONE) if res is not None: # handle response @@ -679,82 +506,6 @@ actions: res = s.server.get_my_plex_account() - if res.object is not None: - # handle response - pass - - target: $["paths"]["/activities/{activityUUID}"]["delete"] - update: - x-codeSamples: - - lang: python - label: cancelServerActivities - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.activities.cancel_server_activities(activity_uuid='25b71ed5-0f9d-461c-baa7-d404e9e10d3e') - - if res is not None: - # handle response - pass - - target: $["paths"]["/pins"]["post"] - update: - x-codeSamples: - - lang: python - label: getPin - source: |- - import plex_api - - s = plex_api.PlexAPI( - x_plex_client_identifier='Postman', - ) - - - res = s.plex.get_pin(strong=False, x_plex_client_identifier='Postman') - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/playlists"]["get"] - update: - x-codeSamples: - - lang: python - label: getPlaylists - source: |- - import plex_api - from plex_api.models import operations - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.playlists.get_playlists(playlist_type=operations.PlaylistType.AUDIO, smart=operations.QueryParamSmart.ZERO) - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/status/sessions/history/all"]["get"] - update: - x-codeSamples: - - lang: python - label: getSessionHistory - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.sessions.get_session_history() - if res.object is not None: # handle response pass @@ -777,13 +528,14 @@ actions: if res is not None: # handle response pass - - target: $["paths"]["/hubs/search"]["get"] + - target: $["paths"]["/butler/{taskName}"]["post"] update: x-codeSamples: - lang: python - label: performSearch + label: startTask source: |- import plex_api + from plex_api.models import operations s = plex_api.PlexAPI( access_token="", @@ -791,7 +543,7 @@ actions: ) - res = s.search.perform_search(query='dylan', section_id=1516.53, limit=5) + res = s.butler.start_task(task_name=operations.TaskName.CLEAN_OLD_BUNDLES) if res is not None: # handle response @@ -836,11 +588,48 @@ actions: if res is not None: # handle response pass - - target: $["paths"]["/updater/apply"]["put"] + - target: $["paths"]["/transcode/sessions/{sessionKey}"]["delete"] update: x-codeSamples: - lang: python - label: applyUpdates + label: stopTranscodeSession + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.sessions.stop_transcode_session(session_key='zz7llzqlx8w9vnrsbnwhbmep') + + if res is not None: + # handle response + pass + - target: $["paths"]["/pins/{pinID}"]["get"] + update: + x-codeSamples: + - lang: python + label: getToken + source: |- + import plex_api + + s = plex_api.PlexAPI( + x_plex_client_identifier='Postman', + ) + + + res = s.plex.get_token(pin_id='', x_plex_client_identifier='Postman') + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/hubs/sections/{sectionId}"]["get"] + update: + x-codeSamples: + - lang: python + label: getLibraryHubs source: |- import plex_api from plex_api.models import operations @@ -851,36 +640,35 @@ actions: ) - res = s.updater.apply_updates(tonight=operations.Tonight.ONE, skip=operations.Skip.ONE) + res = s.hubs.get_library_hubs(section_id=6728.76, count=9010.22, only_transient=operations.QueryParamOnlyTransient.ZERO) + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/hubs/search"]["get"] + update: + x-codeSamples: + - lang: python + label: performSearch + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.search.perform_search(query='dylan', section_id=1516.53, limit=5) if res is not None: # handle response pass - - target: $["paths"]["/library/sections/{sectionId}/{tag}"]["get"] + - target: $["paths"]["/library/sections/{sectionId}"]["delete"] update: x-codeSamples: - lang: python - label: getLibraryItems - source: |- - import plex_api - from plex_api.models import operations - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.library.get_library_items(section_id=1, tag=operations.Tag.GENRE) - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/playlists/{playlistID}/items"]["put"] - update: - x-codeSamples: - - lang: python - label: addPlaylistContents + label: deleteLibrary source: |- import plex_api @@ -890,57 +678,18 @@ actions: ) - res = s.playlists.add_playlist_contents(playlist_id=8502.01, uri='server://12345/com.plexapp.plugins.library/library/metadata/1', play_queue_id=123) - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/transcode/sessions"]["get"] - update: - x-codeSamples: - - lang: python - label: getTranscodeSessions - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.sessions.get_transcode_sessions() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/playlists/{playlistID}"]["put"] - update: - x-codeSamples: - - lang: python - label: updatePlaylist - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.playlists.update_playlist(playlist_id=3915, title='', summary='') + res = s.library.delete_library(section_id=1000) if res is not None: # handle response pass - - target: $["paths"]["/video/:/transcode/universal/start.mpd"]["get"] + - target: $["paths"]["/servers"]["get"] update: x-codeSamples: - lang: python - label: startUniversalTranscode + label: getServerList source: |- import plex_api - from plex_api.models import operations s = plex_api.PlexAPI( access_token="", @@ -948,33 +697,35 @@ actions: ) - res = s.video.start_universal_transcode(request=operations.StartUniversalTranscodeRequest( - has_mde=1, - path='/library/metadata/23409', - media_index=0, - part_index=0, - protocol='hls', - fast_seek=0, - direct_play=0, - direct_stream=0, - subtitle_size=100, - subtites='burn', - audio_boost=100, - location='lan', - media_buffer_size=102400, - session='zvcage8b7rkioqcm8f4uns4c', - add_debug_overlay=0, - auto_adjust_quality=0, - )) + res = s.server.get_server_list() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/activities/{activityUUID}"]["delete"] + update: + x-codeSamples: + - lang: python + label: cancelServerActivities + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.activities.cancel_server_activities(activity_uuid='25b71ed5-0f9d-461c-baa7-d404e9e10d3e') if res is not None: # handle response pass - - target: $["paths"]["/butler"]["get"] + - target: $["paths"]["/butler"]["delete"] update: x-codeSamples: - lang: python - label: getButlerTasks + label: stopAllTasks source: |- import plex_api @@ -984,88 +735,67 @@ actions: ) - res = s.butler.get_butler_tasks() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/library/recentlyAdded"]["get"] - update: - x-codeSamples: - - lang: python - label: getRecentlyAdded - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.library.get_recently_added() - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/library/sections/{sectionId}"]["get"] - update: - x-codeSamples: - - lang: python - label: getLibrary - source: |- - import plex_api - from plex_api.models import operations - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.library.get_library(section_id=1000, include_details=operations.IncludeDetails.ZERO) - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/library/metadata/{ratingKey}/children"]["get"] - update: - x-codeSamples: - - lang: python - label: getMetadataChildren - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.library.get_metadata_children(rating_key=1539.14) - - if res.object is not None: - # handle response - pass - - target: $["paths"]["/playlists/{playlistID}"]["delete"] - update: - x-codeSamples: - - lang: python - label: deletePlaylist - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.playlists.delete_playlist(playlist_id=216.22) + res = s.butler.stop_all_tasks() if res is not None: # handle response pass + - target: $["paths"]["/pins"]["post"] + update: + x-codeSamples: + - lang: python + label: getPin + source: |- + import plex_api + + s = plex_api.PlexAPI( + x_plex_client_identifier='Postman', + ) + + + res = s.plex.get_pin(x_plex_product='Postman', strong=False, x_plex_client_identifier='Postman') + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/playlists/{playlistID}/items"]["get"] + update: + x-codeSamples: + - lang: python + label: getPlaylistContents + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.playlists.get_playlist_contents(playlist_id=5004.46, type=9403.59) + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/statistics/media"]["get"] + update: + x-codeSamples: + - lang: python + label: getStatistics + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.statistics.get_statistics(timespan=4) + + if res.object is not None: + # handle response + pass - target: $["paths"]["/clients"]["get"] update: x-codeSamples: @@ -1085,30 +815,11 @@ actions: if res.object is not None: # handle response pass - - target: $["paths"]["/:/scrobble"]["get"] + - target: $["paths"]["/:/timeline"]["get"] update: x-codeSamples: - lang: python - label: markPlayed - source: |- - import plex_api - - s = plex_api.PlexAPI( - access_token="", - x_plex_client_identifier='Postman', - ) - - - res = s.media.mark_played(key=59398) - - if res is not None: - # handle response - pass - - target: $["paths"]["/butler/{taskName}"]["post"] - update: - x-codeSamples: - - lang: python - label: startTask + label: getTimeline source: |- import plex_api from plex_api.models import operations @@ -1119,19 +830,29 @@ actions: ) - res = s.butler.start_task(task_name=operations.TaskName.CLEAN_OLD_BUNDLES) + res = s.video.get_timeline(request=operations.GetTimelineRequest( + rating_key=23409, + key='/library/metadata/23409', + state=operations.State.PLAYING, + has_mde=1, + time=2000, + duration=10000, + context='home:hub.continueWatching', + play_queue_item_id=1, + play_back_time=2000, + row=1, + )) if res is not None: # handle response pass - - target: $["paths"]["/hubs"]["get"] + - target: $["paths"]["/updater/status"]["get"] update: x-codeSamples: - lang: python - label: getGlobalHubs + label: getUpdateStatus source: |- import plex_api - from plex_api.models import operations s = plex_api.PlexAPI( access_token="", @@ -1139,7 +860,7 @@ actions: ) - res = s.hubs.get_global_hubs(count=1262.49, only_transient=operations.OnlyTransient.ONE) + res = s.updater.get_update_status() if res.object is not None: # handle response @@ -1182,11 +903,11 @@ actions: if res is not None: # handle response pass - - target: $["paths"]["/updater/status"]["get"] + - target: $["paths"]["/status/sessions"]["get"] update: x-codeSamples: - lang: python - label: getUpdateStatus + label: getSessions source: |- import plex_api @@ -1196,8 +917,329 @@ actions: ) - res = s.updater.get_update_status() + res = s.sessions.get_sessions() if res.object is not None: # handle response pass + - target: $["paths"]["/photo/:/transcode"]["get"] + update: + x-codeSamples: + - lang: python + label: getResizedPhoto + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.server.get_resized_photo(request=operations.GetResizedPhotoRequest( + width=110, + height=165, + opacity=100, + blur=20, + min_size=operations.MinSize.ONE, + upscale=operations.Upscale.ZERO, + url='/library/metadata/49564/thumb/1654258204', + )) + + if res is not None: + # handle response + pass + - target: $["paths"]["/library/sections/{sectionId}"]["get"] + update: + x-codeSamples: + - lang: python + label: getLibrary + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.library.get_library(section_id=1000, include_details=operations.IncludeDetails.ZERO) + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/library/onDeck"]["get"] + update: + x-codeSamples: + - lang: python + label: getOnDeck + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.library.get_on_deck() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/log"]["post"] + update: + x-codeSamples: + - lang: python + label: logMultiLine + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.log.log_multi_line(request='level=4&message=Test%20message%201&source=postman + level=3&message=Test%20message%202&source=postman + level=1&message=Test%20message%203&source=postman') + + if res is not None: + # handle response + pass + - target: $["paths"]["/status/sessions/history/all"]["get"] + update: + x-codeSamples: + - lang: python + label: getSessionHistory + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.sessions.get_session_history() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/library/sections/watchlist/{filter}"]["get"] + update: + x-codeSamples: + - lang: python + label: getWatchlist + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.watchlist.get_watchlist(request=operations.GetWatchlistRequest( + filter_=operations.Filter.RELEASED, + x_plex_token='', + )) + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/search"]["get"] + update: + x-codeSamples: + - lang: python + label: getSearchResults + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.search.get_search_results(query='110') + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/library/hashes"]["get"] + update: + x-codeSamples: + - lang: python + label: getFileHash + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.library.get_file_hash(url='file://C:\Image.png&type=13', type=4462.17) + + if res is not None: + # handle response + pass + - target: $["paths"]["/library/recentlyAdded"]["get"] + update: + x-codeSamples: + - lang: python + label: getRecentlyAdded + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.library.get_recently_added() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/playlists/{playlistID}"]["delete"] + update: + x-codeSamples: + - lang: python + label: deletePlaylist + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.playlists.delete_playlist(playlist_id=216.22) + + if res is not None: + # handle response + pass + - target: $["paths"]["/"]["get"] + update: + x-codeSamples: + - lang: python + label: getServerCapabilities + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.server.get_server_capabilities() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/:/prefs"]["get"] + update: + x-codeSamples: + - lang: python + label: getServerPreferences + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.server.get_server_preferences() + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/library/sections/{sectionId}/refresh"]["get"] + update: + x-codeSamples: + - lang: python + label: refreshLibrary + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.library.refresh_library(section_id=934.16) + + if res is not None: + # handle response + pass + - target: $["paths"]["/playlists/{playlistID}/items"]["delete"] + update: + x-codeSamples: + - lang: python + label: clearPlaylistContents + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.playlists.clear_playlist_contents(playlist_id=1893.18) + + if res is not None: + # handle response + pass + - target: $["paths"]["/library/metadata/{ratingKey}/children"]["get"] + update: + x-codeSamples: + - lang: python + label: getMetadataChildren + source: |- + import plex_api + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.library.get_metadata_children(rating_key=1539.14) + + if res.object is not None: + # handle response + pass + - target: $["paths"]["/log"]["get"] + update: + x-codeSamples: + - lang: python + label: logLine + source: |- + import plex_api + from plex_api.models import operations + + s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', + ) + + + res = s.log.log_line(level=operations.Level.THREE, message='Test log message', source='Postman') + + if res is not None: + # handle response + pass diff --git a/docs/models/errors/gethomedataerrors.md b/docs/models/errors/gethomedataerrors.md new file mode 100644 index 0000000..4c9417b --- /dev/null +++ b/docs/models/errors/gethomedataerrors.md @@ -0,0 +1,10 @@ +# GetHomeDataErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `code` | *Optional[float]* | :heavy_minus_sign: | N/A | 1001 | +| `message` | *Optional[str]* | :heavy_minus_sign: | N/A | User could not be authenticated | +| `status` | *Optional[float]* | :heavy_minus_sign: | N/A | 401 | \ No newline at end of file diff --git a/docs/models/errors/gethomedataresponsebody.md b/docs/models/errors/gethomedataresponsebody.md new file mode 100644 index 0000000..2ab74ec --- /dev/null +++ b/docs/models/errors/gethomedataresponsebody.md @@ -0,0 +1,11 @@ +# GetHomeDataResponseBody + +Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `errors` | List[[errors.GetHomeDataErrors](../../models/errors/gethomedataerrors.md)] | :heavy_minus_sign: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/errors/getwatchlisterrors.md b/docs/models/errors/getwatchlisterrors.md new file mode 100644 index 0000000..0dbfaaf --- /dev/null +++ b/docs/models/errors/getwatchlisterrors.md @@ -0,0 +1,10 @@ +# GetWatchlistErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `code` | *Optional[float]* | :heavy_minus_sign: | N/A | 1001 | +| `message` | *Optional[str]* | :heavy_minus_sign: | N/A | User could not be authenticated | +| `status` | *Optional[float]* | :heavy_minus_sign: | N/A | 401 | \ No newline at end of file diff --git a/docs/models/errors/getwatchlistresponsebody.md b/docs/models/errors/getwatchlistresponsebody.md new file mode 100644 index 0000000..cbebe71 --- /dev/null +++ b/docs/models/errors/getwatchlistresponsebody.md @@ -0,0 +1,11 @@ +# GetWatchlistResponseBody + +Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | +| `errors` | List[[errors.GetWatchlistErrors](../../models/errors/getwatchlisterrors.md)] | :heavy_minus_sign: | N/A | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/operations/filter_.md b/docs/models/operations/filter_.md index 691fa77..2736d3d 100644 --- a/docs/models/operations/filter_.md +++ b/docs/models/operations/filter_.md @@ -1,12 +1,12 @@ # Filter +Filter -## Fields -| Field | Type | Required | Description | Example | -| ------------------------- | ------------------------- | ------------------------- | ------------------------- | ------------------------- | -| `filter_` | *Optional[str]* | :heavy_minus_sign: | N/A | label | -| `filter_type` | *Optional[str]* | :heavy_minus_sign: | N/A | string | -| `key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/sections/1/label | -| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | Labels | -| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | filter | \ No newline at end of file +## Values + +| Name | Value | +| ----------- | ----------- | +| `ALL` | all | +| `AVAILABLE` | available | +| `RELEASED` | released | \ No newline at end of file diff --git a/docs/models/operations/gethomedataresponse.md b/docs/models/operations/gethomedataresponse.md new file mode 100644 index 0000000..64ffa96 --- /dev/null +++ b/docs/models/operations/gethomedataresponse.md @@ -0,0 +1,11 @@ +# GetHomeDataResponse + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `object` | [Optional[operations.GetHomeDataResponseBody]](../../models/operations/gethomedataresponsebody.md) | :heavy_minus_sign: | Home Data | \ No newline at end of file diff --git a/docs/models/operations/gethomedataresponsebody.md b/docs/models/operations/gethomedataresponsebody.md new file mode 100644 index 0000000..875eb7d --- /dev/null +++ b/docs/models/operations/gethomedataresponsebody.md @@ -0,0 +1,15 @@ +# GetHomeDataResponseBody + +Home Data + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------- | ------------------- | ------------------- | ------------------- | ------------------- | +| `id` | *Optional[float]* | :heavy_minus_sign: | N/A | 1841489 | +| `name` | *Optional[str]* | :heavy_minus_sign: | N/A | Blindkitty38's home | +| `guest_user_id` | *Optional[float]* | :heavy_minus_sign: | N/A | 58815432 | +| `guest_user_uuid` | *Optional[str]* | :heavy_minus_sign: | N/A | f3df4e01bfca0787 | +| `guest_enabled` | *Optional[bool]* | :heavy_minus_sign: | N/A | | +| `subscription` | *Optional[bool]* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/getlibraryfilter.md b/docs/models/operations/getlibraryfilter.md new file mode 100644 index 0000000..06fbff4 --- /dev/null +++ b/docs/models/operations/getlibraryfilter.md @@ -0,0 +1,12 @@ +# GetLibraryFilter + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------- | ------------------------- | ------------------------- | ------------------------- | ------------------------- | +| `filter_` | *Optional[str]* | :heavy_minus_sign: | N/A | label | +| `filter_type` | *Optional[str]* | :heavy_minus_sign: | N/A | string | +| `key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/sections/1/label | +| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | Labels | +| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | filter | \ No newline at end of file diff --git a/docs/models/operations/getlibraryitemsrequest.md b/docs/models/operations/getlibraryitemsrequest.md index 6453aa1..76537ba 100644 --- a/docs/models/operations/getlibraryitemsrequest.md +++ b/docs/models/operations/getlibraryitemsrequest.md @@ -3,7 +3,7 @@ ## Fields -| Field | Type | Required | Description | Example | -| ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | -| `section_id` | *int* | :heavy_check_mark: | the Id of the library to query | 1 | -| `tag` | [operations.Tag](../../models/operations/tag.md) | :heavy_check_mark: | A key representing a specific tag within the section. | | \ No newline at end of file +| Field | Type | Required | Description | +| ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | +| `section_id` | *Any* | :heavy_check_mark: | the Id of the library to query | +| `tag` | [operations.Tag](../../models/operations/tag.md) | :heavy_check_mark: | A key representing a specific tag within the section. | \ No newline at end of file diff --git a/docs/models/operations/getlibrarytype.md b/docs/models/operations/getlibrarytype.md index e05c841..b4e896a 100644 --- a/docs/models/operations/getlibrarytype.md +++ b/docs/models/operations/getlibrarytype.md @@ -3,12 +3,12 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | -| `key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/sections/1/all?type=1 | -| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | movie | -| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | Movies | -| `active` | *Optional[bool]* | :heavy_minus_sign: | N/A | false | -| `filter_` | List[[operations.Filter](../../models/operations/filter_.md)] | :heavy_minus_sign: | N/A | | -| `sort` | List[[operations.Sort](../../models/operations/sort.md)] | :heavy_minus_sign: | N/A | | -| `field` | List[[operations.Field](../../models/operations/field.md)] | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/sections/1/all?type=1 | +| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | movie | +| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | Movies | +| `active` | *Optional[bool]* | :heavy_minus_sign: | N/A | false | +| `filter_` | List[[operations.GetLibraryFilter](../../models/operations/getlibraryfilter.md)] | :heavy_minus_sign: | N/A | | +| `sort` | List[[operations.Sort](../../models/operations/sort.md)] | :heavy_minus_sign: | N/A | | +| `field` | List[[operations.Field](../../models/operations/field.md)] | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/getpinrequest.md b/docs/models/operations/getpinrequest.md index d677004..642a2f7 100644 --- a/docs/models/operations/getpinrequest.md +++ b/docs/models/operations/getpinrequest.md @@ -5,5 +5,6 @@ | Field | Type | Required | Description | Example | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `x_plex_product` | *str* | :heavy_check_mark: | Product name of the application shown in the list of devices
| Postman | | `strong` | *Optional[bool]* | :heavy_minus_sign: | Determines the kind of code returned by the API call
Strong codes are used for Pin authentication flows
Non-Strong codes are used for `Plex.tv/link`
| | | `x_plex_client_identifier` | *Optional[str]* | :heavy_minus_sign: | 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)
| Postman | \ No newline at end of file diff --git a/docs/models/operations/getrecentlyaddedmediacontainer.md b/docs/models/operations/getrecentlyaddedmediacontainer.md index bf28a57..e215d5c 100644 --- a/docs/models/operations/getrecentlyaddedmediacontainer.md +++ b/docs/models/operations/getrecentlyaddedmediacontainer.md @@ -3,12 +3,12 @@ ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | -| `size` | *Optional[float]* | :heavy_minus_sign: | N/A | 50 | -| `allow_sync` | *Optional[bool]* | :heavy_minus_sign: | N/A | | -| `identifier` | *Optional[str]* | :heavy_minus_sign: | N/A | com.plexapp.plugins.library | -| `media_tag_prefix` | *Optional[str]* | :heavy_minus_sign: | N/A | /system/bundle/media/flags/ | -| `media_tag_version` | *Optional[float]* | :heavy_minus_sign: | N/A | 1680021154 | -| `mixed_parents` | *Optional[bool]* | :heavy_minus_sign: | N/A | | -| `metadata` | List[[operations.Metadata](../../models/operations/metadata.md)] | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | +| `size` | *Optional[float]* | :heavy_minus_sign: | N/A | 50 | +| `allow_sync` | *Optional[bool]* | :heavy_minus_sign: | N/A | | +| `identifier` | *Optional[str]* | :heavy_minus_sign: | N/A | com.plexapp.plugins.library | +| `media_tag_prefix` | *Optional[str]* | :heavy_minus_sign: | N/A | /system/bundle/media/flags/ | +| `media_tag_version` | *Optional[float]* | :heavy_minus_sign: | N/A | 1680021154 | +| `mixed_parents` | *Optional[bool]* | :heavy_minus_sign: | N/A | | +| `metadata` | List[[operations.GetRecentlyAddedMetadata](../../models/operations/getrecentlyaddedmetadata.md)] | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/getrecentlyaddedmetadata.md b/docs/models/operations/getrecentlyaddedmetadata.md new file mode 100644 index 0000000..ea65efb --- /dev/null +++ b/docs/models/operations/getrecentlyaddedmetadata.md @@ -0,0 +1,39 @@ +# GetRecentlyAddedMetadata + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `allow_sync` | *Optional[bool]* | :heavy_minus_sign: | N/A | | +| `library_section_id` | *Optional[float]* | :heavy_minus_sign: | N/A | 1 | +| `library_section_title` | *Optional[str]* | :heavy_minus_sign: | N/A | Movies | +| `library_section_uuid` | *Optional[str]* | :heavy_minus_sign: | N/A | 322a231a-b7f7-49f5-920f-14c61199cd30 | +| `rating_key` | *Optional[float]* | :heavy_minus_sign: | N/A | 59398 | +| `key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59398 | +| `guid` | *Optional[str]* | :heavy_minus_sign: | N/A | plex://movie/5e161a83bea6ac004126e148 | +| `studio` | *Optional[str]* | :heavy_minus_sign: | N/A | Marvel Studios | +| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | movie | +| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | Ant-Man and the Wasp: Quantumania | +| `content_rating` | *Optional[str]* | :heavy_minus_sign: | N/A | PG-13 | +| `summary` | *Optional[str]* | :heavy_minus_sign: | N/A | Scott Lang and Hope Van Dyne along with Hank Pym and Janet Van Dyne explore the Quantum Realm where they interact with strange creatures and embark on an adventure that goes beyond the limits of what they thought was possible. | +| `rating` | *Optional[float]* | :heavy_minus_sign: | N/A | 4.7 | +| `audience_rating` | *Optional[float]* | :heavy_minus_sign: | N/A | 8.3 | +| `year` | *Optional[float]* | :heavy_minus_sign: | N/A | 2023 | +| `tagline` | *Optional[str]* | :heavy_minus_sign: | N/A | Witness the beginning of a new dynasty. | +| `thumb` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59398/thumb/1681888010 | +| `art` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59398/art/1681888010 | +| `duration` | *Optional[float]* | :heavy_minus_sign: | N/A | 7474422 | +| `originally_available_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | 2023-02-15 00:00:00 +0000 UTC | +| `added_at` | *Optional[float]* | :heavy_minus_sign: | N/A | 1681803215 | +| `updated_at` | *Optional[float]* | :heavy_minus_sign: | N/A | 1681888010 | +| `audience_rating_image` | *Optional[str]* | :heavy_minus_sign: | N/A | rottentomatoes://image.rating.upright | +| `chapter_source` | *Optional[str]* | :heavy_minus_sign: | N/A | media | +| `primary_extra_key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59399 | +| `rating_image` | *Optional[str]* | :heavy_minus_sign: | N/A | rottentomatoes://image.rating.rotten | +| `media` | List[[operations.Media](../../models/operations/media.md)] | :heavy_minus_sign: | N/A | | +| `genre` | List[[operations.Genre](../../models/operations/genre.md)] | :heavy_minus_sign: | N/A | | +| `director` | List[[operations.Director](../../models/operations/director.md)] | :heavy_minus_sign: | N/A | | +| `writer` | List[[operations.Writer](../../models/operations/writer.md)] | :heavy_minus_sign: | N/A | | +| `country` | List[[operations.Country](../../models/operations/country.md)] | :heavy_minus_sign: | N/A | | +| `role` | List[[operations.Role](../../models/operations/role.md)] | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/gettokenlocation.md b/docs/models/operations/gettokenlocation.md new file mode 100644 index 0000000..04600f5 --- /dev/null +++ b/docs/models/operations/gettokenlocation.md @@ -0,0 +1,17 @@ +# GetTokenLocation + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `code` | *Optional[str]* | :heavy_minus_sign: | N/A | US | +| `european_union_member` | *Optional[bool]* | :heavy_minus_sign: | N/A | | +| `continent_code` | *Optional[str]* | :heavy_minus_sign: | N/A | NA | +| `country` | *Optional[str]* | :heavy_minus_sign: | N/A | United States | +| `city` | *Optional[str]* | :heavy_minus_sign: | N/A | Austin | +| `time_zone` | *Optional[str]* | :heavy_minus_sign: | N/A | America/Chicago | +| `postal_code` | *Optional[str]* | :heavy_minus_sign: | N/A | 78732 | +| `in_privacy_restricted_country` | *Optional[bool]* | :heavy_minus_sign: | N/A | | +| `subdivisions` | *Optional[str]* | :heavy_minus_sign: | N/A | Texas | +| `coordinates` | *Optional[str]* | :heavy_minus_sign: | N/A | 30.3768 -97.8935 | \ No newline at end of file diff --git a/docs/models/operations/gettokenresponse.md b/docs/models/operations/gettokenresponse.md index 0652442..9062f07 100644 --- a/docs/models/operations/gettokenresponse.md +++ b/docs/models/operations/gettokenresponse.md @@ -3,8 +3,9 @@ ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | -| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | -| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | -| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `object` | [Optional[operations.GetTokenResponseBody]](../../models/operations/gettokenresponsebody.md) | :heavy_minus_sign: | Access Token | \ No newline at end of file diff --git a/docs/models/operations/gettokenresponsebody.md b/docs/models/operations/gettokenresponsebody.md new file mode 100644 index 0000000..42cf6e3 --- /dev/null +++ b/docs/models/operations/gettokenresponsebody.md @@ -0,0 +1,21 @@ +# GetTokenResponseBody + +Access Token + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `id` | *Optional[float]* | :heavy_minus_sign: | PinID for use with authentication | 1272322473 | +| `code` | *Optional[str]* | :heavy_minus_sign: | N/A | 3patfx1a78ukcbr7x0n9bl26t | +| `product` | *Optional[str]* | :heavy_minus_sign: | N/A | Plex Web | +| `trusted` | *Optional[bool]* | :heavy_minus_sign: | N/A | | +| `qr` | *Optional[str]* | :heavy_minus_sign: | a link to a QR code hosted on plex.tv
The QR code redirects to the relevant `plex.tv/link` authentication page
Which then prompts the user for the 4 Digit Link Pin
| https://plex.tv/api/v2/pins/qr/3patfx1a78ukcbr7x0n9bl26t | +| `client_identifier` | *Optional[str]* | :heavy_minus_sign: | N/A | Postman | +| `location` | [Optional[operations.GetTokenLocation]](../../models/operations/gettokenlocation.md) | :heavy_minus_sign: | N/A | | +| `expires_in` | *Optional[float]* | :heavy_minus_sign: | N/A | 1800 | +| `created_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | 2023-04-12 17:00:03 +0000 UTC | +| `expires_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | 2023-04-12 17:30:03 +0000 UTC | +| `auth_token` | *Optional[str]* | :heavy_minus_sign: | N/A | | +| `new_registration` | *Optional[str]* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/getwatchlistrequest.md b/docs/models/operations/getwatchlistrequest.md new file mode 100644 index 0000000..5b55ec3 --- /dev/null +++ b/docs/models/operations/getwatchlistrequest.md @@ -0,0 +1,16 @@ +# GetWatchlistRequest + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `filter_` | [operations.Filter](../../models/operations/filter_.md) | :heavy_check_mark: | Filter | +| `x_plex_token` | *str* | :heavy_check_mark: | User Token | +| `sort` | *Optional[str]* | :heavy_minus_sign: | In the format "field:dir". Available fields are "watchlistedAt" (Added At),
"titleSort" (Title), "originallyAvailableAt" (Release Date), or "rating" (Critic Rating).
"dir" can be "asc" or "desc"
| +| `libtype` | [Optional[operations.Libtype]](../../models/operations/libtype.md) | :heavy_minus_sign: | The type of library to filter. Can be "movie" or "show", or all if not present.
| +| `maxresults` | *Optional[int]* | :heavy_minus_sign: | The number of items to return. If not specified, all items will be returned.
If the number of items exceeds the limit, the response will be paginated.
| +| `include_collections` | [Optional[operations.IncludeCollections]](../../models/operations/includecollections.md) | :heavy_minus_sign: | include collections in the results
| +| `include_external_media` | [Optional[operations.IncludeExternalMedia]](../../models/operations/includeexternalmedia.md) | :heavy_minus_sign: | include external media in the results
| +| `x_plex_container_start` | *Optional[int]* | :heavy_minus_sign: | The index of the first item to return. If not specified, the first item will be returned.
If the number of items exceeds the limit, the response will be paginated.
| +| `x_plex_container_size` | *Optional[int]* | :heavy_minus_sign: | The number of items to return. If not specified, all items will be returned.
If the number of items exceeds the limit, the response will be paginated.
| \ No newline at end of file diff --git a/docs/models/operations/getwatchlistresponse.md b/docs/models/operations/getwatchlistresponse.md new file mode 100644 index 0000000..c2fc5ac --- /dev/null +++ b/docs/models/operations/getwatchlistresponse.md @@ -0,0 +1,11 @@ +# GetWatchlistResponse + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| `content_type` | *str* | :heavy_check_mark: | HTTP response content type for this operation | +| `status_code` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `raw_response` | [requests.Response](https://requests.readthedocs.io/en/latest/api/#requests.Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `object` | [Optional[operations.GetWatchlistResponseBody]](../../models/operations/getwatchlistresponsebody.md) | :heavy_minus_sign: | Watchlist Data | \ No newline at end of file diff --git a/docs/models/operations/getwatchlistresponsebody.md b/docs/models/operations/getwatchlistresponsebody.md new file mode 100644 index 0000000..97bacca --- /dev/null +++ b/docs/models/operations/getwatchlistresponsebody.md @@ -0,0 +1,16 @@ +# GetWatchlistResponseBody + +Watchlist Data + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | +| `library_section_id` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `library_section_title` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `offset` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `total_size` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `identifier` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `size` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `metadata` | List[[operations.Metadata](../../models/operations/metadata.md)] | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/operations/image.md b/docs/models/operations/image.md new file mode 100644 index 0000000..5a5c29d --- /dev/null +++ b/docs/models/operations/image.md @@ -0,0 +1,10 @@ +# Image + + +## Fields + +| Field | Type | Required | Description | +| ------------------ | ------------------ | ------------------ | ------------------ | +| `alt` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `url` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/operations/includecollections.md b/docs/models/operations/includecollections.md new file mode 100644 index 0000000..cc248df --- /dev/null +++ b/docs/models/operations/includecollections.md @@ -0,0 +1,12 @@ +# IncludeCollections + +include collections in the results + + + +## Values + +| Name | Value | +| ------ | ------ | +| `ONE` | 1 | +| `ZERO` | 0 | \ No newline at end of file diff --git a/docs/models/operations/includeexternalmedia.md b/docs/models/operations/includeexternalmedia.md new file mode 100644 index 0000000..07bbeab --- /dev/null +++ b/docs/models/operations/includeexternalmedia.md @@ -0,0 +1,12 @@ +# IncludeExternalMedia + +include external media in the results + + + +## Values + +| Name | Value | +| ------ | ------ | +| `ONE` | 1 | +| `ZERO` | 0 | \ No newline at end of file diff --git a/docs/models/operations/libtype.md b/docs/models/operations/libtype.md new file mode 100644 index 0000000..6828dfd --- /dev/null +++ b/docs/models/operations/libtype.md @@ -0,0 +1,12 @@ +# Libtype + +The type of library to filter. Can be "movie" or "show", or all if not present. + + + +## Values + +| Name | Value | +| ------- | ------- | +| `MOVIE` | movie | +| `SHOW` | show | \ No newline at end of file diff --git a/docs/models/operations/location.md b/docs/models/operations/location.md index 8625984..0f23d0f 100644 --- a/docs/models/operations/location.md +++ b/docs/models/operations/location.md @@ -11,7 +11,7 @@ | `country` | *Optional[str]* | :heavy_minus_sign: | N/A | United States | | `city` | *Optional[str]* | :heavy_minus_sign: | N/A | Austin | | `time_zone` | *Optional[str]* | :heavy_minus_sign: | N/A | America/Chicago | -| `postal_code` | *Optional[float]* | :heavy_minus_sign: | N/A | 78732 | +| `postal_code` | *Optional[str]* | :heavy_minus_sign: | N/A | 78732 | | `in_privacy_restricted_country` | *Optional[bool]* | :heavy_minus_sign: | N/A | | | `subdivisions` | *Optional[str]* | :heavy_minus_sign: | N/A | Texas | | `coordinates` | *Optional[str]* | :heavy_minus_sign: | N/A | 30.3768 -97.8935 | \ No newline at end of file diff --git a/docs/models/operations/metadata.md b/docs/models/operations/metadata.md index f2a9cd5..2ad5752 100644 --- a/docs/models/operations/metadata.md +++ b/docs/models/operations/metadata.md @@ -3,37 +3,40 @@ ## Fields -| Field | Type | Required | Description | Example | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `allow_sync` | *Optional[bool]* | :heavy_minus_sign: | N/A | | -| `library_section_id` | *Optional[float]* | :heavy_minus_sign: | N/A | 1 | -| `library_section_title` | *Optional[str]* | :heavy_minus_sign: | N/A | Movies | -| `library_section_uuid` | *Optional[str]* | :heavy_minus_sign: | N/A | 322a231a-b7f7-49f5-920f-14c61199cd30 | -| `rating_key` | *Optional[float]* | :heavy_minus_sign: | N/A | 59398 | -| `key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59398 | -| `guid` | *Optional[str]* | :heavy_minus_sign: | N/A | plex://movie/5e161a83bea6ac004126e148 | -| `studio` | *Optional[str]* | :heavy_minus_sign: | N/A | Marvel Studios | -| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | movie | -| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | Ant-Man and the Wasp: Quantumania | -| `content_rating` | *Optional[str]* | :heavy_minus_sign: | N/A | PG-13 | -| `summary` | *Optional[str]* | :heavy_minus_sign: | N/A | Scott Lang and Hope Van Dyne along with Hank Pym and Janet Van Dyne explore the Quantum Realm where they interact with strange creatures and embark on an adventure that goes beyond the limits of what they thought was possible. | -| `rating` | *Optional[float]* | :heavy_minus_sign: | N/A | 4.7 | -| `audience_rating` | *Optional[float]* | :heavy_minus_sign: | N/A | 8.3 | -| `year` | *Optional[float]* | :heavy_minus_sign: | N/A | 2023 | -| `tagline` | *Optional[str]* | :heavy_minus_sign: | N/A | Witness the beginning of a new dynasty. | -| `thumb` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59398/thumb/1681888010 | -| `art` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59398/art/1681888010 | -| `duration` | *Optional[float]* | :heavy_minus_sign: | N/A | 7474422 | -| `originally_available_at` | [date](https://docs.python.org/3/library/datetime.html#date-objects) | :heavy_minus_sign: | N/A | 2023-02-15 00:00:00 +0000 UTC | -| `added_at` | *Optional[float]* | :heavy_minus_sign: | N/A | 1681803215 | -| `updated_at` | *Optional[float]* | :heavy_minus_sign: | N/A | 1681888010 | -| `audience_rating_image` | *Optional[str]* | :heavy_minus_sign: | N/A | rottentomatoes://image.rating.upright | -| `chapter_source` | *Optional[str]* | :heavy_minus_sign: | N/A | media | -| `primary_extra_key` | *Optional[str]* | :heavy_minus_sign: | N/A | /library/metadata/59399 | -| `rating_image` | *Optional[str]* | :heavy_minus_sign: | N/A | rottentomatoes://image.rating.rotten | -| `media` | List[[operations.Media](../../models/operations/media.md)] | :heavy_minus_sign: | N/A | | -| `genre` | List[[operations.Genre](../../models/operations/genre.md)] | :heavy_minus_sign: | N/A | | -| `director` | List[[operations.Director](../../models/operations/director.md)] | :heavy_minus_sign: | N/A | | -| `writer` | List[[operations.Writer](../../models/operations/writer.md)] | :heavy_minus_sign: | N/A | | -| `country` | List[[operations.Country](../../models/operations/country.md)] | :heavy_minus_sign: | N/A | | -| `role` | List[[operations.Role](../../models/operations/role.md)] | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | +| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | +| `art` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `guid` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `key` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `rating_key` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `studio` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `tagline` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `type` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `thumb` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `added_at` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `duration` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `public_pages_url` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `slug` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `user_state` | *Optional[bool]* | :heavy_minus_sign: | N/A | +| `title` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `content_rating` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `originally_available_at` | [datetime](https://docs.python.org/3/library/datetime.html#datetime-objects) | :heavy_minus_sign: | N/A | +| `year` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `image` | List[[operations.Image](../../models/operations/image.md)] | :heavy_minus_sign: | N/A | +| `banner` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `rating` | *Optional[float]* | :heavy_minus_sign: | N/A | +| `expires_at` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `original_title` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `audience_rating` | *Optional[float]* | :heavy_minus_sign: | N/A | +| `audience_rating_image` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `rating_image` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `imdb_rating_count` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `subtype` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `theme` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `leaf_count` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `child_count` | *Optional[int]* | :heavy_minus_sign: | N/A | +| `is_continuing_series` | *Optional[bool]* | :heavy_minus_sign: | N/A | +| `skip_children` | *Optional[bool]* | :heavy_minus_sign: | N/A | +| `availability_id` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `streaming_media_id` | *Optional[str]* | :heavy_minus_sign: | N/A | +| `playable_key` | *Optional[str]* | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/sdks/library/README.md b/docs/sdks/library/README.md index 514e712..d98ef6a 100644 --- a/docs/sdks/library/README.md +++ b/docs/sdks/library/README.md @@ -293,7 +293,7 @@ s = plex_api.PlexAPI( ) -res = s.library.get_library_items(section_id=1, tag=operations.Tag.GENRE) +res = s.library.get_library_items(section_id='', tag=operations.Tag.GENRE) if res.object is not None: # handle response @@ -303,10 +303,10 @@ if res.object is not None: ### Parameters -| Parameter | Type | Required | Description | Example | -| ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | -| `section_id` | *int* | :heavy_check_mark: | the Id of the library to query | 1 | -| `tag` | [operations.Tag](../../models/operations/tag.md) | :heavy_check_mark: | A key representing a specific tag within the section. | | +| Parameter | Type | Required | Description | +| ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | ----------------------------------------------------- | +| `section_id` | *Any* | :heavy_check_mark: | the Id of the library to query | +| `tag` | [operations.Tag](../../models/operations/tag.md) | :heavy_check_mark: | A key representing a specific tag within the section. | ### Response diff --git a/docs/sdks/plex/README.md b/docs/sdks/plex/README.md index a97c2c2..c04fd38 100644 --- a/docs/sdks/plex/README.md +++ b/docs/sdks/plex/README.md @@ -8,9 +8,44 @@ API Calls that perform operations directly against https://Plex.tv ### Available Operations +* [get_home_data](#get_home_data) - Get Plex Home Data * [get_pin](#get_pin) - Get a Pin * [get_token](#get_token) - Get Access Token +## get_home_data + +Retrieves the home data for the authenticated user, including details like home ID, name, guest access information, and subscription status. + +### Example Usage + +```python +import plex_api + +s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', +) + + +res = s.plex.get_home_data() + +if res.object is not None: + # handle response + pass + +``` + + +### Response + +**[operations.GetHomeDataResponse](../../models/operations/gethomedataresponse.md)** +### Errors + +| Error Object | Status Code | Content Type | +| ------------------------------ | ------------------------------ | ------------------------------ | +| errors.GetHomeDataResponseBody | 401 | application/json | +| errors.SDKError | 4xx-5xx | */* | + ## get_pin Retrieve a Pin from Plex.tv for authentication flows @@ -25,7 +60,7 @@ s = plex_api.PlexAPI( ) -res = s.plex.get_pin(strong=False, x_plex_client_identifier='Postman') +res = s.plex.get_pin(x_plex_product='Postman', strong=False, x_plex_client_identifier='Postman') if res.object is not None: # handle response @@ -37,6 +72,7 @@ if res.object is not None: | Parameter | Type | Required | Description | Example | | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `x_plex_product` | *str* | :heavy_check_mark: | Product name of the application shown in the list of devices
| Postman | | `strong` | *Optional[bool]* | :heavy_minus_sign: | Determines the kind of code returned by the API call
Strong codes are used for Pin authentication flows
Non-Strong codes are used for `Plex.tv/link`
| | | `x_plex_client_identifier` | *Optional[str]* | :heavy_minus_sign: | 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)
| Postman | | `server_url` | *Optional[str]* | :heavy_minus_sign: | An optional server URL to use. | http://localhost:8080 | @@ -68,7 +104,7 @@ s = plex_api.PlexAPI( res = s.plex.get_token(pin_id='', x_plex_client_identifier='Postman') -if res is not None: +if res.object is not None: # handle response pass diff --git a/docs/sdks/watchlist/README.md b/docs/sdks/watchlist/README.md new file mode 100644 index 0000000..992e422 --- /dev/null +++ b/docs/sdks/watchlist/README.md @@ -0,0 +1,56 @@ +# Watchlist +(*watchlist*) + +## Overview + +API Calls that perform operations with Plex Media Server Watchlists + + +### Available Operations + +* [get_watchlist](#get_watchlist) - Get User Watchlist + +## get_watchlist + +Get User Watchlist + +### Example Usage + +```python +import plex_api +from plex_api.models import operations + +s = plex_api.PlexAPI( + access_token="", + x_plex_client_identifier='Postman', +) + + +res = s.watchlist.get_watchlist(request=operations.GetWatchlistRequest( + filter_=operations.Filter.RELEASED, + x_plex_token='', +)) + +if res.object is not None: + # handle response + pass + +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `request` | [operations.GetWatchlistRequest](../../models/operations/getwatchlistrequest.md) | :heavy_check_mark: | The request object to use for the request. | +| `server_url` | *Optional[str]* | :heavy_minus_sign: | An optional server URL to use. | + + +### Response + +**[operations.GetWatchlistResponse](../../models/operations/getwatchlistresponse.md)** +### Errors + +| Error Object | Status Code | Content Type | +| ------------------------------- | ------------------------------- | ------------------------------- | +| errors.GetWatchlistResponseBody | 401 | application/json | +| errors.SDKError | 4xx-5xx | */* | diff --git a/setup.py b/setup.py index 42bb5dc..6cf12b9 100644 --- a/setup.py +++ b/setup.py @@ -19,7 +19,7 @@ except FileNotFoundError: setuptools.setup( name='plex-api-client', - version='0.8.2', + version='0.9.0', author='LukeHagar', description='Python Client SDK Generated by Speakeasy', url='https://github.com/LukeHagar/plexpy.git', diff --git a/src/plex_api/library.py b/src/plex_api/library.py index 1043d88..3740fe7 100644 --- a/src/plex_api/library.py +++ b/src/plex_api/library.py @@ -5,7 +5,7 @@ from .sdkconfiguration import SDKConfiguration from plex_api import utils from plex_api._hooks import AfterErrorContext, AfterSuccessContext, BeforeRequestContext, HookContext from plex_api.models import errors, operations -from typing import Optional +from typing import Any, Optional class Library: r"""API Calls interacting with Plex Media Server Libraries""" @@ -393,7 +393,7 @@ class Library: - def get_library_items(self, section_id: int, tag: operations.Tag) -> operations.GetLibraryItemsResponse: + def get_library_items(self, section_id: Any, tag: operations.Tag) -> operations.GetLibraryItemsResponse: r"""Get Library Items Fetches details from a specific section of the library identified by a section key and a tag. The tag parameter accepts the following values: - `all`: All items in the section. diff --git a/src/plex_api/models/errors/__init__.py b/src/plex_api/models/errors/__init__.py index 25cf098..9811411 100644 --- a/src/plex_api/models/errors/__init__.py +++ b/src/plex_api/models/errors/__init__.py @@ -14,6 +14,7 @@ from .getbutlertasks import * from .getdevices import * from .getfilehash import * from .getglobalhubs import * +from .gethomedata import * from .getlibraries import * from .getlibrary import * from .getlibraryhubs import * @@ -43,6 +44,7 @@ from .gettoken import * from .gettranscodesessions import * from .gettransienttoken import * from .getupdatestatus import * +from .getwatchlist import * from .logline import * from .logmultiline import * from .markplayed import * @@ -62,4 +64,4 @@ from .updateplaylist import * from .updateplayprogress import * from .uploadplaylist import * -__all__ = ["AddPlaylistContentsErrors","AddPlaylistContentsResponseBody","ApplyUpdatesErrors","ApplyUpdatesResponseBody","CancelServerActivitiesErrors","CancelServerActivitiesResponseBody","CheckForUpdatesErrors","CheckForUpdatesResponseBody","ClearPlaylistContentsErrors","ClearPlaylistContentsResponseBody","CreatePlaylistErrors","CreatePlaylistResponseBody","DeleteLibraryErrors","DeleteLibraryResponseBody","DeletePlaylistErrors","DeletePlaylistResponseBody","EnablePaperTrailErrors","EnablePaperTrailResponseBody","Errors","GetAvailableClientsErrors","GetAvailableClientsResponseBody","GetButlerTasksErrors","GetButlerTasksResponseBody","GetDevicesErrors","GetDevicesResponseBody","GetFileHashErrors","GetFileHashResponseBody","GetGlobalHubsErrors","GetGlobalHubsResponseBody","GetLibrariesErrors","GetLibrariesResponseBody","GetLibraryErrors","GetLibraryHubsErrors","GetLibraryHubsResponseBody","GetLibraryItemsErrors","GetLibraryItemsResponseBody","GetLibraryResponseBody","GetMetadataChildrenErrors","GetMetadataChildrenResponseBody","GetMetadataErrors","GetMetadataResponseBody","GetMyPlexAccountErrors","GetMyPlexAccountResponseBody","GetOnDeckErrors","GetOnDeckResponseBody","GetPinErrors","GetPinResponseBody","GetPlaylistContentsErrors","GetPlaylistContentsResponseBody","GetPlaylistErrors","GetPlaylistResponseBody","GetPlaylistsErrors","GetPlaylistsResponseBody","GetRecentlyAddedErrors","GetRecentlyAddedResponseBody","GetResizedPhotoErrors","GetResizedPhotoResponseBody","GetSearchResultsErrors","GetSearchResultsResponseBody","GetServerActivitiesErrors","GetServerActivitiesResponseBody","GetServerCapabilitiesResponseBody","GetServerIdentityErrors","GetServerIdentityResponseBody","GetServerListErrors","GetServerListResponseBody","GetServerPreferencesErrors","GetServerPreferencesResponseBody","GetSessionHistoryErrors","GetSessionHistoryResponseBody","GetSessionsErrors","GetSessionsResponseBody","GetSourceConnectionInformationErrors","GetSourceConnectionInformationResponseBody","GetStatisticsErrors","GetStatisticsResponseBody","GetTimelineErrors","GetTimelineResponseBody","GetTokenErrors","GetTokenResponseBody","GetTranscodeSessionsErrors","GetTranscodeSessionsResponseBody","GetTransientTokenErrors","GetTransientTokenResponseBody","GetUpdateStatusErrors","GetUpdateStatusResponseBody","LogLineErrors","LogLineResponseBody","LogMultiLineErrors","LogMultiLineResponseBody","MarkPlayedErrors","MarkPlayedResponseBody","MarkUnplayedErrors","MarkUnplayedResponseBody","PerformSearchErrors","PerformSearchResponseBody","PerformVoiceSearchErrors","PerformVoiceSearchResponseBody","RefreshLibraryErrors","RefreshLibraryResponseBody","SDKError","SearchLibraryErrors","SearchLibraryResponseBody","StartAllTasksErrors","StartAllTasksResponseBody","StartTaskErrors","StartTaskResponseBody","StartUniversalTranscodeErrors","StartUniversalTranscodeResponseBody","StopAllTasksErrors","StopAllTasksResponseBody","StopTaskErrors","StopTaskResponseBody","StopTranscodeSessionErrors","StopTranscodeSessionResponseBody","UpdatePlayProgressErrors","UpdatePlayProgressResponseBody","UpdatePlaylistErrors","UpdatePlaylistResponseBody","UploadPlaylistErrors","UploadPlaylistResponseBody"] +__all__ = ["AddPlaylistContentsErrors","AddPlaylistContentsResponseBody","ApplyUpdatesErrors","ApplyUpdatesResponseBody","CancelServerActivitiesErrors","CancelServerActivitiesResponseBody","CheckForUpdatesErrors","CheckForUpdatesResponseBody","ClearPlaylistContentsErrors","ClearPlaylistContentsResponseBody","CreatePlaylistErrors","CreatePlaylistResponseBody","DeleteLibraryErrors","DeleteLibraryResponseBody","DeletePlaylistErrors","DeletePlaylistResponseBody","EnablePaperTrailErrors","EnablePaperTrailResponseBody","Errors","GetAvailableClientsErrors","GetAvailableClientsResponseBody","GetButlerTasksErrors","GetButlerTasksResponseBody","GetDevicesErrors","GetDevicesResponseBody","GetFileHashErrors","GetFileHashResponseBody","GetGlobalHubsErrors","GetGlobalHubsResponseBody","GetHomeDataErrors","GetHomeDataResponseBody","GetLibrariesErrors","GetLibrariesResponseBody","GetLibraryErrors","GetLibraryHubsErrors","GetLibraryHubsResponseBody","GetLibraryItemsErrors","GetLibraryItemsResponseBody","GetLibraryResponseBody","GetMetadataChildrenErrors","GetMetadataChildrenResponseBody","GetMetadataErrors","GetMetadataResponseBody","GetMyPlexAccountErrors","GetMyPlexAccountResponseBody","GetOnDeckErrors","GetOnDeckResponseBody","GetPinErrors","GetPinResponseBody","GetPlaylistContentsErrors","GetPlaylistContentsResponseBody","GetPlaylistErrors","GetPlaylistResponseBody","GetPlaylistsErrors","GetPlaylistsResponseBody","GetRecentlyAddedErrors","GetRecentlyAddedResponseBody","GetResizedPhotoErrors","GetResizedPhotoResponseBody","GetSearchResultsErrors","GetSearchResultsResponseBody","GetServerActivitiesErrors","GetServerActivitiesResponseBody","GetServerCapabilitiesResponseBody","GetServerIdentityErrors","GetServerIdentityResponseBody","GetServerListErrors","GetServerListResponseBody","GetServerPreferencesErrors","GetServerPreferencesResponseBody","GetSessionHistoryErrors","GetSessionHistoryResponseBody","GetSessionsErrors","GetSessionsResponseBody","GetSourceConnectionInformationErrors","GetSourceConnectionInformationResponseBody","GetStatisticsErrors","GetStatisticsResponseBody","GetTimelineErrors","GetTimelineResponseBody","GetTokenErrors","GetTokenResponseBody","GetTranscodeSessionsErrors","GetTranscodeSessionsResponseBody","GetTransientTokenErrors","GetTransientTokenResponseBody","GetUpdateStatusErrors","GetUpdateStatusResponseBody","GetWatchlistErrors","GetWatchlistResponseBody","LogLineErrors","LogLineResponseBody","LogMultiLineErrors","LogMultiLineResponseBody","MarkPlayedErrors","MarkPlayedResponseBody","MarkUnplayedErrors","MarkUnplayedResponseBody","PerformSearchErrors","PerformSearchResponseBody","PerformVoiceSearchErrors","PerformVoiceSearchResponseBody","RefreshLibraryErrors","RefreshLibraryResponseBody","SDKError","SearchLibraryErrors","SearchLibraryResponseBody","StartAllTasksErrors","StartAllTasksResponseBody","StartTaskErrors","StartTaskResponseBody","StartUniversalTranscodeErrors","StartUniversalTranscodeResponseBody","StopAllTasksErrors","StopAllTasksResponseBody","StopTaskErrors","StopTaskResponseBody","StopTranscodeSessionErrors","StopTranscodeSessionResponseBody","UpdatePlayProgressErrors","UpdatePlayProgressResponseBody","UpdatePlaylistErrors","UpdatePlaylistResponseBody","UploadPlaylistErrors","UploadPlaylistResponseBody"] diff --git a/src/plex_api/models/errors/gethomedata.py b/src/plex_api/models/errors/gethomedata.py new file mode 100644 index 0000000..a730472 --- /dev/null +++ b/src/plex_api/models/errors/gethomedata.py @@ -0,0 +1,32 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from plex_api import utils +from typing import List, Optional + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class GetHomeDataErrors: + code: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('code'), 'exclude': lambda f: f is None }}) + message: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('message'), 'exclude': lambda f: f is None }}) + status: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status'), 'exclude': lambda f: f is None }}) + + + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class GetHomeDataResponseBody(Exception): + r"""Unauthorized - Returned if the X-Plex-Token is missing from the header or query.""" + errors: Optional[List[GetHomeDataErrors]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('errors'), 'exclude': lambda f: f is None }}) + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'exclude': lambda f: True }}) + r"""Raw HTTP response; suitable for custom response parsing""" + + + def __str__(self) -> str: + return utils.marshal_json(self, type(self)) diff --git a/src/plex_api/models/errors/getwatchlist.py b/src/plex_api/models/errors/getwatchlist.py new file mode 100644 index 0000000..f093491 --- /dev/null +++ b/src/plex_api/models/errors/getwatchlist.py @@ -0,0 +1,32 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from plex_api import utils +from typing import List, Optional + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class GetWatchlistErrors: + code: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('code'), 'exclude': lambda f: f is None }}) + message: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('message'), 'exclude': lambda f: f is None }}) + status: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('status'), 'exclude': lambda f: f is None }}) + + + + +@dataclass_json(undefined=Undefined.EXCLUDE) + +@dataclasses.dataclass +class GetWatchlistResponseBody(Exception): + r"""Unauthorized - Returned if the X-Plex-Token is missing from the header or query.""" + errors: Optional[List[GetWatchlistErrors]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('errors'), 'exclude': lambda f: f is None }}) + raw_response: Optional[requests_http.Response] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'exclude': lambda f: True }}) + r"""Raw HTTP response; suitable for custom response parsing""" + + + def __str__(self) -> str: + return utils.marshal_json(self, type(self)) diff --git a/src/plex_api/models/operations/__init__.py b/src/plex_api/models/operations/__init__.py index a3afee5..0518aba 100644 --- a/src/plex_api/models/operations/__init__.py +++ b/src/plex_api/models/operations/__init__.py @@ -14,6 +14,7 @@ from .getbutlertasks import * from .getdevices import * from .getfilehash import * from .getglobalhubs import * +from .gethomedata import * from .getlibraries import * from .getlibrary import * from .getlibraryhubs import * @@ -43,6 +44,7 @@ from .gettoken import * from .gettranscodesessions import * from .gettransienttoken import * from .getupdatestatus import * +from .getwatchlist import * from .logline import * from .logmultiline import * from .markplayed import * @@ -61,4 +63,4 @@ from .updateplaylist import * from .updateplayprogress import * from .uploadplaylist import * -__all__ = ["Account","Activity","AddPlaylistContentsMediaContainer","AddPlaylistContentsMetadata","AddPlaylistContentsRequest","AddPlaylistContentsResponse","AddPlaylistContentsResponseBody","ApplyUpdatesRequest","ApplyUpdatesResponse","ButlerTask","ButlerTasks","CancelServerActivitiesRequest","CancelServerActivitiesResponse","CheckForUpdatesRequest","CheckForUpdatesResponse","ClearPlaylistContentsRequest","ClearPlaylistContentsResponse","Context","Country","CreatePlaylistMediaContainer","CreatePlaylistMetadata","CreatePlaylistRequest","CreatePlaylistResponse","CreatePlaylistResponseBody","DeleteLibraryRequest","DeleteLibraryResponse","DeletePlaylistRequest","DeletePlaylistResponse","Device","Director","Directory","Download","EnablePaperTrailResponse","Field","FieldType","Filter","Force","GET_PIN_SERVERS","GET_TOKEN_SERVERS","Genre","GetAvailableClientsMediaContainer","GetAvailableClientsResponse","GetAvailableClientsResponseBody","GetButlerTasksResponse","GetButlerTasksResponseBody","GetDevicesMediaContainer","GetDevicesResponse","GetDevicesResponseBody","GetFileHashRequest","GetFileHashResponse","GetGlobalHubsMediaContainer","GetGlobalHubsMetadata","GetGlobalHubsRequest","GetGlobalHubsResponse","GetGlobalHubsResponseBody","GetLibrariesDirectory","GetLibrariesLocation","GetLibrariesMediaContainer","GetLibrariesResponse","GetLibrariesResponseBody","GetLibraryDirectory","GetLibraryHubsCountry","GetLibraryHubsDirector","GetLibraryHubsGenre","GetLibraryHubsHub","GetLibraryHubsMedia","GetLibraryHubsMediaContainer","GetLibraryHubsMetadata","GetLibraryHubsPart","GetLibraryHubsRequest","GetLibraryHubsResponse","GetLibraryHubsResponseBody","GetLibraryHubsRole","GetLibraryHubsWriter","GetLibraryItemsCountry","GetLibraryItemsDirector","GetLibraryItemsGenre","GetLibraryItemsMedia","GetLibraryItemsMediaContainer","GetLibraryItemsMetadata","GetLibraryItemsPart","GetLibraryItemsRequest","GetLibraryItemsResponse","GetLibraryItemsResponseBody","GetLibraryItemsRole","GetLibraryItemsWriter","GetLibraryMediaContainer","GetLibraryRequest","GetLibraryResponse","GetLibraryResponseBody","GetLibraryType","GetMetadataChildrenDirectory","GetMetadataChildrenMediaContainer","GetMetadataChildrenMetadata","GetMetadataChildrenRequest","GetMetadataChildrenResponse","GetMetadataChildrenResponseBody","GetMetadataCountry","GetMetadataDirector","GetMetadataGenre","GetMetadataMedia","GetMetadataMediaContainer","GetMetadataMetadata","GetMetadataPart","GetMetadataRequest","GetMetadataResponse","GetMetadataResponseBody","GetMetadataRole","GetMetadataWriter","GetMyPlexAccountResponse","GetMyPlexAccountResponseBody","GetOnDeckGuids","GetOnDeckMedia","GetOnDeckMediaContainer","GetOnDeckMetadata","GetOnDeckPart","GetOnDeckResponse","GetOnDeckResponseBody","GetOnDeckStream","GetPinGlobals","GetPinRequest","GetPinResponse","GetPinResponseBody","GetPlaylistContentsCountry","GetPlaylistContentsDirector","GetPlaylistContentsGenre","GetPlaylistContentsMedia","GetPlaylistContentsMediaContainer","GetPlaylistContentsMetadata","GetPlaylistContentsPart","GetPlaylistContentsRequest","GetPlaylistContentsResponse","GetPlaylistContentsResponseBody","GetPlaylistContentsRole","GetPlaylistContentsWriter","GetPlaylistMediaContainer","GetPlaylistMetadata","GetPlaylistRequest","GetPlaylistResponse","GetPlaylistResponseBody","GetPlaylistsMediaContainer","GetPlaylistsMetadata","GetPlaylistsRequest","GetPlaylistsResponse","GetPlaylistsResponseBody","GetRecentlyAddedMediaContainer","GetRecentlyAddedResponse","GetRecentlyAddedResponseBody","GetResizedPhotoRequest","GetResizedPhotoResponse","GetSearchResultsCountry","GetSearchResultsDirector","GetSearchResultsGenre","GetSearchResultsMedia","GetSearchResultsMediaContainer","GetSearchResultsMetadata","GetSearchResultsPart","GetSearchResultsRequest","GetSearchResultsResponse","GetSearchResultsResponseBody","GetSearchResultsRole","GetSearchResultsWriter","GetServerActivitiesMediaContainer","GetServerActivitiesResponse","GetServerActivitiesResponseBody","GetServerCapabilitiesResponse","GetServerCapabilitiesResponseBody","GetServerIdentityMediaContainer","GetServerIdentityResponse","GetServerIdentityResponseBody","GetServerListMediaContainer","GetServerListResponse","GetServerListResponseBody","GetServerListServer","GetServerPreferencesMediaContainer","GetServerPreferencesResponse","GetServerPreferencesResponseBody","GetSessionHistoryMediaContainer","GetSessionHistoryMetadata","GetSessionHistoryResponse","GetSessionHistoryResponseBody","GetSessionsMedia","GetSessionsMediaContainer","GetSessionsMetadata","GetSessionsPart","GetSessionsResponse","GetSessionsResponseBody","GetSessionsStream","GetSourceConnectionInformationRequest","GetSourceConnectionInformationResponse","GetStatisticsDevice","GetStatisticsMediaContainer","GetStatisticsRequest","GetStatisticsResponse","GetStatisticsResponseBody","GetTimelineRequest","GetTimelineResponse","GetTokenGlobals","GetTokenRequest","GetTokenResponse","GetTranscodeSessionsMediaContainer","GetTranscodeSessionsResponse","GetTranscodeSessionsResponseBody","GetTransientTokenQueryParamType","GetTransientTokenRequest","GetTransientTokenResponse","GetUpdateStatusMediaContainer","GetUpdateStatusResponse","GetUpdateStatusResponseBody","Guids","Hub","IncludeDetails","Level","Location","LogLineRequest","LogLineResponse","LogMultiLineResponse","MarkPlayedRequest","MarkPlayedResponse","MarkUnplayedRequest","MarkUnplayedResponse","Media","MediaContainer","Metadata","MinSize","MyPlex","OnlyTransient","Operator","Part","PathParamTaskName","PerformSearchRequest","PerformSearchResponse","PerformVoiceSearchRequest","PerformVoiceSearchResponse","Player","PlaylistType","Producer","Provider","QueryParamOnlyTransient","QueryParamSmart","QueryParamType","Ratings","RefreshLibraryRequest","RefreshLibraryResponse","Release","Role","Scope","SearchLibraryMediaContainer","SearchLibraryMetadata","SearchLibraryRequest","SearchLibraryResponse","SearchLibraryResponseBody","Server","Session","Setting","Skip","Smart","Sort","StartAllTasksResponse","StartTaskRequest","StartTaskResponse","StartUniversalTranscodeRequest","StartUniversalTranscodeResponse","State","StatisticsMedia","StopAllTasksResponse","StopTaskRequest","StopTaskResponse","StopTranscodeSessionRequest","StopTranscodeSessionResponse","Stream","Tag","TaskName","Tonight","TranscodeSession","Type","UpdatePlayProgressRequest","UpdatePlayProgressResponse","UpdatePlaylistRequest","UpdatePlaylistResponse","UploadPlaylistRequest","UploadPlaylistResponse","Upscale","User","Writer"] +__all__ = ["Account","Activity","AddPlaylistContentsMediaContainer","AddPlaylistContentsMetadata","AddPlaylistContentsRequest","AddPlaylistContentsResponse","AddPlaylistContentsResponseBody","ApplyUpdatesRequest","ApplyUpdatesResponse","ButlerTask","ButlerTasks","CancelServerActivitiesRequest","CancelServerActivitiesResponse","CheckForUpdatesRequest","CheckForUpdatesResponse","ClearPlaylistContentsRequest","ClearPlaylistContentsResponse","Context","Country","CreatePlaylistMediaContainer","CreatePlaylistMetadata","CreatePlaylistRequest","CreatePlaylistResponse","CreatePlaylistResponseBody","DeleteLibraryRequest","DeleteLibraryResponse","DeletePlaylistRequest","DeletePlaylistResponse","Device","Director","Directory","Download","EnablePaperTrailResponse","Field","FieldType","Filter","Force","GET_PIN_SERVERS","GET_TOKEN_SERVERS","GET_WATCHLIST_SERVERS","Genre","GetAvailableClientsMediaContainer","GetAvailableClientsResponse","GetAvailableClientsResponseBody","GetButlerTasksResponse","GetButlerTasksResponseBody","GetDevicesMediaContainer","GetDevicesResponse","GetDevicesResponseBody","GetFileHashRequest","GetFileHashResponse","GetGlobalHubsMediaContainer","GetGlobalHubsMetadata","GetGlobalHubsRequest","GetGlobalHubsResponse","GetGlobalHubsResponseBody","GetHomeDataResponse","GetHomeDataResponseBody","GetLibrariesDirectory","GetLibrariesLocation","GetLibrariesMediaContainer","GetLibrariesResponse","GetLibrariesResponseBody","GetLibraryDirectory","GetLibraryFilter","GetLibraryHubsCountry","GetLibraryHubsDirector","GetLibraryHubsGenre","GetLibraryHubsHub","GetLibraryHubsMedia","GetLibraryHubsMediaContainer","GetLibraryHubsMetadata","GetLibraryHubsPart","GetLibraryHubsRequest","GetLibraryHubsResponse","GetLibraryHubsResponseBody","GetLibraryHubsRole","GetLibraryHubsWriter","GetLibraryItemsCountry","GetLibraryItemsDirector","GetLibraryItemsGenre","GetLibraryItemsMedia","GetLibraryItemsMediaContainer","GetLibraryItemsMetadata","GetLibraryItemsPart","GetLibraryItemsRequest","GetLibraryItemsResponse","GetLibraryItemsResponseBody","GetLibraryItemsRole","GetLibraryItemsWriter","GetLibraryMediaContainer","GetLibraryRequest","GetLibraryResponse","GetLibraryResponseBody","GetLibraryType","GetMetadataChildrenDirectory","GetMetadataChildrenMediaContainer","GetMetadataChildrenMetadata","GetMetadataChildrenRequest","GetMetadataChildrenResponse","GetMetadataChildrenResponseBody","GetMetadataCountry","GetMetadataDirector","GetMetadataGenre","GetMetadataMedia","GetMetadataMediaContainer","GetMetadataMetadata","GetMetadataPart","GetMetadataRequest","GetMetadataResponse","GetMetadataResponseBody","GetMetadataRole","GetMetadataWriter","GetMyPlexAccountResponse","GetMyPlexAccountResponseBody","GetOnDeckGuids","GetOnDeckMedia","GetOnDeckMediaContainer","GetOnDeckMetadata","GetOnDeckPart","GetOnDeckResponse","GetOnDeckResponseBody","GetOnDeckStream","GetPinGlobals","GetPinRequest","GetPinResponse","GetPinResponseBody","GetPlaylistContentsCountry","GetPlaylistContentsDirector","GetPlaylistContentsGenre","GetPlaylistContentsMedia","GetPlaylistContentsMediaContainer","GetPlaylistContentsMetadata","GetPlaylistContentsPart","GetPlaylistContentsRequest","GetPlaylistContentsResponse","GetPlaylistContentsResponseBody","GetPlaylistContentsRole","GetPlaylistContentsWriter","GetPlaylistMediaContainer","GetPlaylistMetadata","GetPlaylistRequest","GetPlaylistResponse","GetPlaylistResponseBody","GetPlaylistsMediaContainer","GetPlaylistsMetadata","GetPlaylistsRequest","GetPlaylistsResponse","GetPlaylistsResponseBody","GetRecentlyAddedMediaContainer","GetRecentlyAddedMetadata","GetRecentlyAddedResponse","GetRecentlyAddedResponseBody","GetResizedPhotoRequest","GetResizedPhotoResponse","GetSearchResultsCountry","GetSearchResultsDirector","GetSearchResultsGenre","GetSearchResultsMedia","GetSearchResultsMediaContainer","GetSearchResultsMetadata","GetSearchResultsPart","GetSearchResultsRequest","GetSearchResultsResponse","GetSearchResultsResponseBody","GetSearchResultsRole","GetSearchResultsWriter","GetServerActivitiesMediaContainer","GetServerActivitiesResponse","GetServerActivitiesResponseBody","GetServerCapabilitiesResponse","GetServerCapabilitiesResponseBody","GetServerIdentityMediaContainer","GetServerIdentityResponse","GetServerIdentityResponseBody","GetServerListMediaContainer","GetServerListResponse","GetServerListResponseBody","GetServerListServer","GetServerPreferencesMediaContainer","GetServerPreferencesResponse","GetServerPreferencesResponseBody","GetSessionHistoryMediaContainer","GetSessionHistoryMetadata","GetSessionHistoryResponse","GetSessionHistoryResponseBody","GetSessionsMedia","GetSessionsMediaContainer","GetSessionsMetadata","GetSessionsPart","GetSessionsResponse","GetSessionsResponseBody","GetSessionsStream","GetSourceConnectionInformationRequest","GetSourceConnectionInformationResponse","GetStatisticsDevice","GetStatisticsMediaContainer","GetStatisticsRequest","GetStatisticsResponse","GetStatisticsResponseBody","GetTimelineRequest","GetTimelineResponse","GetTokenGlobals","GetTokenLocation","GetTokenRequest","GetTokenResponse","GetTokenResponseBody","GetTranscodeSessionsMediaContainer","GetTranscodeSessionsResponse","GetTranscodeSessionsResponseBody","GetTransientTokenQueryParamType","GetTransientTokenRequest","GetTransientTokenResponse","GetUpdateStatusMediaContainer","GetUpdateStatusResponse","GetUpdateStatusResponseBody","GetWatchlistRequest","GetWatchlistResponse","GetWatchlistResponseBody","Guids","Hub","Image","IncludeCollections","IncludeDetails","IncludeExternalMedia","Level","Libtype","Location","LogLineRequest","LogLineResponse","LogMultiLineResponse","MarkPlayedRequest","MarkPlayedResponse","MarkUnplayedRequest","MarkUnplayedResponse","Media","MediaContainer","Metadata","MinSize","MyPlex","OnlyTransient","Operator","Part","PathParamTaskName","PerformSearchRequest","PerformSearchResponse","PerformVoiceSearchRequest","PerformVoiceSearchResponse","Player","PlaylistType","Producer","Provider","QueryParamOnlyTransient","QueryParamSmart","QueryParamType","Ratings","RefreshLibraryRequest","RefreshLibraryResponse","Release","Role","Scope","SearchLibraryMediaContainer","SearchLibraryMetadata","SearchLibraryRequest","SearchLibraryResponse","SearchLibraryResponseBody","Server","Session","Setting","Skip","Smart","Sort","StartAllTasksResponse","StartTaskRequest","StartTaskResponse","StartUniversalTranscodeRequest","StartUniversalTranscodeResponse","State","StatisticsMedia","StopAllTasksResponse","StopTaskRequest","StopTaskResponse","StopTranscodeSessionRequest","StopTranscodeSessionResponse","Stream","Tag","TaskName","Tonight","TranscodeSession","Type","UpdatePlayProgressRequest","UpdatePlayProgressResponse","UpdatePlaylistRequest","UpdatePlaylistResponse","UploadPlaylistRequest","UploadPlaylistResponse","Upscale","User","Writer"] diff --git a/src/plex_api/models/operations/gethomedata.py b/src/plex_api/models/operations/gethomedata.py new file mode 100644 index 0000000..13c0987 --- /dev/null +++ b/src/plex_api/models/operations/gethomedata.py @@ -0,0 +1,36 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from plex_api import utils +from typing import Optional + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class GetHomeDataResponseBody: + r"""Home Data""" + id: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id'), 'exclude': lambda f: f is None }}) + name: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name'), 'exclude': lambda f: f is None }}) + guest_user_id: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('guestUserID'), 'exclude': lambda f: f is None }}) + guest_user_uuid: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('guestUserUUID'), 'exclude': lambda f: f is None }}) + guest_enabled: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('guestEnabled'), 'exclude': lambda f: f is None }}) + subscription: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('subscription'), 'exclude': lambda f: f is None }}) + + + + +@dataclasses.dataclass +class GetHomeDataResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + raw_response: requests_http.Response = dataclasses.field() + r"""Raw HTTP response; suitable for custom response parsing""" + object: Optional[GetHomeDataResponseBody] = dataclasses.field(default=None) + r"""Home Data""" + + diff --git a/src/plex_api/models/operations/getlibrary.py b/src/plex_api/models/operations/getlibrary.py index 13209a1..89ea504 100644 --- a/src/plex_api/models/operations/getlibrary.py +++ b/src/plex_api/models/operations/getlibrary.py @@ -43,7 +43,7 @@ class GetLibraryDirectory: @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass -class Filter: +class GetLibraryFilter: filter_: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('filter'), 'exclude': lambda f: f is None }}) filter_type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('filterType'), 'exclude': lambda f: f is None }}) key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('key'), 'exclude': lambda f: f is None }}) @@ -84,7 +84,7 @@ class GetLibraryType: type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type'), 'exclude': lambda f: f is None }}) title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('title'), 'exclude': lambda f: f is None }}) active: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('active'), 'exclude': lambda f: f is None }}) - filter_: Optional[List[Filter]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Filter'), 'exclude': lambda f: f is None }}) + filter_: Optional[List[GetLibraryFilter]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Filter'), 'exclude': lambda f: f is None }}) sort: Optional[List[Sort]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Sort'), 'exclude': lambda f: f is None }}) field: Optional[List[Field]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Field'), 'exclude': lambda f: f is None }}) diff --git a/src/plex_api/models/operations/getlibraryitems.py b/src/plex_api/models/operations/getlibraryitems.py index 4620671..965d726 100644 --- a/src/plex_api/models/operations/getlibraryitems.py +++ b/src/plex_api/models/operations/getlibraryitems.py @@ -7,7 +7,7 @@ from dataclasses_json import Undefined, dataclass_json from datetime import date from enum import Enum from plex_api import utils -from typing import List, Optional +from typing import Any, List, Optional class Tag(str, Enum): @@ -35,7 +35,7 @@ class Tag(str, Enum): @dataclasses.dataclass class GetLibraryItemsRequest: - section_id: int = dataclasses.field(metadata={'path_param': { 'field_name': 'sectionId', 'style': 'simple', 'explode': False }}) + section_id: Any = dataclasses.field(metadata={'path_param': { 'field_name': 'sectionId', 'style': 'simple', 'explode': False }}) r"""the Id of the library to query""" tag: Tag = dataclasses.field(metadata={'path_param': { 'field_name': 'tag', 'style': 'simple', 'explode': False }}) r"""A key representing a specific tag within the section.""" diff --git a/src/plex_api/models/operations/getpin.py b/src/plex_api/models/operations/getpin.py index 5944bce..d4e3685 100644 --- a/src/plex_api/models/operations/getpin.py +++ b/src/plex_api/models/operations/getpin.py @@ -27,6 +27,8 @@ class GetPinGlobals: @dataclasses.dataclass class GetPinRequest: + x_plex_product: str = dataclasses.field(metadata={'header': { 'field_name': 'X-Plex-Product', 'style': 'simple', 'explode': False }}) + r"""Product name of the application shown in the list of devices""" strong: Optional[bool] = dataclasses.field(default=False, metadata={'query_param': { 'field_name': 'strong', 'style': 'form', 'explode': True }}) r"""Determines the kind of code returned by the API call Strong codes are used for Pin authentication flows @@ -50,7 +52,7 @@ class Location: country: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('country'), 'exclude': lambda f: f is None }}) city: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('city'), 'exclude': lambda f: f is None }}) time_zone: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time_zone'), 'exclude': lambda f: f is None }}) - postal_code: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('postal_code'), 'exclude': lambda f: f is None }}) + postal_code: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('postal_code'), 'exclude': lambda f: f is None }}) in_privacy_restricted_country: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('in_privacy_restricted_country'), 'exclude': lambda f: f is None }}) subdivisions: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('subdivisions'), 'exclude': lambda f: f is None }}) coordinates: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('coordinates'), 'exclude': lambda f: f is None }}) diff --git a/src/plex_api/models/operations/getrecentlyadded.py b/src/plex_api/models/operations/getrecentlyadded.py index 61ae47c..3f08e83 100644 --- a/src/plex_api/models/operations/getrecentlyadded.py +++ b/src/plex_api/models/operations/getrecentlyadded.py @@ -92,7 +92,7 @@ class Role: @dataclass_json(undefined=Undefined.EXCLUDE) @dataclasses.dataclass -class Metadata: +class GetRecentlyAddedMetadata: allow_sync: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('allowSync'), 'exclude': lambda f: f is None }}) library_section_id: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('librarySectionID'), 'exclude': lambda f: f is None }}) library_section_title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('librarySectionTitle'), 'exclude': lambda f: f is None }}) @@ -138,7 +138,7 @@ class GetRecentlyAddedMediaContainer: media_tag_prefix: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('mediaTagPrefix'), 'exclude': lambda f: f is None }}) media_tag_version: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('mediaTagVersion'), 'exclude': lambda f: f is None }}) mixed_parents: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('mixedParents'), 'exclude': lambda f: f is None }}) - metadata: Optional[List[Metadata]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Metadata'), 'exclude': lambda f: f is None }}) + metadata: Optional[List[GetRecentlyAddedMetadata]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Metadata'), 'exclude': lambda f: f is None }}) diff --git a/src/plex_api/models/operations/gettoken.py b/src/plex_api/models/operations/gettoken.py index 3d67d6a..b5961f2 100644 --- a/src/plex_api/models/operations/gettoken.py +++ b/src/plex_api/models/operations/gettoken.py @@ -2,7 +2,11 @@ from __future__ import annotations import dataclasses +import dateutil.parser import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from datetime import datetime +from plex_api import utils from typing import Optional GET_TOKEN_SERVERS = [ @@ -34,6 +38,48 @@ class GetTokenRequest: +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class GetTokenLocation: + code: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('code'), 'exclude': lambda f: f is None }}) + european_union_member: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('european_union_member'), 'exclude': lambda f: f is None }}) + continent_code: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('continent_code'), 'exclude': lambda f: f is None }}) + country: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('country'), 'exclude': lambda f: f is None }}) + city: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('city'), 'exclude': lambda f: f is None }}) + time_zone: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('time_zone'), 'exclude': lambda f: f is None }}) + postal_code: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('postal_code'), 'exclude': lambda f: f is None }}) + in_privacy_restricted_country: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('in_privacy_restricted_country'), 'exclude': lambda f: f is None }}) + subdivisions: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('subdivisions'), 'exclude': lambda f: f is None }}) + coordinates: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('coordinates'), 'exclude': lambda f: f is None }}) + + + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class GetTokenResponseBody: + r"""Access Token""" + id: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id'), 'exclude': lambda f: f is None }}) + r"""PinID for use with authentication""" + code: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('code'), 'exclude': lambda f: f is None }}) + product: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('product'), 'exclude': lambda f: f is None }}) + trusted: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('trusted'), 'exclude': lambda f: f is None }}) + qr: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('qr'), 'exclude': lambda f: f is None }}) + r"""a link to a QR code hosted on plex.tv + The QR code redirects to the relevant `plex.tv/link` authentication page + Which then prompts the user for the 4 Digit Link Pin + """ + client_identifier: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('clientIdentifier'), 'exclude': lambda f: f is None }}) + location: Optional[GetTokenLocation] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('location'), 'exclude': lambda f: f is None }}) + expires_in: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expiresIn'), 'exclude': lambda f: f is None }}) + created_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('createdAt'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + expires_at: Optional[datetime] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expiresAt'), 'encoder': utils.datetimeisoformat(True), 'decoder': dateutil.parser.isoparse, 'exclude': lambda f: f is None }}) + auth_token: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('authToken'), 'exclude': lambda f: f is None }}) + new_registration: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('newRegistration'), 'exclude': lambda f: f is None }}) + + + + @dataclasses.dataclass class GetTokenResponse: content_type: str = dataclasses.field() @@ -42,5 +88,7 @@ class GetTokenResponse: r"""HTTP response status code for this operation""" raw_response: requests_http.Response = dataclasses.field() r"""Raw HTTP response; suitable for custom response parsing""" + object: Optional[GetTokenResponseBody] = dataclasses.field(default=None) + r"""Access Token""" diff --git a/src/plex_api/models/operations/getwatchlist.py b/src/plex_api/models/operations/getwatchlist.py new file mode 100644 index 0000000..690662b --- /dev/null +++ b/src/plex_api/models/operations/getwatchlist.py @@ -0,0 +1,154 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +from __future__ import annotations +import dataclasses +import requests as requests_http +from dataclasses_json import Undefined, dataclass_json +from datetime import date +from enum import Enum +from plex_api import utils +from typing import List, Optional + +GET_WATCHLIST_SERVERS = [ + "https://metadata.provider.plex.tv", + r"""The plex metadata provider server""" +] + + +class Filter(str, Enum): + r"""Filter""" + ALL = 'all' + AVAILABLE = 'available' + RELEASED = 'released' + + +class Libtype(str, Enum): + r"""The type of library to filter. Can be \\"movie\\" or \\"show\\", or all if not present.""" + MOVIE = 'movie' + SHOW = 'show' + + +class IncludeCollections(int, Enum): + r"""include collections in the results""" + ONE = 1 + ZERO = 0 + + +class IncludeExternalMedia(int, Enum): + r"""include external media in the results""" + ONE = 1 + ZERO = 0 + + +@dataclasses.dataclass +class GetWatchlistRequest: + filter_: Filter = dataclasses.field(metadata={'path_param': { 'field_name': 'filter', 'style': 'simple', 'explode': False }}) + r"""Filter""" + x_plex_token: str = dataclasses.field(metadata={'query_param': { 'field_name': 'X-Plex-Token', 'style': 'form', 'explode': True }}) + r"""User Token""" + sort: Optional[str] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'sort', 'style': 'form', 'explode': True }}) + r"""In the format \\"field:dir\\". Available fields are \\"watchlistedAt\\" (Added At), + \"titleSort\" (Title), \"originallyAvailableAt\" (Release Date), or \"rating\" (Critic Rating). + \"dir\" can be \"asc\" or \"desc\" + """ + libtype: Optional[Libtype] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'libtype', 'style': 'form', 'explode': True }}) + r"""The type of library to filter. Can be \\"movie\\" or \\"show\\", or all if not present.""" + maxresults: Optional[int] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'maxresults', 'style': 'form', 'explode': True }}) + r"""The number of items to return. If not specified, all items will be returned. + If the number of items exceeds the limit, the response will be paginated. + """ + include_collections: Optional[IncludeCollections] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'includeCollections', 'style': 'form', 'explode': True }}) + r"""include collections in the results""" + include_external_media: Optional[IncludeExternalMedia] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'includeExternalMedia', 'style': 'form', 'explode': True }}) + r"""include external media in the results""" + x_plex_container_start: Optional[int] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'X-Plex-Container-Start', 'style': 'form', 'explode': True }}) + r"""The index of the first item to return. If not specified, the first item will be returned. + If the number of items exceeds the limit, the response will be paginated. + """ + x_plex_container_size: Optional[int] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'X-Plex-Container-Size', 'style': 'form', 'explode': True }}) + r"""The number of items to return. If not specified, all items will be returned. + If the number of items exceeds the limit, the response will be paginated. + """ + + + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class Image: + alt: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('alt'), 'exclude': lambda f: f is None }}) + type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type'), 'exclude': lambda f: f is None }}) + url: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('url'), 'exclude': lambda f: f is None }}) + + + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class Metadata: + art: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('art'), 'exclude': lambda f: f is None }}) + guid: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('guid'), 'exclude': lambda f: f is None }}) + key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('key'), 'exclude': lambda f: f is None }}) + rating_key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('ratingKey'), 'exclude': lambda f: f is None }}) + studio: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('studio'), 'exclude': lambda f: f is None }}) + tagline: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('tagline'), 'exclude': lambda f: f is None }}) + type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type'), 'exclude': lambda f: f is None }}) + thumb: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('thumb'), 'exclude': lambda f: f is None }}) + added_at: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('addedAt'), 'exclude': lambda f: f is None }}) + duration: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('duration'), 'exclude': lambda f: f is None }}) + public_pages_url: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('publicPagesURL'), 'exclude': lambda f: f is None }}) + slug: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('slug'), 'exclude': lambda f: f is None }}) + user_state: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('userState'), 'exclude': lambda f: f is None }}) + title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('title'), 'exclude': lambda f: f is None }}) + content_rating: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('contentRating'), 'exclude': lambda f: f is None }}) + originally_available_at: Optional[date] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('originallyAvailableAt'), 'encoder': utils.dateisoformat(True), 'decoder': utils.datefromisoformat, 'exclude': lambda f: f is None }}) + year: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('year'), 'exclude': lambda f: f is None }}) + image: Optional[List[Image]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Image'), 'exclude': lambda f: f is None }}) + banner: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('banner'), 'exclude': lambda f: f is None }}) + rating: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('rating'), 'exclude': lambda f: f is None }}) + expires_at: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('expiresAt'), 'exclude': lambda f: f is None }}) + original_title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('originalTitle'), 'exclude': lambda f: f is None }}) + audience_rating: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('audienceRating'), 'exclude': lambda f: f is None }}) + audience_rating_image: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('audienceRatingImage'), 'exclude': lambda f: f is None }}) + rating_image: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('ratingImage'), 'exclude': lambda f: f is None }}) + imdb_rating_count: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('imdbRatingCount'), 'exclude': lambda f: f is None }}) + subtype: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('subtype'), 'exclude': lambda f: f is None }}) + theme: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('theme'), 'exclude': lambda f: f is None }}) + leaf_count: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('leafCount'), 'exclude': lambda f: f is None }}) + child_count: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('childCount'), 'exclude': lambda f: f is None }}) + is_continuing_series: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('isContinuingSeries'), 'exclude': lambda f: f is None }}) + skip_children: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('skipChildren'), 'exclude': lambda f: f is None }}) + availability_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('availabilityId'), 'exclude': lambda f: f is None }}) + streaming_media_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('streamingMediaId'), 'exclude': lambda f: f is None }}) + playable_key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('playableKey'), 'exclude': lambda f: f is None }}) + + + + +@dataclass_json(undefined=Undefined.EXCLUDE) +@dataclasses.dataclass +class GetWatchlistResponseBody: + r"""Watchlist Data""" + library_section_id: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('librarySectionID'), 'exclude': lambda f: f is None }}) + library_section_title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('librarySectionTitle'), 'exclude': lambda f: f is None }}) + offset: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('offset'), 'exclude': lambda f: f is None }}) + total_size: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('totalSize'), 'exclude': lambda f: f is None }}) + identifier: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('identifier'), 'exclude': lambda f: f is None }}) + size: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('size'), 'exclude': lambda f: f is None }}) + metadata: Optional[List[Metadata]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Metadata'), 'exclude': lambda f: f is None }}) + + + + +@dataclasses.dataclass +class GetWatchlistResponse: + content_type: str = dataclasses.field() + r"""HTTP response content type for this operation""" + status_code: int = dataclasses.field() + r"""HTTP response status code for this operation""" + raw_response: requests_http.Response = dataclasses.field() + r"""Raw HTTP response; suitable for custom response parsing""" + object: Optional[GetWatchlistResponseBody] = dataclasses.field(default=None) + r"""Watchlist Data""" + + diff --git a/src/plex_api/plex.py b/src/plex_api/plex.py index 4080c48..9f03c6e 100644 --- a/src/plex_api/plex.py +++ b/src/plex_api/plex.py @@ -16,7 +16,73 @@ class Plex: - def get_pin(self, strong: Optional[bool] = None, x_plex_client_identifier: Optional[str] = None, server_url: Optional[str] = None) -> operations.GetPinResponse: + def get_home_data(self) -> operations.GetHomeDataResponse: + r"""Get Plex Home Data + Retrieves the home data for the authenticated user, including details like home ID, name, guest access information, and subscription status. + """ + hook_ctx = HookContext(operation_id='getHomeData', oauth2_scopes=[], security_source=self.sdk_configuration.security) + base_url = utils.template_url(*self.sdk_configuration.get_server_details()) + + url = base_url + '/home' + + if callable(self.sdk_configuration.security): + headers, query_params = utils.get_security(self.sdk_configuration.security()) + else: + headers, query_params = utils.get_security(self.sdk_configuration.security) + + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent + client = self.sdk_configuration.client + + try: + req = client.prepare_request(requests_http.Request('GET', url, params=query_params, headers=headers)) + req = self.sdk_configuration.get_hooks().before_request(BeforeRequestContext(hook_ctx), req) + http_res = client.send(req) + except Exception as e: + _, e = self.sdk_configuration.get_hooks().after_error(AfterErrorContext(hook_ctx), None, e) + if e is not None: + raise e + + if utils.match_status_codes(['400','401','4XX','5XX'], http_res.status_code): + result, e = self.sdk_configuration.get_hooks().after_error(AfterErrorContext(hook_ctx), http_res, None) + if e is not None: + raise e + if result is not None: + http_res = result + else: + http_res = self.sdk_configuration.get_hooks().after_success(AfterSuccessContext(hook_ctx), http_res) + + + + res = operations.GetHomeDataResponse(status_code=http_res.status_code, content_type=http_res.headers.get('Content-Type') or '', raw_response=http_res) + + if http_res.status_code == 200: + # pylint: disable=no-else-return + if utils.match_content_type(http_res.headers.get('Content-Type') or '', 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[operations.GetHomeDataResponseBody]) + res.object = out + else: + content_type = http_res.headers.get('Content-Type') + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code == 400 or http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + elif http_res.status_code == 401: + # pylint: disable=no-else-return + if utils.match_content_type(http_res.headers.get('Content-Type') or '', 'application/json'): + out = utils.unmarshal_json(http_res.text, errors.GetHomeDataResponseBody) + out.raw_response = http_res + raise out + else: + content_type = http_res.headers.get('Content-Type') + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + else: + raise errors.SDKError('unknown status code received', http_res.status_code, http_res.text, http_res) + + return res + + + + def get_pin(self, x_plex_product: str, strong: Optional[bool] = None, x_plex_client_identifier: Optional[str] = None, server_url: Optional[str] = None) -> operations.GetPinResponse: r"""Get a Pin Retrieve a Pin from Plex.tv for authentication flows """ @@ -24,6 +90,7 @@ class Plex: request = operations.GetPinRequest( strong=strong, x_plex_client_identifier=x_plex_client_identifier, + x_plex_product=x_plex_product, ) _globals = operations.GetPinGlobals( @@ -68,7 +135,7 @@ class Plex: res = operations.GetPinResponse(status_code=http_res.status_code, content_type=http_res.headers.get('Content-Type') or '', raw_response=http_res) - if http_res.status_code == 200: + if http_res.status_code == 201: # pylint: disable=no-else-return if utils.match_content_type(http_res.headers.get('Content-Type') or '', 'application/json'): out = utils.unmarshal_json(http_res.text, Optional[operations.GetPinResponseBody]) @@ -147,7 +214,13 @@ class Plex: res = operations.GetTokenResponse(status_code=http_res.status_code, content_type=http_res.headers.get('Content-Type') or '', raw_response=http_res) if http_res.status_code == 200: - pass + # pylint: disable=no-else-return + if utils.match_content_type(http_res.headers.get('Content-Type') or '', 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[operations.GetTokenResponseBody]) + res.object = out + else: + content_type = http_res.headers.get('Content-Type') + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) elif http_res.status_code == 400: # pylint: disable=no-else-return if utils.match_content_type(http_res.headers.get('Content-Type') or '', 'application/json'): diff --git a/src/plex_api/sdk.py b/src/plex_api/sdk.py index ed51dd8..614e9d5 100644 --- a/src/plex_api/sdk.py +++ b/src/plex_api/sdk.py @@ -18,6 +18,7 @@ from .statistics import Statistics from .updater import Updater from .utils.retries import RetryConfig from .video import Video +from .watchlist import Watchlist from plex_api import utils from plex_api._hooks import SDKHooks from plex_api.models import components, internal @@ -44,6 +45,8 @@ class PlexAPI: """ butler: Butler r"""Butler is the task manager of the Plex Media Server Ecosystem.""" + plex: Plex + r"""API Calls that perform operations directly against https://Plex.tv""" hubs: Hubs r"""Hubs are a structured two-dimensional container for media, generally represented by multiple horizontal rows.""" search: Search @@ -52,8 +55,6 @@ class PlexAPI: r"""API Calls interacting with Plex Media Server Libraries""" log: Log r"""Submit logs to the Log Handler for Plex Media Server""" - plex: Plex - r"""API Calls that perform operations directly against https://Plex.tv""" playlists: Playlists r"""Playlists are ordered collections of media. They can be dumb (just a list of media) or smart (based on a media query, such as \\"all albums from 2017\\"). They can be organized in (optionally nesting) folders. @@ -70,6 +71,8 @@ class PlexAPI: r"""This describes the API for searching and applying updates to the Plex Media Server. Updates to the status can be observed via the Event API. """ + watchlist: Watchlist + r"""API Calls that perform operations with Plex Media Server Watchlists""" sdk_configuration: SDKConfiguration @@ -161,13 +164,14 @@ class PlexAPI: self.video = Video(self.sdk_configuration) self.activities = Activities(self.sdk_configuration) self.butler = Butler(self.sdk_configuration) + self.plex = Plex(self.sdk_configuration) self.hubs = Hubs(self.sdk_configuration) self.search = Search(self.sdk_configuration) self.library = Library(self.sdk_configuration) self.log = Log(self.sdk_configuration) - self.plex = Plex(self.sdk_configuration) self.playlists = Playlists(self.sdk_configuration) self.authentication = Authentication(self.sdk_configuration) self.statistics = Statistics(self.sdk_configuration) self.sessions = Sessions(self.sdk_configuration) self.updater = Updater(self.sdk_configuration) + self.watchlist = Watchlist(self.sdk_configuration) diff --git a/src/plex_api/sdkconfiguration.py b/src/plex_api/sdkconfiguration.py index 345bc07..14e57a2 100644 --- a/src/plex_api/sdkconfiguration.py +++ b/src/plex_api/sdkconfiguration.py @@ -34,9 +34,9 @@ class SDKConfiguration: server_defaults: List[Dict[str, str]] = field(default_factory=List) language: str = 'python' openapi_doc_version: str = '0.0.3' - sdk_version: str = '0.8.2' - gen_version: str = '2.342.2' - user_agent: str = 'speakeasy-sdk/python 0.8.2 2.342.2 0.0.3 plex-api-client' + sdk_version: str = '0.9.0' + gen_version: str = '2.342.6' + user_agent: str = 'speakeasy-sdk/python 0.9.0 2.342.6 0.0.3 plex-api-client' retry_config: Optional[RetryConfig] = None def __post_init__(self): diff --git a/src/plex_api/watchlist.py b/src/plex_api/watchlist.py new file mode 100644 index 0000000..06a6e8a --- /dev/null +++ b/src/plex_api/watchlist.py @@ -0,0 +1,88 @@ +"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.""" + +import requests as requests_http +from .sdkconfiguration import SDKConfiguration +from plex_api import utils +from plex_api._hooks import AfterErrorContext, AfterSuccessContext, BeforeRequestContext, HookContext +from plex_api.models import errors, operations +from typing import Optional + +class Watchlist: + r"""API Calls that perform operations with Plex Media Server Watchlists""" + sdk_configuration: SDKConfiguration + + def __init__(self, sdk_config: SDKConfiguration) -> None: + self.sdk_configuration = sdk_config + + + + def get_watchlist(self, request: operations.GetWatchlistRequest, server_url: Optional[str] = None) -> operations.GetWatchlistResponse: + r"""Get User Watchlist + Get User Watchlist + """ + hook_ctx = HookContext(operation_id='getWatchlist', oauth2_scopes=[], security_source=self.sdk_configuration.security) + base_url = utils.template_url(operations.GET_WATCHLIST_SERVERS[0], { + }) + if server_url is not None: + base_url = server_url + + url = utils.generate_url(base_url, '/library/sections/watchlist/{filter}', request) + + if callable(self.sdk_configuration.security): + headers, query_params = utils.get_security(self.sdk_configuration.security()) + else: + headers, query_params = utils.get_security(self.sdk_configuration.security) + + query_params = { **utils.get_query_params(request), **query_params } + headers['Accept'] = 'application/json' + headers['user-agent'] = self.sdk_configuration.user_agent + client = self.sdk_configuration.client + + try: + req = client.prepare_request(requests_http.Request('GET', url, params=query_params, headers=headers)) + req = self.sdk_configuration.get_hooks().before_request(BeforeRequestContext(hook_ctx), req) + http_res = client.send(req) + except Exception as e: + _, e = self.sdk_configuration.get_hooks().after_error(AfterErrorContext(hook_ctx), None, e) + if e is not None: + raise e + + if utils.match_status_codes(['400','401','4XX','5XX'], http_res.status_code): + result, e = self.sdk_configuration.get_hooks().after_error(AfterErrorContext(hook_ctx), http_res, None) + if e is not None: + raise e + if result is not None: + http_res = result + else: + http_res = self.sdk_configuration.get_hooks().after_success(AfterSuccessContext(hook_ctx), http_res) + + + + res = operations.GetWatchlistResponse(status_code=http_res.status_code, content_type=http_res.headers.get('Content-Type') or '', raw_response=http_res) + + if http_res.status_code == 200: + # pylint: disable=no-else-return + if utils.match_content_type(http_res.headers.get('Content-Type') or '', 'application/json'): + out = utils.unmarshal_json(http_res.text, Optional[operations.GetWatchlistResponseBody]) + res.object = out + else: + content_type = http_res.headers.get('Content-Type') + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + elif http_res.status_code == 400 or http_res.status_code >= 400 and http_res.status_code < 500 or http_res.status_code >= 500 and http_res.status_code < 600: + raise errors.SDKError('API error occurred', http_res.status_code, http_res.text, http_res) + elif http_res.status_code == 401: + # pylint: disable=no-else-return + if utils.match_content_type(http_res.headers.get('Content-Type') or '', 'application/json'): + out = utils.unmarshal_json(http_res.text, errors.GetWatchlistResponseBody) + out.raw_response = http_res + raise out + else: + content_type = http_res.headers.get('Content-Type') + raise errors.SDKError(f'unknown content-type received: {content_type}', http_res.status_code, http_res.text, http_res) + else: + raise errors.SDKError('unknown status code received', http_res.status_code, http_res.text, http_res) + + return res + + +