diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 8d24cad..36b4786 100755 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: dfa99515-01c0-42eb-9be5-ee212fd03eb3 management: - docChecksum: e95c0e17d3e268dcd18d26ac8d0bfc98 + docChecksum: 40b5081b26bc3736b1710ebbcc9a05b7 docVersion: 1.1.1 - speakeasyVersion: 1.656.1 - generationVersion: 2.753.1 - releaseVersion: 0.27.0 - configChecksum: 992bac138343fa32eddfed9ebe4d6270 + speakeasyVersion: 1.665.0 + generationVersion: 2.767.2 + releaseVersion: 0.28.0 + configChecksum: 1c367123fc57732eb8844136eb629bf2 repoURL: https://github.com/LukeHagar/plexgo.git repoSubDirectory: . installationURL: https://github.com/LukeHagar/plexgo @@ -17,11 +17,14 @@ features: additionalDependencies: 0.1.0 additionalProperties: 0.1.2 constsAndDefaults: 0.1.12 - core: 3.13.2 + core: 3.13.5 deepObjectParams: 0.1.1 defaultEnabledRetries: 0.2.0 + deprecations: 2.81.3 downloadStreams: 0.1.2 + enums: 2.82.0 envVarSecurityUsage: 0.3.2 + errors: 2.83.0 examples: 2.81.5 globalSecurity: 2.82.12 globalSecurityCallbacks: 0.1.0 @@ -29,11 +32,14 @@ features: globalServerURLs: 2.83.0 globals: 2.82.2 intellisenseMarkdownSupport: 0.1.0 + methodServerURLs: 2.82.1 nameOverrides: 2.81.2 + nullables: 0.2.1 + openEnums: 0.1.0 responseFormat: 0.1.2 retries: 2.84.2 - sdkHooks: 0.2.0 - unions: 2.87.1 + sdkHooks: 0.3.0 + unions: 2.87.2 uploadStreams: 0.1.0 generatedFiles: - .gitattributes @@ -72,9 +78,12 @@ generatedFiles: - /models/components/mediagraboperation.go - /models/components/mediaquery.go - /models/components/mediasubscription.go + - /models/components/mediatype.go + - /models/components/mediatypestring.go - /models/components/metadata.go - /models/components/part.go - /models/components/player.go + - /models/components/plexdevice.go - /models/components/postresponses200.go - /models/components/protocol.go - /models/components/security.go @@ -88,6 +97,8 @@ generatedFiles: - /models/components/transcodesession.go - /models/components/transcodetype.go - /models/components/user.go + - /models/components/userplexaccount.go + - /models/components/userprofile.go - /models/operations/addcollectionitems.go - /models/operations/adddevice.go - /models/operations/adddevicetodvr.go @@ -225,6 +236,7 @@ generatedFiles: - /models/operations/getsections.go - /models/operations/getsectionsprefs.go - /models/operations/getserverinfo.go + - /models/operations/getserverresources.go - /models/operations/getsessionplaylistindex.go - /models/operations/getsessions.go - /models/operations/getsessionsegment.go @@ -239,8 +251,10 @@ generatedFiles: - /models/operations/gettasks.go - /models/operations/gettemplate.go - /models/operations/getthumb.go + - /models/operations/gettokendetails.go - /models/operations/gettransienttoken.go - /models/operations/getupdatesstatus.go + - /models/operations/getusers.go - /models/operations/ingesttransientitem.go - /models/operations/listactivities.go - /models/operations/listcontent.go @@ -270,6 +284,7 @@ generatedFiles: - /models/operations/moveplaylistitem.go - /models/operations/moveplayqueueitem.go - /models/operations/optimizedatabase.go + - /models/operations/postuserssignindata.go - /models/operations/processsubscriptions.go - /models/operations/refreshitemsmetadata.go - /models/operations/refreshplaylist.go @@ -325,8 +340,13 @@ generatedFiles: - /models/operations/voicesearchhubs.go - /models/operations/writelog.go - /models/operations/writemessage.go + - /models/sdkerrors/getserverresources.go + - /models/sdkerrors/gettokendetails.go + - /models/sdkerrors/getusers.go + - /models/sdkerrors/postuserssignindata.go - USAGE.md - activities.go + - authentication.go - butler.go - collections.go - content.go @@ -334,15 +354,20 @@ generatedFiles: - docs/models/components/accepts.md - docs/models/components/advancedsubtitles.md - docs/models/components/airingstype.md + - docs/models/components/autoselectsubtitle.md - docs/models/components/boolint.md - docs/models/components/channel.md - docs/models/components/channelmapping.md - docs/models/components/composite.md - docs/models/components/compositemedia.md + - docs/models/components/connections.md - docs/models/components/crop.md - docs/models/components/decision.md - docs/models/components/default.md + - docs/models/components/defaultaudioaccessibility.md - docs/models/components/defaultdirection.md + - docs/models/components/defaultsubtitleaccessibility.md + - docs/models/components/defaultsubtitleforced.md - docs/models/components/device.md - docs/models/components/directory.md - docs/models/components/dvr.md @@ -355,6 +380,7 @@ generatedFiles: - docs/models/components/getresponses200.md - docs/models/components/getresponses200hub.md - docs/models/components/getresponses200mediacontainer.md + - docs/models/components/guids.md - docs/models/components/historyallgetresponses200.md - docs/models/components/historyallgetresponses200mediacontainer.md - docs/models/components/historyallgetresponses200metadata.md @@ -363,6 +389,7 @@ generatedFiles: - docs/models/components/image.md - docs/models/components/imagetype.md - docs/models/components/items.md + - docs/models/components/itemsguids.md - docs/models/components/librarysection.md - docs/models/components/librarysectionlocation.md - docs/models/components/librarysections.md @@ -371,6 +398,7 @@ generatedFiles: - docs/models/components/lineup.md - docs/models/components/lineuptype.md - docs/models/components/location.md + - docs/models/components/mailingliststatus.md - docs/models/components/media.md - docs/models/components/mediacontainer.md - docs/models/components/mediacontainerwithartwork.md @@ -379,6 +407,7 @@ generatedFiles: - docs/models/components/mediacontainerwithartworktype.md - docs/models/components/mediacontainerwithdecision.md - docs/models/components/mediacontainerwithdecisiondecision.md + - docs/models/components/mediacontainerwithdecisionguids.md - docs/models/components/mediacontainerwithdecisionlocation.md - docs/models/components/mediacontainerwithdecisionmedia.md - docs/models/components/mediacontainerwithdecisionmediacontainer.md @@ -397,8 +426,10 @@ generatedFiles: - docs/models/components/mediacontainerwithmetadata.md - docs/models/components/mediacontainerwithmetadatamediacontainer.md - docs/models/components/mediacontainerwithnestedmetadata.md + - docs/models/components/mediacontainerwithnestedmetadataguids.md - docs/models/components/mediacontainerwithnestedmetadatamediacontainer.md - docs/models/components/mediacontainerwithplaylistmetadata.md + - docs/models/components/mediacontainerwithplaylistmetadataguids.md - docs/models/components/mediacontainerwithplaylistmetadatamediacontainer.md - docs/models/components/mediacontainerwithplaylistmetadatametadata.md - docs/models/components/mediacontainerwithsettings.md @@ -407,19 +438,25 @@ generatedFiles: - docs/models/components/mediacontainerwithsubscriptionmediacontainer.md - docs/models/components/mediagraboperation.md - docs/models/components/mediaquery.md + - docs/models/components/mediareviewsvisibility.md - docs/models/components/mediasubscription.md + - docs/models/components/mediatype.md + - docs/models/components/mediatypestring.md - docs/models/components/metadata.md - docs/models/components/metadataitem.md - docs/models/components/part.md - docs/models/components/pivot.md - docs/models/components/player.md - docs/models/components/playlisttype.md + - docs/models/components/plexdevice.md + - docs/models/components/plexdeviceprotocol.md - docs/models/components/postresponses200.md - docs/models/components/postresponses200mediacontainer.md - docs/models/components/postresponses200type.md - docs/models/components/protocol.md - docs/models/components/recommendationsvisibility.md - docs/models/components/security.md + - docs/models/components/services.md - docs/models/components/session.md - docs/models/components/sessionlocation.md - docs/models/components/setting.md @@ -430,13 +467,21 @@ generatedFiles: - docs/models/components/sortpivot.md - docs/models/components/status.md - docs/models/components/stream.md + - docs/models/components/subscription.md - docs/models/components/subtitles.md - docs/models/components/tag.md - docs/models/components/transcodesession.md - docs/models/components/transcodetype.md - docs/models/components/type.md - docs/models/components/user.md + - docs/models/components/userplexaccount.md + - docs/models/components/userplexaccountstatus.md + - docs/models/components/userplexaccountsubscription.md + - docs/models/components/userplexaccountsubscriptionsstatus.md + - docs/models/components/userplexaccountsubscriptionstatus.md + - docs/models/components/userprofile.md - docs/models/components/value.md + - docs/models/components/watchedindicator.md - docs/models/operations/account.md - docs/models/operations/action.md - docs/models/operations/activity.md @@ -485,6 +530,12 @@ generatedFiles: - docs/models/operations/addtoplayqueuerequest.md - docs/models/operations/addtoplayqueueresponse.md - docs/models/operations/advancedsubtitles.md + - docs/models/operations/alllibraries.md + - docs/models/operations/allowcameraupload.md + - docs/models/operations/allowchannels.md + - docs/models/operations/allowsubtitleadmin.md + - docs/models/operations/allowsync.md + - docs/models/operations/allowtuners.md - docs/models/operations/analyzemetadataglobals.md - docs/models/operations/analyzemetadatarequest.md - docs/models/operations/analyzemetadataresponse.md @@ -498,6 +549,7 @@ generatedFiles: - docs/models/operations/autocompleteresponse.md - docs/models/operations/bandwidth.md - docs/models/operations/bandwidths.md + - docs/models/operations/billing.md - docs/models/operations/butlertask.md - docs/models/operations/butlertasks.md - docs/models/operations/cancelactivityglobals.md @@ -542,6 +594,7 @@ generatedFiles: - docs/models/operations/createdownloadqueuemediacontainer.md - docs/models/operations/createdownloadqueueresponse.md - docs/models/operations/createdownloadqueueresponsebody.md + - docs/models/operations/createdownloadqueuestatus.md - docs/models/operations/createdvrglobals.md - docs/models/operations/createdvrrequest.md - docs/models/operations/createdvrresponse.md @@ -885,6 +938,7 @@ generatedFiles: - docs/models/operations/getplaylistgeneratorglobals.md - docs/models/operations/getplaylistgeneratoritem.md - docs/models/operations/getplaylistgeneratoritemsglobals.md + - docs/models/operations/getplaylistgeneratoritemsguids.md - docs/models/operations/getplaylistgeneratoritemsmediacontainer.md - docs/models/operations/getplaylistgeneratoritemsmetadata.md - docs/models/operations/getplaylistgeneratoritemsrequest.md @@ -966,6 +1020,9 @@ generatedFiles: - docs/models/operations/getserverinfoglobals.md - docs/models/operations/getserverinforequest.md - docs/models/operations/getserverinforesponse.md + - docs/models/operations/getserverresourcesglobals.md + - docs/models/operations/getserverresourcesrequest.md + - docs/models/operations/getserverresourcesresponse.md - docs/models/operations/getsessionplaylistindexglobals.md - docs/models/operations/getsessionplaylistindexrequest.md - docs/models/operations/getsessionplaylistindexresponse.md @@ -1004,6 +1061,7 @@ generatedFiles: - docs/models/operations/gettagsrequest.md - docs/models/operations/gettagsresponse.md - docs/models/operations/gettagsresponsebody.md + - docs/models/operations/gettasksbutlertask.md - docs/models/operations/gettasksresponse.md - docs/models/operations/gettasksresponsebody.md - docs/models/operations/gettemplateglobals.md @@ -1014,6 +1072,9 @@ generatedFiles: - docs/models/operations/getthumbglobals.md - docs/models/operations/getthumbrequest.md - docs/models/operations/getthumbresponse.md + - docs/models/operations/gettokendetailsglobals.md + - docs/models/operations/gettokendetailsrequest.md + - docs/models/operations/gettokendetailsresponse.md - docs/models/operations/gettransienttokenglobals.md - docs/models/operations/gettransienttokenmediacontainer.md - docs/models/operations/gettransienttokenrequest.md @@ -1023,13 +1084,24 @@ generatedFiles: - docs/models/operations/getupdatesstatusresponse.md - docs/models/operations/getupdatesstatusresponsebody.md - docs/models/operations/getupdatesstatusstate.md + - docs/models/operations/getusersglobals.md + - docs/models/operations/getusersmediacontainer.md + - docs/models/operations/getusersrequest.md + - docs/models/operations/getusersresponse.md + - docs/models/operations/getusersresponsebody.md + - docs/models/operations/guids.md - docs/models/operations/hints.md + - docs/models/operations/home.md - docs/models/operations/homevisibility.md - docs/models/operations/hub.md + - docs/models/operations/includehttps.md + - docs/models/operations/includeipv6.md + - docs/models/operations/includerelay.md - docs/models/operations/index.md - docs/models/operations/ingesttransientitemglobals.md - docs/models/operations/ingesttransientitemrequest.md - docs/models/operations/ingesttransientitemresponse.md + - docs/models/operations/internalpaymentmethod.md - docs/models/operations/item.md - docs/models/operations/language.md - docs/models/operations/level.md @@ -1096,6 +1168,7 @@ generatedFiles: - docs/models/operations/listtopusersresponse.md - docs/models/operations/listtopusersresponsebody.md - docs/models/operations/location.md + - docs/models/operations/mailingliststatus.md - docs/models/operations/makedecisionglobals.md - docs/models/operations/makedecisionrequest.md - docs/models/operations/makedecisionresponse.md @@ -1138,17 +1211,30 @@ generatedFiles: - docs/models/operations/optimizedatabaserequest.md - docs/models/operations/optimizedatabaseresponse.md - docs/models/operations/option.md + - docs/models/operations/owned.md - docs/models/operations/params.md + - docs/models/operations/pastsubscription.md + - docs/models/operations/pathparambutlertask.md - docs/models/operations/pathparamelement.md - docs/models/operations/pathparamindex.md - - docs/models/operations/pathparamtask.md + - docs/models/operations/pending.md - docs/models/operations/playlisttype.md - docs/models/operations/playqueuegenerator.md - docs/models/operations/policy.md + - docs/models/operations/postuserssignindataauthenticationstatus.md + - docs/models/operations/postuserssignindataglobals.md + - docs/models/operations/postuserssignindatarequest.md + - docs/models/operations/postuserssignindatarequestbody.md + - docs/models/operations/postuserssignindataresponse.md + - docs/models/operations/postuserssignindatastate.md + - docs/models/operations/postuserssignindatastatus.md + - docs/models/operations/postuserssignindatasubscription.md + - docs/models/operations/postuserssignindatauserplexaccount.md - docs/models/operations/prefs.md - docs/models/operations/processingstate.md - docs/models/operations/processingstatecontext.md - docs/models/operations/processsubscriptionsresponse.md + - docs/models/operations/protected.md - docs/models/operations/protocol.md - docs/models/operations/queryparamargs.md - docs/models/operations/queryparamattributes.md @@ -1207,6 +1293,7 @@ generatedFiles: - docs/models/operations/restartprocessingdownloadqueueitemsglobals.md - docs/models/operations/restartprocessingdownloadqueueitemsrequest.md - docs/models/operations/restartprocessingdownloadqueueitemsresponse.md + - docs/models/operations/restricted.md - docs/models/operations/scanglobals.md - docs/models/operations/scanrequest.md - docs/models/operations/scanresponse.md @@ -1216,6 +1303,8 @@ generatedFiles: - docs/models/operations/searchhubsrequest.md - docs/models/operations/searchhubsresponse.md - docs/models/operations/searchhubsresponsebody.md + - docs/models/operations/server.md + - docs/models/operations/services.md - docs/models/operations/setchannelmapglobals.md - docs/models/operations/setchannelmaprequest.md - docs/models/operations/setchannelmapresponse.md @@ -1286,9 +1375,9 @@ generatedFiles: - docs/models/operations/stoptaskrequest.md - docs/models/operations/stoptaskresponse.md - docs/models/operations/stoptasksresponse.md + - docs/models/operations/subscription.md - docs/models/operations/subscriptiontemplate.md - docs/models/operations/subtitles.md - - docs/models/operations/task.md - docs/models/operations/terminatesessionglobals.md - docs/models/operations/terminatesessionrequest.md - docs/models/operations/terminatesessionresponse.md @@ -1300,6 +1389,7 @@ generatedFiles: - docs/models/operations/transcodesubtitlesglobals.md - docs/models/operations/transcodesubtitlesrequest.md - docs/models/operations/transcodesubtitlesresponse.md + - docs/models/operations/trials.md - docs/models/operations/triggerfallbackglobals.md - docs/models/operations/triggerfallbackrequest.md - docs/models/operations/triggerfallbackresponse.md @@ -1332,6 +1422,7 @@ generatedFiles: - docs/models/operations/uploadplaylistglobals.md - docs/models/operations/uploadplaylistrequest.md - docs/models/operations/uploadplaylistresponse.md + - docs/models/operations/user.md - docs/models/operations/voicesearchhubsglobals.md - docs/models/operations/voicesearchhubsmediacontainer.md - docs/models/operations/voicesearchhubsrequest.md @@ -1341,7 +1432,22 @@ generatedFiles: - docs/models/operations/writemessageglobals.md - docs/models/operations/writemessagerequest.md - docs/models/operations/writemessageresponse.md + - docs/models/sdkerrors/errors.md + - docs/models/sdkerrors/getserverresourceserrors.md + - docs/models/sdkerrors/getserverresourcesunauthorized.md + - docs/models/sdkerrors/gettokendetailsbadrequest.md + - docs/models/sdkerrors/gettokendetailserrors.md + - docs/models/sdkerrors/gettokendetailsunauthorized.md + - docs/models/sdkerrors/getusersbadrequest.md + - docs/models/sdkerrors/getuserserrors.md + - docs/models/sdkerrors/getusersunauthorized.md + - docs/models/sdkerrors/getusersuserserrors.md + - docs/models/sdkerrors/postuserssignindataauthenticationerrors.md + - docs/models/sdkerrors/postuserssignindatabadrequest.md + - docs/models/sdkerrors/postuserssignindataerrors.md + - docs/models/sdkerrors/postuserssignindataunauthorized.md - docs/sdks/activities/README.md + - docs/sdks/authentication/README.md - docs/sdks/butler/README.md - docs/sdks/collections/README.md - docs/sdks/content/README.md @@ -1359,6 +1465,7 @@ generatedFiles: - docs/sdks/log/README.md - docs/sdks/playlist/README.md - docs/sdks/playqueue/README.md + - docs/sdks/plex/README.md - docs/sdks/preferences/README.md - docs/sdks/provider/README.md - docs/sdks/rate/README.md @@ -1369,6 +1476,8 @@ generatedFiles: - docs/sdks/transcoder/README.md - docs/sdks/ultrablur/README.md - docs/sdks/updater/README.md + - docs/sdks/users/README.md + - docs/types/date.md - downloadqueue.go - dvrs.go - epg.go @@ -1401,6 +1510,7 @@ generatedFiles: - optionalnullable/optionalnullable_test.go - playlist.go - playqueue.go + - plex.go - plexapi.go - preferences.go - provider.go @@ -1417,6 +1527,7 @@ generatedFiles: - types/pointers.go - ultrablur.go - updater.go + - users.go examples: getServerCapabilities: speakeasy-default-get-server-capabilities: @@ -1744,6 +1855,7 @@ examples: path: taskName: "RefreshPeriodicMetadata" task: "RefreshLocalMedia" + butlerTask: "RefreshLocalMedia" header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -1767,6 +1879,7 @@ examples: path: taskName: "CleanOldCacheFiles" task: "CleanOldBundles" + butlerTask: "CleanOldBundles" header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -1843,7 +1956,8 @@ examples: includeRelay: 1 includeIPv6: 1 header: - X-Plex-Client-Identifier: "3381b62b-9ab7-4e37-827b-203e9809eb58" + X-Plex-Client-Identifier: "abc123" + accepts: "application/xml" responses: "200": application/json: [{"name": "", "product": "Ergonomic Plastic Hat", "productVersion": "", "platform": "", "platformVersion": "", "device": "Mobile", "clientIdentifier": "", "createdAt": "2019-06-24T11:38:02Z", "lastSeenAt": "2019-06-24T11:38:02Z", "provides": "", "ownerId": null, "sourceTitle": "", "publicAddress": "", "accessToken": "", "owned": true, "home": false, "synced": false, "relay": true, "presence": false, "httpsRequired": true, "publicAddressMatches": false, "dnsRebindingProtection": true, "natLoopbackSupported": false, "connections": [{"protocol": "http", "address": "5746 Mount Street", "port": 441996, "uri": "https://wide-kick.name/", "local": false, "relay": true, "IPv6": true}]}] @@ -2359,7 +2473,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"composite": "/playlists/96/composite/1705724593", "duration": 141000, "key": "/playlists/96/items", "leafCount": 1, "playlistType": "video", "smart": false, "title": "A Great Playlist", "type": "playlist", "addedAt": 1705719589, "lastViewedAt": 1705719589, "ratingKey": "96", "summary": "What a great playlist", "updatedAt": 1705724593, "viewCount": 1, "guid": "com.plexapp.agents.none://a2f92937-1408-40e2-b022-63a8a9377e55", "icon": "playlist://image.smart"}]}} + application/json: {"MediaContainer": {"Metadata": [{"composite": "/playlists/96/composite/1705724593", "duration": 141000, "key": "/playlists/96/items", "leafCount": 1, "playlistType": "video", "smart": false, "title": "A Great Playlist", "type": "playlist", "addedAt": 1705719589, "guid": "com.plexapp.agents.none://a2f92937-1408-40e2-b022-63a8a9377e55", "lastViewedAt": 1705719589, "ratingKey": "96", "summary": "What a great playlist", "updatedAt": 1705724593, "viewCount": 1, "icon": "playlist://image.smart"}]}} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": @@ -2393,7 +2507,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"composite": "/playlists/95/composite/1705717387", "duration": 282000, "key": "/playlists/95/items", "leafCount": 2, "playlistType": "video", "smart": true, "title": "Smart Movie Playlist", "type": "playlist", "addedAt": 1705716493, "ratingKey": "95", "summary": "", "updatedAt": 1705717387, "content": "library://x/directory/%2Flibrary%2Fsections%2F1%2Fall%3Ftype%3D1%26push%3D1%26title%3D2%26or%3D1%26title%3DSerenity%26pop%3D1", "guid": "com.plexapp.agents.none://87425529-380f-44b8-a689-9a0537e7ec91", "icon": "playlist://image.smart"}]}} + application/json: {"MediaContainer": {"Metadata": [{"composite": "/playlists/95/composite/1705717387", "duration": 282000, "key": "/playlists/95/items", "leafCount": 2, "playlistType": "video", "smart": true, "title": "Smart Movie Playlist", "type": "playlist", "addedAt": 1705716493, "guid": "com.plexapp.agents.none://87425529-380f-44b8-a689-9a0537e7ec91", "ratingKey": "95", "summary": "", "updatedAt": 1705717387, "content": "library://x/directory/%2Flibrary%2Fsections%2F1%2Fall%3Ftype%3D1%26push%3D1%26title%3D2%26or%3D1%26title%3DSerenity%26pop%3D1", "icon": "playlist://image.smart"}]}} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": @@ -2559,9 +2673,22 @@ examples: application/json: {} getTokenDetails: speakeasy-default-get-token-details: + parameters: + header: + accepts: "application/xml" + X-Plex-Client-Identifier: "abc123" + X-Plex-Product: "Plex for Roku" + X-Plex-Version: "2.4.1" + X-Plex-Platform: "Roku" + X-Plex-Platform-Version: "4.3 build 1057" + X-Plex-Device: "Roku 3" + X-Plex-Model: "4200X" + X-Plex-Device-Vendor: "Roku" + X-Plex-Device-Name: "Living Room TV" + X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"adsConsent": true, "adsConsentReminderAt": 1556281940, "adsConsentSetAt": 1556281940, "anonymous": false, "authToken": "CxoUzBTSV5hsxjTpFKaf", "backupCodesCreated": false, "confirmed": false, "country": "US", "email": "username@email.com", "emailOnlyAuth": false, "experimentalFeatures": false, "friendlyName": "friendlyUsername", "entitlements": ["[]"], "guest": false, "hasPassword": true, "home": false, "homeAdmin": false, "homeSize": 1, "id": 13692262, "joinedAt": 1556281940, "locale": "it", "mailingListActive": false, "mailingListStatus": "active", "maxHomeSize": 15, "profile": {"autoSelectAudio": true, "defaultAudioLanguage": "ja", "defaultSubtitleLanguage": "en", "autoSelectSubtitle": 1, "defaultSubtitleAccessibility": 1, "defaultSubtitleForced": 1, "watchedIndicator": 1, "mediaReviewsVisibility": 1}, "protected": false, "rememberExpiresAt": 1556281940, "restricted": false, "scrobbleTypes": "", "services": [], "subscription": {"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}, "subscriptionDescription": "", "subscriptions": [{"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}], "thumb": "https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101", "title": "UsernameTitle", "twoFactorEnabled": false, "username": "Username", "uuid": "dae343c1f45beb4f", "attributionPartner": null} + application/json: {"adsConsentReminderAt": 1556281940, "adsConsentSetAt": 1556281940, "anonymous": false, "authToken": "CxoUzBTSV5hsxjTpFKaf", "backupCodesCreated": false, "confirmed": false, "country": "US", "email": "username@email.com", "emailOnlyAuth": false, "experimentalFeatures": false, "friendlyName": "friendlyUsername", "entitlements": [], "guest": false, "hasPassword": true, "home": false, "homeAdmin": false, "homeSize": 1, "id": 13692262, "joinedAt": 1556281940, "mailingListActive": false, "mailingListStatus": "active", "maxHomeSize": 15, "profile": {"autoSelectAudio": true, "defaultAudioLanguage": "ja", "defaultAudioAccessibility": 0, "defaultAudioLanguages": null, "defaultSubtitleLanguage": "en", "defaultSubtitleLanguages": null, "autoSelectSubtitle": 1, "defaultSubtitleAccessibility": 1, "defaultSubtitleForced": 1, "watchedIndicator": 1, "mediaReviewsVisibility": 1, "mediaReviewsLanguages": null}, "protected": false, "rememberExpiresAt": 1556281940, "restricted": false, "services": [], "subscription": {"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}, "subscriptions": [{"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}], "thumb": "https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101", "title": "UsernameTitle", "twoFactorEnabled": false, "username": "Username", "uuid": "dae343c1f45beb4f", "attributionPartner": null} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": @@ -2587,16 +2714,22 @@ examples: speakeasy-default-post-users-sign-in-data: parameters: header: - X-Plex-Client-Identifier: "3381b62b-9ab7-4e37-827b-203e9809eb58" + X-Plex-Client-Identifier: "abc123" X-Plex-Product: "Plex for Roku" X-Plex-Device: "Roku 3" X-Plex-Version: "2.4.1" X-Plex-Platform: "Roku" + accepts: "application/xml" + X-Plex-Platform-Version: "4.3 build 1057" + X-Plex-Model: "4200X" + X-Plex-Device-Vendor: "Roku" + X-Plex-Device-Name: "Living Room TV" + X-Plex-Marketplace: "googlePlay" requestBody: application/x-www-form-urlencoded: {"login": "username@email.com", "password": "password123", "rememberMe": false, "verificationCode": "123456"} responses: "201": - application/json: {"adsConsent": null, "adsConsentReminderAt": 1556281940, "adsConsentSetAt": 1556281940, "anonymous": false, "authToken": "CxoUzBTSV5hsxjTpFKaf", "backupCodesCreated": false, "confirmed": false, "country": "US", "email": "username@email.com", "emailOnlyAuth": false, "experimentalFeatures": false, "friendlyName": "friendlyUsername", "entitlements": ["[]"], "guest": false, "hasPassword": true, "home": false, "homeAdmin": false, "homeSize": 1, "id": 13692262, "joinedAt": 1556281940, "locale": "ru", "mailingListActive": false, "mailingListStatus": "active", "maxHomeSize": 15, "profile": {"autoSelectAudio": true, "defaultAudioLanguage": "ja", "defaultSubtitleLanguage": "en", "autoSelectSubtitle": 1, "defaultSubtitleAccessibility": 1, "defaultSubtitleForced": 1, "watchedIndicator": 1, "mediaReviewsVisibility": 1}, "protected": false, "rememberExpiresAt": 1556281940, "restricted": false, "scrobbleTypes": "", "services": [], "subscription": {"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}, "subscriptionDescription": "", "subscriptions": [{"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}], "thumb": "https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101", "title": "UsernameTitle", "twoFactorEnabled": false, "username": "Username", "uuid": "dae343c1f45beb4f", "attributionPartner": null, "pastSubscriptions": [], "trials": []} + application/json: {"adsConsentReminderAt": 1556281940, "adsConsentSetAt": 1556281940, "anonymous": false, "authToken": "CxoUzBTSV5hsxjTpFKaf", "backupCodesCreated": false, "confirmed": false, "country": "US", "email": "username@email.com", "emailOnlyAuth": false, "experimentalFeatures": false, "friendlyName": "friendlyUsername", "entitlements": [], "guest": false, "hasPassword": true, "home": false, "homeAdmin": false, "homeSize": 1, "id": 13692262, "joinedAt": 1556281940, "mailingListActive": false, "mailingListStatus": "active", "maxHomeSize": 15, "profile": {"autoSelectAudio": true, "defaultAudioLanguage": "ja", "defaultAudioAccessibility": 0, "defaultAudioLanguages": null, "defaultSubtitleLanguage": "en", "defaultSubtitleLanguages": null, "autoSelectSubtitle": 1, "defaultSubtitleAccessibility": 1, "defaultSubtitleForced": 1, "watchedIndicator": 1, "mediaReviewsVisibility": 1, "mediaReviewsLanguages": null}, "protected": false, "rememberExpiresAt": 1556281940, "restricted": false, "services": [], "subscription": {"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}, "subscriptions": [{"active": true, "subscribedAt": "2021-04-12T18:21:12Z", "status": "Inactive"}], "thumb": "https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101", "title": "UsernameTitle", "twoFactorEnabled": false, "username": "Username", "uuid": "dae343c1f45beb4f", "attributionPartner": null, "pastSubscriptions": [], "trials": []} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": @@ -2674,7 +2807,7 @@ examples: speakeasy-default-get-sessions: responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"title": "The American Dream Is Killing Me", "type": "track", "addedAt": 1705543312, "art": "/library/metadata/39904/art/1705310687", "duration": 186240, "grandparentArt": "/library/metadata/39904/art/1705310687", "grandparentKey": "/library/metadata/39904", "grandparentRatingKey": "39904", "grandparentThumb": "/library/metadata/39904/thumb/1705310687", "grandparentTitle": "Green Day", "index": 1, "key": "/library/metadata/67085", "Media": [{"audioChannels": 2, "audioCodec": "flac", "bitrate": 1014, "container": "flac", "duration": 186240, "id": 130355, "Part": [{"container": "flac", "duration": 186240, "file": "/music/Green Day/Saviors (2024)/Green Day - Saviors - 01 - The American Dream Is Killing Me.flac", "id": 130625, "key": "/library/parts/130625/1705543268/file.flac", "size": 23644000, "Stream": [{"audioChannelLayout": "stereo", "bitDepth": 16, "bitrate": 1014, "codec": "flac", "displayTitle": "FLAC (Stereo)", "id": 352487, "index": 0, "samplingRate": 44100, "selected": true, "streamType": 2, "albumGain": "-12.94", "albumPeak": "1.000000", "albumRange": "4.751014", "channels": 2, "extendedDisplayTitle": "FLAC (Stereo)", "gain": "-12.94", "loudness": "-5.94", "lra": "1.74", "peak": "1.000000", "location": "direct"}], "hasThumbnail": "1", "decision": "directplay", "selected": true}], "selected": true}], "originalTitle": "The American Dream Is Killing Me", "parentIndex": 1, "parentKey": "/library/metadata/67084", "parentRatingKey": "67084", "parentThumb": "/library/metadata/67084/thumb/1705543314", "parentTitle": "Saviors", "ratingCount": 45885, "ratingKey": "67085", "thumb": "/library/metadata/67084/thumb/1705543314", "titleSort": "American Dream Is Killing Me", "updatedAt": 1705543314, "viewOffset": 1000, "grandparentGuid": "plex://artist/5d07bbfd403c6402904a6480", "guid": "plex://track/6535834f71f22f36f71a8e8f", "librarySectionID": "3", "librarySectionKey": "/library/sections/3", "librarySectionTitle": "Music", "musicAnalysisVersion": "1", "parentGuid": "plex://album/65394d6d472b8ab03ef47f12", "parentStudio": "Reprise Records", "parentYear": 2024, "sessionKey": "203", "User": {"id": "1", "thumb": "https://plex.tv/users/844780fc6f8a26b5/avatar?c=1705853661", "title": "Blindkitty38"}, "Player": {"address": "10.10.10.171", "machineIdentifier": "3tsdzir85m2onc3qyr255aq1", "model": "standalone", "platform": "windows", "platformVersion": "10.0.22621", "product": "Plex for Windows", "profile": "Plex Desktop", "remotePublicAddress": "68.248.140.20", "state": "playing", "title": "DESKTOP-BL80MTD", "version": "1.85.0.4071-21128b56", "local": true, "relayed": false, "secure": true, "userID": 1}, "Session": {"id": "93h7e00ncblxncqw9lkfaoxi", "bandwidth": 1050, "location": "lan"}}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "The American Dream Is Killing Me", "type": "track", "addedAt": 1705543312, "art": "/library/metadata/39904/art/1705310687", "duration": 186240, "grandparentArt": "/library/metadata/39904/art/1705310687", "grandparentGuid": "plex://artist/5d07bbfd403c6402904a6480", "grandparentKey": "/library/metadata/39904", "grandparentRatingKey": "39904", "grandparentThumb": "/library/metadata/39904/thumb/1705310687", "grandparentTitle": "Green Day", "guid": "plex://track/6535834f71f22f36f71a8e8f", "index": 1, "key": "/library/metadata/67085", "Media": [{"audioChannels": 2, "audioCodec": "flac", "bitrate": 1014, "container": "flac", "duration": 186240, "id": 130355, "Part": [{"container": "flac", "duration": 186240, "file": "/music/Green Day/Saviors (2024)/Green Day - Saviors - 01 - The American Dream Is Killing Me.flac", "id": 130625, "key": "/library/parts/130625/1705543268/file.flac", "size": 23644000, "Stream": [{"audioChannelLayout": "stereo", "channels": 2, "bitDepth": 16, "bitrate": 1014, "codec": "flac", "displayTitle": "FLAC (Stereo)", "extendedDisplayTitle": "FLAC (Stereo)", "id": 352487, "index": 0, "key": "/library/streams/216389", "samplingRate": 44100, "selected": true, "streamType": 1, "albumGain": "-12.94", "albumPeak": "1.000000", "albumRange": "4.751014", "gain": "-12.94", "loudness": "-5.94", "lra": "1.74", "peak": "1.000000", "location": "direct"}], "hasThumbnail": "1", "decision": "directplay", "selected": true}], "selected": true}], "originalTitle": "The American Dream Is Killing Me", "parentGuid": "plex://album/65394d6d472b8ab03ef47f12", "parentIndex": 1, "parentKey": "/library/metadata/67084", "parentRatingKey": "67084", "parentThumb": "/library/metadata/67084/thumb/1705543314", "parentTitle": "Saviors", "ratingCount": 45885, "ratingKey": "67085", "thumb": "/library/metadata/67084/thumb/1705543314", "titleSort": "American Dream Is Killing Me", "updatedAt": 1705543314, "viewOffset": 1000, "librarySectionID": "3", "librarySectionKey": "/library/sections/3", "librarySectionTitle": "Music", "musicAnalysisVersion": "1", "parentStudio": "Reprise Records", "parentYear": 2024, "sessionKey": "203", "User": {"id": "1", "thumb": "https://plex.tv/users/844780fc6f8a26b5/avatar?c=1705853661", "title": "Blindkitty38"}, "Player": {"address": "10.10.10.171", "machineIdentifier": "3tsdzir85m2onc3qyr255aq1", "model": "standalone", "platform": "windows", "platformVersion": "10.0.22621", "product": "Plex for Windows", "profile": "Plex Desktop", "remotePublicAddress": "68.248.140.20", "state": "playing", "title": "DESKTOP-BL80MTD", "version": "1.85.0.4071-21128b56", "local": true, "relayed": false, "secure": true, "userID": 1}, "Session": {"id": "93h7e00ncblxncqw9lkfaoxi", "bandwidth": 1050, "location": "lan"}}]}} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": @@ -2882,10 +3015,10 @@ examples: speakeasy-default-get-users: parameters: header: - X-Plex-Client-Identifier: "3381b62b-9ab7-4e37-827b-203e9809eb58" + X-Plex-Client-Identifier: "abc123" X-Plex-Product: "Plex for Roku" X-Plex-Device: "Roku 3" - X-Plex-Device-Name: "Chrome" + X-Plex-Device-Name: "Living Room TV" X-Plex-Device-Screen-Resolution: "1487x1165,2560x1440" X-Plex-Version: "2.4.1" X-Plex-Platform: "Roku" @@ -2895,9 +3028,13 @@ examples: X-Plex-Language: "en" X-Plex-Platform-Version: "4.3 build 1057" X-Plex-Token: "CV5xoxjTpFKUzBTShsaf" + accepts: "application/xml" + X-Plex-Device-Vendor: "Roku" + X-Plex-Marketplace: "googlePlay" responses: "200": application/xml: "0xfD5052DbD1" + application/json: {"MediaContainer": {"friendlyName": "myPlex", "identifier": "com.plexapp.plugins.myplex", "machineIdentifier": "3dff4c4da3b1229a649aa574a9e2b419a684a20e", "totalSize": 30, "size": 30, "User": [{"id": 22526914, "title": "Plex User", "username": "zgfuc7krcqfimrmb9lsl5j", "email": "zgfuc7krcqfimrmb9lsl5j@protonmail.com", "recommendationsPlaylistId": "", "thumb": "https://plex.tv/users/3346028014e93acd/avatar?c=1731605021", "protected": 1, "home": 1, "allowTuners": 1, "allowSync": 1, "allowCameraUpload": 1, "allowChannels": 1, "allowSubtitleAdmin": 1, "filterAll": "", "filterMovies": "", "filterMusic": "", "filterPhotos": "", "filterTelevision": "", "restricted": 1, "Server": [{"id": 907759180, "serverId": 9999999, "machineIdentifier": "fbb8aa6be6e0c997c6268bc2b4431c8807f70a3", "name": "ConnectedUserFlix", "lastSeenAt": 1556281940, "numLibraries": 16, "allLibraries": 1, "owned": 1, "pending": 1}]}]}} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": @@ -3212,7 +3349,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 231605, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getDownloadQueueMedia: speakeasy-default-get-download-queue-media: parameters: @@ -3307,7 +3444,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 406301, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} getContinueWatching: speakeasy-default-get-continue-watching: parameters: @@ -3325,7 +3462,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 302705, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} getHubItems: speakeasy-default-get-hub-items: parameters: @@ -3363,7 +3500,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 424115, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} getMetadataHubs: speakeasy-default-get-metadata-hubs: parameters: @@ -3385,7 +3522,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 605482, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} getPostplayHubs: speakeasy-default-get-postplay-hubs: parameters: @@ -3407,7 +3544,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 441419, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} getRelatedHubs: speakeasy-default-get-related-hubs: parameters: @@ -3429,7 +3566,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 8858, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} getSectionHubs: speakeasy-default-get-section-hubs: parameters: @@ -3451,7 +3588,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 336924, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} resetSectionDefaults: speakeasy-default-reset-section-defaults: parameters: @@ -3593,12 +3730,13 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 758235, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} voiceSearchHubs: speakeasy-default-voice-search-hubs: parameters: query: query: "" + type: 2 header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -3613,10 +3751,12 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 594971, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} getLibraryItems: speakeasy-default-get-library-items: parameters: + query: + mediaQuery: {"type": 4, "sourceType": 2, "sort": "duration:desc,index"} header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -3631,7 +3771,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 159678, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} deleteCaches: {} cleanBundles: {} ingestTransientItem: @@ -3656,7 +3796,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 82660, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getLibraryMatches: speakeasy-default-get-library-matches: parameters: @@ -3664,6 +3804,7 @@ examples: includeFullMetadata: 1 includeAncestorMetadata: 1 includeAlternateMetadataSources: 1 + type: 2 header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -3678,7 +3819,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 84198, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} optimizeDatabase: speakeasy-default-optimize-database: parameters: @@ -3720,7 +3861,7 @@ examples: speakeasy-default-get-sections: responses: "200": - application/json: {} + application/json: {"MediaContainer": {"Directory": [{"title": "Movies", "type": "movie", "contentChangedAt": 1556281940, "createdAt": 1556281940, "language": "", "uuid": "e69655a2-ef48-4aba-bb19-d3cc3401e7d6", "scannedAt": 1556281940, "updatedAt": 1556281940}]}} addSection: speakeasy-default-add-section: parameters: @@ -3747,7 +3888,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Directory": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Directory": [{"title": "", "type": "", "addedAt": 39544, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} stopAllRefreshes: speakeasy-default-stop-all-refreshes: responses: @@ -3791,6 +3932,8 @@ examples: getTags: speakeasy-default-get-tags: parameters: + query: + type: 2 header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -3878,7 +4021,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 890240, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} analyzeMetadata: speakeasy-default-analyze-metadata: parameters: @@ -3954,7 +4097,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 713455, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} addExtras: speakeasy-default-add-extras: parameters: @@ -4095,7 +4238,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 419882, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} mergeItems: speakeasy-default-merge-items: parameters: @@ -4132,7 +4275,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 51724, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} setItemPreferences: speakeasy-default-set-item-preferences: parameters: @@ -4188,7 +4331,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} + application/json: {"MediaContainer": {"Hub": [{"type": "track", "context": "hub.home.onDeck", "hubIdentifier": "home.onDeck", "key": "/hubs/sections/home/onDeck", "Metadata": [{"title": "", "type": "", "addedAt": 138475, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}], "size": 1, "subtype": "podcast", "totalSize": 8}]}} listSimilar: speakeasy-default-list-similar: parameters: @@ -4208,7 +4351,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 976861, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} splitItem: speakeasy-default-split-item: parameters: @@ -4265,7 +4408,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"MetadataItem": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "MetadataItem": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}]}} + application/json: {"MediaContainer": {"MetadataItem": [{"title": "", "type": "", "addedAt": 440490, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "MetadataItem": [{"title": "", "type": "", "addedAt": 405454, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}]}} unmatch: speakeasy-default-unmatch: parameters: @@ -4400,7 +4543,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 718998, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} deleteLibrarySection: speakeasy-default-delete-library-section: parameters: @@ -4441,7 +4584,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Directory": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Directory": [{"title": "", "type": "", "addedAt": 704505, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} editSection: speakeasy-default-edit-section: parameters: @@ -4504,6 +4647,8 @@ examples: parameters: path: sectionId: 942007 + query: + mediaQuery: {"type": 4, "sourceType": 2, "sort": "duration:desc,index"} header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -4518,12 +4663,14 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 942007, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getCollections: speakeasy-default-get-collections: parameters: path: sectionId: 348838 + query: + mediaQuery: {"type": 4, "sourceType": 2, "sort": "duration:desc,index"} header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -4538,12 +4685,14 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 348838, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getCommon: speakeasy-default-get-common: parameters: path: sectionId: 298154 + query: + mediaQuery: {"type": 4, "sourceType": 2, "sort": "duration:desc,index"} header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -4558,7 +4707,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 298154, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} emptyTrash: speakeasy-default-empty-trash: parameters: @@ -4601,6 +4750,8 @@ examples: parameters: path: sectionId: 3947 + query: + mediaQuery: {"type": 4, "sourceType": 2, "sort": "duration:desc,index"} header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -4950,6 +5101,8 @@ examples: path: sectionId: 925611 updatedAt: 117413 + query: + mediaQuery: {"type": 4, "sourceType": 2, "sort": "duration:desc,index"} header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -5089,6 +5242,7 @@ examples: parameters: query: sectionId: "" + type: 2 header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -5103,7 +5257,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 112848, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} listDVRs: speakeasy-default-list-DV-rs: responses: @@ -5286,7 +5440,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 834281, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} removeDeviceFromDVR: speakeasy-default-remove-device-from-DVR: parameters: @@ -5501,7 +5655,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 186347, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getSessionPlaylistIndex: speakeasy-default-get-session-playlist-index: parameters: @@ -5866,7 +6020,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} + application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"title": "", "type": "", "addedAt": 516979, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} createSubscription: speakeasy-default-create-subscription: parameters: @@ -5891,13 +6045,13 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} + application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"title": "", "type": "", "addedAt": 868201, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} processSubscriptions: {} getScheduledRecordings: speakeasy-default-get-scheduled-recordings: responses: "200": - application/json: {"MediaContainer": {"MediaGrabOperation": [{"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}} + application/json: {"MediaContainer": {"MediaGrabOperation": [{"Metadata": {"title": "", "type": "", "addedAt": 478229, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}} getTemplate: speakeasy-default-get-template: parameters: @@ -5917,7 +6071,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"SubscriptionTemplate": [{"MediaSubscription": [{"title": "This Episode", "MediaGrabOperation": [{"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}]}} + application/json: {"MediaContainer": {"SubscriptionTemplate": [{"MediaSubscription": [{"title": "This Episode", "MediaGrabOperation": [{"Metadata": {"title": "", "type": "", "addedAt": 655183, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}]}} cancelGrab: speakeasy-default-cancel-grab: parameters: @@ -5974,7 +6128,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} + application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"title": "", "type": "", "addedAt": 186713, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} editSubscriptionPreferences: speakeasy-default-edit-subscription-preferences: parameters: @@ -5996,7 +6150,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} + application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"title": "", "type": "", "addedAt": 673918, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} reorderSubscription: speakeasy-default-reorder-subscription: parameters: @@ -6016,7 +6170,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} + application/json: {"MediaContainer": {"MediaSubscription": [{"MediaGrabOperation": [{"Metadata": {"title": "", "type": "", "addedAt": 440634, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}]}]}} transcodeImage: speakeasy-default-transcode-image: parameters: @@ -6092,7 +6246,7 @@ examples: X-Plex-Client-Profile-Name: "generic" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 313548, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} triggerFallback: speakeasy-default-trigger-fallback: parameters: @@ -6223,7 +6377,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 511190, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getPlaylistItems: speakeasy-default-get-playlist-items: parameters: @@ -6243,7 +6397,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 118195, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getPlaylistGenerators: speakeasy-default-get-playlist-generators: parameters: @@ -6283,7 +6437,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 552140, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} addPlaylistItems: speakeasy-default-add-playlist-items: parameters: @@ -6303,7 +6457,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 533723, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} deletePlaylistItem: speakeasy-default-delete-playlist-item: parameters: @@ -6324,7 +6478,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 981646, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getPlaylistGenerator: speakeasy-default-get-playlist-generator: parameters: @@ -6368,7 +6522,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 972007, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getPlaylistGeneratorItems: speakeasy-default-get-playlist-generator-items: parameters: @@ -6389,7 +6543,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": {"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}} + application/json: {"MediaContainer": {"Metadata": {"title": "", "type": "", "addedAt": 77230, "art": "/library/metadata/58683/art/1703239236", "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "chapterSource": "media", "childCount": 1, "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4", "guid": "plex://movie/5d7768ba96b655001fdc0408", "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "lastViewedAt": 1556281940, "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "originallyAvailableAt": "2022-12-14", "parentGuid": "plex://show/5d9c081b170e24001f2a7be4", "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "theme": "/library/metadata/1/theme/1705636920", "thumb": "/library/metadata/58683/thumb/1703239236", "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}}} movePlaylistItem: speakeasy-default-move-playlist-item: parameters: @@ -6410,7 +6564,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 940298, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} refreshPlaylist: speakeasy-default-refresh-playlist: parameters: @@ -6479,7 +6633,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 210646, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} addToPlayQueue: speakeasy-default-add-to-play-queue: parameters: @@ -6501,7 +6655,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 919248, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} clearPlayQueue: speakeasy-default-clear-play-queue: parameters: @@ -6521,7 +6675,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 86357, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} resetPlayQueue: speakeasy-default-reset-play-queue: parameters: @@ -6541,7 +6695,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 581891, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} shuffle: speakeasy-default-shuffle: parameters: @@ -6561,7 +6715,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 316150, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} unshuffle: speakeasy-default-unshuffle: parameters: @@ -6581,7 +6735,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 484388, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} deletePlayQueueItem: speakeasy-default-delete-play-queue-item: parameters: @@ -6602,7 +6756,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 285738, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} movePlayQueueItem: speakeasy-default-move-play-queue-item: parameters: @@ -6623,7 +6777,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"key": "", "title": "", "type": "", "addedAt": 31341, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getColors: speakeasy-default-get-colors: parameters: @@ -6674,7 +6828,7 @@ examples: speakeasy-default-list-sessions: responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 103950, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getBackgroundTasks: speakeasy-default-get-background-tasks: responses: @@ -6799,7 +6953,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 314585, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getMetadataItem: speakeasy-default-get-metadata-item: parameters: @@ -6828,7 +6982,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 28609, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getAlbums: speakeasy-default-get-albums: parameters: @@ -6848,12 +7002,18 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 817133, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} listContent: speakeasy-default-list-content: parameters: path: sectionId: "" + query: + X-Plex-Container-Start: 0 + X-Plex-Container-Size: 50 + mediaQuery: {"type": 4, "sourceType": 2, "sort": "duration:desc,index"} + includeMeta: 1 + includeGuids: 1 header: accepts: "application/xml" X-Plex-Client-Identifier: "abc123" @@ -6868,7 +7028,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 813218, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getAllLeaves: speakeasy-default-get-all-leaves: parameters: @@ -6888,7 +7048,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 633197, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getArts: speakeasy-default-get-arts: parameters: @@ -6971,7 +7131,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 914549, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getFolders: speakeasy-default-get-folders: parameters: @@ -7033,7 +7193,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 525956, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} getCollectionImage: speakeasy-default-get-collection-image: parameters: @@ -7076,7 +7236,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 338144, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} deleteCollectionItem: speakeasy-default-delete-collection-item: parameters: @@ -7097,7 +7257,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 320928, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} moveCollectionItem: speakeasy-default-move-collection-item: parameters: @@ -7118,6 +7278,7 @@ examples: X-Plex-Marketplace: "googlePlay" responses: "200": - application/json: {"MediaContainer": {"Metadata": [{"Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} + application/json: {"MediaContainer": {"Metadata": [{"title": "", "type": "", "addedAt": 239532, "Autotag": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Country": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Director": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Genre": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Guid": [{"id": "{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}"}], "key": "", "Media": [{"aspectRatio": 2.35, "audioChannels": 2, "audioCodec": "aac", "audioProfile": "lc", "bitrate": 5612, "container": "mov", "duration": 150192, "has64bitOffsets": false, "hasVoiceActivity": true, "height": 544, "id": 1, "optimizedForStreaming": false, "Part": [{"audioProfile": "lc", "container": "mov", "duration": 150192, "file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov", "has64bitOffsets": false, "id": 1, "key": "/library/parts/1/1531779263/file.mov", "optimizedForStreaming": false, "size": 105355654, "Stream": [{"default": true, "audioChannelLayout": "stereo", "bitDepth": 8, "bitrate": 5466, "canAutoSync": true, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codec": "h264", "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "displayTitle": "English (H.264 Main)", "frameRate": 23.976, "hasScalingMatrix": false, "height": 544, "id": 1, "index": 0, "key": "/library/streams/1", "language": "English", "languageCode": "eng", "level": 31, "profile": "main", "refFrames": 2, "samplingRate": 48000, "streamIdentifier": 1, "streamType": 1, "width": 1280}], "videoProfile": "main"}], "videoCodec": "h264", "videoFrameRate": "24p", "videoProfile": "main", "videoResolution": "720", "width": 1280}], "Rating": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Role": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}], "Writer": [{"filter": "actor=49", "role": "Secretary", "tag": "Shaun Lawton", "tagKey": "5d3ee12c4cde6a001c3e0b27", "thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"}]}]}} examplesVersion: 1.0.2 generatedTests: {} +releaseNotes: "## Go SDK Changes:\n* `PlexApi.LibraryPlaylists.AddPlaylistItems()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Hubs.GetMetadataHubs()`: \n * `request.Request.OnlyTransient` **Changed**\n * `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryCollections.MoveCollectionItem()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryCollections.DeleteCollectionItem()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryCollections.AddCollectionItems()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Content.GetSonicallySimilar()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Butler.StopTask()`: `request.Request` **Changed** **Breaking** :warning:\n* `PlexApi.Butler.StartTask()`: `request.Request` **Changed** **Breaking** :warning:\n* `PlexApi.Content.GetSonicPath()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.DownloadQueue.GetItemDecision()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Hubs.GetAllHubs()`: \n * `request.Request.OnlyTransient` **Changed**\n * `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Hubs.GetContinueWatching()`: `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Hubs.GetPromotedHubs()`: `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Content.GetAllLeaves()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Hubs.GetPostplayHubs()`: \n * `request.Request.OnlyTransient` **Changed**\n * `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Hubs.GetRelatedHubs()`: \n * `request.Request.OnlyTransient` **Changed**\n * `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Hubs.GetSectionHubs()`: \n * `request.Request.OnlyTransient` **Changed**\n * `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Content.ListContent()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Content.GetAlbums()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Search.SearchHubs()`: `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Search.VoiceSearchHubs()`: \n * `request.Request.Type` **Changed** **Breaking** :warning:\n * `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetLibraryItems()`: \n * `request.Request.MediaQuery` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.IngestTransientItem()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetLibraryMatches()`: \n * `request.Request` **Changed** **Breaking** :warning:\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Content.GetMetadataItem()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetSections()`: `response.MediaContainer.Directory.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.AddSection()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.Directory.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetTags()`: \n * `request.Request.Type` **Changed** **Breaking** :warning:\n* `PlexApi.Content.GetCollectionItems()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetAllItemLeaves()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Status.ListSessions()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.MovePlayQueueItem()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetExtras()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.DeletePlayQueueItem()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.Unshuffle()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.ListMatches()`: \n * `request.Request.Manual` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.ListSonicallySimilar()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.ResetPlayQueue()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetRelatedItems()`: `response.MediaContainer.Hub.[].Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.ListSimilar()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.ClearPlayQueue()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetItemTree()`: `response.MediaContainer.MetadataItem.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.AddToPlayQueue()`: \n * `request.Request.Next` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.GetPlayQueue()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryPlaylists.MovePlaylistItem()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetPerson()`: `response.MediaContainer.Directory.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.ListPersonMedia()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryPlaylists.GetPlaylistGeneratorItems()`: `response.MediaContainer.Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetLibraryDetails()`: \n * `request.Request.IncludeDetails` **Changed**\n * `response.MediaContainer.Directory.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryPlaylists.ModifyPlaylistGenerator()`: \n * `request.Request.Item` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.Autocomplete()`: \n * `request.Request.MediaQuery` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetCollections()`: \n * `request.Request.MediaQuery` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.GetCommon()`: \n * `request.Request.MediaQuery` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryPlaylists.DeletePlaylistItem()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryPlaylists.ClearPlaylistItems()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.PlayQueue.Shuffle()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LibraryPlaylists.CreatePlaylist()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Playlist.GetPlaylistItems()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Playlist.GetPlaylist()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Collections.CreateCollection()`: \n * `request.Request.Type` **Changed** **Breaking** :warning:\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.DvRs.TuneChannel()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LiveTv.GetSessions()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.LiveTv.GetLiveTvSession()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Playlist.ListPlaylists()`: `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Subscriptions.GetAllSubscriptions()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.MediaSubscription.[].MediaGrabOperation.[].Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Subscriptions.CreateSubscription()`: `response.MediaContainer.MediaSubscription.[].MediaGrabOperation.[].Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Subscriptions.GetScheduledRecordings()`: `response.MediaContainer.MediaGrabOperation.[].Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Subscriptions.GetTemplate()`: `response.MediaContainer.SubscriptionTemplate.[].MediaSubscription.[].MediaGrabOperation.[].Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Subscriptions.GetSubscription()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.MediaSubscription.[].MediaGrabOperation.[].Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Subscriptions.EditSubscriptionPreferences()`: `response.MediaContainer.MediaSubscription.[].MediaGrabOperation.[].Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Subscriptions.ReorderSubscription()`: `response.MediaContainer.MediaSubscription.[].MediaGrabOperation.[].Metadata` **Changed** **Breaking** :warning:\n* `PlexApi.Transcoder.MakeDecision()`: \n * `request.Request` **Changed**\n * `response.MediaContainer.Metadata.[]` **Changed** **Breaking** :warning:\n* `PlexApi.Library.RefreshItemsMetadata()`: \n * `request.Request.MarkUpdated` **Changed**\n* `PlexApi.Authentication.Post-Users-Sign-In-Data()`: **Added**\n* `PlexApi.Transcoder.StartTranscodeSession()`: `request.Request` **Changed**\n* `PlexApi.Devices.ModifyDevice()`: \n * `request.Request.Enabled` **Changed**\n* `PlexApi.Library.GetMediaPart()`: \n * `request.Request.Download` **Changed**\n* `PlexApi.Library.DetectIntros()`: \n * `request.Request.Force` **Changed**\n* `PlexApi.Library.RefreshSection()`: \n * `request.Request.Force` **Changed**\n* `PlexApi.LibraryPlaylists.UploadPlaylist()`: \n * `request.Request.Force` **Changed**\n* `PlexApi.Library.DeleteMediaItem()`: \n * `request.Request.Proxy` **Changed**\n* `PlexApi.Authentication.GetTokenDetails()`: **Added**\n* `PlexApi.Library.GetFirstCharacters()`: \n * `request.Request.MediaQuery` **Changed**\n* `PlexApi.Library.UpdateItems()`: \n * `request.Request.Field.locked` **Changed**\n* `PlexApi.Library.DeleteLibrarySection()`: \n * `request.Request.Async` **Changed**\n* `PlexApi.Library.SetStreamSelection()`: \n * `request.Request.AllParts` **Changed**\n* `PlexApi.PlayQueue.CreatePlayQueue()`: `request.Request` **Changed**\n* `PlexApi.Library.GetAugmentationStatus()`: \n * `request.Request.Wait` **Changed**\n* `PlexApi.Library.DetectVoiceActivity()`: `request.Request` **Changed**\n* `PlexApi.Transcoder.TranscodeImage()`: `request.Request` **Changed**\n* `PlexApi.Transcoder.TranscodeSubtitles()`: `request.Request` **Changed**\n* `PlexApi.Library.AddSubtitles()`: `request.Request` **Changed**\n* `PlexApi.Library.GetStream()`: \n * `request.Request.AutoAdjustSubtitle` **Changed**\n* `PlexApi.Library.StartBifGeneration()`: \n * `request.Request.Force` **Changed**\n* `PlexApi.Library.DetectCredits()`: `request.Request` **Changed**\n* `PlexApi.UltraBlur.GetImage()`: \n * `request.Request.Noise` **Changed**\n* `PlexApi.Library.GenerateThumbs()`: \n * `request.Request.Force` **Changed**\n* `PlexApi.Updater.ApplyUpdates()`: `request.Request` **Changed**\n* `PlexApi.Updater.CheckUpdates()`: \n * `request.Request.Download` **Changed**\n* `PlexApi.Library.DeleteMetadataItem()`: \n * `request.Request.Proxy` **Changed**\n* `PlexApi.Library.OptimizeDatabase()`: \n * `request.Request.Async` **Changed**\n* `PlexApi.Hubs.UpdateHubVisibility()`: `request.Request` **Changed**\n* `PlexApi.Hubs.CreateCustomHub()`: `request.Request` **Changed**\n* `PlexApi.Library.GetSectionImage()`: \n * `request.Request.MediaQuery` **Changed**\n* `PlexApi.DownloadQueue.AddDownloadQueueItems()`: `request.Request` **Changed**\n* `PlexApi.Timeline.Report()`: `request.Request` **Changed**\n* `PlexApi.General.GetSourceConnectionInformation()`: \n * `request.Request.Refresh` **Changed**\n* `PlexApi.Plex.Get-Server-Resources()`: **Added**\n* `PlexApi.Users.Get-Users()`: **Added**\n" diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 60bc4a5..9fd1f9d 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -25,7 +25,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false go: - version: 0.27.0 + version: 0.28.0 additionalDependencies: {} allowUnknownFieldsInWeakUnions: false baseErrorName: PlexAPIError @@ -41,14 +41,16 @@ go: shared: models/components webhooks: models/webhooks includeEmptyObjects: false + inferUnionDiscriminators: false inputModelSuffix: input maxMethodParams: 4 methodArguments: require-security-and-request modulePath: "" + multipartArrayFormat: legacy nullableOptionalWrapper: false outputModelSuffix: output packageName: github.com/LukeHagar/plexgo respectRequiredFields: false responseFormat: envelope sdkPackageName: "" - unionDeserializationStrategy: left-to-right + unionStrategy: left-to-right diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 5e3befe..215952d 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,4 +1,4 @@ -speakeasyVersion: 1.656.1 +speakeasyVersion: 1.665.0 sources: my-source: sourceNamespace: my-source @@ -9,20 +9,20 @@ sources: - main plexapi: sourceNamespace: plexapi - sourceRevisionDigest: sha256:56fc783b16af019db4eb0fe52df504315e8e7c7ae41e319a61bba8823f19df4b - sourceBlobDigest: sha256:b62613477fd824bb42cf0bf5d0f9980448259c9c7456e03ca6a10eef39a3994f + sourceRevisionDigest: sha256:ace004a3b232e8ab9ca3d89f2da8e40470236e6d997073a16c3f8872d67a7383 + sourceBlobDigest: sha256:993bfb796a3833b0a3b813ad12469ca34db94f23c2d15ae988a26b4d1ed80fbe tags: - latest - - speakeasy-sdk-regen-1762992653 + - speakeasy-sdk-regen-1764548025 - 1.1.1 targets: plexgo: source: plexapi sourceNamespace: plexapi - sourceRevisionDigest: sha256:56fc783b16af019db4eb0fe52df504315e8e7c7ae41e319a61bba8823f19df4b - sourceBlobDigest: sha256:b62613477fd824bb42cf0bf5d0f9980448259c9c7456e03ca6a10eef39a3994f + sourceRevisionDigest: sha256:ace004a3b232e8ab9ca3d89f2da8e40470236e6d997073a16c3f8872d67a7383 + sourceBlobDigest: sha256:993bfb796a3833b0a3b813ad12469ca34db94f23c2d15ae988a26b4d1ed80fbe codeSamplesNamespace: code-samples-go-plexgo - codeSamplesRevisionDigest: sha256:6774f9c76b07cc1baeec3bfaab50b0770e51dc3b36da8ff5b92889168d5a538e + codeSamplesRevisionDigest: sha256:d79ec0f33d0e234749ae5970ad2528646cdd6ec28c7e8d7e29cc39b857f58cde workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README.md b/README.md index 5f965b9..f3b3a4a 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ * [Server Selection](#server-selection) * [Custom HTTP Client](#custom-http-client) * [Authentication](#authentication) + * [Special Types](#special-types) * [Development](#development) * [Maturity](#maturity) * [Contributions](#contributions) @@ -80,13 +81,13 @@ func main() { AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.StartTranscodeSessionQueryParamLocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), @@ -127,6 +128,11 @@ func main() { * [ListActivities](docs/sdks/activities/README.md#listactivities) - Get all activities * [CancelActivity](docs/sdks/activities/README.md#cancelactivity) - Cancel a running activity +### [Authentication](docs/sdks/authentication/README.md) + +* [GetTokenDetails](docs/sdks/authentication/README.md#gettokendetails) - Get Token Details +* [PostUsersSignInData](docs/sdks/authentication/README.md#postuserssignindata) - Get User Sign In Data + ### [Butler](docs/sdks/butler/README.md) * [StopTasks](docs/sdks/butler/README.md#stoptasks) - Stop all Butler tasks @@ -374,6 +380,10 @@ func main() { * [DeletePlayQueueItem](docs/sdks/playqueue/README.md#deleteplayqueueitem) - Delete an item from a play queue * [MovePlayQueueItem](docs/sdks/playqueue/README.md#moveplayqueueitem) - Move an item in a play queue +### [Plex](docs/sdks/plex/README.md) + +* [GetServerResources](docs/sdks/plex/README.md#getserverresources) - Get Server Resources + ### [Preferences](docs/sdks/preferences/README.md) * [GetAllPreferences](docs/sdks/preferences/README.md#getallpreferences) - Get all preferences @@ -443,6 +453,10 @@ func main() { * [CheckUpdates](docs/sdks/updater/README.md#checkupdates) - Checking for updates * [GetUpdatesStatus](docs/sdks/updater/README.md#getupdatesstatus) - Querying status of updates +### [Users](docs/sdks/users/README.md) + +* [GetUsers](docs/sdks/users/README.md#getusers) - Get list of all connected users + @@ -565,11 +579,13 @@ Handling errors in this SDK should largely match your expectations. All operatio By Default, an API error will return `sdkerrors.SDKError`. When custom error responses are specified for an operation, the SDK may also return their associated error. You can refer to respective *Errors* tables in SDK docs for more details on possible error types for each operation. -For example, the `GetServerInfo` function may return the following errors: +For example, the `GetTokenDetails` function may return the following errors: -| Error Type | Status Code | Content Type | -| ------------------ | ----------- | ------------ | -| sdkerrors.SDKError | 4XX, 5XX | \*/\* | +| Error Type | Status Code | Content Type | +| ------------------------------------- | ----------- | ---------------- | +| sdkerrors.GetTokenDetailsBadRequest | 400 | application/json | +| sdkerrors.GetTokenDetailsUnauthorized | 401 | application/json | +| sdkerrors.SDKError | 4XX, 5XX | \*/\* | ### Example @@ -604,9 +620,21 @@ func main() { plexgo.WithSecurity(""), ) - res, err := s.General.GetServerInfo(ctx, operations.GetServerInfoRequest{}) + res, err := s.Authentication.GetTokenDetails(ctx, operations.GetTokenDetailsRequest{}) if err != nil { + var e *sdkerrors.GetTokenDetailsBadRequest + if errors.As(err, &e) { + // handle error + log.Fatal(e.Error()) + } + + var e *sdkerrors.GetTokenDetailsUnauthorized + if errors.As(err, &e) { + // handle error + log.Fatal(e.Error()) + } + var e *sdkerrors.SDKError if errors.As(err, &e) { // handle error @@ -730,6 +758,49 @@ func main() { } } +``` + +### Override Server URL Per-Operation + +The server URL can also be overridden on a per-operation basis, provided a server list was specified for the operation. For example: +```go +package main + +import ( + "context" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo/models/operations" + "log" +) + +func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("abc123"), + plexgo.WithProduct("Plex for Roku"), + plexgo.WithVersion("2.4.1"), + plexgo.WithPlatform("Roku"), + plexgo.WithPlatformVersion("4.3 build 1057"), + plexgo.WithDevice("Roku 3"), + plexgo.WithModel("4200X"), + plexgo.WithDeviceVendor("Roku"), + plexgo.WithDeviceName("Living Room TV"), + plexgo.WithMarketplace("googlePlay"), + plexgo.WithSecurity(""), + ) + + res, err := s.Authentication.GetTokenDetails(ctx, operations.GetTokenDetailsRequest{}, operations.WithServerURL("https://plex.tv/api/v2")) + if err != nil { + log.Fatal(err) + } + if res.UserPlexAccount != nil { + // handle response + } +} + ``` @@ -816,6 +887,32 @@ func main() { ``` + +## Special Types + +This SDK defines the following custom types to assist with marshalling and unmarshalling data. + +### Date + +`types.Date` is a wrapper around time.Time that allows for JSON marshaling a date string formatted as "2006-01-02". + +#### Usage + +```go +d1 := types.NewDate(time.Now()) // returns *types.Date + +d2 := types.DateFromTime(time.Now()) // returns types.Date + +d3, err := types.NewDateFromString("2019-01-01") // returns *types.Date, error + +d4, err := types.DateFromString("2019-01-01") // returns types.Date, error + +d5 := types.MustNewDateFromString("2019-01-01") // returns *types.Date and panics on error + +d6 := types.MustDateFromString("2019-01-01") // returns types.Date and panics on error +``` + + # Development diff --git a/RELEASES.md b/RELEASES.md index 8ab5ad4..807237e 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1242,4 +1242,14 @@ Based on: ### Generated - [go v0.27.0] . ### Releases -- [Go v0.27.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.27.0 - . \ No newline at end of file +- [Go v0.27.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.27.0 - . + +## 2025-12-01 00:13:26 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.665.0 (2.767.2) https://github.com/speakeasy-api/speakeasy +### Generated +- [go v0.28.0] . +### Releases +- [Go v0.28.0] https://github.com/LukeHagar/plexgo/releases/tag/v0.28.0 - . \ No newline at end of file diff --git a/USAGE.md b/USAGE.md index 8637b9f..3050621 100644 --- a/USAGE.md +++ b/USAGE.md @@ -34,13 +34,13 @@ func main() { AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.StartTranscodeSessionQueryParamLocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), diff --git a/authentication.go b/authentication.go new file mode 100644 index 0000000..615e6b6 --- /dev/null +++ b/authentication.go @@ -0,0 +1,563 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package plexgo + +import ( + "bytes" + "context" + "fmt" + "github.com/LukeHagar/plexgo/internal/config" + "github.com/LukeHagar/plexgo/internal/hooks" + "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo/models/operations" + "github.com/LukeHagar/plexgo/models/sdkerrors" + "github.com/LukeHagar/plexgo/retry" + "net/http" + "net/url" +) + +type Authentication struct { + rootSDK *PlexAPI + sdkConfiguration config.SDKConfiguration + hooks *hooks.Hooks +} + +func newAuthentication(rootSDK *PlexAPI, sdkConfig config.SDKConfiguration, hooks *hooks.Hooks) *Authentication { + return &Authentication{ + rootSDK: rootSDK, + sdkConfiguration: sdkConfig, + hooks: hooks, + } +} + +// GetTokenDetails - Get Token Details +// Get the User data from the provided X-Plex-Token +func (s *Authentication) GetTokenDetails(ctx context.Context, request operations.GetTokenDetailsRequest, opts ...operations.Option) (*operations.GetTokenDetailsResponse, error) { + globals := operations.GetTokenDetailsGlobals{ + Accepts: s.sdkConfiguration.Globals.Accepts, + ClientIdentifier: s.sdkConfiguration.Globals.ClientIdentifier, + Product: s.sdkConfiguration.Globals.Product, + Version: s.sdkConfiguration.Globals.Version, + Platform: s.sdkConfiguration.Globals.Platform, + PlatformVersion: s.sdkConfiguration.Globals.PlatformVersion, + Device: s.sdkConfiguration.Globals.Device, + Model: s.sdkConfiguration.Globals.Model, + DeviceVendor: s.sdkConfiguration.Globals.DeviceVendor, + DeviceName: s.sdkConfiguration.Globals.DeviceName, + Marketplace: s.sdkConfiguration.Globals.Marketplace, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + baseURL := utils.ReplaceParameters(operations.GetTokenDetailsServerList[0], map[string]string{}) + if o.ServerURL != nil { + baseURL = *o.ServerURL + } + + opURL, err := url.JoinPath(baseURL, "/user") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + hookCtx := hooks.HookContext{ + SDK: s.rootSDK, + SDKConfiguration: s.sdkConfiguration, + BaseURL: baseURL, + Context: ctx, + OperationID: "getTokenDetails", + OAuth2Scopes: nil, + SecuritySource: s.sdkConfiguration.Security, + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + + utils.PopulateHeaders(ctx, req, request, globals) + + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } + + for k, v := range o.SetHeaders { + req.Header.Set(k, v) + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil { + copyBody, err := req.GetBody() + + if err != nil { + return nil, err + } + + req.Body = copyBody + } + + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + if retry.IsPermanentError(err) || retry.IsTemporaryError(err) { + return nil, err + } + + return nil, retry.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { + _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.GetTokenDetailsResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, + } + + switch { + case httpRes.StatusCode == 200: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out components.UserPlexAccount + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.UserPlexAccount = &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 400: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out sdkerrors.GetTokenDetailsBadRequest + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + out.RawResponse = httpRes + return nil, &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 401: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out sdkerrors.GetTokenDetailsUnauthorized + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + out.RawResponse = httpRes + return nil, &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) + } + + return res, nil + +} + +// PostUsersSignInData - Get User Sign In Data +// Sign in user with username and password and return user data with Plex authentication token +func (s *Authentication) PostUsersSignInData(ctx context.Context, request operations.PostUsersSignInDataRequest, opts ...operations.Option) (*operations.PostUsersSignInDataResponse, error) { + globals := operations.PostUsersSignInDataGlobals{ + Accepts: s.sdkConfiguration.Globals.Accepts, + ClientIdentifier: s.sdkConfiguration.Globals.ClientIdentifier, + Product: s.sdkConfiguration.Globals.Product, + Version: s.sdkConfiguration.Globals.Version, + Platform: s.sdkConfiguration.Globals.Platform, + PlatformVersion: s.sdkConfiguration.Globals.PlatformVersion, + Device: s.sdkConfiguration.Globals.Device, + Model: s.sdkConfiguration.Globals.Model, + DeviceVendor: s.sdkConfiguration.Globals.DeviceVendor, + DeviceName: s.sdkConfiguration.Globals.DeviceName, + Marketplace: s.sdkConfiguration.Globals.Marketplace, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + baseURL := utils.ReplaceParameters(operations.PostUsersSignInDataServerList[0], map[string]string{}) + if o.ServerURL != nil { + baseURL = *o.ServerURL + } + + opURL, err := url.JoinPath(baseURL, "/users/signin") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + hookCtx := hooks.HookContext{ + SDK: s.rootSDK, + SDKConfiguration: s.sdkConfiguration, + BaseURL: baseURL, + Context: ctx, + OperationID: "post-users-sign-in-data", + OAuth2Scopes: nil, + SecuritySource: nil, + } + bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "RequestBody", "form", `request:"mediaType=application/x-www-form-urlencoded"`) + if err != nil { + return nil, err + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "POST", opURL, bodyReader) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + if reqContentType != "" { + req.Header.Set("Content-Type", reqContentType) + } + + utils.PopulateHeaders(ctx, req, request, globals) + + for k, v := range o.SetHeaders { + req.Header.Set(k, v) + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil { + copyBody, err := req.GetBody() + + if err != nil { + return nil, err + } + + req.Body = copyBody + } + + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + if retry.IsPermanentError(err) || retry.IsTemporaryError(err) { + return nil, err + } + + return nil, retry.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { + _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.PostUsersSignInDataResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, + } + + switch { + case httpRes.StatusCode == 201: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out operations.PostUsersSignInDataUserPlexAccount + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.UserPlexAccount = &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 400: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out sdkerrors.PostUsersSignInDataBadRequest + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + out.RawResponse = httpRes + return nil, &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 401: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out sdkerrors.PostUsersSignInDataUnauthorized + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + out.RawResponse = httpRes + return nil, &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) + } + + return res, nil + +} diff --git a/butler.go b/butler.go index d36b937..7c81d11 100644 --- a/butler.go +++ b/butler.go @@ -646,7 +646,7 @@ func (s *Butler) StopTask(ctx context.Context, request operations.StopTaskReques } else { baseURL = *o.ServerURL } - opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{task}", request, globals) + opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{butlerTask}", request, globals) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } @@ -849,7 +849,7 @@ func (s *Butler) StartTask(ctx context.Context, request operations.StartTaskRequ } else { baseURL = *o.ServerURL } - opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{task}", request, globals) + opURL, err := utils.GenerateURL(ctx, baseURL, "/butler/{butlerTask}", request, globals) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } diff --git a/codeSamples.yaml b/codeSamples.yaml index d055f6b..cb20ad0 100644 --- a/codeSamples.yaml +++ b/codeSamples.yaml @@ -333,9 +333,9 @@ actions: PlayQueueItemID: plexgo.Pointer("123"), Time: plexgo.Pointer[int64](0), Duration: plexgo.Pointer[int64](10000), - Continuing: components.BoolIntOne.ToPointer(), + Continuing: components.BoolIntTrue.ToPointer(), Updated: plexgo.Pointer[int64](14200000), - Offline: components.BoolIntOne.ToPointer(), + Offline: components.BoolIntTrue.ToPointer(), TimeToFirstFrame: plexgo.Pointer[int64](1000), TimeStalled: plexgo.Pointer[int64](1000), Bandwidth: plexgo.Pointer[int64](100), @@ -595,7 +595,7 @@ actions: // handle response } } - - target: $["paths"]["/butler/{task}"]["delete"] + - target: $["paths"]["/butler/{butlerTask}"]["delete"] update: x-codeSamples: - lang: go @@ -630,7 +630,7 @@ actions: ) res, err := s.Butler.StopTask(ctx, operations.StopTaskRequest{ - Task: operations.TaskCleanOldBundles, + ButlerTask: operations.ButlerTaskCleanOldBundles, }) if err != nil { log.Fatal(err) @@ -639,7 +639,7 @@ actions: // handle response } } - - target: $["paths"]["/butler/{task}"]["post"] + - target: $["paths"]["/butler/{butlerTask}"]["post"] update: x-codeSamples: - lang: go @@ -674,7 +674,7 @@ actions: ) res, err := s.Butler.StartTask(ctx, operations.StartTaskRequest{ - Task: operations.PathParamTaskRefreshLocalMedia, + ButlerTask: operations.PathParamButlerTaskRefreshLocalMedia, }) if err != nil { log.Fatal(err) @@ -799,13 +799,13 @@ actions: AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: components.LocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), @@ -1145,7 +1145,7 @@ actions: ) res, err := s.Hubs.GetAllHubs(ctx, operations.GetAllHubsRequest{ - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1280,7 +1280,7 @@ actions: res, err := s.Hubs.GetMetadataHubs(ctx, operations.GetMetadataHubsRequest{ MetadataID: 605482, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1325,7 +1325,7 @@ actions: res, err := s.Hubs.GetPostplayHubs(ctx, operations.GetPostplayHubsRequest{ MetadataID: 441419, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1370,7 +1370,7 @@ actions: res, err := s.Hubs.GetRelatedHubs(ctx, operations.GetRelatedHubsRequest{ MetadataID: 8858, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1502,6 +1502,7 @@ actions: res, err := s.Search.VoiceSearchHubs(ctx, operations.VoiceSearchHubsRequest{ Query: "", + Type: components.MediaTypeTvShow.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1546,7 +1547,7 @@ actions: res, err := s.Hubs.GetSectionHubs(ctx, operations.GetSectionHubsRequest{ SectionID: 336924, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1680,9 +1681,9 @@ actions: res, err := s.Hubs.CreateCustomHub(ctx, operations.CreateCustomHubRequest{ SectionID: 869922, MetadataItemID: 703843, - PromotedToRecommended: components.BoolIntOne.ToPointer(), - PromotedToOwnHome: components.BoolIntOne.ToPointer(), - PromotedToSharedHome: components.BoolIntOne.ToPointer(), + PromotedToRecommended: components.BoolIntTrue.ToPointer(), + PromotedToOwnHome: components.BoolIntTrue.ToPointer(), + PromotedToSharedHome: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1818,9 +1819,9 @@ actions: res, err := s.Hubs.UpdateHubVisibility(ctx, operations.UpdateHubVisibilityRequest{ SectionID: 341650, Identifier: "", - PromotedToRecommended: components.BoolIntOne.ToPointer(), - PromotedToOwnHome: components.BoolIntOne.ToPointer(), - PromotedToSharedHome: components.BoolIntOne.ToPointer(), + PromotedToRecommended: components.BoolIntTrue.ToPointer(), + PromotedToOwnHome: components.BoolIntTrue.ToPointer(), + PromotedToSharedHome: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1890,7 +1891,13 @@ actions: plexgo.WithSecurity(""), ) - res, err := s.Library.GetLibraryItems(ctx, operations.GetLibraryItemsRequest{}) + res, err := s.Library.GetLibraryItems(ctx, operations.GetLibraryItemsRequest{ + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, + }) if err != nil { log.Fatal(err) } @@ -1992,6 +1999,7 @@ actions: res, err := s.Collections.CreateCollection(ctx, operations.CreateCollectionRequest{ SectionID: "", + Type: components.MediaTypeTvShow.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2261,8 +2269,8 @@ actions: res, err := s.Library.IngestTransientItem(ctx, operations.IngestTransientItemRequest{ URL: plexgo.Pointer("file:///storage%2Femulated%2F0%2FArcher-S01E01.mkv"), VirtualFilePath: plexgo.Pointer("/Avatar.mkv"), - ComputeHashes: components.BoolIntOne.ToPointer(), - IngestNonMatches: components.BoolIntOne.ToPointer(), + ComputeHashes: components.BoolIntTrue.ToPointer(), + IngestNonMatches: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2306,9 +2314,10 @@ actions: ) res, err := s.Library.GetLibraryMatches(ctx, operations.GetLibraryMatchesRequest{ - IncludeFullMetadata: components.BoolIntOne.ToPointer(), - IncludeAncestorMetadata: components.BoolIntOne.ToPointer(), - IncludeAlternateMetadataSources: components.BoolIntOne.ToPointer(), + Type: components.MediaTypeTvShow.ToPointer(), + IncludeFullMetadata: components.BoolIntTrue.ToPointer(), + IncludeAncestorMetadata: components.BoolIntTrue.ToPointer(), + IncludeAlternateMetadataSources: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2398,7 +2407,7 @@ actions: res, err := s.Library.GetAugmentationStatus(ctx, operations.GetAugmentationStatusRequest{ AugmentationID: "", - Wait: components.BoolIntOne.ToPointer(), + Wait: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2443,7 +2452,7 @@ actions: res, err := s.Library.DeleteMetadataItem(ctx, operations.DeleteMetadataItemRequest{ Ids: "", - Proxy: components.BoolIntOne.ToPointer(), + Proxy: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2488,14 +2497,14 @@ actions: res, err := s.Content.GetMetadataItem(ctx, operations.GetMetadataItemRequest{ Ids: []string{}, - AsyncCheckFiles: components.BoolIntOne.ToPointer(), - AsyncRefreshLocalMediaAgent: components.BoolIntOne.ToPointer(), - AsyncRefreshAnalysis: components.BoolIntOne.ToPointer(), - CheckFiles: components.BoolIntOne.ToPointer(), - SkipRefresh: components.BoolIntOne.ToPointer(), - CheckFileAvailability: components.BoolIntOne.ToPointer(), - AsyncAugmentMetadata: components.BoolIntOne.ToPointer(), - AugmentCount: components.BoolIntOne.ToPointer(), + AsyncCheckFiles: components.BoolIntTrue.ToPointer(), + AsyncRefreshLocalMediaAgent: components.BoolIntTrue.ToPointer(), + AsyncRefreshAnalysis: components.BoolIntTrue.ToPointer(), + CheckFiles: components.BoolIntTrue.ToPointer(), + SkipRefresh: components.BoolIntTrue.ToPointer(), + CheckFileAvailability: components.BoolIntTrue.ToPointer(), + AsyncAugmentMetadata: components.BoolIntTrue.ToPointer(), + AugmentCount: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2719,7 +2728,7 @@ actions: res, err := s.Library.GenerateThumbs(ctx, operations.GenerateThumbsRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2764,8 +2773,8 @@ actions: res, err := s.Library.DetectCredits(ctx, operations.DetectCreditsRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), - Manual: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), + Manual: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2943,7 +2952,7 @@ actions: res, err := s.Library.StartBifGeneration(ctx, operations.StartBifGenerationRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2988,7 +2997,7 @@ actions: res, err := s.Library.DetectIntros(ctx, operations.DetectIntrosRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3217,7 +3226,7 @@ actions: res, err := s.Library.ListMatches(ctx, operations.ListMatchesRequest{ Ids: "", - Manual: components.BoolIntOne.ToPointer(), + Manual: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3263,7 +3272,7 @@ actions: res, err := s.Library.DeleteMediaItem(ctx, operations.DeleteMediaItemRequest{ Ids: "", MediaItem: "", - Proxy: components.BoolIntOne.ToPointer(), + Proxy: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3440,7 +3449,7 @@ actions: res, err := s.Library.RefreshItemsMetadata(ctx, operations.RefreshItemsMetadataRequest{ Ids: "", - MarkUpdated: components.BoolIntOne.ToPointer(), + MarkUpdated: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3617,8 +3626,8 @@ actions: res, err := s.Library.AddSubtitles(ctx, operations.AddSubtitlesRequest{ Ids: "", - Forced: components.BoolIntOne.ToPointer(), - HearingImpaired: components.BoolIntOne.ToPointer(), + Forced: components.BoolIntTrue.ToPointer(), + HearingImpaired: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3795,8 +3804,8 @@ actions: res, err := s.Library.DetectVoiceActivity(ctx, operations.DetectVoiceActivityRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), - Manual: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), + Manual: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3976,7 +3985,7 @@ actions: ) res, err := s.Library.OptimizeDatabase(ctx, operations.OptimizeDatabaseRequest{ - Async: components.BoolIntOne.ToPointer(), + Async: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4021,7 +4030,7 @@ actions: res, err := s.Library.SetStreamSelection(ctx, operations.SetStreamSelectionRequest{ PartID: 360489, - AllParts: components.BoolIntOne.ToPointer(), + AllParts: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4159,7 +4168,7 @@ actions: PartID: 877105, Changestamp: 970622, Filename: "example.file", - Download: components.BoolIntOne.ToPointer(), + Download: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4376,8 +4385,8 @@ actions: "O:\fatboy\\Media\\My Music", }, Prefs: &operations.QueryParamPrefs{}, - Relative: components.BoolIntOne.ToPointer(), - ImportFromiTunes: components.BoolIntOne.ToPointer(), + Relative: components.BoolIntTrue.ToPointer(), + ImportFromiTunes: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4537,7 +4546,7 @@ actions: res, err := s.Library.DeleteLibrarySection(ctx, operations.DeleteLibrarySectionRequest{ SectionID: "", - Async: components.BoolIntOne.ToPointer(), + Async: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4582,7 +4591,7 @@ actions: res, err := s.Library.GetLibraryDetails(ctx, operations.GetLibraryDetailsRequest{ SectionID: "", - IncludeDetails: components.BoolIntOne.ToPointer(), + IncludeDetails: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4720,6 +4729,13 @@ actions: ) res, err := s.Content.ListContent(ctx, operations.ListContentRequest{ + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, + IncludeMeta: components.BoolIntTrue.ToPointer(), + IncludeGuids: components.BoolIntTrue.ToPointer(), SectionID: "", }) if err != nil { @@ -4765,7 +4781,7 @@ actions: res, err := s.Library.UpdateItems(ctx, operations.UpdateItemsRequest{ SectionID: "", - FieldLocked: components.BoolIntOne.ToPointer(), + FieldLocked: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4942,6 +4958,11 @@ actions: res, err := s.Library.Autocomplete(ctx, operations.AutocompleteRequest{ SectionID: 942007, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -5119,6 +5140,11 @@ actions: res, err := s.Library.GetCollections(ctx, operations.GetCollectionsRequest{ SectionID: 348838, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -5163,6 +5189,11 @@ actions: res, err := s.Library.GetCommon(ctx, operations.GetCommonRequest{ SectionID: 298154, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -5208,6 +5239,11 @@ actions: res, err := s.Library.GetSectionImage(ctx, operations.GetSectionImageRequest{ SectionID: 925611, UpdatedAt: 117413, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -5386,6 +5422,11 @@ actions: res, err := s.Library.GetFirstCharacters(ctx, operations.GetFirstCharactersRequest{ SectionID: 3947, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -5784,7 +5825,7 @@ actions: res, err := s.Library.RefreshSection(ctx, operations.RefreshSectionRequest{ SectionID: 450300, - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -5919,7 +5960,7 @@ actions: res, err := s.Library.GetStream(ctx, operations.GetStreamRequest{ StreamID: 314506, Ext: "", - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -6095,7 +6136,9 @@ actions: plexgo.WithSecurity(""), ) - res, err := s.Library.GetTags(ctx, operations.GetTagsRequest{}) + res, err := s.Library.GetTags(ctx, operations.GetTagsRequest{ + Type: components.MediaTypeTvShow.ToPointer(), + }) if err != nil { log.Fatal(err) } @@ -7605,7 +7648,7 @@ actions: res, err := s.Devices.ModifyDevice(ctx, operations.ModifyDeviceRequest{ DeviceID: 879135, - Enabled: components.BoolIntOne.ToPointer(), + Enabled: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -8123,8 +8166,8 @@ actions: ) res, err := s.Subscriptions.GetAllSubscriptions(ctx, operations.GetAllSubscriptionsRequest{ - IncludeGrabs: components.BoolIntOne.ToPointer(), - IncludeStorage: components.BoolIntOne.ToPointer(), + IncludeGrabs: components.BoolIntTrue.ToPointer(), + IncludeStorage: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -8364,8 +8407,8 @@ actions: res, err := s.Subscriptions.GetSubscription(ctx, operations.GetSubscriptionRequest{ SubscriptionID: 186713, - IncludeGrabs: components.BoolIntOne.ToPointer(), - IncludeStorage: components.BoolIntOne.ToPointer(), + IncludeGrabs: components.BoolIntTrue.ToPointer(), + IncludeStorage: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -8500,9 +8543,9 @@ actions: res, err := s.Transcoder.TranscodeImage(ctx, operations.TranscodeImageRequest{ URL: plexgo.Pointer("/library/metadata/265/thumb/1715112705"), Background: plexgo.Pointer("#ff5522"), - Upscale: components.BoolIntOne.ToPointer(), - MinSize: components.BoolIntOne.ToPointer(), - Rotate: components.BoolIntOne.ToPointer(), + Upscale: components.BoolIntTrue.ToPointer(), + MinSize: components.BoolIntTrue.ToPointer(), + Rotate: components.BoolIntTrue.ToPointer(), BlendColor: plexgo.Pointer("#ff5522"), }) if err != nil { @@ -8548,11 +8591,11 @@ actions: res, err := s.PlayQueue.CreatePlayQueue(ctx, operations.CreatePlayQueueRequest{ Type: operations.TypeAudio, - Shuffle: components.BoolIntOne.ToPointer(), - Repeat: components.BoolIntOne.ToPointer(), - Continuous: components.BoolIntOne.ToPointer(), - Recursive: components.BoolIntOne.ToPointer(), - OnDeck: components.BoolIntOne.ToPointer(), + Shuffle: components.BoolIntTrue.ToPointer(), + Repeat: components.BoolIntTrue.ToPointer(), + Continuous: components.BoolIntTrue.ToPointer(), + Recursive: components.BoolIntTrue.ToPointer(), + OnDeck: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -8597,9 +8640,9 @@ actions: res, err := s.PlayQueue.GetPlayQueue(ctx, operations.GetPlayQueueRequest{ PlayQueueID: 210646, - Own: components.BoolIntOne.ToPointer(), - IncludeBefore: components.BoolIntOne.ToPointer(), - IncludeAfter: components.BoolIntOne.ToPointer(), + Own: components.BoolIntTrue.ToPointer(), + IncludeBefore: components.BoolIntTrue.ToPointer(), + IncludeAfter: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -8644,7 +8687,7 @@ actions: res, err := s.PlayQueue.AddToPlayQueue(ctx, operations.AddToPlayQueueRequest{ PlayQueueID: 919248, - Next: components.BoolIntOne.ToPointer(), + Next: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -9039,7 +9082,7 @@ actions: res, err := s.LibraryPlaylists.UploadPlaylist(ctx, operations.UploadPlaylistRequest{ Path: plexgo.Pointer("/home/barkley/playlist.m3u"), - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -9491,7 +9534,6 @@ actions: Policy: &operations.Policy{ Value: plexgo.Pointer[int64](), Scope: operations.QueryParamScopeAll.ToPointer(), - Unwatched: components.BoolIntZero.ToPointer(), }, Target: plexgo.Pointer(""), TargetTagID: plexgo.Pointer[int64](1), @@ -9643,6 +9685,43 @@ actions: // handle response } } + - target: $["paths"]["/resources"]["get"] + update: + x-codeSamples: + - lang: go + label: PlexGO + source: |- + package main + + import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" + ) + + func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("abc123"), + plexgo.WithSecurity(""), + ) + + res, err := s.Plex.GetServerResources(ctx, operations.GetServerResourcesRequest{ + IncludeHTTPS: operations.IncludeHTTPSTrue.ToPointer(), + IncludeRelay: operations.IncludeRelayTrue.ToPointer(), + IncludeIPv6: operations.IncludeIPv6True.ToPointer(), + }) + if err != nil { + log.Fatal(err) + } + if res.PlexDevices != nil { + // handle response + } + } - target: $["paths"]["/security/resources"]["get"] update: x-codeSamples: @@ -9679,7 +9758,7 @@ actions: res, err := s.General.GetSourceConnectionInformation(ctx, operations.GetSourceConnectionInformationRequest{ Source: "", - Refresh: components.BoolIntOne.ToPointer(), + Refresh: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -9818,7 +9897,7 @@ actions: BottomLeft: plexgo.Pointer("1c425d"), Width: plexgo.Pointer[int64](1920), Height: plexgo.Pointer[int64](1080), - Noise: components.BoolIntOne.ToPointer(), + Noise: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -10121,8 +10200,8 @@ actions: ) res, err := s.Updater.ApplyUpdates(ctx, operations.ApplyUpdatesRequest{ - Tonight: components.BoolIntOne.ToPointer(), - Skip: components.BoolIntOne.ToPointer(), + Tonight: components.BoolIntTrue.ToPointer(), + Skip: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -10166,7 +10245,7 @@ actions: ) res, err := s.Updater.CheckUpdates(ctx, operations.CheckUpdatesRequest{ - Download: components.BoolIntOne.ToPointer(), + Download: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -10204,6 +10283,137 @@ actions: // handle response } } + - target: $["paths"]["/user"]["get"] + update: + x-codeSamples: + - lang: go + label: PlexGO + source: |- + package main + + import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" + ) + + func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("abc123"), + plexgo.WithProduct("Plex for Roku"), + plexgo.WithVersion("2.4.1"), + plexgo.WithPlatform("Roku"), + plexgo.WithPlatformVersion("4.3 build 1057"), + plexgo.WithDevice("Roku 3"), + plexgo.WithModel("4200X"), + plexgo.WithDeviceVendor("Roku"), + plexgo.WithDeviceName("Living Room TV"), + plexgo.WithMarketplace("googlePlay"), + plexgo.WithSecurity(""), + ) + + res, err := s.Authentication.GetTokenDetails(ctx, operations.GetTokenDetailsRequest{}) + if err != nil { + log.Fatal(err) + } + if res.UserPlexAccount != nil { + // handle response + } + } + - target: $["paths"]["/users"]["get"] + update: + x-codeSamples: + - lang: go + label: PlexGO + source: |- + package main + + import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" + ) + + func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("abc123"), + plexgo.WithProduct("Plex for Roku"), + plexgo.WithVersion("2.4.1"), + plexgo.WithPlatform("Roku"), + plexgo.WithPlatformVersion("4.3 build 1057"), + plexgo.WithDevice("Roku 3"), + plexgo.WithModel("4200X"), + plexgo.WithDeviceVendor("Roku"), + plexgo.WithDeviceName("Living Room TV"), + plexgo.WithMarketplace("googlePlay"), + plexgo.WithSecurity(""), + ) + + res, err := s.Users.GetUsers(ctx, operations.GetUsersRequest{}) + if err != nil { + log.Fatal(err) + } + if res.Object != nil { + // handle response + } + } + - target: $["paths"]["/users/signin"]["post"] + update: + x-codeSamples: + - lang: go + label: PlexGO + source: |- + package main + + import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" + ) + + func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("abc123"), + plexgo.WithProduct("Plex for Roku"), + plexgo.WithVersion("2.4.1"), + plexgo.WithPlatform("Roku"), + plexgo.WithPlatformVersion("4.3 build 1057"), + plexgo.WithDevice("Roku 3"), + plexgo.WithModel("4200X"), + plexgo.WithDeviceVendor("Roku"), + plexgo.WithDeviceName("Living Room TV"), + plexgo.WithMarketplace("googlePlay"), + ) + + res, err := s.Authentication.PostUsersSignInData(ctx, operations.PostUsersSignInDataRequest{ + RequestBody: &operations.PostUsersSignInDataRequestBody{ + Login: "username@email.com", + Password: "password123", + VerificationCode: plexgo.Pointer("123456"), + }, + }) + if err != nil { + log.Fatal(err) + } + if res.UserPlexAccount != nil { + // handle response + } + } - target: $["paths"]["/{transcodeType}/:/transcode/universal/decision"]["get"] update: x-codeSamples: @@ -10243,13 +10453,13 @@ actions: AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.LocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), @@ -10359,13 +10569,13 @@ actions: AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.StartTranscodeSessionQueryParamLocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), @@ -10430,13 +10640,13 @@ actions: AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.QueryParamLocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), diff --git a/collections.go b/collections.go index a812cac..233c2c7 100644 --- a/collections.go +++ b/collections.go @@ -102,7 +102,7 @@ func (s *Collections) CreateCollection(ctx context.Context, request operations.C utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/content.go b/content.go index 19a40cc..a4f61e1 100644 --- a/content.go +++ b/content.go @@ -324,7 +324,7 @@ func (s *Content) GetMetadataItem(ctx context.Context, request operations.GetMet utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -772,7 +772,7 @@ func (s *Content) ListContent(ctx context.Context, request operations.ListConten utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1883,7 +1883,7 @@ func (s *Content) GetSonicPath(ctx context.Context, request operations.GetSonicP utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2550,7 +2550,7 @@ func (s *Content) GetSonicallySimilar(ctx context.Context, request operations.Ge utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2775,7 +2775,7 @@ func (s *Content) GetCollectionImage(ctx context.Context, request operations.Get utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/devices.go b/devices.go index 68474ee..baa14fe 100644 --- a/devices.go +++ b/devices.go @@ -137,7 +137,7 @@ func (s *Devices) GetAvailableGrabbers(ctx context.Context, request operations.G utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -571,7 +571,7 @@ func (s *Devices) AddDevice(ctx context.Context, request operations.AddDeviceReq utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1451,7 +1451,7 @@ func (s *Devices) ModifyDevice(ctx context.Context, request operations.ModifyDev utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1680,7 +1680,7 @@ func (s *Devices) SetChannelmap(ctx context.Context, request operations.SetChann utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2130,7 +2130,7 @@ func (s *Devices) SetDevicePreferences(ctx context.Context, request operations.S utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2556,7 +2556,7 @@ func (s *Devices) Scan(ctx context.Context, request operations.ScanRequest, opts utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/docs/models/components/autoselectsubtitle.md b/docs/models/components/autoselectsubtitle.md new file mode 100644 index 0000000..fbe3b55 --- /dev/null +++ b/docs/models/components/autoselectsubtitle.md @@ -0,0 +1,12 @@ +# AutoSelectSubtitle + +The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign audio, 2 = Always enabled) + + +## Values + +| Name | Value | +| ----------------------------------------- | ----------------------------------------- | +| `AutoSelectSubtitleManuallySelected` | 0 | +| `AutoSelectSubtitleShownWithForeignAudio` | 1 | +| `AutoSelectSubtitleAlwaysEnabled` | 2 | \ No newline at end of file diff --git a/docs/models/components/boolint.md b/docs/models/components/boolint.md index 3cb1a89..2c407d0 100644 --- a/docs/models/components/boolint.md +++ b/docs/models/components/boolint.md @@ -3,7 +3,7 @@ ## Values -| Name | Value | -| ------------- | ------------- | -| `BoolIntZero` | 0 | -| `BoolIntOne` | 1 | \ No newline at end of file +| Name | Value | +| -------------- | -------------- | +| `BoolIntFalse` | 0 | +| `BoolIntTrue` | 1 | \ No newline at end of file diff --git a/docs/models/components/connections.md b/docs/models/components/connections.md new file mode 100644 index 0000000..f6b57bb --- /dev/null +++ b/docs/models/components/connections.md @@ -0,0 +1,14 @@ +# Connections + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| `Protocol` | [components.PlexDeviceProtocol](../../models/components/plexdeviceprotocol.md) | :heavy_check_mark: | The protocol used for the connection (http, https, etc) | http | +| `Address` | *string* | :heavy_check_mark: | The (ip) address or domain name used for the connection | | +| `Port` | *int* | :heavy_check_mark: | The port used for the connection | | +| `URI` | *string* | :heavy_check_mark: | The full URI of the connection | | +| `Local` | *bool* | :heavy_check_mark: | If the connection is local address | | +| `Relay` | *bool* | :heavy_check_mark: | If the connection is relayed through plex.direct | | +| `IPv6` | *bool* | :heavy_check_mark: | If the connection is using IPv6 | | \ No newline at end of file diff --git a/docs/models/components/defaultaudioaccessibility.md b/docs/models/components/defaultaudioaccessibility.md new file mode 100644 index 0000000..495007b --- /dev/null +++ b/docs/models/components/defaultaudioaccessibility.md @@ -0,0 +1,13 @@ +# DefaultAudioAccessibility + +The audio accessibility mode (0 = Prefer non-accessibility audio, 1 = Prefer accessibility audio, 2 = Only show accessibility audio, 3 = Only show non-accessibility audio) + + +## Values + +| Name | Value | +| ------------------------------------------------- | ------------------------------------------------- | +| `DefaultAudioAccessibilityPreferNonAccessibility` | 0 | +| `DefaultAudioAccessibilityPreferAccessibility` | 1 | +| `DefaultAudioAccessibilityOnlyAccessibility` | 2 | +| `DefaultAudioAccessibilityOnlyNonAccessibility` | 3 | \ No newline at end of file diff --git a/docs/models/components/defaultsubtitleaccessibility.md b/docs/models/components/defaultsubtitleaccessibility.md new file mode 100644 index 0000000..9815de9 --- /dev/null +++ b/docs/models/components/defaultsubtitleaccessibility.md @@ -0,0 +1,13 @@ +# DefaultSubtitleAccessibility + +The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles) + + +## Values + +| Name | Value | +| ------------------------------------------ | ------------------------------------------ | +| `DefaultSubtitleAccessibilityPreferNonSdh` | 0 | +| `DefaultSubtitleAccessibilityPreferSdh` | 1 | +| `DefaultSubtitleAccessibilityOnlySdh` | 2 | +| `DefaultSubtitleAccessibilityOnlyNonSdh` | 3 | \ No newline at end of file diff --git a/docs/models/components/defaultsubtitleforced.md b/docs/models/components/defaultsubtitleforced.md new file mode 100644 index 0000000..8306d90 --- /dev/null +++ b/docs/models/components/defaultsubtitleforced.md @@ -0,0 +1,13 @@ +# DefaultSubtitleForced + +The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer forced subtitles, 2 = Only show forced subtitles, 3 = Only show non-forced subtitles) + + +## Values + +| Name | Value | +| -------------------------------------- | -------------------------------------- | +| `DefaultSubtitleForcedPreferNonForced` | 0 | +| `DefaultSubtitleForcedPreferForced` | 1 | +| `DefaultSubtitleForcedOnlyForced` | 2 | +| `DefaultSubtitleForcedOnlyNonForced` | 3 | \ No newline at end of file diff --git a/docs/models/components/guids.md b/docs/models/components/guids.md new file mode 100644 index 0000000..00d6170 --- /dev/null +++ b/docs/models/components/guids.md @@ -0,0 +1,8 @@ +# Guids + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://
| {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
} | \ No newline at end of file diff --git a/docs/models/components/items.md b/docs/models/components/items.md index 2071f08..33f6c9c 100644 --- a/docs/models/components/items.md +++ b/docs/models/components/items.md @@ -10,74 +10,78 @@ Metadata items can often live in a hierarchy with relationships between them. F ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Title` | *any* | :heavy_minus_sign: | The title of the item (e.g. “300” or “The Simpsons”) | -| `Type` | *any* | :heavy_minus_sign: | The type of the video item, such as `movie`, `episode`, or `clip`. | -| `AbsoluteIndex` | **int64* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | -| `AddedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was added to the library. | -| `Art` | *any* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | -| `AudienceRating` | **float64* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | -| `AudienceRatingImage` | *any* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | -| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Banner` | *any* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | -| `ChapterSource` | *any* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | -| `Composite` | *any* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | -| `ContentRating` | *any* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | -| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Duration` | **int64* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | -| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | -| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | -| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | -| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | -| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | -| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | -| `GUID` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Hero` | *any* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | -| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | -| `Index` | **int64* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | -| `Key` | *any* | :heavy_minus_sign: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | -| `LastViewedAt` | **int64* | :heavy_minus_sign: | When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. | -| `LeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | -| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | -| `OriginallyAvailableAt` | *any* | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | -| `OriginalTitle` | *any* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | -| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | -| `ParentIndex` | **int64* | :heavy_minus_sign: | The `index` of the parent | -| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | -| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | -| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | -| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | -| `PrimaryExtraKey` | *any* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | -| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | -| `Rating` | **float64* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | -| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `RatingCount` | **int64* | :heavy_minus_sign: | Number of ratings under this metadata | -| `RatingImage` | *any* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | -| `RatingKey` | *any* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | -| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | -| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | -| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | -| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | -| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Studio` | *any* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | -| `Subtype` | *any* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | -| `Summary` | *any* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | -| `Tagline` | *any* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | -| `Theme` | *any* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | -| `Thumb` | *any* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | -| `TitleSort` | *any* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | -| `UserRating` | **float64* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | -| `ViewCount` | **int64* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | -| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | -| `ViewOffset` | **int64* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | -| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Year` | **int64* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | -| `MetadataItem` | [][components.Items](../../models/components/items.md) | :heavy_minus_sign: | N/A | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Title` | *string* | :heavy_check_mark: | The title of the item (e.g. “300” or “The Simpsons”) | | +| `Type` | *string* | :heavy_check_mark: | The type of the video item, such as `movie`, `episode`, or `clip`. | | +| `AbsoluteIndex` | **int* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | | +| `AddedAt` | *int64* | :heavy_check_mark: | In units of seconds since the epoch, returns the time at which the item was added to the library. | | +| `Art` | **string* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | /library/metadata/58683/art/1703239236 | +| `AudienceRating` | **float32* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | | +| `AudienceRatingImage` | **string* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | | +| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Banner` | **string* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | | +| `ChapterSource` | **string* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | media | +| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items associated with this media item. | 1 | +| `Composite` | **string* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | | +| `ContentRating` | **string* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | | +| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Duration` | **int* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | | +| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | | +| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | | +| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | | +| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | | +| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | | +| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | | +| `GUID` | **string* | :heavy_minus_sign: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 | +| `Guids` | [][components.ItemsGuids](../../models/components/itemsguids.md) | :heavy_minus_sign: | N/A | | +| `Hero` | **string* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | | +| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | | +| `Index` | **int* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | | +| `Key` | *string* | :heavy_check_mark: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | | +| `LastViewedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `LeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | | +| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | | +| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | 2022-12-14 | +| `OriginalTitle` | **string* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | | +| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | | +| `ParentIndex` | **int* | :heavy_minus_sign: | The `index` of the parent | | +| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | | +| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | | +| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | | +| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | | +| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | | +| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | | +| `Rating` | **float32* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | | +| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `RatingCount` | **int* | :heavy_minus_sign: | Number of ratings under this metadata | | +| `RatingImage` | **string* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | | +| `RatingKey` | **string* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | | +| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | | +| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | | +| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | | +| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | | +| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Studio` | **string* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | | +| `Subtype` | **string* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | | +| `Summary` | **string* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | | +| `Tagline` | **string* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | | +| `Theme` | **string* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | /library/metadata/1/theme/1705636920 | +| `Thumb` | **string* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | /library/metadata/58683/thumb/1703239236 | +| `TitleSort` | **string* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | | +| `UserRating` | **float32* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | | +| `ViewCount` | **int* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | | +| `ViewedLeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | | +| `ViewOffset` | **int* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | | +| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Year` | **int* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | | +| `MetadataItem` | [][components.Items](../../models/components/items.md) | :heavy_minus_sign: | N/A | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/itemsguids.md b/docs/models/components/itemsguids.md new file mode 100644 index 0000000..bf0989f --- /dev/null +++ b/docs/models/components/itemsguids.md @@ -0,0 +1,8 @@ +# ItemsGuids + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://
| {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
} | \ No newline at end of file diff --git a/docs/models/components/librarysection.md b/docs/models/components/librarysection.md index d5c2950..b4a6e48 100644 --- a/docs/models/components/librarysection.md +++ b/docs/models/components/librarysection.md @@ -3,25 +3,26 @@ ## Fields -| Field | Type | Required | Description | -| ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | -| `Title` | **string* | :heavy_minus_sign: | N/A | -| `Type` | **string* | :heavy_minus_sign: | N/A | -| `Agent` | **string* | :heavy_minus_sign: | N/A | -| `AllowSync` | **bool* | :heavy_minus_sign: | N/A | -| `Art` | **string* | :heavy_minus_sign: | N/A | -| `Composite` | **string* | :heavy_minus_sign: | N/A | -| `Content` | **bool* | :heavy_minus_sign: | N/A | -| `ContentChangedAt` | **int64* | :heavy_minus_sign: | N/A | -| `CreatedAt` | **int64* | :heavy_minus_sign: | N/A | -| `Directory` | **bool* | :heavy_minus_sign: | N/A | -| `Filters` | **bool* | :heavy_minus_sign: | Indicates whether this section has filtering capabilities | -| `Hidden` | **bool* | :heavy_minus_sign: | N/A | -| `Key` | **string* | :heavy_minus_sign: | N/A | -| `Language` | **string* | :heavy_minus_sign: | N/A | -| `Location` | [][components.LibrarySectionLocation](../../models/components/librarysectionlocation.md) | :heavy_minus_sign: | N/A | -| `Refreshing` | **bool* | :heavy_minus_sign: | Indicates whether this library section is currently scanning | -| `ScannedAt` | **int64* | :heavy_minus_sign: | N/A | -| `Scanner` | **string* | :heavy_minus_sign: | N/A | -| `Thumb` | **string* | :heavy_minus_sign: | N/A | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `Title` | **string* | :heavy_minus_sign: | The title of the library | Movies | +| `Type` | [components.MediaTypeString](../../models/components/mediatypestring.md) | :heavy_check_mark: | The type of media content in the Plex library. This can represent videos, music, or photos.
| movie | +| `Agent` | **string* | :heavy_minus_sign: | N/A | | +| `AllowSync` | **bool* | :heavy_minus_sign: | N/A | | +| `Art` | **string* | :heavy_minus_sign: | N/A | | +| `Composite` | **string* | :heavy_minus_sign: | N/A | | +| `Content` | **bool* | :heavy_minus_sign: | N/A | | +| `ContentChangedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `CreatedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `Directory` | **bool* | :heavy_minus_sign: | N/A | | +| `Filters` | **bool* | :heavy_minus_sign: | Indicates whether this section has filtering capabilities | | +| `Hidden` | **bool* | :heavy_minus_sign: | N/A | | +| `Key` | **string* | :heavy_minus_sign: | N/A | | +| `Language` | *string* | :heavy_check_mark: | N/A | | +| `UUID` | *string* | :heavy_check_mark: | The universally unique identifier for the library. | e69655a2-ef48-4aba-bb19-d3cc3401e7d6 | +| `Location` | [][components.LibrarySectionLocation](../../models/components/librarysectionlocation.md) | :heavy_minus_sign: | N/A | | +| `Refreshing` | **bool* | :heavy_minus_sign: | Indicates whether this library section is currently scanning | | +| `ScannedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `Scanner` | **string* | :heavy_minus_sign: | N/A | | +| `Thumb` | **string* | :heavy_minus_sign: | N/A | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | \ No newline at end of file diff --git a/docs/models/components/mailingliststatus.md b/docs/models/components/mailingliststatus.md new file mode 100644 index 0000000..d8b575a --- /dev/null +++ b/docs/models/components/mailingliststatus.md @@ -0,0 +1,12 @@ +# MailingListStatus + +Your current mailing list status + + +## Values + +| Name | Value | +| ------------------------------- | ------------------------------- | +| `MailingListStatusActive` | active | +| `MailingListStatusUnsubscribed` | unsubscribed | +| `MailingListStatusRemoved` | removed | \ No newline at end of file diff --git a/docs/models/components/media.md b/docs/models/components/media.md index aea8bca..0c5d164 100644 --- a/docs/models/components/media.md +++ b/docs/models/components/media.md @@ -8,22 +8,22 @@ | Field | Type | Required | Description | Example | | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | -| `AspectRatio` | **float64* | :heavy_minus_sign: | N/A | 2.35 | -| `AudioChannels` | **int64* | :heavy_minus_sign: | N/A | 2 | -| `AudioCodec` | *any* | :heavy_minus_sign: | N/A | aac | -| `AudioProfile` | *any* | :heavy_minus_sign: | N/A | lc | -| `Bitrate` | **int64* | :heavy_minus_sign: | N/A | 5612 | -| `Container` | *any* | :heavy_minus_sign: | N/A | mov | -| `Duration` | **int64* | :heavy_minus_sign: | N/A | 150192 | +| `AspectRatio` | **float32* | :heavy_minus_sign: | N/A | 2.35 | +| `AudioChannels` | **int* | :heavy_minus_sign: | N/A | 2 | +| `AudioCodec` | **string* | :heavy_minus_sign: | N/A | aac | +| `AudioProfile` | **string* | :heavy_minus_sign: | N/A | lc | +| `Bitrate` | **int* | :heavy_minus_sign: | N/A | 5612 | +| `Container` | **string* | :heavy_minus_sign: | N/A | mov | +| `Duration` | **int* | :heavy_minus_sign: | N/A | 150192 | | `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false | | `HasVoiceActivity` | **bool* | :heavy_minus_sign: | N/A | true | -| `Height` | **int64* | :heavy_minus_sign: | N/A | 544 | -| `ID` | **int64* | :heavy_minus_sign: | N/A | 1 | +| `Height` | **int* | :heavy_minus_sign: | N/A | 544 | +| `ID` | *int64* | :heavy_check_mark: | N/A | 1 | | `OptimizedForStreaming` | **bool* | :heavy_minus_sign: | N/A | false | | `Part` | [][components.Part](../../models/components/part.md) | :heavy_minus_sign: | N/A | | -| `VideoCodec` | *any* | :heavy_minus_sign: | N/A | h264 | -| `VideoFrameRate` | *any* | :heavy_minus_sign: | N/A | 24p | -| `VideoProfile` | *any* | :heavy_minus_sign: | N/A | main | -| `VideoResolution` | *any* | :heavy_minus_sign: | N/A | 720 | -| `Width` | **int64* | :heavy_minus_sign: | N/A | 1280 | +| `VideoCodec` | **string* | :heavy_minus_sign: | N/A | h264 | +| `VideoFrameRate` | **string* | :heavy_minus_sign: | N/A | 24p | +| `VideoProfile` | **string* | :heavy_minus_sign: | N/A | main | +| `VideoResolution` | **string* | :heavy_minus_sign: | N/A | 720 | +| `Width` | **int* | :heavy_minus_sign: | N/A | 1280 | | `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/mediacontainerwithdecisionguids.md b/docs/models/components/mediacontainerwithdecisionguids.md new file mode 100644 index 0000000..12265f8 --- /dev/null +++ b/docs/models/components/mediacontainerwithdecisionguids.md @@ -0,0 +1,8 @@ +# MediaContainerWithDecisionGuids + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://
| {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
} | \ No newline at end of file diff --git a/docs/models/components/mediacontainerwithdecisionmedia.md b/docs/models/components/mediacontainerwithdecisionmedia.md index 7aaa78a..58a9ca7 100644 --- a/docs/models/components/mediacontainerwithdecisionmedia.md +++ b/docs/models/components/mediacontainerwithdecisionmedia.md @@ -8,24 +8,24 @@ | Field | Type | Required | Description | Example | | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | -| `AspectRatio` | **float64* | :heavy_minus_sign: | N/A | 2.35 | -| `AudioChannels` | **int64* | :heavy_minus_sign: | N/A | 2 | -| `AudioCodec` | *any* | :heavy_minus_sign: | N/A | aac | -| `AudioProfile` | *any* | :heavy_minus_sign: | N/A | lc | -| `Bitrate` | **int64* | :heavy_minus_sign: | N/A | 5612 | -| `Container` | *any* | :heavy_minus_sign: | N/A | mov | -| `Duration` | **int64* | :heavy_minus_sign: | N/A | 150192 | +| `AspectRatio` | **float32* | :heavy_minus_sign: | N/A | 2.35 | +| `AudioChannels` | **int* | :heavy_minus_sign: | N/A | 2 | +| `AudioCodec` | **string* | :heavy_minus_sign: | N/A | aac | +| `AudioProfile` | **string* | :heavy_minus_sign: | N/A | lc | +| `Bitrate` | **int* | :heavy_minus_sign: | N/A | 5612 | +| `Container` | **string* | :heavy_minus_sign: | N/A | mov | +| `Duration` | **int* | :heavy_minus_sign: | N/A | 150192 | | `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false | | `HasVoiceActivity` | **bool* | :heavy_minus_sign: | N/A | true | -| `Height` | **int64* | :heavy_minus_sign: | N/A | 544 | -| `ID` | **int64* | :heavy_minus_sign: | N/A | 1 | +| `Height` | **int* | :heavy_minus_sign: | N/A | 544 | +| `ID` | *int64* | :heavy_check_mark: | N/A | 1 | | `OptimizedForStreaming` | **bool* | :heavy_minus_sign: | N/A | false | | `Part` | [][components.MediaContainerWithDecisionPart](../../models/components/mediacontainerwithdecisionpart.md) | :heavy_minus_sign: | N/A | | -| `VideoCodec` | *any* | :heavy_minus_sign: | N/A | h264 | -| `VideoFrameRate` | *any* | :heavy_minus_sign: | N/A | 24p | -| `VideoProfile` | *any* | :heavy_minus_sign: | N/A | main | -| `VideoResolution` | *any* | :heavy_minus_sign: | N/A | 720 | -| `Width` | **int64* | :heavy_minus_sign: | N/A | 1280 | +| `VideoCodec` | **string* | :heavy_minus_sign: | N/A | h264 | +| `VideoFrameRate` | **string* | :heavy_minus_sign: | N/A | 24p | +| `VideoProfile` | **string* | :heavy_minus_sign: | N/A | main | +| `VideoResolution` | **string* | :heavy_minus_sign: | N/A | 720 | +| `Width` | **int* | :heavy_minus_sign: | N/A | 1280 | | `Abr` | **bool* | :heavy_minus_sign: | N/A | | | `ResourceSession` | **string* | :heavy_minus_sign: | N/A | | | `Selected` | **bool* | :heavy_minus_sign: | N/A | | diff --git a/docs/models/components/mediacontainerwithdecisionmetadata.md b/docs/models/components/mediacontainerwithdecisionmetadata.md index c2d81fb..70d5b7e 100644 --- a/docs/models/components/mediacontainerwithdecisionmetadata.md +++ b/docs/models/components/mediacontainerwithdecisionmetadata.md @@ -10,73 +10,77 @@ Metadata items can often live in a hierarchy with relationships between them. F ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Title` | *any* | :heavy_minus_sign: | The title of the item (e.g. “300” or “The Simpsons”) | -| `Type` | *any* | :heavy_minus_sign: | The type of the video item, such as `movie`, `episode`, or `clip`. | -| `AbsoluteIndex` | **int64* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | -| `AddedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was added to the library. | -| `Art` | *any* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | -| `AudienceRating` | **float64* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | -| `AudienceRatingImage` | *any* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | -| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Banner` | *any* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | -| `ChapterSource` | *any* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | -| `Composite` | *any* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | -| `ContentRating` | *any* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | -| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Duration` | **int64* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | -| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | -| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | -| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | -| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | -| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | -| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | -| `GUID` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Hero` | *any* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | -| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | -| `Index` | **int64* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | -| `Key` | *any* | :heavy_minus_sign: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | -| `LastViewedAt` | **int64* | :heavy_minus_sign: | When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. | -| `LeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | -| `Media` | [][components.MediaContainerWithDecisionMedia](../../models/components/mediacontainerwithdecisionmedia.md) | :heavy_minus_sign: | N/A | -| `OriginallyAvailableAt` | *any* | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | -| `OriginalTitle` | *any* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | -| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | -| `ParentIndex` | **int64* | :heavy_minus_sign: | The `index` of the parent | -| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | -| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | -| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | -| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | -| `PrimaryExtraKey` | *any* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | -| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | -| `Rating` | **float64* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | -| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `RatingCount` | **int64* | :heavy_minus_sign: | Number of ratings under this metadata | -| `RatingImage` | *any* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | -| `RatingKey` | *any* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | -| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | -| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | -| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | -| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | -| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Studio` | *any* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | -| `Subtype` | *any* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | -| `Summary` | *any* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | -| `Tagline` | *any* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | -| `Theme` | *any* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | -| `Thumb` | *any* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | -| `TitleSort` | *any* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | -| `UserRating` | **float64* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | -| `ViewCount` | **int64* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | -| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | -| `ViewOffset` | **int64* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | -| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Year` | **int64* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Title` | *string* | :heavy_check_mark: | The title of the item (e.g. “300” or “The Simpsons”) | | +| `Type` | *string* | :heavy_check_mark: | The type of the video item, such as `movie`, `episode`, or `clip`. | | +| `AbsoluteIndex` | **int* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | | +| `AddedAt` | *int64* | :heavy_check_mark: | In units of seconds since the epoch, returns the time at which the item was added to the library. | | +| `Art` | **string* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | /library/metadata/58683/art/1703239236 | +| `AudienceRating` | **float32* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | | +| `AudienceRatingImage` | **string* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | | +| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Banner` | **string* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | | +| `ChapterSource` | **string* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | media | +| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items associated with this media item. | 1 | +| `Composite` | **string* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | | +| `ContentRating` | **string* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | | +| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Duration` | **int* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | | +| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | | +| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | | +| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | | +| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | | +| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | | +| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | | +| `GUID` | **string* | :heavy_minus_sign: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 | +| `Guids` | [][components.MediaContainerWithDecisionGuids](../../models/components/mediacontainerwithdecisionguids.md) | :heavy_minus_sign: | N/A | | +| `Hero` | **string* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | | +| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | | +| `Index` | **int* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | | +| `Key` | *string* | :heavy_check_mark: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | | +| `LastViewedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `LeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | | +| `Media` | [][components.MediaContainerWithDecisionMedia](../../models/components/mediacontainerwithdecisionmedia.md) | :heavy_minus_sign: | N/A | | +| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | 2022-12-14 | +| `OriginalTitle` | **string* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | | +| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | | +| `ParentIndex` | **int* | :heavy_minus_sign: | The `index` of the parent | | +| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | | +| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | | +| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | | +| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | | +| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | | +| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | | +| `Rating` | **float32* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | | +| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `RatingCount` | **int* | :heavy_minus_sign: | Number of ratings under this metadata | | +| `RatingImage` | **string* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | | +| `RatingKey` | **string* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | | +| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | | +| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | | +| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | | +| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | | +| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Studio` | **string* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | | +| `Subtype` | **string* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | | +| `Summary` | **string* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | | +| `Tagline` | **string* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | | +| `Theme` | **string* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | /library/metadata/1/theme/1705636920 | +| `Thumb` | **string* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | /library/metadata/58683/thumb/1703239236 | +| `TitleSort` | **string* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | | +| `UserRating` | **float32* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | | +| `ViewCount` | **int* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | | +| `ViewedLeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | | +| `ViewOffset` | **int* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | | +| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Year` | **int* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/mediacontainerwithdecisionpart.md b/docs/models/components/mediacontainerwithdecisionpart.md index f33ff5e..24ee134 100644 --- a/docs/models/components/mediacontainerwithdecisionpart.md +++ b/docs/models/components/mediacontainerwithdecisionpart.md @@ -8,17 +8,20 @@ | Field | Type | Required | Description | Example | | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------ | -| `AudioProfile` | *any* | :heavy_minus_sign: | N/A | lc | -| `Container` | *any* | :heavy_minus_sign: | The container of the media file, such as `mp4` or `mkv` | mov | -| `Duration` | **int64* | :heavy_minus_sign: | The duration of the media item, in milliseconds | 150192 | -| `File` | *any* | :heavy_minus_sign: | The local file path at which the part is stored on the server | /home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov | +| `Accessible` | **bool* | :heavy_minus_sign: | Indicates if the part is accessible. | true | +| `AudioProfile` | **string* | :heavy_minus_sign: | N/A | lc | +| `Container` | **string* | :heavy_minus_sign: | The container of the media file, such as `mp4` or `mkv` | mov | +| `Duration` | **int* | :heavy_minus_sign: | The duration of the media item, in milliseconds | 150192 | +| `Exists` | **bool* | :heavy_minus_sign: | Indicates if the part exists. | true | +| `File` | **string* | :heavy_minus_sign: | The local file path at which the part is stored on the server | /home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov | | `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false | -| `ID` | **int64* | :heavy_minus_sign: | N/A | 1 | -| `Key` | *any* | :heavy_minus_sign: | The key from which the media can be streamed | /library/parts/1/1531779263/file.mov | +| `ID` | *int64* | :heavy_check_mark: | N/A | 1 | +| `Indexes` | **string* | :heavy_minus_sign: | N/A | sd | +| `Key` | *string* | :heavy_check_mark: | The key from which the media can be streamed | /library/parts/1/1531779263/file.mov | | `OptimizedForStreaming` | **bool* | :heavy_minus_sign: | N/A | false | | `Size` | **int64* | :heavy_minus_sign: | The size of the media, in bytes | 105355654 | | `Stream` | [][components.MediaContainerWithDecisionStream](../../models/components/mediacontainerwithdecisionstream.md) | :heavy_minus_sign: | N/A | | -| `VideoProfile` | *any* | :heavy_minus_sign: | N/A | main | +| `VideoProfile` | **string* | :heavy_minus_sign: | N/A | main | | `Decision` | [*components.Decision](../../models/components/decision.md) | :heavy_minus_sign: | N/A | | | `Selected` | **bool* | :heavy_minus_sign: | N/A | | | `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/mediacontainerwithdecisionstream.md b/docs/models/components/mediacontainerwithdecisionstream.md index 9e61e28..fa45dfc 100644 --- a/docs/models/components/mediacontainerwithdecisionstream.md +++ b/docs/models/components/mediacontainerwithdecisionstream.md @@ -6,37 +6,60 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | -| `Default` | **bool* | :heavy_minus_sign: | N/A | true | -| `AudioChannelLayout` | *any* | :heavy_minus_sign: | N/A | stereo | -| `BitDepth` | **int64* | :heavy_minus_sign: | N/A | 8 | -| `Bitrate` | **int64* | :heavy_minus_sign: | N/A | 5466 | -| `CanAutoSync` | **bool* | :heavy_minus_sign: | For subtitle streams only. If `true` then the server can attempt to automatically sync the subtitle timestamps with the video. | true | -| `ChromaLocation` | *any* | :heavy_minus_sign: | N/A | topleft | -| `ChromaSubsampling` | *any* | :heavy_minus_sign: | N/A | 4:2:0 | -| `Codec` | *any* | :heavy_minus_sign: | The codec of the stream, such as `h264` or `aac` | h264 | -| `ColorPrimaries` | *any* | :heavy_minus_sign: | N/A | bt709 | -| `ColorRange` | *any* | :heavy_minus_sign: | N/A | tv | -| `ColorSpace` | *any* | :heavy_minus_sign: | N/A | bt709 | -| `ColorTrc` | *any* | :heavy_minus_sign: | N/A | bt709 | -| `DisplayTitle` | *any* | :heavy_minus_sign: | A friendly name for the stream, often comprised of the language and codec information | English (H.264 Main) | -| `FrameRate` | **float64* | :heavy_minus_sign: | N/A | 23.976 | -| `HasScalingMatrix` | *any* | :heavy_minus_sign: | N/A | false | -| `Height` | **int64* | :heavy_minus_sign: | N/A | 544 | -| `ID` | **int64* | :heavy_minus_sign: | N/A | 1 | -| `Index` | **int64* | :heavy_minus_sign: | If the stream is part of the `Part` and not an external resource, the index of the stream within that part | 0 | -| `Key` | *any* | :heavy_minus_sign: | If the stream is independently streamable, the key from which it can be streamed | /library/streams/1 | -| `Language` | *any* | :heavy_minus_sign: | N/A | English | -| `LanguageCode` | *any* | :heavy_minus_sign: | The three character language code for the stream contents | eng | -| `Level` | **int64* | :heavy_minus_sign: | N/A | 31 | -| `Profile` | *any* | :heavy_minus_sign: | N/A | main | -| `RefFrames` | **int64* | :heavy_minus_sign: | N/A | 2 | -| `SamplingRate` | **int64* | :heavy_minus_sign: | N/A | 48000 | -| `Selected` | **bool* | :heavy_minus_sign: | N/A | | -| `StreamIdentifier` | **int64* | :heavy_minus_sign: | N/A | 1 | -| `StreamType` | **int64* | :heavy_minus_sign: | A number indicating the type of the stream. `1` for video, `2` for audio, `3` for subtitles, `4` for lyrics | 1 | -| `Width` | **int64* | :heavy_minus_sign: | N/A | 1280 | -| `Decision` | [*components.MediaContainerWithDecisionDecision](../../models/components/mediacontainerwithdecisiondecision.md) | :heavy_minus_sign: | N/A | | -| `Location` | [*components.MediaContainerWithDecisionLocation](../../models/components/mediacontainerwithdecisionlocation.md) | :heavy_minus_sign: | N/A | | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | +| `Default` | **bool* | :heavy_minus_sign: | Indicates if this stream is default. | true | +| `AudioChannelLayout` | **string* | :heavy_minus_sign: | Audio channel layout. | 5.1(side) | +| `Channels` | **int* | :heavy_minus_sign: | Number of audio channels (for audio streams). | 6 | +| `BitDepth` | **int* | :heavy_minus_sign: | Bit depth of the video stream. | 10 | +| `DOVIBLCompatID` | **int* | :heavy_minus_sign: | Dolby Vision BL compatibility ID. | 1 | +| `DOVIBLPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision BL is present. | true | +| `DOVIELPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision EL is present. | false | +| `DOVILevel` | **int* | :heavy_minus_sign: | Dolby Vision level. | 6 | +| `DOVIPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision is present. | true | +| `DOVIProfile` | **int* | :heavy_minus_sign: | Dolby Vision profile. | 8 | +| `DOVIRPUPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision RPU is present. | true | +| `DOVIVersion` | **string* | :heavy_minus_sign: | Dolby Vision version. | 1.0 | +| `Bitrate` | **int* | :heavy_minus_sign: | Bitrate of the stream. | 24743 | +| `CanAutoSync` | **bool* | :heavy_minus_sign: | Indicates if the stream can auto-sync. | false | +| `ChromaLocation` | **string* | :heavy_minus_sign: | Chroma sample location. | topleft | +| `ChromaSubsampling` | **string* | :heavy_minus_sign: | Chroma subsampling format. | 4:2:0 | +| `CodedHeight` | **int* | :heavy_minus_sign: | Coded video height. | 1608 | +| `CodedWidth` | **int* | :heavy_minus_sign: | Coded video width. | 3840 | +| `ClosedCaptions` | **bool* | :heavy_minus_sign: | N/A | true | +| `Codec` | *string* | :heavy_check_mark: | Codec used by the stream. | hevc | +| `ColorPrimaries` | **string* | :heavy_minus_sign: | Color primaries used. | bt2020 | +| `ColorRange` | **string* | :heavy_minus_sign: | Color range (e.g., tv). | tv | +| `ColorSpace` | **string* | :heavy_minus_sign: | Color space. | bt2020nc | +| `ColorTrc` | **string* | :heavy_minus_sign: | Color transfer characteristics. | smpte2084 | +| `DisplayTitle` | *string* | :heavy_check_mark: | Display title for the stream. | 4K DoVi/HDR10 (HEVC Main 10) | +| `ExtendedDisplayTitle` | **string* | :heavy_minus_sign: | Extended display title for the stream. | 4K DoVi/HDR10 (HEVC Main 10) | +| `FrameRate` | **float32* | :heavy_minus_sign: | Frame rate of the stream. | 23.976 | +| `HasScalingMatrix` | **bool* | :heavy_minus_sign: | N/A | false | +| `Height` | **int* | :heavy_minus_sign: | Height of the video stream. | 1602 | +| `ID` | *int* | :heavy_check_mark: | Unique stream identifier. | 1002625 | +| `Index` | **int* | :heavy_minus_sign: | Index of the stream. | 0 | +| `Key` | *string* | :heavy_check_mark: | Key to access this stream part. | /library/streams/216389 | +| `Language` | **string* | :heavy_minus_sign: | Language of the stream. | English | +| `LanguageCode` | **string* | :heavy_minus_sign: | ISO language code. | eng | +| `LanguageTag` | **string* | :heavy_minus_sign: | Language tag (e.g., en). | en | +| `Format` | **string* | :heavy_minus_sign: | Format of the stream (e.g., srt). | srt | +| `HeaderCompression` | **bool* | :heavy_minus_sign: | Indicates whether header compression is enabled. | true | +| `Level` | **int* | :heavy_minus_sign: | Video level. | 150 | +| `Original` | **bool* | :heavy_minus_sign: | Indicates if this is the original stream. | true | +| `Profile` | **string* | :heavy_minus_sign: | Video profile. | main 10 | +| `RefFrames` | **int* | :heavy_minus_sign: | Number of reference frames. | 1 | +| `SamplingRate` | **int* | :heavy_minus_sign: | Sampling rate for the audio stream. | 48000 | +| `ScanType` | **string* | :heavy_minus_sign: | N/A | progressive | +| `EmbeddedInVideo` | **string* | :heavy_minus_sign: | N/A | progressive | +| `Selected` | **bool* | :heavy_minus_sign: | Indicates if this stream is selected (applicable for audio streams). | true | +| `Forced` | **bool* | :heavy_minus_sign: | N/A | true | +| `HearingImpaired` | **bool* | :heavy_minus_sign: | Indicates if the stream is for the hearing impaired. | true | +| `Dub` | **bool* | :heavy_minus_sign: | Indicates if the stream is a dub. | true | +| `Title` | **string* | :heavy_minus_sign: | Optional title for the stream (e.g., language variant). | SDH | +| `StreamIdentifier` | **int* | :heavy_minus_sign: | N/A | 1 | +| `StreamType` | *int64* | :heavy_check_mark: | Stream type:
- VIDEO = 1
- AUDIO = 2
- SUBTITLE = 3
| | +| `Width` | **int* | :heavy_minus_sign: | Width of the video stream. | 3840 | +| `Decision` | [*components.MediaContainerWithDecisionDecision](../../models/components/mediacontainerwithdecisiondecision.md) | :heavy_minus_sign: | N/A | | +| `Location` | [*components.MediaContainerWithDecisionLocation](../../models/components/mediacontainerwithdecisionlocation.md) | :heavy_minus_sign: | N/A | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/mediacontainerwithnestedmetadataguids.md b/docs/models/components/mediacontainerwithnestedmetadataguids.md new file mode 100644 index 0000000..de098ab --- /dev/null +++ b/docs/models/components/mediacontainerwithnestedmetadataguids.md @@ -0,0 +1,8 @@ +# MediaContainerWithNestedMetadataGuids + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://
| {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
} | \ No newline at end of file diff --git a/docs/models/components/mediacontainerwithplaylistmetadataguids.md b/docs/models/components/mediacontainerwithplaylistmetadataguids.md new file mode 100644 index 0000000..842b907 --- /dev/null +++ b/docs/models/components/mediacontainerwithplaylistmetadataguids.md @@ -0,0 +1,8 @@ +# MediaContainerWithPlaylistMetadataGuids + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://
| {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
} | \ No newline at end of file diff --git a/docs/models/components/mediacontainerwithplaylistmetadatametadata.md b/docs/models/components/mediacontainerwithplaylistmetadatametadata.md index 02bf15f..bb15a65 100644 --- a/docs/models/components/mediacontainerwithplaylistmetadatametadata.md +++ b/docs/models/components/mediacontainerwithplaylistmetadatametadata.md @@ -10,77 +10,81 @@ Metadata items can often live in a hierarchy with relationships between them. F ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ReadOnly` | **bool* | :heavy_minus_sign: | If we return this as true then this playlist cannot be altered or deleted directly by the client. | -| `Composite` | *any* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | -| `Duration` | **int64* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | -| `Key` | *any* | :heavy_minus_sign: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | -| `LeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | -| `PlaylistType` | [*components.PlaylistType](../../models/components/playlisttype.md) | :heavy_minus_sign: | The type of the playlist. | -| `Smart` | **bool* | :heavy_minus_sign: | Whether or not the playlist is smart. | -| `SpecialPlaylistType` | **string* | :heavy_minus_sign: | If this is a special playlist, this returns its type (e.g. favorites). | -| `Title` | *any* | :heavy_minus_sign: | The title of the item (e.g. “300” or “The Simpsons”) | -| `Type` | *any* | :heavy_minus_sign: | The type of the video item, such as `movie`, `episode`, or `clip`. | -| `AbsoluteIndex` | **int64* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | -| `AddedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was added to the library. | -| `Art` | *any* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | -| `AudienceRating` | **float64* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | -| `AudienceRatingImage` | *any* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | -| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Banner` | *any* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | -| `ChapterSource` | *any* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | -| `ContentRating` | *any* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | -| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | -| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | -| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | -| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | -| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | -| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | -| `GUID` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Hero` | *any* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | -| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | -| `Index` | **int64* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | -| `LastViewedAt` | **int64* | :heavy_minus_sign: | When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. | -| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | -| `OriginallyAvailableAt` | *any* | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | -| `OriginalTitle` | *any* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | -| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | -| `ParentIndex` | **int64* | :heavy_minus_sign: | The `index` of the parent | -| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | -| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | -| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | -| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | -| `PrimaryExtraKey` | *any* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | -| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | -| `Rating` | **float64* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | -| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `RatingCount` | **int64* | :heavy_minus_sign: | Number of ratings under this metadata | -| `RatingImage` | *any* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | -| `RatingKey` | *any* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | -| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | -| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | -| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | -| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | -| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Studio` | *any* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | -| `Subtype` | *any* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | -| `Summary` | *any* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | -| `Tagline` | *any* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | -| `Theme` | *any* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | -| `Thumb` | *any* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | -| `TitleSort` | *any* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | -| `UserRating` | **float64* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | -| `ViewCount` | **int64* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | -| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | -| `ViewOffset` | **int64* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | -| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Year` | **int64* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ReadOnly` | **bool* | :heavy_minus_sign: | If we return this as true then this playlist cannot be altered or deleted directly by the client. | | +| `Composite` | **string* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | | +| `Duration` | **int* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | | +| `Key` | *string* | :heavy_check_mark: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | | +| `LeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | | +| `PlaylistType` | [*components.PlaylistType](../../models/components/playlisttype.md) | :heavy_minus_sign: | The type of the playlist. | | +| `Smart` | **bool* | :heavy_minus_sign: | Whether or not the playlist is smart. | | +| `SpecialPlaylistType` | **string* | :heavy_minus_sign: | If this is a special playlist, this returns its type (e.g. favorites). | | +| `Title` | *string* | :heavy_check_mark: | The title of the item (e.g. “300” or “The Simpsons”) | | +| `Type` | *string* | :heavy_check_mark: | The type of the video item, such as `movie`, `episode`, or `clip`. | | +| `AbsoluteIndex` | **int* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | | +| `AddedAt` | *int64* | :heavy_check_mark: | In units of seconds since the epoch, returns the time at which the item was added to the library. | | +| `Art` | **string* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | /library/metadata/58683/art/1703239236 | +| `AudienceRating` | **float32* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | | +| `AudienceRatingImage` | **string* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | | +| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Banner` | **string* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | | +| `ChapterSource` | **string* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | media | +| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items associated with this media item. | 1 | +| `ContentRating` | **string* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | | +| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | | +| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | | +| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | | +| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | | +| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | | +| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | | +| `GUID` | **string* | :heavy_minus_sign: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 | +| `Guids` | [][components.MediaContainerWithPlaylistMetadataGuids](../../models/components/mediacontainerwithplaylistmetadataguids.md) | :heavy_minus_sign: | N/A | | +| `Hero` | **string* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | | +| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | | +| `Index` | **int* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | | +| `LastViewedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | | +| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | 2022-12-14 | +| `OriginalTitle` | **string* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | | +| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | | +| `ParentIndex` | **int* | :heavy_minus_sign: | The `index` of the parent | | +| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | | +| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | | +| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | | +| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | | +| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | | +| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | | +| `Rating` | **float32* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | | +| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `RatingCount` | **int* | :heavy_minus_sign: | Number of ratings under this metadata | | +| `RatingImage` | **string* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | | +| `RatingKey` | **string* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | | +| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | | +| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | | +| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | | +| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | | +| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Studio` | **string* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | | +| `Subtype` | **string* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | | +| `Summary` | **string* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | | +| `Tagline` | **string* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | | +| `Theme` | **string* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | /library/metadata/1/theme/1705636920 | +| `Thumb` | **string* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | /library/metadata/58683/thumb/1703239236 | +| `TitleSort` | **string* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | | +| `UserRating` | **float32* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | | +| `ViewCount` | **int* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | | +| `ViewedLeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | | +| `ViewOffset` | **int* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | | +| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Year` | **int* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/mediaquery.md b/docs/models/components/mediaquery.md index 72cbb9c..5037595 100644 --- a/docs/models/components/mediaquery.md +++ b/docs/models/components/mediaquery.md @@ -1,7 +1,17 @@ # MediaQuery +A querystring-based filtering language used to select subsets of media. When provided as an object, properties are serialized as a querystring using form style with explode. + +Only the defined properties below are allowed. The object serializes to a querystring format like: `type=4&sourceType=2&sort=duration:desc,index` + + ## Fields -| Field | Type | Required | Description | -| ----------- | ----------- | ----------- | ----------- | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Type` | [*components.MediaType](../../models/components/mediatype.md) | :heavy_minus_sign: | The type of media to retrieve or filter by.

1 = movie
2 = show
3 = season
4 = episode
5 = artist
6 = album
7 = track
8 = photo_album
9 = photo

E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
| 2 | +| `SourceType` | **int64* | :heavy_minus_sign: | Change the default level to which fields refer (used with type for hierarchical queries) | | +| `Sort` | **string* | :heavy_minus_sign: | Field(s) to sort by, with optional modifiers. Use comma to separate multiple fields, and :desc or :nullsLast for modifiers (e.g., "duration:desc,index") | | +| `Group` | **string* | :heavy_minus_sign: | Field to group results by (similar to SQL GROUP BY) | | +| `Limit` | **int64* | :heavy_minus_sign: | Maximum number of results to return | | \ No newline at end of file diff --git a/docs/models/components/mediareviewsvisibility.md b/docs/models/components/mediareviewsvisibility.md new file mode 100644 index 0000000..a6849e1 --- /dev/null +++ b/docs/models/components/mediareviewsvisibility.md @@ -0,0 +1,13 @@ +# MediaReviewsVisibility + +Whether or not the account has media reviews visibility enabled + + +## Values + +| Name | Value | +| ------------------------------------------- | ------------------------------------------- | +| `MediaReviewsVisibilityNoOne` | 0 | +| `MediaReviewsVisibilityCriticsOnly` | 1 | +| `MediaReviewsVisibilityPlexUsersOnly` | 2 | +| `MediaReviewsVisibilityPlexUsersAndCritics` | 3 | \ No newline at end of file diff --git a/docs/models/components/mediatype.md b/docs/models/components/mediatype.md new file mode 100644 index 0000000..e957105 --- /dev/null +++ b/docs/models/components/mediatype.md @@ -0,0 +1,31 @@ +# MediaType + +The type of media to retrieve or filter by. + +1 = movie +2 = show +3 = season +4 = episode +5 = artist +6 = album +7 = track +8 = photo_album +9 = photo + +E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries + + + +## Values + +| Name | Value | +| --------------------- | --------------------- | +| `MediaTypeMovie` | 1 | +| `MediaTypeTvShow` | 2 | +| `MediaTypeSeason` | 3 | +| `MediaTypeEpisode` | 4 | +| `MediaTypeArtist` | 5 | +| `MediaTypeAlbum` | 6 | +| `MediaTypeTrack` | 7 | +| `MediaTypePhotoAlbum` | 8 | +| `MediaTypePhoto` | 9 | \ No newline at end of file diff --git a/docs/models/components/mediatypestring.md b/docs/models/components/mediatypestring.md new file mode 100644 index 0000000..e5649c2 --- /dev/null +++ b/docs/models/components/mediatypestring.md @@ -0,0 +1,20 @@ +# MediaTypeString + +The type of media content in the Plex library. This can represent videos, music, or photos. + + + +## Values + +| Name | Value | +| --------------------------- | --------------------------- | +| `MediaTypeStringMovie` | movie | +| `MediaTypeStringTvShow` | show | +| `MediaTypeStringSeason` | season | +| `MediaTypeStringEpisode` | episode | +| `MediaTypeStringArtist` | artist | +| `MediaTypeStringAlbum` | album | +| `MediaTypeStringTrack` | track | +| `MediaTypeStringPhotoAlbum` | photoalbum | +| `MediaTypeStringPhoto` | photo | +| `MediaTypeStringCollection` | collection | \ No newline at end of file diff --git a/docs/models/components/metadata.md b/docs/models/components/metadata.md index a175d74..aac5771 100644 --- a/docs/models/components/metadata.md +++ b/docs/models/components/metadata.md @@ -10,73 +10,77 @@ Metadata items can often live in a hierarchy with relationships between them. F ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Title` | *any* | :heavy_minus_sign: | The title of the item (e.g. “300” or “The Simpsons”) | -| `Type` | *any* | :heavy_minus_sign: | The type of the video item, such as `movie`, `episode`, or `clip`. | -| `AbsoluteIndex` | **int64* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | -| `AddedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was added to the library. | -| `Art` | *any* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | -| `AudienceRating` | **float64* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | -| `AudienceRatingImage` | *any* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | -| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Banner` | *any* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | -| `ChapterSource` | *any* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | -| `Composite` | *any* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | -| `ContentRating` | *any* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | -| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Duration` | **int64* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | -| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | -| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | -| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | -| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | -| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | -| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | -| `GUID` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Hero` | *any* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | -| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | -| `Index` | **int64* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | -| `Key` | *any* | :heavy_minus_sign: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | -| `LastViewedAt` | **int64* | :heavy_minus_sign: | When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. | -| `LeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | -| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | -| `OriginallyAvailableAt` | *any* | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | -| `OriginalTitle` | *any* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | -| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | -| `ParentIndex` | **int64* | :heavy_minus_sign: | The `index` of the parent | -| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | -| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | -| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | -| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | -| `PrimaryExtraKey` | *any* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | -| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | -| `Rating` | **float64* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | -| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `RatingCount` | **int64* | :heavy_minus_sign: | Number of ratings under this metadata | -| `RatingImage` | *any* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | -| `RatingKey` | *any* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | -| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | -| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | -| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | -| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | -| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Studio` | *any* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | -| `Subtype` | *any* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | -| `Summary` | *any* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | -| `Tagline` | *any* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | -| `Theme` | *any* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | -| `Thumb` | *any* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | -| `TitleSort` | *any* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | -| `UserRating` | **float64* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | -| `ViewCount` | **int64* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | -| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | -| `ViewOffset` | **int64* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | -| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Year` | **int64* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Title` | *string* | :heavy_check_mark: | The title of the item (e.g. “300” or “The Simpsons”) | | +| `Type` | *string* | :heavy_check_mark: | The type of the video item, such as `movie`, `episode`, or `clip`. | | +| `AbsoluteIndex` | **int* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | | +| `AddedAt` | *int64* | :heavy_check_mark: | In units of seconds since the epoch, returns the time at which the item was added to the library. | | +| `Art` | **string* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | /library/metadata/58683/art/1703239236 | +| `AudienceRating` | **float32* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | | +| `AudienceRatingImage` | **string* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | | +| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Banner` | **string* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | | +| `ChapterSource` | **string* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | media | +| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items associated with this media item. | 1 | +| `Composite` | **string* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | | +| `ContentRating` | **string* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | | +| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Duration` | **int* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | | +| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | | +| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | | +| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | | +| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | | +| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | | +| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | | +| `GUID` | **string* | :heavy_minus_sign: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 | +| `Guids` | [][components.Guids](../../models/components/guids.md) | :heavy_minus_sign: | N/A | | +| `Hero` | **string* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | | +| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | | +| `Index` | **int* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | | +| `Key` | *string* | :heavy_check_mark: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | | +| `LastViewedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `LeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | | +| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | | +| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | 2022-12-14 | +| `OriginalTitle` | **string* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | | +| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | | +| `ParentIndex` | **int* | :heavy_minus_sign: | The `index` of the parent | | +| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | | +| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | | +| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | | +| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | | +| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | | +| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | | +| `Rating` | **float32* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | | +| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `RatingCount` | **int* | :heavy_minus_sign: | Number of ratings under this metadata | | +| `RatingImage` | **string* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | | +| `RatingKey` | **string* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | | +| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | | +| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | | +| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | | +| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | | +| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Studio` | **string* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | | +| `Subtype` | **string* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | | +| `Summary` | **string* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | | +| `Tagline` | **string* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | | +| `Theme` | **string* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | /library/metadata/1/theme/1705636920 | +| `Thumb` | **string* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | /library/metadata/58683/thumb/1703239236 | +| `TitleSort` | **string* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | | +| `UserRating` | **float32* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | | +| `ViewCount` | **int* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | | +| `ViewedLeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | | +| `ViewOffset` | **int* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | | +| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Year` | **int* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/metadataitem.md b/docs/models/components/metadataitem.md index 0d5d0fc..91164f3 100644 --- a/docs/models/components/metadataitem.md +++ b/docs/models/components/metadataitem.md @@ -10,74 +10,78 @@ Metadata items can often live in a hierarchy with relationships between them. F ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Title` | *any* | :heavy_minus_sign: | The title of the item (e.g. “300” or “The Simpsons”) | -| `Type` | *any* | :heavy_minus_sign: | The type of the video item, such as `movie`, `episode`, or `clip`. | -| `AbsoluteIndex` | **int64* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | -| `AddedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was added to the library. | -| `Art` | *any* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | -| `AudienceRating` | **float64* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | -| `AudienceRatingImage` | *any* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | -| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Banner` | *any* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | -| `ChapterSource` | *any* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | -| `Composite` | *any* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | -| `ContentRating` | *any* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | -| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Duration` | **int64* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | -| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | -| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | -| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | -| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | -| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | -| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | -| `GUID` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Hero` | *any* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | -| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | -| `Index` | **int64* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | -| `Key` | *any* | :heavy_minus_sign: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | -| `LastViewedAt` | **int64* | :heavy_minus_sign: | When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. | -| `LeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | -| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | -| `OriginallyAvailableAt` | *any* | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | -| `OriginalTitle` | *any* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | -| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | -| `ParentIndex` | **int64* | :heavy_minus_sign: | The `index` of the parent | -| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | -| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | -| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | -| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | -| `PrimaryExtraKey` | *any* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | -| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | -| `Rating` | **float64* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | -| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `RatingCount` | **int64* | :heavy_minus_sign: | Number of ratings under this metadata | -| `RatingImage` | *any* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | -| `RatingKey` | *any* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | -| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | -| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | -| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | -| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | -| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Studio` | *any* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | -| `Subtype` | *any* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | -| `Summary` | *any* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | -| `Tagline` | *any* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | -| `Theme` | *any* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | -| `Thumb` | *any* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | -| `TitleSort` | *any* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | -| `UserRating` | **float64* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | -| `ViewCount` | **int64* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | -| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | -| `ViewOffset` | **int64* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | -| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Year` | **int64* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | -| `MetadataItem` | [][components.Items](../../models/components/items.md) | :heavy_minus_sign: | N/A | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Title` | *string* | :heavy_check_mark: | The title of the item (e.g. “300” or “The Simpsons”) | | +| `Type` | *string* | :heavy_check_mark: | The type of the video item, such as `movie`, `episode`, or `clip`. | | +| `AbsoluteIndex` | **int* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | | +| `AddedAt` | *int64* | :heavy_check_mark: | In units of seconds since the epoch, returns the time at which the item was added to the library. | | +| `Art` | **string* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | /library/metadata/58683/art/1703239236 | +| `AudienceRating` | **float32* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | | +| `AudienceRatingImage` | **string* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | | +| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Banner` | **string* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | | +| `ChapterSource` | **string* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | media | +| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items associated with this media item. | 1 | +| `Composite` | **string* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | | +| `ContentRating` | **string* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | | +| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Duration` | **int* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | | +| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | | +| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | | +| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | | +| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | | +| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | | +| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | | +| `GUID` | **string* | :heavy_minus_sign: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 | +| `Guids` | [][components.MediaContainerWithNestedMetadataGuids](../../models/components/mediacontainerwithnestedmetadataguids.md) | :heavy_minus_sign: | N/A | | +| `Hero` | **string* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | | +| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | | +| `Index` | **int* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | | +| `Key` | *string* | :heavy_check_mark: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | | +| `LastViewedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `LeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | | +| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | | +| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | 2022-12-14 | +| `OriginalTitle` | **string* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | | +| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | | +| `ParentIndex` | **int* | :heavy_minus_sign: | The `index` of the parent | | +| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | | +| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | | +| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | | +| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | | +| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | | +| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | | +| `Rating` | **float32* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | | +| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `RatingCount` | **int* | :heavy_minus_sign: | Number of ratings under this metadata | | +| `RatingImage` | **string* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | | +| `RatingKey` | **string* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | | +| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | | +| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | | +| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | | +| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | | +| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Studio` | **string* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | | +| `Subtype` | **string* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | | +| `Summary` | **string* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | | +| `Tagline` | **string* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | | +| `Theme` | **string* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | /library/metadata/1/theme/1705636920 | +| `Thumb` | **string* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | /library/metadata/58683/thumb/1703239236 | +| `TitleSort` | **string* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | | +| `UserRating` | **float32* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | | +| `ViewCount` | **int* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | | +| `ViewedLeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | | +| `ViewOffset` | **int* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | | +| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Year` | **int* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | | +| `MetadataItem` | [][components.Items](../../models/components/items.md) | :heavy_minus_sign: | N/A | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/part.md b/docs/models/components/part.md index 0e12cda..23a9189 100644 --- a/docs/models/components/part.md +++ b/docs/models/components/part.md @@ -8,15 +8,18 @@ | Field | Type | Required | Description | Example | | ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | ------------------------------------------------------------- | -| `AudioProfile` | *any* | :heavy_minus_sign: | N/A | lc | -| `Container` | *any* | :heavy_minus_sign: | The container of the media file, such as `mp4` or `mkv` | mov | -| `Duration` | **int64* | :heavy_minus_sign: | The duration of the media item, in milliseconds | 150192 | -| `File` | *any* | :heavy_minus_sign: | The local file path at which the part is stored on the server | /home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov | +| `Accessible` | **bool* | :heavy_minus_sign: | Indicates if the part is accessible. | true | +| `AudioProfile` | **string* | :heavy_minus_sign: | N/A | lc | +| `Container` | **string* | :heavy_minus_sign: | The container of the media file, such as `mp4` or `mkv` | mov | +| `Duration` | **int* | :heavy_minus_sign: | The duration of the media item, in milliseconds | 150192 | +| `Exists` | **bool* | :heavy_minus_sign: | Indicates if the part exists. | true | +| `File` | **string* | :heavy_minus_sign: | The local file path at which the part is stored on the server | /home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov | | `Has64bitOffsets` | **bool* | :heavy_minus_sign: | N/A | false | -| `ID` | **int64* | :heavy_minus_sign: | N/A | 1 | -| `Key` | *any* | :heavy_minus_sign: | The key from which the media can be streamed | /library/parts/1/1531779263/file.mov | +| `ID` | *int64* | :heavy_check_mark: | N/A | 1 | +| `Indexes` | **string* | :heavy_minus_sign: | N/A | sd | +| `Key` | *string* | :heavy_check_mark: | The key from which the media can be streamed | /library/parts/1/1531779263/file.mov | | `OptimizedForStreaming` | **bool* | :heavy_minus_sign: | N/A | false | | `Size` | **int64* | :heavy_minus_sign: | The size of the media, in bytes | 105355654 | | `Stream` | [][components.Stream](../../models/components/stream.md) | :heavy_minus_sign: | N/A | | -| `VideoProfile` | *any* | :heavy_minus_sign: | N/A | main | +| `VideoProfile` | **string* | :heavy_minus_sign: | N/A | main | | `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/plexdevice.md b/docs/models/components/plexdevice.md new file mode 100644 index 0000000..36a9b02 --- /dev/null +++ b/docs/models/components/plexdevice.md @@ -0,0 +1,31 @@ +# PlexDevice + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| `Name` | *string* | :heavy_check_mark: | N/A | | +| `Product` | *string* | :heavy_check_mark: | N/A | | +| `ProductVersion` | *string* | :heavy_check_mark: | N/A | | +| `Platform` | *string* | :heavy_check_mark: | N/A | | +| `PlatformVersion` | *string* | :heavy_check_mark: | N/A | | +| `Device` | *string* | :heavy_check_mark: | N/A | | +| `ClientIdentifier` | *string* | :heavy_check_mark: | N/A | | +| `CreatedAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | N/A | 2019-06-24T11:38:02Z | +| `LastSeenAt` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | N/A | 2019-06-24T11:38:02Z | +| `Provides` | *string* | :heavy_check_mark: | N/A | | +| `OwnerID` | *int64* | :heavy_check_mark: | ownerId is null when the device is owned by the token used to send the request | | +| `SourceTitle` | *string* | :heavy_check_mark: | N/A | | +| `PublicAddress` | *string* | :heavy_check_mark: | N/A | | +| `AccessToken` | *string* | :heavy_check_mark: | N/A | | +| `Owned` | *bool* | :heavy_check_mark: | N/A | | +| `Home` | *bool* | :heavy_check_mark: | N/A | | +| `Synced` | *bool* | :heavy_check_mark: | N/A | | +| `Relay` | *bool* | :heavy_check_mark: | N/A | | +| `Presence` | *bool* | :heavy_check_mark: | N/A | | +| `HTTPSRequired` | *bool* | :heavy_check_mark: | N/A | | +| `PublicAddressMatches` | *bool* | :heavy_check_mark: | N/A | | +| `DNSRebindingProtection` | *bool* | :heavy_check_mark: | N/A | | +| `NatLoopbackSupported` | *bool* | :heavy_check_mark: | N/A | | +| `Connections` | [][components.Connections](../../models/components/connections.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/models/components/plexdeviceprotocol.md b/docs/models/components/plexdeviceprotocol.md new file mode 100644 index 0000000..6e52b58 --- /dev/null +++ b/docs/models/components/plexdeviceprotocol.md @@ -0,0 +1,11 @@ +# PlexDeviceProtocol + +The protocol used for the connection (http, https, etc) + + +## Values + +| Name | Value | +| ------------------------- | ------------------------- | +| `PlexDeviceProtocolHTTP` | http | +| `PlexDeviceProtocolHTTPS` | https | \ No newline at end of file diff --git a/docs/models/components/services.md b/docs/models/components/services.md new file mode 100644 index 0000000..3076bb2 --- /dev/null +++ b/docs/models/components/services.md @@ -0,0 +1,12 @@ +# Services + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `Identifier` | *string* | :heavy_check_mark: | N/A | metadata-dev | +| `Endpoint` | *string* | :heavy_check_mark: | N/A | https://epg.provider.plex.tv | +| `Token` | *string* | :heavy_check_mark: | N/A | DjoMtqFAGRL1uVtCyF1dKIorTbShJeqv | +| `Secret` | *string* | :heavy_check_mark: | N/A | | +| `Status` | [components.UserPlexAccountStatus](../../models/components/userplexaccountstatus.md) | :heavy_check_mark: | N/A | online | \ No newline at end of file diff --git a/docs/models/components/stream.md b/docs/models/components/stream.md index 8c42634..18960a9 100644 --- a/docs/models/components/stream.md +++ b/docs/models/components/stream.md @@ -6,35 +6,58 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | -| `Default` | **bool* | :heavy_minus_sign: | N/A | true | -| `AudioChannelLayout` | *any* | :heavy_minus_sign: | N/A | stereo | -| `BitDepth` | **int64* | :heavy_minus_sign: | N/A | 8 | -| `Bitrate` | **int64* | :heavy_minus_sign: | N/A | 5466 | -| `CanAutoSync` | **bool* | :heavy_minus_sign: | For subtitle streams only. If `true` then the server can attempt to automatically sync the subtitle timestamps with the video. | true | -| `ChromaLocation` | *any* | :heavy_minus_sign: | N/A | topleft | -| `ChromaSubsampling` | *any* | :heavy_minus_sign: | N/A | 4:2:0 | -| `Codec` | *any* | :heavy_minus_sign: | The codec of the stream, such as `h264` or `aac` | h264 | -| `ColorPrimaries` | *any* | :heavy_minus_sign: | N/A | bt709 | -| `ColorRange` | *any* | :heavy_minus_sign: | N/A | tv | -| `ColorSpace` | *any* | :heavy_minus_sign: | N/A | bt709 | -| `ColorTrc` | *any* | :heavy_minus_sign: | N/A | bt709 | -| `DisplayTitle` | *any* | :heavy_minus_sign: | A friendly name for the stream, often comprised of the language and codec information | English (H.264 Main) | -| `FrameRate` | **float64* | :heavy_minus_sign: | N/A | 23.976 | -| `HasScalingMatrix` | *any* | :heavy_minus_sign: | N/A | false | -| `Height` | **int64* | :heavy_minus_sign: | N/A | 544 | -| `ID` | **int64* | :heavy_minus_sign: | N/A | 1 | -| `Index` | **int64* | :heavy_minus_sign: | If the stream is part of the `Part` and not an external resource, the index of the stream within that part | 0 | -| `Key` | *any* | :heavy_minus_sign: | If the stream is independently streamable, the key from which it can be streamed | /library/streams/1 | -| `Language` | *any* | :heavy_minus_sign: | N/A | English | -| `LanguageCode` | *any* | :heavy_minus_sign: | The three character language code for the stream contents | eng | -| `Level` | **int64* | :heavy_minus_sign: | N/A | 31 | -| `Profile` | *any* | :heavy_minus_sign: | N/A | main | -| `RefFrames` | **int64* | :heavy_minus_sign: | N/A | 2 | -| `SamplingRate` | **int64* | :heavy_minus_sign: | N/A | 48000 | -| `Selected` | **bool* | :heavy_minus_sign: | N/A | | -| `StreamIdentifier` | **int64* | :heavy_minus_sign: | N/A | 1 | -| `StreamType` | **int64* | :heavy_minus_sign: | A number indicating the type of the stream. `1` for video, `2` for audio, `3` for subtitles, `4` for lyrics | 1 | -| `Width` | **int64* | :heavy_minus_sign: | N/A | 1280 | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | +| `Default` | **bool* | :heavy_minus_sign: | Indicates if this stream is default. | true | +| `AudioChannelLayout` | **string* | :heavy_minus_sign: | Audio channel layout. | 5.1(side) | +| `Channels` | **int* | :heavy_minus_sign: | Number of audio channels (for audio streams). | 6 | +| `BitDepth` | **int* | :heavy_minus_sign: | Bit depth of the video stream. | 10 | +| `DOVIBLCompatID` | **int* | :heavy_minus_sign: | Dolby Vision BL compatibility ID. | 1 | +| `DOVIBLPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision BL is present. | true | +| `DOVIELPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision EL is present. | false | +| `DOVILevel` | **int* | :heavy_minus_sign: | Dolby Vision level. | 6 | +| `DOVIPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision is present. | true | +| `DOVIProfile` | **int* | :heavy_minus_sign: | Dolby Vision profile. | 8 | +| `DOVIRPUPresent` | **bool* | :heavy_minus_sign: | Indicates if Dolby Vision RPU is present. | true | +| `DOVIVersion` | **string* | :heavy_minus_sign: | Dolby Vision version. | 1.0 | +| `Bitrate` | **int* | :heavy_minus_sign: | Bitrate of the stream. | 24743 | +| `CanAutoSync` | **bool* | :heavy_minus_sign: | Indicates if the stream can auto-sync. | false | +| `ChromaLocation` | **string* | :heavy_minus_sign: | Chroma sample location. | topleft | +| `ChromaSubsampling` | **string* | :heavy_minus_sign: | Chroma subsampling format. | 4:2:0 | +| `CodedHeight` | **int* | :heavy_minus_sign: | Coded video height. | 1608 | +| `CodedWidth` | **int* | :heavy_minus_sign: | Coded video width. | 3840 | +| `ClosedCaptions` | **bool* | :heavy_minus_sign: | N/A | true | +| `Codec` | *string* | :heavy_check_mark: | Codec used by the stream. | hevc | +| `ColorPrimaries` | **string* | :heavy_minus_sign: | Color primaries used. | bt2020 | +| `ColorRange` | **string* | :heavy_minus_sign: | Color range (e.g., tv). | tv | +| `ColorSpace` | **string* | :heavy_minus_sign: | Color space. | bt2020nc | +| `ColorTrc` | **string* | :heavy_minus_sign: | Color transfer characteristics. | smpte2084 | +| `DisplayTitle` | *string* | :heavy_check_mark: | Display title for the stream. | 4K DoVi/HDR10 (HEVC Main 10) | +| `ExtendedDisplayTitle` | **string* | :heavy_minus_sign: | Extended display title for the stream. | 4K DoVi/HDR10 (HEVC Main 10) | +| `FrameRate` | **float32* | :heavy_minus_sign: | Frame rate of the stream. | 23.976 | +| `HasScalingMatrix` | **bool* | :heavy_minus_sign: | N/A | false | +| `Height` | **int* | :heavy_minus_sign: | Height of the video stream. | 1602 | +| `ID` | *int* | :heavy_check_mark: | Unique stream identifier. | 1002625 | +| `Index` | **int* | :heavy_minus_sign: | Index of the stream. | 0 | +| `Key` | *string* | :heavy_check_mark: | Key to access this stream part. | /library/streams/216389 | +| `Language` | **string* | :heavy_minus_sign: | Language of the stream. | English | +| `LanguageCode` | **string* | :heavy_minus_sign: | ISO language code. | eng | +| `LanguageTag` | **string* | :heavy_minus_sign: | Language tag (e.g., en). | en | +| `Format` | **string* | :heavy_minus_sign: | Format of the stream (e.g., srt). | srt | +| `HeaderCompression` | **bool* | :heavy_minus_sign: | Indicates whether header compression is enabled. | true | +| `Level` | **int* | :heavy_minus_sign: | Video level. | 150 | +| `Original` | **bool* | :heavy_minus_sign: | Indicates if this is the original stream. | true | +| `Profile` | **string* | :heavy_minus_sign: | Video profile. | main 10 | +| `RefFrames` | **int* | :heavy_minus_sign: | Number of reference frames. | 1 | +| `SamplingRate` | **int* | :heavy_minus_sign: | Sampling rate for the audio stream. | 48000 | +| `ScanType` | **string* | :heavy_minus_sign: | N/A | progressive | +| `EmbeddedInVideo` | **string* | :heavy_minus_sign: | N/A | progressive | +| `Selected` | **bool* | :heavy_minus_sign: | Indicates if this stream is selected (applicable for audio streams). | true | +| `Forced` | **bool* | :heavy_minus_sign: | N/A | true | +| `HearingImpaired` | **bool* | :heavy_minus_sign: | Indicates if the stream is for the hearing impaired. | true | +| `Dub` | **bool* | :heavy_minus_sign: | Indicates if the stream is a dub. | true | +| `Title` | **string* | :heavy_minus_sign: | Optional title for the stream (e.g., language variant). | SDH | +| `StreamIdentifier` | **int* | :heavy_minus_sign: | N/A | 1 | +| `StreamType` | *int64* | :heavy_check_mark: | Stream type:
- VIDEO = 1
- AUDIO = 2
- SUBTITLE = 3
| | +| `Width` | **int* | :heavy_minus_sign: | Width of the video stream. | 3840 | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/subscription.md b/docs/models/components/subscription.md new file mode 100644 index 0000000..74f19c0 --- /dev/null +++ b/docs/models/components/subscription.md @@ -0,0 +1,15 @@ +# Subscription + +If the account's Plex Pass subscription is active + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `Features` | []*string* | :heavy_minus_sign: | List of features allowed on your Plex Pass subscription | | +| `Active` | **bool* | :heavy_minus_sign: | If the account's Plex Pass subscription is active | true | +| `SubscribedAt` | **string* | :heavy_minus_sign: | Date the account subscribed to Plex Pass | 2021-04-12T18:21:12Z | +| `Status` | [*components.UserPlexAccountSubscriptionStatus](../../models/components/userplexaccountsubscriptionstatus.md) | :heavy_minus_sign: | String representation of subscriptionActive | Inactive | +| `PaymentService` | **string* | :heavy_minus_sign: | Payment service used for your Plex Pass subscription | | +| `Plan` | **string* | :heavy_minus_sign: | Name of Plex Pass subscription plan | | \ No newline at end of file diff --git a/docs/models/components/tag.md b/docs/models/components/tag.md index 2e3671b..4838a06 100644 --- a/docs/models/components/tag.md +++ b/docs/models/components/tag.md @@ -6,15 +6,15 @@ A variety of extra information about a metadata item is included as tags. These ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | -| `Confidence` | **float64* | :heavy_minus_sign: | Measure of the confidence of an automatic tag | | -| `Context` | **string* | :heavy_minus_sign: | N/A | | -| `Filter` | *any* | :heavy_minus_sign: | A filter parameter that can be used to query for more content that matches this tag value. | actor=49 | -| `ID` | **int64* | :heavy_minus_sign: | N/A | | -| `RatingKey` | **string* | :heavy_minus_sign: | N/A | | -| `Role` | *any* | :heavy_minus_sign: | The role this actor played | Secretary | -| `Tag` | *any* | :heavy_minus_sign: | The value of the tag (the name) | Shaun Lawton | -| `TagKey` | *any* | :heavy_minus_sign: | Plex identifier for this tag which can be used to fetch additional information from plex.tv | 5d3ee12c4cde6a001c3e0b27 | -| `TagType` | **int64* | :heavy_minus_sign: | N/A | | -| `Thumb` | *any* | :heavy_minus_sign: | N/A | http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg | \ No newline at end of file +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | +| `Confidence` | **float64* | :heavy_minus_sign: | Measure of the confidence of an automatic tag | | +| `Context` | **string* | :heavy_minus_sign: | N/A | | +| `Filter` | **string* | :heavy_minus_sign: | A filter parameter that can be used to query for more content that matches this tag value. | actor=49 | +| `ID` | **int* | :heavy_minus_sign: | N/A | | +| `RatingKey` | **string* | :heavy_minus_sign: | The rating key (Media ID) of this media item. Note: Although this is always an integer, it is represented as a string in the API. | 58683 | +| `Role` | **string* | :heavy_minus_sign: | The role this actor played | Secretary | +| `Tag` | *string* | :heavy_check_mark: | The value of the tag (the name) | Shaun Lawton | +| `TagKey` | **string* | :heavy_minus_sign: | Plex identifier for this tag which can be used to fetch additional information from plex.tv | 5d3ee12c4cde6a001c3e0b27 | +| `TagType` | **int* | :heavy_minus_sign: | N/A | | +| `Thumb` | **string* | :heavy_minus_sign: | N/A | http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg | \ No newline at end of file diff --git a/docs/models/components/userplexaccount.md b/docs/models/components/userplexaccount.md new file mode 100644 index 0000000..d91b4bc --- /dev/null +++ b/docs/models/components/userplexaccount.md @@ -0,0 +1,48 @@ +# UserPlexAccount + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `AdsConsent` | **bool* | :heavy_minus_sign: | Unknown | | +| `AdsConsentReminderAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `AdsConsentSetAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `Anonymous` | **bool* | :heavy_minus_sign: | Unknown | | +| `AuthToken` | *string* | :heavy_check_mark: | The account token | CxoUzBTSV5hsxjTpFKaf | +| `BackupCodesCreated` | **bool* | :heavy_minus_sign: | If the two-factor authentication backup codes have been created | | +| `Confirmed` | **bool* | :heavy_minus_sign: | If the account has been confirmed | | +| `Country` | **string* | :heavy_minus_sign: | The account country | US | +| `Email` | *string* | :heavy_check_mark: | The account email address | username@email.com | +| `EmailOnlyAuth` | **bool* | :heavy_minus_sign: | If login with email only is enabled | | +| `ExperimentalFeatures` | **bool* | :heavy_minus_sign: | If experimental features are enabled | | +| `FriendlyName` | *string* | :heavy_check_mark: | Your account full name | friendlyUsername | +| `Entitlements` | []*string* | :heavy_minus_sign: | List of devices your allowed to use with this account | [] | +| `Guest` | **bool* | :heavy_minus_sign: | If the account is a Plex Home guest user | | +| `HasPassword` | **bool* | :heavy_minus_sign: | If the account has a password | | +| `Home` | **bool* | :heavy_minus_sign: | If the account is a Plex Home user | | +| `HomeAdmin` | **bool* | :heavy_minus_sign: | If the account is the Plex Home admin | | +| `HomeSize` | **int* | :heavy_minus_sign: | The number of accounts in the Plex Home | 1 | +| `ID` | *int* | :heavy_check_mark: | The Plex account ID | 13692262 | +| `JoinedAt` | *int64* | :heavy_check_mark: | Unix epoch datetime in seconds | 1556281940 | +| `Locale` | **string* | :heavy_minus_sign: | The account locale | | +| `MailingListActive` | **bool* | :heavy_minus_sign: | If you are subscribed to the Plex newsletter | | +| `MailingListStatus` | [*components.MailingListStatus](../../models/components/mailingliststatus.md) | :heavy_minus_sign: | Your current mailing list status | active | +| `MaxHomeSize` | **int* | :heavy_minus_sign: | The maximum number of accounts allowed in the Plex Home | 15 | +| ~~`Pin`~~ | **string* | :heavy_minus_sign: | : warning: ** DEPRECATED **: This will be removed in a future release, please migrate away from it as soon as possible.

[Might be removed] The hashed Plex Home PIN | | +| `Profile` | [*components.UserProfile](../../models/components/userprofile.md) | :heavy_minus_sign: | N/A | | +| `Protected` | **bool* | :heavy_minus_sign: | If the account has a Plex Home PIN enabled | | +| `RememberExpiresAt` | **int64* | :heavy_minus_sign: | Unix epoch datetime in seconds | 1556281940 | +| `Restricted` | **bool* | :heavy_minus_sign: | If the account is a Plex Home managed user | | +| `Roles` | []*string* | :heavy_minus_sign: | [Might be removed] List of account roles. Plexpass membership listed here | | +| `ScrobbleTypes` | **string* | :heavy_minus_sign: | Unknown | | +| `Services` | [][components.Services](../../models/components/services.md) | :heavy_minus_sign: | N/A | | +| `Subscription` | [*components.Subscription](../../models/components/subscription.md) | :heavy_minus_sign: | If the account's Plex Pass subscription is active | | +| `SubscriptionDescription` | **string* | :heavy_minus_sign: | Description of the Plex Pass subscription | | +| `Subscriptions` | [][components.UserPlexAccountSubscription](../../models/components/userplexaccountsubscription.md) | :heavy_minus_sign: | N/A | | +| `Thumb` | **string* | :heavy_minus_sign: | URL of the account thumbnail | https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101 | +| `Title` | *string* | :heavy_check_mark: | The title of the account (username or friendly name) | UsernameTitle | +| `TwoFactorEnabled` | **bool* | :heavy_minus_sign: | If two-factor authentication is enabled | | +| `Username` | *string* | :heavy_check_mark: | The account username | Username | +| `UUID` | *string* | :heavy_check_mark: | The account UUID | dae343c1f45beb4f | +| `AttributionPartner` | **string* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/components/userplexaccountstatus.md b/docs/models/components/userplexaccountstatus.md new file mode 100644 index 0000000..77b2734 --- /dev/null +++ b/docs/models/components/userplexaccountstatus.md @@ -0,0 +1,9 @@ +# UserPlexAccountStatus + + +## Values + +| Name | Value | +| ------------------------------ | ------------------------------ | +| `UserPlexAccountStatusOnline` | online | +| `UserPlexAccountStatusOffline` | offline | \ No newline at end of file diff --git a/docs/models/components/userplexaccountsubscription.md b/docs/models/components/userplexaccountsubscription.md new file mode 100644 index 0000000..d0a4e3d --- /dev/null +++ b/docs/models/components/userplexaccountsubscription.md @@ -0,0 +1,13 @@ +# UserPlexAccountSubscription + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | +| `Features` | []*string* | :heavy_minus_sign: | List of features allowed on your Plex Pass subscription | | +| `Active` | **bool* | :heavy_minus_sign: | If the account's Plex Pass subscription is active | true | +| `SubscribedAt` | **string* | :heavy_minus_sign: | Date the account subscribed to Plex Pass | 2021-04-12T18:21:12Z | +| `Status` | [*components.UserPlexAccountSubscriptionsStatus](../../models/components/userplexaccountsubscriptionsstatus.md) | :heavy_minus_sign: | String representation of subscriptionActive | Inactive | +| `PaymentService` | **string* | :heavy_minus_sign: | Payment service used for your Plex Pass subscription | | +| `Plan` | **string* | :heavy_minus_sign: | Name of Plex Pass subscription plan | | \ No newline at end of file diff --git a/docs/models/components/userplexaccountsubscriptionsstatus.md b/docs/models/components/userplexaccountsubscriptionsstatus.md new file mode 100644 index 0000000..4e52eeb --- /dev/null +++ b/docs/models/components/userplexaccountsubscriptionsstatus.md @@ -0,0 +1,11 @@ +# UserPlexAccountSubscriptionsStatus + +String representation of subscriptionActive + + +## Values + +| Name | Value | +| -------------------------------------------- | -------------------------------------------- | +| `UserPlexAccountSubscriptionsStatusInactive` | Inactive | +| `UserPlexAccountSubscriptionsStatusActive` | Active | \ No newline at end of file diff --git a/docs/models/components/userplexaccountsubscriptionstatus.md b/docs/models/components/userplexaccountsubscriptionstatus.md new file mode 100644 index 0000000..1910d26 --- /dev/null +++ b/docs/models/components/userplexaccountsubscriptionstatus.md @@ -0,0 +1,11 @@ +# UserPlexAccountSubscriptionStatus + +String representation of subscriptionActive + + +## Values + +| Name | Value | +| ------------------------------------------- | ------------------------------------------- | +| `UserPlexAccountSubscriptionStatusInactive` | Inactive | +| `UserPlexAccountSubscriptionStatusActive` | Active | \ No newline at end of file diff --git a/docs/models/components/userprofile.md b/docs/models/components/userprofile.md new file mode 100644 index 0000000..561e6f9 --- /dev/null +++ b/docs/models/components/userprofile.md @@ -0,0 +1,19 @@ +# UserProfile + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| `AutoSelectAudio` | **bool* | :heavy_minus_sign: | If the account has automatically select audio and subtitle tracks enabled | true | +| `DefaultAudioLanguage` | *string* | :heavy_check_mark: | The preferred audio language for the account | ja | +| `DefaultAudioAccessibility` | [*components.DefaultAudioAccessibility](../../models/components/defaultaudioaccessibility.md) | :heavy_minus_sign: | N/A | 0 | +| `DefaultAudioLanguages` | []*string* | :heavy_minus_sign: | The preferred audio languages for the account | | +| `DefaultSubtitleLanguage` | *string* | :heavy_check_mark: | The preferred subtitle language for the account | en | +| `DefaultSubtitleLanguages` | []*string* | :heavy_minus_sign: | The preferred subtitle languages for the account | | +| `AutoSelectSubtitle` | [*components.AutoSelectSubtitle](../../models/components/autoselectsubtitle.md) | :heavy_minus_sign: | N/A | 1 | +| `DefaultSubtitleAccessibility` | [*components.DefaultSubtitleAccessibility](../../models/components/defaultsubtitleaccessibility.md) | :heavy_minus_sign: | N/A | 1 | +| `DefaultSubtitleForced` | [*components.DefaultSubtitleForced](../../models/components/defaultsubtitleforced.md) | :heavy_minus_sign: | N/A | 1 | +| `WatchedIndicator` | [*components.WatchedIndicator](../../models/components/watchedindicator.md) | :heavy_minus_sign: | N/A | 1 | +| `MediaReviewsVisibility` | [*components.MediaReviewsVisibility](../../models/components/mediareviewsvisibility.md) | :heavy_minus_sign: | N/A | 1 | +| `MediaReviewsLanguages` | []*string* | :heavy_minus_sign: | The languages for media reviews visibility | | \ No newline at end of file diff --git a/docs/models/components/watchedindicator.md b/docs/models/components/watchedindicator.md new file mode 100644 index 0000000..7ec1e4b --- /dev/null +++ b/docs/models/components/watchedindicator.md @@ -0,0 +1,13 @@ +# WatchedIndicator + +Whether or not media watched indicators are enabled (little orange dot on media) + + +## Values + +| Name | Value | +| ---------------------------------- | ---------------------------------- | +| `WatchedIndicatorNone` | 0 | +| `WatchedIndicatorMoviesAndTvShows` | 1 | +| `WatchedIndicatorMovies` | 2 | +| `WatchedIndicatorTvShows` | 3 | \ No newline at end of file diff --git a/docs/models/operations/alllibraries.md b/docs/models/operations/alllibraries.md new file mode 100644 index 0000000..642aca4 --- /dev/null +++ b/docs/models/operations/alllibraries.md @@ -0,0 +1,11 @@ +# AllLibraries + +Indicates if the user has access to all libraries. + + +## Values + +| Name | Value | +| --------------------- | --------------------- | +| `AllLibrariesDisable` | 0 | +| `AllLibrariesEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/allowcameraupload.md b/docs/models/operations/allowcameraupload.md new file mode 100644 index 0000000..ca0bb2a --- /dev/null +++ b/docs/models/operations/allowcameraupload.md @@ -0,0 +1,11 @@ +# AllowCameraUpload + +Indicates if the user is allowed to upload from a camera. + + +## Values + +| Name | Value | +| -------------------------- | -------------------------- | +| `AllowCameraUploadDisable` | 0 | +| `AllowCameraUploadEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/allowchannels.md b/docs/models/operations/allowchannels.md new file mode 100644 index 0000000..11d6c75 --- /dev/null +++ b/docs/models/operations/allowchannels.md @@ -0,0 +1,11 @@ +# AllowChannels + +Indicates if the user has access to channels. + + +## Values + +| Name | Value | +| ---------------------- | ---------------------- | +| `AllowChannelsDisable` | 0 | +| `AllowChannelsEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/allowsubtitleadmin.md b/docs/models/operations/allowsubtitleadmin.md new file mode 100644 index 0000000..d794ec0 --- /dev/null +++ b/docs/models/operations/allowsubtitleadmin.md @@ -0,0 +1,11 @@ +# AllowSubtitleAdmin + +Indicates if the user can manage subtitles. + + +## Values + +| Name | Value | +| --------------------------- | --------------------------- | +| `AllowSubtitleAdminDisable` | 0 | +| `AllowSubtitleAdminEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/allowsync.md b/docs/models/operations/allowsync.md new file mode 100644 index 0000000..30e7fad --- /dev/null +++ b/docs/models/operations/allowsync.md @@ -0,0 +1,11 @@ +# AllowSync + +Indicates if the user is allowed to sync media. + + +## Values + +| Name | Value | +| ------------------ | ------------------ | +| `AllowSyncDisable` | 0 | +| `AllowSyncEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/allowtuners.md b/docs/models/operations/allowtuners.md new file mode 100644 index 0000000..2df5873 --- /dev/null +++ b/docs/models/operations/allowtuners.md @@ -0,0 +1,11 @@ +# AllowTuners + +Indicates if the user is allowed to use tuners. + + +## Values + +| Name | Value | +| -------------------- | -------------------- | +| `AllowTunersDisable` | 0 | +| `AllowTunersEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/autocompleterequest.md b/docs/models/operations/autocompleterequest.md index 24657d4..1afbdd4 100644 --- a/docs/models/operations/autocompleterequest.md +++ b/docs/models/operations/autocompleterequest.md @@ -3,20 +3,20 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | -| `Type` | **int64* | :heavy_minus_sign: | Item type | | -| `FieldQuery` | **string* | :heavy_minus_sign: | The "field" stands in for any field, the value is a partial string for matching | | -| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | +| `Type` | **int64* | :heavy_minus_sign: | Item type | | +| `FieldQuery` | **string* | :heavy_minus_sign: | The "field" stands in for any field, the value is a partial string for matching | | +| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:
- Fields: integer, boolean, tag, string, date, language
- Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
- Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
- Sorting: sort parameter with :desc, :nullsLast modifiers
- Grouping: group parameter
- Limits: limit parameter

Examples:
- Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24`
- String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24"
- Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10

See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries.
| {
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
} | \ No newline at end of file diff --git a/docs/models/operations/billing.md b/docs/models/operations/billing.md new file mode 100644 index 0000000..0375e9d --- /dev/null +++ b/docs/models/operations/billing.md @@ -0,0 +1,9 @@ +# Billing + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `InternalPaymentMethod` | [operations.InternalPaymentMethod](../../models/operations/internalpaymentmethod.md) | :heavy_check_mark: | N/A | +| `PaymentMethodID` | *int64* | :heavy_check_mark: | N/A | \ No newline at end of file diff --git a/docs/models/operations/butlertask.md b/docs/models/operations/butlertask.md index 0a2d52f..b19dc19 100644 --- a/docs/models/operations/butlertask.md +++ b/docs/models/operations/butlertask.md @@ -1,13 +1,31 @@ # ButlerTask +The task name -## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | -| `Description` | **string* | :heavy_minus_sign: | A user-friendly description of the task | -| `Enabled` | **bool* | :heavy_minus_sign: | Whether this task is enabled or not | -| `Interval` | **int64* | :heavy_minus_sign: | The interval (in days) of when this task is run. A value of 1 is run every day, 7 is every week, etc. | -| `Name` | **string* | :heavy_minus_sign: | The name of the task | -| `ScheduleRandomized` | **bool* | :heavy_minus_sign: | Indicates whether the timing of the task is randomized within the butler interval | -| `Title` | **string* | :heavy_minus_sign: | A user-friendly title of the task | \ No newline at end of file +## Values + +| Name | Value | +| -------------------------------------------- | -------------------------------------------- | +| `ButlerTaskAutomaticUpdates` | AutomaticUpdates | +| `ButlerTaskBackupDatabase` | BackupDatabase | +| `ButlerTaskButlerTaskGenerateAdMarkers` | ButlerTaskGenerateAdMarkers | +| `ButlerTaskButlerTaskGenerateCreditsMarkers` | ButlerTaskGenerateCreditsMarkers | +| `ButlerTaskButlerTaskGenerateIntroMarkers` | ButlerTaskGenerateIntroMarkers | +| `ButlerTaskButlerTaskGenerateVoiceActivity` | ButlerTaskGenerateVoiceActivity | +| `ButlerTaskCleanOldBundles` | CleanOldBundles | +| `ButlerTaskCleanOldCacheFiles` | CleanOldCacheFiles | +| `ButlerTaskDeepMediaAnalysis` | DeepMediaAnalysis | +| `ButlerTaskGarbageCollectBlobs` | GarbageCollectBlobs | +| `ButlerTaskGarbageCollectLibraryMedia` | GarbageCollectLibraryMedia | +| `ButlerTaskGenerateBlurHashes` | GenerateBlurHashes | +| `ButlerTaskGenerateChapterThumbs` | GenerateChapterThumbs | +| `ButlerTaskGenerateMediaIndexFiles` | GenerateMediaIndexFiles | +| `ButlerTaskLoudnessAnalysis` | LoudnessAnalysis | +| `ButlerTaskMusicAnalysis` | MusicAnalysis | +| `ButlerTaskOptimizeDatabase` | OptimizeDatabase | +| `ButlerTaskRefreshEpgGuides` | RefreshEpgGuides | +| `ButlerTaskRefreshLibraries` | RefreshLibraries | +| `ButlerTaskRefreshLocalMedia` | RefreshLocalMedia | +| `ButlerTaskRefreshPeriodicMetadata` | RefreshPeriodicMetadata | +| `ButlerTaskUpgradeMediaAnalysis` | UpgradeMediaAnalysis | \ No newline at end of file diff --git a/docs/models/operations/butlertasks.md b/docs/models/operations/butlertasks.md index 9b1bf61..7382f6e 100644 --- a/docs/models/operations/butlertasks.md +++ b/docs/models/operations/butlertasks.md @@ -3,6 +3,6 @@ ## Fields -| Field | Type | Required | Description | -| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------------------------------------------------------- | -| `ButlerTask` | [][operations.ButlerTask](../../models/operations/butlertask.md) | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `ButlerTask` | [][operations.GetTasksButlerTask](../../models/operations/gettasksbutlertask.md) | :heavy_minus_sign: | N/A | \ No newline at end of file diff --git a/docs/models/operations/createcollectionrequest.md b/docs/models/operations/createcollectionrequest.md index 72a98e1..86fba03 100644 --- a/docs/models/operations/createcollectionrequest.md +++ b/docs/models/operations/createcollectionrequest.md @@ -3,21 +3,21 @@ ## Fields -| Field | Type | Required | Description | Example | -| ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `SectionID` | *string* | :heavy_check_mark: | The section where this collection will be created | | -| `Title` | **string* | :heavy_minus_sign: | The title to filter by or assign | | -| `Smart` | **bool* | :heavy_minus_sign: | Whether this is a smart collection/playlist | | -| `URI` | **string* | :heavy_minus_sign: | The URI for processing the smart collection. Required for a smart collection | | -| `Type` | **int64* | :heavy_minus_sign: | The metadata type to filter by | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `SectionID` | *string* | :heavy_check_mark: | The section where this collection will be created | | +| `Title` | **string* | :heavy_minus_sign: | The title to filter by or assign | | +| `Smart` | **bool* | :heavy_minus_sign: | Whether this is a smart collection/playlist | | +| `URI` | **string* | :heavy_minus_sign: | The URI for processing the smart collection. Required for a smart collection | | +| `Type` | [*components.MediaType](../../models/components/mediatype.md) | :heavy_minus_sign: | The type of media to retrieve or filter by.

1 = movie
2 = show
3 = season
4 = episode
5 = artist
6 = album
7 = track
8 = photo_album
9 = photo

E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
| 2 | \ No newline at end of file diff --git a/docs/models/operations/createdownloadqueuestatus.md b/docs/models/operations/createdownloadqueuestatus.md new file mode 100644 index 0000000..51142dd --- /dev/null +++ b/docs/models/operations/createdownloadqueuestatus.md @@ -0,0 +1,20 @@ +# CreateDownloadQueueStatus + +The state of this queue + - deciding: At least one item is still being decided + - waiting: At least one item is waiting for transcode and none are currently transcoding + - processing: At least one item is being transcoded + - done: All items are available (or potentially expired) + - error: At least one item has encountered an error + + + +## Values + +| Name | Value | +| ------------------------------------- | ------------------------------------- | +| `CreateDownloadQueueStatusDeciding` | deciding | +| `CreateDownloadQueueStatusWaiting` | waiting | +| `CreateDownloadQueueStatusProcessing` | processing | +| `CreateDownloadQueueStatusDone` | done | +| `CreateDownloadQueueStatusError` | error | \ No newline at end of file diff --git a/docs/models/operations/downloadqueue.md b/docs/models/operations/downloadqueue.md index 73d228c..7cd0cbc 100644 --- a/docs/models/operations/downloadqueue.md +++ b/docs/models/operations/downloadqueue.md @@ -7,4 +7,4 @@ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ID` | **int64* | :heavy_minus_sign: | N/A | | `ItemCount` | **int64* | :heavy_minus_sign: | N/A | -| `Status` | [*operations.Status](../../models/operations/status.md) | :heavy_minus_sign: | The state of this queue
- deciding: At least one item is still being decided
- waiting: At least one item is waiting for transcode and none are currently transcoding
- processing: At least one item is being transcoded
- done: All items are available (or potentially expired)
- error: At least one item has encountered an error
| \ No newline at end of file +| `Status` | [*operations.CreateDownloadQueueStatus](../../models/operations/createdownloadqueuestatus.md) | :heavy_minus_sign: | The state of this queue
- deciding: At least one item is still being decided
- waiting: At least one item is waiting for transcode and none are currently transcoding
- processing: At least one item is being transcoded
- done: All items are available (or potentially expired)
- error: At least one item has encountered an error
| \ No newline at end of file diff --git a/docs/models/operations/getcollectionsrequest.md b/docs/models/operations/getcollectionsrequest.md index 9d1a8fd..46a9aab 100644 --- a/docs/models/operations/getcollectionsrequest.md +++ b/docs/models/operations/getcollectionsrequest.md @@ -3,18 +3,18 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | -| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | +| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:
- Fields: integer, boolean, tag, string, date, language
- Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
- Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
- Sorting: sort parameter with :desc, :nullsLast modifiers
- Grouping: group parameter
- Limits: limit parameter

Examples:
- Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24`
- String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24"
- Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10

See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries.
| {
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
} | \ No newline at end of file diff --git a/docs/models/operations/getcommonrequest.md b/docs/models/operations/getcommonrequest.md index ee76bfe..d6b9ab0 100644 --- a/docs/models/operations/getcommonrequest.md +++ b/docs/models/operations/getcommonrequest.md @@ -3,19 +3,19 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | -| `Type` | **int64* | :heavy_minus_sign: | Item type | | -| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | +| `Type` | **int64* | :heavy_minus_sign: | Item type | | +| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:
- Fields: integer, boolean, tag, string, date, language
- Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
- Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
- Sorting: sort parameter with :desc, :nullsLast modifiers
- Grouping: group parameter
- Limits: limit parameter

Examples:
- Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24`
- String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24"
- Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10

See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries.
| {
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
} | \ No newline at end of file diff --git a/docs/models/operations/getfirstcharactersrequest.md b/docs/models/operations/getfirstcharactersrequest.md index 13c1581..cd964c0 100644 --- a/docs/models/operations/getfirstcharactersrequest.md +++ b/docs/models/operations/getfirstcharactersrequest.md @@ -3,20 +3,20 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | -| `Type` | **int64* | :heavy_minus_sign: | The metadata type to filter on | | -| `Sort` | **int64* | :heavy_minus_sign: | The metadata type to filter on | | -| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | +| `Type` | **int64* | :heavy_minus_sign: | The metadata type to filter on | | +| `Sort` | **int64* | :heavy_minus_sign: | The metadata type to filter on | | +| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:
- Fields: integer, boolean, tag, string, date, language
- Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
- Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
- Sorting: sort parameter with :desc, :nullsLast modifiers
- Grouping: group parameter
- Limits: limit parameter

Examples:
- Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24`
- String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24"
- Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10

See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries.
| {
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
} | \ No newline at end of file diff --git a/docs/models/operations/getlibraryitemsrequest.md b/docs/models/operations/getlibraryitemsrequest.md index aec9ce1..853a748 100644 --- a/docs/models/operations/getlibraryitemsrequest.md +++ b/docs/models/operations/getlibraryitemsrequest.md @@ -3,17 +3,17 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:
- Fields: integer, boolean, tag, string, date, language
- Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
- Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
- Sorting: sort parameter with :desc, :nullsLast modifiers
- Grouping: group parameter
- Limits: limit parameter

Examples:
- Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24`
- String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24"
- Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10

See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries.
| {
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
} | \ No newline at end of file diff --git a/docs/models/operations/getlibrarymatchesrequest.md b/docs/models/operations/getlibrarymatchesrequest.md index 5e6a660..e62e329 100644 --- a/docs/models/operations/getlibrarymatchesrequest.md +++ b/docs/models/operations/getlibrarymatchesrequest.md @@ -3,30 +3,30 @@ ## Fields -| Field | Type | Required | Description | Example | -| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `Type` | **int64* | :heavy_minus_sign: | The metadata type to filter by | | -| `IncludeFullMetadata` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | N/A | 1 | -| `IncludeAncestorMetadata` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | N/A | 1 | -| `IncludeAlternateMetadataSources` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | N/A | 1 | -| `GUID` | **string* | :heavy_minus_sign: | Used for movies, shows, artists, albums, and tracks. Allowed for various URI schemes, to be defined. | | -| `Title` | **string* | :heavy_minus_sign: | The title to filter by or assign | | -| `Year` | **int64* | :heavy_minus_sign: | Used for movies shows, and albums. Optional. | | -| `Path` | **string* | :heavy_minus_sign: | Used for movies, episodes, and tracks. The full path to the media file, used for "cloud-scanning" an item. | | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | Used for episodes and tracks. The title of the show/artist. Required if `path` isn't passed. | | -| `GrandparentYear` | **int64* | :heavy_minus_sign: | Used for episodes. The year of the show. | | -| `ParentIndex` | **int64* | :heavy_minus_sign: | Used for episodes and tracks. The season/album number. | | -| `Index` | **int64* | :heavy_minus_sign: | Used for episodes and tracks. The episode/tracks number in the season/album. | | -| `OriginallyAvailableAt` | **string* | :heavy_minus_sign: | Used for episodes. In the format `YYYY-MM-DD`. | | -| `ParentTitle` | **string* | :heavy_minus_sign: | Used for albums and tracks. The artist name for albums or the album name for tracks. | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `Type` | [*components.MediaType](../../models/components/mediatype.md) | :heavy_minus_sign: | The type of media to retrieve or filter by.

1 = movie
2 = show
3 = season
4 = episode
5 = artist
6 = album
7 = track
8 = photo_album
9 = photo

E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
| 2 | +| `IncludeFullMetadata` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | N/A | 1 | +| `IncludeAncestorMetadata` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | N/A | 1 | +| `IncludeAlternateMetadataSources` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | N/A | 1 | +| `GUID` | **string* | :heavy_minus_sign: | Used for movies, shows, artists, albums, and tracks. Allowed for various URI schemes, to be defined. | | +| `Title` | **string* | :heavy_minus_sign: | The title to filter by or assign | | +| `Year` | **int64* | :heavy_minus_sign: | Used for movies shows, and albums. Optional. | | +| `Path` | **string* | :heavy_minus_sign: | Used for movies, episodes, and tracks. The full path to the media file, used for "cloud-scanning" an item. | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | Used for episodes and tracks. The title of the show/artist. Required if `path` isn't passed. | | +| `GrandparentYear` | **int64* | :heavy_minus_sign: | Used for episodes. The year of the show. | | +| `ParentIndex` | **int64* | :heavy_minus_sign: | Used for episodes and tracks. The season/album number. | | +| `Index` | **int64* | :heavy_minus_sign: | Used for episodes and tracks. The episode/tracks number in the season/album. | | +| `OriginallyAvailableAt` | **string* | :heavy_minus_sign: | Used for episodes. In the format `YYYY-MM-DD`. | | +| `ParentTitle` | **string* | :heavy_minus_sign: | Used for albums and tracks. The artist name for albums or the album name for tracks. | | \ No newline at end of file diff --git a/docs/models/operations/getplaylistgeneratoritemsguids.md b/docs/models/operations/getplaylistgeneratoritemsguids.md new file mode 100644 index 0000000..ea102c8 --- /dev/null +++ b/docs/models/operations/getplaylistgeneratoritemsguids.md @@ -0,0 +1,8 @@ +# GetPlaylistGeneratorItemsGuids + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://
| {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
} | \ No newline at end of file diff --git a/docs/models/operations/getplaylistgeneratoritemsmetadata.md b/docs/models/operations/getplaylistgeneratoritemsmetadata.md index b61890f..8e21110 100644 --- a/docs/models/operations/getplaylistgeneratoritemsmetadata.md +++ b/docs/models/operations/getplaylistgeneratoritemsmetadata.md @@ -10,75 +10,79 @@ Metadata items can often live in a hierarchy with relationships between them. F ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Title` | *any* | :heavy_minus_sign: | The title of the item (e.g. “300” or “The Simpsons”) | -| `Type` | *any* | :heavy_minus_sign: | The type of the video item, such as `movie`, `episode`, or `clip`. | -| `AbsoluteIndex` | **int64* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | -| `AddedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was added to the library. | -| `Art` | *any* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | -| `AudienceRating` | **float64* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | -| `AudienceRatingImage` | *any* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | -| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Banner` | *any* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | -| `ChapterSource` | *any* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | -| `Composite` | *any* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | -| `ContentRating` | *any* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | -| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Duration` | **int64* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | -| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | -| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | -| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | -| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | -| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | -| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | -| `GUID` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Hero` | *any* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | -| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | -| `Index` | **int64* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | -| `Key` | *any* | :heavy_minus_sign: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | -| `LastViewedAt` | **int64* | :heavy_minus_sign: | When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. | -| `LeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | -| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | -| `OriginallyAvailableAt` | *any* | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | -| `OriginalTitle` | *any* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | -| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | -| `ParentIndex` | **int64* | :heavy_minus_sign: | The `index` of the parent | -| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | -| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | -| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | -| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | -| `PrimaryExtraKey` | *any* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | -| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | -| `Rating` | **float64* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | -| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `RatingCount` | **int64* | :heavy_minus_sign: | Number of ratings under this metadata | -| `RatingImage` | *any* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | -| `RatingKey` | *any* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | -| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | -| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | -| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | -| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | -| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Studio` | *any* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | -| `Subtype` | *any* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | -| `Summary` | *any* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | -| `Tagline` | *any* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | -| `Theme` | *any* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | -| `Thumb` | *any* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | -| `TitleSort` | *any* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | -| `UserRating` | **float64* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | -| `ViewCount` | **int64* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | -| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | -| `ViewOffset` | **int64* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | -| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Year` | **int64* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | -| `ProcessingState` | [*operations.ProcessingState](../../models/operations/processingstate.md) | :heavy_minus_sign: | The state of processing if this generator is part of an optimizer playlist | -| `ProcessingStateContext` | [*operations.ProcessingStateContext](../../models/operations/processingstatecontext.md) | :heavy_minus_sign: | The error which could have occurred (or `good`) | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Title` | *string* | :heavy_check_mark: | The title of the item (e.g. “300” or “The Simpsons”) | | +| `Type` | *string* | :heavy_check_mark: | The type of the video item, such as `movie`, `episode`, or `clip`. | | +| `AbsoluteIndex` | **int* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | | +| `AddedAt` | *int64* | :heavy_check_mark: | In units of seconds since the epoch, returns the time at which the item was added to the library. | | +| `Art` | **string* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | /library/metadata/58683/art/1703239236 | +| `AudienceRating` | **float32* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | | +| `AudienceRatingImage` | **string* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | | +| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Banner` | **string* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | | +| `ChapterSource` | **string* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | media | +| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items associated with this media item. | 1 | +| `Composite` | **string* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | | +| `ContentRating` | **string* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | | +| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Duration` | **int* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | | +| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | | +| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | | +| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | | +| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | | +| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | | +| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | | +| `GUID` | **string* | :heavy_minus_sign: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 | +| `Guids` | [][operations.GetPlaylistGeneratorItemsGuids](../../models/operations/getplaylistgeneratoritemsguids.md) | :heavy_minus_sign: | N/A | | +| `Hero` | **string* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | | +| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | | +| `Index` | **int* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | | +| `Key` | *string* | :heavy_check_mark: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | | +| `LastViewedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `LeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | | +| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | | +| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | 2022-12-14 | +| `OriginalTitle` | **string* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | | +| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | | +| `ParentIndex` | **int* | :heavy_minus_sign: | The `index` of the parent | | +| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | | +| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | | +| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | | +| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | | +| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | | +| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | | +| `Rating` | **float32* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | | +| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `RatingCount` | **int* | :heavy_minus_sign: | Number of ratings under this metadata | | +| `RatingImage` | **string* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | | +| `RatingKey` | **string* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | | +| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | | +| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | | +| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | | +| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | | +| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Studio` | **string* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | | +| `Subtype` | **string* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | | +| `Summary` | **string* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | | +| `Tagline` | **string* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | | +| `Theme` | **string* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | /library/metadata/1/theme/1705636920 | +| `Thumb` | **string* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | /library/metadata/58683/thumb/1703239236 | +| `TitleSort` | **string* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | | +| `UserRating` | **float32* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | | +| `ViewCount` | **int* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | | +| `ViewedLeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | | +| `ViewOffset` | **int* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | | +| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Year` | **int* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | | +| `ProcessingState` | [*operations.ProcessingState](../../models/operations/processingstate.md) | :heavy_minus_sign: | The state of processing if this generator is part of an optimizer playlist | | +| `ProcessingStateContext` | [*operations.ProcessingStateContext](../../models/operations/processingstatecontext.md) | :heavy_minus_sign: | The error which could have occurred (or `good`) | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/getsectionimagerequest.md b/docs/models/operations/getsectionimagerequest.md index 1c5dcc9..888edf9 100644 --- a/docs/models/operations/getsectionimagerequest.md +++ b/docs/models/operations/getsectionimagerequest.md @@ -3,20 +3,20 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | -| `UpdatedAt` | *int64* | :heavy_check_mark: | The update time of the image. Used for busting cache. | | -| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries | | -| `Composite` | [*components.Composite](../../models/components/composite.md) | :heavy_minus_sign: | N/A | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `SectionID` | *int64* | :heavy_check_mark: | Section identifier | | +| `UpdatedAt` | *int64* | :heavy_check_mark: | The update time of the image. Used for busting cache. | | +| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:
- Fields: integer, boolean, tag, string, date, language
- Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
- Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
- Sorting: sort parameter with :desc, :nullsLast modifiers
- Grouping: group parameter
- Limits: limit parameter

Examples:
- Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24`
- String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24"
- Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10

See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries.
| {
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
} | +| `Composite` | [*components.Composite](../../models/components/composite.md) | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/getserverresourcesglobals.md b/docs/models/operations/getserverresourcesglobals.md new file mode 100644 index 0000000..7709bd6 --- /dev/null +++ b/docs/models/operations/getserverresourcesglobals.md @@ -0,0 +1,9 @@ +# GetServerResourcesGlobals + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | \ No newline at end of file diff --git a/docs/models/operations/getserverresourcesrequest.md b/docs/models/operations/getserverresourcesrequest.md new file mode 100644 index 0000000..42b9e55 --- /dev/null +++ b/docs/models/operations/getserverresourcesrequest.md @@ -0,0 +1,12 @@ +# GetServerResourcesRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `IncludeHTTPS` | [*operations.IncludeHTTPS](../../models/operations/includehttps.md) | :heavy_minus_sign: | Include Https entries in the results | 1 | +| `IncludeRelay` | [*operations.IncludeRelay](../../models/operations/includerelay.md) | :heavy_minus_sign: | Include Relay addresses in the results
E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400
| 1 | +| `IncludeIPv6` | [*operations.IncludeIPv6](../../models/operations/includeipv6.md) | :heavy_minus_sign: | Include IPv6 entries in the results | 1 | \ No newline at end of file diff --git a/docs/models/operations/getserverresourcesresponse.md b/docs/models/operations/getserverresourcesresponse.md new file mode 100644 index 0000000..1597307 --- /dev/null +++ b/docs/models/operations/getserverresourcesresponse.md @@ -0,0 +1,11 @@ +# GetServerResourcesResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `PlexDevices` | [][components.PlexDevice](../../models/components/plexdevice.md) | :heavy_minus_sign: | List of Plex Devices. This includes Plex hosted servers and clients | \ No newline at end of file diff --git a/docs/models/operations/gettagsrequest.md b/docs/models/operations/gettagsrequest.md index cc3996b..0edf308 100644 --- a/docs/models/operations/gettagsrequest.md +++ b/docs/models/operations/gettagsrequest.md @@ -3,17 +3,17 @@ ## Fields -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `Type` | **int64* | :heavy_minus_sign: | The metadata type to filter by | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `Type` | [*components.MediaType](../../models/components/mediatype.md) | :heavy_minus_sign: | The type of media to retrieve or filter by.

1 = movie
2 = show
3 = season
4 = episode
5 = artist
6 = album
7 = track
8 = photo_album
9 = photo

E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
| 2 | \ No newline at end of file diff --git a/docs/models/operations/gettasksbutlertask.md b/docs/models/operations/gettasksbutlertask.md new file mode 100644 index 0000000..452f6cd --- /dev/null +++ b/docs/models/operations/gettasksbutlertask.md @@ -0,0 +1,13 @@ +# GetTasksButlerTask + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | +| `Description` | **string* | :heavy_minus_sign: | A user-friendly description of the task | +| `Enabled` | **bool* | :heavy_minus_sign: | Whether this task is enabled or not | +| `Interval` | **int64* | :heavy_minus_sign: | The interval (in days) of when this task is run. A value of 1 is run every day, 7 is every week, etc. | +| `Name` | **string* | :heavy_minus_sign: | The name of the task | +| `ScheduleRandomized` | **bool* | :heavy_minus_sign: | Indicates whether the timing of the task is randomized within the butler interval | +| `Title` | **string* | :heavy_minus_sign: | A user-friendly title of the task | \ No newline at end of file diff --git a/docs/models/operations/gettokendetailsglobals.md b/docs/models/operations/gettokendetailsglobals.md new file mode 100644 index 0000000..208b208 --- /dev/null +++ b/docs/models/operations/gettokendetailsglobals.md @@ -0,0 +1,18 @@ +# GetTokenDetailsGlobals + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | \ No newline at end of file diff --git a/docs/models/operations/gettokendetailsrequest.md b/docs/models/operations/gettokendetailsrequest.md new file mode 100644 index 0000000..fc8845b --- /dev/null +++ b/docs/models/operations/gettokendetailsrequest.md @@ -0,0 +1,18 @@ +# GetTokenDetailsRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | \ No newline at end of file diff --git a/docs/models/operations/gettokendetailsresponse.md b/docs/models/operations/gettokendetailsresponse.md new file mode 100644 index 0000000..c88683e --- /dev/null +++ b/docs/models/operations/gettokendetailsresponse.md @@ -0,0 +1,11 @@ +# GetTokenDetailsResponse + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `UserPlexAccount` | [*components.UserPlexAccount](../../models/components/userplexaccount.md) | :heavy_minus_sign: | Logged in user details | \ No newline at end of file diff --git a/docs/models/operations/getusersglobals.md b/docs/models/operations/getusersglobals.md new file mode 100644 index 0000000..06bcad7 --- /dev/null +++ b/docs/models/operations/getusersglobals.md @@ -0,0 +1,18 @@ +# GetUsersGlobals + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | \ No newline at end of file diff --git a/docs/models/operations/getusersmediacontainer.md b/docs/models/operations/getusersmediacontainer.md new file mode 100644 index 0000000..625d8b9 --- /dev/null +++ b/docs/models/operations/getusersmediacontainer.md @@ -0,0 +1,15 @@ +# GetUsersMediaContainer + +Container holding user and server details. + + +## Fields + +| Field | Type | Required | Description | Example | +| ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | ---------------------------------------------------- | +| `FriendlyName` | *string* | :heavy_check_mark: | The friendly name of the Plex instance. | myPlex | +| `Identifier` | *string* | :heavy_check_mark: | N/A | com.plexapp.plugins.myplex | +| `MachineIdentifier` | *string* | :heavy_check_mark: | Unique Machine identifier of the Plex server. | 3dff4c4da3b1229a649aa574a9e2b419a684a20e | +| `TotalSize` | *int64* | :heavy_check_mark: | Total number of users. | 30 | +| `Size` | *int64* | :heavy_check_mark: | Number of users in the current response. | 30 | +| `User` | [][operations.User](../../models/operations/user.md) | :heavy_check_mark: | List of users with access to the Plex server. | | \ No newline at end of file diff --git a/docs/models/operations/getusersrequest.md b/docs/models/operations/getusersrequest.md new file mode 100644 index 0000000..d79d957 --- /dev/null +++ b/docs/models/operations/getusersrequest.md @@ -0,0 +1,18 @@ +# GetUsersRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | \ No newline at end of file diff --git a/docs/models/operations/getusersresponse.md b/docs/models/operations/getusersresponse.md new file mode 100644 index 0000000..ccf9143 --- /dev/null +++ b/docs/models/operations/getusersresponse.md @@ -0,0 +1,11 @@ +# GetUsersResponse + + +## Fields + +| Field | Type | Required | Description | +| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `Object` | [*operations.GetUsersResponseBody](../../models/operations/getusersresponsebody.md) | :heavy_minus_sign: | Successful response with media container data in JSON | \ No newline at end of file diff --git a/docs/models/operations/getusersresponsebody.md b/docs/models/operations/getusersresponsebody.md new file mode 100644 index 0000000..54d9b9e --- /dev/null +++ b/docs/models/operations/getusersresponsebody.md @@ -0,0 +1,10 @@ +# GetUsersResponseBody + +Successful response with media container data in JSON + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | +| `MediaContainer` | [*operations.GetUsersMediaContainer](../../models/operations/getusersmediacontainer.md) | :heavy_minus_sign: | Container holding user and server details. | \ No newline at end of file diff --git a/docs/models/operations/guids.md b/docs/models/operations/guids.md new file mode 100644 index 0000000..00d6170 --- /dev/null +++ b/docs/models/operations/guids.md @@ -0,0 +1,8 @@ +# Guids + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ID` | *string* | :heavy_check_mark: | The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb://
| {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
} | \ No newline at end of file diff --git a/docs/models/operations/home.md b/docs/models/operations/home.md new file mode 100644 index 0000000..d5a389b --- /dev/null +++ b/docs/models/operations/home.md @@ -0,0 +1,11 @@ +# Home + +Indicates if the user is part of a home group. + + +## Values + +| Name | Value | +| ------------- | ------------- | +| `HomeDisable` | 0 | +| `HomeEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/includehttps.md b/docs/models/operations/includehttps.md new file mode 100644 index 0000000..d6fbce1 --- /dev/null +++ b/docs/models/operations/includehttps.md @@ -0,0 +1,11 @@ +# IncludeHTTPS + +Include Https entries in the results + + +## Values + +| Name | Value | +| ------------------- | ------------------- | +| `IncludeHTTPSFalse` | 0 | +| `IncludeHTTPSTrue` | 1 | \ No newline at end of file diff --git a/docs/models/operations/includeipv6.md b/docs/models/operations/includeipv6.md new file mode 100644 index 0000000..693e61d --- /dev/null +++ b/docs/models/operations/includeipv6.md @@ -0,0 +1,11 @@ +# IncludeIPv6 + +Include IPv6 entries in the results + + +## Values + +| Name | Value | +| ------------------ | ------------------ | +| `IncludeIPv6False` | 0 | +| `IncludeIPv6True` | 1 | \ No newline at end of file diff --git a/docs/models/operations/includerelay.md b/docs/models/operations/includerelay.md new file mode 100644 index 0000000..2c94a52 --- /dev/null +++ b/docs/models/operations/includerelay.md @@ -0,0 +1,13 @@ +# IncludeRelay + +Include Relay addresses in the results +E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400 + + + +## Values + +| Name | Value | +| ------------------- | ------------------- | +| `IncludeRelayFalse` | 0 | +| `IncludeRelayTrue` | 1 | \ No newline at end of file diff --git a/docs/models/operations/internalpaymentmethod.md b/docs/models/operations/internalpaymentmethod.md new file mode 100644 index 0000000..f1103c2 --- /dev/null +++ b/docs/models/operations/internalpaymentmethod.md @@ -0,0 +1,7 @@ +# InternalPaymentMethod + + +## Fields + +| Field | Type | Required | Description | +| ----------- | ----------- | ----------- | ----------- | \ No newline at end of file diff --git a/docs/models/operations/listcontentrequest.md b/docs/models/operations/listcontentrequest.md index dd6e68c..3fa1b2a 100644 --- a/docs/models/operations/listcontentrequest.md +++ b/docs/models/operations/listcontentrequest.md @@ -3,18 +3,22 @@ ## Fields -| Field | Type | Required | Description | Example | -| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries | | -| `SectionID` | *string* | :heavy_check_mark: | The id of the section | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `XPlexContainerStart` | **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.
By default this is 0
| 0 | +| `XPlexContainerSize` | **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.
By default this is 50
| 50 | +| `MediaQuery` | [*components.MediaQuery](../../models/components/mediaquery.md) | :heavy_minus_sign: | A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic.

The query supports:
- Fields: integer, boolean, tag, string, date, language
- Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type)
- Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR)
- Sorting: sort parameter with :desc, :nullsLast modifiers
- Grouping: group parameter
- Limits: limit parameter

Examples:
- Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24`
- String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24"
- Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10

See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries.
| {
"type": 4,
"sourceType": 2,
"sort": "duration:desc,index"
} | +| `IncludeMeta` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | Adds the Meta object to the response
| 1 | +| `IncludeGuids` | [*components.BoolInt](../../models/components/boolint.md) | :heavy_minus_sign: | Adds the Guid object to the response
| 1 | +| `SectionID` | *string* | :heavy_check_mark: | The id of the section | | \ No newline at end of file diff --git a/docs/models/operations/mailingliststatus.md b/docs/models/operations/mailingliststatus.md new file mode 100644 index 0000000..d8b575a --- /dev/null +++ b/docs/models/operations/mailingliststatus.md @@ -0,0 +1,12 @@ +# MailingListStatus + +Your current mailing list status + + +## Values + +| Name | Value | +| ------------------------------- | ------------------------------- | +| `MailingListStatusActive` | active | +| `MailingListStatusUnsubscribed` | unsubscribed | +| `MailingListStatusRemoved` | removed | \ No newline at end of file diff --git a/docs/models/operations/metadata.md b/docs/models/operations/metadata.md index 9bb8e5c..5bd9617 100644 --- a/docs/models/operations/metadata.md +++ b/docs/models/operations/metadata.md @@ -10,76 +10,80 @@ Metadata items can often live in a hierarchy with relationships between them. F ## Fields -| Field | Type | Required | Description | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Player` | [*components.Player](../../models/components/player.md) | :heavy_minus_sign: | Information about the player being used for playback | -| `Session` | [*components.Session](../../models/components/session.md) | :heavy_minus_sign: | Information about the playback session | -| `User` | [*components.User](../../models/components/user.md) | :heavy_minus_sign: | The user playing the content | -| `Title` | *any* | :heavy_minus_sign: | The title of the item (e.g. “300” or “The Simpsons”) | -| `Type` | *any* | :heavy_minus_sign: | The type of the video item, such as `movie`, `episode`, or `clip`. | -| `AbsoluteIndex` | **int64* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | -| `AddedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was added to the library. | -| `Art` | *any* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | -| `AudienceRating` | **float64* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | -| `AudienceRatingImage` | *any* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | -| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Banner` | *any* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | -| `ChapterSource` | *any* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | -| `Composite` | *any* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | -| `ContentRating` | *any* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | -| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Duration` | **int64* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | -| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | -| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | -| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | -| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | -| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | -| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | -| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | -| `GUID` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Hero` | *any* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | -| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | -| `Index` | **int64* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | -| `Key` | *any* | :heavy_minus_sign: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | -| `LastViewedAt` | **int64* | :heavy_minus_sign: | When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. | -| `LeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | -| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | -| `OriginallyAvailableAt` | *any* | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | -| `OriginalTitle` | *any* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | -| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | -| `ParentIndex` | **int64* | :heavy_minus_sign: | The `index` of the parent | -| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | -| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | -| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | -| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | -| `PrimaryExtraKey` | *any* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | -| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | -| `Rating` | **float64* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | -| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `RatingCount` | **int64* | :heavy_minus_sign: | Number of ratings under this metadata | -| `RatingImage` | *any* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | -| `RatingKey` | *any* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | -| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | -| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | -| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | -| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | -| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | -| `Studio` | *any* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | -| `Subtype` | *any* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | -| `Summary` | *any* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | -| `Tagline` | *any* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | -| `Theme` | *any* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | -| `Thumb` | *any* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | -| `TitleSort` | *any* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | -| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | -| `UserRating` | **float64* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | -| `ViewCount` | **int64* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | -| `ViewedLeafCount` | **int64* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | -| `ViewOffset` | **int64* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | -| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | -| `Year` | **int64* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | -| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Player` | [*components.Player](../../models/components/player.md) | :heavy_minus_sign: | Information about the player being used for playback | | +| `Session` | [*components.Session](../../models/components/session.md) | :heavy_minus_sign: | Information about the playback session | | +| `User` | [*components.User](../../models/components/user.md) | :heavy_minus_sign: | The user playing the content | | +| `Title` | *string* | :heavy_check_mark: | The title of the item (e.g. “300” or “The Simpsons”) | | +| `Type` | *string* | :heavy_check_mark: | The type of the video item, such as `movie`, `episode`, or `clip`. | | +| `AbsoluteIndex` | **int* | :heavy_minus_sign: | When present, contains the disc number for a track on multi-disc albums. | | +| `AddedAt` | *int64* | :heavy_check_mark: | In units of seconds since the epoch, returns the time at which the item was added to the library. | | +| `Art` | **string* | :heavy_minus_sign: | When present, the URL for the background artwork for the item. | /library/metadata/58683/art/1703239236 | +| `AudienceRating` | **float32* | :heavy_minus_sign: | Some rating systems separate reviewer ratings from audience ratings | | +| `AudienceRatingImage` | **string* | :heavy_minus_sign: | A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). | | +| `Autotag` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Banner` | **string* | :heavy_minus_sign: | When present, the URL for a banner graphic for the item. | | +| `ChapterSource` | **string* | :heavy_minus_sign: | When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). | media | +| `ChildCount` | **int* | :heavy_minus_sign: | The number of child items associated with this media item. | 1 | +| `Composite` | **string* | :heavy_minus_sign: | When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). | | +| `ContentRating` | **string* | :heavy_minus_sign: | If known, the content rating (e.g. MPAA) for an item. | | +| `Country` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Director` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Duration` | **int* | :heavy_minus_sign: | When present, the duration for the item, in units of milliseconds. | | +| `Filter` | [][components.Filter](../../models/components/filter.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Genre` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `GrandparentArt` | **string* | :heavy_minus_sign: | The `art` of the grandparent | | +| `GrandparentGUID` | **string* | :heavy_minus_sign: | The GUID of the grandparent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `GrandparentHero` | **string* | :heavy_minus_sign: | The `hero` of the grandparent | | +| `GrandparentKey` | **string* | :heavy_minus_sign: | The `key` of the grandparent | | +| `GrandparentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the grandparent | | +| `GrandparentTheme` | **string* | :heavy_minus_sign: | The `theme` of the grandparent | | +| `GrandparentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the grandparent | | +| `GrandparentTitle` | **string* | :heavy_minus_sign: | The `title` of the grandparent | | +| `GUID` | **string* | :heavy_minus_sign: | The globally unique identifier for the media item. | plex://movie/5d7768ba96b655001fdc0408 | +| `Guids` | [][operations.Guids](../../models/operations/guids.md) | :heavy_minus_sign: | N/A | | +| `Hero` | **string* | :heavy_minus_sign: | When present, the URL for a hero image for the item. | | +| `Image` | [][components.Image](../../models/components/image.md) | :heavy_minus_sign: | N/A | | +| `Index` | **int* | :heavy_minus_sign: | When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. | | +| `Key` | *string* | :heavy_check_mark: | The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. | | +| `LastViewedAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `LeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of total episodes. | | +| `Media` | [][components.Media](../../models/components/media.md) | :heavy_minus_sign: | N/A | | +| `OriginallyAvailableAt` | [*types.Date](../../types/date.md) | :heavy_minus_sign: | When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. | 2022-12-14 | +| `OriginalTitle` | **string* | :heavy_minus_sign: | When present, used to indicate an item's original title, e.g. a movie's foreign title. | | +| `ParentGUID` | **string* | :heavy_minus_sign: | The GUID of the parent media item. | plex://show/5d9c081b170e24001f2a7be4 | +| `ParentHero` | **string* | :heavy_minus_sign: | The `hero` of the parent | | +| `ParentIndex` | **int* | :heavy_minus_sign: | The `index` of the parent | | +| `ParentKey` | **string* | :heavy_minus_sign: | The `key` of the parent | | +| `ParentRatingKey` | **string* | :heavy_minus_sign: | The `ratingKey` of the parent | | +| `ParentThumb` | **string* | :heavy_minus_sign: | The `thumb` of the parent | | +| `ParentTitle` | **string* | :heavy_minus_sign: | The `title` of the parent | | +| `PrimaryExtraKey` | **string* | :heavy_minus_sign: | Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. | | +| `Prompt` | **string* | :heavy_minus_sign: | Prompt to give the user for this directory (such as `Search Movies`) | | +| `Rating` | **float32* | :heavy_minus_sign: | When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. | | +| `RatingArray` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `RatingCount` | **int* | :heavy_minus_sign: | Number of ratings under this metadata | | +| `RatingImage` | **string* | :heavy_minus_sign: | When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. | | +| `RatingKey` | **string* | :heavy_minus_sign: | This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. | | +| `Role` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Search` | **bool* | :heavy_minus_sign: | Indicates this is a search directory | | +| `Secondary` | **bool* | :heavy_minus_sign: | Used by old clients to provide nested menus allowing for primative (but structured) navigation. | | +| `SkipChildren` | **bool* | :heavy_minus_sign: | When found on a show item, indicates that the children (seasons) should be skipped in favor of the grandchildren (episodes). Useful for mini-series, etc. | | +| `SkipParent` | **bool* | :heavy_minus_sign: | When present on an episode or track item, indicates parent should be skipped in favor of grandparent (show). | | +| `Sort` | [][components.Sort](../../models/components/sort.md) | :heavy_minus_sign: | Typically only seen in metadata at a library's top level | | +| `Studio` | **string* | :heavy_minus_sign: | When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). | | +| `Subtype` | **string* | :heavy_minus_sign: | The subtype of the video item, such as `photo` when the video item is in a photo library | | +| `Summary` | **string* | :heavy_minus_sign: | When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). | | +| `Tagline` | **string* | :heavy_minus_sign: | When present, a pithy one-liner about the item (usually only seen for movies). | | +| `Theme` | **string* | :heavy_minus_sign: | When present, the URL for theme music for the item (usually only for TV shows). | /library/metadata/1/theme/1705636920 | +| `Thumb` | **string* | :heavy_minus_sign: | When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. | /library/metadata/58683/thumb/1703239236 | +| `TitleSort` | **string* | :heavy_minus_sign: | Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). | | +| `UpdatedAt` | **int64* | :heavy_minus_sign: | In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). | | +| `UserRating` | **float32* | :heavy_minus_sign: | When the user has rated an item, this contains the user rating | | +| `ViewCount` | **int* | :heavy_minus_sign: | When a users has completed watched or listened to an item, this attribute contains the number of consumptions. | | +| `ViewedLeafCount` | **int* | :heavy_minus_sign: | For shows and seasons, contains the number of viewed episodes. | | +| `ViewOffset` | **int* | :heavy_minus_sign: | When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. | | +| `Writer` | [][components.Tag](../../models/components/tag.md) | :heavy_minus_sign: | N/A | | +| `Year` | **int* | :heavy_minus_sign: | When present, the year associated with the item's release (e.g. release year for a movie). | | +| `AdditionalProperties` | map[string]*any* | :heavy_minus_sign: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/owned.md b/docs/models/operations/owned.md new file mode 100644 index 0000000..e989d43 --- /dev/null +++ b/docs/models/operations/owned.md @@ -0,0 +1,11 @@ +# Owned + +Indicates if the user owns the server. + + +## Values + +| Name | Value | +| -------------- | -------------- | +| `OwnedDisable` | 0 | +| `OwnedEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/pastsubscription.md b/docs/models/operations/pastsubscription.md new file mode 100644 index 0000000..32008a8 --- /dev/null +++ b/docs/models/operations/pastsubscription.md @@ -0,0 +1,22 @@ +# PastSubscription + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | +| `ID` | *string* | :heavy_check_mark: | N/A | | +| `Mode` | *string* | :heavy_check_mark: | N/A | | +| `RenewsAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 | +| `EndsAt` | *int64* | :heavy_check_mark: | N/A | 1556281940 | +| `Canceled` | **bool* | :heavy_minus_sign: | N/A | false | +| `GracePeriod` | **bool* | :heavy_minus_sign: | N/A | false | +| `OnHold` | **bool* | :heavy_minus_sign: | N/A | false | +| `CanReactivate` | **bool* | :heavy_minus_sign: | N/A | false | +| `CanUpgrade` | **bool* | :heavy_minus_sign: | N/A | false | +| `CanDowngrade` | **bool* | :heavy_minus_sign: | N/A | false | +| `CanConvert` | **bool* | :heavy_minus_sign: | N/A | false | +| `Type` | *string* | :heavy_check_mark: | N/A | plexpass | +| `Transfer` | *string* | :heavy_check_mark: | N/A | | +| `State` | [operations.PostUsersSignInDataState](../../models/operations/postuserssignindatastate.md) | :heavy_check_mark: | N/A | ended | +| `Billing` | [operations.Billing](../../models/operations/billing.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/pathparambutlertask.md b/docs/models/operations/pathparambutlertask.md new file mode 100644 index 0000000..8b971c4 --- /dev/null +++ b/docs/models/operations/pathparambutlertask.md @@ -0,0 +1,31 @@ +# PathParamButlerTask + +The task name + + +## Values + +| Name | Value | +| ----------------------------------------------------- | ----------------------------------------------------- | +| `PathParamButlerTaskAutomaticUpdates` | AutomaticUpdates | +| `PathParamButlerTaskBackupDatabase` | BackupDatabase | +| `PathParamButlerTaskButlerTaskGenerateAdMarkers` | ButlerTaskGenerateAdMarkers | +| `PathParamButlerTaskButlerTaskGenerateCreditsMarkers` | ButlerTaskGenerateCreditsMarkers | +| `PathParamButlerTaskButlerTaskGenerateIntroMarkers` | ButlerTaskGenerateIntroMarkers | +| `PathParamButlerTaskButlerTaskGenerateVoiceActivity` | ButlerTaskGenerateVoiceActivity | +| `PathParamButlerTaskCleanOldBundles` | CleanOldBundles | +| `PathParamButlerTaskCleanOldCacheFiles` | CleanOldCacheFiles | +| `PathParamButlerTaskDeepMediaAnalysis` | DeepMediaAnalysis | +| `PathParamButlerTaskGarbageCollectBlobs` | GarbageCollectBlobs | +| `PathParamButlerTaskGarbageCollectLibraryMedia` | GarbageCollectLibraryMedia | +| `PathParamButlerTaskGenerateBlurHashes` | GenerateBlurHashes | +| `PathParamButlerTaskGenerateChapterThumbs` | GenerateChapterThumbs | +| `PathParamButlerTaskGenerateMediaIndexFiles` | GenerateMediaIndexFiles | +| `PathParamButlerTaskLoudnessAnalysis` | LoudnessAnalysis | +| `PathParamButlerTaskMusicAnalysis` | MusicAnalysis | +| `PathParamButlerTaskOptimizeDatabase` | OptimizeDatabase | +| `PathParamButlerTaskRefreshEpgGuides` | RefreshEpgGuides | +| `PathParamButlerTaskRefreshLibraries` | RefreshLibraries | +| `PathParamButlerTaskRefreshLocalMedia` | RefreshLocalMedia | +| `PathParamButlerTaskRefreshPeriodicMetadata` | RefreshPeriodicMetadata | +| `PathParamButlerTaskUpgradeMediaAnalysis` | UpgradeMediaAnalysis | \ No newline at end of file diff --git a/docs/models/operations/pathparamtask.md b/docs/models/operations/pathparamtask.md deleted file mode 100644 index 51bf250..0000000 --- a/docs/models/operations/pathparamtask.md +++ /dev/null @@ -1,31 +0,0 @@ -# PathParamTask - -The task name - - -## Values - -| Name | Value | -| ----------------------------------------------- | ----------------------------------------------- | -| `PathParamTaskAutomaticUpdates` | AutomaticUpdates | -| `PathParamTaskBackupDatabase` | BackupDatabase | -| `PathParamTaskButlerTaskGenerateAdMarkers` | ButlerTaskGenerateAdMarkers | -| `PathParamTaskButlerTaskGenerateCreditsMarkers` | ButlerTaskGenerateCreditsMarkers | -| `PathParamTaskButlerTaskGenerateIntroMarkers` | ButlerTaskGenerateIntroMarkers | -| `PathParamTaskButlerTaskGenerateVoiceActivity` | ButlerTaskGenerateVoiceActivity | -| `PathParamTaskCleanOldBundles` | CleanOldBundles | -| `PathParamTaskCleanOldCacheFiles` | CleanOldCacheFiles | -| `PathParamTaskDeepMediaAnalysis` | DeepMediaAnalysis | -| `PathParamTaskGarbageCollectBlobs` | GarbageCollectBlobs | -| `PathParamTaskGarbageCollectLibraryMedia` | GarbageCollectLibraryMedia | -| `PathParamTaskGenerateBlurHashes` | GenerateBlurHashes | -| `PathParamTaskGenerateChapterThumbs` | GenerateChapterThumbs | -| `PathParamTaskGenerateMediaIndexFiles` | GenerateMediaIndexFiles | -| `PathParamTaskLoudnessAnalysis` | LoudnessAnalysis | -| `PathParamTaskMusicAnalysis` | MusicAnalysis | -| `PathParamTaskOptimizeDatabase` | OptimizeDatabase | -| `PathParamTaskRefreshEpgGuides` | RefreshEpgGuides | -| `PathParamTaskRefreshLibraries` | RefreshLibraries | -| `PathParamTaskRefreshLocalMedia` | RefreshLocalMedia | -| `PathParamTaskRefreshPeriodicMetadata` | RefreshPeriodicMetadata | -| `PathParamTaskUpgradeMediaAnalysis` | UpgradeMediaAnalysis | \ No newline at end of file diff --git a/docs/models/operations/pending.md b/docs/models/operations/pending.md new file mode 100644 index 0000000..7d8772f --- /dev/null +++ b/docs/models/operations/pending.md @@ -0,0 +1,11 @@ +# Pending + +Indicates if the server is pending approval. + + +## Values + +| Name | Value | +| ---------------- | ---------------- | +| `PendingDisable` | 0 | +| `PendingEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindataauthenticationstatus.md b/docs/models/operations/postuserssignindataauthenticationstatus.md new file mode 100644 index 0000000..7ca0040 --- /dev/null +++ b/docs/models/operations/postuserssignindataauthenticationstatus.md @@ -0,0 +1,11 @@ +# PostUsersSignInDataAuthenticationStatus + +String representation of subscriptionActive + + +## Values + +| Name | Value | +| ------------------------------------------------- | ------------------------------------------------- | +| `PostUsersSignInDataAuthenticationStatusInactive` | Inactive | +| `PostUsersSignInDataAuthenticationStatusActive` | Active | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindataglobals.md b/docs/models/operations/postuserssignindataglobals.md new file mode 100644 index 0000000..eabe97e --- /dev/null +++ b/docs/models/operations/postuserssignindataglobals.md @@ -0,0 +1,18 @@ +# PostUsersSignInDataGlobals + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindatarequest.md b/docs/models/operations/postuserssignindatarequest.md new file mode 100644 index 0000000..f1abff4 --- /dev/null +++ b/docs/models/operations/postuserssignindatarequest.md @@ -0,0 +1,19 @@ +# PostUsersSignInDataRequest + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `RequestBody` | [*operations.PostUsersSignInDataRequestBody](../../models/operations/postuserssignindatarequestbody.md) | :heavy_minus_sign: | Login credentials | | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindatarequestbody.md b/docs/models/operations/postuserssignindatarequestbody.md new file mode 100644 index 0000000..cadfc27 --- /dev/null +++ b/docs/models/operations/postuserssignindatarequestbody.md @@ -0,0 +1,13 @@ +# PostUsersSignInDataRequestBody + +Login credentials + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------ | ------------------ | ------------------ | ------------------ | ------------------ | +| `Login` | *string* | :heavy_check_mark: | N/A | username@email.com | +| `Password` | *string* | :heavy_check_mark: | N/A | password123 | +| `RememberMe` | **bool* | :heavy_minus_sign: | N/A | | +| `VerificationCode` | **string* | :heavy_minus_sign: | N/A | 123456 | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindataresponse.md b/docs/models/operations/postuserssignindataresponse.md new file mode 100644 index 0000000..13460f0 --- /dev/null +++ b/docs/models/operations/postuserssignindataresponse.md @@ -0,0 +1,11 @@ +# PostUsersSignInDataResponse + + +## Fields + +| Field | Type | Required | Description | +| --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | +| `ContentType` | *string* | :heavy_check_mark: | HTTP response content type for this operation | +| `StatusCode` | *int* | :heavy_check_mark: | HTTP response status code for this operation | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_check_mark: | Raw HTTP response; suitable for custom response parsing | +| `UserPlexAccount` | [*operations.PostUsersSignInDataUserPlexAccount](../../models/operations/postuserssignindatauserplexaccount.md) | :heavy_minus_sign: | Returns the user account data with a valid auth token | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindatastate.md b/docs/models/operations/postuserssignindatastate.md new file mode 100644 index 0000000..52cf607 --- /dev/null +++ b/docs/models/operations/postuserssignindatastate.md @@ -0,0 +1,8 @@ +# PostUsersSignInDataState + + +## Values + +| Name | Value | +| ------------------------------- | ------------------------------- | +| `PostUsersSignInDataStateEnded` | ended | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindatastatus.md b/docs/models/operations/postuserssignindatastatus.md new file mode 100644 index 0000000..b2a77ed --- /dev/null +++ b/docs/models/operations/postuserssignindatastatus.md @@ -0,0 +1,11 @@ +# PostUsersSignInDataStatus + +String representation of subscriptionActive + + +## Values + +| Name | Value | +| ----------------------------------- | ----------------------------------- | +| `PostUsersSignInDataStatusInactive` | Inactive | +| `PostUsersSignInDataStatusActive` | Active | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindatasubscription.md b/docs/models/operations/postuserssignindatasubscription.md new file mode 100644 index 0000000..5594210 --- /dev/null +++ b/docs/models/operations/postuserssignindatasubscription.md @@ -0,0 +1,13 @@ +# PostUsersSignInDataSubscription + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | +| `Features` | []*string* | :heavy_minus_sign: | List of features allowed on your Plex Pass subscription | | +| `Active` | **bool* | :heavy_minus_sign: | If the account's Plex Pass subscription is active | true | +| `SubscribedAt` | **string* | :heavy_minus_sign: | Date the account subscribed to Plex Pass | 2021-04-12T18:21:12Z | +| `Status` | [*operations.PostUsersSignInDataAuthenticationStatus](../../models/operations/postuserssignindataauthenticationstatus.md) | :heavy_minus_sign: | String representation of subscriptionActive | Inactive | +| `PaymentService` | **string* | :heavy_minus_sign: | Payment service used for your Plex Pass subscription | | +| `Plan` | **string* | :heavy_minus_sign: | Name of Plex Pass subscription plan | | \ No newline at end of file diff --git a/docs/models/operations/postuserssignindatauserplexaccount.md b/docs/models/operations/postuserssignindatauserplexaccount.md new file mode 100644 index 0000000..c9c8d26 --- /dev/null +++ b/docs/models/operations/postuserssignindatauserplexaccount.md @@ -0,0 +1,52 @@ +# PostUsersSignInDataUserPlexAccount + +Returns the user account data with a valid auth token + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `AdsConsent` | **bool* | :heavy_minus_sign: | Unknown | | +| `AdsConsentReminderAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `AdsConsentSetAt` | **int64* | :heavy_minus_sign: | N/A | 1556281940 | +| `Anonymous` | **bool* | :heavy_minus_sign: | Unknown | | +| `AuthToken` | *string* | :heavy_check_mark: | The account token | CxoUzBTSV5hsxjTpFKaf | +| `BackupCodesCreated` | **bool* | :heavy_minus_sign: | If the two-factor authentication backup codes have been created | | +| `Confirmed` | **bool* | :heavy_minus_sign: | If the account has been confirmed | | +| `Country` | **string* | :heavy_minus_sign: | The account country | US | +| `Email` | *string* | :heavy_check_mark: | The account email address | username@email.com | +| `EmailOnlyAuth` | **bool* | :heavy_minus_sign: | If login with email only is enabled | | +| `ExperimentalFeatures` | **bool* | :heavy_minus_sign: | If experimental features are enabled | | +| `FriendlyName` | *string* | :heavy_check_mark: | Your account full name | friendlyUsername | +| `Entitlements` | []*string* | :heavy_minus_sign: | List of devices your allowed to use with this account | [] | +| `Guest` | **bool* | :heavy_minus_sign: | If the account is a Plex Home guest user | | +| `HasPassword` | **bool* | :heavy_minus_sign: | If the account has a password | | +| `Home` | **bool* | :heavy_minus_sign: | If the account is a Plex Home user | | +| `HomeAdmin` | **bool* | :heavy_minus_sign: | If the account is the Plex Home admin | | +| `HomeSize` | **int* | :heavy_minus_sign: | The number of accounts in the Plex Home | 1 | +| `ID` | *int* | :heavy_check_mark: | The Plex account ID | 13692262 | +| `JoinedAt` | *int64* | :heavy_check_mark: | Unix epoch datetime in seconds | 1556281940 | +| `Locale` | **string* | :heavy_minus_sign: | The account locale | | +| `MailingListActive` | **bool* | :heavy_minus_sign: | If you are subscribed to the Plex newsletter | | +| `MailingListStatus` | [*operations.MailingListStatus](../../models/operations/mailingliststatus.md) | :heavy_minus_sign: | Your current mailing list status | active | +| `MaxHomeSize` | **int* | :heavy_minus_sign: | The maximum number of accounts allowed in the Plex Home | 15 | +| ~~`Pin`~~ | **string* | :heavy_minus_sign: | : warning: ** DEPRECATED **: This will be removed in a future release, please migrate away from it as soon as possible.

[Might be removed] The hashed Plex Home PIN | | +| `Profile` | [*components.UserProfile](../../models/components/userprofile.md) | :heavy_minus_sign: | N/A | | +| `Protected` | **bool* | :heavy_minus_sign: | If the account has a Plex Home PIN enabled | | +| `RememberExpiresAt` | **int64* | :heavy_minus_sign: | Unix epoch datetime in seconds | 1556281940 | +| `Restricted` | **bool* | :heavy_minus_sign: | If the account is a Plex Home managed user | | +| `Roles` | []*string* | :heavy_minus_sign: | [Might be removed] List of account roles. Plexpass membership listed here | | +| `ScrobbleTypes` | **string* | :heavy_minus_sign: | Unknown | | +| `Services` | [][operations.Services](../../models/operations/services.md) | :heavy_minus_sign: | N/A | | +| `Subscription` | [*operations.Subscription](../../models/operations/subscription.md) | :heavy_minus_sign: | If the account's Plex Pass subscription is active | | +| `SubscriptionDescription` | **string* | :heavy_minus_sign: | Description of the Plex Pass subscription | | +| `Subscriptions` | [][operations.PostUsersSignInDataSubscription](../../models/operations/postuserssignindatasubscription.md) | :heavy_minus_sign: | N/A | | +| `Thumb` | **string* | :heavy_minus_sign: | URL of the account thumbnail | https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101 | +| `Title` | *string* | :heavy_check_mark: | The title of the account (username or friendly name) | UsernameTitle | +| `TwoFactorEnabled` | **bool* | :heavy_minus_sign: | If two-factor authentication is enabled | | +| `Username` | *string* | :heavy_check_mark: | The account username | Username | +| `UUID` | *string* | :heavy_check_mark: | The account UUID | dae343c1f45beb4f | +| `AttributionPartner` | **string* | :heavy_minus_sign: | N/A | | +| `PastSubscriptions` | [][operations.PastSubscription](../../models/operations/pastsubscription.md) | :heavy_check_mark: | N/A | | +| `Trials` | [][operations.Trials](../../models/operations/trials.md) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/models/operations/protected.md b/docs/models/operations/protected.md new file mode 100644 index 0000000..05f5e78 --- /dev/null +++ b/docs/models/operations/protected.md @@ -0,0 +1,11 @@ +# Protected + +Indicates whether the account is protected. + + +## Values + +| Name | Value | +| ------------------ | ------------------ | +| `ProtectedDisable` | 0 | +| `ProtectedEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/restricted.md b/docs/models/operations/restricted.md new file mode 100644 index 0000000..861f407 --- /dev/null +++ b/docs/models/operations/restricted.md @@ -0,0 +1,11 @@ +# Restricted + +Indicates if the user has restricted access. + + +## Values + +| Name | Value | +| ------------------- | ------------------- | +| `RestrictedDisable` | 0 | +| `RestrictedEnable` | 1 | \ No newline at end of file diff --git a/docs/models/operations/server.md b/docs/models/operations/server.md new file mode 100644 index 0000000..b83515b --- /dev/null +++ b/docs/models/operations/server.md @@ -0,0 +1,16 @@ +# Server + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `ID` | *int64* | :heavy_check_mark: | Unique ID of the server of the connected user | 907759180 | +| `ServerID` | *int64* | :heavy_check_mark: | ID of the actual Plex server. | 9999999 | +| `MachineIdentifier` | *string* | :heavy_check_mark: | Machine identifier of the Plex server. | fbb8aa6be6e0c997c6268bc2b4431c8807f70a3 | +| `Name` | *string* | :heavy_check_mark: | Name of the Plex server of the connected user. | ConnectedUserFlix | +| `LastSeenAt` | *int64* | :heavy_check_mark: | Unix epoch datetime in seconds | 1556281940 | +| `NumLibraries` | *int64* | :heavy_check_mark: | Number of libraries in the server this user has access to. | 16 | +| `AllLibraries` | [*operations.AllLibraries](../../models/operations/alllibraries.md) | :heavy_minus_sign: | N/A | 1 | +| `Owned` | [*operations.Owned](../../models/operations/owned.md) | :heavy_minus_sign: | N/A | 1 | +| `Pending` | [*operations.Pending](../../models/operations/pending.md) | :heavy_minus_sign: | N/A | 1 | \ No newline at end of file diff --git a/docs/models/operations/services.md b/docs/models/operations/services.md new file mode 100644 index 0000000..d124c3f --- /dev/null +++ b/docs/models/operations/services.md @@ -0,0 +1,12 @@ +# Services + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | ------------------------------------------------------ | +| `Identifier` | *string* | :heavy_check_mark: | N/A | metadata-dev | +| `Endpoint` | *string* | :heavy_check_mark: | N/A | https://epg.provider.plex.tv | +| `Token` | *string* | :heavy_check_mark: | N/A | DjoMtqFAGRL1uVtCyF1dKIorTbShJeqv | +| `Secret` | *string* | :heavy_check_mark: | N/A | | +| `Status` | [operations.Status](../../models/operations/status.md) | :heavy_check_mark: | N/A | online | \ No newline at end of file diff --git a/docs/models/operations/starttaskrequest.md b/docs/models/operations/starttaskrequest.md index b28e9a9..1a43d63 100644 --- a/docs/models/operations/starttaskrequest.md +++ b/docs/models/operations/starttaskrequest.md @@ -3,17 +3,17 @@ ## Fields -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -------------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `Task` | [operations.PathParamTask](../../models/operations/pathparamtask.md) | :heavy_check_mark: | The task name | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `ButlerTask` | [operations.PathParamButlerTask](../../models/operations/pathparambutlertask.md) | :heavy_check_mark: | The task name | | \ No newline at end of file diff --git a/docs/models/operations/status.md b/docs/models/operations/status.md index b9f2ffa..febb02f 100644 --- a/docs/models/operations/status.md +++ b/docs/models/operations/status.md @@ -1,20 +1,9 @@ # Status -The state of this queue - - deciding: At least one item is still being decided - - waiting: At least one item is waiting for transcode and none are currently transcoding - - processing: At least one item is being transcoded - - done: All items are available (or potentially expired) - - error: At least one item has encountered an error - - ## Values -| Name | Value | -| ------------------ | ------------------ | -| `StatusDeciding` | deciding | -| `StatusWaiting` | waiting | -| `StatusProcessing` | processing | -| `StatusDone` | done | -| `StatusError` | error | \ No newline at end of file +| Name | Value | +| --------------- | --------------- | +| `StatusOnline` | online | +| `StatusOffline` | offline | \ No newline at end of file diff --git a/docs/models/operations/stoptaskrequest.md b/docs/models/operations/stoptaskrequest.md index 4c4efe2..a95751e 100644 --- a/docs/models/operations/stoptaskrequest.md +++ b/docs/models/operations/stoptaskrequest.md @@ -16,4 +16,4 @@ | `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | | `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | | `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `Task` | [operations.Task](../../models/operations/task.md) | :heavy_check_mark: | The task name | | \ No newline at end of file +| `ButlerTask` | [operations.ButlerTask](../../models/operations/butlertask.md) | :heavy_check_mark: | The task name | | \ No newline at end of file diff --git a/docs/models/operations/subscription.md b/docs/models/operations/subscription.md new file mode 100644 index 0000000..59520df --- /dev/null +++ b/docs/models/operations/subscription.md @@ -0,0 +1,15 @@ +# Subscription + +If the account's Plex Pass subscription is active + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `Features` | []*string* | :heavy_minus_sign: | List of features allowed on your Plex Pass subscription | | +| `Active` | **bool* | :heavy_minus_sign: | If the account's Plex Pass subscription is active | true | +| `SubscribedAt` | **string* | :heavy_minus_sign: | Date the account subscribed to Plex Pass | 2021-04-12T18:21:12Z | +| `Status` | [*operations.PostUsersSignInDataStatus](../../models/operations/postuserssignindatastatus.md) | :heavy_minus_sign: | String representation of subscriptionActive | Inactive | +| `PaymentService` | **string* | :heavy_minus_sign: | Payment service used for your Plex Pass subscription | | +| `Plan` | **string* | :heavy_minus_sign: | Name of Plex Pass subscription plan | | \ No newline at end of file diff --git a/docs/models/operations/task.md b/docs/models/operations/task.md deleted file mode 100644 index cc452ec..0000000 --- a/docs/models/operations/task.md +++ /dev/null @@ -1,31 +0,0 @@ -# Task - -The task name - - -## Values - -| Name | Value | -| -------------------------------------- | -------------------------------------- | -| `TaskAutomaticUpdates` | AutomaticUpdates | -| `TaskBackupDatabase` | BackupDatabase | -| `TaskButlerTaskGenerateAdMarkers` | ButlerTaskGenerateAdMarkers | -| `TaskButlerTaskGenerateCreditsMarkers` | ButlerTaskGenerateCreditsMarkers | -| `TaskButlerTaskGenerateIntroMarkers` | ButlerTaskGenerateIntroMarkers | -| `TaskButlerTaskGenerateVoiceActivity` | ButlerTaskGenerateVoiceActivity | -| `TaskCleanOldBundles` | CleanOldBundles | -| `TaskCleanOldCacheFiles` | CleanOldCacheFiles | -| `TaskDeepMediaAnalysis` | DeepMediaAnalysis | -| `TaskGarbageCollectBlobs` | GarbageCollectBlobs | -| `TaskGarbageCollectLibraryMedia` | GarbageCollectLibraryMedia | -| `TaskGenerateBlurHashes` | GenerateBlurHashes | -| `TaskGenerateChapterThumbs` | GenerateChapterThumbs | -| `TaskGenerateMediaIndexFiles` | GenerateMediaIndexFiles | -| `TaskLoudnessAnalysis` | LoudnessAnalysis | -| `TaskMusicAnalysis` | MusicAnalysis | -| `TaskOptimizeDatabase` | OptimizeDatabase | -| `TaskRefreshEpgGuides` | RefreshEpgGuides | -| `TaskRefreshLibraries` | RefreshLibraries | -| `TaskRefreshLocalMedia` | RefreshLocalMedia | -| `TaskRefreshPeriodicMetadata` | RefreshPeriodicMetadata | -| `TaskUpgradeMediaAnalysis` | UpgradeMediaAnalysis | \ No newline at end of file diff --git a/docs/models/operations/trials.md b/docs/models/operations/trials.md new file mode 100644 index 0000000..1b9b77d --- /dev/null +++ b/docs/models/operations/trials.md @@ -0,0 +1,7 @@ +# Trials + + +## Fields + +| Field | Type | Required | Description | +| ----------- | ----------- | ----------- | ----------- | \ No newline at end of file diff --git a/docs/models/operations/user.md b/docs/models/operations/user.md new file mode 100644 index 0000000..7cea131 --- /dev/null +++ b/docs/models/operations/user.md @@ -0,0 +1,27 @@ +# User + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | +| `ID` | *int64* | :heavy_check_mark: | User's unique ID. | 22526914 | +| `Title` | *string* | :heavy_check_mark: | User's display name. | Plex User | +| `Username` | *string* | :heavy_check_mark: | User's username. | zgfuc7krcqfimrmb9lsl5j | +| `Email` | *string* | :heavy_check_mark: | User's email address. | zgfuc7krcqfimrmb9lsl5j@protonmail.com | +| `RecommendationsPlaylistID` | **string* | :heavy_minus_sign: | ID of the user's recommendation playlist. | | +| `Thumb` | *string* | :heavy_check_mark: | URL to the user's avatar image. | https://plex.tv/users/3346028014e93acd/avatar?c=1731605021 | +| `Protected` | [*operations.Protected](../../models/operations/protected.md) | :heavy_minus_sign: | N/A | 1 | +| `Home` | [*operations.Home](../../models/operations/home.md) | :heavy_minus_sign: | N/A | 1 | +| `AllowTuners` | [*operations.AllowTuners](../../models/operations/allowtuners.md) | :heavy_minus_sign: | N/A | 1 | +| `AllowSync` | [*operations.AllowSync](../../models/operations/allowsync.md) | :heavy_minus_sign: | N/A | 1 | +| `AllowCameraUpload` | [*operations.AllowCameraUpload](../../models/operations/allowcameraupload.md) | :heavy_minus_sign: | N/A | 1 | +| `AllowChannels` | [*operations.AllowChannels](../../models/operations/allowchannels.md) | :heavy_minus_sign: | N/A | 1 | +| `AllowSubtitleAdmin` | [*operations.AllowSubtitleAdmin](../../models/operations/allowsubtitleadmin.md) | :heavy_minus_sign: | N/A | 1 | +| `FilterAll` | **string* | :heavy_minus_sign: | Filters applied for all content. | | +| `FilterMovies` | **string* | :heavy_minus_sign: | Filters applied for movies. | | +| `FilterMusic` | **string* | :heavy_minus_sign: | Filters applied for music. | | +| `FilterPhotos` | **string* | :heavy_minus_sign: | Filters applied for photos. | | +| `FilterTelevision` | **string* | :heavy_minus_sign: | Filters applied for television. | | +| `Restricted` | [*operations.Restricted](../../models/operations/restricted.md) | :heavy_minus_sign: | N/A | 1 | +| `Server` | [][operations.Server](../../models/operations/server.md) | :heavy_check_mark: | List of servers owned by the user. | | \ No newline at end of file diff --git a/docs/models/operations/voicesearchhubsrequest.md b/docs/models/operations/voicesearchhubsrequest.md index 9f7d64b..c46489c 100644 --- a/docs/models/operations/voicesearchhubsrequest.md +++ b/docs/models/operations/voicesearchhubsrequest.md @@ -3,19 +3,19 @@ ## Fields -| Field | Type | Required | Description | Example | -| -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -------------------------------------------------------------- | -| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | -| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | -| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | -| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | -| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | -| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | -| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | -| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | -| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | -| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | -| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | -| `Query` | *string* | :heavy_check_mark: | The query term | | -| `Type` | **int64* | :heavy_minus_sign: | The metadata type to filter by | | -| `Limit` | **int64* | :heavy_minus_sign: | The number of items to return per hub. 3 if not specified | | \ No newline at end of file +| Field | Type | Required | Description | Example | +| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Accepts` | [*components.Accepts](../../models/components/accepts.md) | :heavy_minus_sign: | Indicates the client accepts the indicated media types | | +| `ClientIdentifier` | **string* | :heavy_minus_sign: | An opaque identifier unique to the client | abc123 | +| `Product` | **string* | :heavy_minus_sign: | The name of the client product | Plex for Roku | +| `Version` | **string* | :heavy_minus_sign: | The version of the client application | 2.4.1 | +| `Platform` | **string* | :heavy_minus_sign: | The platform of the client | Roku | +| `PlatformVersion` | **string* | :heavy_minus_sign: | The version of the platform | 4.3 build 1057 | +| `Device` | **string* | :heavy_minus_sign: | A relatively friendly name for the client device | Roku 3 | +| `Model` | **string* | :heavy_minus_sign: | A potentially less friendly identifier for the device model | 4200X | +| `DeviceVendor` | **string* | :heavy_minus_sign: | The device vendor | Roku | +| `DeviceName` | **string* | :heavy_minus_sign: | A friendly name for the client | Living Room TV | +| `Marketplace` | **string* | :heavy_minus_sign: | The marketplace on which the client application is distributed | googlePlay | +| `Query` | *string* | :heavy_check_mark: | The query term | | +| `Type` | [*components.MediaType](../../models/components/mediatype.md) | :heavy_minus_sign: | The type of media to retrieve or filter by.

1 = movie
2 = show
3 = season
4 = episode
5 = artist
6 = album
7 = track
8 = photo_album
9 = photo

E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
| 2 | +| `Limit` | **int64* | :heavy_minus_sign: | The number of items to return per hub. 3 if not specified | | \ No newline at end of file diff --git a/docs/models/sdkerrors/errors.md b/docs/models/sdkerrors/errors.md new file mode 100644 index 0000000..3e138f6 --- /dev/null +++ b/docs/models/sdkerrors/errors.md @@ -0,0 +1,10 @@ +# Errors + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | +| `Code` | **int* | :heavy_minus_sign: | N/A | 1000 | +| `Message` | **string* | :heavy_minus_sign: | N/A | X-Plex-Client-Identifier is missing | +| `Status` | **int* | :heavy_minus_sign: | N/A | 400 | \ No newline at end of file diff --git a/docs/models/sdkerrors/getserverresourceserrors.md b/docs/models/sdkerrors/getserverresourceserrors.md new file mode 100644 index 0000000..ab7daf2 --- /dev/null +++ b/docs/models/sdkerrors/getserverresourceserrors.md @@ -0,0 +1,10 @@ +# GetServerResourcesErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `Code` | **int* | :heavy_minus_sign: | N/A | 1001 | +| `Message` | **string* | :heavy_minus_sign: | N/A | User could not be authenticated | +| `Status` | **int* | :heavy_minus_sign: | N/A | 401 | \ No newline at end of file diff --git a/docs/models/sdkerrors/getserverresourcesunauthorized.md b/docs/models/sdkerrors/getserverresourcesunauthorized.md new file mode 100644 index 0000000..74905ad --- /dev/null +++ b/docs/models/sdkerrors/getserverresourcesunauthorized.md @@ -0,0 +1,11 @@ +# GetServerResourcesUnauthorized + +Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | +| `Errors` | [][sdkerrors.GetServerResourcesErrors](../../models/sdkerrors/getserverresourceserrors.md) | :heavy_minus_sign: | N/A | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/sdkerrors/gettokendetailsbadrequest.md b/docs/models/sdkerrors/gettokendetailsbadrequest.md new file mode 100644 index 0000000..91d1d56 --- /dev/null +++ b/docs/models/sdkerrors/gettokendetailsbadrequest.md @@ -0,0 +1,11 @@ +# GetTokenDetailsBadRequest + +Bad Request - A parameter was not specified, or was specified incorrectly. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | ------------------------------------------------------- | +| `Errors` | [][sdkerrors.Errors](../../models/sdkerrors/errors.md) | :heavy_minus_sign: | N/A | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/sdkerrors/gettokendetailserrors.md b/docs/models/sdkerrors/gettokendetailserrors.md new file mode 100644 index 0000000..53f23f2 --- /dev/null +++ b/docs/models/sdkerrors/gettokendetailserrors.md @@ -0,0 +1,10 @@ +# GetTokenDetailsErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `Code` | **int* | :heavy_minus_sign: | N/A | 1001 | +| `Message` | **string* | :heavy_minus_sign: | N/A | User could not be authenticated | +| `Status` | **int* | :heavy_minus_sign: | N/A | 401 | \ No newline at end of file diff --git a/docs/models/sdkerrors/gettokendetailsunauthorized.md b/docs/models/sdkerrors/gettokendetailsunauthorized.md new file mode 100644 index 0000000..457b056 --- /dev/null +++ b/docs/models/sdkerrors/gettokendetailsunauthorized.md @@ -0,0 +1,11 @@ +# GetTokenDetailsUnauthorized + +Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | +| `Errors` | [][sdkerrors.GetTokenDetailsErrors](../../models/sdkerrors/gettokendetailserrors.md) | :heavy_minus_sign: | N/A | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/sdkerrors/getusersbadrequest.md b/docs/models/sdkerrors/getusersbadrequest.md new file mode 100644 index 0000000..7395603 --- /dev/null +++ b/docs/models/sdkerrors/getusersbadrequest.md @@ -0,0 +1,11 @@ +# GetUsersBadRequest + +Bad Request - A parameter was not specified, or was specified incorrectly. + + +## Fields + +| Field | Type | Required | Description | +| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | +| `Errors` | [][sdkerrors.GetUsersErrors](../../models/sdkerrors/getuserserrors.md) | :heavy_minus_sign: | N/A | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/sdkerrors/getuserserrors.md b/docs/models/sdkerrors/getuserserrors.md new file mode 100644 index 0000000..8ef7e64 --- /dev/null +++ b/docs/models/sdkerrors/getuserserrors.md @@ -0,0 +1,10 @@ +# GetUsersErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | +| `Code` | **int* | :heavy_minus_sign: | N/A | 1000 | +| `Message` | **string* | :heavy_minus_sign: | N/A | X-Plex-Client-Identifier is missing | +| `Status` | **int* | :heavy_minus_sign: | N/A | 400 | \ No newline at end of file diff --git a/docs/models/sdkerrors/getusersunauthorized.md b/docs/models/sdkerrors/getusersunauthorized.md new file mode 100644 index 0000000..04aa34c --- /dev/null +++ b/docs/models/sdkerrors/getusersunauthorized.md @@ -0,0 +1,11 @@ +# GetUsersUnauthorized + +Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | +| `Errors` | [][sdkerrors.GetUsersUsersErrors](../../models/sdkerrors/getusersuserserrors.md) | :heavy_minus_sign: | N/A | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/sdkerrors/getusersuserserrors.md b/docs/models/sdkerrors/getusersuserserrors.md new file mode 100644 index 0000000..71d8b31 --- /dev/null +++ b/docs/models/sdkerrors/getusersuserserrors.md @@ -0,0 +1,10 @@ +# GetUsersUsersErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `Code` | **int* | :heavy_minus_sign: | N/A | 1001 | +| `Message` | **string* | :heavy_minus_sign: | N/A | User could not be authenticated | +| `Status` | **int* | :heavy_minus_sign: | N/A | 401 | \ No newline at end of file diff --git a/docs/models/sdkerrors/postuserssignindataauthenticationerrors.md b/docs/models/sdkerrors/postuserssignindataauthenticationerrors.md new file mode 100644 index 0000000..bd72f3a --- /dev/null +++ b/docs/models/sdkerrors/postuserssignindataauthenticationerrors.md @@ -0,0 +1,10 @@ +# PostUsersSignInDataAuthenticationErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | ------------------------------- | +| `Code` | **int* | :heavy_minus_sign: | N/A | 1001 | +| `Message` | **string* | :heavy_minus_sign: | N/A | User could not be authenticated | +| `Status` | **int* | :heavy_minus_sign: | N/A | 401 | \ No newline at end of file diff --git a/docs/models/sdkerrors/postuserssignindatabadrequest.md b/docs/models/sdkerrors/postuserssignindatabadrequest.md new file mode 100644 index 0000000..9110f5f --- /dev/null +++ b/docs/models/sdkerrors/postuserssignindatabadrequest.md @@ -0,0 +1,11 @@ +# PostUsersSignInDataBadRequest + +Bad Request - A parameter was not specified, or was specified incorrectly. + + +## Fields + +| Field | Type | Required | Description | +| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `Errors` | [][sdkerrors.PostUsersSignInDataErrors](../../models/sdkerrors/postuserssignindataerrors.md) | :heavy_minus_sign: | N/A | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/models/sdkerrors/postuserssignindataerrors.md b/docs/models/sdkerrors/postuserssignindataerrors.md new file mode 100644 index 0000000..42de438 --- /dev/null +++ b/docs/models/sdkerrors/postuserssignindataerrors.md @@ -0,0 +1,10 @@ +# PostUsersSignInDataErrors + + +## Fields + +| Field | Type | Required | Description | Example | +| ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | ----------------------------------- | +| `Code` | **int* | :heavy_minus_sign: | N/A | 1000 | +| `Message` | **string* | :heavy_minus_sign: | N/A | X-Plex-Client-Identifier is missing | +| `Status` | **int* | :heavy_minus_sign: | N/A | 400 | \ No newline at end of file diff --git a/docs/models/sdkerrors/postuserssignindataunauthorized.md b/docs/models/sdkerrors/postuserssignindataunauthorized.md new file mode 100644 index 0000000..dc6ee6b --- /dev/null +++ b/docs/models/sdkerrors/postuserssignindataunauthorized.md @@ -0,0 +1,11 @@ +# PostUsersSignInDataUnauthorized + +Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + + +## Fields + +| Field | Type | Required | Description | +| ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ | +| `Errors` | [][sdkerrors.PostUsersSignInDataAuthenticationErrors](../../models/sdkerrors/postuserssignindataauthenticationerrors.md) | :heavy_minus_sign: | N/A | +| `RawResponse` | [*http.Response](https://pkg.go.dev/net/http#Response) | :heavy_minus_sign: | Raw HTTP response; suitable for custom response parsing | \ No newline at end of file diff --git a/docs/sdks/authentication/README.md b/docs/sdks/authentication/README.md new file mode 100644 index 0000000..33b7d3a --- /dev/null +++ b/docs/sdks/authentication/README.md @@ -0,0 +1,146 @@ +# Authentication +(*Authentication*) + +## Overview + +### Available Operations + +* [GetTokenDetails](#gettokendetails) - Get Token Details +* [PostUsersSignInData](#postuserssignindata) - Get User Sign In Data + +## GetTokenDetails + +Get the User data from the provided X-Plex-Token + +### Example Usage + + +```go +package main + +import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" +) + +func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("abc123"), + plexgo.WithProduct("Plex for Roku"), + plexgo.WithVersion("2.4.1"), + plexgo.WithPlatform("Roku"), + plexgo.WithPlatformVersion("4.3 build 1057"), + plexgo.WithDevice("Roku 3"), + plexgo.WithModel("4200X"), + plexgo.WithDeviceVendor("Roku"), + plexgo.WithDeviceName("Living Room TV"), + plexgo.WithMarketplace("googlePlay"), + plexgo.WithSecurity(""), + ) + + res, err := s.Authentication.GetTokenDetails(ctx, operations.GetTokenDetailsRequest{}) + if err != nil { + log.Fatal(err) + } + if res.UserPlexAccount != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `request` | [operations.GetTokenDetailsRequest](../../models/operations/gettokendetailsrequest.md) | :heavy_check_mark: | The request object to use for the request. | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + +### Response + +**[*operations.GetTokenDetailsResponse](../../models/operations/gettokendetailsresponse.md), error** + +### Errors + +| Error Type | Status Code | Content Type | +| ------------------------------------- | ------------------------------------- | ------------------------------------- | +| sdkerrors.GetTokenDetailsBadRequest | 400 | application/json | +| sdkerrors.GetTokenDetailsUnauthorized | 401 | application/json | +| sdkerrors.SDKError | 4XX, 5XX | \*/\* | + +## PostUsersSignInData + +Sign in user with username and password and return user data with Plex authentication token + +### Example Usage + + +```go +package main + +import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" +) + +func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("3381b62b-9ab7-4e37-827b-203e9809eb58"), + plexgo.WithProduct("Plex for Roku"), + plexgo.WithVersion("2.4.1"), + plexgo.WithPlatform("Roku"), + plexgo.WithPlatformVersion("4.3 build 1057"), + plexgo.WithDevice("Roku 3"), + plexgo.WithModel("4200X"), + plexgo.WithDeviceVendor("Roku"), + plexgo.WithDeviceName("Living Room TV"), + plexgo.WithMarketplace("googlePlay"), + ) + + res, err := s.Authentication.PostUsersSignInData(ctx, operations.PostUsersSignInDataRequest{ + RequestBody: &operations.PostUsersSignInDataRequestBody{ + Login: "username@email.com", + Password: "password123", + VerificationCode: plexgo.Pointer("123456"), + }, + }) + if err != nil { + log.Fatal(err) + } + if res.UserPlexAccount != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `request` | [operations.PostUsersSignInDataRequest](../../models/operations/postuserssignindatarequest.md) | :heavy_check_mark: | The request object to use for the request. | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + +### Response + +**[*operations.PostUsersSignInDataResponse](../../models/operations/postuserssignindataresponse.md), error** + +### Errors + +| Error Type | Status Code | Content Type | +| ----------------------------------------- | ----------------------------------------- | ----------------------------------------- | +| sdkerrors.PostUsersSignInDataBadRequest | 400 | application/json | +| sdkerrors.PostUsersSignInDataUnauthorized | 401 | application/json | +| sdkerrors.SDKError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/docs/sdks/butler/README.md b/docs/sdks/butler/README.md index 4c4197b..4a9986a 100644 --- a/docs/sdks/butler/README.md +++ b/docs/sdks/butler/README.md @@ -177,7 +177,7 @@ This endpoint will stop a currently running task by name, or remove it from the ### Example Usage - + ```go package main @@ -208,7 +208,7 @@ func main() { ) res, err := s.Butler.StopTask(ctx, operations.StopTaskRequest{ - Task: operations.TaskCleanOldBundles, + ButlerTask: operations.ButlerTaskCleanOldBundles, }) if err != nil { log.Fatal(err) @@ -244,7 +244,7 @@ This endpoint will attempt to start a specific Butler task by name. ### Example Usage - + ```go package main @@ -275,7 +275,7 @@ func main() { ) res, err := s.Butler.StartTask(ctx, operations.StartTaskRequest{ - Task: operations.PathParamTaskRefreshLocalMedia, + ButlerTask: operations.PathParamButlerTaskRefreshLocalMedia, }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/collections/README.md b/docs/sdks/collections/README.md index 3f7625c..20dcc86 100644 --- a/docs/sdks/collections/README.md +++ b/docs/sdks/collections/README.md @@ -47,6 +47,7 @@ func main() { res, err := s.Collections.CreateCollection(ctx, operations.CreateCollectionRequest{ SectionID: "", + Type: components.MediaTypeTvShow.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/content/README.md b/docs/sdks/content/README.md index c1cc16b..9af2d61 100644 --- a/docs/sdks/content/README.md +++ b/docs/sdks/content/README.md @@ -125,14 +125,14 @@ func main() { res, err := s.Content.GetMetadataItem(ctx, operations.GetMetadataItemRequest{ Ids: []string{}, - AsyncCheckFiles: components.BoolIntOne.ToPointer(), - AsyncRefreshLocalMediaAgent: components.BoolIntOne.ToPointer(), - AsyncRefreshAnalysis: components.BoolIntOne.ToPointer(), - CheckFiles: components.BoolIntOne.ToPointer(), - SkipRefresh: components.BoolIntOne.ToPointer(), - CheckFileAvailability: components.BoolIntOne.ToPointer(), - AsyncAugmentMetadata: components.BoolIntOne.ToPointer(), - AugmentCount: components.BoolIntOne.ToPointer(), + AsyncCheckFiles: components.BoolIntTrue.ToPointer(), + AsyncRefreshLocalMediaAgent: components.BoolIntTrue.ToPointer(), + AsyncRefreshAnalysis: components.BoolIntTrue.ToPointer(), + CheckFiles: components.BoolIntTrue.ToPointer(), + SkipRefresh: components.BoolIntTrue.ToPointer(), + CheckFileAvailability: components.BoolIntTrue.ToPointer(), + AsyncAugmentMetadata: components.BoolIntTrue.ToPointer(), + AugmentCount: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -264,6 +264,13 @@ func main() { ) res, err := s.Content.ListContent(ctx, operations.ListContentRequest{ + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, + IncludeMeta: components.BoolIntTrue.ToPointer(), + IncludeGuids: components.BoolIntTrue.ToPointer(), SectionID: "", }) if err != nil { diff --git a/docs/sdks/devices/README.md b/docs/sdks/devices/README.md index 5ebb534..83f9db7 100644 --- a/docs/sdks/devices/README.md +++ b/docs/sdks/devices/README.md @@ -457,7 +457,7 @@ func main() { res, err := s.Devices.ModifyDevice(ctx, operations.ModifyDeviceRequest{ DeviceID: 879135, - Enabled: components.BoolIntOne.ToPointer(), + Enabled: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/downloadqueue/README.md b/docs/sdks/downloadqueue/README.md index 1b14dae..53e14f4 100644 --- a/docs/sdks/downloadqueue/README.md +++ b/docs/sdks/downloadqueue/README.md @@ -187,13 +187,13 @@ func main() { AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: components.LocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), diff --git a/docs/sdks/general/README.md b/docs/sdks/general/README.md index daf187a..673664d 100644 --- a/docs/sdks/general/README.md +++ b/docs/sdks/general/README.md @@ -162,7 +162,7 @@ func main() { res, err := s.General.GetSourceConnectionInformation(ctx, operations.GetSourceConnectionInformationRequest{ Source: "server://client-identifier", - Refresh: components.BoolIntOne.ToPointer(), + Refresh: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/hubs/README.md b/docs/sdks/hubs/README.md index fdfb26d..5d50b5b 100644 --- a/docs/sdks/hubs/README.md +++ b/docs/sdks/hubs/README.md @@ -59,7 +59,7 @@ func main() { ) res, err := s.Hubs.GetAllHubs(ctx, operations.GetAllHubsRequest{ - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -324,7 +324,7 @@ func main() { res, err := s.Hubs.GetMetadataHubs(ctx, operations.GetMetadataHubsRequest{ MetadataID: 605482, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -391,7 +391,7 @@ func main() { res, err := s.Hubs.GetPostplayHubs(ctx, operations.GetPostplayHubsRequest{ MetadataID: 441419, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -458,7 +458,7 @@ func main() { res, err := s.Hubs.GetRelatedHubs(ctx, operations.GetRelatedHubsRequest{ MetadataID: 8858, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -525,7 +525,7 @@ func main() { res, err := s.Hubs.GetSectionHubs(ctx, operations.GetSectionHubsRequest{ SectionID: 336924, - OnlyTransient: components.BoolIntOne.ToPointer(), + OnlyTransient: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -725,9 +725,9 @@ func main() { res, err := s.Hubs.CreateCustomHub(ctx, operations.CreateCustomHubRequest{ SectionID: 869922, MetadataItemID: 703843, - PromotedToRecommended: components.BoolIntOne.ToPointer(), - PromotedToOwnHome: components.BoolIntOne.ToPointer(), - PromotedToSharedHome: components.BoolIntOne.ToPointer(), + PromotedToRecommended: components.BoolIntTrue.ToPointer(), + PromotedToOwnHome: components.BoolIntTrue.ToPointer(), + PromotedToSharedHome: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -929,9 +929,9 @@ func main() { res, err := s.Hubs.UpdateHubVisibility(ctx, operations.UpdateHubVisibilityRequest{ SectionID: 341650, Identifier: "", - PromotedToRecommended: components.BoolIntOne.ToPointer(), - PromotedToOwnHome: components.BoolIntOne.ToPointer(), - PromotedToSharedHome: components.BoolIntOne.ToPointer(), + PromotedToRecommended: components.BoolIntTrue.ToPointer(), + PromotedToOwnHome: components.BoolIntTrue.ToPointer(), + PromotedToSharedHome: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/library/README.md b/docs/sdks/library/README.md index 52f61e3..c2ef991 100644 --- a/docs/sdks/library/README.md +++ b/docs/sdks/library/README.md @@ -123,7 +123,13 @@ func main() { plexgo.WithSecurity(""), ) - res, err := s.Library.GetLibraryItems(ctx, operations.GetLibraryItemsRequest{}) + res, err := s.Library.GetLibraryItems(ctx, operations.GetLibraryItemsRequest{ + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, + }) if err != nil { log.Fatal(err) } @@ -291,8 +297,8 @@ func main() { res, err := s.Library.IngestTransientItem(ctx, operations.IngestTransientItemRequest{ URL: plexgo.Pointer("file:///storage%2Femulated%2F0%2FArcher-S01E01.mkv"), VirtualFilePath: plexgo.Pointer("/Avatar.mkv"), - ComputeHashes: components.BoolIntOne.ToPointer(), - IngestNonMatches: components.BoolIntOne.ToPointer(), + ComputeHashes: components.BoolIntTrue.ToPointer(), + IngestNonMatches: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -362,9 +368,10 @@ func main() { ) res, err := s.Library.GetLibraryMatches(ctx, operations.GetLibraryMatchesRequest{ - IncludeFullMetadata: components.BoolIntOne.ToPointer(), - IncludeAncestorMetadata: components.BoolIntOne.ToPointer(), - IncludeAlternateMetadataSources: components.BoolIntOne.ToPointer(), + Type: components.MediaTypeTvShow.ToPointer(), + IncludeFullMetadata: components.BoolIntTrue.ToPointer(), + IncludeAncestorMetadata: components.BoolIntTrue.ToPointer(), + IncludeAlternateMetadataSources: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -430,7 +437,7 @@ func main() { ) res, err := s.Library.OptimizeDatabase(ctx, operations.OptimizeDatabaseRequest{ - Async: components.BoolIntOne.ToPointer(), + Async: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -628,8 +635,8 @@ func main() { "O:\fatboy\\Media\\My Music", }, Prefs: &operations.QueryParamPrefs{}, - Relative: components.BoolIntOne.ToPointer(), - ImportFromiTunes: components.BoolIntOne.ToPointer(), + Relative: components.BoolIntTrue.ToPointer(), + ImportFromiTunes: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -874,7 +881,9 @@ func main() { plexgo.WithSecurity(""), ) - res, err := s.Library.GetTags(ctx, operations.GetTagsRequest{}) + res, err := s.Library.GetTags(ctx, operations.GetTagsRequest{ + Type: components.MediaTypeTvShow.ToPointer(), + }) if err != nil { log.Fatal(err) } @@ -940,7 +949,7 @@ func main() { res, err := s.Library.DeleteMetadataItem(ctx, operations.DeleteMetadataItemRequest{ Ids: "", - Proxy: components.BoolIntOne.ToPointer(), + Proxy: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1274,7 +1283,7 @@ func main() { res, err := s.Library.GenerateThumbs(ctx, operations.GenerateThumbsRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1341,8 +1350,8 @@ func main() { res, err := s.Library.DetectCredits(ctx, operations.DetectCreditsRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), - Manual: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), + Manual: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1608,7 +1617,7 @@ func main() { res, err := s.Library.StartBifGeneration(ctx, operations.StartBifGenerationRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1675,7 +1684,7 @@ func main() { res, err := s.Library.DetectIntros(ctx, operations.DetectIntrosRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -1877,7 +1886,7 @@ func main() { res, err := s.Library.ListMatches(ctx, operations.ListMatchesRequest{ Ids: "", - Manual: components.BoolIntOne.ToPointer(), + Manual: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2142,7 +2151,7 @@ func main() { res, err := s.Library.RefreshItemsMetadata(ctx, operations.RefreshItemsMetadataRequest{ Ids: "", - MarkUpdated: components.BoolIntOne.ToPointer(), + MarkUpdated: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2407,8 +2416,8 @@ func main() { res, err := s.Library.AddSubtitles(ctx, operations.AddSubtitlesRequest{ Ids: "", - Forced: components.BoolIntOne.ToPointer(), - HearingImpaired: components.BoolIntOne.ToPointer(), + Forced: components.BoolIntTrue.ToPointer(), + HearingImpaired: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2673,8 +2682,8 @@ func main() { res, err := s.Library.DetectVoiceActivity(ctx, operations.DetectVoiceActivityRequest{ Ids: "", - Force: components.BoolIntOne.ToPointer(), - Manual: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), + Manual: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2741,7 +2750,7 @@ func main() { res, err := s.Library.GetAugmentationStatus(ctx, operations.GetAugmentationStatusRequest{ AugmentationID: "", - Wait: components.BoolIntOne.ToPointer(), + Wait: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -2808,7 +2817,7 @@ func main() { res, err := s.Library.SetStreamSelection(ctx, operations.SetStreamSelectionRequest{ PartID: 360489, - AllParts: components.BoolIntOne.ToPointer(), + AllParts: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3007,7 +3016,7 @@ func main() { res, err := s.Library.DeleteLibrarySection(ctx, operations.DeleteLibrarySectionRequest{ SectionID: "", - Async: components.BoolIntOne.ToPointer(), + Async: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3074,7 +3083,7 @@ func main() { res, err := s.Library.GetLibraryDetails(ctx, operations.GetLibraryDetailsRequest{ SectionID: "", - IncludeDetails: components.BoolIntOne.ToPointer(), + IncludeDetails: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3257,7 +3266,7 @@ func main() { res, err := s.Library.UpdateItems(ctx, operations.UpdateItemsRequest{ SectionID: "", - FieldLocked: components.BoolIntOne.ToPointer(), + FieldLocked: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -3391,6 +3400,11 @@ func main() { res, err := s.Library.Autocomplete(ctx, operations.AutocompleteRequest{ SectionID: 942007, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -3457,6 +3471,11 @@ func main() { res, err := s.Library.GetCollections(ctx, operations.GetCollectionsRequest{ SectionID: 348838, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -3524,6 +3543,11 @@ func main() { res, err := s.Library.GetCommon(ctx, operations.GetCommonRequest{ SectionID: 298154, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -3722,6 +3746,11 @@ func main() { res, err := s.Library.GetFirstCharacters(ctx, operations.GetFirstCharactersRequest{ SectionID: 3947, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -4119,7 +4148,7 @@ func main() { res, err := s.Library.RefreshSection(ctx, operations.RefreshSectionRequest{ SectionID: 450300, - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4725,7 +4754,7 @@ func main() { res, err := s.Library.DeleteMediaItem(ctx, operations.DeleteMediaItemRequest{ Ids: "", MediaItem: "", - Proxy: components.BoolIntOne.ToPointer(), + Proxy: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -4927,6 +4956,11 @@ func main() { res, err := s.Library.GetSectionImage(ctx, operations.GetSectionImageRequest{ SectionID: 925611, UpdatedAt: 117413, + MediaQuery: &components.MediaQuery{ + Type: components.MediaTypeEpisode.ToPointer(), + SourceType: plexgo.Pointer[int64](2), + Sort: plexgo.Pointer("duration:desc,index"), + }, }) if err != nil { log.Fatal(err) @@ -5061,7 +5095,7 @@ func main() { res, err := s.Library.GetStream(ctx, operations.GetStreamRequest{ StreamID: 314506, Ext: "", - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -5268,7 +5302,7 @@ func main() { PartID: 877105, Changestamp: 970622, Filename: "example.file", - Download: components.BoolIntOne.ToPointer(), + Download: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/libraryplaylists/README.md b/docs/sdks/libraryplaylists/README.md index 121bb73..a72a4f3 100644 --- a/docs/sdks/libraryplaylists/README.md +++ b/docs/sdks/libraryplaylists/README.md @@ -125,7 +125,7 @@ func main() { res, err := s.LibraryPlaylists.UploadPlaylist(ctx, operations.UploadPlaylistRequest{ Path: plexgo.Pointer("/home/barkley/playlist.m3u"), - Force: components.BoolIntOne.ToPointer(), + Force: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -665,7 +665,6 @@ func main() { Policy: &operations.Policy{ Value: plexgo.Pointer[int64](), Scope: operations.QueryParamScopeAll.ToPointer(), - Unwatched: components.BoolIntZero.ToPointer(), }, Target: plexgo.Pointer(""), TargetTagID: plexgo.Pointer[int64](1), diff --git a/docs/sdks/playqueue/README.md b/docs/sdks/playqueue/README.md index 2a44094..30985fd 100644 --- a/docs/sdks/playqueue/README.md +++ b/docs/sdks/playqueue/README.md @@ -61,11 +61,11 @@ func main() { res, err := s.PlayQueue.CreatePlayQueue(ctx, operations.CreatePlayQueueRequest{ Type: operations.TypeAudio, - Shuffle: components.BoolIntOne.ToPointer(), - Repeat: components.BoolIntOne.ToPointer(), - Continuous: components.BoolIntOne.ToPointer(), - Recursive: components.BoolIntOne.ToPointer(), - OnDeck: components.BoolIntOne.ToPointer(), + Shuffle: components.BoolIntTrue.ToPointer(), + Repeat: components.BoolIntTrue.ToPointer(), + Continuous: components.BoolIntTrue.ToPointer(), + Recursive: components.BoolIntTrue.ToPointer(), + OnDeck: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -132,9 +132,9 @@ func main() { res, err := s.PlayQueue.GetPlayQueue(ctx, operations.GetPlayQueueRequest{ PlayQueueID: 210646, - Own: components.BoolIntOne.ToPointer(), - IncludeBefore: components.BoolIntOne.ToPointer(), - IncludeAfter: components.BoolIntOne.ToPointer(), + Own: components.BoolIntTrue.ToPointer(), + IncludeBefore: components.BoolIntTrue.ToPointer(), + IncludeAfter: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -201,7 +201,7 @@ func main() { res, err := s.PlayQueue.AddToPlayQueue(ctx, operations.AddToPlayQueueRequest{ PlayQueueID: 919248, - Next: components.BoolIntOne.ToPointer(), + Next: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/plex/README.md b/docs/sdks/plex/README.md new file mode 100644 index 0000000..c2d955d --- /dev/null +++ b/docs/sdks/plex/README.md @@ -0,0 +1,68 @@ +# Plex +(*Plex*) + +## Overview + +### Available Operations + +* [GetServerResources](#getserverresources) - Get Server Resources + +## GetServerResources + +Get Plex server access tokens and server connections + +### Example Usage + + +```go +package main + +import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" +) + +func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("3381b62b-9ab7-4e37-827b-203e9809eb58"), + plexgo.WithSecurity(""), + ) + + res, err := s.Plex.GetServerResources(ctx, operations.GetServerResourcesRequest{ + IncludeHTTPS: operations.IncludeHTTPSTrue.ToPointer(), + IncludeRelay: operations.IncludeRelayTrue.ToPointer(), + IncludeIPv6: operations.IncludeIPv6True.ToPointer(), + }) + if err != nil { + log.Fatal(err) + } + if res.PlexDevices != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `request` | [operations.GetServerResourcesRequest](../../models/operations/getserverresourcesrequest.md) | :heavy_check_mark: | The request object to use for the request. | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + +### Response + +**[*operations.GetServerResourcesResponse](../../models/operations/getserverresourcesresponse.md), error** + +### Errors + +| Error Type | Status Code | Content Type | +| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | +| sdkerrors.GetServerResourcesUnauthorized | 401 | application/json | +| sdkerrors.SDKError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/docs/sdks/search/README.md b/docs/sdks/search/README.md index a4a980a..3887869 100644 --- a/docs/sdks/search/README.md +++ b/docs/sdks/search/README.md @@ -134,6 +134,7 @@ func main() { res, err := s.Search.VoiceSearchHubs(ctx, operations.VoiceSearchHubsRequest{ Query: "", + Type: components.MediaTypeTvShow.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/subscriptions/README.md b/docs/sdks/subscriptions/README.md index ad6a8ec..26d53c3 100644 --- a/docs/sdks/subscriptions/README.md +++ b/docs/sdks/subscriptions/README.md @@ -56,8 +56,8 @@ func main() { ) res, err := s.Subscriptions.GetAllSubscriptions(ctx, operations.GetAllSubscriptionsRequest{ - IncludeGrabs: components.BoolIntOne.ToPointer(), - IncludeStorage: components.BoolIntOne.ToPointer(), + IncludeGrabs: components.BoolIntTrue.ToPointer(), + IncludeStorage: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -494,8 +494,8 @@ func main() { res, err := s.Subscriptions.GetSubscription(ctx, operations.GetSubscriptionRequest{ SubscriptionID: 186713, - IncludeGrabs: components.BoolIntOne.ToPointer(), - IncludeStorage: components.BoolIntOne.ToPointer(), + IncludeGrabs: components.BoolIntTrue.ToPointer(), + IncludeStorage: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/timeline/README.md b/docs/sdks/timeline/README.md index 3538d4c..0db3684 100644 --- a/docs/sdks/timeline/README.md +++ b/docs/sdks/timeline/README.md @@ -123,9 +123,9 @@ func main() { PlayQueueItemID: plexgo.Pointer("123"), Time: plexgo.Pointer[int64](0), Duration: plexgo.Pointer[int64](10000), - Continuing: components.BoolIntOne.ToPointer(), + Continuing: components.BoolIntTrue.ToPointer(), Updated: plexgo.Pointer[int64](14200000), - Offline: components.BoolIntOne.ToPointer(), + Offline: components.BoolIntTrue.ToPointer(), TimeToFirstFrame: plexgo.Pointer[int64](1000), TimeStalled: plexgo.Pointer[int64](1000), Bandwidth: plexgo.Pointer[int64](100), diff --git a/docs/sdks/transcoder/README.md b/docs/sdks/transcoder/README.md index 1a616fb..5cc33cd 100644 --- a/docs/sdks/transcoder/README.md +++ b/docs/sdks/transcoder/README.md @@ -52,9 +52,9 @@ func main() { res, err := s.Transcoder.TranscodeImage(ctx, operations.TranscodeImageRequest{ URL: plexgo.Pointer("/library/metadata/265/thumb/1715112705"), Background: plexgo.Pointer("#ff5522"), - Upscale: components.BoolIntOne.ToPointer(), - MinSize: components.BoolIntOne.ToPointer(), - Rotate: components.BoolIntOne.ToPointer(), + Upscale: components.BoolIntTrue.ToPointer(), + MinSize: components.BoolIntTrue.ToPointer(), + Rotate: components.BoolIntTrue.ToPointer(), BlendColor: plexgo.Pointer("#ff5522"), }) if err != nil { @@ -125,13 +125,13 @@ func main() { AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.LocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), @@ -284,13 +284,13 @@ func main() { AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.QueryParamLocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), @@ -378,13 +378,13 @@ func main() { AdvancedSubtitles: components.AdvancedSubtitlesBurn.ToPointer(), AudioBoost: plexgo.Pointer[int64](50), AudioChannelCount: plexgo.Pointer[int64](5), - AutoAdjustQuality: components.BoolIntOne.ToPointer(), - AutoAdjustSubtitle: components.BoolIntOne.ToPointer(), - DirectPlay: components.BoolIntOne.ToPointer(), - DirectStream: components.BoolIntOne.ToPointer(), - DirectStreamAudio: components.BoolIntOne.ToPointer(), - DisableResolutionRotation: components.BoolIntOne.ToPointer(), - HasMDE: components.BoolIntOne.ToPointer(), + AutoAdjustQuality: components.BoolIntTrue.ToPointer(), + AutoAdjustSubtitle: components.BoolIntTrue.ToPointer(), + DirectPlay: components.BoolIntTrue.ToPointer(), + DirectStream: components.BoolIntTrue.ToPointer(), + DirectStreamAudio: components.BoolIntTrue.ToPointer(), + DisableResolutionRotation: components.BoolIntTrue.ToPointer(), + HasMDE: components.BoolIntTrue.ToPointer(), Location: operations.StartTranscodeSessionQueryParamLocationWan.ToPointer(), MediaBufferSize: plexgo.Pointer[int64](102400), MediaIndex: plexgo.Pointer[int64](0), diff --git a/docs/sdks/ultrablur/README.md b/docs/sdks/ultrablur/README.md index 40ef49d..6ccaf85 100644 --- a/docs/sdks/ultrablur/README.md +++ b/docs/sdks/ultrablur/README.md @@ -119,7 +119,7 @@ func main() { BottomLeft: plexgo.Pointer("1c425d"), Width: plexgo.Pointer[int64](1920), Height: plexgo.Pointer[int64](1080), - Noise: components.BoolIntOne.ToPointer(), + Noise: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/updater/README.md b/docs/sdks/updater/README.md index 3754bb5..e111790 100644 --- a/docs/sdks/updater/README.md +++ b/docs/sdks/updater/README.md @@ -50,8 +50,8 @@ func main() { ) res, err := s.Updater.ApplyUpdates(ctx, operations.ApplyUpdatesRequest{ - Tonight: components.BoolIntOne.ToPointer(), - Skip: components.BoolIntOne.ToPointer(), + Tonight: components.BoolIntTrue.ToPointer(), + Skip: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) @@ -117,7 +117,7 @@ func main() { ) res, err := s.Updater.CheckUpdates(ctx, operations.CheckUpdatesRequest{ - Download: components.BoolIntOne.ToPointer(), + Download: components.BoolIntTrue.ToPointer(), }) if err != nil { log.Fatal(err) diff --git a/docs/sdks/users/README.md b/docs/sdks/users/README.md new file mode 100644 index 0000000..e85294a --- /dev/null +++ b/docs/sdks/users/README.md @@ -0,0 +1,74 @@ +# Users +(*Users*) + +## Overview + +### Available Operations + +* [GetUsers](#getusers) - Get list of all connected users + +## GetUsers + +Get list of all users that are friends and have library access with the provided Plex authentication token + +### Example Usage + + +```go +package main + +import( + "context" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo" + "github.com/LukeHagar/plexgo/models/operations" + "log" +) + +func main() { + ctx := context.Background() + + s := plexgo.New( + plexgo.WithAccepts(components.AcceptsApplicationXML), + plexgo.WithClientIdentifier("3381b62b-9ab7-4e37-827b-203e9809eb58"), + plexgo.WithProduct("Plex for Roku"), + plexgo.WithVersion("2.4.1"), + plexgo.WithPlatform("Roku"), + plexgo.WithPlatformVersion("4.3 build 1057"), + plexgo.WithDevice("Roku 3"), + plexgo.WithModel("4200X"), + plexgo.WithDeviceVendor("Roku"), + plexgo.WithDeviceName("Chrome"), + plexgo.WithMarketplace("googlePlay"), + plexgo.WithSecurity(""), + ) + + res, err := s.Users.GetUsers(ctx, operations.GetUsersRequest{}) + if err != nil { + log.Fatal(err) + } + if res.Object != nil { + // handle response + } +} +``` + +### Parameters + +| Parameter | Type | Required | Description | +| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | +| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. | +| `request` | [operations.GetUsersRequest](../../models/operations/getusersrequest.md) | :heavy_check_mark: | The request object to use for the request. | +| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. | + +### Response + +**[*operations.GetUsersResponse](../../models/operations/getusersresponse.md), error** + +### Errors + +| Error Type | Status Code | Content Type | +| ------------------------------ | ------------------------------ | ------------------------------ | +| sdkerrors.GetUsersBadRequest | 400 | application/json | +| sdkerrors.GetUsersUnauthorized | 401 | application/json | +| sdkerrors.SDKError | 4XX, 5XX | \*/\* | \ No newline at end of file diff --git a/docs/types/date.md b/docs/types/date.md new file mode 100644 index 0000000..3d83ed2 --- /dev/null +++ b/docs/types/date.md @@ -0,0 +1,19 @@ +# Date + +`types.Date` is a wrapper around time.Time that allows for JSON marshaling a date string formatted as "2006-01-02". + +## Usage + +```go +d1 := types.NewDate(time.Now()) // returns *types.Date + +d2 := types.DateFromTime(time.Now()) // returns types.Date + +d3, err := types.NewDateFromString("2019-01-01") // returns *types.Date, error + +d4, err := types.DateFromString("2019-01-01") // returns types.Date, error + +d5 := types.MustNewDateFromString("2019-01-01") // returns *types.Date and panics on error + +d6 := types.MustDateFromString("2019-01-01") // returns types.Date and panics on error +``` \ No newline at end of file diff --git a/downloadqueue.go b/downloadqueue.go index 7c2be2a..e55edbb 100644 --- a/downloadqueue.go +++ b/downloadqueue.go @@ -534,7 +534,7 @@ func (s *DownloadQueue) AddDownloadQueueItems(ctx context.Context, request opera utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/dvrs.go b/dvrs.go index 12eb5fe..c0f196e 100644 --- a/dvrs.go +++ b/dvrs.go @@ -309,7 +309,7 @@ func (s *DVRs) CreateDVR(ctx context.Context, request operations.CreateDVRReques utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -960,7 +960,7 @@ func (s *DVRs) DeleteLineup(ctx context.Context, request operations.DeleteLineup utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1187,7 +1187,7 @@ func (s *DVRs) AddLineup(ctx context.Context, request operations.AddLineupReques utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1414,7 +1414,7 @@ func (s *DVRs) SetDVRPreferences(ctx context.Context, request operations.SetDVRP utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/epg.go b/epg.go index 8024e09..761c04c 100644 --- a/epg.go +++ b/epg.go @@ -102,7 +102,7 @@ func (s *Epg) ComputeChannelMap(ctx context.Context, request operations.ComputeC utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -333,7 +333,7 @@ func (s *Epg) GetChannels(ctx context.Context, request operations.GetChannelsReq utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -976,7 +976,7 @@ func (s *Epg) GetLineup(ctx context.Context, request operations.GetLineupRequest utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1187,7 +1187,7 @@ func (s *Epg) GetLineupChannels(ctx context.Context, request operations.GetLineu utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1414,7 +1414,7 @@ func (s *Epg) GetCountriesLineups(ctx context.Context, request operations.GetCou utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/events.go b/events.go index b633591..a738775 100644 --- a/events.go +++ b/events.go @@ -102,7 +102,7 @@ func (s *Events) GetNotifications(ctx context.Context, request operations.GetNot utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -319,7 +319,7 @@ func (s *Events) ConnectWebSocket(ctx context.Context, request operations.Connec utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/general.go b/general.go index 7d49deb..7fcbb2a 100644 --- a/general.go +++ b/general.go @@ -524,7 +524,7 @@ func (s *General) GetSourceConnectionInformation(ctx context.Context, request op utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -754,7 +754,7 @@ func (s *General) GetTransientToken(ctx context.Context, request operations.GetT utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/hubs.go b/hubs.go index c905558..a0af696 100644 --- a/hubs.go +++ b/hubs.go @@ -102,7 +102,7 @@ func (s *Hubs) GetAllHubs(ctx context.Context, request operations.GetAllHubsRequ utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -329,7 +329,7 @@ func (s *Hubs) GetContinueWatching(ctx context.Context, request operations.GetCo utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -556,7 +556,7 @@ func (s *Hubs) GetHubItems(ctx context.Context, request operations.GetHubItemsRe utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -785,7 +785,7 @@ func (s *Hubs) GetPromotedHubs(ctx context.Context, request operations.GetPromot utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1012,7 +1012,7 @@ func (s *Hubs) GetMetadataHubs(ctx context.Context, request operations.GetMetada utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1241,7 +1241,7 @@ func (s *Hubs) GetPostplayHubs(ctx context.Context, request operations.GetPostpl utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1470,7 +1470,7 @@ func (s *Hubs) GetRelatedHubs(ctx context.Context, request operations.GetRelated utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1699,7 +1699,7 @@ func (s *Hubs) GetSectionHubs(ctx context.Context, request operations.GetSection utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2133,7 +2133,7 @@ func (s *Hubs) ListHubs(ctx context.Context, request operations.ListHubsRequest, utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2364,7 +2364,7 @@ func (s *Hubs) CreateCustomHub(ctx context.Context, request operations.CreateCus utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2575,7 +2575,7 @@ func (s *Hubs) MoveHub(ctx context.Context, request operations.MoveHubRequest, o utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -3013,7 +3013,7 @@ func (s *Hubs) UpdateHubVisibility(ctx context.Context, request operations.Updat utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/internal/utils/form.go b/internal/utils/form.go index 97d553e..1815509 100644 --- a/internal/utils/form.go +++ b/internal/utils/form.go @@ -14,13 +14,15 @@ import ( "github.com/LukeHagar/plexgo/types" ) -func populateForm(paramName string, explode bool, objType reflect.Type, objValue reflect.Value, delimiter string, defaultValue *string, getFieldName func(reflect.StructField) string) url.Values { +func populateForm(paramName string, explode bool, objType reflect.Type, objValue reflect.Value, delimiter string, defaultValue *string, allowEmptyValue map[string]struct{}, getFieldName func(reflect.StructField) string) url.Values { formValues := url.Values{} if isNil(objType, objValue) { if defaultValue != nil { formValues.Add(paramName, *defaultValue) + } else if _, ok := allowEmptyValue[paramName]; ok { + formValues.Add(paramName, "") } return formValues @@ -103,12 +105,31 @@ func populateForm(paramName string, explode bool, objType reflect.Type, objValue formValues.Add(paramName, strings.Join(items, delimiter)) } case reflect.Slice, reflect.Array: - values := parseDelimitedArray(explode, objValue, delimiter) - for _, v := range values { - formValues.Add(paramName, v) + if objValue.Len() == 0 { + if _, ok := allowEmptyValue[paramName]; ok { + formValues.Add(paramName, "") + } + } else { + values := parseDelimitedArray(explode, objValue, delimiter) + for _, v := range values { + formValues.Add(paramName, v) + } } default: - formValues.Add(paramName, valToString(objValue.Interface())) + // For string types, use the value directly without conversion + if objType.Kind() == reflect.String { + stringValue := objValue.String() + formValues.Add(paramName, stringValue) + } else { + stringValue := valToString(objValue.Interface()) + if stringValue == "" { + if _, ok := allowEmptyValue[paramName]; ok { + formValues.Add(paramName, "") + } + } else if stringValue != "" { + formValues.Add(paramName, stringValue) + } + } } return formValues diff --git a/internal/utils/json.go b/internal/utils/json.go index 07cbdc6..9f7f731 100644 --- a/internal/utils/json.go +++ b/internal/utils/json.go @@ -658,17 +658,23 @@ func CalculateJSONSize(v interface{}) int { // UnionCandidate represents a candidate type during union deserialization type UnionCandidate struct { - FieldCount int - Size int - Type any // The union type enum value - Value any // The unmarshaled value + FieldCount int + InexactCount int // Count of fields with unknown/unrecognized enum values + Size int + Type any // The union type enum value + Value any // The unmarshaled value } -// CountFields recursively counts the number of valid (non-nil, non-zero) fields set in a value. -// This is used as the primary discriminator for union types, with JSON size as a tiebreaker. -func CountFields(v interface{}) int { +// FieldCounts holds the result of counting fields in a value +type FieldCounts struct { + Total int // Total number of populated fields + Inexact int // Number of fields with unknown/unrecognized open enum values +} + +// CountFieldsWithInexact recursively counts fields and tracks inexact matches (unknown open enum values). +func CountFieldsWithInexact(v interface{}) FieldCounts { if v == nil { - return 0 + return FieldCounts{} } typ := reflect.TypeOf(v) @@ -677,7 +683,7 @@ func CountFields(v interface{}) int { // Dereference pointers for typ.Kind() == reflect.Ptr { if val.IsNil() { - return 0 + return FieldCounts{} } typ = typ.Elem() val = val.Elem() @@ -688,8 +694,9 @@ func CountFields(v interface{}) int { // PickBestCandidate selects the best union type candidate using a multi-stage filtering approach: // 1. If multiple candidates, filter by field count (keep only those with max field count) -// 2. If still multiple, filter by JSON size (keep only those with max size) -// 3. Return the first remaining candidate +// 2. If still multiple, filter by inexact count (keep only those with min inexact count) +// 3. If still multiple, filter by JSON size (keep only those with max size) +// 4. Return the first remaining candidate func PickBestCandidate(candidates []UnionCandidate) *UnionCandidate { if len(candidates) == 0 { return nil @@ -703,7 +710,9 @@ func PickBestCandidate(candidates []UnionCandidate) *UnionCandidate { if len(candidates) > 1 { maxFieldCount := -1 for i := range candidates { - candidates[i].FieldCount = CountFields(candidates[i].Value) + fieldCounts := CountFieldsWithInexact(candidates[i].Value) + candidates[i].FieldCount = fieldCounts.Total + candidates[i].InexactCount = fieldCounts.Inexact if candidates[i].FieldCount > maxFieldCount { maxFieldCount = candidates[i].FieldCount } @@ -723,6 +732,30 @@ func PickBestCandidate(candidates []UnionCandidate) *UnionCandidate { return &candidates[0] } + // Filter by inexact count if we still have multiple candidates + // Prefer candidates with fewer unknown/unrecognized enum values + if len(candidates) > 1 { + minInexactCount := int(^uint(0) >> 1) // max int + for _, c := range candidates { + if c.InexactCount < minInexactCount { + minInexactCount = c.InexactCount + } + } + + // Keep only candidates with minimum inexact count + filtered := make([]UnionCandidate, 0, len(candidates)) + for _, c := range candidates { + if c.InexactCount == minInexactCount { + filtered = append(filtered, c) + } + } + candidates = filtered + } + + if len(candidates) == 1 { + return &candidates[0] + } + // Filter by JSON size if we still have multiple candidates if len(candidates) > 1 { maxSize := -1 @@ -747,8 +780,25 @@ func PickBestCandidate(candidates []UnionCandidate) *UnionCandidate { return &candidates[0] } -func countFieldsRecursive(typ reflect.Type, val reflect.Value) int { - count := 0 +func countFieldsRecursive(typ reflect.Type, val reflect.Value) FieldCounts { + counts := FieldCounts{} + + // Check if the value has an IsExact() method (for open enums) + // Try both the value and its pointer + if val.CanInterface() && val.CanAddr() { + ptrVal := val.Addr() + if method := ptrVal.MethodByName("IsExact"); method.IsValid() { + results := method.Call(nil) + if len(results) == 1 && results[0].Kind() == reflect.Bool { + isExact := results[0].Bool() + counts.Total = 1 + if !isExact { + counts.Inexact = 1 // Unknown enum value + } + return counts + } + } + } switch typ.Kind() { case reflect.Struct: @@ -756,18 +806,18 @@ func countFieldsRecursive(typ reflect.Type, val reflect.Value) int { switch typ { case reflect.TypeOf(time.Time{}): if !val.Interface().(time.Time).IsZero() { - return 1 + return FieldCounts{Total: 1} } - return 0 + return FieldCounts{} case reflect.TypeOf(big.Int{}): b := val.Interface().(big.Int) if b.Sign() != 0 { - return 1 + return FieldCounts{Total: 1} } - return 0 + return FieldCounts{} case reflect.TypeOf(types.Date{}): // Date is always counted if it exists - return 1 + return FieldCounts{Total: 1} } // For regular structs, count non-zero fields @@ -797,13 +847,15 @@ func countFieldsRecursive(typ reflect.Type, val reflect.Value) int { } if !isNil(field.Type, val.Field(i)) { - count += countFieldsRecursive(fieldTyp, fieldVal) + fieldCounts := countFieldsRecursive(fieldTyp, fieldVal) + counts.Total += fieldCounts.Total + counts.Inexact += fieldCounts.Inexact } } case reflect.Slice, reflect.Array: if val.IsNil() || val.Len() == 0 { - return 0 + return FieldCounts{} } // Count each array/slice element for i := 0; i < val.Len(); i++ { @@ -820,40 +872,42 @@ func countFieldsRecursive(typ reflect.Type, val reflect.Value) int { } if !isNil(itemTyp, itemVal) { - count += countFieldsRecursive(itemTyp, itemVal) + itemCounts := countFieldsRecursive(itemTyp, itemVal) + counts.Total += itemCounts.Total + counts.Inexact += itemCounts.Inexact } } case reflect.String: if val.String() != "" { - count = 1 + counts.Total = 1 } case reflect.Bool: // Bools always count as a field (even if false) - count = 1 + counts.Total = 1 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if val.Int() != 0 { - count = 1 + counts.Total = 1 } case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if val.Uint() != 0 { - count = 1 + counts.Total = 1 } case reflect.Float32, reflect.Float64: if val.Float() != 0 { - count = 1 + counts.Total = 1 } default: // For any other type, if it's not zero, count it as 1 if !val.IsZero() { - count = 1 + counts.Total = 1 } } - return count + return counts } diff --git a/internal/utils/queryparams.go b/internal/utils/queryparams.go index aca7b90..1026218 100644 --- a/internal/utils/queryparams.go +++ b/internal/utils/queryparams.go @@ -16,7 +16,7 @@ import ( "github.com/LukeHagar/plexgo/types" ) -func PopulateQueryParams(_ context.Context, req *http.Request, queryParams interface{}, globals interface{}) error { +func PopulateQueryParams(_ context.Context, req *http.Request, queryParams interface{}, globals interface{}, allowEmptyValue map[string]struct{}) error { // Query parameters may already be present from overriding URL if req.URL.RawQuery != "" { return nil @@ -24,13 +24,13 @@ func PopulateQueryParams(_ context.Context, req *http.Request, queryParams inter values := url.Values{} - globalsAlreadyPopulated, err := populateQueryParams(queryParams, globals, values, []string{}) + globalsAlreadyPopulated, err := populateQueryParams(queryParams, globals, values, []string{}, allowEmptyValue) if err != nil { return err } if globals != nil { - _, err = populateQueryParams(globals, nil, values, globalsAlreadyPopulated) + _, err = populateQueryParams(globals, nil, values, globalsAlreadyPopulated, allowEmptyValue) if err != nil { return err } @@ -41,7 +41,7 @@ func PopulateQueryParams(_ context.Context, req *http.Request, queryParams inter return nil } -func populateQueryParams(queryParams interface{}, globals interface{}, values url.Values, skipFields []string) ([]string, error) { +func populateQueryParams(queryParams interface{}, globals interface{}, values url.Values, skipFields []string, allowEmptyValue map[string]struct{}) ([]string, error) { queryParamsVal := reflect.ValueOf(queryParams) if queryParamsVal.Kind() == reflect.Pointer && queryParamsVal.IsNil() { return nil, nil @@ -101,14 +101,14 @@ func populateQueryParams(queryParams interface{}, globals interface{}, values ur } } case "form": - vals := populateFormParams(qpTag, fieldType.Type, valType, ",", defaultValue) + vals := populateFormParams(qpTag, fieldType.Type, valType, ",", defaultValue, allowEmptyValue) for k, v := range vals { for _, vv := range v { values.Add(k, vv) } } case "pipeDelimited": - vals := populateFormParams(qpTag, fieldType.Type, valType, "|", defaultValue) + vals := populateFormParams(qpTag, fieldType.Type, valType, "|", defaultValue, allowEmptyValue) for k, v := range vals { for _, vv := range v { values.Add(k, vv) @@ -260,8 +260,8 @@ func populateDeepObjectParamsStruct(qsValues url.Values, priorScope string, stru } } -func populateFormParams(tag *paramTag, objType reflect.Type, objValue reflect.Value, delimiter string, defaultValue *string) url.Values { - return populateForm(tag.ParamName, tag.Explode, objType, objValue, delimiter, defaultValue, func(fieldType reflect.StructField) string { +func populateFormParams(tag *paramTag, objType reflect.Type, objValue reflect.Value, delimiter string, defaultValue *string, allowEmptyValue map[string]struct{}) url.Values { + return populateForm(tag.ParamName, tag.Explode, objType, objValue, delimiter, defaultValue, allowEmptyValue, func(fieldType reflect.StructField) string { qpTag := parseQueryParamTag(fieldType) if qpTag == nil { return "" diff --git a/internal/utils/requestbody.go b/internal/utils/requestbody.go index 596646a..3b553e4 100644 --- a/internal/utils/requestbody.go +++ b/internal/utils/requestbody.go @@ -207,7 +207,7 @@ func encodeMultipartFormData(w io.Writer, data interface{}) (string, error) { case reflect.Slice, reflect.Array: values := parseDelimitedArray(true, valType, ",") for _, v := range values { - if err := writer.WriteField(tag.Name+"[]", v); err != nil { + if err := writer.WriteField(tag.Name, v); err != nil { writer.Close() return "", err } @@ -325,7 +325,7 @@ func encodeFormData(fieldName string, w io.Writer, data interface{}) error { switch tag.Style { // TODO: support other styles case "form": - values := populateForm(tag.Name, tag.Explode, fieldType, valType, ",", nil, func(sf reflect.StructField) string { + values := populateForm(tag.Name, tag.Explode, fieldType, valType, ",", nil, nil, func(sf reflect.StructField) string { tag := parseFormTag(field) if tag == nil { return "" diff --git a/library.go b/library.go index 29f69a0..b0d842a 100644 --- a/library.go +++ b/library.go @@ -102,7 +102,7 @@ func (s *Library) GetLibraryItems(ctx context.Context, request operations.GetLib utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -700,7 +700,7 @@ func (s *Library) IngestTransientItem(ctx context.Context, request operations.In utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -931,7 +931,7 @@ func (s *Library) GetLibraryMatches(ctx context.Context, request operations.GetL utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1158,7 +1158,7 @@ func (s *Library) OptimizeDatabase(ctx context.Context, request operations.Optim utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1365,7 +1365,7 @@ func (s *Library) GetRandomArtwork(ctx context.Context, request operations.GetRa utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1798,7 +1798,7 @@ func (s *Library) AddSection(ctx context.Context, request operations.AddSectionR utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2230,7 +2230,7 @@ func (s *Library) GetSectionsPrefs(ctx context.Context, request operations.GetSe utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2457,7 +2457,7 @@ func (s *Library) RefreshSectionsMetadata(ctx context.Context, request operation utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2664,7 +2664,7 @@ func (s *Library) GetTags(ctx context.Context, request operations.GetTagsRequest utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2889,7 +2889,7 @@ func (s *Library) DeleteMetadataItem(ctx context.Context, request operations.Del utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -3096,7 +3096,7 @@ func (s *Library) EditMetadataItem(ctx context.Context, request operations.EditM utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -3727,7 +3727,7 @@ func (s *Library) AnalyzeMetadata(ctx context.Context, request operations.Analyz utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -3932,7 +3932,7 @@ func (s *Library) GenerateThumbs(ctx context.Context, request operations.Generat utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -4137,7 +4137,7 @@ func (s *Library) DetectCredits(ctx context.Context, request operations.DetectCr utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -4565,7 +4565,7 @@ func (s *Library) AddExtras(ctx context.Context, request operations.AddExtrasReq utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -4778,7 +4778,7 @@ func (s *Library) GetFile(ctx context.Context, request operations.GetFileRequest utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -4999,7 +4999,7 @@ func (s *Library) StartBifGeneration(ctx context.Context, request operations.Sta utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -5204,7 +5204,7 @@ func (s *Library) DetectIntros(ctx context.Context, request operations.DetectInt utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -5409,7 +5409,7 @@ func (s *Library) CreateMarker(ctx context.Context, request operations.CreateMar utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -5636,7 +5636,7 @@ func (s *Library) MatchItem(ctx context.Context, request operations.MatchItemReq utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -5841,7 +5841,7 @@ func (s *Library) ListMatches(ctx context.Context, request operations.ListMatche utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -6066,7 +6066,7 @@ func (s *Library) MergeItems(ctx context.Context, request operations.MergeItemsR utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -6271,7 +6271,7 @@ func (s *Library) ListSonicallySimilar(ctx context.Context, request operations.L utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -6496,7 +6496,7 @@ func (s *Library) SetItemPreferences(ctx context.Context, request operations.Set utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -6701,7 +6701,7 @@ func (s *Library) RefreshItemsMetadata(ctx context.Context, request operations.R utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -7127,7 +7127,7 @@ func (s *Library) ListSimilar(ctx context.Context, request operations.ListSimila utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -7553,7 +7553,7 @@ func (s *Library) AddSubtitles(ctx context.Context, request operations.AddSubtit utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -8401,7 +8401,7 @@ func (s *Library) DetectVoiceActivity(ctx context.Context, request operations.De utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -8606,7 +8606,7 @@ func (s *Library) GetAugmentationStatus(ctx context.Context, request operations. utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -8815,7 +8815,7 @@ func (s *Library) SetStreamSelection(ctx context.Context, request operations.Set utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -9468,7 +9468,7 @@ func (s *Library) DeleteLibrarySection(ctx context.Context, request operations.D utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -9673,7 +9673,7 @@ func (s *Library) GetLibraryDetails(ctx context.Context, request operations.GetL utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -9898,7 +9898,7 @@ func (s *Library) EditSection(ctx context.Context, request operations.EditSectio utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -10149,7 +10149,7 @@ func (s *Library) UpdateItems(ctx context.Context, request operations.UpdateItem utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -10562,7 +10562,7 @@ func (s *Library) Autocomplete(ctx context.Context, request operations.Autocompl utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -10791,7 +10791,7 @@ func (s *Library) GetCollections(ctx context.Context, request operations.GetColl utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -11019,7 +11019,7 @@ func (s *Library) GetCommon(ctx context.Context, request operations.GetCommonReq utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -11672,7 +11672,7 @@ func (s *Library) GetFirstCharacters(ctx context.Context, request operations.Get utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -12299,7 +12299,7 @@ func (s *Library) GetSectionPreferences(ctx context.Context, request operations. utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -12524,7 +12524,7 @@ func (s *Library) SetSectionPreferences(ctx context.Context, request operations. utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -12930,7 +12930,7 @@ func (s *Library) RefreshSection(ctx context.Context, request operations.Refresh utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -13356,7 +13356,7 @@ func (s *Library) GetStreamLevels(ctx context.Context, request operations.GetStr utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -13585,7 +13585,7 @@ func (s *Library) GetStreamLoudness(ctx context.Context, request operations.GetS utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -14026,7 +14026,7 @@ func (s *Library) SetItemArtwork(ctx context.Context, request operations.SetItem utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -14232,7 +14232,7 @@ func (s *Library) UpdateItemArtwork(ctx context.Context, request operations.Upda utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -14642,7 +14642,7 @@ func (s *Library) EditMarker(ctx context.Context, request operations.EditMarkerR utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -14871,7 +14871,7 @@ func (s *Library) DeleteMediaItem(ctx context.Context, request operations.Delete utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -15080,7 +15080,7 @@ func (s *Library) GetPartIndex(ctx context.Context, request operations.GetPartIn utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -15502,7 +15502,7 @@ func (s *Library) GetSectionImage(ctx context.Context, request operations.GetSec utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -15912,7 +15912,7 @@ func (s *Library) GetStream(ctx context.Context, request operations.GetStreamReq utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -16123,7 +16123,7 @@ func (s *Library) SetStreamOffset(ctx context.Context, request operations.SetStr utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -16555,7 +16555,7 @@ func (s *Library) GetMediaPart(ctx context.Context, request operations.GetMediaP utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/librarycollections.go b/librarycollections.go index 971e7e7..5d66d1f 100644 --- a/librarycollections.go +++ b/librarycollections.go @@ -101,7 +101,7 @@ func (s *LibraryCollections) AddCollectionItems(ctx context.Context, request ope utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -553,7 +553,7 @@ func (s *LibraryCollections) MoveCollectionItem(ctx context.Context, request ope utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/libraryplaylists.go b/libraryplaylists.go index ca90541..d11916c 100644 --- a/libraryplaylists.go +++ b/libraryplaylists.go @@ -102,7 +102,7 @@ func (s *LibraryPlaylists) CreatePlaylist(ctx context.Context, request operation utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -329,7 +329,7 @@ func (s *LibraryPlaylists) UploadPlaylist(ctx context.Context, request operation utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1392,7 +1392,7 @@ func (s *LibraryPlaylists) AddPlaylistItems(ctx context.Context, request operati utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2071,7 +2071,7 @@ func (s *LibraryPlaylists) ModifyPlaylistGenerator(ctx context.Context, request utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2525,7 +2525,7 @@ func (s *LibraryPlaylists) MovePlaylistItem(ctx context.Context, request operati utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/log.go b/log.go index 60f3c3e..56cd962 100644 --- a/log.go +++ b/log.go @@ -296,7 +296,7 @@ func (s *Log) WriteMessage(ctx context.Context, request operations.WriteMessageR utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -503,7 +503,7 @@ func (s *Log) EnablePapertrail(ctx context.Context, request operations.EnablePap utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/models/components/boolint.go b/models/components/boolint.go index fa783a6..792da32 100644 --- a/models/components/boolint.go +++ b/models/components/boolint.go @@ -7,18 +7,18 @@ import ( "fmt" ) -type BoolInt int64 +type BoolInt int const ( - BoolIntZero BoolInt = 0 - BoolIntOne BoolInt = 1 + BoolIntFalse BoolInt = 0 + BoolIntTrue BoolInt = 1 ) func (e BoolInt) ToPointer() *BoolInt { return &e } func (e *BoolInt) UnmarshalJSON(data []byte) error { - var v int64 + var v int if err := json.Unmarshal(data, &v); err != nil { return err } diff --git a/models/components/items.go b/models/components/items.go index d410bcc..9cea0b9 100644 --- a/models/components/items.go +++ b/models/components/items.go @@ -4,8 +4,22 @@ package components import ( "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/types" ) +type ItemsGuids struct { + // The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + // + ID string `json:"id"` +} + +func (i *ItemsGuids) GetID() string { + if i == nil { + return "" + } + return i.ID +} + // Items in a library are referred to as "metadata items." These metadata items are distinct from "media items" which represent actual instances of media that can be consumed. Consider a TV library that has a single video file in it for a particular episode of a show. The library has a single media item, but it has three metadata items: one for the show, one for the season, and one for the episode. Consider a movie library that has two video files in it: the same movie, but two different resolutions. The library has a single metadata item for the movie, but that metadata item has two media items, one for each resolution. Additionally a "media item" will have one or more "media parts" where the the parts are intended to be watched together, such as a CD1 and CD2 parts of the same movie. // // Note that when a metadata item has multiple media items, those media items should be isomorphic. That is, a 4K version and 1080p version of a movie are different versions of the same movie. They have the same duration, same summary, same rating, etc. and they can generally be considered interchangeable. A theatrical release vs. director's cut vs. unrated version on the other hand would be separate metadata items. @@ -13,37 +27,41 @@ import ( // Metadata items can often live in a hierarchy with relationships between them. For example, the metadata item for an episodes is associated with a season metadata item which is associated with a show metadata item. A similar hierarchy exists with track, album, and artist and photos and photo album. The relationships may be expressed via relative terms and absolute terms. For example, "leaves" refer to metadata items which has associated media (there is no media for a season nor show). A show will have "children" in the form of seasons and a season will have "children" in the form of episodes and episodes have "parent" in the form of a season which has a "parent" in the form of a show. Similarly, a show has "grandchildren" in the form of episodse and an episode has a "grandparent" in the form of a show. type Items struct { // The title of the item (e.g. “300” or “The Simpsons”) - Title any `json:"title,omitempty"` + Title string `json:"title"` // The type of the video item, such as `movie`, `episode`, or `clip`. - Type any `json:"type,omitempty"` + Type string `json:"type"` // When present, contains the disc number for a track on multi-disc albums. - AbsoluteIndex *int64 `json:"absoluteIndex,omitempty"` + AbsoluteIndex *int `json:"absoluteIndex,omitempty"` // In units of seconds since the epoch, returns the time at which the item was added to the library. - AddedAt *int64 `json:"addedAt,omitempty"` + AddedAt int64 `json:"addedAt"` // When present, the URL for the background artwork for the item. - Art any `json:"art,omitempty"` + Art *string `json:"art,omitempty"` // Some rating systems separate reviewer ratings from audience ratings - AudienceRating *float64 `json:"audienceRating,omitempty"` + AudienceRating *float32 `json:"audienceRating,omitempty"` // A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). - AudienceRatingImage any `json:"audienceRatingImage,omitempty"` - Autotag []Tag `json:"Autotag,omitempty"` + AudienceRatingImage *string `json:"audienceRatingImage,omitempty"` + Autotag []Tag `json:"Autotag,omitempty"` // When present, the URL for a banner graphic for the item. - Banner any `json:"banner,omitempty"` + Banner *string `json:"banner,omitempty"` // When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). - ChapterSource any `json:"chapterSource,omitempty"` + ChapterSource *string `json:"chapterSource,omitempty"` + // The number of child items associated with this media item. + ChildCount *int `json:"childCount,omitempty"` // When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). - Composite any `json:"composite,omitempty"` + Composite *string `json:"composite,omitempty"` // If known, the content rating (e.g. MPAA) for an item. - ContentRating any `json:"contentRating,omitempty"` - Country []Tag `json:"Country,omitempty"` - Director []Tag `json:"Director,omitempty"` + ContentRating *string `json:"contentRating,omitempty"` + Country []Tag `json:"Country,omitempty"` + Director []Tag `json:"Director,omitempty"` // When present, the duration for the item, in units of milliseconds. - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` // Typically only seen in metadata at a library's top level Filter []Filter `json:"Filter,omitempty"` Genre []Tag `json:"Genre,omitempty"` // The `art` of the grandparent GrandparentArt *string `json:"grandparentArt,omitempty"` + // The GUID of the grandparent media item. + GrandparentGUID *string `json:"grandparentGuid,omitempty"` // The `hero` of the grandparent GrandparentHero *string `json:"grandparentHero,omitempty"` // The `key` of the grandparent @@ -56,27 +74,30 @@ type Items struct { GrandparentThumb *string `json:"grandparentThumb,omitempty"` // The `title` of the grandparent GrandparentTitle *string `json:"grandparentTitle,omitempty"` - GUID []Tag `json:"Guid,omitempty"` + // The globally unique identifier for the media item. + GUID *string `json:"guid,omitempty"` + Guids []ItemsGuids `json:"Guid,omitempty"` // When present, the URL for a hero image for the item. - Hero any `json:"hero,omitempty"` + Hero *string `json:"hero,omitempty"` Image []Image `json:"Image,omitempty"` // When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. - Index *int64 `json:"index,omitempty"` + Index *int `json:"index,omitempty"` // The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. - Key any `json:"key,omitempty"` - // When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. + Key string `json:"key"` LastViewedAt *int64 `json:"lastViewedAt,omitempty"` // For shows and seasons, contains the number of total episodes. - LeafCount *int64 `json:"leafCount,omitempty"` + LeafCount *int `json:"leafCount,omitempty"` Media []Media `json:"Media,omitempty"` // When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. - OriginallyAvailableAt any `json:"originallyAvailableAt,omitempty"` + OriginallyAvailableAt *types.Date `json:"originallyAvailableAt,omitempty"` // When present, used to indicate an item's original title, e.g. a movie's foreign title. - OriginalTitle any `json:"originalTitle,omitempty"` + OriginalTitle *string `json:"originalTitle,omitempty"` + // The GUID of the parent media item. + ParentGUID *string `json:"parentGuid,omitempty"` // The `hero` of the parent ParentHero *string `json:"parentHero,omitempty"` // The `index` of the parent - ParentIndex *int64 `json:"parentIndex,omitempty"` + ParentIndex *int `json:"parentIndex,omitempty"` // The `key` of the parent ParentKey *string `json:"parentKey,omitempty"` // The `ratingKey` of the parent @@ -86,19 +107,19 @@ type Items struct { // The `title` of the parent ParentTitle *string `json:"parentTitle,omitempty"` // Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. - PrimaryExtraKey any `json:"primaryExtraKey,omitempty"` + PrimaryExtraKey *string `json:"primaryExtraKey,omitempty"` // Prompt to give the user for this directory (such as `Search Movies`) Prompt *string `json:"prompt,omitempty"` // When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. - Rating *float64 `json:"rating,omitempty"` + Rating *float32 `json:"rating,omitempty"` RatingArray []Tag `json:"Rating,omitempty"` // Number of ratings under this metadata - RatingCount *int64 `json:"ratingCount,omitempty"` + RatingCount *int `json:"ratingCount,omitempty"` // When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. - RatingImage any `json:"ratingImage,omitempty"` + RatingImage *string `json:"ratingImage,omitempty"` // This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. - RatingKey any `json:"ratingKey,omitempty"` - Role []Tag `json:"Role,omitempty"` + RatingKey *string `json:"ratingKey,omitempty"` + Role []Tag `json:"Role,omitempty"` // Indicates this is a search directory Search *bool `json:"search,omitempty"` // Used by old clients to provide nested menus allowing for primative (but structured) navigation. @@ -110,32 +131,32 @@ type Items struct { // Typically only seen in metadata at a library's top level Sort []Sort `json:"Sort,omitempty"` // When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). - Studio any `json:"studio,omitempty"` + Studio *string `json:"studio,omitempty"` // The subtype of the video item, such as `photo` when the video item is in a photo library - Subtype any `json:"subtype,omitempty"` + Subtype *string `json:"subtype,omitempty"` // When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). - Summary any `json:"summary,omitempty"` + Summary *string `json:"summary,omitempty"` // When present, a pithy one-liner about the item (usually only seen for movies). - Tagline any `json:"tagline,omitempty"` + Tagline *string `json:"tagline,omitempty"` // When present, the URL for theme music for the item (usually only for TV shows). - Theme any `json:"theme,omitempty"` + Theme *string `json:"theme,omitempty"` // When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. - Thumb any `json:"thumb,omitempty"` + Thumb *string `json:"thumb,omitempty"` // Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). - TitleSort any `json:"titleSort,omitempty"` + TitleSort *string `json:"titleSort,omitempty"` // In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). UpdatedAt *int64 `json:"updatedAt,omitempty"` // When the user has rated an item, this contains the user rating - UserRating *float64 `json:"userRating,omitempty"` + UserRating *float32 `json:"userRating,omitempty"` // When a users has completed watched or listened to an item, this attribute contains the number of consumptions. - ViewCount *int64 `json:"viewCount,omitempty"` + ViewCount *int `json:"viewCount,omitempty"` // For shows and seasons, contains the number of viewed episodes. - ViewedLeafCount *int64 `json:"viewedLeafCount,omitempty"` + ViewedLeafCount *int `json:"viewedLeafCount,omitempty"` // When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. - ViewOffset *int64 `json:"viewOffset,omitempty"` - Writer []Tag `json:"Writer,omitempty"` + ViewOffset *int `json:"viewOffset,omitempty"` + Writer []Tag `json:"Writer,omitempty"` // When present, the year associated with the item's release (e.g. release year for a movie). - Year *int64 `json:"year,omitempty"` + Year *int `json:"year,omitempty"` MetadataItem []Items `json:"MetadataItem,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -145,55 +166,55 @@ func (i Items) MarshalJSON() ([]byte, error) { } func (i *Items) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &i, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &i, "", false, []string{"title", "type", "addedAt", "key"}); err != nil { return err } return nil } -func (i *Items) GetTitle() any { +func (i *Items) GetTitle() string { if i == nil { - return nil + return "" } return i.Title } -func (i *Items) GetType() any { +func (i *Items) GetType() string { if i == nil { - return nil + return "" } return i.Type } -func (i *Items) GetAbsoluteIndex() *int64 { +func (i *Items) GetAbsoluteIndex() *int { if i == nil { return nil } return i.AbsoluteIndex } -func (i *Items) GetAddedAt() *int64 { +func (i *Items) GetAddedAt() int64 { if i == nil { - return nil + return 0 } return i.AddedAt } -func (i *Items) GetArt() any { +func (i *Items) GetArt() *string { if i == nil { return nil } return i.Art } -func (i *Items) GetAudienceRating() *float64 { +func (i *Items) GetAudienceRating() *float32 { if i == nil { return nil } return i.AudienceRating } -func (i *Items) GetAudienceRatingImage() any { +func (i *Items) GetAudienceRatingImage() *string { if i == nil { return nil } @@ -207,28 +228,35 @@ func (i *Items) GetAutotag() []Tag { return i.Autotag } -func (i *Items) GetBanner() any { +func (i *Items) GetBanner() *string { if i == nil { return nil } return i.Banner } -func (i *Items) GetChapterSource() any { +func (i *Items) GetChapterSource() *string { if i == nil { return nil } return i.ChapterSource } -func (i *Items) GetComposite() any { +func (i *Items) GetChildCount() *int { + if i == nil { + return nil + } + return i.ChildCount +} + +func (i *Items) GetComposite() *string { if i == nil { return nil } return i.Composite } -func (i *Items) GetContentRating() any { +func (i *Items) GetContentRating() *string { if i == nil { return nil } @@ -249,7 +277,7 @@ func (i *Items) GetDirector() []Tag { return i.Director } -func (i *Items) GetDuration() *int64 { +func (i *Items) GetDuration() *int { if i == nil { return nil } @@ -277,6 +305,13 @@ func (i *Items) GetGrandparentArt() *string { return i.GrandparentArt } +func (i *Items) GetGrandparentGUID() *string { + if i == nil { + return nil + } + return i.GrandparentGUID +} + func (i *Items) GetGrandparentHero() *string { if i == nil { return nil @@ -319,14 +354,21 @@ func (i *Items) GetGrandparentTitle() *string { return i.GrandparentTitle } -func (i *Items) GetGUID() []Tag { +func (i *Items) GetGUID() *string { if i == nil { return nil } return i.GUID } -func (i *Items) GetHero() any { +func (i *Items) GetGuids() []ItemsGuids { + if i == nil { + return nil + } + return i.Guids +} + +func (i *Items) GetHero() *string { if i == nil { return nil } @@ -340,16 +382,16 @@ func (i *Items) GetImage() []Image { return i.Image } -func (i *Items) GetIndex() *int64 { +func (i *Items) GetIndex() *int { if i == nil { return nil } return i.Index } -func (i *Items) GetKey() any { +func (i *Items) GetKey() string { if i == nil { - return nil + return "" } return i.Key } @@ -361,7 +403,7 @@ func (i *Items) GetLastViewedAt() *int64 { return i.LastViewedAt } -func (i *Items) GetLeafCount() *int64 { +func (i *Items) GetLeafCount() *int { if i == nil { return nil } @@ -375,20 +417,27 @@ func (i *Items) GetMedia() []Media { return i.Media } -func (i *Items) GetOriginallyAvailableAt() any { +func (i *Items) GetOriginallyAvailableAt() *types.Date { if i == nil { return nil } return i.OriginallyAvailableAt } -func (i *Items) GetOriginalTitle() any { +func (i *Items) GetOriginalTitle() *string { if i == nil { return nil } return i.OriginalTitle } +func (i *Items) GetParentGUID() *string { + if i == nil { + return nil + } + return i.ParentGUID +} + func (i *Items) GetParentHero() *string { if i == nil { return nil @@ -396,7 +445,7 @@ func (i *Items) GetParentHero() *string { return i.ParentHero } -func (i *Items) GetParentIndex() *int64 { +func (i *Items) GetParentIndex() *int { if i == nil { return nil } @@ -431,7 +480,7 @@ func (i *Items) GetParentTitle() *string { return i.ParentTitle } -func (i *Items) GetPrimaryExtraKey() any { +func (i *Items) GetPrimaryExtraKey() *string { if i == nil { return nil } @@ -445,7 +494,7 @@ func (i *Items) GetPrompt() *string { return i.Prompt } -func (i *Items) GetRating() *float64 { +func (i *Items) GetRating() *float32 { if i == nil { return nil } @@ -459,21 +508,21 @@ func (i *Items) GetRatingArray() []Tag { return i.RatingArray } -func (i *Items) GetRatingCount() *int64 { +func (i *Items) GetRatingCount() *int { if i == nil { return nil } return i.RatingCount } -func (i *Items) GetRatingImage() any { +func (i *Items) GetRatingImage() *string { if i == nil { return nil } return i.RatingImage } -func (i *Items) GetRatingKey() any { +func (i *Items) GetRatingKey() *string { if i == nil { return nil } @@ -522,49 +571,49 @@ func (i *Items) GetSort() []Sort { return i.Sort } -func (i *Items) GetStudio() any { +func (i *Items) GetStudio() *string { if i == nil { return nil } return i.Studio } -func (i *Items) GetSubtype() any { +func (i *Items) GetSubtype() *string { if i == nil { return nil } return i.Subtype } -func (i *Items) GetSummary() any { +func (i *Items) GetSummary() *string { if i == nil { return nil } return i.Summary } -func (i *Items) GetTagline() any { +func (i *Items) GetTagline() *string { if i == nil { return nil } return i.Tagline } -func (i *Items) GetTheme() any { +func (i *Items) GetTheme() *string { if i == nil { return nil } return i.Theme } -func (i *Items) GetThumb() any { +func (i *Items) GetThumb() *string { if i == nil { return nil } return i.Thumb } -func (i *Items) GetTitleSort() any { +func (i *Items) GetTitleSort() *string { if i == nil { return nil } @@ -578,28 +627,28 @@ func (i *Items) GetUpdatedAt() *int64 { return i.UpdatedAt } -func (i *Items) GetUserRating() *float64 { +func (i *Items) GetUserRating() *float32 { if i == nil { return nil } return i.UserRating } -func (i *Items) GetViewCount() *int64 { +func (i *Items) GetViewCount() *int { if i == nil { return nil } return i.ViewCount } -func (i *Items) GetViewedLeafCount() *int64 { +func (i *Items) GetViewedLeafCount() *int { if i == nil { return nil } return i.ViewedLeafCount } -func (i *Items) GetViewOffset() *int64 { +func (i *Items) GetViewOffset() *int { if i == nil { return nil } @@ -613,7 +662,7 @@ func (i *Items) GetWriter() []Tag { return i.Writer } -func (i *Items) GetYear() *int64 { +func (i *Items) GetYear() *int { if i == nil { return nil } diff --git a/models/components/librarysection.go b/models/components/librarysection.go index 04bf8ab..fb17ebf 100644 --- a/models/components/librarysection.go +++ b/models/components/librarysection.go @@ -24,21 +24,26 @@ func (l *LibrarySectionLocation) GetPath() any { } type LibrarySection struct { - Title *string `json:"title,omitempty"` - Type *string `json:"type,omitempty"` - Agent *string `json:"agent,omitempty"` - AllowSync *bool `json:"allowSync,omitempty"` - Art *string `json:"art,omitempty"` - Composite *string `json:"composite,omitempty"` - Content *bool `json:"content,omitempty"` - ContentChangedAt *int64 `json:"contentChangedAt,omitempty"` - CreatedAt *int64 `json:"createdAt,omitempty"` - Directory *bool `json:"directory,omitempty"` + // The title of the library + Title *string `json:"title,omitempty"` + // The type of media content in the Plex library. This can represent videos, music, or photos. + // + Type MediaTypeString `json:"type"` + Agent *string `json:"agent,omitempty"` + AllowSync *bool `json:"allowSync,omitempty"` + Art *string `json:"art,omitempty"` + Composite *string `json:"composite,omitempty"` + Content *bool `json:"content,omitempty"` + ContentChangedAt *int64 `json:"contentChangedAt,omitempty"` + CreatedAt *int64 `json:"createdAt,omitempty"` + Directory *bool `json:"directory,omitempty"` // Indicates whether this section has filtering capabilities - Filters *bool `json:"filters,omitempty"` - Hidden *bool `json:"hidden,omitempty"` - Key *string `json:"key,omitempty"` - Language *string `json:"language,omitempty"` + Filters *bool `json:"filters,omitempty"` + Hidden *bool `json:"hidden,omitempty"` + Key *string `json:"key,omitempty"` + Language string `json:"language"` + // The universally unique identifier for the library. + UUID string `json:"uuid"` Location []LibrarySectionLocation `json:"Location,omitempty"` // Indicates whether this library section is currently scanning Refreshing *bool `json:"refreshing,omitempty"` @@ -55,9 +60,9 @@ func (l *LibrarySection) GetTitle() *string { return l.Title } -func (l *LibrarySection) GetType() *string { +func (l *LibrarySection) GetType() MediaTypeString { if l == nil { - return nil + return MediaTypeString("") } return l.Type } @@ -139,13 +144,20 @@ func (l *LibrarySection) GetKey() *string { return l.Key } -func (l *LibrarySection) GetLanguage() *string { +func (l *LibrarySection) GetLanguage() string { if l == nil { - return nil + return "" } return l.Language } +func (l *LibrarySection) GetUUID() string { + if l == nil { + return "" + } + return l.UUID +} + func (l *LibrarySection) GetLocation() []LibrarySectionLocation { if l == nil { return nil diff --git a/models/components/media.go b/models/components/media.go index 7a6d27f..04be0e4 100644 --- a/models/components/media.go +++ b/models/components/media.go @@ -8,24 +8,24 @@ import ( // Media - `Media` represents an one or more media files (parts) and is a child of a metadata item. There aren't necessarily any guaranteed attributes on media elements since the attributes will vary based on the type. The possible attributes are not documented here, but they typically have self-evident names. High-level media information that can be used for badging and flagging, such as `videoResolution` and codecs, is included on the media element. type Media struct { - AspectRatio *float64 `json:"aspectRatio,omitempty"` - AudioChannels *int64 `json:"audioChannels,omitempty"` - AudioCodec any `json:"audioCodec,omitempty"` - AudioProfile any `json:"audioProfile,omitempty"` - Bitrate *int64 `json:"bitrate,omitempty"` - Container any `json:"container,omitempty"` - Duration *int64 `json:"duration,omitempty"` + AspectRatio *float32 `json:"aspectRatio,omitempty"` + AudioChannels *int `json:"audioChannels,omitempty"` + AudioCodec *string `json:"audioCodec,omitempty"` + AudioProfile *string `json:"audioProfile,omitempty"` + Bitrate *int `json:"bitrate,omitempty"` + Container *string `json:"container,omitempty"` + Duration *int `json:"duration,omitempty"` Has64bitOffsets *bool `json:"has64bitOffsets,omitempty"` HasVoiceActivity *bool `json:"hasVoiceActivity,omitempty"` - Height *int64 `json:"height,omitempty"` - ID *int64 `json:"id,omitempty"` + Height *int `json:"height,omitempty"` + ID int64 `json:"id"` OptimizedForStreaming *bool `json:"optimizedForStreaming,omitempty"` Part []Part `json:"Part,omitempty"` - VideoCodec any `json:"videoCodec,omitempty"` - VideoFrameRate any `json:"videoFrameRate,omitempty"` - VideoProfile any `json:"videoProfile,omitempty"` - VideoResolution any `json:"videoResolution,omitempty"` - Width *int64 `json:"width,omitempty"` + VideoCodec *string `json:"videoCodec,omitempty"` + VideoFrameRate *string `json:"videoFrameRate,omitempty"` + VideoProfile *string `json:"videoProfile,omitempty"` + VideoResolution *string `json:"videoResolution,omitempty"` + Width *int `json:"width,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -34,55 +34,55 @@ func (m Media) MarshalJSON() ([]byte, error) { } func (m *Media) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"id"}); err != nil { return err } return nil } -func (m *Media) GetAspectRatio() *float64 { +func (m *Media) GetAspectRatio() *float32 { if m == nil { return nil } return m.AspectRatio } -func (m *Media) GetAudioChannels() *int64 { +func (m *Media) GetAudioChannels() *int { if m == nil { return nil } return m.AudioChannels } -func (m *Media) GetAudioCodec() any { +func (m *Media) GetAudioCodec() *string { if m == nil { return nil } return m.AudioCodec } -func (m *Media) GetAudioProfile() any { +func (m *Media) GetAudioProfile() *string { if m == nil { return nil } return m.AudioProfile } -func (m *Media) GetBitrate() *int64 { +func (m *Media) GetBitrate() *int { if m == nil { return nil } return m.Bitrate } -func (m *Media) GetContainer() any { +func (m *Media) GetContainer() *string { if m == nil { return nil } return m.Container } -func (m *Media) GetDuration() *int64 { +func (m *Media) GetDuration() *int { if m == nil { return nil } @@ -103,16 +103,16 @@ func (m *Media) GetHasVoiceActivity() *bool { return m.HasVoiceActivity } -func (m *Media) GetHeight() *int64 { +func (m *Media) GetHeight() *int { if m == nil { return nil } return m.Height } -func (m *Media) GetID() *int64 { +func (m *Media) GetID() int64 { if m == nil { - return nil + return 0 } return m.ID } @@ -131,35 +131,35 @@ func (m *Media) GetPart() []Part { return m.Part } -func (m *Media) GetVideoCodec() any { +func (m *Media) GetVideoCodec() *string { if m == nil { return nil } return m.VideoCodec } -func (m *Media) GetVideoFrameRate() any { +func (m *Media) GetVideoFrameRate() *string { if m == nil { return nil } return m.VideoFrameRate } -func (m *Media) GetVideoProfile() any { +func (m *Media) GetVideoProfile() *string { if m == nil { return nil } return m.VideoProfile } -func (m *Media) GetVideoResolution() any { +func (m *Media) GetVideoResolution() *string { if m == nil { return nil } return m.VideoResolution } -func (m *Media) GetWidth() *int64 { +func (m *Media) GetWidth() *int { if m == nil { return nil } diff --git a/models/components/mediacontainerwithdecision.go b/models/components/mediacontainerwithdecision.go index 5dd0345..e896805 100644 --- a/models/components/mediacontainerwithdecision.go +++ b/models/components/mediacontainerwithdecision.go @@ -6,8 +6,22 @@ import ( "encoding/json" "fmt" "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/types" ) +type MediaContainerWithDecisionGuids struct { + // The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + // + ID string `json:"id"` +} + +func (m *MediaContainerWithDecisionGuids) GetID() string { + if m == nil { + return "" + } + return m.ID +} + type MediaContainerWithDecisionDecision string const ( @@ -92,42 +106,108 @@ func (e *MediaContainerWithDecisionLocation) UnmarshalJSON(data []byte) error { // MediaContainerWithDecisionStream - `Stream` represents a particular stream from a media item, such as the video stream, audio stream, or subtitle stream. The stream may either be part of the file represented by the parent `Part` or, especially for subtitles, an external file. The stream contains more detailed information about the specific stream. For example, a video may include the `aspectRatio` at the `Media` level, but detailed information about the video stream like the color space will be included on the `Stream` for the video stream. Note that photos do not have streams (mostly as an optimization). type MediaContainerWithDecisionStream struct { - Default *bool `json:"default,omitempty"` - AudioChannelLayout any `json:"audioChannelLayout,omitempty"` - BitDepth *int64 `json:"bitDepth,omitempty"` - Bitrate *int64 `json:"bitrate,omitempty"` - // For subtitle streams only. If `true` then the server can attempt to automatically sync the subtitle timestamps with the video. - CanAutoSync *bool `json:"canAutoSync,omitempty"` - ChromaLocation any `json:"chromaLocation,omitempty"` - ChromaSubsampling any `json:"chromaSubsampling,omitempty"` - // The codec of the stream, such as `h264` or `aac` - Codec any `json:"codec,omitempty"` - ColorPrimaries any `json:"colorPrimaries,omitempty"` - ColorRange any `json:"colorRange,omitempty"` - ColorSpace any `json:"colorSpace,omitempty"` - ColorTrc any `json:"colorTrc,omitempty"` - // A friendly name for the stream, often comprised of the language and codec information - DisplayTitle any `json:"displayTitle,omitempty"` - FrameRate *float64 `json:"frameRate,omitempty"` - HasScalingMatrix any `json:"hasScalingMatrix,omitempty"` - Height *int64 `json:"height,omitempty"` - ID *int64 `json:"id,omitempty"` - // If the stream is part of the `Part` and not an external resource, the index of the stream within that part - Index *int64 `json:"index,omitempty"` - // If the stream is independently streamable, the key from which it can be streamed - Key any `json:"key,omitempty"` - Language any `json:"language,omitempty"` - // The three character language code for the stream contents - LanguageCode any `json:"languageCode,omitempty"` - Level *int64 `json:"level,omitempty"` - Profile any `json:"profile,omitempty"` - RefFrames *int64 `json:"refFrames,omitempty"` - SamplingRate *int64 `json:"samplingRate,omitempty"` - Selected *bool `json:"selected,omitempty"` - StreamIdentifier *int64 `json:"streamIdentifier,omitempty"` - // A number indicating the type of the stream. `1` for video, `2` for audio, `3` for subtitles, `4` for lyrics - StreamType *int64 `json:"streamType,omitempty"` - Width *int64 `json:"width,omitempty"` + // Indicates if this stream is default. + Default *bool `json:"default,omitempty"` + // Audio channel layout. + AudioChannelLayout *string `json:"audioChannelLayout,omitempty"` + // Number of audio channels (for audio streams). + Channels *int `json:"channels,omitempty"` + // Bit depth of the video stream. + BitDepth *int `json:"bitDepth,omitempty"` + // Dolby Vision BL compatibility ID. + DOVIBLCompatID *int `json:"DOVIBLCompatID,omitempty"` + // Indicates if Dolby Vision BL is present. + DOVIBLPresent *bool `json:"DOVIBLPresent,omitempty"` + // Indicates if Dolby Vision EL is present. + DOVIELPresent *bool `json:"DOVIELPresent,omitempty"` + // Dolby Vision level. + DOVILevel *int `json:"DOVILevel,omitempty"` + // Indicates if Dolby Vision is present. + DOVIPresent *bool `json:"DOVIPresent,omitempty"` + // Dolby Vision profile. + DOVIProfile *int `json:"DOVIProfile,omitempty"` + // Indicates if Dolby Vision RPU is present. + DOVIRPUPresent *bool `json:"DOVIRPUPresent,omitempty"` + // Dolby Vision version. + DOVIVersion *string `json:"DOVIVersion,omitempty"` + // Bitrate of the stream. + Bitrate *int `json:"bitrate,omitempty"` + // Indicates if the stream can auto-sync. + CanAutoSync *bool `json:"canAutoSync,omitempty"` + // Chroma sample location. + ChromaLocation *string `json:"chromaLocation,omitempty"` + // Chroma subsampling format. + ChromaSubsampling *string `json:"chromaSubsampling,omitempty"` + // Coded video height. + CodedHeight *int `json:"codedHeight,omitempty"` + // Coded video width. + CodedWidth *int `json:"codedWidth,omitempty"` + ClosedCaptions *bool `json:"closedCaptions,omitempty"` + // Codec used by the stream. + Codec string `json:"codec"` + // Color primaries used. + ColorPrimaries *string `json:"colorPrimaries,omitempty"` + // Color range (e.g., tv). + ColorRange *string `json:"colorRange,omitempty"` + // Color space. + ColorSpace *string `json:"colorSpace,omitempty"` + // Color transfer characteristics. + ColorTrc *string `json:"colorTrc,omitempty"` + // Display title for the stream. + DisplayTitle string `json:"displayTitle"` + // Extended display title for the stream. + ExtendedDisplayTitle *string `json:"extendedDisplayTitle,omitempty"` + // Frame rate of the stream. + FrameRate *float32 `json:"frameRate,omitempty"` + HasScalingMatrix *bool `json:"hasScalingMatrix,omitempty"` + // Height of the video stream. + Height *int `json:"height,omitempty"` + // Unique stream identifier. + ID int `json:"id"` + // Index of the stream. + Index *int `json:"index,omitempty"` + // Key to access this stream part. + Key string `json:"key"` + // Language of the stream. + Language *string `json:"language,omitempty"` + // ISO language code. + LanguageCode *string `json:"languageCode,omitempty"` + // Language tag (e.g., en). + LanguageTag *string `json:"languageTag,omitempty"` + // Format of the stream (e.g., srt). + Format *string `json:"format,omitempty"` + // Indicates whether header compression is enabled. + HeaderCompression *bool `json:"headerCompression,omitempty"` + // Video level. + Level *int `json:"level,omitempty"` + // Indicates if this is the original stream. + Original *bool `json:"original,omitempty"` + // Video profile. + Profile *string `json:"profile,omitempty"` + // Number of reference frames. + RefFrames *int `json:"refFrames,omitempty"` + // Sampling rate for the audio stream. + SamplingRate *int `json:"samplingRate,omitempty"` + ScanType *string `json:"scanType,omitempty"` + EmbeddedInVideo *string `json:"embeddedInVideo,omitempty"` + // Indicates if this stream is selected (applicable for audio streams). + Selected *bool `json:"selected,omitempty"` + Forced *bool `json:"forced,omitempty"` + // Indicates if the stream is for the hearing impaired. + HearingImpaired *bool `json:"hearingImpaired,omitempty"` + // Indicates if the stream is a dub. + Dub *bool `json:"dub,omitempty"` + // Optional title for the stream (e.g., language variant). + Title *string `json:"title,omitempty"` + StreamIdentifier *int `json:"streamIdentifier,omitempty"` + // Stream type: + // - VIDEO = 1 + // - AUDIO = 2 + // - SUBTITLE = 3 + // + streamType int64 `const:"1" json:"streamType"` + // Width of the video stream. + Width *int `json:"width,omitempty"` Decision *MediaContainerWithDecisionDecision `json:"decision,omitempty"` Location *MediaContainerWithDecisionLocation `json:"location,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` @@ -138,7 +218,7 @@ func (m MediaContainerWithDecisionStream) MarshalJSON() ([]byte, error) { } func (m *MediaContainerWithDecisionStream) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"codec", "displayTitle", "id", "key", "streamType"}); err != nil { return err } return nil @@ -151,21 +231,84 @@ func (m *MediaContainerWithDecisionStream) GetDefault() *bool { return m.Default } -func (m *MediaContainerWithDecisionStream) GetAudioChannelLayout() any { +func (m *MediaContainerWithDecisionStream) GetAudioChannelLayout() *string { if m == nil { return nil } return m.AudioChannelLayout } -func (m *MediaContainerWithDecisionStream) GetBitDepth() *int64 { +func (m *MediaContainerWithDecisionStream) GetChannels() *int { + if m == nil { + return nil + } + return m.Channels +} + +func (m *MediaContainerWithDecisionStream) GetBitDepth() *int { if m == nil { return nil } return m.BitDepth } -func (m *MediaContainerWithDecisionStream) GetBitrate() *int64 { +func (m *MediaContainerWithDecisionStream) GetDOVIBLCompatID() *int { + if m == nil { + return nil + } + return m.DOVIBLCompatID +} + +func (m *MediaContainerWithDecisionStream) GetDOVIBLPresent() *bool { + if m == nil { + return nil + } + return m.DOVIBLPresent +} + +func (m *MediaContainerWithDecisionStream) GetDOVIELPresent() *bool { + if m == nil { + return nil + } + return m.DOVIELPresent +} + +func (m *MediaContainerWithDecisionStream) GetDOVILevel() *int { + if m == nil { + return nil + } + return m.DOVILevel +} + +func (m *MediaContainerWithDecisionStream) GetDOVIPresent() *bool { + if m == nil { + return nil + } + return m.DOVIPresent +} + +func (m *MediaContainerWithDecisionStream) GetDOVIProfile() *int { + if m == nil { + return nil + } + return m.DOVIProfile +} + +func (m *MediaContainerWithDecisionStream) GetDOVIRPUPresent() *bool { + if m == nil { + return nil + } + return m.DOVIRPUPresent +} + +func (m *MediaContainerWithDecisionStream) GetDOVIVersion() *string { + if m == nil { + return nil + } + return m.DOVIVersion +} + +func (m *MediaContainerWithDecisionStream) GetBitrate() *int { if m == nil { return nil } @@ -179,146 +322,216 @@ func (m *MediaContainerWithDecisionStream) GetCanAutoSync() *bool { return m.CanAutoSync } -func (m *MediaContainerWithDecisionStream) GetChromaLocation() any { +func (m *MediaContainerWithDecisionStream) GetChromaLocation() *string { if m == nil { return nil } return m.ChromaLocation } -func (m *MediaContainerWithDecisionStream) GetChromaSubsampling() any { +func (m *MediaContainerWithDecisionStream) GetChromaSubsampling() *string { if m == nil { return nil } return m.ChromaSubsampling } -func (m *MediaContainerWithDecisionStream) GetCodec() any { +func (m *MediaContainerWithDecisionStream) GetCodedHeight() *int { if m == nil { return nil } + return m.CodedHeight +} + +func (m *MediaContainerWithDecisionStream) GetCodedWidth() *int { + if m == nil { + return nil + } + return m.CodedWidth +} + +func (m *MediaContainerWithDecisionStream) GetClosedCaptions() *bool { + if m == nil { + return nil + } + return m.ClosedCaptions +} + +func (m *MediaContainerWithDecisionStream) GetCodec() string { + if m == nil { + return "" + } return m.Codec } -func (m *MediaContainerWithDecisionStream) GetColorPrimaries() any { +func (m *MediaContainerWithDecisionStream) GetColorPrimaries() *string { if m == nil { return nil } return m.ColorPrimaries } -func (m *MediaContainerWithDecisionStream) GetColorRange() any { +func (m *MediaContainerWithDecisionStream) GetColorRange() *string { if m == nil { return nil } return m.ColorRange } -func (m *MediaContainerWithDecisionStream) GetColorSpace() any { +func (m *MediaContainerWithDecisionStream) GetColorSpace() *string { if m == nil { return nil } return m.ColorSpace } -func (m *MediaContainerWithDecisionStream) GetColorTrc() any { +func (m *MediaContainerWithDecisionStream) GetColorTrc() *string { if m == nil { return nil } return m.ColorTrc } -func (m *MediaContainerWithDecisionStream) GetDisplayTitle() any { +func (m *MediaContainerWithDecisionStream) GetDisplayTitle() string { if m == nil { - return nil + return "" } return m.DisplayTitle } -func (m *MediaContainerWithDecisionStream) GetFrameRate() *float64 { +func (m *MediaContainerWithDecisionStream) GetExtendedDisplayTitle() *string { + if m == nil { + return nil + } + return m.ExtendedDisplayTitle +} + +func (m *MediaContainerWithDecisionStream) GetFrameRate() *float32 { if m == nil { return nil } return m.FrameRate } -func (m *MediaContainerWithDecisionStream) GetHasScalingMatrix() any { +func (m *MediaContainerWithDecisionStream) GetHasScalingMatrix() *bool { if m == nil { return nil } return m.HasScalingMatrix } -func (m *MediaContainerWithDecisionStream) GetHeight() *int64 { +func (m *MediaContainerWithDecisionStream) GetHeight() *int { if m == nil { return nil } return m.Height } -func (m *MediaContainerWithDecisionStream) GetID() *int64 { +func (m *MediaContainerWithDecisionStream) GetID() int { if m == nil { - return nil + return 0 } return m.ID } -func (m *MediaContainerWithDecisionStream) GetIndex() *int64 { +func (m *MediaContainerWithDecisionStream) GetIndex() *int { if m == nil { return nil } return m.Index } -func (m *MediaContainerWithDecisionStream) GetKey() any { +func (m *MediaContainerWithDecisionStream) GetKey() string { if m == nil { - return nil + return "" } return m.Key } -func (m *MediaContainerWithDecisionStream) GetLanguage() any { +func (m *MediaContainerWithDecisionStream) GetLanguage() *string { if m == nil { return nil } return m.Language } -func (m *MediaContainerWithDecisionStream) GetLanguageCode() any { +func (m *MediaContainerWithDecisionStream) GetLanguageCode() *string { if m == nil { return nil } return m.LanguageCode } -func (m *MediaContainerWithDecisionStream) GetLevel() *int64 { +func (m *MediaContainerWithDecisionStream) GetLanguageTag() *string { + if m == nil { + return nil + } + return m.LanguageTag +} + +func (m *MediaContainerWithDecisionStream) GetFormat() *string { + if m == nil { + return nil + } + return m.Format +} + +func (m *MediaContainerWithDecisionStream) GetHeaderCompression() *bool { + if m == nil { + return nil + } + return m.HeaderCompression +} + +func (m *MediaContainerWithDecisionStream) GetLevel() *int { if m == nil { return nil } return m.Level } -func (m *MediaContainerWithDecisionStream) GetProfile() any { +func (m *MediaContainerWithDecisionStream) GetOriginal() *bool { + if m == nil { + return nil + } + return m.Original +} + +func (m *MediaContainerWithDecisionStream) GetProfile() *string { if m == nil { return nil } return m.Profile } -func (m *MediaContainerWithDecisionStream) GetRefFrames() *int64 { +func (m *MediaContainerWithDecisionStream) GetRefFrames() *int { if m == nil { return nil } return m.RefFrames } -func (m *MediaContainerWithDecisionStream) GetSamplingRate() *int64 { +func (m *MediaContainerWithDecisionStream) GetSamplingRate() *int { if m == nil { return nil } return m.SamplingRate } +func (m *MediaContainerWithDecisionStream) GetScanType() *string { + if m == nil { + return nil + } + return m.ScanType +} + +func (m *MediaContainerWithDecisionStream) GetEmbeddedInVideo() *string { + if m == nil { + return nil + } + return m.EmbeddedInVideo +} + func (m *MediaContainerWithDecisionStream) GetSelected() *bool { if m == nil { return nil @@ -326,21 +539,46 @@ func (m *MediaContainerWithDecisionStream) GetSelected() *bool { return m.Selected } -func (m *MediaContainerWithDecisionStream) GetStreamIdentifier() *int64 { +func (m *MediaContainerWithDecisionStream) GetForced() *bool { + if m == nil { + return nil + } + return m.Forced +} + +func (m *MediaContainerWithDecisionStream) GetHearingImpaired() *bool { + if m == nil { + return nil + } + return m.HearingImpaired +} + +func (m *MediaContainerWithDecisionStream) GetDub() *bool { + if m == nil { + return nil + } + return m.Dub +} + +func (m *MediaContainerWithDecisionStream) GetTitle() *string { + if m == nil { + return nil + } + return m.Title +} + +func (m *MediaContainerWithDecisionStream) GetStreamIdentifier() *int { if m == nil { return nil } return m.StreamIdentifier } -func (m *MediaContainerWithDecisionStream) GetStreamType() *int64 { - if m == nil { - return nil - } - return m.StreamType +func (m *MediaContainerWithDecisionStream) GetStreamType() int64 { + return 1 } -func (m *MediaContainerWithDecisionStream) GetWidth() *int64 { +func (m *MediaContainerWithDecisionStream) GetWidth() *int { if m == nil { return nil } @@ -399,22 +637,27 @@ func (e *Decision) UnmarshalJSON(data []byte) error { // MediaContainerWithDecisionPart - `Part` represents a particular file or "part" of a media item. The part is the playable unit of the media hierarchy. Suppose that a movie library contains a movie that is broken up into files, reminiscent of a movie split across two BDs. The metadata item represents information about the movie, the media item represents this instance of the movie at this resolution and quality, and the part items represent the two playable files. If another media were added which contained the joining of these two parts transcoded down to a lower resolution, then this metadata would contain 2 medias, one with 2 parts and one with 1 part. type MediaContainerWithDecisionPart struct { - AudioProfile any `json:"audioProfile,omitempty"` + // Indicates if the part is accessible. + Accessible *bool `json:"accessible,omitempty"` + AudioProfile *string `json:"audioProfile,omitempty"` // The container of the media file, such as `mp4` or `mkv` - Container any `json:"container,omitempty"` + Container *string `json:"container,omitempty"` // The duration of the media item, in milliseconds - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` + // Indicates if the part exists. + Exists *bool `json:"exists,omitempty"` // The local file path at which the part is stored on the server - File any `json:"file,omitempty"` - Has64bitOffsets *bool `json:"has64bitOffsets,omitempty"` - ID *int64 `json:"id,omitempty"` + File *string `json:"file,omitempty"` + Has64bitOffsets *bool `json:"has64bitOffsets,omitempty"` + ID int64 `json:"id"` + Indexes *string `json:"indexes,omitempty"` // The key from which the media can be streamed - Key any `json:"key,omitempty"` - OptimizedForStreaming *bool `json:"optimizedForStreaming,omitempty"` + Key string `json:"key"` + OptimizedForStreaming *bool `json:"optimizedForStreaming,omitempty"` // The size of the media, in bytes Size *int64 `json:"size,omitempty"` Stream []MediaContainerWithDecisionStream `json:"Stream,omitempty"` - VideoProfile any `json:"videoProfile,omitempty"` + VideoProfile *string `json:"videoProfile,omitempty"` Decision *Decision `json:"decision,omitempty"` Selected *bool `json:"selected,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` @@ -425,34 +668,48 @@ func (m MediaContainerWithDecisionPart) MarshalJSON() ([]byte, error) { } func (m *MediaContainerWithDecisionPart) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"id", "key"}); err != nil { return err } return nil } -func (m *MediaContainerWithDecisionPart) GetAudioProfile() any { +func (m *MediaContainerWithDecisionPart) GetAccessible() *bool { + if m == nil { + return nil + } + return m.Accessible +} + +func (m *MediaContainerWithDecisionPart) GetAudioProfile() *string { if m == nil { return nil } return m.AudioProfile } -func (m *MediaContainerWithDecisionPart) GetContainer() any { +func (m *MediaContainerWithDecisionPart) GetContainer() *string { if m == nil { return nil } return m.Container } -func (m *MediaContainerWithDecisionPart) GetDuration() *int64 { +func (m *MediaContainerWithDecisionPart) GetDuration() *int { if m == nil { return nil } return m.Duration } -func (m *MediaContainerWithDecisionPart) GetFile() any { +func (m *MediaContainerWithDecisionPart) GetExists() *bool { + if m == nil { + return nil + } + return m.Exists +} + +func (m *MediaContainerWithDecisionPart) GetFile() *string { if m == nil { return nil } @@ -466,17 +723,24 @@ func (m *MediaContainerWithDecisionPart) GetHas64bitOffsets() *bool { return m.Has64bitOffsets } -func (m *MediaContainerWithDecisionPart) GetID() *int64 { +func (m *MediaContainerWithDecisionPart) GetID() int64 { if m == nil { - return nil + return 0 } return m.ID } -func (m *MediaContainerWithDecisionPart) GetKey() any { +func (m *MediaContainerWithDecisionPart) GetIndexes() *string { if m == nil { return nil } + return m.Indexes +} + +func (m *MediaContainerWithDecisionPart) GetKey() string { + if m == nil { + return "" + } return m.Key } @@ -501,7 +765,7 @@ func (m *MediaContainerWithDecisionPart) GetStream() []MediaContainerWithDecisio return m.Stream } -func (m *MediaContainerWithDecisionPart) GetVideoProfile() any { +func (m *MediaContainerWithDecisionPart) GetVideoProfile() *string { if m == nil { return nil } @@ -531,24 +795,24 @@ func (m *MediaContainerWithDecisionPart) GetAdditionalProperties() map[string]an // MediaContainerWithDecisionMedia - `Media` represents an one or more media files (parts) and is a child of a metadata item. There aren't necessarily any guaranteed attributes on media elements since the attributes will vary based on the type. The possible attributes are not documented here, but they typically have self-evident names. High-level media information that can be used for badging and flagging, such as `videoResolution` and codecs, is included on the media element. type MediaContainerWithDecisionMedia struct { - AspectRatio *float64 `json:"aspectRatio,omitempty"` - AudioChannels *int64 `json:"audioChannels,omitempty"` - AudioCodec any `json:"audioCodec,omitempty"` - AudioProfile any `json:"audioProfile,omitempty"` - Bitrate *int64 `json:"bitrate,omitempty"` - Container any `json:"container,omitempty"` - Duration *int64 `json:"duration,omitempty"` + AspectRatio *float32 `json:"aspectRatio,omitempty"` + AudioChannels *int `json:"audioChannels,omitempty"` + AudioCodec *string `json:"audioCodec,omitempty"` + AudioProfile *string `json:"audioProfile,omitempty"` + Bitrate *int `json:"bitrate,omitempty"` + Container *string `json:"container,omitempty"` + Duration *int `json:"duration,omitempty"` Has64bitOffsets *bool `json:"has64bitOffsets,omitempty"` HasVoiceActivity *bool `json:"hasVoiceActivity,omitempty"` - Height *int64 `json:"height,omitempty"` - ID *int64 `json:"id,omitempty"` + Height *int `json:"height,omitempty"` + ID int64 `json:"id"` OptimizedForStreaming *bool `json:"optimizedForStreaming,omitempty"` Part []MediaContainerWithDecisionPart `json:"Part,omitempty"` - VideoCodec any `json:"videoCodec,omitempty"` - VideoFrameRate any `json:"videoFrameRate,omitempty"` - VideoProfile any `json:"videoProfile,omitempty"` - VideoResolution any `json:"videoResolution,omitempty"` - Width *int64 `json:"width,omitempty"` + VideoCodec *string `json:"videoCodec,omitempty"` + VideoFrameRate *string `json:"videoFrameRate,omitempty"` + VideoProfile *string `json:"videoProfile,omitempty"` + VideoResolution *string `json:"videoResolution,omitempty"` + Width *int `json:"width,omitempty"` Abr *bool `json:"abr,omitempty"` ResourceSession *string `json:"resourceSession,omitempty"` Selected *bool `json:"selected,omitempty"` @@ -560,55 +824,55 @@ func (m MediaContainerWithDecisionMedia) MarshalJSON() ([]byte, error) { } func (m *MediaContainerWithDecisionMedia) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"id"}); err != nil { return err } return nil } -func (m *MediaContainerWithDecisionMedia) GetAspectRatio() *float64 { +func (m *MediaContainerWithDecisionMedia) GetAspectRatio() *float32 { if m == nil { return nil } return m.AspectRatio } -func (m *MediaContainerWithDecisionMedia) GetAudioChannels() *int64 { +func (m *MediaContainerWithDecisionMedia) GetAudioChannels() *int { if m == nil { return nil } return m.AudioChannels } -func (m *MediaContainerWithDecisionMedia) GetAudioCodec() any { +func (m *MediaContainerWithDecisionMedia) GetAudioCodec() *string { if m == nil { return nil } return m.AudioCodec } -func (m *MediaContainerWithDecisionMedia) GetAudioProfile() any { +func (m *MediaContainerWithDecisionMedia) GetAudioProfile() *string { if m == nil { return nil } return m.AudioProfile } -func (m *MediaContainerWithDecisionMedia) GetBitrate() *int64 { +func (m *MediaContainerWithDecisionMedia) GetBitrate() *int { if m == nil { return nil } return m.Bitrate } -func (m *MediaContainerWithDecisionMedia) GetContainer() any { +func (m *MediaContainerWithDecisionMedia) GetContainer() *string { if m == nil { return nil } return m.Container } -func (m *MediaContainerWithDecisionMedia) GetDuration() *int64 { +func (m *MediaContainerWithDecisionMedia) GetDuration() *int { if m == nil { return nil } @@ -629,16 +893,16 @@ func (m *MediaContainerWithDecisionMedia) GetHasVoiceActivity() *bool { return m.HasVoiceActivity } -func (m *MediaContainerWithDecisionMedia) GetHeight() *int64 { +func (m *MediaContainerWithDecisionMedia) GetHeight() *int { if m == nil { return nil } return m.Height } -func (m *MediaContainerWithDecisionMedia) GetID() *int64 { +func (m *MediaContainerWithDecisionMedia) GetID() int64 { if m == nil { - return nil + return 0 } return m.ID } @@ -657,35 +921,35 @@ func (m *MediaContainerWithDecisionMedia) GetPart() []MediaContainerWithDecision return m.Part } -func (m *MediaContainerWithDecisionMedia) GetVideoCodec() any { +func (m *MediaContainerWithDecisionMedia) GetVideoCodec() *string { if m == nil { return nil } return m.VideoCodec } -func (m *MediaContainerWithDecisionMedia) GetVideoFrameRate() any { +func (m *MediaContainerWithDecisionMedia) GetVideoFrameRate() *string { if m == nil { return nil } return m.VideoFrameRate } -func (m *MediaContainerWithDecisionMedia) GetVideoProfile() any { +func (m *MediaContainerWithDecisionMedia) GetVideoProfile() *string { if m == nil { return nil } return m.VideoProfile } -func (m *MediaContainerWithDecisionMedia) GetVideoResolution() any { +func (m *MediaContainerWithDecisionMedia) GetVideoResolution() *string { if m == nil { return nil } return m.VideoResolution } -func (m *MediaContainerWithDecisionMedia) GetWidth() *int64 { +func (m *MediaContainerWithDecisionMedia) GetWidth() *int { if m == nil { return nil } @@ -727,37 +991,41 @@ func (m *MediaContainerWithDecisionMedia) GetAdditionalProperties() map[string]a // Metadata items can often live in a hierarchy with relationships between them. For example, the metadata item for an episodes is associated with a season metadata item which is associated with a show metadata item. A similar hierarchy exists with track, album, and artist and photos and photo album. The relationships may be expressed via relative terms and absolute terms. For example, "leaves" refer to metadata items which has associated media (there is no media for a season nor show). A show will have "children" in the form of seasons and a season will have "children" in the form of episodes and episodes have "parent" in the form of a season which has a "parent" in the form of a show. Similarly, a show has "grandchildren" in the form of episodse and an episode has a "grandparent" in the form of a show. type MediaContainerWithDecisionMetadata struct { // The title of the item (e.g. “300” or “The Simpsons”) - Title any `json:"title,omitempty"` + Title string `json:"title"` // The type of the video item, such as `movie`, `episode`, or `clip`. - Type any `json:"type,omitempty"` + Type string `json:"type"` // When present, contains the disc number for a track on multi-disc albums. - AbsoluteIndex *int64 `json:"absoluteIndex,omitempty"` + AbsoluteIndex *int `json:"absoluteIndex,omitempty"` // In units of seconds since the epoch, returns the time at which the item was added to the library. - AddedAt *int64 `json:"addedAt,omitempty"` + AddedAt int64 `json:"addedAt"` // When present, the URL for the background artwork for the item. - Art any `json:"art,omitempty"` + Art *string `json:"art,omitempty"` // Some rating systems separate reviewer ratings from audience ratings - AudienceRating *float64 `json:"audienceRating,omitempty"` + AudienceRating *float32 `json:"audienceRating,omitempty"` // A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). - AudienceRatingImage any `json:"audienceRatingImage,omitempty"` - Autotag []Tag `json:"Autotag,omitempty"` + AudienceRatingImage *string `json:"audienceRatingImage,omitempty"` + Autotag []Tag `json:"Autotag,omitempty"` // When present, the URL for a banner graphic for the item. - Banner any `json:"banner,omitempty"` + Banner *string `json:"banner,omitempty"` // When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). - ChapterSource any `json:"chapterSource,omitempty"` + ChapterSource *string `json:"chapterSource,omitempty"` + // The number of child items associated with this media item. + ChildCount *int `json:"childCount,omitempty"` // When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). - Composite any `json:"composite,omitempty"` + Composite *string `json:"composite,omitempty"` // If known, the content rating (e.g. MPAA) for an item. - ContentRating any `json:"contentRating,omitempty"` - Country []Tag `json:"Country,omitempty"` - Director []Tag `json:"Director,omitempty"` + ContentRating *string `json:"contentRating,omitempty"` + Country []Tag `json:"Country,omitempty"` + Director []Tag `json:"Director,omitempty"` // When present, the duration for the item, in units of milliseconds. - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` // Typically only seen in metadata at a library's top level Filter []Filter `json:"Filter,omitempty"` Genre []Tag `json:"Genre,omitempty"` // The `art` of the grandparent GrandparentArt *string `json:"grandparentArt,omitempty"` + // The GUID of the grandparent media item. + GrandparentGUID *string `json:"grandparentGuid,omitempty"` // The `hero` of the grandparent GrandparentHero *string `json:"grandparentHero,omitempty"` // The `key` of the grandparent @@ -770,27 +1038,30 @@ type MediaContainerWithDecisionMetadata struct { GrandparentThumb *string `json:"grandparentThumb,omitempty"` // The `title` of the grandparent GrandparentTitle *string `json:"grandparentTitle,omitempty"` - GUID []Tag `json:"Guid,omitempty"` + // The globally unique identifier for the media item. + GUID *string `json:"guid,omitempty"` + Guids []MediaContainerWithDecisionGuids `json:"Guid,omitempty"` // When present, the URL for a hero image for the item. - Hero any `json:"hero,omitempty"` + Hero *string `json:"hero,omitempty"` Image []Image `json:"Image,omitempty"` // When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. - Index *int64 `json:"index,omitempty"` + Index *int `json:"index,omitempty"` // The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. - Key any `json:"key,omitempty"` - // When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. + Key string `json:"key"` LastViewedAt *int64 `json:"lastViewedAt,omitempty"` // For shows and seasons, contains the number of total episodes. - LeafCount *int64 `json:"leafCount,omitempty"` + LeafCount *int `json:"leafCount,omitempty"` Media []MediaContainerWithDecisionMedia `json:"Media,omitempty"` // When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. - OriginallyAvailableAt any `json:"originallyAvailableAt,omitempty"` + OriginallyAvailableAt *types.Date `json:"originallyAvailableAt,omitempty"` // When present, used to indicate an item's original title, e.g. a movie's foreign title. - OriginalTitle any `json:"originalTitle,omitempty"` + OriginalTitle *string `json:"originalTitle,omitempty"` + // The GUID of the parent media item. + ParentGUID *string `json:"parentGuid,omitempty"` // The `hero` of the parent ParentHero *string `json:"parentHero,omitempty"` // The `index` of the parent - ParentIndex *int64 `json:"parentIndex,omitempty"` + ParentIndex *int `json:"parentIndex,omitempty"` // The `key` of the parent ParentKey *string `json:"parentKey,omitempty"` // The `ratingKey` of the parent @@ -800,19 +1071,19 @@ type MediaContainerWithDecisionMetadata struct { // The `title` of the parent ParentTitle *string `json:"parentTitle,omitempty"` // Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. - PrimaryExtraKey any `json:"primaryExtraKey,omitempty"` + PrimaryExtraKey *string `json:"primaryExtraKey,omitempty"` // Prompt to give the user for this directory (such as `Search Movies`) Prompt *string `json:"prompt,omitempty"` // When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. - Rating *float64 `json:"rating,omitempty"` + Rating *float32 `json:"rating,omitempty"` RatingArray []Tag `json:"Rating,omitempty"` // Number of ratings under this metadata - RatingCount *int64 `json:"ratingCount,omitempty"` + RatingCount *int `json:"ratingCount,omitempty"` // When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. - RatingImage any `json:"ratingImage,omitempty"` + RatingImage *string `json:"ratingImage,omitempty"` // This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. - RatingKey any `json:"ratingKey,omitempty"` - Role []Tag `json:"Role,omitempty"` + RatingKey *string `json:"ratingKey,omitempty"` + Role []Tag `json:"Role,omitempty"` // Indicates this is a search directory Search *bool `json:"search,omitempty"` // Used by old clients to provide nested menus allowing for primative (but structured) navigation. @@ -824,32 +1095,32 @@ type MediaContainerWithDecisionMetadata struct { // Typically only seen in metadata at a library's top level Sort []Sort `json:"Sort,omitempty"` // When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). - Studio any `json:"studio,omitempty"` + Studio *string `json:"studio,omitempty"` // The subtype of the video item, such as `photo` when the video item is in a photo library - Subtype any `json:"subtype,omitempty"` + Subtype *string `json:"subtype,omitempty"` // When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). - Summary any `json:"summary,omitempty"` + Summary *string `json:"summary,omitempty"` // When present, a pithy one-liner about the item (usually only seen for movies). - Tagline any `json:"tagline,omitempty"` + Tagline *string `json:"tagline,omitempty"` // When present, the URL for theme music for the item (usually only for TV shows). - Theme any `json:"theme,omitempty"` + Theme *string `json:"theme,omitempty"` // When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. - Thumb any `json:"thumb,omitempty"` + Thumb *string `json:"thumb,omitempty"` // Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). - TitleSort any `json:"titleSort,omitempty"` + TitleSort *string `json:"titleSort,omitempty"` // In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). UpdatedAt *int64 `json:"updatedAt,omitempty"` // When the user has rated an item, this contains the user rating - UserRating *float64 `json:"userRating,omitempty"` + UserRating *float32 `json:"userRating,omitempty"` // When a users has completed watched or listened to an item, this attribute contains the number of consumptions. - ViewCount *int64 `json:"viewCount,omitempty"` + ViewCount *int `json:"viewCount,omitempty"` // For shows and seasons, contains the number of viewed episodes. - ViewedLeafCount *int64 `json:"viewedLeafCount,omitempty"` + ViewedLeafCount *int `json:"viewedLeafCount,omitempty"` // When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. - ViewOffset *int64 `json:"viewOffset,omitempty"` - Writer []Tag `json:"Writer,omitempty"` + ViewOffset *int `json:"viewOffset,omitempty"` + Writer []Tag `json:"Writer,omitempty"` // When present, the year associated with the item's release (e.g. release year for a movie). - Year *int64 `json:"year,omitempty"` + Year *int `json:"year,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -858,55 +1129,55 @@ func (m MediaContainerWithDecisionMetadata) MarshalJSON() ([]byte, error) { } func (m *MediaContainerWithDecisionMetadata) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"title", "type", "addedAt", "key"}); err != nil { return err } return nil } -func (m *MediaContainerWithDecisionMetadata) GetTitle() any { +func (m *MediaContainerWithDecisionMetadata) GetTitle() string { if m == nil { - return nil + return "" } return m.Title } -func (m *MediaContainerWithDecisionMetadata) GetType() any { +func (m *MediaContainerWithDecisionMetadata) GetType() string { if m == nil { - return nil + return "" } return m.Type } -func (m *MediaContainerWithDecisionMetadata) GetAbsoluteIndex() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetAbsoluteIndex() *int { if m == nil { return nil } return m.AbsoluteIndex } -func (m *MediaContainerWithDecisionMetadata) GetAddedAt() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetAddedAt() int64 { if m == nil { - return nil + return 0 } return m.AddedAt } -func (m *MediaContainerWithDecisionMetadata) GetArt() any { +func (m *MediaContainerWithDecisionMetadata) GetArt() *string { if m == nil { return nil } return m.Art } -func (m *MediaContainerWithDecisionMetadata) GetAudienceRating() *float64 { +func (m *MediaContainerWithDecisionMetadata) GetAudienceRating() *float32 { if m == nil { return nil } return m.AudienceRating } -func (m *MediaContainerWithDecisionMetadata) GetAudienceRatingImage() any { +func (m *MediaContainerWithDecisionMetadata) GetAudienceRatingImage() *string { if m == nil { return nil } @@ -920,28 +1191,35 @@ func (m *MediaContainerWithDecisionMetadata) GetAutotag() []Tag { return m.Autotag } -func (m *MediaContainerWithDecisionMetadata) GetBanner() any { +func (m *MediaContainerWithDecisionMetadata) GetBanner() *string { if m == nil { return nil } return m.Banner } -func (m *MediaContainerWithDecisionMetadata) GetChapterSource() any { +func (m *MediaContainerWithDecisionMetadata) GetChapterSource() *string { if m == nil { return nil } return m.ChapterSource } -func (m *MediaContainerWithDecisionMetadata) GetComposite() any { +func (m *MediaContainerWithDecisionMetadata) GetChildCount() *int { + if m == nil { + return nil + } + return m.ChildCount +} + +func (m *MediaContainerWithDecisionMetadata) GetComposite() *string { if m == nil { return nil } return m.Composite } -func (m *MediaContainerWithDecisionMetadata) GetContentRating() any { +func (m *MediaContainerWithDecisionMetadata) GetContentRating() *string { if m == nil { return nil } @@ -962,7 +1240,7 @@ func (m *MediaContainerWithDecisionMetadata) GetDirector() []Tag { return m.Director } -func (m *MediaContainerWithDecisionMetadata) GetDuration() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetDuration() *int { if m == nil { return nil } @@ -990,6 +1268,13 @@ func (m *MediaContainerWithDecisionMetadata) GetGrandparentArt() *string { return m.GrandparentArt } +func (m *MediaContainerWithDecisionMetadata) GetGrandparentGUID() *string { + if m == nil { + return nil + } + return m.GrandparentGUID +} + func (m *MediaContainerWithDecisionMetadata) GetGrandparentHero() *string { if m == nil { return nil @@ -1032,14 +1317,21 @@ func (m *MediaContainerWithDecisionMetadata) GetGrandparentTitle() *string { return m.GrandparentTitle } -func (m *MediaContainerWithDecisionMetadata) GetGUID() []Tag { +func (m *MediaContainerWithDecisionMetadata) GetGUID() *string { if m == nil { return nil } return m.GUID } -func (m *MediaContainerWithDecisionMetadata) GetHero() any { +func (m *MediaContainerWithDecisionMetadata) GetGuids() []MediaContainerWithDecisionGuids { + if m == nil { + return nil + } + return m.Guids +} + +func (m *MediaContainerWithDecisionMetadata) GetHero() *string { if m == nil { return nil } @@ -1053,16 +1345,16 @@ func (m *MediaContainerWithDecisionMetadata) GetImage() []Image { return m.Image } -func (m *MediaContainerWithDecisionMetadata) GetIndex() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetIndex() *int { if m == nil { return nil } return m.Index } -func (m *MediaContainerWithDecisionMetadata) GetKey() any { +func (m *MediaContainerWithDecisionMetadata) GetKey() string { if m == nil { - return nil + return "" } return m.Key } @@ -1074,7 +1366,7 @@ func (m *MediaContainerWithDecisionMetadata) GetLastViewedAt() *int64 { return m.LastViewedAt } -func (m *MediaContainerWithDecisionMetadata) GetLeafCount() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetLeafCount() *int { if m == nil { return nil } @@ -1088,20 +1380,27 @@ func (m *MediaContainerWithDecisionMetadata) GetMedia() []MediaContainerWithDeci return m.Media } -func (m *MediaContainerWithDecisionMetadata) GetOriginallyAvailableAt() any { +func (m *MediaContainerWithDecisionMetadata) GetOriginallyAvailableAt() *types.Date { if m == nil { return nil } return m.OriginallyAvailableAt } -func (m *MediaContainerWithDecisionMetadata) GetOriginalTitle() any { +func (m *MediaContainerWithDecisionMetadata) GetOriginalTitle() *string { if m == nil { return nil } return m.OriginalTitle } +func (m *MediaContainerWithDecisionMetadata) GetParentGUID() *string { + if m == nil { + return nil + } + return m.ParentGUID +} + func (m *MediaContainerWithDecisionMetadata) GetParentHero() *string { if m == nil { return nil @@ -1109,7 +1408,7 @@ func (m *MediaContainerWithDecisionMetadata) GetParentHero() *string { return m.ParentHero } -func (m *MediaContainerWithDecisionMetadata) GetParentIndex() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetParentIndex() *int { if m == nil { return nil } @@ -1144,7 +1443,7 @@ func (m *MediaContainerWithDecisionMetadata) GetParentTitle() *string { return m.ParentTitle } -func (m *MediaContainerWithDecisionMetadata) GetPrimaryExtraKey() any { +func (m *MediaContainerWithDecisionMetadata) GetPrimaryExtraKey() *string { if m == nil { return nil } @@ -1158,7 +1457,7 @@ func (m *MediaContainerWithDecisionMetadata) GetPrompt() *string { return m.Prompt } -func (m *MediaContainerWithDecisionMetadata) GetRating() *float64 { +func (m *MediaContainerWithDecisionMetadata) GetRating() *float32 { if m == nil { return nil } @@ -1172,21 +1471,21 @@ func (m *MediaContainerWithDecisionMetadata) GetRatingArray() []Tag { return m.RatingArray } -func (m *MediaContainerWithDecisionMetadata) GetRatingCount() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetRatingCount() *int { if m == nil { return nil } return m.RatingCount } -func (m *MediaContainerWithDecisionMetadata) GetRatingImage() any { +func (m *MediaContainerWithDecisionMetadata) GetRatingImage() *string { if m == nil { return nil } return m.RatingImage } -func (m *MediaContainerWithDecisionMetadata) GetRatingKey() any { +func (m *MediaContainerWithDecisionMetadata) GetRatingKey() *string { if m == nil { return nil } @@ -1235,49 +1534,49 @@ func (m *MediaContainerWithDecisionMetadata) GetSort() []Sort { return m.Sort } -func (m *MediaContainerWithDecisionMetadata) GetStudio() any { +func (m *MediaContainerWithDecisionMetadata) GetStudio() *string { if m == nil { return nil } return m.Studio } -func (m *MediaContainerWithDecisionMetadata) GetSubtype() any { +func (m *MediaContainerWithDecisionMetadata) GetSubtype() *string { if m == nil { return nil } return m.Subtype } -func (m *MediaContainerWithDecisionMetadata) GetSummary() any { +func (m *MediaContainerWithDecisionMetadata) GetSummary() *string { if m == nil { return nil } return m.Summary } -func (m *MediaContainerWithDecisionMetadata) GetTagline() any { +func (m *MediaContainerWithDecisionMetadata) GetTagline() *string { if m == nil { return nil } return m.Tagline } -func (m *MediaContainerWithDecisionMetadata) GetTheme() any { +func (m *MediaContainerWithDecisionMetadata) GetTheme() *string { if m == nil { return nil } return m.Theme } -func (m *MediaContainerWithDecisionMetadata) GetThumb() any { +func (m *MediaContainerWithDecisionMetadata) GetThumb() *string { if m == nil { return nil } return m.Thumb } -func (m *MediaContainerWithDecisionMetadata) GetTitleSort() any { +func (m *MediaContainerWithDecisionMetadata) GetTitleSort() *string { if m == nil { return nil } @@ -1291,28 +1590,28 @@ func (m *MediaContainerWithDecisionMetadata) GetUpdatedAt() *int64 { return m.UpdatedAt } -func (m *MediaContainerWithDecisionMetadata) GetUserRating() *float64 { +func (m *MediaContainerWithDecisionMetadata) GetUserRating() *float32 { if m == nil { return nil } return m.UserRating } -func (m *MediaContainerWithDecisionMetadata) GetViewCount() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetViewCount() *int { if m == nil { return nil } return m.ViewCount } -func (m *MediaContainerWithDecisionMetadata) GetViewedLeafCount() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetViewedLeafCount() *int { if m == nil { return nil } return m.ViewedLeafCount } -func (m *MediaContainerWithDecisionMetadata) GetViewOffset() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetViewOffset() *int { if m == nil { return nil } @@ -1326,7 +1625,7 @@ func (m *MediaContainerWithDecisionMetadata) GetWriter() []Tag { return m.Writer } -func (m *MediaContainerWithDecisionMetadata) GetYear() *int64 { +func (m *MediaContainerWithDecisionMetadata) GetYear() *int { if m == nil { return nil } diff --git a/models/components/mediacontainerwithnestedmetadata.go b/models/components/mediacontainerwithnestedmetadata.go index 3479fa2..f162c8f 100644 --- a/models/components/mediacontainerwithnestedmetadata.go +++ b/models/components/mediacontainerwithnestedmetadata.go @@ -4,8 +4,22 @@ package components import ( "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/types" ) +type MediaContainerWithNestedMetadataGuids struct { + // The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + // + ID string `json:"id"` +} + +func (m *MediaContainerWithNestedMetadataGuids) GetID() string { + if m == nil { + return "" + } + return m.ID +} + // MetadataItem - Items in a library are referred to as "metadata items." These metadata items are distinct from "media items" which represent actual instances of media that can be consumed. Consider a TV library that has a single video file in it for a particular episode of a show. The library has a single media item, but it has three metadata items: one for the show, one for the season, and one for the episode. Consider a movie library that has two video files in it: the same movie, but two different resolutions. The library has a single metadata item for the movie, but that metadata item has two media items, one for each resolution. Additionally a "media item" will have one or more "media parts" where the the parts are intended to be watched together, such as a CD1 and CD2 parts of the same movie. // // Note that when a metadata item has multiple media items, those media items should be isomorphic. That is, a 4K version and 1080p version of a movie are different versions of the same movie. They have the same duration, same summary, same rating, etc. and they can generally be considered interchangeable. A theatrical release vs. director's cut vs. unrated version on the other hand would be separate metadata items. @@ -13,37 +27,41 @@ import ( // Metadata items can often live in a hierarchy with relationships between them. For example, the metadata item for an episodes is associated with a season metadata item which is associated with a show metadata item. A similar hierarchy exists with track, album, and artist and photos and photo album. The relationships may be expressed via relative terms and absolute terms. For example, "leaves" refer to metadata items which has associated media (there is no media for a season nor show). A show will have "children" in the form of seasons and a season will have "children" in the form of episodes and episodes have "parent" in the form of a season which has a "parent" in the form of a show. Similarly, a show has "grandchildren" in the form of episodse and an episode has a "grandparent" in the form of a show. type MetadataItem struct { // The title of the item (e.g. “300” or “The Simpsons”) - Title any `json:"title,omitempty"` + Title string `json:"title"` // The type of the video item, such as `movie`, `episode`, or `clip`. - Type any `json:"type,omitempty"` + Type string `json:"type"` // When present, contains the disc number for a track on multi-disc albums. - AbsoluteIndex *int64 `json:"absoluteIndex,omitempty"` + AbsoluteIndex *int `json:"absoluteIndex,omitempty"` // In units of seconds since the epoch, returns the time at which the item was added to the library. - AddedAt *int64 `json:"addedAt,omitempty"` + AddedAt int64 `json:"addedAt"` // When present, the URL for the background artwork for the item. - Art any `json:"art,omitempty"` + Art *string `json:"art,omitempty"` // Some rating systems separate reviewer ratings from audience ratings - AudienceRating *float64 `json:"audienceRating,omitempty"` + AudienceRating *float32 `json:"audienceRating,omitempty"` // A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). - AudienceRatingImage any `json:"audienceRatingImage,omitempty"` - Autotag []Tag `json:"Autotag,omitempty"` + AudienceRatingImage *string `json:"audienceRatingImage,omitempty"` + Autotag []Tag `json:"Autotag,omitempty"` // When present, the URL for a banner graphic for the item. - Banner any `json:"banner,omitempty"` + Banner *string `json:"banner,omitempty"` // When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). - ChapterSource any `json:"chapterSource,omitempty"` + ChapterSource *string `json:"chapterSource,omitempty"` + // The number of child items associated with this media item. + ChildCount *int `json:"childCount,omitempty"` // When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). - Composite any `json:"composite,omitempty"` + Composite *string `json:"composite,omitempty"` // If known, the content rating (e.g. MPAA) for an item. - ContentRating any `json:"contentRating,omitempty"` - Country []Tag `json:"Country,omitempty"` - Director []Tag `json:"Director,omitempty"` + ContentRating *string `json:"contentRating,omitempty"` + Country []Tag `json:"Country,omitempty"` + Director []Tag `json:"Director,omitempty"` // When present, the duration for the item, in units of milliseconds. - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` // Typically only seen in metadata at a library's top level Filter []Filter `json:"Filter,omitempty"` Genre []Tag `json:"Genre,omitempty"` // The `art` of the grandparent GrandparentArt *string `json:"grandparentArt,omitempty"` + // The GUID of the grandparent media item. + GrandparentGUID *string `json:"grandparentGuid,omitempty"` // The `hero` of the grandparent GrandparentHero *string `json:"grandparentHero,omitempty"` // The `key` of the grandparent @@ -56,27 +74,30 @@ type MetadataItem struct { GrandparentThumb *string `json:"grandparentThumb,omitempty"` // The `title` of the grandparent GrandparentTitle *string `json:"grandparentTitle,omitempty"` - GUID []Tag `json:"Guid,omitempty"` + // The globally unique identifier for the media item. + GUID *string `json:"guid,omitempty"` + Guids []MediaContainerWithNestedMetadataGuids `json:"Guid,omitempty"` // When present, the URL for a hero image for the item. - Hero any `json:"hero,omitempty"` + Hero *string `json:"hero,omitempty"` Image []Image `json:"Image,omitempty"` // When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. - Index *int64 `json:"index,omitempty"` + Index *int `json:"index,omitempty"` // The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. - Key any `json:"key,omitempty"` - // When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. + Key string `json:"key"` LastViewedAt *int64 `json:"lastViewedAt,omitempty"` // For shows and seasons, contains the number of total episodes. - LeafCount *int64 `json:"leafCount,omitempty"` + LeafCount *int `json:"leafCount,omitempty"` Media []Media `json:"Media,omitempty"` // When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. - OriginallyAvailableAt any `json:"originallyAvailableAt,omitempty"` + OriginallyAvailableAt *types.Date `json:"originallyAvailableAt,omitempty"` // When present, used to indicate an item's original title, e.g. a movie's foreign title. - OriginalTitle any `json:"originalTitle,omitempty"` + OriginalTitle *string `json:"originalTitle,omitempty"` + // The GUID of the parent media item. + ParentGUID *string `json:"parentGuid,omitempty"` // The `hero` of the parent ParentHero *string `json:"parentHero,omitempty"` // The `index` of the parent - ParentIndex *int64 `json:"parentIndex,omitempty"` + ParentIndex *int `json:"parentIndex,omitempty"` // The `key` of the parent ParentKey *string `json:"parentKey,omitempty"` // The `ratingKey` of the parent @@ -86,19 +107,19 @@ type MetadataItem struct { // The `title` of the parent ParentTitle *string `json:"parentTitle,omitempty"` // Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. - PrimaryExtraKey any `json:"primaryExtraKey,omitempty"` + PrimaryExtraKey *string `json:"primaryExtraKey,omitempty"` // Prompt to give the user for this directory (such as `Search Movies`) Prompt *string `json:"prompt,omitempty"` // When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. - Rating *float64 `json:"rating,omitempty"` + Rating *float32 `json:"rating,omitempty"` RatingArray []Tag `json:"Rating,omitempty"` // Number of ratings under this metadata - RatingCount *int64 `json:"ratingCount,omitempty"` + RatingCount *int `json:"ratingCount,omitempty"` // When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. - RatingImage any `json:"ratingImage,omitempty"` + RatingImage *string `json:"ratingImage,omitempty"` // This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. - RatingKey any `json:"ratingKey,omitempty"` - Role []Tag `json:"Role,omitempty"` + RatingKey *string `json:"ratingKey,omitempty"` + Role []Tag `json:"Role,omitempty"` // Indicates this is a search directory Search *bool `json:"search,omitempty"` // Used by old clients to provide nested menus allowing for primative (but structured) navigation. @@ -110,32 +131,32 @@ type MetadataItem struct { // Typically only seen in metadata at a library's top level Sort []Sort `json:"Sort,omitempty"` // When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). - Studio any `json:"studio,omitempty"` + Studio *string `json:"studio,omitempty"` // The subtype of the video item, such as `photo` when the video item is in a photo library - Subtype any `json:"subtype,omitempty"` + Subtype *string `json:"subtype,omitempty"` // When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). - Summary any `json:"summary,omitempty"` + Summary *string `json:"summary,omitempty"` // When present, a pithy one-liner about the item (usually only seen for movies). - Tagline any `json:"tagline,omitempty"` + Tagline *string `json:"tagline,omitempty"` // When present, the URL for theme music for the item (usually only for TV shows). - Theme any `json:"theme,omitempty"` + Theme *string `json:"theme,omitempty"` // When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. - Thumb any `json:"thumb,omitempty"` + Thumb *string `json:"thumb,omitempty"` // Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). - TitleSort any `json:"titleSort,omitempty"` + TitleSort *string `json:"titleSort,omitempty"` // In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). UpdatedAt *int64 `json:"updatedAt,omitempty"` // When the user has rated an item, this contains the user rating - UserRating *float64 `json:"userRating,omitempty"` + UserRating *float32 `json:"userRating,omitempty"` // When a users has completed watched or listened to an item, this attribute contains the number of consumptions. - ViewCount *int64 `json:"viewCount,omitempty"` + ViewCount *int `json:"viewCount,omitempty"` // For shows and seasons, contains the number of viewed episodes. - ViewedLeafCount *int64 `json:"viewedLeafCount,omitempty"` + ViewedLeafCount *int `json:"viewedLeafCount,omitempty"` // When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. - ViewOffset *int64 `json:"viewOffset,omitempty"` - Writer []Tag `json:"Writer,omitempty"` + ViewOffset *int `json:"viewOffset,omitempty"` + Writer []Tag `json:"Writer,omitempty"` // When present, the year associated with the item's release (e.g. release year for a movie). - Year *int64 `json:"year,omitempty"` + Year *int `json:"year,omitempty"` MetadataItem []Items `json:"MetadataItem,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -145,55 +166,55 @@ func (m MetadataItem) MarshalJSON() ([]byte, error) { } func (m *MetadataItem) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"title", "type", "addedAt", "key"}); err != nil { return err } return nil } -func (m *MetadataItem) GetTitle() any { +func (m *MetadataItem) GetTitle() string { if m == nil { - return nil + return "" } return m.Title } -func (m *MetadataItem) GetType() any { +func (m *MetadataItem) GetType() string { if m == nil { - return nil + return "" } return m.Type } -func (m *MetadataItem) GetAbsoluteIndex() *int64 { +func (m *MetadataItem) GetAbsoluteIndex() *int { if m == nil { return nil } return m.AbsoluteIndex } -func (m *MetadataItem) GetAddedAt() *int64 { +func (m *MetadataItem) GetAddedAt() int64 { if m == nil { - return nil + return 0 } return m.AddedAt } -func (m *MetadataItem) GetArt() any { +func (m *MetadataItem) GetArt() *string { if m == nil { return nil } return m.Art } -func (m *MetadataItem) GetAudienceRating() *float64 { +func (m *MetadataItem) GetAudienceRating() *float32 { if m == nil { return nil } return m.AudienceRating } -func (m *MetadataItem) GetAudienceRatingImage() any { +func (m *MetadataItem) GetAudienceRatingImage() *string { if m == nil { return nil } @@ -207,28 +228,35 @@ func (m *MetadataItem) GetAutotag() []Tag { return m.Autotag } -func (m *MetadataItem) GetBanner() any { +func (m *MetadataItem) GetBanner() *string { if m == nil { return nil } return m.Banner } -func (m *MetadataItem) GetChapterSource() any { +func (m *MetadataItem) GetChapterSource() *string { if m == nil { return nil } return m.ChapterSource } -func (m *MetadataItem) GetComposite() any { +func (m *MetadataItem) GetChildCount() *int { + if m == nil { + return nil + } + return m.ChildCount +} + +func (m *MetadataItem) GetComposite() *string { if m == nil { return nil } return m.Composite } -func (m *MetadataItem) GetContentRating() any { +func (m *MetadataItem) GetContentRating() *string { if m == nil { return nil } @@ -249,7 +277,7 @@ func (m *MetadataItem) GetDirector() []Tag { return m.Director } -func (m *MetadataItem) GetDuration() *int64 { +func (m *MetadataItem) GetDuration() *int { if m == nil { return nil } @@ -277,6 +305,13 @@ func (m *MetadataItem) GetGrandparentArt() *string { return m.GrandparentArt } +func (m *MetadataItem) GetGrandparentGUID() *string { + if m == nil { + return nil + } + return m.GrandparentGUID +} + func (m *MetadataItem) GetGrandparentHero() *string { if m == nil { return nil @@ -319,14 +354,21 @@ func (m *MetadataItem) GetGrandparentTitle() *string { return m.GrandparentTitle } -func (m *MetadataItem) GetGUID() []Tag { +func (m *MetadataItem) GetGUID() *string { if m == nil { return nil } return m.GUID } -func (m *MetadataItem) GetHero() any { +func (m *MetadataItem) GetGuids() []MediaContainerWithNestedMetadataGuids { + if m == nil { + return nil + } + return m.Guids +} + +func (m *MetadataItem) GetHero() *string { if m == nil { return nil } @@ -340,16 +382,16 @@ func (m *MetadataItem) GetImage() []Image { return m.Image } -func (m *MetadataItem) GetIndex() *int64 { +func (m *MetadataItem) GetIndex() *int { if m == nil { return nil } return m.Index } -func (m *MetadataItem) GetKey() any { +func (m *MetadataItem) GetKey() string { if m == nil { - return nil + return "" } return m.Key } @@ -361,7 +403,7 @@ func (m *MetadataItem) GetLastViewedAt() *int64 { return m.LastViewedAt } -func (m *MetadataItem) GetLeafCount() *int64 { +func (m *MetadataItem) GetLeafCount() *int { if m == nil { return nil } @@ -375,20 +417,27 @@ func (m *MetadataItem) GetMedia() []Media { return m.Media } -func (m *MetadataItem) GetOriginallyAvailableAt() any { +func (m *MetadataItem) GetOriginallyAvailableAt() *types.Date { if m == nil { return nil } return m.OriginallyAvailableAt } -func (m *MetadataItem) GetOriginalTitle() any { +func (m *MetadataItem) GetOriginalTitle() *string { if m == nil { return nil } return m.OriginalTitle } +func (m *MetadataItem) GetParentGUID() *string { + if m == nil { + return nil + } + return m.ParentGUID +} + func (m *MetadataItem) GetParentHero() *string { if m == nil { return nil @@ -396,7 +445,7 @@ func (m *MetadataItem) GetParentHero() *string { return m.ParentHero } -func (m *MetadataItem) GetParentIndex() *int64 { +func (m *MetadataItem) GetParentIndex() *int { if m == nil { return nil } @@ -431,7 +480,7 @@ func (m *MetadataItem) GetParentTitle() *string { return m.ParentTitle } -func (m *MetadataItem) GetPrimaryExtraKey() any { +func (m *MetadataItem) GetPrimaryExtraKey() *string { if m == nil { return nil } @@ -445,7 +494,7 @@ func (m *MetadataItem) GetPrompt() *string { return m.Prompt } -func (m *MetadataItem) GetRating() *float64 { +func (m *MetadataItem) GetRating() *float32 { if m == nil { return nil } @@ -459,21 +508,21 @@ func (m *MetadataItem) GetRatingArray() []Tag { return m.RatingArray } -func (m *MetadataItem) GetRatingCount() *int64 { +func (m *MetadataItem) GetRatingCount() *int { if m == nil { return nil } return m.RatingCount } -func (m *MetadataItem) GetRatingImage() any { +func (m *MetadataItem) GetRatingImage() *string { if m == nil { return nil } return m.RatingImage } -func (m *MetadataItem) GetRatingKey() any { +func (m *MetadataItem) GetRatingKey() *string { if m == nil { return nil } @@ -522,49 +571,49 @@ func (m *MetadataItem) GetSort() []Sort { return m.Sort } -func (m *MetadataItem) GetStudio() any { +func (m *MetadataItem) GetStudio() *string { if m == nil { return nil } return m.Studio } -func (m *MetadataItem) GetSubtype() any { +func (m *MetadataItem) GetSubtype() *string { if m == nil { return nil } return m.Subtype } -func (m *MetadataItem) GetSummary() any { +func (m *MetadataItem) GetSummary() *string { if m == nil { return nil } return m.Summary } -func (m *MetadataItem) GetTagline() any { +func (m *MetadataItem) GetTagline() *string { if m == nil { return nil } return m.Tagline } -func (m *MetadataItem) GetTheme() any { +func (m *MetadataItem) GetTheme() *string { if m == nil { return nil } return m.Theme } -func (m *MetadataItem) GetThumb() any { +func (m *MetadataItem) GetThumb() *string { if m == nil { return nil } return m.Thumb } -func (m *MetadataItem) GetTitleSort() any { +func (m *MetadataItem) GetTitleSort() *string { if m == nil { return nil } @@ -578,28 +627,28 @@ func (m *MetadataItem) GetUpdatedAt() *int64 { return m.UpdatedAt } -func (m *MetadataItem) GetUserRating() *float64 { +func (m *MetadataItem) GetUserRating() *float32 { if m == nil { return nil } return m.UserRating } -func (m *MetadataItem) GetViewCount() *int64 { +func (m *MetadataItem) GetViewCount() *int { if m == nil { return nil } return m.ViewCount } -func (m *MetadataItem) GetViewedLeafCount() *int64 { +func (m *MetadataItem) GetViewedLeafCount() *int { if m == nil { return nil } return m.ViewedLeafCount } -func (m *MetadataItem) GetViewOffset() *int64 { +func (m *MetadataItem) GetViewOffset() *int { if m == nil { return nil } @@ -613,7 +662,7 @@ func (m *MetadataItem) GetWriter() []Tag { return m.Writer } -func (m *MetadataItem) GetYear() *int64 { +func (m *MetadataItem) GetYear() *int { if m == nil { return nil } diff --git a/models/components/mediacontainerwithplaylistmetadata.go b/models/components/mediacontainerwithplaylistmetadata.go index 061ad9a..cf3f533 100644 --- a/models/components/mediacontainerwithplaylistmetadata.go +++ b/models/components/mediacontainerwithplaylistmetadata.go @@ -6,6 +6,7 @@ import ( "encoding/json" "fmt" "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/types" ) // PlaylistType - The type of the playlist. @@ -38,6 +39,19 @@ func (e *PlaylistType) UnmarshalJSON(data []byte) error { } } +type MediaContainerWithPlaylistMetadataGuids struct { + // The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + // + ID string `json:"id"` +} + +func (m *MediaContainerWithPlaylistMetadataGuids) GetID() string { + if m == nil { + return "" + } + return m.ID +} + // MediaContainerWithPlaylistMetadataMetadata - Items in a library are referred to as "metadata items." These metadata items are distinct from "media items" which represent actual instances of media that can be consumed. Consider a TV library that has a single video file in it for a particular episode of a show. The library has a single media item, but it has three metadata items: one for the show, one for the season, and one for the episode. Consider a movie library that has two video files in it: the same movie, but two different resolutions. The library has a single metadata item for the movie, but that metadata item has two media items, one for each resolution. Additionally a "media item" will have one or more "media parts" where the the parts are intended to be watched together, such as a CD1 and CD2 parts of the same movie. // // Note that when a metadata item has multiple media items, those media items should be isomorphic. That is, a 4K version and 1080p version of a movie are different versions of the same movie. They have the same duration, same summary, same rating, etc. and they can generally be considered interchangeable. A theatrical release vs. director's cut vs. unrated version on the other hand would be separate metadata items. @@ -47,13 +61,13 @@ type MediaContainerWithPlaylistMetadataMetadata struct { // If we return this as true then this playlist cannot be altered or deleted directly by the client. ReadOnly *bool `json:"readOnly,omitempty"` // When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). - Composite any `json:"composite,omitempty"` + Composite *string `json:"composite,omitempty"` // When present, the duration for the item, in units of milliseconds. - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` // The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. - Key any `json:"key,omitempty"` + Key string `json:"key"` // For shows and seasons, contains the number of total episodes. - LeafCount *int64 `json:"leafCount,omitempty"` + LeafCount *int `json:"leafCount,omitempty"` // The type of the playlist. PlaylistType *PlaylistType `json:"playlistType,omitempty"` // Whether or not the playlist is smart. @@ -61,33 +75,37 @@ type MediaContainerWithPlaylistMetadataMetadata struct { // If this is a special playlist, this returns its type (e.g. favorites). SpecialPlaylistType *string `json:"specialPlaylistType,omitempty"` // The title of the item (e.g. “300” or “The Simpsons”) - Title any `json:"title,omitempty"` + Title string `json:"title"` // The type of the video item, such as `movie`, `episode`, or `clip`. - Type any `json:"type,omitempty"` + Type string `json:"type"` // When present, contains the disc number for a track on multi-disc albums. - AbsoluteIndex *int64 `json:"absoluteIndex,omitempty"` + AbsoluteIndex *int `json:"absoluteIndex,omitempty"` // In units of seconds since the epoch, returns the time at which the item was added to the library. - AddedAt *int64 `json:"addedAt,omitempty"` + AddedAt int64 `json:"addedAt"` // When present, the URL for the background artwork for the item. - Art any `json:"art,omitempty"` + Art *string `json:"art,omitempty"` // Some rating systems separate reviewer ratings from audience ratings - AudienceRating *float64 `json:"audienceRating,omitempty"` + AudienceRating *float32 `json:"audienceRating,omitempty"` // A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). - AudienceRatingImage any `json:"audienceRatingImage,omitempty"` - Autotag []Tag `json:"Autotag,omitempty"` + AudienceRatingImage *string `json:"audienceRatingImage,omitempty"` + Autotag []Tag `json:"Autotag,omitempty"` // When present, the URL for a banner graphic for the item. - Banner any `json:"banner,omitempty"` + Banner *string `json:"banner,omitempty"` // When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). - ChapterSource any `json:"chapterSource,omitempty"` + ChapterSource *string `json:"chapterSource,omitempty"` + // The number of child items associated with this media item. + ChildCount *int `json:"childCount,omitempty"` // If known, the content rating (e.g. MPAA) for an item. - ContentRating any `json:"contentRating,omitempty"` - Country []Tag `json:"Country,omitempty"` - Director []Tag `json:"Director,omitempty"` + ContentRating *string `json:"contentRating,omitempty"` + Country []Tag `json:"Country,omitempty"` + Director []Tag `json:"Director,omitempty"` // Typically only seen in metadata at a library's top level Filter []Filter `json:"Filter,omitempty"` Genre []Tag `json:"Genre,omitempty"` // The `art` of the grandparent GrandparentArt *string `json:"grandparentArt,omitempty"` + // The GUID of the grandparent media item. + GrandparentGUID *string `json:"grandparentGuid,omitempty"` // The `hero` of the grandparent GrandparentHero *string `json:"grandparentHero,omitempty"` // The `key` of the grandparent @@ -100,23 +118,26 @@ type MediaContainerWithPlaylistMetadataMetadata struct { GrandparentThumb *string `json:"grandparentThumb,omitempty"` // The `title` of the grandparent GrandparentTitle *string `json:"grandparentTitle,omitempty"` - GUID []Tag `json:"Guid,omitempty"` + // The globally unique identifier for the media item. + GUID *string `json:"guid,omitempty"` + Guids []MediaContainerWithPlaylistMetadataGuids `json:"Guid,omitempty"` // When present, the URL for a hero image for the item. - Hero any `json:"hero,omitempty"` + Hero *string `json:"hero,omitempty"` Image []Image `json:"Image,omitempty"` // When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. - Index *int64 `json:"index,omitempty"` - // When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. + Index *int `json:"index,omitempty"` LastViewedAt *int64 `json:"lastViewedAt,omitempty"` Media []Media `json:"Media,omitempty"` // When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. - OriginallyAvailableAt any `json:"originallyAvailableAt,omitempty"` + OriginallyAvailableAt *types.Date `json:"originallyAvailableAt,omitempty"` // When present, used to indicate an item's original title, e.g. a movie's foreign title. - OriginalTitle any `json:"originalTitle,omitempty"` + OriginalTitle *string `json:"originalTitle,omitempty"` + // The GUID of the parent media item. + ParentGUID *string `json:"parentGuid,omitempty"` // The `hero` of the parent ParentHero *string `json:"parentHero,omitempty"` // The `index` of the parent - ParentIndex *int64 `json:"parentIndex,omitempty"` + ParentIndex *int `json:"parentIndex,omitempty"` // The `key` of the parent ParentKey *string `json:"parentKey,omitempty"` // The `ratingKey` of the parent @@ -126,19 +147,19 @@ type MediaContainerWithPlaylistMetadataMetadata struct { // The `title` of the parent ParentTitle *string `json:"parentTitle,omitempty"` // Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. - PrimaryExtraKey any `json:"primaryExtraKey,omitempty"` + PrimaryExtraKey *string `json:"primaryExtraKey,omitempty"` // Prompt to give the user for this directory (such as `Search Movies`) Prompt *string `json:"prompt,omitempty"` // When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. - Rating *float64 `json:"rating,omitempty"` + Rating *float32 `json:"rating,omitempty"` RatingArray []Tag `json:"Rating,omitempty"` // Number of ratings under this metadata - RatingCount *int64 `json:"ratingCount,omitempty"` + RatingCount *int `json:"ratingCount,omitempty"` // When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. - RatingImage any `json:"ratingImage,omitempty"` + RatingImage *string `json:"ratingImage,omitempty"` // This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. - RatingKey any `json:"ratingKey,omitempty"` - Role []Tag `json:"Role,omitempty"` + RatingKey *string `json:"ratingKey,omitempty"` + Role []Tag `json:"Role,omitempty"` // Indicates this is a search directory Search *bool `json:"search,omitempty"` // Used by old clients to provide nested menus allowing for primative (but structured) navigation. @@ -150,32 +171,32 @@ type MediaContainerWithPlaylistMetadataMetadata struct { // Typically only seen in metadata at a library's top level Sort []Sort `json:"Sort,omitempty"` // When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). - Studio any `json:"studio,omitempty"` + Studio *string `json:"studio,omitempty"` // The subtype of the video item, such as `photo` when the video item is in a photo library - Subtype any `json:"subtype,omitempty"` + Subtype *string `json:"subtype,omitempty"` // When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). - Summary any `json:"summary,omitempty"` + Summary *string `json:"summary,omitempty"` // When present, a pithy one-liner about the item (usually only seen for movies). - Tagline any `json:"tagline,omitempty"` + Tagline *string `json:"tagline,omitempty"` // When present, the URL for theme music for the item (usually only for TV shows). - Theme any `json:"theme,omitempty"` + Theme *string `json:"theme,omitempty"` // When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. - Thumb any `json:"thumb,omitempty"` + Thumb *string `json:"thumb,omitempty"` // Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). - TitleSort any `json:"titleSort,omitempty"` + TitleSort *string `json:"titleSort,omitempty"` // In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). UpdatedAt *int64 `json:"updatedAt,omitempty"` // When the user has rated an item, this contains the user rating - UserRating *float64 `json:"userRating,omitempty"` + UserRating *float32 `json:"userRating,omitempty"` // When a users has completed watched or listened to an item, this attribute contains the number of consumptions. - ViewCount *int64 `json:"viewCount,omitempty"` + ViewCount *int `json:"viewCount,omitempty"` // For shows and seasons, contains the number of viewed episodes. - ViewedLeafCount *int64 `json:"viewedLeafCount,omitempty"` + ViewedLeafCount *int `json:"viewedLeafCount,omitempty"` // When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. - ViewOffset *int64 `json:"viewOffset,omitempty"` - Writer []Tag `json:"Writer,omitempty"` + ViewOffset *int `json:"viewOffset,omitempty"` + Writer []Tag `json:"Writer,omitempty"` // When present, the year associated with the item's release (e.g. release year for a movie). - Year *int64 `json:"year,omitempty"` + Year *int `json:"year,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -184,7 +205,7 @@ func (m MediaContainerWithPlaylistMetadataMetadata) MarshalJSON() ([]byte, error } func (m *MediaContainerWithPlaylistMetadataMetadata) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"key", "title", "type", "addedAt"}); err != nil { return err } return nil @@ -197,28 +218,28 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetReadOnly() *bool { return m.ReadOnly } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetComposite() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetComposite() *string { if m == nil { return nil } return m.Composite } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetDuration() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetDuration() *int { if m == nil { return nil } return m.Duration } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetKey() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetKey() string { if m == nil { - return nil + return "" } return m.Key } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetLeafCount() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetLeafCount() *int { if m == nil { return nil } @@ -246,49 +267,49 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetSpecialPlaylistType() *s return m.SpecialPlaylistType } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetTitle() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetTitle() string { if m == nil { - return nil + return "" } return m.Title } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetType() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetType() string { if m == nil { - return nil + return "" } return m.Type } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetAbsoluteIndex() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetAbsoluteIndex() *int { if m == nil { return nil } return m.AbsoluteIndex } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetAddedAt() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetAddedAt() int64 { if m == nil { - return nil + return 0 } return m.AddedAt } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetArt() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetArt() *string { if m == nil { return nil } return m.Art } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetAudienceRating() *float64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetAudienceRating() *float32 { if m == nil { return nil } return m.AudienceRating } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetAudienceRatingImage() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetAudienceRatingImage() *string { if m == nil { return nil } @@ -302,21 +323,28 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetAutotag() []Tag { return m.Autotag } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetBanner() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetBanner() *string { if m == nil { return nil } return m.Banner } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetChapterSource() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetChapterSource() *string { if m == nil { return nil } return m.ChapterSource } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetContentRating() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetChildCount() *int { + if m == nil { + return nil + } + return m.ChildCount +} + +func (m *MediaContainerWithPlaylistMetadataMetadata) GetContentRating() *string { if m == nil { return nil } @@ -358,6 +386,13 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetGrandparentArt() *string return m.GrandparentArt } +func (m *MediaContainerWithPlaylistMetadataMetadata) GetGrandparentGUID() *string { + if m == nil { + return nil + } + return m.GrandparentGUID +} + func (m *MediaContainerWithPlaylistMetadataMetadata) GetGrandparentHero() *string { if m == nil { return nil @@ -400,14 +435,21 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetGrandparentTitle() *stri return m.GrandparentTitle } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetGUID() []Tag { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetGUID() *string { if m == nil { return nil } return m.GUID } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetHero() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetGuids() []MediaContainerWithPlaylistMetadataGuids { + if m == nil { + return nil + } + return m.Guids +} + +func (m *MediaContainerWithPlaylistMetadataMetadata) GetHero() *string { if m == nil { return nil } @@ -421,7 +463,7 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetImage() []Image { return m.Image } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetIndex() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetIndex() *int { if m == nil { return nil } @@ -442,20 +484,27 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetMedia() []Media { return m.Media } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetOriginallyAvailableAt() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetOriginallyAvailableAt() *types.Date { if m == nil { return nil } return m.OriginallyAvailableAt } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetOriginalTitle() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetOriginalTitle() *string { if m == nil { return nil } return m.OriginalTitle } +func (m *MediaContainerWithPlaylistMetadataMetadata) GetParentGUID() *string { + if m == nil { + return nil + } + return m.ParentGUID +} + func (m *MediaContainerWithPlaylistMetadataMetadata) GetParentHero() *string { if m == nil { return nil @@ -463,7 +512,7 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetParentHero() *string { return m.ParentHero } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetParentIndex() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetParentIndex() *int { if m == nil { return nil } @@ -498,7 +547,7 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetParentTitle() *string { return m.ParentTitle } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetPrimaryExtraKey() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetPrimaryExtraKey() *string { if m == nil { return nil } @@ -512,7 +561,7 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetPrompt() *string { return m.Prompt } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetRating() *float64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetRating() *float32 { if m == nil { return nil } @@ -526,21 +575,21 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetRatingArray() []Tag { return m.RatingArray } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetRatingCount() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetRatingCount() *int { if m == nil { return nil } return m.RatingCount } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetRatingImage() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetRatingImage() *string { if m == nil { return nil } return m.RatingImage } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetRatingKey() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetRatingKey() *string { if m == nil { return nil } @@ -589,49 +638,49 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetSort() []Sort { return m.Sort } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetStudio() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetStudio() *string { if m == nil { return nil } return m.Studio } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetSubtype() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetSubtype() *string { if m == nil { return nil } return m.Subtype } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetSummary() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetSummary() *string { if m == nil { return nil } return m.Summary } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetTagline() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetTagline() *string { if m == nil { return nil } return m.Tagline } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetTheme() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetTheme() *string { if m == nil { return nil } return m.Theme } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetThumb() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetThumb() *string { if m == nil { return nil } return m.Thumb } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetTitleSort() any { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetTitleSort() *string { if m == nil { return nil } @@ -645,28 +694,28 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetUpdatedAt() *int64 { return m.UpdatedAt } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetUserRating() *float64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetUserRating() *float32 { if m == nil { return nil } return m.UserRating } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetViewCount() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetViewCount() *int { if m == nil { return nil } return m.ViewCount } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetViewedLeafCount() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetViewedLeafCount() *int { if m == nil { return nil } return m.ViewedLeafCount } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetViewOffset() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetViewOffset() *int { if m == nil { return nil } @@ -680,7 +729,7 @@ func (m *MediaContainerWithPlaylistMetadataMetadata) GetWriter() []Tag { return m.Writer } -func (m *MediaContainerWithPlaylistMetadataMetadata) GetYear() *int64 { +func (m *MediaContainerWithPlaylistMetadataMetadata) GetYear() *int { if m == nil { return nil } diff --git a/models/components/mediaquery.go b/models/components/mediaquery.go index eac5bf2..fd0d085 100644 --- a/models/components/mediaquery.go +++ b/models/components/mediaquery.go @@ -2,5 +2,66 @@ package components +// MediaQuery - A querystring-based filtering language used to select subsets of media. When provided as an object, properties are serialized as a querystring using form style with explode. +// +// Only the defined properties below are allowed. The object serializes to a querystring format like: `type=4&sourceType=2&sort=duration:desc,index` type MediaQuery struct { + // The type of media to retrieve or filter by. + // + // 1 = movie + // 2 = show + // 3 = season + // 4 = episode + // 5 = artist + // 6 = album + // 7 = track + // 8 = photo_album + // 9 = photo + // + // E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries + // + Type *MediaType `queryParam:"name=type"` + // Change the default level to which fields refer (used with type for hierarchical queries) + SourceType *int64 `queryParam:"name=sourceType"` + // Field(s) to sort by, with optional modifiers. Use comma to separate multiple fields, and :desc or :nullsLast for modifiers (e.g., "duration:desc,index") + Sort *string `queryParam:"name=sort"` + // Field to group results by (similar to SQL GROUP BY) + Group *string `queryParam:"name=group"` + // Maximum number of results to return + Limit *int64 `queryParam:"name=limit"` +} + +func (m *MediaQuery) GetType() *MediaType { + if m == nil { + return nil + } + return m.Type +} + +func (m *MediaQuery) GetSourceType() *int64 { + if m == nil { + return nil + } + return m.SourceType +} + +func (m *MediaQuery) GetSort() *string { + if m == nil { + return nil + } + return m.Sort +} + +func (m *MediaQuery) GetGroup() *string { + if m == nil { + return nil + } + return m.Group +} + +func (m *MediaQuery) GetLimit() *int64 { + if m == nil { + return nil + } + return m.Limit } diff --git a/models/components/mediatype.go b/models/components/mediatype.go new file mode 100644 index 0000000..2a55834 --- /dev/null +++ b/models/components/mediatype.go @@ -0,0 +1,68 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +import ( + "encoding/json" + "fmt" +) + +// MediaType - The type of media to retrieve or filter by. +// +// 1 = movie +// 2 = show +// 3 = season +// 4 = episode +// 5 = artist +// 6 = album +// 7 = track +// 8 = photo_album +// 9 = photo +// +// E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries +type MediaType int64 + +const ( + MediaTypeMovie MediaType = 1 + MediaTypeTvShow MediaType = 2 + MediaTypeSeason MediaType = 3 + MediaTypeEpisode MediaType = 4 + MediaTypeArtist MediaType = 5 + MediaTypeAlbum MediaType = 6 + MediaTypeTrack MediaType = 7 + MediaTypePhotoAlbum MediaType = 8 + MediaTypePhoto MediaType = 9 +) + +func (e MediaType) ToPointer() *MediaType { + return &e +} +func (e *MediaType) UnmarshalJSON(data []byte) error { + var v int64 + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 1: + fallthrough + case 2: + fallthrough + case 3: + fallthrough + case 4: + fallthrough + case 5: + fallthrough + case 6: + fallthrough + case 7: + fallthrough + case 8: + fallthrough + case 9: + *e = MediaType(v) + return nil + default: + return fmt.Errorf("invalid value for MediaType: %v", v) + } +} diff --git a/models/components/mediatypestring.go b/models/components/mediatypestring.go new file mode 100644 index 0000000..d71fde1 --- /dev/null +++ b/models/components/mediatypestring.go @@ -0,0 +1,59 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +import ( + "encoding/json" + "fmt" +) + +// MediaTypeString - The type of media content in the Plex library. This can represent videos, music, or photos. +type MediaTypeString string + +const ( + MediaTypeStringMovie MediaTypeString = "movie" + MediaTypeStringTvShow MediaTypeString = "show" + MediaTypeStringSeason MediaTypeString = "season" + MediaTypeStringEpisode MediaTypeString = "episode" + MediaTypeStringArtist MediaTypeString = "artist" + MediaTypeStringAlbum MediaTypeString = "album" + MediaTypeStringTrack MediaTypeString = "track" + MediaTypeStringPhotoAlbum MediaTypeString = "photoalbum" + MediaTypeStringPhoto MediaTypeString = "photo" + MediaTypeStringCollection MediaTypeString = "collection" +) + +func (e MediaTypeString) ToPointer() *MediaTypeString { + return &e +} +func (e *MediaTypeString) UnmarshalJSON(data []byte) error { + var v string + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case "movie": + fallthrough + case "show": + fallthrough + case "season": + fallthrough + case "episode": + fallthrough + case "artist": + fallthrough + case "album": + fallthrough + case "track": + fallthrough + case "photoalbum": + fallthrough + case "photo": + fallthrough + case "collection": + *e = MediaTypeString(v) + return nil + default: + return fmt.Errorf("invalid value for MediaTypeString: %v", v) + } +} diff --git a/models/components/metadata.go b/models/components/metadata.go index 287eb52..0949e79 100644 --- a/models/components/metadata.go +++ b/models/components/metadata.go @@ -4,8 +4,22 @@ package components import ( "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/types" ) +type Guids struct { + // The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + // + ID string `json:"id"` +} + +func (g *Guids) GetID() string { + if g == nil { + return "" + } + return g.ID +} + // Metadata - Items in a library are referred to as "metadata items." These metadata items are distinct from "media items" which represent actual instances of media that can be consumed. Consider a TV library that has a single video file in it for a particular episode of a show. The library has a single media item, but it has three metadata items: one for the show, one for the season, and one for the episode. Consider a movie library that has two video files in it: the same movie, but two different resolutions. The library has a single metadata item for the movie, but that metadata item has two media items, one for each resolution. Additionally a "media item" will have one or more "media parts" where the the parts are intended to be watched together, such as a CD1 and CD2 parts of the same movie. // // Note that when a metadata item has multiple media items, those media items should be isomorphic. That is, a 4K version and 1080p version of a movie are different versions of the same movie. They have the same duration, same summary, same rating, etc. and they can generally be considered interchangeable. A theatrical release vs. director's cut vs. unrated version on the other hand would be separate metadata items. @@ -13,37 +27,41 @@ import ( // Metadata items can often live in a hierarchy with relationships between them. For example, the metadata item for an episodes is associated with a season metadata item which is associated with a show metadata item. A similar hierarchy exists with track, album, and artist and photos and photo album. The relationships may be expressed via relative terms and absolute terms. For example, "leaves" refer to metadata items which has associated media (there is no media for a season nor show). A show will have "children" in the form of seasons and a season will have "children" in the form of episodes and episodes have "parent" in the form of a season which has a "parent" in the form of a show. Similarly, a show has "grandchildren" in the form of episodse and an episode has a "grandparent" in the form of a show. type Metadata struct { // The title of the item (e.g. “300” or “The Simpsons”) - Title any `json:"title,omitempty"` + Title string `json:"title"` // The type of the video item, such as `movie`, `episode`, or `clip`. - Type any `json:"type,omitempty"` + Type string `json:"type"` // When present, contains the disc number for a track on multi-disc albums. - AbsoluteIndex *int64 `json:"absoluteIndex,omitempty"` + AbsoluteIndex *int `json:"absoluteIndex,omitempty"` // In units of seconds since the epoch, returns the time at which the item was added to the library. - AddedAt *int64 `json:"addedAt,omitempty"` + AddedAt int64 `json:"addedAt"` // When present, the URL for the background artwork for the item. - Art any `json:"art,omitempty"` + Art *string `json:"art,omitempty"` // Some rating systems separate reviewer ratings from audience ratings - AudienceRating *float64 `json:"audienceRating,omitempty"` + AudienceRating *float32 `json:"audienceRating,omitempty"` // A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). - AudienceRatingImage any `json:"audienceRatingImage,omitempty"` - Autotag []Tag `json:"Autotag,omitempty"` + AudienceRatingImage *string `json:"audienceRatingImage,omitempty"` + Autotag []Tag `json:"Autotag,omitempty"` // When present, the URL for a banner graphic for the item. - Banner any `json:"banner,omitempty"` + Banner *string `json:"banner,omitempty"` // When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). - ChapterSource any `json:"chapterSource,omitempty"` + ChapterSource *string `json:"chapterSource,omitempty"` + // The number of child items associated with this media item. + ChildCount *int `json:"childCount,omitempty"` // When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). - Composite any `json:"composite,omitempty"` + Composite *string `json:"composite,omitempty"` // If known, the content rating (e.g. MPAA) for an item. - ContentRating any `json:"contentRating,omitempty"` - Country []Tag `json:"Country,omitempty"` - Director []Tag `json:"Director,omitempty"` + ContentRating *string `json:"contentRating,omitempty"` + Country []Tag `json:"Country,omitempty"` + Director []Tag `json:"Director,omitempty"` // When present, the duration for the item, in units of milliseconds. - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` // Typically only seen in metadata at a library's top level Filter []Filter `json:"Filter,omitempty"` Genre []Tag `json:"Genre,omitempty"` // The `art` of the grandparent GrandparentArt *string `json:"grandparentArt,omitempty"` + // The GUID of the grandparent media item. + GrandparentGUID *string `json:"grandparentGuid,omitempty"` // The `hero` of the grandparent GrandparentHero *string `json:"grandparentHero,omitempty"` // The `key` of the grandparent @@ -56,27 +74,30 @@ type Metadata struct { GrandparentThumb *string `json:"grandparentThumb,omitempty"` // The `title` of the grandparent GrandparentTitle *string `json:"grandparentTitle,omitempty"` - GUID []Tag `json:"Guid,omitempty"` + // The globally unique identifier for the media item. + GUID *string `json:"guid,omitempty"` + Guids []Guids `json:"Guid,omitempty"` // When present, the URL for a hero image for the item. - Hero any `json:"hero,omitempty"` + Hero *string `json:"hero,omitempty"` Image []Image `json:"Image,omitempty"` // When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. - Index *int64 `json:"index,omitempty"` + Index *int `json:"index,omitempty"` // The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. - Key any `json:"key,omitempty"` - // When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. + Key string `json:"key"` LastViewedAt *int64 `json:"lastViewedAt,omitempty"` // For shows and seasons, contains the number of total episodes. - LeafCount *int64 `json:"leafCount,omitempty"` + LeafCount *int `json:"leafCount,omitempty"` Media []Media `json:"Media,omitempty"` // When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. - OriginallyAvailableAt any `json:"originallyAvailableAt,omitempty"` + OriginallyAvailableAt *types.Date `json:"originallyAvailableAt,omitempty"` // When present, used to indicate an item's original title, e.g. a movie's foreign title. - OriginalTitle any `json:"originalTitle,omitempty"` + OriginalTitle *string `json:"originalTitle,omitempty"` + // The GUID of the parent media item. + ParentGUID *string `json:"parentGuid,omitempty"` // The `hero` of the parent ParentHero *string `json:"parentHero,omitempty"` // The `index` of the parent - ParentIndex *int64 `json:"parentIndex,omitempty"` + ParentIndex *int `json:"parentIndex,omitempty"` // The `key` of the parent ParentKey *string `json:"parentKey,omitempty"` // The `ratingKey` of the parent @@ -86,19 +107,19 @@ type Metadata struct { // The `title` of the parent ParentTitle *string `json:"parentTitle,omitempty"` // Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. - PrimaryExtraKey any `json:"primaryExtraKey,omitempty"` + PrimaryExtraKey *string `json:"primaryExtraKey,omitempty"` // Prompt to give the user for this directory (such as `Search Movies`) Prompt *string `json:"prompt,omitempty"` // When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. - Rating *float64 `json:"rating,omitempty"` + Rating *float32 `json:"rating,omitempty"` RatingArray []Tag `json:"Rating,omitempty"` // Number of ratings under this metadata - RatingCount *int64 `json:"ratingCount,omitempty"` + RatingCount *int `json:"ratingCount,omitempty"` // When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. - RatingImage any `json:"ratingImage,omitempty"` + RatingImage *string `json:"ratingImage,omitempty"` // This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. - RatingKey any `json:"ratingKey,omitempty"` - Role []Tag `json:"Role,omitempty"` + RatingKey *string `json:"ratingKey,omitempty"` + Role []Tag `json:"Role,omitempty"` // Indicates this is a search directory Search *bool `json:"search,omitempty"` // Used by old clients to provide nested menus allowing for primative (but structured) navigation. @@ -110,32 +131,32 @@ type Metadata struct { // Typically only seen in metadata at a library's top level Sort []Sort `json:"Sort,omitempty"` // When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). - Studio any `json:"studio,omitempty"` + Studio *string `json:"studio,omitempty"` // The subtype of the video item, such as `photo` when the video item is in a photo library - Subtype any `json:"subtype,omitempty"` + Subtype *string `json:"subtype,omitempty"` // When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). - Summary any `json:"summary,omitempty"` + Summary *string `json:"summary,omitempty"` // When present, a pithy one-liner about the item (usually only seen for movies). - Tagline any `json:"tagline,omitempty"` + Tagline *string `json:"tagline,omitempty"` // When present, the URL for theme music for the item (usually only for TV shows). - Theme any `json:"theme,omitempty"` + Theme *string `json:"theme,omitempty"` // When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. - Thumb any `json:"thumb,omitempty"` + Thumb *string `json:"thumb,omitempty"` // Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). - TitleSort any `json:"titleSort,omitempty"` + TitleSort *string `json:"titleSort,omitempty"` // In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). UpdatedAt *int64 `json:"updatedAt,omitempty"` // When the user has rated an item, this contains the user rating - UserRating *float64 `json:"userRating,omitempty"` + UserRating *float32 `json:"userRating,omitempty"` // When a users has completed watched or listened to an item, this attribute contains the number of consumptions. - ViewCount *int64 `json:"viewCount,omitempty"` + ViewCount *int `json:"viewCount,omitempty"` // For shows and seasons, contains the number of viewed episodes. - ViewedLeafCount *int64 `json:"viewedLeafCount,omitempty"` + ViewedLeafCount *int `json:"viewedLeafCount,omitempty"` // When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. - ViewOffset *int64 `json:"viewOffset,omitempty"` - Writer []Tag `json:"Writer,omitempty"` + ViewOffset *int `json:"viewOffset,omitempty"` + Writer []Tag `json:"Writer,omitempty"` // When present, the year associated with the item's release (e.g. release year for a movie). - Year *int64 `json:"year,omitempty"` + Year *int `json:"year,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -144,55 +165,55 @@ func (m Metadata) MarshalJSON() ([]byte, error) { } func (m *Metadata) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"title", "type", "addedAt", "key"}); err != nil { return err } return nil } -func (m *Metadata) GetTitle() any { +func (m *Metadata) GetTitle() string { if m == nil { - return nil + return "" } return m.Title } -func (m *Metadata) GetType() any { +func (m *Metadata) GetType() string { if m == nil { - return nil + return "" } return m.Type } -func (m *Metadata) GetAbsoluteIndex() *int64 { +func (m *Metadata) GetAbsoluteIndex() *int { if m == nil { return nil } return m.AbsoluteIndex } -func (m *Metadata) GetAddedAt() *int64 { +func (m *Metadata) GetAddedAt() int64 { if m == nil { - return nil + return 0 } return m.AddedAt } -func (m *Metadata) GetArt() any { +func (m *Metadata) GetArt() *string { if m == nil { return nil } return m.Art } -func (m *Metadata) GetAudienceRating() *float64 { +func (m *Metadata) GetAudienceRating() *float32 { if m == nil { return nil } return m.AudienceRating } -func (m *Metadata) GetAudienceRatingImage() any { +func (m *Metadata) GetAudienceRatingImage() *string { if m == nil { return nil } @@ -206,28 +227,35 @@ func (m *Metadata) GetAutotag() []Tag { return m.Autotag } -func (m *Metadata) GetBanner() any { +func (m *Metadata) GetBanner() *string { if m == nil { return nil } return m.Banner } -func (m *Metadata) GetChapterSource() any { +func (m *Metadata) GetChapterSource() *string { if m == nil { return nil } return m.ChapterSource } -func (m *Metadata) GetComposite() any { +func (m *Metadata) GetChildCount() *int { + if m == nil { + return nil + } + return m.ChildCount +} + +func (m *Metadata) GetComposite() *string { if m == nil { return nil } return m.Composite } -func (m *Metadata) GetContentRating() any { +func (m *Metadata) GetContentRating() *string { if m == nil { return nil } @@ -248,7 +276,7 @@ func (m *Metadata) GetDirector() []Tag { return m.Director } -func (m *Metadata) GetDuration() *int64 { +func (m *Metadata) GetDuration() *int { if m == nil { return nil } @@ -276,6 +304,13 @@ func (m *Metadata) GetGrandparentArt() *string { return m.GrandparentArt } +func (m *Metadata) GetGrandparentGUID() *string { + if m == nil { + return nil + } + return m.GrandparentGUID +} + func (m *Metadata) GetGrandparentHero() *string { if m == nil { return nil @@ -318,14 +353,21 @@ func (m *Metadata) GetGrandparentTitle() *string { return m.GrandparentTitle } -func (m *Metadata) GetGUID() []Tag { +func (m *Metadata) GetGUID() *string { if m == nil { return nil } return m.GUID } -func (m *Metadata) GetHero() any { +func (m *Metadata) GetGuids() []Guids { + if m == nil { + return nil + } + return m.Guids +} + +func (m *Metadata) GetHero() *string { if m == nil { return nil } @@ -339,16 +381,16 @@ func (m *Metadata) GetImage() []Image { return m.Image } -func (m *Metadata) GetIndex() *int64 { +func (m *Metadata) GetIndex() *int { if m == nil { return nil } return m.Index } -func (m *Metadata) GetKey() any { +func (m *Metadata) GetKey() string { if m == nil { - return nil + return "" } return m.Key } @@ -360,7 +402,7 @@ func (m *Metadata) GetLastViewedAt() *int64 { return m.LastViewedAt } -func (m *Metadata) GetLeafCount() *int64 { +func (m *Metadata) GetLeafCount() *int { if m == nil { return nil } @@ -374,20 +416,27 @@ func (m *Metadata) GetMedia() []Media { return m.Media } -func (m *Metadata) GetOriginallyAvailableAt() any { +func (m *Metadata) GetOriginallyAvailableAt() *types.Date { if m == nil { return nil } return m.OriginallyAvailableAt } -func (m *Metadata) GetOriginalTitle() any { +func (m *Metadata) GetOriginalTitle() *string { if m == nil { return nil } return m.OriginalTitle } +func (m *Metadata) GetParentGUID() *string { + if m == nil { + return nil + } + return m.ParentGUID +} + func (m *Metadata) GetParentHero() *string { if m == nil { return nil @@ -395,7 +444,7 @@ func (m *Metadata) GetParentHero() *string { return m.ParentHero } -func (m *Metadata) GetParentIndex() *int64 { +func (m *Metadata) GetParentIndex() *int { if m == nil { return nil } @@ -430,7 +479,7 @@ func (m *Metadata) GetParentTitle() *string { return m.ParentTitle } -func (m *Metadata) GetPrimaryExtraKey() any { +func (m *Metadata) GetPrimaryExtraKey() *string { if m == nil { return nil } @@ -444,7 +493,7 @@ func (m *Metadata) GetPrompt() *string { return m.Prompt } -func (m *Metadata) GetRating() *float64 { +func (m *Metadata) GetRating() *float32 { if m == nil { return nil } @@ -458,21 +507,21 @@ func (m *Metadata) GetRatingArray() []Tag { return m.RatingArray } -func (m *Metadata) GetRatingCount() *int64 { +func (m *Metadata) GetRatingCount() *int { if m == nil { return nil } return m.RatingCount } -func (m *Metadata) GetRatingImage() any { +func (m *Metadata) GetRatingImage() *string { if m == nil { return nil } return m.RatingImage } -func (m *Metadata) GetRatingKey() any { +func (m *Metadata) GetRatingKey() *string { if m == nil { return nil } @@ -521,49 +570,49 @@ func (m *Metadata) GetSort() []Sort { return m.Sort } -func (m *Metadata) GetStudio() any { +func (m *Metadata) GetStudio() *string { if m == nil { return nil } return m.Studio } -func (m *Metadata) GetSubtype() any { +func (m *Metadata) GetSubtype() *string { if m == nil { return nil } return m.Subtype } -func (m *Metadata) GetSummary() any { +func (m *Metadata) GetSummary() *string { if m == nil { return nil } return m.Summary } -func (m *Metadata) GetTagline() any { +func (m *Metadata) GetTagline() *string { if m == nil { return nil } return m.Tagline } -func (m *Metadata) GetTheme() any { +func (m *Metadata) GetTheme() *string { if m == nil { return nil } return m.Theme } -func (m *Metadata) GetThumb() any { +func (m *Metadata) GetThumb() *string { if m == nil { return nil } return m.Thumb } -func (m *Metadata) GetTitleSort() any { +func (m *Metadata) GetTitleSort() *string { if m == nil { return nil } @@ -577,28 +626,28 @@ func (m *Metadata) GetUpdatedAt() *int64 { return m.UpdatedAt } -func (m *Metadata) GetUserRating() *float64 { +func (m *Metadata) GetUserRating() *float32 { if m == nil { return nil } return m.UserRating } -func (m *Metadata) GetViewCount() *int64 { +func (m *Metadata) GetViewCount() *int { if m == nil { return nil } return m.ViewCount } -func (m *Metadata) GetViewedLeafCount() *int64 { +func (m *Metadata) GetViewedLeafCount() *int { if m == nil { return nil } return m.ViewedLeafCount } -func (m *Metadata) GetViewOffset() *int64 { +func (m *Metadata) GetViewOffset() *int { if m == nil { return nil } @@ -612,7 +661,7 @@ func (m *Metadata) GetWriter() []Tag { return m.Writer } -func (m *Metadata) GetYear() *int64 { +func (m *Metadata) GetYear() *int { if m == nil { return nil } diff --git a/models/components/part.go b/models/components/part.go index 516b6b1..349ee98 100644 --- a/models/components/part.go +++ b/models/components/part.go @@ -8,22 +8,27 @@ import ( // Part - `Part` represents a particular file or "part" of a media item. The part is the playable unit of the media hierarchy. Suppose that a movie library contains a movie that is broken up into files, reminiscent of a movie split across two BDs. The metadata item represents information about the movie, the media item represents this instance of the movie at this resolution and quality, and the part items represent the two playable files. If another media were added which contained the joining of these two parts transcoded down to a lower resolution, then this metadata would contain 2 medias, one with 2 parts and one with 1 part. type Part struct { - AudioProfile any `json:"audioProfile,omitempty"` + // Indicates if the part is accessible. + Accessible *bool `json:"accessible,omitempty"` + AudioProfile *string `json:"audioProfile,omitempty"` // The container of the media file, such as `mp4` or `mkv` - Container any `json:"container,omitempty"` + Container *string `json:"container,omitempty"` // The duration of the media item, in milliseconds - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` + // Indicates if the part exists. + Exists *bool `json:"exists,omitempty"` // The local file path at which the part is stored on the server - File any `json:"file,omitempty"` - Has64bitOffsets *bool `json:"has64bitOffsets,omitempty"` - ID *int64 `json:"id,omitempty"` + File *string `json:"file,omitempty"` + Has64bitOffsets *bool `json:"has64bitOffsets,omitempty"` + ID int64 `json:"id"` + Indexes *string `json:"indexes,omitempty"` // The key from which the media can be streamed - Key any `json:"key,omitempty"` - OptimizedForStreaming *bool `json:"optimizedForStreaming,omitempty"` + Key string `json:"key"` + OptimizedForStreaming *bool `json:"optimizedForStreaming,omitempty"` // The size of the media, in bytes Size *int64 `json:"size,omitempty"` Stream []Stream `json:"Stream,omitempty"` - VideoProfile any `json:"videoProfile,omitempty"` + VideoProfile *string `json:"videoProfile,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -32,34 +37,48 @@ func (p Part) MarshalJSON() ([]byte, error) { } func (p *Part) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &p, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &p, "", false, []string{"id", "key"}); err != nil { return err } return nil } -func (p *Part) GetAudioProfile() any { +func (p *Part) GetAccessible() *bool { + if p == nil { + return nil + } + return p.Accessible +} + +func (p *Part) GetAudioProfile() *string { if p == nil { return nil } return p.AudioProfile } -func (p *Part) GetContainer() any { +func (p *Part) GetContainer() *string { if p == nil { return nil } return p.Container } -func (p *Part) GetDuration() *int64 { +func (p *Part) GetDuration() *int { if p == nil { return nil } return p.Duration } -func (p *Part) GetFile() any { +func (p *Part) GetExists() *bool { + if p == nil { + return nil + } + return p.Exists +} + +func (p *Part) GetFile() *string { if p == nil { return nil } @@ -73,17 +92,24 @@ func (p *Part) GetHas64bitOffsets() *bool { return p.Has64bitOffsets } -func (p *Part) GetID() *int64 { +func (p *Part) GetID() int64 { if p == nil { - return nil + return 0 } return p.ID } -func (p *Part) GetKey() any { +func (p *Part) GetIndexes() *string { if p == nil { return nil } + return p.Indexes +} + +func (p *Part) GetKey() string { + if p == nil { + return "" + } return p.Key } @@ -108,7 +134,7 @@ func (p *Part) GetStream() []Stream { return p.Stream } -func (p *Part) GetVideoProfile() any { +func (p *Part) GetVideoProfile() *string { if p == nil { return nil } diff --git a/models/components/plexdevice.go b/models/components/plexdevice.go new file mode 100644 index 0000000..92875f8 --- /dev/null +++ b/models/components/plexdevice.go @@ -0,0 +1,310 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +import ( + "encoding/json" + "fmt" + "github.com/LukeHagar/plexgo/internal/utils" + "time" +) + +// PlexDeviceProtocol - The protocol used for the connection (http, https, etc) +type PlexDeviceProtocol string + +const ( + PlexDeviceProtocolHTTP PlexDeviceProtocol = "http" + PlexDeviceProtocolHTTPS PlexDeviceProtocol = "https" +) + +func (e PlexDeviceProtocol) ToPointer() *PlexDeviceProtocol { + return &e +} +func (e *PlexDeviceProtocol) UnmarshalJSON(data []byte) error { + var v string + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case "http": + fallthrough + case "https": + *e = PlexDeviceProtocol(v) + return nil + default: + return fmt.Errorf("invalid value for PlexDeviceProtocol: %v", v) + } +} + +type Connections struct { + // The protocol used for the connection (http, https, etc) + Protocol PlexDeviceProtocol `json:"protocol"` + // The (ip) address or domain name used for the connection + Address string `json:"address"` + // The port used for the connection + Port int `json:"port"` + // The full URI of the connection + URI string `json:"uri"` + // If the connection is local address + Local bool `json:"local"` + // If the connection is relayed through plex.direct + Relay bool `json:"relay"` + // If the connection is using IPv6 + IPv6 bool `json:"IPv6"` +} + +func (c *Connections) GetProtocol() PlexDeviceProtocol { + if c == nil { + return PlexDeviceProtocol("") + } + return c.Protocol +} + +func (c *Connections) GetAddress() string { + if c == nil { + return "" + } + return c.Address +} + +func (c *Connections) GetPort() int { + if c == nil { + return 0 + } + return c.Port +} + +func (c *Connections) GetURI() string { + if c == nil { + return "" + } + return c.URI +} + +func (c *Connections) GetLocal() bool { + if c == nil { + return false + } + return c.Local +} + +func (c *Connections) GetRelay() bool { + if c == nil { + return false + } + return c.Relay +} + +func (c *Connections) GetIPv6() bool { + if c == nil { + return false + } + return c.IPv6 +} + +type PlexDevice struct { + Name string `json:"name"` + Product string `json:"product"` + ProductVersion string `json:"productVersion"` + Platform *string `json:"platform"` + PlatformVersion *string `json:"platformVersion"` + Device *string `json:"device"` + ClientIdentifier string `json:"clientIdentifier"` + CreatedAt time.Time `json:"createdAt"` + LastSeenAt time.Time `json:"lastSeenAt"` + Provides string `json:"provides"` + // ownerId is null when the device is owned by the token used to send the request + OwnerID *int64 `json:"ownerId"` + SourceTitle *string `json:"sourceTitle"` + PublicAddress string `json:"publicAddress"` + AccessToken string `json:"accessToken"` + Owned bool `json:"owned"` + Home bool `json:"home"` + Synced bool `json:"synced"` + Relay bool `json:"relay"` + Presence bool `json:"presence"` + HTTPSRequired bool `json:"httpsRequired"` + PublicAddressMatches bool `json:"publicAddressMatches"` + DNSRebindingProtection bool `json:"dnsRebindingProtection"` + NatLoopbackSupported bool `json:"natLoopbackSupported"` + Connections []Connections `json:"connections"` +} + +func (p PlexDevice) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(p, "", false) +} + +func (p *PlexDevice) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &p, "", false, []string{"name", "product", "productVersion", "clientIdentifier", "createdAt", "lastSeenAt", "provides", "publicAddress", "accessToken", "owned", "home", "synced", "relay", "presence", "httpsRequired", "publicAddressMatches", "dnsRebindingProtection", "natLoopbackSupported", "connections"}); err != nil { + return err + } + return nil +} + +func (p *PlexDevice) GetName() string { + if p == nil { + return "" + } + return p.Name +} + +func (p *PlexDevice) GetProduct() string { + if p == nil { + return "" + } + return p.Product +} + +func (p *PlexDevice) GetProductVersion() string { + if p == nil { + return "" + } + return p.ProductVersion +} + +func (p *PlexDevice) GetPlatform() *string { + if p == nil { + return nil + } + return p.Platform +} + +func (p *PlexDevice) GetPlatformVersion() *string { + if p == nil { + return nil + } + return p.PlatformVersion +} + +func (p *PlexDevice) GetDevice() *string { + if p == nil { + return nil + } + return p.Device +} + +func (p *PlexDevice) GetClientIdentifier() string { + if p == nil { + return "" + } + return p.ClientIdentifier +} + +func (p *PlexDevice) GetCreatedAt() time.Time { + if p == nil { + return time.Time{} + } + return p.CreatedAt +} + +func (p *PlexDevice) GetLastSeenAt() time.Time { + if p == nil { + return time.Time{} + } + return p.LastSeenAt +} + +func (p *PlexDevice) GetProvides() string { + if p == nil { + return "" + } + return p.Provides +} + +func (p *PlexDevice) GetOwnerID() *int64 { + if p == nil { + return nil + } + return p.OwnerID +} + +func (p *PlexDevice) GetSourceTitle() *string { + if p == nil { + return nil + } + return p.SourceTitle +} + +func (p *PlexDevice) GetPublicAddress() string { + if p == nil { + return "" + } + return p.PublicAddress +} + +func (p *PlexDevice) GetAccessToken() string { + if p == nil { + return "" + } + return p.AccessToken +} + +func (p *PlexDevice) GetOwned() bool { + if p == nil { + return false + } + return p.Owned +} + +func (p *PlexDevice) GetHome() bool { + if p == nil { + return false + } + return p.Home +} + +func (p *PlexDevice) GetSynced() bool { + if p == nil { + return false + } + return p.Synced +} + +func (p *PlexDevice) GetRelay() bool { + if p == nil { + return false + } + return p.Relay +} + +func (p *PlexDevice) GetPresence() bool { + if p == nil { + return false + } + return p.Presence +} + +func (p *PlexDevice) GetHTTPSRequired() bool { + if p == nil { + return false + } + return p.HTTPSRequired +} + +func (p *PlexDevice) GetPublicAddressMatches() bool { + if p == nil { + return false + } + return p.PublicAddressMatches +} + +func (p *PlexDevice) GetDNSRebindingProtection() bool { + if p == nil { + return false + } + return p.DNSRebindingProtection +} + +func (p *PlexDevice) GetNatLoopbackSupported() bool { + if p == nil { + return false + } + return p.NatLoopbackSupported +} + +func (p *PlexDevice) GetConnections() []Connections { + if p == nil { + return []Connections{} + } + return p.Connections +} diff --git a/models/components/stream.go b/models/components/stream.go index 415d7ea..a27b468 100644 --- a/models/components/stream.go +++ b/models/components/stream.go @@ -8,42 +8,108 @@ import ( // Stream - `Stream` represents a particular stream from a media item, such as the video stream, audio stream, or subtitle stream. The stream may either be part of the file represented by the parent `Part` or, especially for subtitles, an external file. The stream contains more detailed information about the specific stream. For example, a video may include the `aspectRatio` at the `Media` level, but detailed information about the video stream like the color space will be included on the `Stream` for the video stream. Note that photos do not have streams (mostly as an optimization). type Stream struct { - Default *bool `json:"default,omitempty"` - AudioChannelLayout any `json:"audioChannelLayout,omitempty"` - BitDepth *int64 `json:"bitDepth,omitempty"` - Bitrate *int64 `json:"bitrate,omitempty"` - // For subtitle streams only. If `true` then the server can attempt to automatically sync the subtitle timestamps with the video. - CanAutoSync *bool `json:"canAutoSync,omitempty"` - ChromaLocation any `json:"chromaLocation,omitempty"` - ChromaSubsampling any `json:"chromaSubsampling,omitempty"` - // The codec of the stream, such as `h264` or `aac` - Codec any `json:"codec,omitempty"` - ColorPrimaries any `json:"colorPrimaries,omitempty"` - ColorRange any `json:"colorRange,omitempty"` - ColorSpace any `json:"colorSpace,omitempty"` - ColorTrc any `json:"colorTrc,omitempty"` - // A friendly name for the stream, often comprised of the language and codec information - DisplayTitle any `json:"displayTitle,omitempty"` - FrameRate *float64 `json:"frameRate,omitempty"` - HasScalingMatrix any `json:"hasScalingMatrix,omitempty"` - Height *int64 `json:"height,omitempty"` - ID *int64 `json:"id,omitempty"` - // If the stream is part of the `Part` and not an external resource, the index of the stream within that part - Index *int64 `json:"index,omitempty"` - // If the stream is independently streamable, the key from which it can be streamed - Key any `json:"key,omitempty"` - Language any `json:"language,omitempty"` - // The three character language code for the stream contents - LanguageCode any `json:"languageCode,omitempty"` - Level *int64 `json:"level,omitempty"` - Profile any `json:"profile,omitempty"` - RefFrames *int64 `json:"refFrames,omitempty"` - SamplingRate *int64 `json:"samplingRate,omitempty"` - Selected *bool `json:"selected,omitempty"` - StreamIdentifier *int64 `json:"streamIdentifier,omitempty"` - // A number indicating the type of the stream. `1` for video, `2` for audio, `3` for subtitles, `4` for lyrics - StreamType *int64 `json:"streamType,omitempty"` - Width *int64 `json:"width,omitempty"` + // Indicates if this stream is default. + Default *bool `json:"default,omitempty"` + // Audio channel layout. + AudioChannelLayout *string `json:"audioChannelLayout,omitempty"` + // Number of audio channels (for audio streams). + Channels *int `json:"channels,omitempty"` + // Bit depth of the video stream. + BitDepth *int `json:"bitDepth,omitempty"` + // Dolby Vision BL compatibility ID. + DOVIBLCompatID *int `json:"DOVIBLCompatID,omitempty"` + // Indicates if Dolby Vision BL is present. + DOVIBLPresent *bool `json:"DOVIBLPresent,omitempty"` + // Indicates if Dolby Vision EL is present. + DOVIELPresent *bool `json:"DOVIELPresent,omitempty"` + // Dolby Vision level. + DOVILevel *int `json:"DOVILevel,omitempty"` + // Indicates if Dolby Vision is present. + DOVIPresent *bool `json:"DOVIPresent,omitempty"` + // Dolby Vision profile. + DOVIProfile *int `json:"DOVIProfile,omitempty"` + // Indicates if Dolby Vision RPU is present. + DOVIRPUPresent *bool `json:"DOVIRPUPresent,omitempty"` + // Dolby Vision version. + DOVIVersion *string `json:"DOVIVersion,omitempty"` + // Bitrate of the stream. + Bitrate *int `json:"bitrate,omitempty"` + // Indicates if the stream can auto-sync. + CanAutoSync *bool `json:"canAutoSync,omitempty"` + // Chroma sample location. + ChromaLocation *string `json:"chromaLocation,omitempty"` + // Chroma subsampling format. + ChromaSubsampling *string `json:"chromaSubsampling,omitempty"` + // Coded video height. + CodedHeight *int `json:"codedHeight,omitempty"` + // Coded video width. + CodedWidth *int `json:"codedWidth,omitempty"` + ClosedCaptions *bool `json:"closedCaptions,omitempty"` + // Codec used by the stream. + Codec string `json:"codec"` + // Color primaries used. + ColorPrimaries *string `json:"colorPrimaries,omitempty"` + // Color range (e.g., tv). + ColorRange *string `json:"colorRange,omitempty"` + // Color space. + ColorSpace *string `json:"colorSpace,omitempty"` + // Color transfer characteristics. + ColorTrc *string `json:"colorTrc,omitempty"` + // Display title for the stream. + DisplayTitle string `json:"displayTitle"` + // Extended display title for the stream. + ExtendedDisplayTitle *string `json:"extendedDisplayTitle,omitempty"` + // Frame rate of the stream. + FrameRate *float32 `json:"frameRate,omitempty"` + HasScalingMatrix *bool `json:"hasScalingMatrix,omitempty"` + // Height of the video stream. + Height *int `json:"height,omitempty"` + // Unique stream identifier. + ID int `json:"id"` + // Index of the stream. + Index *int `json:"index,omitempty"` + // Key to access this stream part. + Key string `json:"key"` + // Language of the stream. + Language *string `json:"language,omitempty"` + // ISO language code. + LanguageCode *string `json:"languageCode,omitempty"` + // Language tag (e.g., en). + LanguageTag *string `json:"languageTag,omitempty"` + // Format of the stream (e.g., srt). + Format *string `json:"format,omitempty"` + // Indicates whether header compression is enabled. + HeaderCompression *bool `json:"headerCompression,omitempty"` + // Video level. + Level *int `json:"level,omitempty"` + // Indicates if this is the original stream. + Original *bool `json:"original,omitempty"` + // Video profile. + Profile *string `json:"profile,omitempty"` + // Number of reference frames. + RefFrames *int `json:"refFrames,omitempty"` + // Sampling rate for the audio stream. + SamplingRate *int `json:"samplingRate,omitempty"` + ScanType *string `json:"scanType,omitempty"` + EmbeddedInVideo *string `json:"embeddedInVideo,omitempty"` + // Indicates if this stream is selected (applicable for audio streams). + Selected *bool `json:"selected,omitempty"` + Forced *bool `json:"forced,omitempty"` + // Indicates if the stream is for the hearing impaired. + HearingImpaired *bool `json:"hearingImpaired,omitempty"` + // Indicates if the stream is a dub. + Dub *bool `json:"dub,omitempty"` + // Optional title for the stream (e.g., language variant). + Title *string `json:"title,omitempty"` + StreamIdentifier *int `json:"streamIdentifier,omitempty"` + // Stream type: + // - VIDEO = 1 + // - AUDIO = 2 + // - SUBTITLE = 3 + // + streamType int64 `const:"1" json:"streamType"` + // Width of the video stream. + Width *int `json:"width,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -52,7 +118,7 @@ func (s Stream) MarshalJSON() ([]byte, error) { } func (s *Stream) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &s, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &s, "", false, []string{"codec", "displayTitle", "id", "key", "streamType"}); err != nil { return err } return nil @@ -65,21 +131,84 @@ func (s *Stream) GetDefault() *bool { return s.Default } -func (s *Stream) GetAudioChannelLayout() any { +func (s *Stream) GetAudioChannelLayout() *string { if s == nil { return nil } return s.AudioChannelLayout } -func (s *Stream) GetBitDepth() *int64 { +func (s *Stream) GetChannels() *int { + if s == nil { + return nil + } + return s.Channels +} + +func (s *Stream) GetBitDepth() *int { if s == nil { return nil } return s.BitDepth } -func (s *Stream) GetBitrate() *int64 { +func (s *Stream) GetDOVIBLCompatID() *int { + if s == nil { + return nil + } + return s.DOVIBLCompatID +} + +func (s *Stream) GetDOVIBLPresent() *bool { + if s == nil { + return nil + } + return s.DOVIBLPresent +} + +func (s *Stream) GetDOVIELPresent() *bool { + if s == nil { + return nil + } + return s.DOVIELPresent +} + +func (s *Stream) GetDOVILevel() *int { + if s == nil { + return nil + } + return s.DOVILevel +} + +func (s *Stream) GetDOVIPresent() *bool { + if s == nil { + return nil + } + return s.DOVIPresent +} + +func (s *Stream) GetDOVIProfile() *int { + if s == nil { + return nil + } + return s.DOVIProfile +} + +func (s *Stream) GetDOVIRPUPresent() *bool { + if s == nil { + return nil + } + return s.DOVIRPUPresent +} + +func (s *Stream) GetDOVIVersion() *string { + if s == nil { + return nil + } + return s.DOVIVersion +} + +func (s *Stream) GetBitrate() *int { if s == nil { return nil } @@ -93,146 +222,216 @@ func (s *Stream) GetCanAutoSync() *bool { return s.CanAutoSync } -func (s *Stream) GetChromaLocation() any { +func (s *Stream) GetChromaLocation() *string { if s == nil { return nil } return s.ChromaLocation } -func (s *Stream) GetChromaSubsampling() any { +func (s *Stream) GetChromaSubsampling() *string { if s == nil { return nil } return s.ChromaSubsampling } -func (s *Stream) GetCodec() any { +func (s *Stream) GetCodedHeight() *int { if s == nil { return nil } + return s.CodedHeight +} + +func (s *Stream) GetCodedWidth() *int { + if s == nil { + return nil + } + return s.CodedWidth +} + +func (s *Stream) GetClosedCaptions() *bool { + if s == nil { + return nil + } + return s.ClosedCaptions +} + +func (s *Stream) GetCodec() string { + if s == nil { + return "" + } return s.Codec } -func (s *Stream) GetColorPrimaries() any { +func (s *Stream) GetColorPrimaries() *string { if s == nil { return nil } return s.ColorPrimaries } -func (s *Stream) GetColorRange() any { +func (s *Stream) GetColorRange() *string { if s == nil { return nil } return s.ColorRange } -func (s *Stream) GetColorSpace() any { +func (s *Stream) GetColorSpace() *string { if s == nil { return nil } return s.ColorSpace } -func (s *Stream) GetColorTrc() any { +func (s *Stream) GetColorTrc() *string { if s == nil { return nil } return s.ColorTrc } -func (s *Stream) GetDisplayTitle() any { +func (s *Stream) GetDisplayTitle() string { if s == nil { - return nil + return "" } return s.DisplayTitle } -func (s *Stream) GetFrameRate() *float64 { +func (s *Stream) GetExtendedDisplayTitle() *string { + if s == nil { + return nil + } + return s.ExtendedDisplayTitle +} + +func (s *Stream) GetFrameRate() *float32 { if s == nil { return nil } return s.FrameRate } -func (s *Stream) GetHasScalingMatrix() any { +func (s *Stream) GetHasScalingMatrix() *bool { if s == nil { return nil } return s.HasScalingMatrix } -func (s *Stream) GetHeight() *int64 { +func (s *Stream) GetHeight() *int { if s == nil { return nil } return s.Height } -func (s *Stream) GetID() *int64 { +func (s *Stream) GetID() int { if s == nil { - return nil + return 0 } return s.ID } -func (s *Stream) GetIndex() *int64 { +func (s *Stream) GetIndex() *int { if s == nil { return nil } return s.Index } -func (s *Stream) GetKey() any { +func (s *Stream) GetKey() string { if s == nil { - return nil + return "" } return s.Key } -func (s *Stream) GetLanguage() any { +func (s *Stream) GetLanguage() *string { if s == nil { return nil } return s.Language } -func (s *Stream) GetLanguageCode() any { +func (s *Stream) GetLanguageCode() *string { if s == nil { return nil } return s.LanguageCode } -func (s *Stream) GetLevel() *int64 { +func (s *Stream) GetLanguageTag() *string { + if s == nil { + return nil + } + return s.LanguageTag +} + +func (s *Stream) GetFormat() *string { + if s == nil { + return nil + } + return s.Format +} + +func (s *Stream) GetHeaderCompression() *bool { + if s == nil { + return nil + } + return s.HeaderCompression +} + +func (s *Stream) GetLevel() *int { if s == nil { return nil } return s.Level } -func (s *Stream) GetProfile() any { +func (s *Stream) GetOriginal() *bool { + if s == nil { + return nil + } + return s.Original +} + +func (s *Stream) GetProfile() *string { if s == nil { return nil } return s.Profile } -func (s *Stream) GetRefFrames() *int64 { +func (s *Stream) GetRefFrames() *int { if s == nil { return nil } return s.RefFrames } -func (s *Stream) GetSamplingRate() *int64 { +func (s *Stream) GetSamplingRate() *int { if s == nil { return nil } return s.SamplingRate } +func (s *Stream) GetScanType() *string { + if s == nil { + return nil + } + return s.ScanType +} + +func (s *Stream) GetEmbeddedInVideo() *string { + if s == nil { + return nil + } + return s.EmbeddedInVideo +} + func (s *Stream) GetSelected() *bool { if s == nil { return nil @@ -240,21 +439,46 @@ func (s *Stream) GetSelected() *bool { return s.Selected } -func (s *Stream) GetStreamIdentifier() *int64 { +func (s *Stream) GetForced() *bool { + if s == nil { + return nil + } + return s.Forced +} + +func (s *Stream) GetHearingImpaired() *bool { + if s == nil { + return nil + } + return s.HearingImpaired +} + +func (s *Stream) GetDub() *bool { + if s == nil { + return nil + } + return s.Dub +} + +func (s *Stream) GetTitle() *string { + if s == nil { + return nil + } + return s.Title +} + +func (s *Stream) GetStreamIdentifier() *int { if s == nil { return nil } return s.StreamIdentifier } -func (s *Stream) GetStreamType() *int64 { - if s == nil { - return nil - } - return s.StreamType +func (s *Stream) GetStreamType() int64 { + return 1 } -func (s *Stream) GetWidth() *int64 { +func (s *Stream) GetWidth() *int { if s == nil { return nil } diff --git a/models/components/tag.go b/models/components/tag.go index 8ed016c..044faa3 100644 --- a/models/components/tag.go +++ b/models/components/tag.go @@ -8,17 +8,18 @@ type Tag struct { Confidence *float64 `json:"confidence,omitempty"` Context *string `json:"context,omitempty"` // A filter parameter that can be used to query for more content that matches this tag value. - Filter any `json:"filter,omitempty"` - ID *int64 `json:"id,omitempty"` + Filter *string `json:"filter,omitempty"` + ID *int `json:"id,omitempty"` + // The rating key (Media ID) of this media item. Note: Although this is always an integer, it is represented as a string in the API. RatingKey *string `json:"ratingKey,omitempty"` // The role this actor played - Role any `json:"role,omitempty"` + Role *string `json:"role,omitempty"` // The value of the tag (the name) - Tag any `json:"tag,omitempty"` + Tag string `json:"tag"` // Plex identifier for this tag which can be used to fetch additional information from plex.tv - TagKey any `json:"tagKey,omitempty"` - TagType *int64 `json:"tagType,omitempty"` - Thumb any `json:"thumb,omitempty"` + TagKey *string `json:"tagKey,omitempty"` + TagType *int `json:"tagType,omitempty"` + Thumb *string `json:"thumb,omitempty"` } func (t *Tag) GetConfidence() *float64 { @@ -35,14 +36,14 @@ func (t *Tag) GetContext() *string { return t.Context } -func (t *Tag) GetFilter() any { +func (t *Tag) GetFilter() *string { if t == nil { return nil } return t.Filter } -func (t *Tag) GetID() *int64 { +func (t *Tag) GetID() *int { if t == nil { return nil } @@ -56,35 +57,35 @@ func (t *Tag) GetRatingKey() *string { return t.RatingKey } -func (t *Tag) GetRole() any { +func (t *Tag) GetRole() *string { if t == nil { return nil } return t.Role } -func (t *Tag) GetTag() any { +func (t *Tag) GetTag() string { if t == nil { - return nil + return "" } return t.Tag } -func (t *Tag) GetTagKey() any { +func (t *Tag) GetTagKey() *string { if t == nil { return nil } return t.TagKey } -func (t *Tag) GetTagType() *int64 { +func (t *Tag) GetTagType() *int { if t == nil { return nil } return t.TagType } -func (t *Tag) GetThumb() any { +func (t *Tag) GetThumb() *string { if t == nil { return nil } diff --git a/models/components/userplexaccount.go b/models/components/userplexaccount.go new file mode 100644 index 0000000..99af323 --- /dev/null +++ b/models/components/userplexaccount.go @@ -0,0 +1,644 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +import ( + "encoding/json" + "fmt" + "github.com/LukeHagar/plexgo/internal/utils" +) + +// MailingListStatus - Your current mailing list status +type MailingListStatus string + +const ( + MailingListStatusActive MailingListStatus = "active" + MailingListStatusUnsubscribed MailingListStatus = "unsubscribed" + MailingListStatusRemoved MailingListStatus = "removed" +) + +func (e MailingListStatus) ToPointer() *MailingListStatus { + return &e +} +func (e *MailingListStatus) UnmarshalJSON(data []byte) error { + var v string + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case "active": + fallthrough + case "unsubscribed": + fallthrough + case "removed": + *e = MailingListStatus(v) + return nil + default: + return fmt.Errorf("invalid value for MailingListStatus: %v", v) + } +} + +type UserPlexAccountStatus string + +const ( + UserPlexAccountStatusOnline UserPlexAccountStatus = "online" + UserPlexAccountStatusOffline UserPlexAccountStatus = "offline" +) + +func (e UserPlexAccountStatus) ToPointer() *UserPlexAccountStatus { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *UserPlexAccountStatus) IsExact() bool { + if e != nil { + switch *e { + case "online", "offline": + return true + } + } + return false +} + +type Services struct { + Identifier string `json:"identifier"` + Endpoint string `json:"endpoint"` + Token *string `json:"token"` + Secret *string `json:"secret"` + Status UserPlexAccountStatus `json:"status"` +} + +func (s *Services) GetIdentifier() string { + if s == nil { + return "" + } + return s.Identifier +} + +func (s *Services) GetEndpoint() string { + if s == nil { + return "" + } + return s.Endpoint +} + +func (s *Services) GetToken() *string { + if s == nil { + return nil + } + return s.Token +} + +func (s *Services) GetSecret() *string { + if s == nil { + return nil + } + return s.Secret +} + +func (s *Services) GetStatus() UserPlexAccountStatus { + if s == nil { + return UserPlexAccountStatus("") + } + return s.Status +} + +// UserPlexAccountSubscriptionStatus - String representation of subscriptionActive +type UserPlexAccountSubscriptionStatus string + +const ( + UserPlexAccountSubscriptionStatusInactive UserPlexAccountSubscriptionStatus = "Inactive" + UserPlexAccountSubscriptionStatusActive UserPlexAccountSubscriptionStatus = "Active" +) + +func (e UserPlexAccountSubscriptionStatus) ToPointer() *UserPlexAccountSubscriptionStatus { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *UserPlexAccountSubscriptionStatus) IsExact() bool { + if e != nil { + switch *e { + case "Inactive", "Active": + return true + } + } + return false +} + +// Subscription - If the account's Plex Pass subscription is active +type Subscription struct { + // List of features allowed on your Plex Pass subscription + Features []string `json:"features,omitempty"` + // If the account's Plex Pass subscription is active + Active *bool `json:"active,omitempty"` + // Date the account subscribed to Plex Pass + SubscribedAt *string `json:"subscribedAt,omitempty"` + // String representation of subscriptionActive + Status *UserPlexAccountSubscriptionStatus `json:"status,omitempty"` + // Payment service used for your Plex Pass subscription + PaymentService *string `json:"paymentService,omitempty"` + // Name of Plex Pass subscription plan + Plan *string `json:"plan,omitempty"` +} + +func (s *Subscription) GetFeatures() []string { + if s == nil { + return nil + } + return s.Features +} + +func (s *Subscription) GetActive() *bool { + if s == nil { + return nil + } + return s.Active +} + +func (s *Subscription) GetSubscribedAt() *string { + if s == nil { + return nil + } + return s.SubscribedAt +} + +func (s *Subscription) GetStatus() *UserPlexAccountSubscriptionStatus { + if s == nil { + return nil + } + return s.Status +} + +func (s *Subscription) GetPaymentService() *string { + if s == nil { + return nil + } + return s.PaymentService +} + +func (s *Subscription) GetPlan() *string { + if s == nil { + return nil + } + return s.Plan +} + +// UserPlexAccountSubscriptionsStatus - String representation of subscriptionActive +type UserPlexAccountSubscriptionsStatus string + +const ( + UserPlexAccountSubscriptionsStatusInactive UserPlexAccountSubscriptionsStatus = "Inactive" + UserPlexAccountSubscriptionsStatusActive UserPlexAccountSubscriptionsStatus = "Active" +) + +func (e UserPlexAccountSubscriptionsStatus) ToPointer() *UserPlexAccountSubscriptionsStatus { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *UserPlexAccountSubscriptionsStatus) IsExact() bool { + if e != nil { + switch *e { + case "Inactive", "Active": + return true + } + } + return false +} + +type UserPlexAccountSubscription struct { + // List of features allowed on your Plex Pass subscription + Features []string `json:"features,omitempty"` + // If the account's Plex Pass subscription is active + Active *bool `json:"active,omitempty"` + // Date the account subscribed to Plex Pass + SubscribedAt *string `json:"subscribedAt,omitempty"` + // String representation of subscriptionActive + Status *UserPlexAccountSubscriptionsStatus `json:"status,omitempty"` + // Payment service used for your Plex Pass subscription + PaymentService *string `json:"paymentService,omitempty"` + // Name of Plex Pass subscription plan + Plan *string `json:"plan,omitempty"` +} + +func (u *UserPlexAccountSubscription) GetFeatures() []string { + if u == nil { + return nil + } + return u.Features +} + +func (u *UserPlexAccountSubscription) GetActive() *bool { + if u == nil { + return nil + } + return u.Active +} + +func (u *UserPlexAccountSubscription) GetSubscribedAt() *string { + if u == nil { + return nil + } + return u.SubscribedAt +} + +func (u *UserPlexAccountSubscription) GetStatus() *UserPlexAccountSubscriptionsStatus { + if u == nil { + return nil + } + return u.Status +} + +func (u *UserPlexAccountSubscription) GetPaymentService() *string { + if u == nil { + return nil + } + return u.PaymentService +} + +func (u *UserPlexAccountSubscription) GetPlan() *string { + if u == nil { + return nil + } + return u.Plan +} + +type UserPlexAccount struct { + // Unknown + AdsConsent *bool `json:"adsConsent,omitempty"` + AdsConsentReminderAt *int64 `json:"adsConsentReminderAt,omitempty"` + AdsConsentSetAt *int64 `json:"adsConsentSetAt,omitempty"` + // Unknown + Anonymous *bool `default:"false" json:"anonymous"` + // The account token + AuthToken string `json:"authToken"` + // If the two-factor authentication backup codes have been created + BackupCodesCreated *bool `default:"false" json:"backupCodesCreated"` + // If the account has been confirmed + Confirmed *bool `default:"false" json:"confirmed"` + // The account country + Country *string `json:"country,omitempty"` + // The account email address + Email string `json:"email"` + // If login with email only is enabled + EmailOnlyAuth *bool `default:"false" json:"emailOnlyAuth"` + // If experimental features are enabled + ExperimentalFeatures *bool `default:"false" json:"experimentalFeatures"` + // Your account full name + FriendlyName string `json:"friendlyName"` + // List of devices your allowed to use with this account + Entitlements []string `json:"entitlements,omitempty"` + // If the account is a Plex Home guest user + Guest *bool `default:"false" json:"guest"` + // If the account has a password + HasPassword *bool `default:"true" json:"hasPassword"` + // If the account is a Plex Home user + Home *bool `default:"false" json:"home"` + // If the account is the Plex Home admin + HomeAdmin *bool `default:"false" json:"homeAdmin"` + // The number of accounts in the Plex Home + HomeSize *int `json:"homeSize,omitempty"` + // The Plex account ID + ID int `json:"id"` + // Unix epoch datetime in seconds + JoinedAt int64 `json:"joinedAt"` + // The account locale + Locale *string `json:"locale,omitempty"` + // If you are subscribed to the Plex newsletter + MailingListActive *bool `default:"false" json:"mailingListActive"` + // Your current mailing list status + MailingListStatus *MailingListStatus `json:"mailingListStatus,omitempty"` + // The maximum number of accounts allowed in the Plex Home + MaxHomeSize *int `json:"maxHomeSize,omitempty"` + // [Might be removed] The hashed Plex Home PIN + // + // Deprecated: This will be removed in a future release, please migrate away from it as soon as possible. + Pin *string `json:"pin,omitempty"` + Profile *UserProfile `json:"profile,omitempty"` + // If the account has a Plex Home PIN enabled + Protected *bool `default:"false" json:"protected"` + // Unix epoch datetime in seconds + RememberExpiresAt *int64 `json:"rememberExpiresAt,omitempty"` + // If the account is a Plex Home managed user + Restricted *bool `default:"false" json:"restricted"` + // [Might be removed] List of account roles. Plexpass membership listed here + Roles []string `json:"roles,omitempty"` + // Unknown + ScrobbleTypes *string `json:"scrobbleTypes,omitempty"` + Services []Services `json:"services,omitempty"` + // If the account's Plex Pass subscription is active + Subscription *Subscription `json:"subscription,omitempty"` + // Description of the Plex Pass subscription + SubscriptionDescription *string `json:"subscriptionDescription,omitempty"` + Subscriptions []UserPlexAccountSubscription `json:"subscriptions,omitempty"` + // URL of the account thumbnail + Thumb *string `json:"thumb,omitempty"` + // The title of the account (username or friendly name) + Title string `json:"title"` + // If two-factor authentication is enabled + TwoFactorEnabled *bool `default:"false" json:"twoFactorEnabled"` + // The account username + Username string `json:"username"` + // The account UUID + UUID string `json:"uuid"` + AttributionPartner *string `json:"attributionPartner,omitempty"` +} + +func (u UserPlexAccount) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(u, "", false) +} + +func (u *UserPlexAccount) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &u, "", false, []string{"authToken", "email", "friendlyName", "id", "joinedAt", "title", "username", "uuid"}); err != nil { + return err + } + return nil +} + +func (u *UserPlexAccount) GetAdsConsent() *bool { + if u == nil { + return nil + } + return u.AdsConsent +} + +func (u *UserPlexAccount) GetAdsConsentReminderAt() *int64 { + if u == nil { + return nil + } + return u.AdsConsentReminderAt +} + +func (u *UserPlexAccount) GetAdsConsentSetAt() *int64 { + if u == nil { + return nil + } + return u.AdsConsentSetAt +} + +func (u *UserPlexAccount) GetAnonymous() *bool { + if u == nil { + return nil + } + return u.Anonymous +} + +func (u *UserPlexAccount) GetAuthToken() string { + if u == nil { + return "" + } + return u.AuthToken +} + +func (u *UserPlexAccount) GetBackupCodesCreated() *bool { + if u == nil { + return nil + } + return u.BackupCodesCreated +} + +func (u *UserPlexAccount) GetConfirmed() *bool { + if u == nil { + return nil + } + return u.Confirmed +} + +func (u *UserPlexAccount) GetCountry() *string { + if u == nil { + return nil + } + return u.Country +} + +func (u *UserPlexAccount) GetEmail() string { + if u == nil { + return "" + } + return u.Email +} + +func (u *UserPlexAccount) GetEmailOnlyAuth() *bool { + if u == nil { + return nil + } + return u.EmailOnlyAuth +} + +func (u *UserPlexAccount) GetExperimentalFeatures() *bool { + if u == nil { + return nil + } + return u.ExperimentalFeatures +} + +func (u *UserPlexAccount) GetFriendlyName() string { + if u == nil { + return "" + } + return u.FriendlyName +} + +func (u *UserPlexAccount) GetEntitlements() []string { + if u == nil { + return nil + } + return u.Entitlements +} + +func (u *UserPlexAccount) GetGuest() *bool { + if u == nil { + return nil + } + return u.Guest +} + +func (u *UserPlexAccount) GetHasPassword() *bool { + if u == nil { + return nil + } + return u.HasPassword +} + +func (u *UserPlexAccount) GetHome() *bool { + if u == nil { + return nil + } + return u.Home +} + +func (u *UserPlexAccount) GetHomeAdmin() *bool { + if u == nil { + return nil + } + return u.HomeAdmin +} + +func (u *UserPlexAccount) GetHomeSize() *int { + if u == nil { + return nil + } + return u.HomeSize +} + +func (u *UserPlexAccount) GetID() int { + if u == nil { + return 0 + } + return u.ID +} + +func (u *UserPlexAccount) GetJoinedAt() int64 { + if u == nil { + return 0 + } + return u.JoinedAt +} + +func (u *UserPlexAccount) GetLocale() *string { + if u == nil { + return nil + } + return u.Locale +} + +func (u *UserPlexAccount) GetMailingListActive() *bool { + if u == nil { + return nil + } + return u.MailingListActive +} + +func (u *UserPlexAccount) GetMailingListStatus() *MailingListStatus { + if u == nil { + return nil + } + return u.MailingListStatus +} + +func (u *UserPlexAccount) GetMaxHomeSize() *int { + if u == nil { + return nil + } + return u.MaxHomeSize +} + +func (u *UserPlexAccount) GetPin() *string { + if u == nil { + return nil + } + return u.Pin +} + +func (u *UserPlexAccount) GetProfile() *UserProfile { + if u == nil { + return nil + } + return u.Profile +} + +func (u *UserPlexAccount) GetProtected() *bool { + if u == nil { + return nil + } + return u.Protected +} + +func (u *UserPlexAccount) GetRememberExpiresAt() *int64 { + if u == nil { + return nil + } + return u.RememberExpiresAt +} + +func (u *UserPlexAccount) GetRestricted() *bool { + if u == nil { + return nil + } + return u.Restricted +} + +func (u *UserPlexAccount) GetRoles() []string { + if u == nil { + return nil + } + return u.Roles +} + +func (u *UserPlexAccount) GetScrobbleTypes() *string { + if u == nil { + return nil + } + return u.ScrobbleTypes +} + +func (u *UserPlexAccount) GetServices() []Services { + if u == nil { + return nil + } + return u.Services +} + +func (u *UserPlexAccount) GetSubscription() *Subscription { + if u == nil { + return nil + } + return u.Subscription +} + +func (u *UserPlexAccount) GetSubscriptionDescription() *string { + if u == nil { + return nil + } + return u.SubscriptionDescription +} + +func (u *UserPlexAccount) GetSubscriptions() []UserPlexAccountSubscription { + if u == nil { + return nil + } + return u.Subscriptions +} + +func (u *UserPlexAccount) GetThumb() *string { + if u == nil { + return nil + } + return u.Thumb +} + +func (u *UserPlexAccount) GetTitle() string { + if u == nil { + return "" + } + return u.Title +} + +func (u *UserPlexAccount) GetTwoFactorEnabled() *bool { + if u == nil { + return nil + } + return u.TwoFactorEnabled +} + +func (u *UserPlexAccount) GetUsername() string { + if u == nil { + return "" + } + return u.Username +} + +func (u *UserPlexAccount) GetUUID() string { + if u == nil { + return "" + } + return u.UUID +} + +func (u *UserPlexAccount) GetAttributionPartner() *string { + if u == nil { + return nil + } + return u.AttributionPartner +} diff --git a/models/components/userprofile.go b/models/components/userprofile.go new file mode 100644 index 0000000..87b001b --- /dev/null +++ b/models/components/userprofile.go @@ -0,0 +1,320 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package components + +import ( + "encoding/json" + "fmt" + "github.com/LukeHagar/plexgo/internal/utils" +) + +// DefaultAudioAccessibility - The audio accessibility mode (0 = Prefer non-accessibility audio, 1 = Prefer accessibility audio, 2 = Only show accessibility audio, 3 = Only show non-accessibility audio) +type DefaultAudioAccessibility int + +const ( + DefaultAudioAccessibilityPreferNonAccessibility DefaultAudioAccessibility = 0 + DefaultAudioAccessibilityPreferAccessibility DefaultAudioAccessibility = 1 + DefaultAudioAccessibilityOnlyAccessibility DefaultAudioAccessibility = 2 + DefaultAudioAccessibilityOnlyNonAccessibility DefaultAudioAccessibility = 3 +) + +func (e DefaultAudioAccessibility) ToPointer() *DefaultAudioAccessibility { + return &e +} +func (e *DefaultAudioAccessibility) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + fallthrough + case 2: + fallthrough + case 3: + *e = DefaultAudioAccessibility(v) + return nil + default: + return fmt.Errorf("invalid value for DefaultAudioAccessibility: %v", v) + } +} + +// AutoSelectSubtitle - The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign audio, 2 = Always enabled) +type AutoSelectSubtitle int + +const ( + AutoSelectSubtitleManuallySelected AutoSelectSubtitle = 0 + AutoSelectSubtitleShownWithForeignAudio AutoSelectSubtitle = 1 + AutoSelectSubtitleAlwaysEnabled AutoSelectSubtitle = 2 +) + +func (e AutoSelectSubtitle) ToPointer() *AutoSelectSubtitle { + return &e +} +func (e *AutoSelectSubtitle) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + fallthrough + case 2: + *e = AutoSelectSubtitle(v) + return nil + default: + return fmt.Errorf("invalid value for AutoSelectSubtitle: %v", v) + } +} + +// DefaultSubtitleAccessibility - The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles) +type DefaultSubtitleAccessibility int + +const ( + DefaultSubtitleAccessibilityPreferNonSdh DefaultSubtitleAccessibility = 0 + DefaultSubtitleAccessibilityPreferSdh DefaultSubtitleAccessibility = 1 + DefaultSubtitleAccessibilityOnlySdh DefaultSubtitleAccessibility = 2 + DefaultSubtitleAccessibilityOnlyNonSdh DefaultSubtitleAccessibility = 3 +) + +func (e DefaultSubtitleAccessibility) ToPointer() *DefaultSubtitleAccessibility { + return &e +} +func (e *DefaultSubtitleAccessibility) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + fallthrough + case 2: + fallthrough + case 3: + *e = DefaultSubtitleAccessibility(v) + return nil + default: + return fmt.Errorf("invalid value for DefaultSubtitleAccessibility: %v", v) + } +} + +// DefaultSubtitleForced - The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer forced subtitles, 2 = Only show forced subtitles, 3 = Only show non-forced subtitles) +type DefaultSubtitleForced int + +const ( + DefaultSubtitleForcedPreferNonForced DefaultSubtitleForced = 0 + DefaultSubtitleForcedPreferForced DefaultSubtitleForced = 1 + DefaultSubtitleForcedOnlyForced DefaultSubtitleForced = 2 + DefaultSubtitleForcedOnlyNonForced DefaultSubtitleForced = 3 +) + +func (e DefaultSubtitleForced) ToPointer() *DefaultSubtitleForced { + return &e +} +func (e *DefaultSubtitleForced) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + fallthrough + case 2: + fallthrough + case 3: + *e = DefaultSubtitleForced(v) + return nil + default: + return fmt.Errorf("invalid value for DefaultSubtitleForced: %v", v) + } +} + +// WatchedIndicator - Whether or not media watched indicators are enabled (little orange dot on media) +type WatchedIndicator int + +const ( + WatchedIndicatorNone WatchedIndicator = 0 + WatchedIndicatorMoviesAndTvShows WatchedIndicator = 1 + WatchedIndicatorMovies WatchedIndicator = 2 + WatchedIndicatorTvShows WatchedIndicator = 3 +) + +func (e WatchedIndicator) ToPointer() *WatchedIndicator { + return &e +} +func (e *WatchedIndicator) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + fallthrough + case 2: + fallthrough + case 3: + *e = WatchedIndicator(v) + return nil + default: + return fmt.Errorf("invalid value for WatchedIndicator: %v", v) + } +} + +// MediaReviewsVisibility - Whether or not the account has media reviews visibility enabled +type MediaReviewsVisibility int + +const ( + MediaReviewsVisibilityNoOne MediaReviewsVisibility = 0 + MediaReviewsVisibilityCriticsOnly MediaReviewsVisibility = 1 + MediaReviewsVisibilityPlexUsersOnly MediaReviewsVisibility = 2 + MediaReviewsVisibilityPlexUsersAndCritics MediaReviewsVisibility = 3 +) + +func (e MediaReviewsVisibility) ToPointer() *MediaReviewsVisibility { + return &e +} +func (e *MediaReviewsVisibility) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + fallthrough + case 2: + fallthrough + case 3: + *e = MediaReviewsVisibility(v) + return nil + default: + return fmt.Errorf("invalid value for MediaReviewsVisibility: %v", v) + } +} + +type UserProfile struct { + // If the account has automatically select audio and subtitle tracks enabled + AutoSelectAudio *bool `default:"true" json:"autoSelectAudio"` + // The preferred audio language for the account + DefaultAudioLanguage *string `json:"defaultAudioLanguage"` + DefaultAudioAccessibility *DefaultAudioAccessibility `default:"0" json:"defaultAudioAccessibility"` + // The preferred audio languages for the account + DefaultAudioLanguages []string `json:"defaultAudioLanguages,omitempty"` + // The preferred subtitle language for the account + DefaultSubtitleLanguage *string `json:"defaultSubtitleLanguage"` + // The preferred subtitle languages for the account + DefaultSubtitleLanguages []string `json:"defaultSubtitleLanguages,omitempty"` + AutoSelectSubtitle *AutoSelectSubtitle `default:"0" json:"autoSelectSubtitle"` + DefaultSubtitleAccessibility *DefaultSubtitleAccessibility `default:"0" json:"defaultSubtitleAccessibility"` + DefaultSubtitleForced *DefaultSubtitleForced `default:"0" json:"defaultSubtitleForced"` + WatchedIndicator *WatchedIndicator `default:"0" json:"watchedIndicator"` + MediaReviewsVisibility *MediaReviewsVisibility `default:"0" json:"mediaReviewsVisibility"` + // The languages for media reviews visibility + MediaReviewsLanguages []string `json:"mediaReviewsLanguages,omitempty"` +} + +func (u UserProfile) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(u, "", false) +} + +func (u *UserProfile) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &u, "", false, nil); err != nil { + return err + } + return nil +} + +func (u *UserProfile) GetAutoSelectAudio() *bool { + if u == nil { + return nil + } + return u.AutoSelectAudio +} + +func (u *UserProfile) GetDefaultAudioLanguage() *string { + if u == nil { + return nil + } + return u.DefaultAudioLanguage +} + +func (u *UserProfile) GetDefaultAudioAccessibility() *DefaultAudioAccessibility { + if u == nil { + return nil + } + return u.DefaultAudioAccessibility +} + +func (u *UserProfile) GetDefaultAudioLanguages() []string { + if u == nil { + return nil + } + return u.DefaultAudioLanguages +} + +func (u *UserProfile) GetDefaultSubtitleLanguage() *string { + if u == nil { + return nil + } + return u.DefaultSubtitleLanguage +} + +func (u *UserProfile) GetDefaultSubtitleLanguages() []string { + if u == nil { + return nil + } + return u.DefaultSubtitleLanguages +} + +func (u *UserProfile) GetAutoSelectSubtitle() *AutoSelectSubtitle { + if u == nil { + return nil + } + return u.AutoSelectSubtitle +} + +func (u *UserProfile) GetDefaultSubtitleAccessibility() *DefaultSubtitleAccessibility { + if u == nil { + return nil + } + return u.DefaultSubtitleAccessibility +} + +func (u *UserProfile) GetDefaultSubtitleForced() *DefaultSubtitleForced { + if u == nil { + return nil + } + return u.DefaultSubtitleForced +} + +func (u *UserProfile) GetWatchedIndicator() *WatchedIndicator { + if u == nil { + return nil + } + return u.WatchedIndicator +} + +func (u *UserProfile) GetMediaReviewsVisibility() *MediaReviewsVisibility { + if u == nil { + return nil + } + return u.MediaReviewsVisibility +} + +func (u *UserProfile) GetMediaReviewsLanguages() []string { + if u == nil { + return nil + } + return u.MediaReviewsLanguages +} diff --git a/models/operations/adddownloadqueueitems.go b/models/operations/adddownloadqueueitems.go index 1948e38..6d9a36b 100644 --- a/models/operations/adddownloadqueueitems.go +++ b/models/operations/adddownloadqueueitems.go @@ -156,19 +156,19 @@ type AddDownloadQueueItemsRequest struct { // Target video number of audio channels. AudioChannelCount *int64 `queryParam:"style=form,explode=true,name=audioChannelCount"` // Indicates the client supports ABR. - AutoAdjustQuality *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustQuality"` + AutoAdjustQuality *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustQuality"` // Indicates if the server should adjust subtitles based on Voice Activity Data. - AutoAdjustSubtitle *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` + AutoAdjustSubtitle *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` // Indicates the client supports direct playing the indicated content. - DirectPlay *components.BoolInt `queryParam:"style=form,explode=true,name=directPlay"` + DirectPlay *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directPlay"` // Indicates the client supports direct streaming the video of the indicated content. - DirectStream *components.BoolInt `queryParam:"style=form,explode=true,name=directStream"` + DirectStream *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStream"` // Indicates the client supports direct streaming the audio of the indicated content. - DirectStreamAudio *components.BoolInt `queryParam:"style=form,explode=true,name=directStreamAudio"` + DirectStreamAudio *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStreamAudio"` // Indicates if resolution should be adjusted for orientation. - DisableResolutionRotation *components.BoolInt `queryParam:"style=form,explode=true,name=disableResolutionRotation"` + DisableResolutionRotation *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=disableResolutionRotation"` // Ignore client profiles when determining if direct play is possible. Only has an effect when directPlay=1 and both mediaIndex and partIndex are specified and neither are -1 - HasMDE *components.BoolInt `queryParam:"style=form,explode=true,name=hasMDE"` + HasMDE *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=hasMDE"` // Network type of the client, can be used to help determine target bitrate. Location *components.Location `queryParam:"style=form,explode=true,name=location"` // Buffer size used in playback (in KB). Clients should specify a lower bound if not known exactly. This value could make the difference between transcoding and direct play on bandwidth constrained networks. diff --git a/models/operations/addsection.go b/models/operations/addsection.go index ca0fbb4..d67702c 100644 --- a/models/operations/addsection.go +++ b/models/operations/addsection.go @@ -165,9 +165,9 @@ type AddSectionRequest struct { // The preferences for this section Prefs *QueryParamPrefs `queryParam:"style=deepObject,explode=true,name=prefs"` // If set, paths are relative to `Media Upload` path - Relative *components.BoolInt `queryParam:"style=form,explode=true,name=relative"` + Relative *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=relative"` // If set, import media from iTunes. - ImportFromiTunes *components.BoolInt `queryParam:"style=form,explode=true,name=importFromiTunes"` + ImportFromiTunes *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=importFromiTunes"` } func (a AddSectionRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/addsubtitles.go b/models/operations/addsubtitles.go index 1f5aa88..66c9466 100644 --- a/models/operations/addsubtitles.go +++ b/models/operations/addsubtitles.go @@ -151,8 +151,8 @@ type AddSubtitlesRequest struct { // The URL of the subtitle. If not provided, the contents of the subtitle must be in the post body URL *string `queryParam:"style=form,explode=true,name=url"` Format *string `queryParam:"style=form,explode=true,name=format"` - Forced *components.BoolInt `queryParam:"style=form,explode=true,name=forced"` - HearingImpaired *components.BoolInt `queryParam:"style=form,explode=true,name=hearingImpaired"` + Forced *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=forced"` + HearingImpaired *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=hearingImpaired"` } func (a AddSubtitlesRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/addtoplayqueue.go b/models/operations/addtoplayqueue.go index dcd883e..47b13eb 100644 --- a/models/operations/addtoplayqueue.go +++ b/models/operations/addtoplayqueue.go @@ -151,7 +151,7 @@ type AddToPlayQueueRequest struct { // The ID of the playlist to add to the playQueue. PlaylistID *string `queryParam:"style=form,explode=true,name=playlistID"` // Play this item next (defaults to 0 - queueing at the end of manually queued items). - Next *components.BoolInt `queryParam:"style=form,explode=true,name=next"` + Next *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=next"` } func (a AddToPlayQueueRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/applyupdates.go b/models/operations/applyupdates.go index 66de249..eabe8c0 100644 --- a/models/operations/applyupdates.go +++ b/models/operations/applyupdates.go @@ -145,9 +145,9 @@ type ApplyUpdatesRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // Indicate that you want the update to run during the next Butler execution. Omitting this or setting it to false indicates that the update should install immediately. - Tonight *components.BoolInt `queryParam:"style=form,explode=true,name=tonight"` + Tonight *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=tonight"` // Indicate that the latest version should be marked as skipped. The entry for this version will have the `state` set to `skipped`. - Skip *components.BoolInt `queryParam:"style=form,explode=true,name=skip"` + Skip *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=skip"` } func (a ApplyUpdatesRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/autocomplete.go b/models/operations/autocomplete.go index 5414851..7fa1ef6 100644 --- a/models/operations/autocomplete.go +++ b/models/operations/autocomplete.go @@ -150,7 +150,23 @@ type AutocompleteRequest struct { Type *int64 `queryParam:"style=form,explode=true,name=type"` // The "field" stands in for any field, the value is a partial string for matching FieldQuery *string `queryParam:"style=form,explode=true,name=field.query"` - // This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + // A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + // + // The query supports: + // - Fields: integer, boolean, tag, string, date, language + // - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + // - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + // - Sorting: sort parameter with :desc, :nullsLast modifiers + // - Grouping: group parameter + // - Limits: limit parameter + // + // Examples: + // - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + // - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + // - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + // + // See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. + // MediaQuery *components.MediaQuery `queryParam:"style=form,explode=true,name=mediaQuery"` } diff --git a/models/operations/checkupdates.go b/models/operations/checkupdates.go index 7e25e1e..8d8adb9 100644 --- a/models/operations/checkupdates.go +++ b/models/operations/checkupdates.go @@ -145,7 +145,7 @@ type CheckUpdatesRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // Indicate that you want to start download any updates found. - Download *components.BoolInt `queryParam:"style=form,explode=true,name=download"` + Download *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=download"` } func (c CheckUpdatesRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/createcollection.go b/models/operations/createcollection.go index a91bd1b..fb9321a 100644 --- a/models/operations/createcollection.go +++ b/models/operations/createcollection.go @@ -152,8 +152,21 @@ type CreateCollectionRequest struct { Smart *bool `queryParam:"style=form,explode=true,name=smart"` // The URI for processing the smart collection. Required for a smart collection URI *string `queryParam:"style=form,explode=true,name=uri"` - // The metadata type to filter by - Type *int64 `queryParam:"style=form,explode=true,name=type"` + // The type of media to retrieve or filter by. + // + // 1 = movie + // 2 = show + // 3 = season + // 4 = episode + // 5 = artist + // 6 = album + // 7 = track + // 8 = photo_album + // 9 = photo + // + // E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries + // + Type *components.MediaType `queryParam:"style=form,explode=true,name=type"` } func (c CreateCollectionRequest) MarshalJSON() ([]byte, error) { @@ -272,7 +285,7 @@ func (c *CreateCollectionRequest) GetURI() *string { return c.URI } -func (c *CreateCollectionRequest) GetType() *int64 { +func (c *CreateCollectionRequest) GetType() *components.MediaType { if c == nil { return nil } diff --git a/models/operations/createcustomhub.go b/models/operations/createcustomhub.go index 908301c..7a66ce0 100644 --- a/models/operations/createcustomhub.go +++ b/models/operations/createcustomhub.go @@ -149,11 +149,11 @@ type CreateCustomHubRequest struct { // The metadata item on which to base this hub. This must currently be a collection MetadataItemID int64 `queryParam:"style=form,explode=true,name=metadataItemId"` // Whether this hub should be displayed in recommended - PromotedToRecommended *components.BoolInt `queryParam:"style=form,explode=true,name=promotedToRecommended"` + PromotedToRecommended *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=promotedToRecommended"` // Whether this hub should be displayed in admin's home - PromotedToOwnHome *components.BoolInt `queryParam:"style=form,explode=true,name=promotedToOwnHome"` + PromotedToOwnHome *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=promotedToOwnHome"` // Whether this hub should be displayed in shared user's home - PromotedToSharedHome *components.BoolInt `queryParam:"style=form,explode=true,name=promotedToSharedHome"` + PromotedToSharedHome *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=promotedToSharedHome"` } func (c CreateCustomHubRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/createdownloadqueue.go b/models/operations/createdownloadqueue.go index cc39bf7..df048e7 100644 --- a/models/operations/createdownloadqueue.go +++ b/models/operations/createdownloadqueue.go @@ -8,26 +8,26 @@ import ( "net/http" ) -// Status - The state of this queue +// CreateDownloadQueueStatus - The state of this queue // - deciding: At least one item is still being decided // - waiting: At least one item is waiting for transcode and none are currently transcoding // - processing: At least one item is being transcoded // - done: All items are available (or potentially expired) // - error: At least one item has encountered an error -type Status string +type CreateDownloadQueueStatus string const ( - StatusDeciding Status = "deciding" - StatusWaiting Status = "waiting" - StatusProcessing Status = "processing" - StatusDone Status = "done" - StatusError Status = "error" + CreateDownloadQueueStatusDeciding CreateDownloadQueueStatus = "deciding" + CreateDownloadQueueStatusWaiting CreateDownloadQueueStatus = "waiting" + CreateDownloadQueueStatusProcessing CreateDownloadQueueStatus = "processing" + CreateDownloadQueueStatusDone CreateDownloadQueueStatus = "done" + CreateDownloadQueueStatusError CreateDownloadQueueStatus = "error" ) -func (e Status) ToPointer() *Status { +func (e CreateDownloadQueueStatus) ToPointer() *CreateDownloadQueueStatus { return &e } -func (e *Status) UnmarshalJSON(data []byte) error { +func (e *CreateDownloadQueueStatus) UnmarshalJSON(data []byte) error { var v string if err := json.Unmarshal(data, &v); err != nil { return err @@ -42,10 +42,10 @@ func (e *Status) UnmarshalJSON(data []byte) error { case "done": fallthrough case "error": - *e = Status(v) + *e = CreateDownloadQueueStatus(v) return nil default: - return fmt.Errorf("invalid value for Status: %v", v) + return fmt.Errorf("invalid value for CreateDownloadQueueStatus: %v", v) } } @@ -59,7 +59,7 @@ type DownloadQueue struct { // - done: All items are available (or potentially expired) // - error: At least one item has encountered an error // - Status *Status `json:"status,omitempty"` + Status *CreateDownloadQueueStatus `json:"status,omitempty"` } func (d *DownloadQueue) GetID() *int64 { @@ -76,7 +76,7 @@ func (d *DownloadQueue) GetItemCount() *int64 { return d.ItemCount } -func (d *DownloadQueue) GetStatus() *Status { +func (d *DownloadQueue) GetStatus() *CreateDownloadQueueStatus { if d == nil { return nil } diff --git a/models/operations/createplayqueue.go b/models/operations/createplayqueue.go index 7c89427..f1d9711 100644 --- a/models/operations/createplayqueue.go +++ b/models/operations/createplayqueue.go @@ -185,17 +185,17 @@ type CreatePlayQueueRequest struct { // The key of the first item to play, defaults to the first in the play queue. Key *string `queryParam:"style=form,explode=true,name=key"` // Whether to shuffle the playlist, defaults to 0. - Shuffle *components.BoolInt `queryParam:"style=form,explode=true,name=shuffle"` + Shuffle *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=shuffle"` // If the PQ is bigger than the window, fill any empty space with wraparound items, defaults to 0. - Repeat *components.BoolInt `queryParam:"style=form,explode=true,name=repeat"` + Repeat *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=repeat"` // Whether to create a continuous play queue (e.g. from an episode), defaults to 0. - Continuous *components.BoolInt `queryParam:"style=form,explode=true,name=continuous"` + Continuous *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=continuous"` // Number of trailers to prepend a movie with not including the pre-roll. If omitted the pre-roll will not be returned in the play queue. When resuming a movie `extrasPrefixCount` should be omitted as a parameter instead of passing 0. ExtrasPrefixCount *int64 `queryParam:"style=form,explode=true,name=extrasPrefixCount"` // Only applies to queues of type photo, whether to retrieve all descendent photos from an album or section, defaults to 1. - Recursive *components.BoolInt `queryParam:"style=form,explode=true,name=recursive"` + Recursive *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=recursive"` // Only applies to queues of type show or seasons, whether to return a queue that is started on the On Deck episode if one exists. Otherwise begins the play queue on the beginning of the show or season. - OnDeck *components.BoolInt `queryParam:"style=form,explode=true,name=onDeck"` + OnDeck *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=onDeck"` } func (c CreatePlayQueueRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/deletelibrarysection.go b/models/operations/deletelibrarysection.go index f4b7eea..e59314b 100644 --- a/models/operations/deletelibrarysection.go +++ b/models/operations/deletelibrarysection.go @@ -147,7 +147,7 @@ type DeleteLibrarySectionRequest struct { // The section identifier SectionID string `pathParam:"style=simple,explode=false,name=sectionId"` // If set, response will return an activity with the actual deletion process. Otherwise request will return when deletion is complete - Async *components.BoolInt `queryParam:"style=form,explode=true,name=async"` + Async *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=async"` } func (d DeleteLibrarySectionRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/deletemediaitem.go b/models/operations/deletemediaitem.go index 02e9fa0..a921a03 100644 --- a/models/operations/deletemediaitem.go +++ b/models/operations/deletemediaitem.go @@ -147,7 +147,7 @@ type DeleteMediaItemRequest struct { Ids string `pathParam:"style=simple,explode=false,name=ids"` MediaItem string `pathParam:"style=simple,explode=false,name=mediaItem"` // Whether proxy items, such as media optimized versions, should also be deleted. Defaults to false. - Proxy *components.BoolInt `queryParam:"style=form,explode=true,name=proxy"` + Proxy *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=proxy"` } func (d DeleteMediaItemRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/deletemetadataitem.go b/models/operations/deletemetadataitem.go index d72eed8..90e8242 100644 --- a/models/operations/deletemetadataitem.go +++ b/models/operations/deletemetadataitem.go @@ -146,7 +146,7 @@ type DeleteMetadataItemRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids string `pathParam:"style=simple,explode=false,name=ids"` // Whether proxy items, such as media optimized versions, should also be deleted. Defaults to false. - Proxy *components.BoolInt `queryParam:"style=form,explode=true,name=proxy"` + Proxy *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=proxy"` } func (d DeleteMetadataItemRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/detectcredits.go b/models/operations/detectcredits.go index c26e02b..4bc0d11 100644 --- a/models/operations/detectcredits.go +++ b/models/operations/detectcredits.go @@ -145,8 +145,8 @@ type DetectCreditsRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids string `pathParam:"style=simple,explode=false,name=ids"` - Force *components.BoolInt `queryParam:"style=form,explode=true,name=force"` - Manual *components.BoolInt `queryParam:"style=form,explode=true,name=manual"` + Force *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=force"` + Manual *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=manual"` } func (d DetectCreditsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/detectintros.go b/models/operations/detectintros.go index 07e7586..8df0f3d 100644 --- a/models/operations/detectintros.go +++ b/models/operations/detectintros.go @@ -146,7 +146,7 @@ type DetectIntrosRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids string `pathParam:"style=simple,explode=false,name=ids"` // Indicate whether detection should be re-run - Force *components.BoolInt `queryParam:"style=form,explode=true,name=force"` + Force *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=force"` // The threshold for determining if content is an intro or not Threshold *float64 `queryParam:"style=form,explode=true,name=threshold"` } diff --git a/models/operations/detectvoiceactivity.go b/models/operations/detectvoiceactivity.go index 5a11103..45208e2 100644 --- a/models/operations/detectvoiceactivity.go +++ b/models/operations/detectvoiceactivity.go @@ -146,9 +146,9 @@ type DetectVoiceActivityRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids string `pathParam:"style=simple,explode=false,name=ids"` // Indicate whether detection should be re-run - Force *components.BoolInt `queryParam:"style=form,explode=true,name=force"` + Force *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=force"` // Indicate whether detection is manually run - Manual *components.BoolInt `queryParam:"style=form,explode=true,name=manual"` + Manual *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=manual"` } func (d DetectVoiceActivityRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/generatethumbs.go b/models/operations/generatethumbs.go index 3cad8b8..1bb0411 100644 --- a/models/operations/generatethumbs.go +++ b/models/operations/generatethumbs.go @@ -145,7 +145,7 @@ type GenerateThumbsRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids string `pathParam:"style=simple,explode=false,name=ids"` - Force *components.BoolInt `queryParam:"style=form,explode=true,name=force"` + Force *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=force"` } func (g GenerateThumbsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getallhubs.go b/models/operations/getallhubs.go index 222d2c9..d5da1e0 100644 --- a/models/operations/getallhubs.go +++ b/models/operations/getallhubs.go @@ -147,7 +147,7 @@ type GetAllHubsRequest struct { // Limit results to count items Count *int64 `queryParam:"style=form,explode=true,name=count"` // Only return hubs which are "transient", meaning those which are prone to changing after media playback or addition (e.g. On Deck, or Recently Added) - OnlyTransient *components.BoolInt `queryParam:"style=form,explode=true,name=onlyTransient"` + OnlyTransient *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=onlyTransient"` // If provided, limit to only specified hubs Identifier []string `queryParam:"style=form,explode=true,name=identifier"` } diff --git a/models/operations/getallsubscriptions.go b/models/operations/getallsubscriptions.go index 9b23ebc..d5f765c 100644 --- a/models/operations/getallsubscriptions.go +++ b/models/operations/getallsubscriptions.go @@ -145,9 +145,9 @@ type GetAllSubscriptionsRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // Indicates whether the active grabs should be included as well - IncludeGrabs *components.BoolInt `queryParam:"style=form,explode=true,name=includeGrabs"` + IncludeGrabs *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeGrabs"` // Compute the storage of recorded items desired by this subscription - IncludeStorage *components.BoolInt `queryParam:"style=form,explode=true,name=includeStorage"` + IncludeStorage *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeStorage"` } func (g GetAllSubscriptionsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getaugmentationstatus.go b/models/operations/getaugmentationstatus.go index a109c49..90a9a56 100644 --- a/models/operations/getaugmentationstatus.go +++ b/models/operations/getaugmentationstatus.go @@ -147,7 +147,7 @@ type GetAugmentationStatusRequest struct { // The id of the augmentation AugmentationID string `pathParam:"style=simple,explode=false,name=augmentationId"` // Wait for augmentation completion before returning - Wait *components.BoolInt `queryParam:"style=form,explode=true,name=wait"` + Wait *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=wait"` } func (g GetAugmentationStatusRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getcollections.go b/models/operations/getcollections.go index da580e1..835235b 100644 --- a/models/operations/getcollections.go +++ b/models/operations/getcollections.go @@ -146,7 +146,23 @@ type GetCollectionsRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // Section identifier SectionID int64 `pathParam:"style=simple,explode=false,name=sectionId"` - // This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + // A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + // + // The query supports: + // - Fields: integer, boolean, tag, string, date, language + // - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + // - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + // - Sorting: sort parameter with :desc, :nullsLast modifiers + // - Grouping: group parameter + // - Limits: limit parameter + // + // Examples: + // - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + // - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + // - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + // + // See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. + // MediaQuery *components.MediaQuery `queryParam:"style=form,explode=true,name=mediaQuery"` } diff --git a/models/operations/getcommon.go b/models/operations/getcommon.go index f1619e2..0af5130 100644 --- a/models/operations/getcommon.go +++ b/models/operations/getcommon.go @@ -148,7 +148,23 @@ type GetCommonRequest struct { SectionID int64 `pathParam:"style=simple,explode=false,name=sectionId"` // Item type Type *int64 `queryParam:"style=form,explode=true,name=type"` - // This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + // A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + // + // The query supports: + // - Fields: integer, boolean, tag, string, date, language + // - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + // - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + // - Sorting: sort parameter with :desc, :nullsLast modifiers + // - Grouping: group parameter + // - Limits: limit parameter + // + // Examples: + // - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + // - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + // - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + // + // See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. + // MediaQuery *components.MediaQuery `queryParam:"style=form,explode=true,name=mediaQuery"` } diff --git a/models/operations/getfirstcharacters.go b/models/operations/getfirstcharacters.go index 3fbfead..3e64c16 100644 --- a/models/operations/getfirstcharacters.go +++ b/models/operations/getfirstcharacters.go @@ -150,7 +150,23 @@ type GetFirstCharactersRequest struct { Type *int64 `queryParam:"style=form,explode=true,name=type"` // The metadata type to filter on Sort *int64 `queryParam:"style=form,explode=true,name=sort"` - // This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + // A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + // + // The query supports: + // - Fields: integer, boolean, tag, string, date, language + // - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + // - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + // - Sorting: sort parameter with :desc, :nullsLast modifiers + // - Grouping: group parameter + // - Limits: limit parameter + // + // Examples: + // - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + // - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + // - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + // + // See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. + // MediaQuery *components.MediaQuery `queryParam:"style=form,explode=true,name=mediaQuery"` } diff --git a/models/operations/getimage.go b/models/operations/getimage.go index bfb1edc..5a1efb3 100644 --- a/models/operations/getimage.go +++ b/models/operations/getimage.go @@ -158,7 +158,7 @@ type GetImageRequest struct { // Height in pixels for the image. Height *int64 `queryParam:"style=form,explode=true,name=height"` // Whether to add noise to the ouput image. Noise can reduce color banding with the gradients. Image sizes with noise will be larger. - Noise *components.BoolInt `queryParam:"style=form,explode=true,name=noise"` + Noise *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=noise"` } func (g GetImageRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getlibrarydetails.go b/models/operations/getlibrarydetails.go index d92cc5a..e2c0d24 100644 --- a/models/operations/getlibrarydetails.go +++ b/models/operations/getlibrarydetails.go @@ -147,7 +147,7 @@ type GetLibraryDetailsRequest struct { // The section identifier SectionID string `pathParam:"style=simple,explode=false,name=sectionId"` // Whether or not to include details for a section (types, filters, and sorts). Only exists for backwards compatibility, media providers other than the server libraries have it on always. - IncludeDetails *components.BoolInt `queryParam:"style=form,explode=true,name=includeDetails"` + IncludeDetails *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeDetails"` } func (g GetLibraryDetailsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getlibraryitems.go b/models/operations/getlibraryitems.go index ef0596e..a807f5c 100644 --- a/models/operations/getlibraryitems.go +++ b/models/operations/getlibraryitems.go @@ -144,7 +144,23 @@ type GetLibraryItemsRequest struct { DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` - // This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + // A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + // + // The query supports: + // - Fields: integer, boolean, tag, string, date, language + // - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + // - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + // - Sorting: sort parameter with :desc, :nullsLast modifiers + // - Grouping: group parameter + // - Limits: limit parameter + // + // Examples: + // - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + // - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + // - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + // + // See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. + // MediaQuery *components.MediaQuery `queryParam:"style=form,explode=true,name=mediaQuery"` } diff --git a/models/operations/getlibrarymatches.go b/models/operations/getlibrarymatches.go index 97c36ee..9ad8591 100644 --- a/models/operations/getlibrarymatches.go +++ b/models/operations/getlibrarymatches.go @@ -144,11 +144,24 @@ type GetLibraryMatchesRequest struct { DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` - // The metadata type to filter by - Type *int64 `queryParam:"style=form,explode=true,name=type"` - IncludeFullMetadata *components.BoolInt `queryParam:"style=form,explode=true,name=includeFullMetadata"` - IncludeAncestorMetadata *components.BoolInt `queryParam:"style=form,explode=true,name=includeAncestorMetadata"` - IncludeAlternateMetadataSources *components.BoolInt `queryParam:"style=form,explode=true,name=includeAlternateMetadataSources"` + // The type of media to retrieve or filter by. + // + // 1 = movie + // 2 = show + // 3 = season + // 4 = episode + // 5 = artist + // 6 = album + // 7 = track + // 8 = photo_album + // 9 = photo + // + // E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries + // + Type *components.MediaType `queryParam:"style=form,explode=true,name=type"` + IncludeFullMetadata *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeFullMetadata"` + IncludeAncestorMetadata *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeAncestorMetadata"` + IncludeAlternateMetadataSources *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeAlternateMetadataSources"` // Used for movies, shows, artists, albums, and tracks. Allowed for various URI schemes, to be defined. GUID *string `queryParam:"style=form,explode=true,name=guid"` // The title to filter by or assign @@ -259,7 +272,7 @@ func (g *GetLibraryMatchesRequest) GetMarketplace() *string { return g.Marketplace } -func (g *GetLibraryMatchesRequest) GetType() *int64 { +func (g *GetLibraryMatchesRequest) GetType() *components.MediaType { if g == nil { return nil } diff --git a/models/operations/getmediapart.go b/models/operations/getmediapart.go index 0f833e3..8714ae8 100644 --- a/models/operations/getmediapart.go +++ b/models/operations/getmediapart.go @@ -151,7 +151,7 @@ type GetMediaPartRequest struct { // A generic filename used for a client media stack which relies on the extension in the request. Provided in the `key` for the part Filename string `pathParam:"style=simple,explode=false,name=filename"` // Whether this is a file download - Download *components.BoolInt `queryParam:"style=form,explode=true,name=download"` + Download *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=download"` } func (g GetMediaPartRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getmetadatahubs.go b/models/operations/getmetadatahubs.go index 886e3ae..fac7570 100644 --- a/models/operations/getmetadatahubs.go +++ b/models/operations/getmetadatahubs.go @@ -149,7 +149,7 @@ type GetMetadataHubsRequest struct { // Limit results to count items Count *int64 `queryParam:"style=form,explode=true,name=count"` // Only return hubs which are "transient", meaning those which are prone to changing after media playback or addition (e.g. On Deck, or Recently Added) - OnlyTransient *components.BoolInt `queryParam:"style=form,explode=true,name=onlyTransient"` + OnlyTransient *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=onlyTransient"` } func (g GetMetadataHubsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getmetadataitem.go b/models/operations/getmetadataitem.go index ff7482a..649e616 100644 --- a/models/operations/getmetadataitem.go +++ b/models/operations/getmetadataitem.go @@ -146,21 +146,21 @@ type GetMetadataItemRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids []string `pathParam:"style=simple,explode=false,name=ids"` // Determines if file check should be performed asynchronously. An activity is created to indicate progress. Default is false. - AsyncCheckFiles *components.BoolInt `queryParam:"style=form,explode=true,name=asyncCheckFiles"` + AsyncCheckFiles *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=asyncCheckFiles"` // Determines if local media agent refresh should be performed asynchronously. An activity is created to indicate progress. Default is false. - AsyncRefreshLocalMediaAgent *components.BoolInt `queryParam:"style=form,explode=true,name=asyncRefreshLocalMediaAgent"` + AsyncRefreshLocalMediaAgent *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=asyncRefreshLocalMediaAgent"` // Determines if analysis refresh should be performed asynchronously. An activity is created to indicate progress. Default is false. - AsyncRefreshAnalysis *components.BoolInt `queryParam:"style=form,explode=true,name=asyncRefreshAnalysis"` + AsyncRefreshAnalysis *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=asyncRefreshAnalysis"` // Determines if file check should be performed synchronously. Specifying `asyncCheckFiles` will cause this option to be ignored. Default is false. - CheckFiles *components.BoolInt `queryParam:"style=form,explode=true,name=checkFiles"` + CheckFiles *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=checkFiles"` // Determines if synchronous local media agent and analysis refresh should be skipped. Specifying async versions will cause synchronous versions to be skipped. Default is false. - SkipRefresh *components.BoolInt `queryParam:"style=form,explode=true,name=skipRefresh"` + SkipRefresh *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=skipRefresh"` // Determines if file existence check should be performed synchronously. Specifying `checkFiles` will imply this option. Default is false. - CheckFileAvailability *components.BoolInt `queryParam:"style=form,explode=true,name=checkFileAvailability"` + CheckFileAvailability *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=checkFileAvailability"` // Add metadata augmentations. An activity is created to indicate progress. Option will be ignored if specified by non-admin or if multiple metadata items are requested. Default is false. - AsyncAugmentMetadata *components.BoolInt `queryParam:"style=form,explode=true,name=asyncAugmentMetadata"` + AsyncAugmentMetadata *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=asyncAugmentMetadata"` // Number of augmentations to add. Requires `asyncAugmentMetadata` to be specified. - AugmentCount *components.BoolInt `queryParam:"style=form,explode=true,name=augmentCount"` + AugmentCount *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=augmentCount"` } func (g GetMetadataItemRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getplaylistgeneratoritems.go b/models/operations/getplaylistgeneratoritems.go index 3d8a3d7..338ea84 100644 --- a/models/operations/getplaylistgeneratoritems.go +++ b/models/operations/getplaylistgeneratoritems.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo/types" "net/http" ) @@ -254,6 +255,19 @@ func (g *GetPlaylistGeneratorItemsRequest) GetGeneratorID() int64 { return g.GeneratorID } +type GetPlaylistGeneratorItemsGuids struct { + // The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + // + ID string `json:"id"` +} + +func (g *GetPlaylistGeneratorItemsGuids) GetID() string { + if g == nil { + return "" + } + return g.ID +} + // ProcessingState - The state of processing if this generator is part of an optimizer playlist type ProcessingState string @@ -357,37 +371,41 @@ func (e *ProcessingStateContext) UnmarshalJSON(data []byte) error { // Metadata items can often live in a hierarchy with relationships between them. For example, the metadata item for an episodes is associated with a season metadata item which is associated with a show metadata item. A similar hierarchy exists with track, album, and artist and photos and photo album. The relationships may be expressed via relative terms and absolute terms. For example, "leaves" refer to metadata items which has associated media (there is no media for a season nor show). A show will have "children" in the form of seasons and a season will have "children" in the form of episodes and episodes have "parent" in the form of a season which has a "parent" in the form of a show. Similarly, a show has "grandchildren" in the form of episodse and an episode has a "grandparent" in the form of a show. type GetPlaylistGeneratorItemsMetadata struct { // The title of the item (e.g. “300” or “The Simpsons”) - Title any `json:"title,omitempty"` + Title string `json:"title"` // The type of the video item, such as `movie`, `episode`, or `clip`. - Type any `json:"type,omitempty"` + Type string `json:"type"` // When present, contains the disc number for a track on multi-disc albums. - AbsoluteIndex *int64 `json:"absoluteIndex,omitempty"` + AbsoluteIndex *int `json:"absoluteIndex,omitempty"` // In units of seconds since the epoch, returns the time at which the item was added to the library. - AddedAt *int64 `json:"addedAt,omitempty"` + AddedAt int64 `json:"addedAt"` // When present, the URL for the background artwork for the item. - Art any `json:"art,omitempty"` + Art *string `json:"art,omitempty"` // Some rating systems separate reviewer ratings from audience ratings - AudienceRating *float64 `json:"audienceRating,omitempty"` + AudienceRating *float32 `json:"audienceRating,omitempty"` // A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). - AudienceRatingImage any `json:"audienceRatingImage,omitempty"` + AudienceRatingImage *string `json:"audienceRatingImage,omitempty"` Autotag []components.Tag `json:"Autotag,omitempty"` // When present, the URL for a banner graphic for the item. - Banner any `json:"banner,omitempty"` + Banner *string `json:"banner,omitempty"` // When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). - ChapterSource any `json:"chapterSource,omitempty"` + ChapterSource *string `json:"chapterSource,omitempty"` + // The number of child items associated with this media item. + ChildCount *int `json:"childCount,omitempty"` // When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). - Composite any `json:"composite,omitempty"` + Composite *string `json:"composite,omitempty"` // If known, the content rating (e.g. MPAA) for an item. - ContentRating any `json:"contentRating,omitempty"` + ContentRating *string `json:"contentRating,omitempty"` Country []components.Tag `json:"Country,omitempty"` Director []components.Tag `json:"Director,omitempty"` // When present, the duration for the item, in units of milliseconds. - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` // Typically only seen in metadata at a library's top level Filter []components.Filter `json:"Filter,omitempty"` Genre []components.Tag `json:"Genre,omitempty"` // The `art` of the grandparent GrandparentArt *string `json:"grandparentArt,omitempty"` + // The GUID of the grandparent media item. + GrandparentGUID *string `json:"grandparentGuid,omitempty"` // The `hero` of the grandparent GrandparentHero *string `json:"grandparentHero,omitempty"` // The `key` of the grandparent @@ -399,28 +417,31 @@ type GetPlaylistGeneratorItemsMetadata struct { // The `thumb` of the grandparent GrandparentThumb *string `json:"grandparentThumb,omitempty"` // The `title` of the grandparent - GrandparentTitle *string `json:"grandparentTitle,omitempty"` - GUID []components.Tag `json:"Guid,omitempty"` + GrandparentTitle *string `json:"grandparentTitle,omitempty"` + // The globally unique identifier for the media item. + GUID *string `json:"guid,omitempty"` + Guids []GetPlaylistGeneratorItemsGuids `json:"Guid,omitempty"` // When present, the URL for a hero image for the item. - Hero any `json:"hero,omitempty"` + Hero *string `json:"hero,omitempty"` Image []components.Image `json:"Image,omitempty"` // When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. - Index *int64 `json:"index,omitempty"` + Index *int `json:"index,omitempty"` // The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. - Key any `json:"key,omitempty"` - // When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. + Key string `json:"key"` LastViewedAt *int64 `json:"lastViewedAt,omitempty"` // For shows and seasons, contains the number of total episodes. - LeafCount *int64 `json:"leafCount,omitempty"` + LeafCount *int `json:"leafCount,omitempty"` Media []components.Media `json:"Media,omitempty"` // When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. - OriginallyAvailableAt any `json:"originallyAvailableAt,omitempty"` + OriginallyAvailableAt *types.Date `json:"originallyAvailableAt,omitempty"` // When present, used to indicate an item's original title, e.g. a movie's foreign title. - OriginalTitle any `json:"originalTitle,omitempty"` + OriginalTitle *string `json:"originalTitle,omitempty"` + // The GUID of the parent media item. + ParentGUID *string `json:"parentGuid,omitempty"` // The `hero` of the parent ParentHero *string `json:"parentHero,omitempty"` // The `index` of the parent - ParentIndex *int64 `json:"parentIndex,omitempty"` + ParentIndex *int `json:"parentIndex,omitempty"` // The `key` of the parent ParentKey *string `json:"parentKey,omitempty"` // The `ratingKey` of the parent @@ -430,18 +451,18 @@ type GetPlaylistGeneratorItemsMetadata struct { // The `title` of the parent ParentTitle *string `json:"parentTitle,omitempty"` // Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. - PrimaryExtraKey any `json:"primaryExtraKey,omitempty"` + PrimaryExtraKey *string `json:"primaryExtraKey,omitempty"` // Prompt to give the user for this directory (such as `Search Movies`) Prompt *string `json:"prompt,omitempty"` // When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. - Rating *float64 `json:"rating,omitempty"` + Rating *float32 `json:"rating,omitempty"` RatingArray []components.Tag `json:"Rating,omitempty"` // Number of ratings under this metadata - RatingCount *int64 `json:"ratingCount,omitempty"` + RatingCount *int `json:"ratingCount,omitempty"` // When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. - RatingImage any `json:"ratingImage,omitempty"` + RatingImage *string `json:"ratingImage,omitempty"` // This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. - RatingKey any `json:"ratingKey,omitempty"` + RatingKey *string `json:"ratingKey,omitempty"` Role []components.Tag `json:"Role,omitempty"` // Indicates this is a search directory Search *bool `json:"search,omitempty"` @@ -454,32 +475,32 @@ type GetPlaylistGeneratorItemsMetadata struct { // Typically only seen in metadata at a library's top level Sort []components.Sort `json:"Sort,omitempty"` // When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). - Studio any `json:"studio,omitempty"` + Studio *string `json:"studio,omitempty"` // The subtype of the video item, such as `photo` when the video item is in a photo library - Subtype any `json:"subtype,omitempty"` + Subtype *string `json:"subtype,omitempty"` // When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). - Summary any `json:"summary,omitempty"` + Summary *string `json:"summary,omitempty"` // When present, a pithy one-liner about the item (usually only seen for movies). - Tagline any `json:"tagline,omitempty"` + Tagline *string `json:"tagline,omitempty"` // When present, the URL for theme music for the item (usually only for TV shows). - Theme any `json:"theme,omitempty"` + Theme *string `json:"theme,omitempty"` // When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. - Thumb any `json:"thumb,omitempty"` + Thumb *string `json:"thumb,omitempty"` // Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). - TitleSort any `json:"titleSort,omitempty"` + TitleSort *string `json:"titleSort,omitempty"` // In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). UpdatedAt *int64 `json:"updatedAt,omitempty"` // When the user has rated an item, this contains the user rating - UserRating *float64 `json:"userRating,omitempty"` + UserRating *float32 `json:"userRating,omitempty"` // When a users has completed watched or listened to an item, this attribute contains the number of consumptions. - ViewCount *int64 `json:"viewCount,omitempty"` + ViewCount *int `json:"viewCount,omitempty"` // For shows and seasons, contains the number of viewed episodes. - ViewedLeafCount *int64 `json:"viewedLeafCount,omitempty"` + ViewedLeafCount *int `json:"viewedLeafCount,omitempty"` // When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. - ViewOffset *int64 `json:"viewOffset,omitempty"` + ViewOffset *int `json:"viewOffset,omitempty"` Writer []components.Tag `json:"Writer,omitempty"` // When present, the year associated with the item's release (e.g. release year for a movie). - Year *int64 `json:"year,omitempty"` + Year *int `json:"year,omitempty"` // The state of processing if this generator is part of an optimizer playlist ProcessingState *ProcessingState `json:"processingState,omitempty"` // The error which could have occurred (or `good`) @@ -492,55 +513,55 @@ func (g GetPlaylistGeneratorItemsMetadata) MarshalJSON() ([]byte, error) { } func (g *GetPlaylistGeneratorItemsMetadata) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &g, "", false, []string{"title", "type", "addedAt", "key"}); err != nil { return err } return nil } -func (g *GetPlaylistGeneratorItemsMetadata) GetTitle() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetTitle() string { if g == nil { - return nil + return "" } return g.Title } -func (g *GetPlaylistGeneratorItemsMetadata) GetType() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetType() string { if g == nil { - return nil + return "" } return g.Type } -func (g *GetPlaylistGeneratorItemsMetadata) GetAbsoluteIndex() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetAbsoluteIndex() *int { if g == nil { return nil } return g.AbsoluteIndex } -func (g *GetPlaylistGeneratorItemsMetadata) GetAddedAt() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetAddedAt() int64 { if g == nil { - return nil + return 0 } return g.AddedAt } -func (g *GetPlaylistGeneratorItemsMetadata) GetArt() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetArt() *string { if g == nil { return nil } return g.Art } -func (g *GetPlaylistGeneratorItemsMetadata) GetAudienceRating() *float64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetAudienceRating() *float32 { if g == nil { return nil } return g.AudienceRating } -func (g *GetPlaylistGeneratorItemsMetadata) GetAudienceRatingImage() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetAudienceRatingImage() *string { if g == nil { return nil } @@ -554,28 +575,35 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetAutotag() []components.Tag { return g.Autotag } -func (g *GetPlaylistGeneratorItemsMetadata) GetBanner() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetBanner() *string { if g == nil { return nil } return g.Banner } -func (g *GetPlaylistGeneratorItemsMetadata) GetChapterSource() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetChapterSource() *string { if g == nil { return nil } return g.ChapterSource } -func (g *GetPlaylistGeneratorItemsMetadata) GetComposite() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetChildCount() *int { + if g == nil { + return nil + } + return g.ChildCount +} + +func (g *GetPlaylistGeneratorItemsMetadata) GetComposite() *string { if g == nil { return nil } return g.Composite } -func (g *GetPlaylistGeneratorItemsMetadata) GetContentRating() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetContentRating() *string { if g == nil { return nil } @@ -596,7 +624,7 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetDirector() []components.Tag { return g.Director } -func (g *GetPlaylistGeneratorItemsMetadata) GetDuration() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetDuration() *int { if g == nil { return nil } @@ -624,6 +652,13 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetGrandparentArt() *string { return g.GrandparentArt } +func (g *GetPlaylistGeneratorItemsMetadata) GetGrandparentGUID() *string { + if g == nil { + return nil + } + return g.GrandparentGUID +} + func (g *GetPlaylistGeneratorItemsMetadata) GetGrandparentHero() *string { if g == nil { return nil @@ -666,14 +701,21 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetGrandparentTitle() *string { return g.GrandparentTitle } -func (g *GetPlaylistGeneratorItemsMetadata) GetGUID() []components.Tag { +func (g *GetPlaylistGeneratorItemsMetadata) GetGUID() *string { if g == nil { return nil } return g.GUID } -func (g *GetPlaylistGeneratorItemsMetadata) GetHero() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetGuids() []GetPlaylistGeneratorItemsGuids { + if g == nil { + return nil + } + return g.Guids +} + +func (g *GetPlaylistGeneratorItemsMetadata) GetHero() *string { if g == nil { return nil } @@ -687,16 +729,16 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetImage() []components.Image { return g.Image } -func (g *GetPlaylistGeneratorItemsMetadata) GetIndex() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetIndex() *int { if g == nil { return nil } return g.Index } -func (g *GetPlaylistGeneratorItemsMetadata) GetKey() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetKey() string { if g == nil { - return nil + return "" } return g.Key } @@ -708,7 +750,7 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetLastViewedAt() *int64 { return g.LastViewedAt } -func (g *GetPlaylistGeneratorItemsMetadata) GetLeafCount() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetLeafCount() *int { if g == nil { return nil } @@ -722,20 +764,27 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetMedia() []components.Media { return g.Media } -func (g *GetPlaylistGeneratorItemsMetadata) GetOriginallyAvailableAt() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetOriginallyAvailableAt() *types.Date { if g == nil { return nil } return g.OriginallyAvailableAt } -func (g *GetPlaylistGeneratorItemsMetadata) GetOriginalTitle() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetOriginalTitle() *string { if g == nil { return nil } return g.OriginalTitle } +func (g *GetPlaylistGeneratorItemsMetadata) GetParentGUID() *string { + if g == nil { + return nil + } + return g.ParentGUID +} + func (g *GetPlaylistGeneratorItemsMetadata) GetParentHero() *string { if g == nil { return nil @@ -743,7 +792,7 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetParentHero() *string { return g.ParentHero } -func (g *GetPlaylistGeneratorItemsMetadata) GetParentIndex() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetParentIndex() *int { if g == nil { return nil } @@ -778,7 +827,7 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetParentTitle() *string { return g.ParentTitle } -func (g *GetPlaylistGeneratorItemsMetadata) GetPrimaryExtraKey() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetPrimaryExtraKey() *string { if g == nil { return nil } @@ -792,7 +841,7 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetPrompt() *string { return g.Prompt } -func (g *GetPlaylistGeneratorItemsMetadata) GetRating() *float64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetRating() *float32 { if g == nil { return nil } @@ -806,21 +855,21 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetRatingArray() []components.Tag { return g.RatingArray } -func (g *GetPlaylistGeneratorItemsMetadata) GetRatingCount() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetRatingCount() *int { if g == nil { return nil } return g.RatingCount } -func (g *GetPlaylistGeneratorItemsMetadata) GetRatingImage() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetRatingImage() *string { if g == nil { return nil } return g.RatingImage } -func (g *GetPlaylistGeneratorItemsMetadata) GetRatingKey() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetRatingKey() *string { if g == nil { return nil } @@ -869,49 +918,49 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetSort() []components.Sort { return g.Sort } -func (g *GetPlaylistGeneratorItemsMetadata) GetStudio() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetStudio() *string { if g == nil { return nil } return g.Studio } -func (g *GetPlaylistGeneratorItemsMetadata) GetSubtype() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetSubtype() *string { if g == nil { return nil } return g.Subtype } -func (g *GetPlaylistGeneratorItemsMetadata) GetSummary() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetSummary() *string { if g == nil { return nil } return g.Summary } -func (g *GetPlaylistGeneratorItemsMetadata) GetTagline() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetTagline() *string { if g == nil { return nil } return g.Tagline } -func (g *GetPlaylistGeneratorItemsMetadata) GetTheme() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetTheme() *string { if g == nil { return nil } return g.Theme } -func (g *GetPlaylistGeneratorItemsMetadata) GetThumb() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetThumb() *string { if g == nil { return nil } return g.Thumb } -func (g *GetPlaylistGeneratorItemsMetadata) GetTitleSort() any { +func (g *GetPlaylistGeneratorItemsMetadata) GetTitleSort() *string { if g == nil { return nil } @@ -925,28 +974,28 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetUpdatedAt() *int64 { return g.UpdatedAt } -func (g *GetPlaylistGeneratorItemsMetadata) GetUserRating() *float64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetUserRating() *float32 { if g == nil { return nil } return g.UserRating } -func (g *GetPlaylistGeneratorItemsMetadata) GetViewCount() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetViewCount() *int { if g == nil { return nil } return g.ViewCount } -func (g *GetPlaylistGeneratorItemsMetadata) GetViewedLeafCount() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetViewedLeafCount() *int { if g == nil { return nil } return g.ViewedLeafCount } -func (g *GetPlaylistGeneratorItemsMetadata) GetViewOffset() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetViewOffset() *int { if g == nil { return nil } @@ -960,7 +1009,7 @@ func (g *GetPlaylistGeneratorItemsMetadata) GetWriter() []components.Tag { return g.Writer } -func (g *GetPlaylistGeneratorItemsMetadata) GetYear() *int64 { +func (g *GetPlaylistGeneratorItemsMetadata) GetYear() *int { if g == nil { return nil } diff --git a/models/operations/getplayqueue.go b/models/operations/getplayqueue.go index e9e340f..27f02db 100644 --- a/models/operations/getplayqueue.go +++ b/models/operations/getplayqueue.go @@ -147,15 +147,15 @@ type GetPlayQueueRequest struct { // The ID of the play queue. PlayQueueID int64 `pathParam:"style=simple,explode=false,name=playQueueId"` // If the server should transfer ownership to the requesting client (used in remote control scenarios). - Own *components.BoolInt `queryParam:"style=form,explode=true,name=own"` + Own *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=own"` // The play queue item ID for the center of the window - this doesn't change the current selected item. Center *string `queryParam:"style=form,explode=true,name=center"` // How many items on each side of the center of the window Window *int64 `queryParam:"style=form,explode=true,name=window"` // Whether to include the items before the center (if 0, center is not included either), defaults to 1. - IncludeBefore *components.BoolInt `queryParam:"style=form,explode=true,name=includeBefore"` + IncludeBefore *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeBefore"` // Whether to include the items after the center (if 0, center is not included either), defaults to 1. - IncludeAfter *components.BoolInt `queryParam:"style=form,explode=true,name=includeAfter"` + IncludeAfter *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeAfter"` } func (g GetPlayQueueRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getpostplayhubs.go b/models/operations/getpostplayhubs.go index af2fff7..5c228cf 100644 --- a/models/operations/getpostplayhubs.go +++ b/models/operations/getpostplayhubs.go @@ -149,7 +149,7 @@ type GetPostplayHubsRequest struct { // Limit results to count items Count *int64 `queryParam:"style=form,explode=true,name=count"` // Only return hubs which are "transient", meaning those which are prone to changing after media playback or addition (e.g. On Deck, or Recently Added) - OnlyTransient *components.BoolInt `queryParam:"style=form,explode=true,name=onlyTransient"` + OnlyTransient *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=onlyTransient"` } func (g GetPostplayHubsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getrelatedhubs.go b/models/operations/getrelatedhubs.go index 4e623e2..2d41192 100644 --- a/models/operations/getrelatedhubs.go +++ b/models/operations/getrelatedhubs.go @@ -149,7 +149,7 @@ type GetRelatedHubsRequest struct { // Limit results to count items Count *int64 `queryParam:"style=form,explode=true,name=count"` // Only return hubs which are "transient", meaning those which are prone to changing after media playback or addition (e.g. On Deck, or Recently Added) - OnlyTransient *components.BoolInt `queryParam:"style=form,explode=true,name=onlyTransient"` + OnlyTransient *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=onlyTransient"` } func (g GetRelatedHubsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getsectionhubs.go b/models/operations/getsectionhubs.go index 1ce7618..912999d 100644 --- a/models/operations/getsectionhubs.go +++ b/models/operations/getsectionhubs.go @@ -149,7 +149,7 @@ type GetSectionHubsRequest struct { // Limit results to count items Count *int64 `queryParam:"style=form,explode=true,name=count"` // Only return hubs which are "transient", meaning those which are prone to changing after media playback or addition (e.g. On Deck, or Recently Added) - OnlyTransient *components.BoolInt `queryParam:"style=form,explode=true,name=onlyTransient"` + OnlyTransient *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=onlyTransient"` } func (g GetSectionHubsRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getsectionimage.go b/models/operations/getsectionimage.go index e2c4c0c..f7528b3 100644 --- a/models/operations/getsectionimage.go +++ b/models/operations/getsectionimage.go @@ -148,7 +148,23 @@ type GetSectionImageRequest struct { SectionID int64 `pathParam:"style=simple,explode=false,name=sectionId"` // The update time of the image. Used for busting cache. UpdatedAt int64 `pathParam:"style=simple,explode=false,name=updatedAt"` - // This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + // A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + // + // The query supports: + // - Fields: integer, boolean, tag, string, date, language + // - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + // - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + // - Sorting: sort parameter with :desc, :nullsLast modifiers + // - Grouping: group parameter + // - Limits: limit parameter + // + // Examples: + // - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + // - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + // - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + // + // See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. + // MediaQuery *components.MediaQuery `queryParam:"style=form,explode=true,name=mediaQuery"` Composite *components.Composite `queryParam:"style=form,explode=true,name=composite"` } diff --git a/models/operations/getserverresources.go b/models/operations/getserverresources.go new file mode 100644 index 0000000..0272331 --- /dev/null +++ b/models/operations/getserverresources.go @@ -0,0 +1,229 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "encoding/json" + "fmt" + "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/models/components" + "net/http" +) + +var GetServerResourcesServerList = []string{ + "https://plex.tv/api/v2", +} + +type GetServerResourcesGlobals struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` +} + +func (g GetServerResourcesGlobals) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(g, "", false) +} + +func (g *GetServerResourcesGlobals) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil { + return err + } + return nil +} + +func (g *GetServerResourcesGlobals) GetAccepts() *components.Accepts { + if g == nil { + return nil + } + return g.Accepts +} + +func (g *GetServerResourcesGlobals) GetClientIdentifier() *string { + if g == nil { + return nil + } + return g.ClientIdentifier +} + +// IncludeHTTPS - Include Https entries in the results +type IncludeHTTPS int + +const ( + IncludeHTTPSFalse IncludeHTTPS = 0 + IncludeHTTPSTrue IncludeHTTPS = 1 +) + +func (e IncludeHTTPS) ToPointer() *IncludeHTTPS { + return &e +} +func (e *IncludeHTTPS) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = IncludeHTTPS(v) + return nil + default: + return fmt.Errorf("invalid value for IncludeHTTPS: %v", v) + } +} + +// IncludeRelay - Include Relay addresses in the results +// E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400 +type IncludeRelay int + +const ( + IncludeRelayFalse IncludeRelay = 0 + IncludeRelayTrue IncludeRelay = 1 +) + +func (e IncludeRelay) ToPointer() *IncludeRelay { + return &e +} +func (e *IncludeRelay) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = IncludeRelay(v) + return nil + default: + return fmt.Errorf("invalid value for IncludeRelay: %v", v) + } +} + +// IncludeIPv6 - Include IPv6 entries in the results +type IncludeIPv6 int + +const ( + IncludeIPv6False IncludeIPv6 = 0 + IncludeIPv6True IncludeIPv6 = 1 +) + +func (e IncludeIPv6) ToPointer() *IncludeIPv6 { + return &e +} +func (e *IncludeIPv6) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = IncludeIPv6(v) + return nil + default: + return fmt.Errorf("invalid value for IncludeIPv6: %v", v) + } +} + +type GetServerResourcesRequest struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` + // Include Https entries in the results + IncludeHTTPS *IncludeHTTPS `default:"0" queryParam:"style=form,explode=true,name=includeHttps"` + // Include Relay addresses in the results + // E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400 + // + IncludeRelay *IncludeRelay `default:"0" queryParam:"style=form,explode=true,name=includeRelay"` + // Include IPv6 entries in the results + IncludeIPv6 *IncludeIPv6 `default:"0" queryParam:"style=form,explode=true,name=includeIPv6"` +} + +func (g GetServerResourcesRequest) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(g, "", false) +} + +func (g *GetServerResourcesRequest) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil { + return err + } + return nil +} + +func (g *GetServerResourcesRequest) GetAccepts() *components.Accepts { + if g == nil { + return nil + } + return g.Accepts +} + +func (g *GetServerResourcesRequest) GetClientIdentifier() *string { + if g == nil { + return nil + } + return g.ClientIdentifier +} + +func (g *GetServerResourcesRequest) GetIncludeHTTPS() *IncludeHTTPS { + if g == nil { + return nil + } + return g.IncludeHTTPS +} + +func (g *GetServerResourcesRequest) GetIncludeRelay() *IncludeRelay { + if g == nil { + return nil + } + return g.IncludeRelay +} + +func (g *GetServerResourcesRequest) GetIncludeIPv6() *IncludeIPv6 { + if g == nil { + return nil + } + return g.IncludeIPv6 +} + +type GetServerResourcesResponse struct { + // HTTP response content type for this operation + ContentType string + // HTTP response status code for this operation + StatusCode int + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response + // List of Plex Devices. This includes Plex hosted servers and clients + PlexDevices []components.PlexDevice +} + +func (g *GetServerResourcesResponse) GetContentType() string { + if g == nil { + return "" + } + return g.ContentType +} + +func (g *GetServerResourcesResponse) GetStatusCode() int { + if g == nil { + return 0 + } + return g.StatusCode +} + +func (g *GetServerResourcesResponse) GetRawResponse() *http.Response { + if g == nil { + return nil + } + return g.RawResponse +} + +func (g *GetServerResourcesResponse) GetPlexDevices() []components.PlexDevice { + if g == nil { + return nil + } + return g.PlexDevices +} diff --git a/models/operations/getsourceconnectioninformation.go b/models/operations/getsourceconnectioninformation.go index 79c04e0..3953f8b 100644 --- a/models/operations/getsourceconnectioninformation.go +++ b/models/operations/getsourceconnectioninformation.go @@ -147,7 +147,7 @@ type GetSourceConnectionInformationRequest struct { // The source identifier with an included prefix. Source string `queryParam:"style=form,explode=true,name=source"` // Force refresh - Refresh *components.BoolInt `queryParam:"style=form,explode=true,name=refresh"` + Refresh *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=refresh"` } func (g GetSourceConnectionInformationRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getstream.go b/models/operations/getstream.go index 25cf629..23888d4 100644 --- a/models/operations/getstream.go +++ b/models/operations/getstream.go @@ -153,7 +153,7 @@ type GetStreamRequest struct { // The requested format for the subtitle to convert the subtitles to (only used for text subtitles) Format *string `queryParam:"style=form,explode=true,name=format"` // Whether the server should attempt to automatically adjust the subtitle timestamps to match the media - AutoAdjustSubtitle *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` + AutoAdjustSubtitle *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` } func (g GetStreamRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/getsubscription.go b/models/operations/getsubscription.go index a3c7cae..da27809 100644 --- a/models/operations/getsubscription.go +++ b/models/operations/getsubscription.go @@ -146,9 +146,9 @@ type GetSubscriptionRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` SubscriptionID int64 `pathParam:"style=simple,explode=false,name=subscriptionId"` // Indicates whether the active grabs should be included as well - IncludeGrabs *components.BoolInt `queryParam:"style=form,explode=true,name=includeGrabs"` + IncludeGrabs *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeGrabs"` // Compute the storage of recorded items desired by this subscription - IncludeStorage *components.BoolInt `queryParam:"style=form,explode=true,name=includeStorage"` + IncludeStorage *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeStorage"` } func (g GetSubscriptionRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/gettags.go b/models/operations/gettags.go index 02f7ec0..95b23e4 100644 --- a/models/operations/gettags.go +++ b/models/operations/gettags.go @@ -144,8 +144,21 @@ type GetTagsRequest struct { DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` - // The metadata type to filter by - Type *int64 `queryParam:"style=form,explode=true,name=type"` + // The type of media to retrieve or filter by. + // + // 1 = movie + // 2 = show + // 3 = season + // 4 = episode + // 5 = artist + // 6 = album + // 7 = track + // 8 = photo_album + // 9 = photo + // + // E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries + // + Type *components.MediaType `queryParam:"style=form,explode=true,name=type"` } func (g GetTagsRequest) MarshalJSON() ([]byte, error) { @@ -236,7 +249,7 @@ func (g *GetTagsRequest) GetMarketplace() *string { return g.Marketplace } -func (g *GetTagsRequest) GetType() *int64 { +func (g *GetTagsRequest) GetType() *components.MediaType { if g == nil { return nil } diff --git a/models/operations/gettasks.go b/models/operations/gettasks.go index 84cb464..1a0ab74 100644 --- a/models/operations/gettasks.go +++ b/models/operations/gettasks.go @@ -6,7 +6,7 @@ import ( "net/http" ) -type ButlerTask struct { +type GetTasksButlerTask struct { // A user-friendly description of the task Description *string `json:"description,omitempty"` // Whether this task is enabled or not @@ -21,53 +21,53 @@ type ButlerTask struct { Title *string `json:"title,omitempty"` } -func (b *ButlerTask) GetDescription() *string { - if b == nil { +func (g *GetTasksButlerTask) GetDescription() *string { + if g == nil { return nil } - return b.Description + return g.Description } -func (b *ButlerTask) GetEnabled() *bool { - if b == nil { +func (g *GetTasksButlerTask) GetEnabled() *bool { + if g == nil { return nil } - return b.Enabled + return g.Enabled } -func (b *ButlerTask) GetInterval() *int64 { - if b == nil { +func (g *GetTasksButlerTask) GetInterval() *int64 { + if g == nil { return nil } - return b.Interval + return g.Interval } -func (b *ButlerTask) GetName() *string { - if b == nil { +func (g *GetTasksButlerTask) GetName() *string { + if g == nil { return nil } - return b.Name + return g.Name } -func (b *ButlerTask) GetScheduleRandomized() *bool { - if b == nil { +func (g *GetTasksButlerTask) GetScheduleRandomized() *bool { + if g == nil { return nil } - return b.ScheduleRandomized + return g.ScheduleRandomized } -func (b *ButlerTask) GetTitle() *string { - if b == nil { +func (g *GetTasksButlerTask) GetTitle() *string { + if g == nil { return nil } - return b.Title + return g.Title } type ButlerTasks struct { - ButlerTask []ButlerTask `json:"ButlerTask,omitempty"` + ButlerTask []GetTasksButlerTask `json:"ButlerTask,omitempty"` } -func (b *ButlerTasks) GetButlerTask() []ButlerTask { +func (b *ButlerTasks) GetButlerTask() []GetTasksButlerTask { if b == nil { return nil } diff --git a/models/operations/gettokendetails.go b/models/operations/gettokendetails.go new file mode 100644 index 0000000..ab9869e --- /dev/null +++ b/models/operations/gettokendetails.go @@ -0,0 +1,278 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/models/components" + "net/http" +) + +var GetTokenDetailsServerList = []string{ + "https://plex.tv/api/v2", +} + +type GetTokenDetailsGlobals struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` + // The name of the client product + Product *string `header:"style=simple,explode=false,name=X-Plex-Product"` + // The version of the client application + Version *string `header:"style=simple,explode=false,name=X-Plex-Version"` + // The platform of the client + Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"` + // The version of the platform + PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"` + // A relatively friendly name for the client device + Device *string `header:"style=simple,explode=false,name=X-Plex-Device"` + // A potentially less friendly identifier for the device model + Model *string `header:"style=simple,explode=false,name=X-Plex-Model"` + // The device vendor + DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"` + // A friendly name for the client + DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` + // The marketplace on which the client application is distributed + Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` +} + +func (g GetTokenDetailsGlobals) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(g, "", false) +} + +func (g *GetTokenDetailsGlobals) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil { + return err + } + return nil +} + +func (g *GetTokenDetailsGlobals) GetAccepts() *components.Accepts { + if g == nil { + return nil + } + return g.Accepts +} + +func (g *GetTokenDetailsGlobals) GetClientIdentifier() *string { + if g == nil { + return nil + } + return g.ClientIdentifier +} + +func (g *GetTokenDetailsGlobals) GetProduct() *string { + if g == nil { + return nil + } + return g.Product +} + +func (g *GetTokenDetailsGlobals) GetVersion() *string { + if g == nil { + return nil + } + return g.Version +} + +func (g *GetTokenDetailsGlobals) GetPlatform() *string { + if g == nil { + return nil + } + return g.Platform +} + +func (g *GetTokenDetailsGlobals) GetPlatformVersion() *string { + if g == nil { + return nil + } + return g.PlatformVersion +} + +func (g *GetTokenDetailsGlobals) GetDevice() *string { + if g == nil { + return nil + } + return g.Device +} + +func (g *GetTokenDetailsGlobals) GetModel() *string { + if g == nil { + return nil + } + return g.Model +} + +func (g *GetTokenDetailsGlobals) GetDeviceVendor() *string { + if g == nil { + return nil + } + return g.DeviceVendor +} + +func (g *GetTokenDetailsGlobals) GetDeviceName() *string { + if g == nil { + return nil + } + return g.DeviceName +} + +func (g *GetTokenDetailsGlobals) GetMarketplace() *string { + if g == nil { + return nil + } + return g.Marketplace +} + +type GetTokenDetailsRequest struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` + // The name of the client product + Product *string `header:"style=simple,explode=false,name=X-Plex-Product"` + // The version of the client application + Version *string `header:"style=simple,explode=false,name=X-Plex-Version"` + // The platform of the client + Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"` + // The version of the platform + PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"` + // A relatively friendly name for the client device + Device *string `header:"style=simple,explode=false,name=X-Plex-Device"` + // A potentially less friendly identifier for the device model + Model *string `header:"style=simple,explode=false,name=X-Plex-Model"` + // The device vendor + DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"` + // A friendly name for the client + DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` + // The marketplace on which the client application is distributed + Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` +} + +func (g GetTokenDetailsRequest) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(g, "", false) +} + +func (g *GetTokenDetailsRequest) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil { + return err + } + return nil +} + +func (g *GetTokenDetailsRequest) GetAccepts() *components.Accepts { + if g == nil { + return nil + } + return g.Accepts +} + +func (g *GetTokenDetailsRequest) GetClientIdentifier() *string { + if g == nil { + return nil + } + return g.ClientIdentifier +} + +func (g *GetTokenDetailsRequest) GetProduct() *string { + if g == nil { + return nil + } + return g.Product +} + +func (g *GetTokenDetailsRequest) GetVersion() *string { + if g == nil { + return nil + } + return g.Version +} + +func (g *GetTokenDetailsRequest) GetPlatform() *string { + if g == nil { + return nil + } + return g.Platform +} + +func (g *GetTokenDetailsRequest) GetPlatformVersion() *string { + if g == nil { + return nil + } + return g.PlatformVersion +} + +func (g *GetTokenDetailsRequest) GetDevice() *string { + if g == nil { + return nil + } + return g.Device +} + +func (g *GetTokenDetailsRequest) GetModel() *string { + if g == nil { + return nil + } + return g.Model +} + +func (g *GetTokenDetailsRequest) GetDeviceVendor() *string { + if g == nil { + return nil + } + return g.DeviceVendor +} + +func (g *GetTokenDetailsRequest) GetDeviceName() *string { + if g == nil { + return nil + } + return g.DeviceName +} + +func (g *GetTokenDetailsRequest) GetMarketplace() *string { + if g == nil { + return nil + } + return g.Marketplace +} + +type GetTokenDetailsResponse struct { + // HTTP response content type for this operation + ContentType string + // HTTP response status code for this operation + StatusCode int + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response + // Logged in user details + UserPlexAccount *components.UserPlexAccount +} + +func (g *GetTokenDetailsResponse) GetContentType() string { + if g == nil { + return "" + } + return g.ContentType +} + +func (g *GetTokenDetailsResponse) GetStatusCode() int { + if g == nil { + return 0 + } + return g.StatusCode +} + +func (g *GetTokenDetailsResponse) GetRawResponse() *http.Response { + if g == nil { + return nil + } + return g.RawResponse +} + +func (g *GetTokenDetailsResponse) GetUserPlexAccount() *components.UserPlexAccount { + if g == nil { + return nil + } + return g.UserPlexAccount +} diff --git a/models/operations/getusers.go b/models/operations/getusers.go new file mode 100644 index 0000000..5611c9a --- /dev/null +++ b/models/operations/getusers.go @@ -0,0 +1,925 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "encoding/json" + "fmt" + "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/models/components" + "net/http" +) + +var GetUsersServerList = []string{ + "https://plex.tv/api", +} + +type GetUsersGlobals struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` + // The name of the client product + Product *string `header:"style=simple,explode=false,name=X-Plex-Product"` + // The version of the client application + Version *string `header:"style=simple,explode=false,name=X-Plex-Version"` + // The platform of the client + Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"` + // The version of the platform + PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"` + // A relatively friendly name for the client device + Device *string `header:"style=simple,explode=false,name=X-Plex-Device"` + // A potentially less friendly identifier for the device model + Model *string `header:"style=simple,explode=false,name=X-Plex-Model"` + // The device vendor + DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"` + // A friendly name for the client + DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` + // The marketplace on which the client application is distributed + Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` +} + +func (g GetUsersGlobals) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(g, "", false) +} + +func (g *GetUsersGlobals) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil { + return err + } + return nil +} + +func (g *GetUsersGlobals) GetAccepts() *components.Accepts { + if g == nil { + return nil + } + return g.Accepts +} + +func (g *GetUsersGlobals) GetClientIdentifier() *string { + if g == nil { + return nil + } + return g.ClientIdentifier +} + +func (g *GetUsersGlobals) GetProduct() *string { + if g == nil { + return nil + } + return g.Product +} + +func (g *GetUsersGlobals) GetVersion() *string { + if g == nil { + return nil + } + return g.Version +} + +func (g *GetUsersGlobals) GetPlatform() *string { + if g == nil { + return nil + } + return g.Platform +} + +func (g *GetUsersGlobals) GetPlatformVersion() *string { + if g == nil { + return nil + } + return g.PlatformVersion +} + +func (g *GetUsersGlobals) GetDevice() *string { + if g == nil { + return nil + } + return g.Device +} + +func (g *GetUsersGlobals) GetModel() *string { + if g == nil { + return nil + } + return g.Model +} + +func (g *GetUsersGlobals) GetDeviceVendor() *string { + if g == nil { + return nil + } + return g.DeviceVendor +} + +func (g *GetUsersGlobals) GetDeviceName() *string { + if g == nil { + return nil + } + return g.DeviceName +} + +func (g *GetUsersGlobals) GetMarketplace() *string { + if g == nil { + return nil + } + return g.Marketplace +} + +type GetUsersRequest struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` + // The name of the client product + Product *string `header:"style=simple,explode=false,name=X-Plex-Product"` + // The version of the client application + Version *string `header:"style=simple,explode=false,name=X-Plex-Version"` + // The platform of the client + Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"` + // The version of the platform + PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"` + // A relatively friendly name for the client device + Device *string `header:"style=simple,explode=false,name=X-Plex-Device"` + // A potentially less friendly identifier for the device model + Model *string `header:"style=simple,explode=false,name=X-Plex-Model"` + // The device vendor + DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"` + // A friendly name for the client + DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` + // The marketplace on which the client application is distributed + Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` +} + +func (g GetUsersRequest) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(g, "", false) +} + +func (g *GetUsersRequest) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil { + return err + } + return nil +} + +func (g *GetUsersRequest) GetAccepts() *components.Accepts { + if g == nil { + return nil + } + return g.Accepts +} + +func (g *GetUsersRequest) GetClientIdentifier() *string { + if g == nil { + return nil + } + return g.ClientIdentifier +} + +func (g *GetUsersRequest) GetProduct() *string { + if g == nil { + return nil + } + return g.Product +} + +func (g *GetUsersRequest) GetVersion() *string { + if g == nil { + return nil + } + return g.Version +} + +func (g *GetUsersRequest) GetPlatform() *string { + if g == nil { + return nil + } + return g.Platform +} + +func (g *GetUsersRequest) GetPlatformVersion() *string { + if g == nil { + return nil + } + return g.PlatformVersion +} + +func (g *GetUsersRequest) GetDevice() *string { + if g == nil { + return nil + } + return g.Device +} + +func (g *GetUsersRequest) GetModel() *string { + if g == nil { + return nil + } + return g.Model +} + +func (g *GetUsersRequest) GetDeviceVendor() *string { + if g == nil { + return nil + } + return g.DeviceVendor +} + +func (g *GetUsersRequest) GetDeviceName() *string { + if g == nil { + return nil + } + return g.DeviceName +} + +func (g *GetUsersRequest) GetMarketplace() *string { + if g == nil { + return nil + } + return g.Marketplace +} + +// Protected - Indicates whether the account is protected. +type Protected int + +const ( + ProtectedDisable Protected = 0 + ProtectedEnable Protected = 1 +) + +func (e Protected) ToPointer() *Protected { + return &e +} +func (e *Protected) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = Protected(v) + return nil + default: + return fmt.Errorf("invalid value for Protected: %v", v) + } +} + +// Home - Indicates if the user is part of a home group. +type Home int + +const ( + HomeDisable Home = 0 + HomeEnable Home = 1 +) + +func (e Home) ToPointer() *Home { + return &e +} +func (e *Home) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = Home(v) + return nil + default: + return fmt.Errorf("invalid value for Home: %v", v) + } +} + +// AllowTuners - Indicates if the user is allowed to use tuners. +type AllowTuners int + +const ( + AllowTunersDisable AllowTuners = 0 + AllowTunersEnable AllowTuners = 1 +) + +func (e AllowTuners) ToPointer() *AllowTuners { + return &e +} +func (e *AllowTuners) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = AllowTuners(v) + return nil + default: + return fmt.Errorf("invalid value for AllowTuners: %v", v) + } +} + +// AllowSync - Indicates if the user is allowed to sync media. +type AllowSync int + +const ( + AllowSyncDisable AllowSync = 0 + AllowSyncEnable AllowSync = 1 +) + +func (e AllowSync) ToPointer() *AllowSync { + return &e +} +func (e *AllowSync) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = AllowSync(v) + return nil + default: + return fmt.Errorf("invalid value for AllowSync: %v", v) + } +} + +// AllowCameraUpload - Indicates if the user is allowed to upload from a camera. +type AllowCameraUpload int + +const ( + AllowCameraUploadDisable AllowCameraUpload = 0 + AllowCameraUploadEnable AllowCameraUpload = 1 +) + +func (e AllowCameraUpload) ToPointer() *AllowCameraUpload { + return &e +} +func (e *AllowCameraUpload) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = AllowCameraUpload(v) + return nil + default: + return fmt.Errorf("invalid value for AllowCameraUpload: %v", v) + } +} + +// AllowChannels - Indicates if the user has access to channels. +type AllowChannels int + +const ( + AllowChannelsDisable AllowChannels = 0 + AllowChannelsEnable AllowChannels = 1 +) + +func (e AllowChannels) ToPointer() *AllowChannels { + return &e +} +func (e *AllowChannels) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = AllowChannels(v) + return nil + default: + return fmt.Errorf("invalid value for AllowChannels: %v", v) + } +} + +// AllowSubtitleAdmin - Indicates if the user can manage subtitles. +type AllowSubtitleAdmin int + +const ( + AllowSubtitleAdminDisable AllowSubtitleAdmin = 0 + AllowSubtitleAdminEnable AllowSubtitleAdmin = 1 +) + +func (e AllowSubtitleAdmin) ToPointer() *AllowSubtitleAdmin { + return &e +} +func (e *AllowSubtitleAdmin) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = AllowSubtitleAdmin(v) + return nil + default: + return fmt.Errorf("invalid value for AllowSubtitleAdmin: %v", v) + } +} + +// Restricted - Indicates if the user has restricted access. +type Restricted int + +const ( + RestrictedDisable Restricted = 0 + RestrictedEnable Restricted = 1 +) + +func (e Restricted) ToPointer() *Restricted { + return &e +} +func (e *Restricted) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = Restricted(v) + return nil + default: + return fmt.Errorf("invalid value for Restricted: %v", v) + } +} + +// AllLibraries - Indicates if the user has access to all libraries. +type AllLibraries int + +const ( + AllLibrariesDisable AllLibraries = 0 + AllLibrariesEnable AllLibraries = 1 +) + +func (e AllLibraries) ToPointer() *AllLibraries { + return &e +} +func (e *AllLibraries) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = AllLibraries(v) + return nil + default: + return fmt.Errorf("invalid value for AllLibraries: %v", v) + } +} + +// Owned - Indicates if the user owns the server. +type Owned int + +const ( + OwnedDisable Owned = 0 + OwnedEnable Owned = 1 +) + +func (e Owned) ToPointer() *Owned { + return &e +} +func (e *Owned) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = Owned(v) + return nil + default: + return fmt.Errorf("invalid value for Owned: %v", v) + } +} + +// Pending - Indicates if the server is pending approval. +type Pending int + +const ( + PendingDisable Pending = 0 + PendingEnable Pending = 1 +) + +func (e Pending) ToPointer() *Pending { + return &e +} +func (e *Pending) UnmarshalJSON(data []byte) error { + var v int + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case 0: + fallthrough + case 1: + *e = Pending(v) + return nil + default: + return fmt.Errorf("invalid value for Pending: %v", v) + } +} + +type Server struct { + // Unique ID of the server of the connected user + ID int64 `json:"id"` + // ID of the actual Plex server. + ServerID int64 `json:"serverId"` + // Machine identifier of the Plex server. + MachineIdentifier string `json:"machineIdentifier"` + // Name of the Plex server of the connected user. + Name string `json:"name"` + // Unix epoch datetime in seconds + LastSeenAt int64 `json:"lastSeenAt"` + // Number of libraries in the server this user has access to. + NumLibraries int64 `json:"numLibraries"` + AllLibraries *AllLibraries `default:"0" json:"allLibraries"` + Owned *Owned `default:"0" json:"owned"` + Pending *Pending `default:"0" json:"pending"` +} + +func (s Server) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(s, "", false) +} + +func (s *Server) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &s, "", false, []string{"id", "serverId", "machineIdentifier", "name", "lastSeenAt", "numLibraries"}); err != nil { + return err + } + return nil +} + +func (s *Server) GetID() int64 { + if s == nil { + return 0 + } + return s.ID +} + +func (s *Server) GetServerID() int64 { + if s == nil { + return 0 + } + return s.ServerID +} + +func (s *Server) GetMachineIdentifier() string { + if s == nil { + return "" + } + return s.MachineIdentifier +} + +func (s *Server) GetName() string { + if s == nil { + return "" + } + return s.Name +} + +func (s *Server) GetLastSeenAt() int64 { + if s == nil { + return 0 + } + return s.LastSeenAt +} + +func (s *Server) GetNumLibraries() int64 { + if s == nil { + return 0 + } + return s.NumLibraries +} + +func (s *Server) GetAllLibraries() *AllLibraries { + if s == nil { + return nil + } + return s.AllLibraries +} + +func (s *Server) GetOwned() *Owned { + if s == nil { + return nil + } + return s.Owned +} + +func (s *Server) GetPending() *Pending { + if s == nil { + return nil + } + return s.Pending +} + +type User struct { + // User's unique ID. + ID int64 `json:"id"` + // User's display name. + Title string `json:"title"` + // User's username. + Username string `json:"username"` + // User's email address. + Email string `json:"email"` + // ID of the user's recommendation playlist. + RecommendationsPlaylistID *string `json:"recommendationsPlaylistId,omitempty"` + // URL to the user's avatar image. + Thumb string `json:"thumb"` + Protected *Protected `default:"0" json:"protected"` + Home *Home `default:"0" json:"home"` + AllowTuners *AllowTuners `default:"0" json:"allowTuners"` + AllowSync *AllowSync `default:"0" json:"allowSync"` + AllowCameraUpload *AllowCameraUpload `default:"0" json:"allowCameraUpload"` + AllowChannels *AllowChannels `default:"0" json:"allowChannels"` + AllowSubtitleAdmin *AllowSubtitleAdmin `default:"0" json:"allowSubtitleAdmin"` + // Filters applied for all content. + FilterAll *string `json:"filterAll,omitempty"` + // Filters applied for movies. + FilterMovies *string `json:"filterMovies,omitempty"` + // Filters applied for music. + FilterMusic *string `json:"filterMusic,omitempty"` + // Filters applied for photos. + FilterPhotos *string `json:"filterPhotos,omitempty"` + // Filters applied for television. + FilterTelevision *string `json:"filterTelevision,omitempty"` + Restricted *Restricted `default:"0" json:"restricted"` + // List of servers owned by the user. + Server []Server `json:"Server"` +} + +func (u User) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(u, "", false) +} + +func (u *User) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &u, "", false, []string{"id", "title", "username", "email", "thumb", "Server"}); err != nil { + return err + } + return nil +} + +func (u *User) GetID() int64 { + if u == nil { + return 0 + } + return u.ID +} + +func (u *User) GetTitle() string { + if u == nil { + return "" + } + return u.Title +} + +func (u *User) GetUsername() string { + if u == nil { + return "" + } + return u.Username +} + +func (u *User) GetEmail() string { + if u == nil { + return "" + } + return u.Email +} + +func (u *User) GetRecommendationsPlaylistID() *string { + if u == nil { + return nil + } + return u.RecommendationsPlaylistID +} + +func (u *User) GetThumb() string { + if u == nil { + return "" + } + return u.Thumb +} + +func (u *User) GetProtected() *Protected { + if u == nil { + return nil + } + return u.Protected +} + +func (u *User) GetHome() *Home { + if u == nil { + return nil + } + return u.Home +} + +func (u *User) GetAllowTuners() *AllowTuners { + if u == nil { + return nil + } + return u.AllowTuners +} + +func (u *User) GetAllowSync() *AllowSync { + if u == nil { + return nil + } + return u.AllowSync +} + +func (u *User) GetAllowCameraUpload() *AllowCameraUpload { + if u == nil { + return nil + } + return u.AllowCameraUpload +} + +func (u *User) GetAllowChannels() *AllowChannels { + if u == nil { + return nil + } + return u.AllowChannels +} + +func (u *User) GetAllowSubtitleAdmin() *AllowSubtitleAdmin { + if u == nil { + return nil + } + return u.AllowSubtitleAdmin +} + +func (u *User) GetFilterAll() *string { + if u == nil { + return nil + } + return u.FilterAll +} + +func (u *User) GetFilterMovies() *string { + if u == nil { + return nil + } + return u.FilterMovies +} + +func (u *User) GetFilterMusic() *string { + if u == nil { + return nil + } + return u.FilterMusic +} + +func (u *User) GetFilterPhotos() *string { + if u == nil { + return nil + } + return u.FilterPhotos +} + +func (u *User) GetFilterTelevision() *string { + if u == nil { + return nil + } + return u.FilterTelevision +} + +func (u *User) GetRestricted() *Restricted { + if u == nil { + return nil + } + return u.Restricted +} + +func (u *User) GetServer() []Server { + if u == nil { + return []Server{} + } + return u.Server +} + +// GetUsersMediaContainer - Container holding user and server details. +type GetUsersMediaContainer struct { + // The friendly name of the Plex instance. + FriendlyName string `json:"friendlyName"` + Identifier string `json:"identifier"` + // Unique Machine identifier of the Plex server. + MachineIdentifier string `json:"machineIdentifier"` + // Total number of users. + TotalSize int64 `json:"totalSize"` + // Number of users in the current response. + Size int64 `json:"size"` + // List of users with access to the Plex server. + User []User `json:"User"` +} + +func (g *GetUsersMediaContainer) GetFriendlyName() string { + if g == nil { + return "" + } + return g.FriendlyName +} + +func (g *GetUsersMediaContainer) GetIdentifier() string { + if g == nil { + return "" + } + return g.Identifier +} + +func (g *GetUsersMediaContainer) GetMachineIdentifier() string { + if g == nil { + return "" + } + return g.MachineIdentifier +} + +func (g *GetUsersMediaContainer) GetTotalSize() int64 { + if g == nil { + return 0 + } + return g.TotalSize +} + +func (g *GetUsersMediaContainer) GetSize() int64 { + if g == nil { + return 0 + } + return g.Size +} + +func (g *GetUsersMediaContainer) GetUser() []User { + if g == nil { + return []User{} + } + return g.User +} + +// GetUsersResponseBody - Successful response with media container data in JSON +type GetUsersResponseBody struct { + // Container holding user and server details. + MediaContainer *GetUsersMediaContainer `json:"MediaContainer,omitempty"` +} + +func (g *GetUsersResponseBody) GetMediaContainer() *GetUsersMediaContainer { + if g == nil { + return nil + } + return g.MediaContainer +} + +type GetUsersResponse struct { + // HTTP response content type for this operation + ContentType string + // HTTP response status code for this operation + StatusCode int + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response + // Successful response with media container data in JSON + Object *GetUsersResponseBody +} + +func (g *GetUsersResponse) GetContentType() string { + if g == nil { + return "" + } + return g.ContentType +} + +func (g *GetUsersResponse) GetStatusCode() int { + if g == nil { + return 0 + } + return g.StatusCode +} + +func (g *GetUsersResponse) GetRawResponse() *http.Response { + if g == nil { + return nil + } + return g.RawResponse +} + +func (g *GetUsersResponse) GetObject() *GetUsersResponseBody { + if g == nil { + return nil + } + return g.Object +} diff --git a/models/operations/ingesttransientitem.go b/models/operations/ingesttransientitem.go index fcd87a2..d5a578b 100644 --- a/models/operations/ingesttransientitem.go +++ b/models/operations/ingesttransientitem.go @@ -149,9 +149,9 @@ type IngestTransientItemRequest struct { // A virtual path to use when the url is opaque. VirtualFilePath *string `queryParam:"style=form,explode=true,name=virtualFilePath"` // Whether or not to compute Plex and OpenSubtitle hashes for the file. Defaults to 0. - ComputeHashes *components.BoolInt `queryParam:"style=form,explode=true,name=computeHashes"` + ComputeHashes *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=computeHashes"` // Whether or not non matching media should be stored. Defaults to 0. - IngestNonMatches *components.BoolInt `queryParam:"style=form,explode=true,name=ingestNonMatches"` + IngestNonMatches *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=ingestNonMatches"` } func (i IngestTransientItemRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/listcontent.go b/models/operations/listcontent.go index 6fb69f5..3b52bc1 100644 --- a/models/operations/listcontent.go +++ b/models/operations/listcontent.go @@ -144,8 +144,40 @@ type ListContentRequest struct { DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` - // This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + // 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. + // By default this is 0 + // + XPlexContainerStart *int `default:"0" queryParam:"style=form,explode=true,name=X-Plex-Container-Start"` + // 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. + // By default this is 50 + // + XPlexContainerSize *int `default:"50" queryParam:"style=form,explode=true,name=X-Plex-Container-Size"` + // A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + // + // The query supports: + // - Fields: integer, boolean, tag, string, date, language + // - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + // - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + // - Sorting: sort parameter with :desc, :nullsLast modifiers + // - Grouping: group parameter + // - Limits: limit parameter + // + // Examples: + // - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + // - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + // - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + // + // See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. + // MediaQuery *components.MediaQuery `queryParam:"style=form,explode=true,name=mediaQuery"` + // Adds the Meta object to the response + // + IncludeMeta *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeMeta"` + // Adds the Guid object to the response + // + IncludeGuids *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=includeGuids"` // The id of the section SectionID string `pathParam:"style=simple,explode=false,name=sectionId"` } @@ -238,6 +270,20 @@ func (l *ListContentRequest) GetMarketplace() *string { return l.Marketplace } +func (l *ListContentRequest) GetXPlexContainerStart() *int { + if l == nil { + return nil + } + return l.XPlexContainerStart +} + +func (l *ListContentRequest) GetXPlexContainerSize() *int { + if l == nil { + return nil + } + return l.XPlexContainerSize +} + func (l *ListContentRequest) GetMediaQuery() *components.MediaQuery { if l == nil { return nil @@ -245,6 +291,20 @@ func (l *ListContentRequest) GetMediaQuery() *components.MediaQuery { return l.MediaQuery } +func (l *ListContentRequest) GetIncludeMeta() *components.BoolInt { + if l == nil { + return nil + } + return l.IncludeMeta +} + +func (l *ListContentRequest) GetIncludeGuids() *components.BoolInt { + if l == nil { + return nil + } + return l.IncludeGuids +} + func (l *ListContentRequest) GetSectionID() string { if l == nil { return "" diff --git a/models/operations/listmatches.go b/models/operations/listmatches.go index 62e9eff..017b945 100644 --- a/models/operations/listmatches.go +++ b/models/operations/listmatches.go @@ -150,7 +150,7 @@ type ListMatchesRequest struct { Agent *string `queryParam:"style=form,explode=true,name=agent"` Language *string `queryParam:"style=form,explode=true,name=language"` Year *int64 `queryParam:"style=form,explode=true,name=year"` - Manual *components.BoolInt `queryParam:"style=form,explode=true,name=manual"` + Manual *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=manual"` } func (l ListMatchesRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/listsessions.go b/models/operations/listsessions.go index bdc3625..c5c3003 100644 --- a/models/operations/listsessions.go +++ b/models/operations/listsessions.go @@ -5,9 +5,23 @@ package operations import ( "github.com/LukeHagar/plexgo/internal/utils" "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo/types" "net/http" ) +type Guids struct { + // The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + // + ID string `json:"id"` +} + +func (g *Guids) GetID() string { + if g == nil { + return "" + } + return g.ID +} + // Metadata - Items in a library are referred to as "metadata items." These metadata items are distinct from "media items" which represent actual instances of media that can be consumed. Consider a TV library that has a single video file in it for a particular episode of a show. The library has a single media item, but it has three metadata items: one for the show, one for the season, and one for the episode. Consider a movie library that has two video files in it: the same movie, but two different resolutions. The library has a single metadata item for the movie, but that metadata item has two media items, one for each resolution. Additionally a "media item" will have one or more "media parts" where the the parts are intended to be watched together, such as a CD1 and CD2 parts of the same movie. // // Note that when a metadata item has multiple media items, those media items should be isomorphic. That is, a 4K version and 1080p version of a movie are different versions of the same movie. They have the same duration, same summary, same rating, etc. and they can generally be considered interchangeable. A theatrical release vs. director's cut vs. unrated version on the other hand would be separate metadata items. @@ -21,37 +35,41 @@ type Metadata struct { // The user playing the content User *components.User `json:"User,omitempty"` // The title of the item (e.g. “300” or “The Simpsons”) - Title any `json:"title,omitempty"` + Title string `json:"title"` // The type of the video item, such as `movie`, `episode`, or `clip`. - Type any `json:"type,omitempty"` + Type string `json:"type"` // When present, contains the disc number for a track on multi-disc albums. - AbsoluteIndex *int64 `json:"absoluteIndex,omitempty"` + AbsoluteIndex *int `json:"absoluteIndex,omitempty"` // In units of seconds since the epoch, returns the time at which the item was added to the library. - AddedAt *int64 `json:"addedAt,omitempty"` + AddedAt int64 `json:"addedAt"` // When present, the URL for the background artwork for the item. - Art any `json:"art,omitempty"` + Art *string `json:"art,omitempty"` // Some rating systems separate reviewer ratings from audience ratings - AudienceRating *float64 `json:"audienceRating,omitempty"` + AudienceRating *float32 `json:"audienceRating,omitempty"` // A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). - AudienceRatingImage any `json:"audienceRatingImage,omitempty"` + AudienceRatingImage *string `json:"audienceRatingImage,omitempty"` Autotag []components.Tag `json:"Autotag,omitempty"` // When present, the URL for a banner graphic for the item. - Banner any `json:"banner,omitempty"` + Banner *string `json:"banner,omitempty"` // When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). - ChapterSource any `json:"chapterSource,omitempty"` + ChapterSource *string `json:"chapterSource,omitempty"` + // The number of child items associated with this media item. + ChildCount *int `json:"childCount,omitempty"` // When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). - Composite any `json:"composite,omitempty"` + Composite *string `json:"composite,omitempty"` // If known, the content rating (e.g. MPAA) for an item. - ContentRating any `json:"contentRating,omitempty"` + ContentRating *string `json:"contentRating,omitempty"` Country []components.Tag `json:"Country,omitempty"` Director []components.Tag `json:"Director,omitempty"` // When present, the duration for the item, in units of milliseconds. - Duration *int64 `json:"duration,omitempty"` + Duration *int `json:"duration,omitempty"` // Typically only seen in metadata at a library's top level Filter []components.Filter `json:"Filter,omitempty"` Genre []components.Tag `json:"Genre,omitempty"` // The `art` of the grandparent GrandparentArt *string `json:"grandparentArt,omitempty"` + // The GUID of the grandparent media item. + GrandparentGUID *string `json:"grandparentGuid,omitempty"` // The `hero` of the grandparent GrandparentHero *string `json:"grandparentHero,omitempty"` // The `key` of the grandparent @@ -63,28 +81,31 @@ type Metadata struct { // The `thumb` of the grandparent GrandparentThumb *string `json:"grandparentThumb,omitempty"` // The `title` of the grandparent - GrandparentTitle *string `json:"grandparentTitle,omitempty"` - GUID []components.Tag `json:"Guid,omitempty"` + GrandparentTitle *string `json:"grandparentTitle,omitempty"` + // The globally unique identifier for the media item. + GUID *string `json:"guid,omitempty"` + Guids []Guids `json:"Guid,omitempty"` // When present, the URL for a hero image for the item. - Hero any `json:"hero,omitempty"` + Hero *string `json:"hero,omitempty"` Image []components.Image `json:"Image,omitempty"` // When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. - Index *int64 `json:"index,omitempty"` + Index *int `json:"index,omitempty"` // The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. - Key any `json:"key,omitempty"` - // When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. + Key string `json:"key"` LastViewedAt *int64 `json:"lastViewedAt,omitempty"` // For shows and seasons, contains the number of total episodes. - LeafCount *int64 `json:"leafCount,omitempty"` + LeafCount *int `json:"leafCount,omitempty"` Media []components.Media `json:"Media,omitempty"` // When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. - OriginallyAvailableAt any `json:"originallyAvailableAt,omitempty"` + OriginallyAvailableAt *types.Date `json:"originallyAvailableAt,omitempty"` // When present, used to indicate an item's original title, e.g. a movie's foreign title. - OriginalTitle any `json:"originalTitle,omitempty"` + OriginalTitle *string `json:"originalTitle,omitempty"` + // The GUID of the parent media item. + ParentGUID *string `json:"parentGuid,omitempty"` // The `hero` of the parent ParentHero *string `json:"parentHero,omitempty"` // The `index` of the parent - ParentIndex *int64 `json:"parentIndex,omitempty"` + ParentIndex *int `json:"parentIndex,omitempty"` // The `key` of the parent ParentKey *string `json:"parentKey,omitempty"` // The `ratingKey` of the parent @@ -94,18 +115,18 @@ type Metadata struct { // The `title` of the parent ParentTitle *string `json:"parentTitle,omitempty"` // Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. - PrimaryExtraKey any `json:"primaryExtraKey,omitempty"` + PrimaryExtraKey *string `json:"primaryExtraKey,omitempty"` // Prompt to give the user for this directory (such as `Search Movies`) Prompt *string `json:"prompt,omitempty"` // When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. - Rating *float64 `json:"rating,omitempty"` + Rating *float32 `json:"rating,omitempty"` RatingArray []components.Tag `json:"Rating,omitempty"` // Number of ratings under this metadata - RatingCount *int64 `json:"ratingCount,omitempty"` + RatingCount *int `json:"ratingCount,omitempty"` // When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. - RatingImage any `json:"ratingImage,omitempty"` + RatingImage *string `json:"ratingImage,omitempty"` // This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. - RatingKey any `json:"ratingKey,omitempty"` + RatingKey *string `json:"ratingKey,omitempty"` Role []components.Tag `json:"Role,omitempty"` // Indicates this is a search directory Search *bool `json:"search,omitempty"` @@ -118,32 +139,32 @@ type Metadata struct { // Typically only seen in metadata at a library's top level Sort []components.Sort `json:"Sort,omitempty"` // When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). - Studio any `json:"studio,omitempty"` + Studio *string `json:"studio,omitempty"` // The subtype of the video item, such as `photo` when the video item is in a photo library - Subtype any `json:"subtype,omitempty"` + Subtype *string `json:"subtype,omitempty"` // When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). - Summary any `json:"summary,omitempty"` + Summary *string `json:"summary,omitempty"` // When present, a pithy one-liner about the item (usually only seen for movies). - Tagline any `json:"tagline,omitempty"` + Tagline *string `json:"tagline,omitempty"` // When present, the URL for theme music for the item (usually only for TV shows). - Theme any `json:"theme,omitempty"` + Theme *string `json:"theme,omitempty"` // When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. - Thumb any `json:"thumb,omitempty"` + Thumb *string `json:"thumb,omitempty"` // Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). - TitleSort any `json:"titleSort,omitempty"` + TitleSort *string `json:"titleSort,omitempty"` // In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). UpdatedAt *int64 `json:"updatedAt,omitempty"` // When the user has rated an item, this contains the user rating - UserRating *float64 `json:"userRating,omitempty"` + UserRating *float32 `json:"userRating,omitempty"` // When a users has completed watched or listened to an item, this attribute contains the number of consumptions. - ViewCount *int64 `json:"viewCount,omitempty"` + ViewCount *int `json:"viewCount,omitempty"` // For shows and seasons, contains the number of viewed episodes. - ViewedLeafCount *int64 `json:"viewedLeafCount,omitempty"` + ViewedLeafCount *int `json:"viewedLeafCount,omitempty"` // When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. - ViewOffset *int64 `json:"viewOffset,omitempty"` + ViewOffset *int `json:"viewOffset,omitempty"` Writer []components.Tag `json:"Writer,omitempty"` // When present, the year associated with the item's release (e.g. release year for a movie). - Year *int64 `json:"year,omitempty"` + Year *int `json:"year,omitempty"` AdditionalProperties map[string]any `additionalProperties:"true" json:"-"` } @@ -152,7 +173,7 @@ func (m Metadata) MarshalJSON() ([]byte, error) { } func (m *Metadata) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil { + if err := utils.UnmarshalJSON(data, &m, "", false, []string{"title", "type", "addedAt", "key"}); err != nil { return err } return nil @@ -179,49 +200,49 @@ func (m *Metadata) GetUser() *components.User { return m.User } -func (m *Metadata) GetTitle() any { +func (m *Metadata) GetTitle() string { if m == nil { - return nil + return "" } return m.Title } -func (m *Metadata) GetType() any { +func (m *Metadata) GetType() string { if m == nil { - return nil + return "" } return m.Type } -func (m *Metadata) GetAbsoluteIndex() *int64 { +func (m *Metadata) GetAbsoluteIndex() *int { if m == nil { return nil } return m.AbsoluteIndex } -func (m *Metadata) GetAddedAt() *int64 { +func (m *Metadata) GetAddedAt() int64 { if m == nil { - return nil + return 0 } return m.AddedAt } -func (m *Metadata) GetArt() any { +func (m *Metadata) GetArt() *string { if m == nil { return nil } return m.Art } -func (m *Metadata) GetAudienceRating() *float64 { +func (m *Metadata) GetAudienceRating() *float32 { if m == nil { return nil } return m.AudienceRating } -func (m *Metadata) GetAudienceRatingImage() any { +func (m *Metadata) GetAudienceRatingImage() *string { if m == nil { return nil } @@ -235,28 +256,35 @@ func (m *Metadata) GetAutotag() []components.Tag { return m.Autotag } -func (m *Metadata) GetBanner() any { +func (m *Metadata) GetBanner() *string { if m == nil { return nil } return m.Banner } -func (m *Metadata) GetChapterSource() any { +func (m *Metadata) GetChapterSource() *string { if m == nil { return nil } return m.ChapterSource } -func (m *Metadata) GetComposite() any { +func (m *Metadata) GetChildCount() *int { + if m == nil { + return nil + } + return m.ChildCount +} + +func (m *Metadata) GetComposite() *string { if m == nil { return nil } return m.Composite } -func (m *Metadata) GetContentRating() any { +func (m *Metadata) GetContentRating() *string { if m == nil { return nil } @@ -277,7 +305,7 @@ func (m *Metadata) GetDirector() []components.Tag { return m.Director } -func (m *Metadata) GetDuration() *int64 { +func (m *Metadata) GetDuration() *int { if m == nil { return nil } @@ -305,6 +333,13 @@ func (m *Metadata) GetGrandparentArt() *string { return m.GrandparentArt } +func (m *Metadata) GetGrandparentGUID() *string { + if m == nil { + return nil + } + return m.GrandparentGUID +} + func (m *Metadata) GetGrandparentHero() *string { if m == nil { return nil @@ -347,14 +382,21 @@ func (m *Metadata) GetGrandparentTitle() *string { return m.GrandparentTitle } -func (m *Metadata) GetGUID() []components.Tag { +func (m *Metadata) GetGUID() *string { if m == nil { return nil } return m.GUID } -func (m *Metadata) GetHero() any { +func (m *Metadata) GetGuids() []Guids { + if m == nil { + return nil + } + return m.Guids +} + +func (m *Metadata) GetHero() *string { if m == nil { return nil } @@ -368,16 +410,16 @@ func (m *Metadata) GetImage() []components.Image { return m.Image } -func (m *Metadata) GetIndex() *int64 { +func (m *Metadata) GetIndex() *int { if m == nil { return nil } return m.Index } -func (m *Metadata) GetKey() any { +func (m *Metadata) GetKey() string { if m == nil { - return nil + return "" } return m.Key } @@ -389,7 +431,7 @@ func (m *Metadata) GetLastViewedAt() *int64 { return m.LastViewedAt } -func (m *Metadata) GetLeafCount() *int64 { +func (m *Metadata) GetLeafCount() *int { if m == nil { return nil } @@ -403,20 +445,27 @@ func (m *Metadata) GetMedia() []components.Media { return m.Media } -func (m *Metadata) GetOriginallyAvailableAt() any { +func (m *Metadata) GetOriginallyAvailableAt() *types.Date { if m == nil { return nil } return m.OriginallyAvailableAt } -func (m *Metadata) GetOriginalTitle() any { +func (m *Metadata) GetOriginalTitle() *string { if m == nil { return nil } return m.OriginalTitle } +func (m *Metadata) GetParentGUID() *string { + if m == nil { + return nil + } + return m.ParentGUID +} + func (m *Metadata) GetParentHero() *string { if m == nil { return nil @@ -424,7 +473,7 @@ func (m *Metadata) GetParentHero() *string { return m.ParentHero } -func (m *Metadata) GetParentIndex() *int64 { +func (m *Metadata) GetParentIndex() *int { if m == nil { return nil } @@ -459,7 +508,7 @@ func (m *Metadata) GetParentTitle() *string { return m.ParentTitle } -func (m *Metadata) GetPrimaryExtraKey() any { +func (m *Metadata) GetPrimaryExtraKey() *string { if m == nil { return nil } @@ -473,7 +522,7 @@ func (m *Metadata) GetPrompt() *string { return m.Prompt } -func (m *Metadata) GetRating() *float64 { +func (m *Metadata) GetRating() *float32 { if m == nil { return nil } @@ -487,21 +536,21 @@ func (m *Metadata) GetRatingArray() []components.Tag { return m.RatingArray } -func (m *Metadata) GetRatingCount() *int64 { +func (m *Metadata) GetRatingCount() *int { if m == nil { return nil } return m.RatingCount } -func (m *Metadata) GetRatingImage() any { +func (m *Metadata) GetRatingImage() *string { if m == nil { return nil } return m.RatingImage } -func (m *Metadata) GetRatingKey() any { +func (m *Metadata) GetRatingKey() *string { if m == nil { return nil } @@ -550,49 +599,49 @@ func (m *Metadata) GetSort() []components.Sort { return m.Sort } -func (m *Metadata) GetStudio() any { +func (m *Metadata) GetStudio() *string { if m == nil { return nil } return m.Studio } -func (m *Metadata) GetSubtype() any { +func (m *Metadata) GetSubtype() *string { if m == nil { return nil } return m.Subtype } -func (m *Metadata) GetSummary() any { +func (m *Metadata) GetSummary() *string { if m == nil { return nil } return m.Summary } -func (m *Metadata) GetTagline() any { +func (m *Metadata) GetTagline() *string { if m == nil { return nil } return m.Tagline } -func (m *Metadata) GetTheme() any { +func (m *Metadata) GetTheme() *string { if m == nil { return nil } return m.Theme } -func (m *Metadata) GetThumb() any { +func (m *Metadata) GetThumb() *string { if m == nil { return nil } return m.Thumb } -func (m *Metadata) GetTitleSort() any { +func (m *Metadata) GetTitleSort() *string { if m == nil { return nil } @@ -606,28 +655,28 @@ func (m *Metadata) GetUpdatedAt() *int64 { return m.UpdatedAt } -func (m *Metadata) GetUserRating() *float64 { +func (m *Metadata) GetUserRating() *float32 { if m == nil { return nil } return m.UserRating } -func (m *Metadata) GetViewCount() *int64 { +func (m *Metadata) GetViewCount() *int { if m == nil { return nil } return m.ViewCount } -func (m *Metadata) GetViewedLeafCount() *int64 { +func (m *Metadata) GetViewedLeafCount() *int { if m == nil { return nil } return m.ViewedLeafCount } -func (m *Metadata) GetViewOffset() *int64 { +func (m *Metadata) GetViewOffset() *int { if m == nil { return nil } @@ -641,7 +690,7 @@ func (m *Metadata) GetWriter() []components.Tag { return m.Writer } -func (m *Metadata) GetYear() *int64 { +func (m *Metadata) GetYear() *int { if m == nil { return nil } diff --git a/models/operations/makedecision.go b/models/operations/makedecision.go index c6ed8ce..5492ca9 100644 --- a/models/operations/makedecision.go +++ b/models/operations/makedecision.go @@ -260,19 +260,19 @@ type MakeDecisionRequest struct { // Target video number of audio channels. AudioChannelCount *int64 `queryParam:"style=form,explode=true,name=audioChannelCount"` // Indicates the client supports ABR. - AutoAdjustQuality *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustQuality"` + AutoAdjustQuality *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustQuality"` // Indicates if the server should adjust subtitles based on Voice Activity Data. - AutoAdjustSubtitle *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` + AutoAdjustSubtitle *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` // Indicates the client supports direct playing the indicated content. - DirectPlay *components.BoolInt `queryParam:"style=form,explode=true,name=directPlay"` + DirectPlay *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directPlay"` // Indicates the client supports direct streaming the video of the indicated content. - DirectStream *components.BoolInt `queryParam:"style=form,explode=true,name=directStream"` + DirectStream *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStream"` // Indicates the client supports direct streaming the audio of the indicated content. - DirectStreamAudio *components.BoolInt `queryParam:"style=form,explode=true,name=directStreamAudio"` + DirectStreamAudio *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStreamAudio"` // Indicates if resolution should be adjusted for orientation. - DisableResolutionRotation *components.BoolInt `queryParam:"style=form,explode=true,name=disableResolutionRotation"` + DisableResolutionRotation *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=disableResolutionRotation"` // Ignore client profiles when determining if direct play is possible. Only has an effect when directPlay=1 and both mediaIndex and partIndex are specified and neither are -1 - HasMDE *components.BoolInt `queryParam:"style=form,explode=true,name=hasMDE"` + HasMDE *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=hasMDE"` // Network type of the client, can be used to help determine target bitrate. Location *Location `queryParam:"style=form,explode=true,name=location"` // Buffer size used in playback (in KB). Clients should specify a lower bound if not known exactly. This value could make the difference between transcoding and direct play on bandwidth constrained networks. diff --git a/models/operations/modifydevice.go b/models/operations/modifydevice.go index 8347307..5b542c7 100644 --- a/models/operations/modifydevice.go +++ b/models/operations/modifydevice.go @@ -147,7 +147,7 @@ type ModifyDeviceRequest struct { // The ID of the device. DeviceID int64 `pathParam:"style=simple,explode=false,name=deviceId"` // Whether to enable the device - Enabled *components.BoolInt `queryParam:"style=form,explode=true,name=enabled"` + Enabled *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=enabled"` } func (m ModifyDeviceRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/modifyplaylistgenerator.go b/models/operations/modifyplaylistgenerator.go index c881a01..10d42b3 100644 --- a/models/operations/modifyplaylistgenerator.go +++ b/models/operations/modifyplaylistgenerator.go @@ -163,7 +163,18 @@ func (e *QueryParamScope) UnmarshalJSON(data []byte) error { type Policy struct { Value *int64 `queryParam:"name=value"` Scope *QueryParamScope `queryParam:"name=scope"` - Unwatched *components.BoolInt `queryParam:"name=unwatched"` + Unwatched *components.BoolInt `default:"0" queryParam:"name=unwatched"` +} + +func (p Policy) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(p, "", false) +} + +func (p *Policy) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &p, "", false, nil); err != nil { + return err + } + return nil } func (p *Policy) GetValue() *int64 { diff --git a/models/operations/optimizedatabase.go b/models/operations/optimizedatabase.go index 6c877bb..028cfa2 100644 --- a/models/operations/optimizedatabase.go +++ b/models/operations/optimizedatabase.go @@ -145,7 +145,7 @@ type OptimizeDatabaseRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // If set, don't wait for completion but return an activity - Async *components.BoolInt `queryParam:"style=form,explode=true,name=async"` + Async *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=async"` } func (o OptimizeDatabaseRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/postuserssignindata.go b/models/operations/postuserssignindata.go new file mode 100644 index 0000000..f7099fe --- /dev/null +++ b/models/operations/postuserssignindata.go @@ -0,0 +1,1168 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package operations + +import ( + "encoding/json" + "fmt" + "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/models/components" + "net/http" +) + +var PostUsersSignInDataServerList = []string{ + "https://plex.tv/api/v2", +} + +type PostUsersSignInDataGlobals struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` + // The name of the client product + Product *string `header:"style=simple,explode=false,name=X-Plex-Product"` + // The version of the client application + Version *string `header:"style=simple,explode=false,name=X-Plex-Version"` + // The platform of the client + Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"` + // The version of the platform + PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"` + // A relatively friendly name for the client device + Device *string `header:"style=simple,explode=false,name=X-Plex-Device"` + // A potentially less friendly identifier for the device model + Model *string `header:"style=simple,explode=false,name=X-Plex-Model"` + // The device vendor + DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"` + // A friendly name for the client + DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` + // The marketplace on which the client application is distributed + Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` +} + +func (p PostUsersSignInDataGlobals) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(p, "", false) +} + +func (p *PostUsersSignInDataGlobals) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &p, "", false, nil); err != nil { + return err + } + return nil +} + +func (p *PostUsersSignInDataGlobals) GetAccepts() *components.Accepts { + if p == nil { + return nil + } + return p.Accepts +} + +func (p *PostUsersSignInDataGlobals) GetClientIdentifier() *string { + if p == nil { + return nil + } + return p.ClientIdentifier +} + +func (p *PostUsersSignInDataGlobals) GetProduct() *string { + if p == nil { + return nil + } + return p.Product +} + +func (p *PostUsersSignInDataGlobals) GetVersion() *string { + if p == nil { + return nil + } + return p.Version +} + +func (p *PostUsersSignInDataGlobals) GetPlatform() *string { + if p == nil { + return nil + } + return p.Platform +} + +func (p *PostUsersSignInDataGlobals) GetPlatformVersion() *string { + if p == nil { + return nil + } + return p.PlatformVersion +} + +func (p *PostUsersSignInDataGlobals) GetDevice() *string { + if p == nil { + return nil + } + return p.Device +} + +func (p *PostUsersSignInDataGlobals) GetModel() *string { + if p == nil { + return nil + } + return p.Model +} + +func (p *PostUsersSignInDataGlobals) GetDeviceVendor() *string { + if p == nil { + return nil + } + return p.DeviceVendor +} + +func (p *PostUsersSignInDataGlobals) GetDeviceName() *string { + if p == nil { + return nil + } + return p.DeviceName +} + +func (p *PostUsersSignInDataGlobals) GetMarketplace() *string { + if p == nil { + return nil + } + return p.Marketplace +} + +// PostUsersSignInDataRequestBody - Login credentials +type PostUsersSignInDataRequestBody struct { + Login string `form:"name=login"` + Password string `form:"name=password"` + RememberMe *bool `default:"false" form:"name=rememberMe"` + VerificationCode *string `form:"name=verificationCode"` +} + +func (p PostUsersSignInDataRequestBody) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(p, "", false) +} + +func (p *PostUsersSignInDataRequestBody) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &p, "", false, []string{"login", "password"}); err != nil { + return err + } + return nil +} + +func (p *PostUsersSignInDataRequestBody) GetLogin() string { + if p == nil { + return "" + } + return p.Login +} + +func (p *PostUsersSignInDataRequestBody) GetPassword() string { + if p == nil { + return "" + } + return p.Password +} + +func (p *PostUsersSignInDataRequestBody) GetRememberMe() *bool { + if p == nil { + return nil + } + return p.RememberMe +} + +func (p *PostUsersSignInDataRequestBody) GetVerificationCode() *string { + if p == nil { + return nil + } + return p.VerificationCode +} + +type PostUsersSignInDataRequest struct { + // Indicates the client accepts the indicated media types + Accepts *components.Accepts `default:"application/xml" header:"style=simple,explode=false,name=accepts"` + // An opaque identifier unique to the client + ClientIdentifier *string `header:"style=simple,explode=false,name=X-Plex-Client-Identifier"` + // The name of the client product + Product *string `header:"style=simple,explode=false,name=X-Plex-Product"` + // The version of the client application + Version *string `header:"style=simple,explode=false,name=X-Plex-Version"` + // The platform of the client + Platform *string `header:"style=simple,explode=false,name=X-Plex-Platform"` + // The version of the platform + PlatformVersion *string `header:"style=simple,explode=false,name=X-Plex-Platform-Version"` + // A relatively friendly name for the client device + Device *string `header:"style=simple,explode=false,name=X-Plex-Device"` + // A potentially less friendly identifier for the device model + Model *string `header:"style=simple,explode=false,name=X-Plex-Model"` + // The device vendor + DeviceVendor *string `header:"style=simple,explode=false,name=X-Plex-Device-Vendor"` + // A friendly name for the client + DeviceName *string `header:"style=simple,explode=false,name=X-Plex-Device-Name"` + // The marketplace on which the client application is distributed + Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` + // Login credentials + RequestBody *PostUsersSignInDataRequestBody `request:"mediaType=application/x-www-form-urlencoded"` +} + +func (p PostUsersSignInDataRequest) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(p, "", false) +} + +func (p *PostUsersSignInDataRequest) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &p, "", false, nil); err != nil { + return err + } + return nil +} + +func (p *PostUsersSignInDataRequest) GetAccepts() *components.Accepts { + if p == nil { + return nil + } + return p.Accepts +} + +func (p *PostUsersSignInDataRequest) GetClientIdentifier() *string { + if p == nil { + return nil + } + return p.ClientIdentifier +} + +func (p *PostUsersSignInDataRequest) GetProduct() *string { + if p == nil { + return nil + } + return p.Product +} + +func (p *PostUsersSignInDataRequest) GetVersion() *string { + if p == nil { + return nil + } + return p.Version +} + +func (p *PostUsersSignInDataRequest) GetPlatform() *string { + if p == nil { + return nil + } + return p.Platform +} + +func (p *PostUsersSignInDataRequest) GetPlatformVersion() *string { + if p == nil { + return nil + } + return p.PlatformVersion +} + +func (p *PostUsersSignInDataRequest) GetDevice() *string { + if p == nil { + return nil + } + return p.Device +} + +func (p *PostUsersSignInDataRequest) GetModel() *string { + if p == nil { + return nil + } + return p.Model +} + +func (p *PostUsersSignInDataRequest) GetDeviceVendor() *string { + if p == nil { + return nil + } + return p.DeviceVendor +} + +func (p *PostUsersSignInDataRequest) GetDeviceName() *string { + if p == nil { + return nil + } + return p.DeviceName +} + +func (p *PostUsersSignInDataRequest) GetMarketplace() *string { + if p == nil { + return nil + } + return p.Marketplace +} + +func (p *PostUsersSignInDataRequest) GetRequestBody() *PostUsersSignInDataRequestBody { + if p == nil { + return nil + } + return p.RequestBody +} + +// MailingListStatus - Your current mailing list status +type MailingListStatus string + +const ( + MailingListStatusActive MailingListStatus = "active" + MailingListStatusUnsubscribed MailingListStatus = "unsubscribed" + MailingListStatusRemoved MailingListStatus = "removed" +) + +func (e MailingListStatus) ToPointer() *MailingListStatus { + return &e +} +func (e *MailingListStatus) UnmarshalJSON(data []byte) error { + var v string + if err := json.Unmarshal(data, &v); err != nil { + return err + } + switch v { + case "active": + fallthrough + case "unsubscribed": + fallthrough + case "removed": + *e = MailingListStatus(v) + return nil + default: + return fmt.Errorf("invalid value for MailingListStatus: %v", v) + } +} + +type Status string + +const ( + StatusOnline Status = "online" + StatusOffline Status = "offline" +) + +func (e Status) ToPointer() *Status { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *Status) IsExact() bool { + if e != nil { + switch *e { + case "online", "offline": + return true + } + } + return false +} + +type Services struct { + Identifier string `json:"identifier"` + Endpoint string `json:"endpoint"` + Token *string `json:"token"` + Secret *string `json:"secret"` + Status Status `json:"status"` +} + +func (s *Services) GetIdentifier() string { + if s == nil { + return "" + } + return s.Identifier +} + +func (s *Services) GetEndpoint() string { + if s == nil { + return "" + } + return s.Endpoint +} + +func (s *Services) GetToken() *string { + if s == nil { + return nil + } + return s.Token +} + +func (s *Services) GetSecret() *string { + if s == nil { + return nil + } + return s.Secret +} + +func (s *Services) GetStatus() Status { + if s == nil { + return Status("") + } + return s.Status +} + +// PostUsersSignInDataStatus - String representation of subscriptionActive +type PostUsersSignInDataStatus string + +const ( + PostUsersSignInDataStatusInactive PostUsersSignInDataStatus = "Inactive" + PostUsersSignInDataStatusActive PostUsersSignInDataStatus = "Active" +) + +func (e PostUsersSignInDataStatus) ToPointer() *PostUsersSignInDataStatus { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *PostUsersSignInDataStatus) IsExact() bool { + if e != nil { + switch *e { + case "Inactive", "Active": + return true + } + } + return false +} + +// Subscription - If the account's Plex Pass subscription is active +type Subscription struct { + // List of features allowed on your Plex Pass subscription + Features []string `json:"features,omitempty"` + // If the account's Plex Pass subscription is active + Active *bool `json:"active,omitempty"` + // Date the account subscribed to Plex Pass + SubscribedAt *string `json:"subscribedAt,omitempty"` + // String representation of subscriptionActive + Status *PostUsersSignInDataStatus `json:"status,omitempty"` + // Payment service used for your Plex Pass subscription + PaymentService *string `json:"paymentService,omitempty"` + // Name of Plex Pass subscription plan + Plan *string `json:"plan,omitempty"` +} + +func (s *Subscription) GetFeatures() []string { + if s == nil { + return nil + } + return s.Features +} + +func (s *Subscription) GetActive() *bool { + if s == nil { + return nil + } + return s.Active +} + +func (s *Subscription) GetSubscribedAt() *string { + if s == nil { + return nil + } + return s.SubscribedAt +} + +func (s *Subscription) GetStatus() *PostUsersSignInDataStatus { + if s == nil { + return nil + } + return s.Status +} + +func (s *Subscription) GetPaymentService() *string { + if s == nil { + return nil + } + return s.PaymentService +} + +func (s *Subscription) GetPlan() *string { + if s == nil { + return nil + } + return s.Plan +} + +// PostUsersSignInDataAuthenticationStatus - String representation of subscriptionActive +type PostUsersSignInDataAuthenticationStatus string + +const ( + PostUsersSignInDataAuthenticationStatusInactive PostUsersSignInDataAuthenticationStatus = "Inactive" + PostUsersSignInDataAuthenticationStatusActive PostUsersSignInDataAuthenticationStatus = "Active" +) + +func (e PostUsersSignInDataAuthenticationStatus) ToPointer() *PostUsersSignInDataAuthenticationStatus { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *PostUsersSignInDataAuthenticationStatus) IsExact() bool { + if e != nil { + switch *e { + case "Inactive", "Active": + return true + } + } + return false +} + +type PostUsersSignInDataSubscription struct { + // List of features allowed on your Plex Pass subscription + Features []string `json:"features,omitempty"` + // If the account's Plex Pass subscription is active + Active *bool `json:"active,omitempty"` + // Date the account subscribed to Plex Pass + SubscribedAt *string `json:"subscribedAt,omitempty"` + // String representation of subscriptionActive + Status *PostUsersSignInDataAuthenticationStatus `json:"status,omitempty"` + // Payment service used for your Plex Pass subscription + PaymentService *string `json:"paymentService,omitempty"` + // Name of Plex Pass subscription plan + Plan *string `json:"plan,omitempty"` +} + +func (p *PostUsersSignInDataSubscription) GetFeatures() []string { + if p == nil { + return nil + } + return p.Features +} + +func (p *PostUsersSignInDataSubscription) GetActive() *bool { + if p == nil { + return nil + } + return p.Active +} + +func (p *PostUsersSignInDataSubscription) GetSubscribedAt() *string { + if p == nil { + return nil + } + return p.SubscribedAt +} + +func (p *PostUsersSignInDataSubscription) GetStatus() *PostUsersSignInDataAuthenticationStatus { + if p == nil { + return nil + } + return p.Status +} + +func (p *PostUsersSignInDataSubscription) GetPaymentService() *string { + if p == nil { + return nil + } + return p.PaymentService +} + +func (p *PostUsersSignInDataSubscription) GetPlan() *string { + if p == nil { + return nil + } + return p.Plan +} + +type PostUsersSignInDataState string + +const ( + PostUsersSignInDataStateEnded PostUsersSignInDataState = "ended" +) + +func (e PostUsersSignInDataState) ToPointer() *PostUsersSignInDataState { + return &e +} + +// IsExact returns true if the value matches a known enum value, false otherwise. +func (e *PostUsersSignInDataState) IsExact() bool { + if e != nil { + switch *e { + case "ended": + return true + } + } + return false +} + +type InternalPaymentMethod struct { +} + +type Billing struct { + InternalPaymentMethod InternalPaymentMethod `json:"internalPaymentMethod"` + PaymentMethodID *int64 `json:"paymentMethodId"` +} + +func (b *Billing) GetInternalPaymentMethod() InternalPaymentMethod { + if b == nil { + return InternalPaymentMethod{} + } + return b.InternalPaymentMethod +} + +func (b *Billing) GetPaymentMethodID() *int64 { + if b == nil { + return nil + } + return b.PaymentMethodID +} + +type PastSubscription struct { + ID *string `json:"id"` + Mode *string `json:"mode"` + RenewsAt *int64 `json:"renewsAt"` + EndsAt *int64 `json:"endsAt"` + Canceled *bool `default:"false" json:"canceled"` + GracePeriod *bool `default:"false" json:"gracePeriod"` + OnHold *bool `default:"false" json:"onHold"` + CanReactivate *bool `default:"false" json:"canReactivate"` + CanUpgrade *bool `default:"false" json:"canUpgrade"` + CanDowngrade *bool `default:"false" json:"canDowngrade"` + CanConvert *bool `default:"false" json:"canConvert"` + Type string `json:"type"` + Transfer *string `json:"transfer"` + State PostUsersSignInDataState `json:"state"` + Billing Billing `json:"billing"` +} + +func (p PastSubscription) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(p, "", false) +} + +func (p *PastSubscription) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &p, "", false, []string{"type", "state", "billing"}); err != nil { + return err + } + return nil +} + +func (p *PastSubscription) GetID() *string { + if p == nil { + return nil + } + return p.ID +} + +func (p *PastSubscription) GetMode() *string { + if p == nil { + return nil + } + return p.Mode +} + +func (p *PastSubscription) GetRenewsAt() *int64 { + if p == nil { + return nil + } + return p.RenewsAt +} + +func (p *PastSubscription) GetEndsAt() *int64 { + if p == nil { + return nil + } + return p.EndsAt +} + +func (p *PastSubscription) GetCanceled() *bool { + if p == nil { + return nil + } + return p.Canceled +} + +func (p *PastSubscription) GetGracePeriod() *bool { + if p == nil { + return nil + } + return p.GracePeriod +} + +func (p *PastSubscription) GetOnHold() *bool { + if p == nil { + return nil + } + return p.OnHold +} + +func (p *PastSubscription) GetCanReactivate() *bool { + if p == nil { + return nil + } + return p.CanReactivate +} + +func (p *PastSubscription) GetCanUpgrade() *bool { + if p == nil { + return nil + } + return p.CanUpgrade +} + +func (p *PastSubscription) GetCanDowngrade() *bool { + if p == nil { + return nil + } + return p.CanDowngrade +} + +func (p *PastSubscription) GetCanConvert() *bool { + if p == nil { + return nil + } + return p.CanConvert +} + +func (p *PastSubscription) GetType() string { + if p == nil { + return "" + } + return p.Type +} + +func (p *PastSubscription) GetTransfer() *string { + if p == nil { + return nil + } + return p.Transfer +} + +func (p *PastSubscription) GetState() PostUsersSignInDataState { + if p == nil { + return PostUsersSignInDataState("") + } + return p.State +} + +func (p *PastSubscription) GetBilling() Billing { + if p == nil { + return Billing{} + } + return p.Billing +} + +type Trials struct { +} + +// PostUsersSignInDataUserPlexAccount - Returns the user account data with a valid auth token +type PostUsersSignInDataUserPlexAccount struct { + // Unknown + AdsConsent *bool `json:"adsConsent,omitempty"` + AdsConsentReminderAt *int64 `json:"adsConsentReminderAt,omitempty"` + AdsConsentSetAt *int64 `json:"adsConsentSetAt,omitempty"` + // Unknown + Anonymous *bool `default:"false" json:"anonymous"` + // The account token + AuthToken string `json:"authToken"` + // If the two-factor authentication backup codes have been created + BackupCodesCreated *bool `default:"false" json:"backupCodesCreated"` + // If the account has been confirmed + Confirmed *bool `default:"false" json:"confirmed"` + // The account country + Country *string `json:"country,omitempty"` + // The account email address + Email string `json:"email"` + // If login with email only is enabled + EmailOnlyAuth *bool `default:"false" json:"emailOnlyAuth"` + // If experimental features are enabled + ExperimentalFeatures *bool `default:"false" json:"experimentalFeatures"` + // Your account full name + FriendlyName string `json:"friendlyName"` + // List of devices your allowed to use with this account + Entitlements []string `json:"entitlements,omitempty"` + // If the account is a Plex Home guest user + Guest *bool `default:"false" json:"guest"` + // If the account has a password + HasPassword *bool `default:"true" json:"hasPassword"` + // If the account is a Plex Home user + Home *bool `default:"false" json:"home"` + // If the account is the Plex Home admin + HomeAdmin *bool `default:"false" json:"homeAdmin"` + // The number of accounts in the Plex Home + HomeSize *int `json:"homeSize,omitempty"` + // The Plex account ID + ID int `json:"id"` + // Unix epoch datetime in seconds + JoinedAt int64 `json:"joinedAt"` + // The account locale + Locale *string `json:"locale,omitempty"` + // If you are subscribed to the Plex newsletter + MailingListActive *bool `default:"false" json:"mailingListActive"` + // Your current mailing list status + MailingListStatus *MailingListStatus `json:"mailingListStatus,omitempty"` + // The maximum number of accounts allowed in the Plex Home + MaxHomeSize *int `json:"maxHomeSize,omitempty"` + // [Might be removed] The hashed Plex Home PIN + // + // Deprecated: This will be removed in a future release, please migrate away from it as soon as possible. + Pin *string `json:"pin,omitempty"` + Profile *components.UserProfile `json:"profile,omitempty"` + // If the account has a Plex Home PIN enabled + Protected *bool `default:"false" json:"protected"` + // Unix epoch datetime in seconds + RememberExpiresAt *int64 `json:"rememberExpiresAt,omitempty"` + // If the account is a Plex Home managed user + Restricted *bool `default:"false" json:"restricted"` + // [Might be removed] List of account roles. Plexpass membership listed here + Roles []string `json:"roles,omitempty"` + // Unknown + ScrobbleTypes *string `json:"scrobbleTypes,omitempty"` + Services []Services `json:"services,omitempty"` + // If the account's Plex Pass subscription is active + Subscription *Subscription `json:"subscription,omitempty"` + // Description of the Plex Pass subscription + SubscriptionDescription *string `json:"subscriptionDescription,omitempty"` + Subscriptions []PostUsersSignInDataSubscription `json:"subscriptions,omitempty"` + // URL of the account thumbnail + Thumb *string `json:"thumb,omitempty"` + // The title of the account (username or friendly name) + Title string `json:"title"` + // If two-factor authentication is enabled + TwoFactorEnabled *bool `default:"false" json:"twoFactorEnabled"` + // The account username + Username string `json:"username"` + // The account UUID + UUID string `json:"uuid"` + AttributionPartner *string `json:"attributionPartner,omitempty"` + PastSubscriptions []PastSubscription `json:"pastSubscriptions"` + Trials []Trials `json:"trials"` +} + +func (p PostUsersSignInDataUserPlexAccount) MarshalJSON() ([]byte, error) { + return utils.MarshalJSON(p, "", false) +} + +func (p *PostUsersSignInDataUserPlexAccount) UnmarshalJSON(data []byte) error { + if err := utils.UnmarshalJSON(data, &p, "", false, []string{"authToken", "email", "friendlyName", "id", "joinedAt", "title", "username", "uuid", "pastSubscriptions", "trials"}); err != nil { + return err + } + return nil +} + +func (p *PostUsersSignInDataUserPlexAccount) GetAdsConsent() *bool { + if p == nil { + return nil + } + return p.AdsConsent +} + +func (p *PostUsersSignInDataUserPlexAccount) GetAdsConsentReminderAt() *int64 { + if p == nil { + return nil + } + return p.AdsConsentReminderAt +} + +func (p *PostUsersSignInDataUserPlexAccount) GetAdsConsentSetAt() *int64 { + if p == nil { + return nil + } + return p.AdsConsentSetAt +} + +func (p *PostUsersSignInDataUserPlexAccount) GetAnonymous() *bool { + if p == nil { + return nil + } + return p.Anonymous +} + +func (p *PostUsersSignInDataUserPlexAccount) GetAuthToken() string { + if p == nil { + return "" + } + return p.AuthToken +} + +func (p *PostUsersSignInDataUserPlexAccount) GetBackupCodesCreated() *bool { + if p == nil { + return nil + } + return p.BackupCodesCreated +} + +func (p *PostUsersSignInDataUserPlexAccount) GetConfirmed() *bool { + if p == nil { + return nil + } + return p.Confirmed +} + +func (p *PostUsersSignInDataUserPlexAccount) GetCountry() *string { + if p == nil { + return nil + } + return p.Country +} + +func (p *PostUsersSignInDataUserPlexAccount) GetEmail() string { + if p == nil { + return "" + } + return p.Email +} + +func (p *PostUsersSignInDataUserPlexAccount) GetEmailOnlyAuth() *bool { + if p == nil { + return nil + } + return p.EmailOnlyAuth +} + +func (p *PostUsersSignInDataUserPlexAccount) GetExperimentalFeatures() *bool { + if p == nil { + return nil + } + return p.ExperimentalFeatures +} + +func (p *PostUsersSignInDataUserPlexAccount) GetFriendlyName() string { + if p == nil { + return "" + } + return p.FriendlyName +} + +func (p *PostUsersSignInDataUserPlexAccount) GetEntitlements() []string { + if p == nil { + return nil + } + return p.Entitlements +} + +func (p *PostUsersSignInDataUserPlexAccount) GetGuest() *bool { + if p == nil { + return nil + } + return p.Guest +} + +func (p *PostUsersSignInDataUserPlexAccount) GetHasPassword() *bool { + if p == nil { + return nil + } + return p.HasPassword +} + +func (p *PostUsersSignInDataUserPlexAccount) GetHome() *bool { + if p == nil { + return nil + } + return p.Home +} + +func (p *PostUsersSignInDataUserPlexAccount) GetHomeAdmin() *bool { + if p == nil { + return nil + } + return p.HomeAdmin +} + +func (p *PostUsersSignInDataUserPlexAccount) GetHomeSize() *int { + if p == nil { + return nil + } + return p.HomeSize +} + +func (p *PostUsersSignInDataUserPlexAccount) GetID() int { + if p == nil { + return 0 + } + return p.ID +} + +func (p *PostUsersSignInDataUserPlexAccount) GetJoinedAt() int64 { + if p == nil { + return 0 + } + return p.JoinedAt +} + +func (p *PostUsersSignInDataUserPlexAccount) GetLocale() *string { + if p == nil { + return nil + } + return p.Locale +} + +func (p *PostUsersSignInDataUserPlexAccount) GetMailingListActive() *bool { + if p == nil { + return nil + } + return p.MailingListActive +} + +func (p *PostUsersSignInDataUserPlexAccount) GetMailingListStatus() *MailingListStatus { + if p == nil { + return nil + } + return p.MailingListStatus +} + +func (p *PostUsersSignInDataUserPlexAccount) GetMaxHomeSize() *int { + if p == nil { + return nil + } + return p.MaxHomeSize +} + +func (p *PostUsersSignInDataUserPlexAccount) GetPin() *string { + if p == nil { + return nil + } + return p.Pin +} + +func (p *PostUsersSignInDataUserPlexAccount) GetProfile() *components.UserProfile { + if p == nil { + return nil + } + return p.Profile +} + +func (p *PostUsersSignInDataUserPlexAccount) GetProtected() *bool { + if p == nil { + return nil + } + return p.Protected +} + +func (p *PostUsersSignInDataUserPlexAccount) GetRememberExpiresAt() *int64 { + if p == nil { + return nil + } + return p.RememberExpiresAt +} + +func (p *PostUsersSignInDataUserPlexAccount) GetRestricted() *bool { + if p == nil { + return nil + } + return p.Restricted +} + +func (p *PostUsersSignInDataUserPlexAccount) GetRoles() []string { + if p == nil { + return nil + } + return p.Roles +} + +func (p *PostUsersSignInDataUserPlexAccount) GetScrobbleTypes() *string { + if p == nil { + return nil + } + return p.ScrobbleTypes +} + +func (p *PostUsersSignInDataUserPlexAccount) GetServices() []Services { + if p == nil { + return nil + } + return p.Services +} + +func (p *PostUsersSignInDataUserPlexAccount) GetSubscription() *Subscription { + if p == nil { + return nil + } + return p.Subscription +} + +func (p *PostUsersSignInDataUserPlexAccount) GetSubscriptionDescription() *string { + if p == nil { + return nil + } + return p.SubscriptionDescription +} + +func (p *PostUsersSignInDataUserPlexAccount) GetSubscriptions() []PostUsersSignInDataSubscription { + if p == nil { + return nil + } + return p.Subscriptions +} + +func (p *PostUsersSignInDataUserPlexAccount) GetThumb() *string { + if p == nil { + return nil + } + return p.Thumb +} + +func (p *PostUsersSignInDataUserPlexAccount) GetTitle() string { + if p == nil { + return "" + } + return p.Title +} + +func (p *PostUsersSignInDataUserPlexAccount) GetTwoFactorEnabled() *bool { + if p == nil { + return nil + } + return p.TwoFactorEnabled +} + +func (p *PostUsersSignInDataUserPlexAccount) GetUsername() string { + if p == nil { + return "" + } + return p.Username +} + +func (p *PostUsersSignInDataUserPlexAccount) GetUUID() string { + if p == nil { + return "" + } + return p.UUID +} + +func (p *PostUsersSignInDataUserPlexAccount) GetAttributionPartner() *string { + if p == nil { + return nil + } + return p.AttributionPartner +} + +func (p *PostUsersSignInDataUserPlexAccount) GetPastSubscriptions() []PastSubscription { + if p == nil { + return []PastSubscription{} + } + return p.PastSubscriptions +} + +func (p *PostUsersSignInDataUserPlexAccount) GetTrials() []Trials { + if p == nil { + return []Trials{} + } + return p.Trials +} + +type PostUsersSignInDataResponse struct { + // HTTP response content type for this operation + ContentType string + // HTTP response status code for this operation + StatusCode int + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response + // Returns the user account data with a valid auth token + UserPlexAccount *PostUsersSignInDataUserPlexAccount +} + +func (p *PostUsersSignInDataResponse) GetContentType() string { + if p == nil { + return "" + } + return p.ContentType +} + +func (p *PostUsersSignInDataResponse) GetStatusCode() int { + if p == nil { + return 0 + } + return p.StatusCode +} + +func (p *PostUsersSignInDataResponse) GetRawResponse() *http.Response { + if p == nil { + return nil + } + return p.RawResponse +} + +func (p *PostUsersSignInDataResponse) GetUserPlexAccount() *PostUsersSignInDataUserPlexAccount { + if p == nil { + return nil + } + return p.UserPlexAccount +} diff --git a/models/operations/refreshitemsmetadata.go b/models/operations/refreshitemsmetadata.go index 330ca03..10855b5 100644 --- a/models/operations/refreshitemsmetadata.go +++ b/models/operations/refreshitemsmetadata.go @@ -146,7 +146,7 @@ type RefreshItemsMetadataRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids string `pathParam:"style=simple,explode=false,name=ids"` Agent *string `queryParam:"style=form,explode=true,name=agent"` - MarkUpdated *components.BoolInt `queryParam:"style=form,explode=true,name=markUpdated"` + MarkUpdated *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=markUpdated"` } func (r RefreshItemsMetadataRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/refreshsection.go b/models/operations/refreshsection.go index 0ad34f8..ee3bea0 100644 --- a/models/operations/refreshsection.go +++ b/models/operations/refreshsection.go @@ -147,7 +147,7 @@ type RefreshSectionRequest struct { // Section identifier SectionID int64 `pathParam:"style=simple,explode=false,name=sectionId"` // Whether the update of metadata and items should be performed even if modification dates indicate the items have not change - Force *components.BoolInt `queryParam:"style=form,explode=true,name=force"` + Force *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=force"` // Restrict refresh to the specified path Path *string `queryParam:"style=form,explode=true,name=path"` } diff --git a/models/operations/report.go b/models/operations/report.go index 07b55fb..269bd97 100644 --- a/models/operations/report.go +++ b/models/operations/report.go @@ -192,11 +192,11 @@ type ReportRequest struct { // The total duration of the item in ms. Duration *int64 `queryParam:"style=form,explode=true,name=duration"` // When state is `stopped`, a flag indicating whether or not the client is going to continue playing anothe item. - Continuing *components.BoolInt `queryParam:"style=form,explode=true,name=continuing"` + Continuing *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=continuing"` // Used when a sync client comes online and is syncing media timelines, holds the time at which the playback state was last updated. Updated *int64 `queryParam:"style=form,explode=true,name=updated"` // Also used by sync clients, used to indicate that a timeline is being synced from being offline, as opposed to being "live". - Offline *components.BoolInt `queryParam:"style=form,explode=true,name=offline"` + Offline *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=offline"` // Time in seconds till first frame is displayed. Sent only on the first playing timeline request. TimeToFirstFrame *int64 `queryParam:"style=form,explode=true,name=timeToFirstFrame"` // Time in seconds spent buffering since last request. diff --git a/models/operations/setstreamselection.go b/models/operations/setstreamselection.go index 0f80123..1ea8d81 100644 --- a/models/operations/setstreamselection.go +++ b/models/operations/setstreamselection.go @@ -151,7 +151,7 @@ type SetStreamSelectionRequest struct { // The id of the subtitle stream to select in this part. Specify 0 to select no subtitle SubtitleStreamID *int64 `queryParam:"style=form,explode=true,name=subtitleStreamID"` // Perform the same for all parts of this media selecting similar streams in each - AllParts *components.BoolInt `queryParam:"style=form,explode=true,name=allParts"` + AllParts *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=allParts"` } func (s SetStreamSelectionRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/startbifgeneration.go b/models/operations/startbifgeneration.go index 3c94c91..c65acf6 100644 --- a/models/operations/startbifgeneration.go +++ b/models/operations/startbifgeneration.go @@ -145,7 +145,7 @@ type StartBifGenerationRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` Ids string `pathParam:"style=simple,explode=false,name=ids"` - Force *components.BoolInt `queryParam:"style=form,explode=true,name=force"` + Force *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=force"` } func (s StartBifGenerationRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/starttask.go b/models/operations/starttask.go index 3c608eb..216d431 100644 --- a/models/operations/starttask.go +++ b/models/operations/starttask.go @@ -123,38 +123,38 @@ func (s *StartTaskGlobals) GetMarketplace() *string { return s.Marketplace } -// PathParamTask - The task name -type PathParamTask string +// PathParamButlerTask - The task name +type PathParamButlerTask string const ( - PathParamTaskAutomaticUpdates PathParamTask = "AutomaticUpdates" - PathParamTaskBackupDatabase PathParamTask = "BackupDatabase" - PathParamTaskButlerTaskGenerateAdMarkers PathParamTask = "ButlerTaskGenerateAdMarkers" - PathParamTaskButlerTaskGenerateCreditsMarkers PathParamTask = "ButlerTaskGenerateCreditsMarkers" - PathParamTaskButlerTaskGenerateIntroMarkers PathParamTask = "ButlerTaskGenerateIntroMarkers" - PathParamTaskButlerTaskGenerateVoiceActivity PathParamTask = "ButlerTaskGenerateVoiceActivity" - PathParamTaskCleanOldBundles PathParamTask = "CleanOldBundles" - PathParamTaskCleanOldCacheFiles PathParamTask = "CleanOldCacheFiles" - PathParamTaskDeepMediaAnalysis PathParamTask = "DeepMediaAnalysis" - PathParamTaskGarbageCollectBlobs PathParamTask = "GarbageCollectBlobs" - PathParamTaskGarbageCollectLibraryMedia PathParamTask = "GarbageCollectLibraryMedia" - PathParamTaskGenerateBlurHashes PathParamTask = "GenerateBlurHashes" - PathParamTaskGenerateChapterThumbs PathParamTask = "GenerateChapterThumbs" - PathParamTaskGenerateMediaIndexFiles PathParamTask = "GenerateMediaIndexFiles" - PathParamTaskLoudnessAnalysis PathParamTask = "LoudnessAnalysis" - PathParamTaskMusicAnalysis PathParamTask = "MusicAnalysis" - PathParamTaskOptimizeDatabase PathParamTask = "OptimizeDatabase" - PathParamTaskRefreshEpgGuides PathParamTask = "RefreshEpgGuides" - PathParamTaskRefreshLibraries PathParamTask = "RefreshLibraries" - PathParamTaskRefreshLocalMedia PathParamTask = "RefreshLocalMedia" - PathParamTaskRefreshPeriodicMetadata PathParamTask = "RefreshPeriodicMetadata" - PathParamTaskUpgradeMediaAnalysis PathParamTask = "UpgradeMediaAnalysis" + PathParamButlerTaskAutomaticUpdates PathParamButlerTask = "AutomaticUpdates" + PathParamButlerTaskBackupDatabase PathParamButlerTask = "BackupDatabase" + PathParamButlerTaskButlerTaskGenerateAdMarkers PathParamButlerTask = "ButlerTaskGenerateAdMarkers" + PathParamButlerTaskButlerTaskGenerateCreditsMarkers PathParamButlerTask = "ButlerTaskGenerateCreditsMarkers" + PathParamButlerTaskButlerTaskGenerateIntroMarkers PathParamButlerTask = "ButlerTaskGenerateIntroMarkers" + PathParamButlerTaskButlerTaskGenerateVoiceActivity PathParamButlerTask = "ButlerTaskGenerateVoiceActivity" + PathParamButlerTaskCleanOldBundles PathParamButlerTask = "CleanOldBundles" + PathParamButlerTaskCleanOldCacheFiles PathParamButlerTask = "CleanOldCacheFiles" + PathParamButlerTaskDeepMediaAnalysis PathParamButlerTask = "DeepMediaAnalysis" + PathParamButlerTaskGarbageCollectBlobs PathParamButlerTask = "GarbageCollectBlobs" + PathParamButlerTaskGarbageCollectLibraryMedia PathParamButlerTask = "GarbageCollectLibraryMedia" + PathParamButlerTaskGenerateBlurHashes PathParamButlerTask = "GenerateBlurHashes" + PathParamButlerTaskGenerateChapterThumbs PathParamButlerTask = "GenerateChapterThumbs" + PathParamButlerTaskGenerateMediaIndexFiles PathParamButlerTask = "GenerateMediaIndexFiles" + PathParamButlerTaskLoudnessAnalysis PathParamButlerTask = "LoudnessAnalysis" + PathParamButlerTaskMusicAnalysis PathParamButlerTask = "MusicAnalysis" + PathParamButlerTaskOptimizeDatabase PathParamButlerTask = "OptimizeDatabase" + PathParamButlerTaskRefreshEpgGuides PathParamButlerTask = "RefreshEpgGuides" + PathParamButlerTaskRefreshLibraries PathParamButlerTask = "RefreshLibraries" + PathParamButlerTaskRefreshLocalMedia PathParamButlerTask = "RefreshLocalMedia" + PathParamButlerTaskRefreshPeriodicMetadata PathParamButlerTask = "RefreshPeriodicMetadata" + PathParamButlerTaskUpgradeMediaAnalysis PathParamButlerTask = "UpgradeMediaAnalysis" ) -func (e PathParamTask) ToPointer() *PathParamTask { +func (e PathParamButlerTask) ToPointer() *PathParamButlerTask { return &e } -func (e *PathParamTask) UnmarshalJSON(data []byte) error { +func (e *PathParamButlerTask) UnmarshalJSON(data []byte) error { var v string if err := json.Unmarshal(data, &v); err != nil { return err @@ -203,10 +203,10 @@ func (e *PathParamTask) UnmarshalJSON(data []byte) error { case "RefreshPeriodicMetadata": fallthrough case "UpgradeMediaAnalysis": - *e = PathParamTask(v) + *e = PathParamButlerTask(v) return nil default: - return fmt.Errorf("invalid value for PathParamTask: %v", v) + return fmt.Errorf("invalid value for PathParamButlerTask: %v", v) } } @@ -234,7 +234,7 @@ type StartTaskRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // The task name - Task PathParamTask `pathParam:"style=simple,explode=false,name=task"` + ButlerTask PathParamButlerTask `pathParam:"style=simple,explode=false,name=butlerTask"` } func (s StartTaskRequest) MarshalJSON() ([]byte, error) { @@ -242,7 +242,7 @@ func (s StartTaskRequest) MarshalJSON() ([]byte, error) { } func (s *StartTaskRequest) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &s, "", false, []string{"task"}); err != nil { + if err := utils.UnmarshalJSON(data, &s, "", false, []string{"butlerTask"}); err != nil { return err } return nil @@ -325,11 +325,11 @@ func (s *StartTaskRequest) GetMarketplace() *string { return s.Marketplace } -func (s *StartTaskRequest) GetTask() PathParamTask { +func (s *StartTaskRequest) GetButlerTask() PathParamButlerTask { if s == nil { - return PathParamTask("") + return PathParamButlerTask("") } - return s.Task + return s.ButlerTask } type StartTaskResponse struct { diff --git a/models/operations/starttranscodesession.go b/models/operations/starttranscodesession.go index 6f6d53d..d0194c2 100644 --- a/models/operations/starttranscodesession.go +++ b/models/operations/starttranscodesession.go @@ -291,19 +291,19 @@ type StartTranscodeSessionRequest struct { // Target video number of audio channels. AudioChannelCount *int64 `queryParam:"style=form,explode=true,name=audioChannelCount"` // Indicates the client supports ABR. - AutoAdjustQuality *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustQuality"` + AutoAdjustQuality *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustQuality"` // Indicates if the server should adjust subtitles based on Voice Activity Data. - AutoAdjustSubtitle *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` + AutoAdjustSubtitle *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` // Indicates the client supports direct playing the indicated content. - DirectPlay *components.BoolInt `queryParam:"style=form,explode=true,name=directPlay"` + DirectPlay *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directPlay"` // Indicates the client supports direct streaming the video of the indicated content. - DirectStream *components.BoolInt `queryParam:"style=form,explode=true,name=directStream"` + DirectStream *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStream"` // Indicates the client supports direct streaming the audio of the indicated content. - DirectStreamAudio *components.BoolInt `queryParam:"style=form,explode=true,name=directStreamAudio"` + DirectStreamAudio *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStreamAudio"` // Indicates if resolution should be adjusted for orientation. - DisableResolutionRotation *components.BoolInt `queryParam:"style=form,explode=true,name=disableResolutionRotation"` + DisableResolutionRotation *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=disableResolutionRotation"` // Ignore client profiles when determining if direct play is possible. Only has an effect when directPlay=1 and both mediaIndex and partIndex are specified and neither are -1 - HasMDE *components.BoolInt `queryParam:"style=form,explode=true,name=hasMDE"` + HasMDE *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=hasMDE"` // Network type of the client, can be used to help determine target bitrate. Location *StartTranscodeSessionQueryParamLocation `queryParam:"style=form,explode=true,name=location"` // Buffer size used in playback (in KB). Clients should specify a lower bound if not known exactly. This value could make the difference between transcoding and direct play on bandwidth constrained networks. diff --git a/models/operations/stoptask.go b/models/operations/stoptask.go index 2f57db4..4630017 100644 --- a/models/operations/stoptask.go +++ b/models/operations/stoptask.go @@ -123,38 +123,38 @@ func (s *StopTaskGlobals) GetMarketplace() *string { return s.Marketplace } -// Task - The task name -type Task string +// ButlerTask - The task name +type ButlerTask string const ( - TaskAutomaticUpdates Task = "AutomaticUpdates" - TaskBackupDatabase Task = "BackupDatabase" - TaskButlerTaskGenerateAdMarkers Task = "ButlerTaskGenerateAdMarkers" - TaskButlerTaskGenerateCreditsMarkers Task = "ButlerTaskGenerateCreditsMarkers" - TaskButlerTaskGenerateIntroMarkers Task = "ButlerTaskGenerateIntroMarkers" - TaskButlerTaskGenerateVoiceActivity Task = "ButlerTaskGenerateVoiceActivity" - TaskCleanOldBundles Task = "CleanOldBundles" - TaskCleanOldCacheFiles Task = "CleanOldCacheFiles" - TaskDeepMediaAnalysis Task = "DeepMediaAnalysis" - TaskGarbageCollectBlobs Task = "GarbageCollectBlobs" - TaskGarbageCollectLibraryMedia Task = "GarbageCollectLibraryMedia" - TaskGenerateBlurHashes Task = "GenerateBlurHashes" - TaskGenerateChapterThumbs Task = "GenerateChapterThumbs" - TaskGenerateMediaIndexFiles Task = "GenerateMediaIndexFiles" - TaskLoudnessAnalysis Task = "LoudnessAnalysis" - TaskMusicAnalysis Task = "MusicAnalysis" - TaskOptimizeDatabase Task = "OptimizeDatabase" - TaskRefreshEpgGuides Task = "RefreshEpgGuides" - TaskRefreshLibraries Task = "RefreshLibraries" - TaskRefreshLocalMedia Task = "RefreshLocalMedia" - TaskRefreshPeriodicMetadata Task = "RefreshPeriodicMetadata" - TaskUpgradeMediaAnalysis Task = "UpgradeMediaAnalysis" + ButlerTaskAutomaticUpdates ButlerTask = "AutomaticUpdates" + ButlerTaskBackupDatabase ButlerTask = "BackupDatabase" + ButlerTaskButlerTaskGenerateAdMarkers ButlerTask = "ButlerTaskGenerateAdMarkers" + ButlerTaskButlerTaskGenerateCreditsMarkers ButlerTask = "ButlerTaskGenerateCreditsMarkers" + ButlerTaskButlerTaskGenerateIntroMarkers ButlerTask = "ButlerTaskGenerateIntroMarkers" + ButlerTaskButlerTaskGenerateVoiceActivity ButlerTask = "ButlerTaskGenerateVoiceActivity" + ButlerTaskCleanOldBundles ButlerTask = "CleanOldBundles" + ButlerTaskCleanOldCacheFiles ButlerTask = "CleanOldCacheFiles" + ButlerTaskDeepMediaAnalysis ButlerTask = "DeepMediaAnalysis" + ButlerTaskGarbageCollectBlobs ButlerTask = "GarbageCollectBlobs" + ButlerTaskGarbageCollectLibraryMedia ButlerTask = "GarbageCollectLibraryMedia" + ButlerTaskGenerateBlurHashes ButlerTask = "GenerateBlurHashes" + ButlerTaskGenerateChapterThumbs ButlerTask = "GenerateChapterThumbs" + ButlerTaskGenerateMediaIndexFiles ButlerTask = "GenerateMediaIndexFiles" + ButlerTaskLoudnessAnalysis ButlerTask = "LoudnessAnalysis" + ButlerTaskMusicAnalysis ButlerTask = "MusicAnalysis" + ButlerTaskOptimizeDatabase ButlerTask = "OptimizeDatabase" + ButlerTaskRefreshEpgGuides ButlerTask = "RefreshEpgGuides" + ButlerTaskRefreshLibraries ButlerTask = "RefreshLibraries" + ButlerTaskRefreshLocalMedia ButlerTask = "RefreshLocalMedia" + ButlerTaskRefreshPeriodicMetadata ButlerTask = "RefreshPeriodicMetadata" + ButlerTaskUpgradeMediaAnalysis ButlerTask = "UpgradeMediaAnalysis" ) -func (e Task) ToPointer() *Task { +func (e ButlerTask) ToPointer() *ButlerTask { return &e } -func (e *Task) UnmarshalJSON(data []byte) error { +func (e *ButlerTask) UnmarshalJSON(data []byte) error { var v string if err := json.Unmarshal(data, &v); err != nil { return err @@ -203,10 +203,10 @@ func (e *Task) UnmarshalJSON(data []byte) error { case "RefreshPeriodicMetadata": fallthrough case "UpgradeMediaAnalysis": - *e = Task(v) + *e = ButlerTask(v) return nil default: - return fmt.Errorf("invalid value for Task: %v", v) + return fmt.Errorf("invalid value for ButlerTask: %v", v) } } @@ -234,7 +234,7 @@ type StopTaskRequest struct { // The marketplace on which the client application is distributed Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // The task name - Task Task `pathParam:"style=simple,explode=false,name=task"` + ButlerTask ButlerTask `pathParam:"style=simple,explode=false,name=butlerTask"` } func (s StopTaskRequest) MarshalJSON() ([]byte, error) { @@ -242,7 +242,7 @@ func (s StopTaskRequest) MarshalJSON() ([]byte, error) { } func (s *StopTaskRequest) UnmarshalJSON(data []byte) error { - if err := utils.UnmarshalJSON(data, &s, "", false, []string{"task"}); err != nil { + if err := utils.UnmarshalJSON(data, &s, "", false, []string{"butlerTask"}); err != nil { return err } return nil @@ -325,11 +325,11 @@ func (s *StopTaskRequest) GetMarketplace() *string { return s.Marketplace } -func (s *StopTaskRequest) GetTask() Task { +func (s *StopTaskRequest) GetButlerTask() ButlerTask { if s == nil { - return Task("") + return ButlerTask("") } - return s.Task + return s.ButlerTask } type StopTaskResponse struct { diff --git a/models/operations/transcodeimage.go b/models/operations/transcodeimage.go index 2dc6034..2c8a73a 100644 --- a/models/operations/transcodeimage.go +++ b/models/operations/transcodeimage.go @@ -232,11 +232,11 @@ type TranscodeImageRequest struct { // The background color to apply before painting the image. Only really applicable if image has transparency. Defaults to none Background *string `queryParam:"style=form,explode=true,name=background"` // Indicates if image should be upscaled to the desired width/height. Defaults to false - Upscale *components.BoolInt `queryParam:"style=form,explode=true,name=upscale"` + Upscale *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=upscale"` // Indicates if image should be scaled to fit the smaller dimension. By default (false) the image is scaled to fit within the width/height specified but if this parameter is true, it will allow overflowing one dimension to fit the other. Essentially it is making the width/height minimum sizes of the image or sizing the image to fill the entire width/height even if it overflows one dimension. - MinSize *components.BoolInt `queryParam:"style=form,explode=true,name=minSize"` + MinSize *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=minSize"` // Obey the rotation values specified in EXIF data. Defaults to true. - Rotate *components.BoolInt `queryParam:"style=form,explode=true,name=rotate"` + Rotate *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=rotate"` // Apply a blur to the image, Defaults to 0 (none) Blur *int64 `queryParam:"style=form,explode=true,name=blur"` // Scale the image saturation by the specified percentage. Defaults to 100 diff --git a/models/operations/transcodesubtitles.go b/models/operations/transcodesubtitles.go index 986721f..8772239 100644 --- a/models/operations/transcodesubtitles.go +++ b/models/operations/transcodesubtitles.go @@ -260,19 +260,19 @@ type TranscodeSubtitlesRequest struct { // Target video number of audio channels. AudioChannelCount *int64 `queryParam:"style=form,explode=true,name=audioChannelCount"` // Indicates the client supports ABR. - AutoAdjustQuality *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustQuality"` + AutoAdjustQuality *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustQuality"` // Indicates if the server should adjust subtitles based on Voice Activity Data. - AutoAdjustSubtitle *components.BoolInt `queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` + AutoAdjustSubtitle *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=autoAdjustSubtitle"` // Indicates the client supports direct playing the indicated content. - DirectPlay *components.BoolInt `queryParam:"style=form,explode=true,name=directPlay"` + DirectPlay *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directPlay"` // Indicates the client supports direct streaming the video of the indicated content. - DirectStream *components.BoolInt `queryParam:"style=form,explode=true,name=directStream"` + DirectStream *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStream"` // Indicates the client supports direct streaming the audio of the indicated content. - DirectStreamAudio *components.BoolInt `queryParam:"style=form,explode=true,name=directStreamAudio"` + DirectStreamAudio *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=directStreamAudio"` // Indicates if resolution should be adjusted for orientation. - DisableResolutionRotation *components.BoolInt `queryParam:"style=form,explode=true,name=disableResolutionRotation"` + DisableResolutionRotation *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=disableResolutionRotation"` // Ignore client profiles when determining if direct play is possible. Only has an effect when directPlay=1 and both mediaIndex and partIndex are specified and neither are -1 - HasMDE *components.BoolInt `queryParam:"style=form,explode=true,name=hasMDE"` + HasMDE *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=hasMDE"` // Network type of the client, can be used to help determine target bitrate. Location *QueryParamLocation `queryParam:"style=form,explode=true,name=location"` // Buffer size used in playback (in KB). Clients should specify a lower bound if not known exactly. This value could make the difference between transcoding and direct play on bandwidth constrained networks. diff --git a/models/operations/updatehubvisibility.go b/models/operations/updatehubvisibility.go index 4c99d6b..a322a8a 100644 --- a/models/operations/updatehubvisibility.go +++ b/models/operations/updatehubvisibility.go @@ -149,11 +149,11 @@ type UpdateHubVisibilityRequest struct { // The identifier of the hub to change Identifier string `pathParam:"style=simple,explode=false,name=identifier"` // Whether this hub should be displayed in recommended - PromotedToRecommended *components.BoolInt `queryParam:"style=form,explode=true,name=promotedToRecommended"` + PromotedToRecommended *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=promotedToRecommended"` // Whether this hub should be displayed in admin's home - PromotedToOwnHome *components.BoolInt `queryParam:"style=form,explode=true,name=promotedToOwnHome"` + PromotedToOwnHome *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=promotedToOwnHome"` // Whether this hub should be displayed in shared user's home - PromotedToSharedHome *components.BoolInt `queryParam:"style=form,explode=true,name=promotedToSharedHome"` + PromotedToSharedHome *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=promotedToSharedHome"` } func (u UpdateHubVisibilityRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/updateitems.go b/models/operations/updateitems.go index dd3e053..b59292a 100644 --- a/models/operations/updateitems.go +++ b/models/operations/updateitems.go @@ -152,7 +152,7 @@ type UpdateItemsRequest struct { // Set the specified field to a new value FieldValue *string `queryParam:"style=form,explode=true,name=field.value"` // Set the specified field to locked (or unlocked if set to 0) - FieldLocked *components.BoolInt `queryParam:"style=form,explode=true,name=field.locked"` + FieldLocked *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=field.locked"` // This field is treated specially by albums or artists and may be used for implicit reparenting. TitleValue *string `queryParam:"style=form,explode=true,name=title.value"` // Reparents set of Tracks or Albums - used with album.title.* in the case of tracks diff --git a/models/operations/uploadplaylist.go b/models/operations/uploadplaylist.go index dcf9144..7804d61 100644 --- a/models/operations/uploadplaylist.go +++ b/models/operations/uploadplaylist.go @@ -147,7 +147,7 @@ type UploadPlaylistRequest struct { // Absolute path to a directory on the server where m3u files are stored, or the absolute path to a playlist file on the server. If the `path` argument is a directory, that path will be scanned for playlist files to be processed. Each file in that directory creates a separate playlist, with a name based on the filename of the file that created it. The GUID of each playlist is based on the filename. If the `path` argument is a file, that file will be used to create a new playlist, with the name based on the filename of the file that created it. The GUID of each playlist is based on the filename. Path *string `queryParam:"style=form,explode=true,name=path"` // Force overwriting of duplicate playlists. By default, a playlist file uploaded with the same path will overwrite the existing playlist. The `force` argument is used to disable overwriting. If the `force` argument is set to 0, a new playlist will be created suffixed with the date and time that the duplicate was uploaded. - Force *components.BoolInt `queryParam:"style=form,explode=true,name=force"` + Force *components.BoolInt `default:"0" queryParam:"style=form,explode=true,name=force"` } func (u UploadPlaylistRequest) MarshalJSON() ([]byte, error) { diff --git a/models/operations/voicesearchhubs.go b/models/operations/voicesearchhubs.go index a3852e2..b4dccf1 100644 --- a/models/operations/voicesearchhubs.go +++ b/models/operations/voicesearchhubs.go @@ -146,8 +146,21 @@ type VoiceSearchHubsRequest struct { Marketplace *string `header:"style=simple,explode=false,name=X-Plex-Marketplace"` // The query term Query string `queryParam:"style=form,explode=true,name=query"` - // The metadata type to filter by - Type *int64 `queryParam:"style=form,explode=true,name=type"` + // The type of media to retrieve or filter by. + // + // 1 = movie + // 2 = show + // 3 = season + // 4 = episode + // 5 = artist + // 6 = album + // 7 = track + // 8 = photo_album + // 9 = photo + // + // E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries + // + Type *components.MediaType `queryParam:"style=form,explode=true,name=type"` // The number of items to return per hub. 3 if not specified Limit *int64 `queryParam:"style=form,explode=true,name=limit"` } @@ -247,7 +260,7 @@ func (v *VoiceSearchHubsRequest) GetQuery() string { return v.Query } -func (v *VoiceSearchHubsRequest) GetType() *int64 { +func (v *VoiceSearchHubsRequest) GetType() *components.MediaType { if v == nil { return nil } diff --git a/models/sdkerrors/getserverresources.go b/models/sdkerrors/getserverresources.go new file mode 100644 index 0000000..d9cc623 --- /dev/null +++ b/models/sdkerrors/getserverresources.go @@ -0,0 +1,49 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package sdkerrors + +import ( + "encoding/json" + "net/http" +) + +type GetServerResourcesErrors struct { + Code *int `json:"code,omitempty"` + Message *string `json:"message,omitempty"` + Status *int `json:"status,omitempty"` +} + +func (g *GetServerResourcesErrors) GetCode() *int { + if g == nil { + return nil + } + return g.Code +} + +func (g *GetServerResourcesErrors) GetMessage() *string { + if g == nil { + return nil + } + return g.Message +} + +func (g *GetServerResourcesErrors) GetStatus() *int { + if g == nil { + return nil + } + return g.Status +} + +// GetServerResourcesUnauthorized - Unauthorized - Returned if the X-Plex-Token is missing from the header or query. +type GetServerResourcesUnauthorized struct { + Errors []GetServerResourcesErrors `json:"errors,omitempty"` + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response `json:"-"` +} + +var _ error = &GetServerResourcesUnauthorized{} + +func (e *GetServerResourcesUnauthorized) Error() string { + data, _ := json.Marshal(e) + return string(data) +} diff --git a/models/sdkerrors/gettokendetails.go b/models/sdkerrors/gettokendetails.go new file mode 100644 index 0000000..2c90866 --- /dev/null +++ b/models/sdkerrors/gettokendetails.go @@ -0,0 +1,90 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package sdkerrors + +import ( + "encoding/json" + "net/http" +) + +type GetTokenDetailsErrors struct { + Code *int `json:"code,omitempty"` + Message *string `json:"message,omitempty"` + Status *int `json:"status,omitempty"` +} + +func (g *GetTokenDetailsErrors) GetCode() *int { + if g == nil { + return nil + } + return g.Code +} + +func (g *GetTokenDetailsErrors) GetMessage() *string { + if g == nil { + return nil + } + return g.Message +} + +func (g *GetTokenDetailsErrors) GetStatus() *int { + if g == nil { + return nil + } + return g.Status +} + +// GetTokenDetailsUnauthorized - Unauthorized - Returned if the X-Plex-Token is missing from the header or query. +type GetTokenDetailsUnauthorized struct { + Errors []GetTokenDetailsErrors `json:"errors,omitempty"` + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response `json:"-"` +} + +var _ error = &GetTokenDetailsUnauthorized{} + +func (e *GetTokenDetailsUnauthorized) Error() string { + data, _ := json.Marshal(e) + return string(data) +} + +type Errors struct { + Code *int `json:"code,omitempty"` + Message *string `json:"message,omitempty"` + Status *int `json:"status,omitempty"` +} + +func (e *Errors) GetCode() *int { + if e == nil { + return nil + } + return e.Code +} + +func (e *Errors) GetMessage() *string { + if e == nil { + return nil + } + return e.Message +} + +func (e *Errors) GetStatus() *int { + if e == nil { + return nil + } + return e.Status +} + +// GetTokenDetailsBadRequest - Bad Request - A parameter was not specified, or was specified incorrectly. +type GetTokenDetailsBadRequest struct { + Errors []Errors `json:"errors,omitempty"` + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response `json:"-"` +} + +var _ error = &GetTokenDetailsBadRequest{} + +func (e *GetTokenDetailsBadRequest) Error() string { + data, _ := json.Marshal(e) + return string(data) +} diff --git a/models/sdkerrors/getusers.go b/models/sdkerrors/getusers.go new file mode 100644 index 0000000..faf9a6e --- /dev/null +++ b/models/sdkerrors/getusers.go @@ -0,0 +1,90 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package sdkerrors + +import ( + "encoding/json" + "net/http" +) + +type GetUsersUsersErrors struct { + Code *int `json:"code,omitempty"` + Message *string `json:"message,omitempty"` + Status *int `json:"status,omitempty"` +} + +func (g *GetUsersUsersErrors) GetCode() *int { + if g == nil { + return nil + } + return g.Code +} + +func (g *GetUsersUsersErrors) GetMessage() *string { + if g == nil { + return nil + } + return g.Message +} + +func (g *GetUsersUsersErrors) GetStatus() *int { + if g == nil { + return nil + } + return g.Status +} + +// GetUsersUnauthorized - Unauthorized - Returned if the X-Plex-Token is missing from the header or query. +type GetUsersUnauthorized struct { + Errors []GetUsersUsersErrors `json:"errors,omitempty"` + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response `json:"-"` +} + +var _ error = &GetUsersUnauthorized{} + +func (e *GetUsersUnauthorized) Error() string { + data, _ := json.Marshal(e) + return string(data) +} + +type GetUsersErrors struct { + Code *int `json:"code,omitempty"` + Message *string `json:"message,omitempty"` + Status *int `json:"status,omitempty"` +} + +func (g *GetUsersErrors) GetCode() *int { + if g == nil { + return nil + } + return g.Code +} + +func (g *GetUsersErrors) GetMessage() *string { + if g == nil { + return nil + } + return g.Message +} + +func (g *GetUsersErrors) GetStatus() *int { + if g == nil { + return nil + } + return g.Status +} + +// GetUsersBadRequest - Bad Request - A parameter was not specified, or was specified incorrectly. +type GetUsersBadRequest struct { + Errors []GetUsersErrors `json:"errors,omitempty"` + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response `json:"-"` +} + +var _ error = &GetUsersBadRequest{} + +func (e *GetUsersBadRequest) Error() string { + data, _ := json.Marshal(e) + return string(data) +} diff --git a/models/sdkerrors/postuserssignindata.go b/models/sdkerrors/postuserssignindata.go new file mode 100644 index 0000000..fad490f --- /dev/null +++ b/models/sdkerrors/postuserssignindata.go @@ -0,0 +1,90 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package sdkerrors + +import ( + "encoding/json" + "net/http" +) + +type PostUsersSignInDataAuthenticationErrors struct { + Code *int `json:"code,omitempty"` + Message *string `json:"message,omitempty"` + Status *int `json:"status,omitempty"` +} + +func (p *PostUsersSignInDataAuthenticationErrors) GetCode() *int { + if p == nil { + return nil + } + return p.Code +} + +func (p *PostUsersSignInDataAuthenticationErrors) GetMessage() *string { + if p == nil { + return nil + } + return p.Message +} + +func (p *PostUsersSignInDataAuthenticationErrors) GetStatus() *int { + if p == nil { + return nil + } + return p.Status +} + +// PostUsersSignInDataUnauthorized - Unauthorized - Returned if the X-Plex-Token is missing from the header or query. +type PostUsersSignInDataUnauthorized struct { + Errors []PostUsersSignInDataAuthenticationErrors `json:"errors,omitempty"` + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response `json:"-"` +} + +var _ error = &PostUsersSignInDataUnauthorized{} + +func (e *PostUsersSignInDataUnauthorized) Error() string { + data, _ := json.Marshal(e) + return string(data) +} + +type PostUsersSignInDataErrors struct { + Code *int `json:"code,omitempty"` + Message *string `json:"message,omitempty"` + Status *int `json:"status,omitempty"` +} + +func (p *PostUsersSignInDataErrors) GetCode() *int { + if p == nil { + return nil + } + return p.Code +} + +func (p *PostUsersSignInDataErrors) GetMessage() *string { + if p == nil { + return nil + } + return p.Message +} + +func (p *PostUsersSignInDataErrors) GetStatus() *int { + if p == nil { + return nil + } + return p.Status +} + +// PostUsersSignInDataBadRequest - Bad Request - A parameter was not specified, or was specified incorrectly. +type PostUsersSignInDataBadRequest struct { + Errors []PostUsersSignInDataErrors `json:"errors,omitempty"` + // Raw HTTP response; suitable for custom response parsing + RawResponse *http.Response `json:"-"` +} + +var _ error = &PostUsersSignInDataBadRequest{} + +func (e *PostUsersSignInDataBadRequest) Error() string { + data, _ := json.Marshal(e) + return string(data) +} diff --git a/playlist.go b/playlist.go index 5f06284..e613c46 100644 --- a/playlist.go +++ b/playlist.go @@ -102,7 +102,7 @@ func (s *Playlist) ListPlaylists(ctx context.Context, request operations.ListPla utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -553,7 +553,7 @@ func (s *Playlist) GetPlaylistItems(ctx context.Context, request operations.GetP utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/playqueue.go b/playqueue.go index a846977..3c85bf7 100644 --- a/playqueue.go +++ b/playqueue.go @@ -108,7 +108,7 @@ func (s *PlayQueue) CreatePlayQueue(ctx context.Context, request operations.Crea utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -337,7 +337,7 @@ func (s *PlayQueue) GetPlayQueue(ctx context.Context, request operations.GetPlay utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -566,7 +566,7 @@ func (s *PlayQueue) AddToPlayQueue(ctx context.Context, request operations.AddTo utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1916,7 +1916,7 @@ func (s *PlayQueue) MovePlayQueueItem(ctx context.Context, request operations.Mo utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/plex.go b/plex.go new file mode 100644 index 0000000..b02dc70 --- /dev/null +++ b/plex.go @@ -0,0 +1,271 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package plexgo + +import ( + "bytes" + "context" + "fmt" + "github.com/LukeHagar/plexgo/internal/config" + "github.com/LukeHagar/plexgo/internal/hooks" + "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/models/components" + "github.com/LukeHagar/plexgo/models/operations" + "github.com/LukeHagar/plexgo/models/sdkerrors" + "github.com/LukeHagar/plexgo/retry" + "net/http" + "net/url" +) + +type Plex struct { + rootSDK *PlexAPI + sdkConfiguration config.SDKConfiguration + hooks *hooks.Hooks +} + +func newPlex(rootSDK *PlexAPI, sdkConfig config.SDKConfiguration, hooks *hooks.Hooks) *Plex { + return &Plex{ + rootSDK: rootSDK, + sdkConfiguration: sdkConfig, + hooks: hooks, + } +} + +// GetServerResources - Get Server Resources +// Get Plex server access tokens and server connections +func (s *Plex) GetServerResources(ctx context.Context, request operations.GetServerResourcesRequest, opts ...operations.Option) (*operations.GetServerResourcesResponse, error) { + globals := operations.GetServerResourcesGlobals{ + Accepts: s.sdkConfiguration.Globals.Accepts, + ClientIdentifier: s.sdkConfiguration.Globals.ClientIdentifier, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + baseURL := utils.ReplaceParameters(operations.GetServerResourcesServerList[0], map[string]string{}) + if o.ServerURL != nil { + baseURL = *o.ServerURL + } + + opURL, err := url.JoinPath(baseURL, "/resources") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + hookCtx := hooks.HookContext{ + SDK: s.rootSDK, + SDKConfiguration: s.sdkConfiguration, + BaseURL: baseURL, + Context: ctx, + OperationID: "get-server-resources", + OAuth2Scopes: nil, + SecuritySource: s.sdkConfiguration.Security, + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + + utils.PopulateHeaders(ctx, req, request, globals) + + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { + return nil, fmt.Errorf("error populating query params: %w", err) + } + + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } + + for k, v := range o.SetHeaders { + req.Header.Set(k, v) + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil { + copyBody, err := req.GetBody() + + if err != nil { + return nil, err + } + + req.Body = copyBody + } + + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + if retry.IsPermanentError(err) || retry.IsTemporaryError(err) { + return nil, err + } + + return nil, retry.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { + _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.GetServerResourcesResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, + } + + switch { + case httpRes.StatusCode == 200: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out []components.PlexDevice + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.PlexDevices = out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 401: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out sdkerrors.GetServerResourcesUnauthorized + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + out.RawResponse = httpRes + return nil, &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 400: + fallthrough + case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) + } + + return res, nil + +} diff --git a/plexapi.go b/plexapi.go index 1c3595e..5f8872b 100644 --- a/plexapi.go +++ b/plexapi.go @@ -2,7 +2,7 @@ package plexgo -// Generated from OpenAPI doc version 1.1.1 and generator version 2.753.1 +// Generated from OpenAPI doc version 1.1.1 and generator version 2.767.2 import ( "context" @@ -156,7 +156,10 @@ type PlexAPI struct { // 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. // - Updater *Updater + Updater *Updater + Authentication *Authentication + Users *Users + Plex *Plex // The actual content of the media provider Content *Content // Endpoints for manipulating collections. In addition to these endpoints, `/library/collections/:collectionId/X` will be rerouted to `/library/metadata/:collectionId/X` and respond to those endpoints as well. @@ -392,9 +395,9 @@ func WithTimeout(timeout time.Duration) SDKOption { // New creates a new instance of the SDK with the provided options func New(opts ...SDKOption) *PlexAPI { sdk := &PlexAPI{ - SDKVersion: "0.27.0", + SDKVersion: "0.28.0", sdkConfiguration: config.SDKConfiguration{ - UserAgent: "speakeasy-sdk/go 0.27.0 2.753.1 1.1.1 github.com/LukeHagar/plexgo", + UserAgent: "speakeasy-sdk/go 0.28.0 2.767.2 1.1.1 github.com/LukeHagar/plexgo", Globals: globals.Globals{}, ServerList: ServerList, ServerVariables: []map[string]string{ @@ -457,6 +460,9 @@ func New(opts ...SDKOption) *PlexAPI { sdk.UltraBlur = newUltraBlur(sdk, sdk.sdkConfiguration, sdk.hooks) sdk.Status = newStatus(sdk, sdk.sdkConfiguration, sdk.hooks) sdk.Updater = newUpdater(sdk, sdk.sdkConfiguration, sdk.hooks) + sdk.Authentication = newAuthentication(sdk, sdk.sdkConfiguration, sdk.hooks) + sdk.Users = newUsers(sdk, sdk.sdkConfiguration, sdk.hooks) + sdk.Plex = newPlex(sdk, sdk.sdkConfiguration, sdk.hooks) sdk.Content = newContent(sdk, sdk.sdkConfiguration, sdk.hooks) sdk.LibraryCollections = newLibraryCollections(sdk, sdk.sdkConfiguration, sdk.hooks) diff --git a/preferences.go b/preferences.go index d8ce1ab..c7ae756 100644 --- a/preferences.go +++ b/preferences.go @@ -307,7 +307,7 @@ func (s *Preferences) SetPreferences(ctx context.Context, request operations.Set utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -516,7 +516,7 @@ func (s *Preferences) GetPreference(ctx context.Context, request operations.GetP utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/provider.go b/provider.go index 865bd29..1b16d2d 100644 --- a/provider.go +++ b/provider.go @@ -306,7 +306,7 @@ func (s *Provider) AddProvider(ctx context.Context, request operations.AddProvid utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/rate.go b/rate.go index 8e68c81..0a2ca08 100644 --- a/rate.go +++ b/rate.go @@ -101,7 +101,7 @@ func (s *Rate) SetRating(ctx context.Context, request operations.SetRatingReques utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/search.go b/search.go index 2dea387..eddd26c 100644 --- a/search.go +++ b/search.go @@ -115,7 +115,7 @@ func (s *Search) SearchHubs(ctx context.Context, request operations.SearchHubsRe utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -350,7 +350,7 @@ func (s *Search) VoiceSearchHubs(ctx context.Context, request operations.VoiceSe utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/status.go b/status.go index f5d79bb..832fc2d 100644 --- a/status.go +++ b/status.go @@ -515,7 +515,7 @@ func (s *Status) ListPlaybackHistory(ctx context.Context, request operations.Lis utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -742,7 +742,7 @@ func (s *Status) TerminateSession(ctx context.Context, request operations.Termin utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/subscriptions.go b/subscriptions.go index f5ef713..b4b61d8 100644 --- a/subscriptions.go +++ b/subscriptions.go @@ -102,7 +102,7 @@ func (s *Subscriptions) GetAllSubscriptions(ctx context.Context, request operati utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -331,7 +331,7 @@ func (s *Subscriptions) CreateSubscription(ctx context.Context, request operatio utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -962,7 +962,7 @@ func (s *Subscriptions) GetTemplate(ctx context.Context, request operations.GetT utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1604,7 +1604,7 @@ func (s *Subscriptions) GetSubscription(ctx context.Context, request operations. utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -1835,7 +1835,7 @@ func (s *Subscriptions) EditSubscriptionPreferences(ctx context.Context, request utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -2066,7 +2066,7 @@ func (s *Subscriptions) ReorderSubscription(ctx context.Context, request operati utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/timeline.go b/timeline.go index 7eff8a1..11cb498 100644 --- a/timeline.go +++ b/timeline.go @@ -102,7 +102,7 @@ func (s *Timeline) MarkPlayed(ctx context.Context, request operations.MarkPlayed utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -311,7 +311,7 @@ func (s *Timeline) Report(ctx context.Context, request operations.ReportRequest, utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -539,7 +539,7 @@ func (s *Timeline) Unscrobble(ctx context.Context, request operations.Unscrobble utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/transcoder.go b/transcoder.go index bea8cea..02e7c26 100644 --- a/transcoder.go +++ b/transcoder.go @@ -108,7 +108,7 @@ func (s *Transcoder) TranscodeImage(ctx context.Context, request operations.Tran utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -339,7 +339,7 @@ func (s *Transcoder) MakeDecision(ctx context.Context, request operations.MakeDe utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -564,7 +564,7 @@ func (s *Transcoder) TriggerFallback(ctx context.Context, request operations.Tri utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -775,7 +775,7 @@ func (s *Transcoder) TranscodeSubtitles(ctx context.Context, request operations. utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -986,7 +986,7 @@ func (s *Transcoder) StartTranscodeSession(ctx context.Context, request operatio utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/ultrablur.go b/ultrablur.go index 56412f4..2ad2373 100644 --- a/ultrablur.go +++ b/ultrablur.go @@ -101,7 +101,7 @@ func (s *UltraBlur) GetColors(ctx context.Context, request operations.GetColorsR utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -330,7 +330,7 @@ func (s *UltraBlur) GetImage(ctx context.Context, request operations.GetImageReq utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/updater.go b/updater.go index 07b3756..7426f33 100644 --- a/updater.go +++ b/updater.go @@ -102,7 +102,7 @@ func (s *Updater) ApplyUpdates(ctx context.Context, request operations.ApplyUpda utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } @@ -311,7 +311,7 @@ func (s *Updater) CheckUpdates(ctx context.Context, request operations.CheckUpda utils.PopulateHeaders(ctx, req, request, globals) - if err := utils.PopulateQueryParams(ctx, req, request, globals); err != nil { + if err := utils.PopulateQueryParams(ctx, req, request, globals, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } diff --git a/users.go b/users.go new file mode 100644 index 0000000..67b4dff --- /dev/null +++ b/users.go @@ -0,0 +1,295 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +package plexgo + +import ( + "bytes" + "context" + "fmt" + "github.com/LukeHagar/plexgo/internal/config" + "github.com/LukeHagar/plexgo/internal/hooks" + "github.com/LukeHagar/plexgo/internal/utils" + "github.com/LukeHagar/plexgo/models/operations" + "github.com/LukeHagar/plexgo/models/sdkerrors" + "github.com/LukeHagar/plexgo/retry" + "net/http" + "net/url" +) + +type Users struct { + rootSDK *PlexAPI + sdkConfiguration config.SDKConfiguration + hooks *hooks.Hooks +} + +func newUsers(rootSDK *PlexAPI, sdkConfig config.SDKConfiguration, hooks *hooks.Hooks) *Users { + return &Users{ + rootSDK: rootSDK, + sdkConfiguration: sdkConfig, + hooks: hooks, + } +} + +// GetUsers - Get list of all connected users +// Get list of all users that are friends and have library access with the provided Plex authentication token +func (s *Users) GetUsers(ctx context.Context, request operations.GetUsersRequest, opts ...operations.Option) (*operations.GetUsersResponse, error) { + globals := operations.GetUsersGlobals{ + Accepts: s.sdkConfiguration.Globals.Accepts, + ClientIdentifier: s.sdkConfiguration.Globals.ClientIdentifier, + Product: s.sdkConfiguration.Globals.Product, + Version: s.sdkConfiguration.Globals.Version, + Platform: s.sdkConfiguration.Globals.Platform, + PlatformVersion: s.sdkConfiguration.Globals.PlatformVersion, + Device: s.sdkConfiguration.Globals.Device, + Model: s.sdkConfiguration.Globals.Model, + DeviceVendor: s.sdkConfiguration.Globals.DeviceVendor, + DeviceName: s.sdkConfiguration.Globals.DeviceName, + Marketplace: s.sdkConfiguration.Globals.Marketplace, + } + + o := operations.Options{} + supportedOptions := []string{ + operations.SupportedOptionRetries, + operations.SupportedOptionTimeout, + } + + for _, opt := range opts { + if err := opt(&o, supportedOptions...); err != nil { + return nil, fmt.Errorf("error applying option: %w", err) + } + } + + baseURL := utils.ReplaceParameters(operations.GetUsersServerList[0], map[string]string{}) + if o.ServerURL != nil { + baseURL = *o.ServerURL + } + + opURL, err := url.JoinPath(baseURL, "/users") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } + + hookCtx := hooks.HookContext{ + SDK: s.rootSDK, + SDKConfiguration: s.sdkConfiguration, + BaseURL: baseURL, + Context: ctx, + OperationID: "get-users", + OAuth2Scopes: nil, + SecuritySource: s.sdkConfiguration.Security, + } + + timeout := o.Timeout + if timeout == nil { + timeout = s.sdkConfiguration.Timeout + } + + if timeout != nil { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, *timeout) + defer cancel() + } + + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) + if err != nil { + return nil, fmt.Errorf("error creating request: %w", err) + } + req.Header.Set("Accept", "application/json") + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) + + utils.PopulateHeaders(ctx, req, request, globals) + + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } + + for k, v := range o.SetHeaders { + req.Header.Set(k, v) + } + + globalRetryConfig := s.sdkConfiguration.RetryConfig + retryConfig := o.Retries + if retryConfig == nil { + if globalRetryConfig != nil { + retryConfig = globalRetryConfig + } + } + + var httpRes *http.Response + if retryConfig != nil { + httpRes, err = utils.Retry(ctx, utils.Retries{ + Config: retryConfig, + StatusCodes: []string{ + "429", + "500", + "502", + "503", + "504", + }, + }, func() (*http.Response, error) { + if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil { + copyBody, err := req.GetBody() + + if err != nil { + return nil, err + } + + req.Body = copyBody + } + + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + if retry.IsPermanentError(err) || retry.IsTemporaryError(err) { + return nil, err + } + + return nil, retry.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err + }) + + if err != nil { + return nil, err + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } else { + req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, err + } + + httpRes, err = s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + return nil, err + } else if utils.MatchStatusCodes([]string{"400", "401", "4XX", "5XX"}, httpRes.StatusCode) { + _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil) + if err != nil { + return nil, err + } else if _httpRes != nil { + httpRes = _httpRes + } + } else { + httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } + } + } + + res := &operations.GetUsersResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, + } + + switch { + case httpRes.StatusCode == 200: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out operations.GetUsersResponseBody + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + res.Object = &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 400: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out sdkerrors.GetUsersBadRequest + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + out.RawResponse = httpRes + return nil, &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode == 401: + switch { + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + + var out sdkerrors.GetUsersUnauthorized + if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { + return nil, err + } + + out.RawResponse = httpRes + return nil, &out + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) + } + case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes) + default: + rawBody, err := utils.ConsumeRawBody(httpRes) + if err != nil { + return nil, err + } + return nil, sdkerrors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) + } + + return res, nil + +}