From a16228418b0b343c34ee8ddac52c5deb1b9aeb07 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 11 Sep 2026 14:28:23 +0000 Subject: [PATCH] chore(plex): update PMS OpenAPI SDK --- .../src/providers/plex/generated/index.ts | 4 +- .../src/providers/plex/generated/sdk.gen.ts | 24 +- .../src/providers/plex/generated/types.gen.ts | 176 +++++-- .../src/providers/plex/openapi/manifest.json | 8 +- .../src/providers/plex/openapi/pms.json | 445 ++++++++++++++++-- 5 files changed, 557 insertions(+), 100 deletions(-) diff --git a/apps/server/src/providers/plex/generated/index.ts b/apps/server/src/providers/plex/generated/index.ts index 6883a4a4..58b98959 100644 --- a/apps/server/src/providers/plex/generated/index.ts +++ b/apps/server/src/providers/plex/generated/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { activitiesDeleteActivity, activitiesGetSlash, butlerDeleteSlash, butlerDeleteTask, butlerGetSlash, butlerPostSlash, butlerPostTask, deleteMediaProvider, deleteMetadataAgentProvider, deleteMetadataAgentProviderGroup, deleteMetadataAgentProviderGroupItem, downloadQueueDeleteQueueItemsItem, downloadQueueGetQueue, downloadQueueGetQueueItemItemDecision, downloadQueueGetQueueItemItemMedia, downloadQueueGetQueueItems, downloadQueueGetQueueItemsItem, downloadQueuePost, downloadQueuePostQueueAdd, downloadQueuePostQueueItemsItemRestart, eventsourceGetSlash, getIdentity, getMediaProviders, getMetadataAgentProvider, getMetadataAgentProviderGroup, getMetadataAgentProviderGroups, getMetadataAgentProviders, getSlash, hubsGetContinueWatching, hubsGetItems, hubsGetMetadataMetadata, hubsGetMetadataMetadataPostplay, hubsGetMetadataMetadataRelated, hubsGetPromoted, hubsGetSearch, hubsGetSection, hubsGetSlash, hubsSearchGetVoice, hubsSectionsSectionManageDeleteIdentifier, hubsSectionsSectionManageDeleteSlash, hubsSectionsSectionManageGetSlash, hubsSectionsSectionManagePostSlash, hubsSectionsSectionManagePutIdentifier, hubsSectionsSectionManagePutMove, imageTranscode, libraryCollectionCollectionGetComposite, libraryCollectionCollectionGetItems, libraryCollectionCollectionPutItems, libraryCollectionCollectionPutItemsItem, libraryCollectionCollectionPutItemsItemMove, libraryCollectionPostSlash, libraryDeleteCaches, libraryDeleteSection, libraryDeleteSectionsAllRefresh, libraryDeleteStreamsStream, libraryGetAll, libraryGetMatches, libraryGetMediaMediaChapterImagesChapter, libraryGetMetadataAugmentationsAugmentation, libraryGetPartsPartChangestampFilename, libraryGetPartsPartIndexesIndex, libraryGetPartsPartIndexesIndexOffset, libraryGetPeoplePerson, libraryGetPeoplePersonMedia, libraryGetRandomArtwork, libraryGetSections, libraryGetSectionsPrefs, libraryGetStreamsStream, libraryGetStreamsStreamLevels, libraryGetStreamsStreamLoudness, libraryGetTags, libraryMetadataDeleteElement, libraryMetadataDeleteMarkerMarker, libraryMetadataDeleteMediaMediaItem, libraryMetadataDeleteSlash, libraryMetadataGetAllLeaves, libraryMetadataGetElement, libraryMetadataGetExtras, libraryMetadataGetFile, libraryMetadataGetMatches, libraryMetadataGetNearest, libraryMetadataGetRelated, libraryMetadataGetSimilar, libraryMetadataGetSlash, libraryMetadataGetTree, libraryMetadataGetUsersTop, libraryMetadataPostElement, libraryMetadataPostExtras, libraryMetadataPostMarker, libraryMetadataPostSubtitles, libraryMetadataPutAddetect, libraryMetadataPutAnalyze, libraryMetadataPutChapterThumbs, libraryMetadataPutCredits, libraryMetadataPutElement, libraryMetadataPutIndex, libraryMetadataPutIntro, libraryMetadataPutMarkerMarker, libraryMetadataPutMatch, libraryMetadataPutMerge, libraryMetadataPutPrefs, libraryMetadataPutRefresh, libraryMetadataPutSlash, libraryMetadataPutSplit, libraryMetadataPutUnmatch, libraryMetadataPutVoiceActivity, libraryPostFile, libraryPostSection, libraryPostSectionsRefresh, libraryPutCleanBundles, libraryPutOptimize, libraryPutPartsPart, libraryPutStreamsStream, librarySectionDeleteCollectionCollection, librarySectionDeleteIndexes, librarySectionDeleteIntros, librarySectionDeleteRefresh, librarySectionGetAlbums, librarySectionGetAll, librarySectionGetAllLeaves, librarySectionGetArts, librarySectionGetAudioCodecs, librarySectionGetAudioLayouts, librarySectionGetAutocomplete, librarySectionGetCategories, librarySectionGetCluster, librarySectionGetCollections, librarySectionGetCommon, librarySectionGetComposite, librarySectionGetComputePath, librarySectionGetFilters, librarySectionGetFirstCharaters, librarySectionGetLocations, librarySectionGetMoment, librarySectionGetNearest, librarySectionGetPrefs, librarySectionGetSection, librarySectionGetSorts, librarySectionGetSubtitleCodecs, librarySectionGetVideoCodecs, librarySectionPostRefresh, librarySectionPutAll, librarySectionPutAnalyze, librarySectionPutEmptyTrash, librarySectionPutPrefs, librarySectionPutSection, livetvDvrDeleteDvr, livetvDvrDeleteDvrDevice, livetvDvrDeleteLineup, livetvDvrDeleteReloadGuide, livetvDvrGetDvr, livetvDvrGetSlash, livetvDvrPostChannelsChannelTune, livetvDvrPostReloadGuide, livetvDvrPostSlash, livetvDvrPutDvrDevice, livetvDvrPutLineup, livetvDvrPutPrefs, livetvEpgGetChannelmap, livetvEpgGetChannels, livetvEpgGetCountries, livetvEpgGetCountriesCountryLineups, livetvEpgGetCountriesCountryRegions, livetvEpgGetCountriesCountryRegionsRegionLineups, livetvEpgGetLanguages, livetvEpgGetLineup, livetvEpgGetLineupchannels, livetvSessionsGetSession, livetvSessionsGetSessionConsumerIndex, livetvSessionsGetSessionConsumerSegment, livetvSessionsGetSlash, logPostPapertrail, logPostSlash, logPutSlash, mediaGrabberDeleteDevicesDeviceScan, mediaGrabberDeleteOperationsOperation, mediaGrabberDevicesDeviceDeleteSlash, mediaGrabberDevicesDeviceGetChannels, mediaGrabberDevicesDeviceGetSlash, mediaGrabberDevicesDeviceGetThumbVersion, mediaGrabberDevicesDevicePostScan, mediaGrabberDevicesDevicePutChannelmap, mediaGrabberDevicesDevicePutPrefs, mediaGrabberDevicesDevicePutSlash, mediaGrabberGetDevices, mediaGrabberGetSlash, mediaGrabberPostDeviceDiscover, mediaGrabberPostDevices, mediaProviderEpgChannels, mediaProviderEpgGrid, mediaProviderEpgWatchnow, mediaProviderEpgWatchnowAll, mediaSubscriptionsDeleteSubscription, mediaSubscriptionsGetScheduled, mediaSubscriptionsGetSlash, mediaSubscriptionsGetSubscription, mediaSubscriptionsGetTemplate, mediaSubscriptionsPostProcess, mediaSubscriptionsPostSlash, mediaSubscriptionsPutSubscription, mediaSubscriptionsPutSubscriptionMove, type Options, playlistDeleteItems, playlistDeleteItemsGenerator, playlistDeletePlaylist, playlistGetGenerators, playlistGetItems, playlistGetItemsGenerator, playlistGetItemsGeneratorItems, playlistGetPlaylist, playlistGetSlash, playlistPostSlash, playlistPostUpload, playlistPutItems, playlistPutItemsGenerator, playlistPutItemsGeneratorReprocess, playlistPutItemsMove, playlistPutPlaylist, playQueuePlayQueueReset, playQueuePostSlash, playQueueQueueDeleteItems, playQueueQueueDeleteItemsItem, playQueueQueueGetSlash, playQueueQueuePutItemsMove, playQueueQueuePutItemsShuffle, playQueueQueuePutItemsUnshuffle, playQueueQueuePutSlash, postMediaProviders, postMediaProvidersRefresh, postMetadataAgentProviderGroups, postMetadataAgentProviders, preferencesGetGet, preferencesGetSlash, preferencesPutSlash, putMetadataAgentProvider, putMetadataAgentProviderGroup, putMetadataAgentProviderGroupItem, putRate, putScrobble, putUnscrobble, securityGetResources, securityPostToken, statusDeleteHistory, statusGetBackground, statusGetHistory, statusGetHistoryAll, statusGetSlash, statusPostTerminate, timelinePostSlash, transcodeDecision, transcodeFallback, transcodeStart, transcodeSubtitles, ultraBlurGetColors, ultraBlurGetImage, updaterGetStatus, updaterPutApply, updaterPutCheck, websocketGetSlash } from './sdk.gen'; -export type { _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _2, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _3, _30, _31, _32, _33, _34, _35, _4, _5, _6, _7, _8, _9, ActivitiesDeleteActivityData, ActivitiesDeleteActivityErrors, ActivitiesDeleteActivityResponses, ActivitiesGetSlashData, ActivitiesGetSlashResponse, ActivitiesGetSlashResponses, AllowSync, Art, ButlerDeleteSlashData, ButlerDeleteSlashResponses, ButlerDeleteTaskData, ButlerDeleteTaskErrors, ButlerDeleteTaskResponses, ButlerGetSlashData, ButlerGetSlashResponse, ButlerGetSlashResponses, ButlerPostSlashData, ButlerPostSlashResponses, ButlerPostTaskData, ButlerPostTaskErrors, ButlerPostTaskResponses, Channel, ClientOptions, Composite, Content, DeleteMediaProviderData, DeleteMediaProviderErrors, DeleteMediaProviderResponses, DeleteMetadataAgentProviderData, DeleteMetadataAgentProviderErrors, DeleteMetadataAgentProviderGroupData, DeleteMetadataAgentProviderGroupErrors, DeleteMetadataAgentProviderGroupItemData, DeleteMetadataAgentProviderGroupItemErrors, DeleteMetadataAgentProviderGroupItemResponses, DeleteMetadataAgentProviderGroupResponses, DeleteMetadataAgentProviderResponses, DeviceItems, Directory, Directory2, DirectoryType, DirectoryType2, DownloadQueueDeleteQueueItemsItemData, DownloadQueueDeleteQueueItemsItemResponses, DownloadQueueGetQueueData, DownloadQueueGetQueueItemItemDecisionData, DownloadQueueGetQueueItemItemDecisionErrors, DownloadQueueGetQueueItemItemDecisionResponse, DownloadQueueGetQueueItemItemDecisionResponses, DownloadQueueGetQueueItemItemMediaData, DownloadQueueGetQueueItemItemMediaErrors, DownloadQueueGetQueueItemItemMediaResponses, DownloadQueueGetQueueItemsData, DownloadQueueGetQueueItemsItemData, DownloadQueueGetQueueItemsItemResponse, DownloadQueueGetQueueItemsItemResponses, DownloadQueueGetQueueItemsResponse, DownloadQueueGetQueueItemsResponses, DownloadQueueGetQueueResponse, DownloadQueueGetQueueResponses, DownloadQueuePostData, DownloadQueuePostQueueAddData, DownloadQueuePostQueueAddResponse, DownloadQueuePostQueueAddResponses, DownloadQueuePostQueueItemsItemRestartData, DownloadQueuePostQueueItemsItemRestartResponses, DownloadQueuePostResponse, DownloadQueuePostResponses, EventsourceGetSlashData, EventsourceGetSlashResponse, EventsourceGetSlashResponses, Filter, Filter2, GetIdentityData, GetIdentityResponse, GetIdentityResponses, GetMediaProvidersData, GetMediaProvidersResponse, GetMediaProvidersResponses, GetMetadataAgentProviderData, GetMetadataAgentProviderErrors, GetMetadataAgentProviderGroupData, GetMetadataAgentProviderGroupErrors, GetMetadataAgentProviderGroupResponse, GetMetadataAgentProviderGroupResponses, GetMetadataAgentProviderGroupsData, GetMetadataAgentProviderGroupsResponse, GetMetadataAgentProviderGroupsResponses, GetMetadataAgentProviderResponse, GetMetadataAgentProviderResponses, GetMetadataAgentProvidersData, GetMetadataAgentProvidersResponse, GetMetadataAgentProvidersResponses, GetSlashData, GetSlashResponse, GetSlashResponses, Hub, Hub2, HubsGetContinueWatchingData, HubsGetContinueWatchingResponse, HubsGetContinueWatchingResponses, HubsGetItemsData, HubsGetItemsErrors, HubsGetItemsResponse, HubsGetItemsResponses, HubsGetMetadataMetadataData, HubsGetMetadataMetadataErrors, HubsGetMetadataMetadataPostplayData, HubsGetMetadataMetadataPostplayErrors, HubsGetMetadataMetadataPostplayResponse, HubsGetMetadataMetadataPostplayResponses, HubsGetMetadataMetadataRelatedData, HubsGetMetadataMetadataRelatedErrors, HubsGetMetadataMetadataRelatedResponse, HubsGetMetadataMetadataRelatedResponses, HubsGetMetadataMetadataResponse, HubsGetMetadataMetadataResponses, HubsGetPromotedData, HubsGetPromotedResponse, HubsGetPromotedResponses, HubsGetSearchData, HubsGetSearchErrors, HubsGetSearchResponse, HubsGetSearchResponses, HubsGetSectionData, HubsGetSectionErrors, HubsGetSectionResponse, HubsGetSectionResponses, HubsGetSlashData, HubsGetSlashResponse, HubsGetSlashResponses, HubsSearchGetVoiceData, HubsSearchGetVoiceErrors, HubsSearchGetVoiceResponse, HubsSearchGetVoiceResponses, HubsSectionsSectionManageDeleteIdentifierData, HubsSectionsSectionManageDeleteIdentifierErrors, HubsSectionsSectionManageDeleteIdentifierResponses, HubsSectionsSectionManageDeleteSlashData, HubsSectionsSectionManageDeleteSlashErrors, HubsSectionsSectionManageDeleteSlashResponses, HubsSectionsSectionManageGetSlashData, HubsSectionsSectionManageGetSlashErrors, HubsSectionsSectionManageGetSlashResponse, HubsSectionsSectionManageGetSlashResponses, HubsSectionsSectionManagePostSlashData, HubsSectionsSectionManagePostSlashErrors, HubsSectionsSectionManagePostSlashResponses, HubsSectionsSectionManagePutIdentifierData, HubsSectionsSectionManagePutIdentifierErrors, HubsSectionsSectionManagePutIdentifierResponses, HubsSectionsSectionManagePutMoveData, HubsSectionsSectionManagePutMoveErrors, HubsSectionsSectionManagePutMoveResponse, HubsSectionsSectionManagePutMoveResponses, Image, ImageTranscodeData, ImageTranscodeErrors, ImageTranscodeResponse, ImageTranscodeResponses, Items, Key, LibraryCollectionCollectionGetCompositeData, LibraryCollectionCollectionGetCompositeErrors, LibraryCollectionCollectionGetCompositeResponse, LibraryCollectionCollectionGetCompositeResponses, LibraryCollectionCollectionGetItemsData, LibraryCollectionCollectionGetItemsErrors, LibraryCollectionCollectionGetItemsResponse, LibraryCollectionCollectionGetItemsResponses, LibraryCollectionCollectionPutItemsData, LibraryCollectionCollectionPutItemsErrors, LibraryCollectionCollectionPutItemsItemData, LibraryCollectionCollectionPutItemsItemErrors, LibraryCollectionCollectionPutItemsItemMoveData, LibraryCollectionCollectionPutItemsItemMoveErrors, LibraryCollectionCollectionPutItemsItemMoveResponse, LibraryCollectionCollectionPutItemsItemMoveResponses, LibraryCollectionCollectionPutItemsItemResponse, LibraryCollectionCollectionPutItemsItemResponses, LibraryCollectionCollectionPutItemsResponse, LibraryCollectionCollectionPutItemsResponses, LibraryCollectionPostSlashData, LibraryCollectionPostSlashErrors, LibraryCollectionPostSlashResponse, LibraryCollectionPostSlashResponses, LibraryDeleteCachesData, LibraryDeleteCachesResponses, LibraryDeleteSectionData, LibraryDeleteSectionResponses, LibraryDeleteSectionsAllRefreshData, LibraryDeleteSectionsAllRefreshResponse, LibraryDeleteSectionsAllRefreshResponses, LibraryDeleteStreamsStreamData, LibraryDeleteStreamsStreamErrors, LibraryDeleteStreamsStreamResponses, LibraryGetAllData, LibraryGetAllResponse, LibraryGetAllResponses, LibraryGetMatchesData, LibraryGetMatchesResponse, LibraryGetMatchesResponses, LibraryGetMediaMediaChapterImagesChapterData, LibraryGetMediaMediaChapterImagesChapterErrors, LibraryGetMediaMediaChapterImagesChapterResponse, LibraryGetMediaMediaChapterImagesChapterResponses, LibraryGetMetadataAugmentationsAugmentationData, LibraryGetMetadataAugmentationsAugmentationErrors, LibraryGetMetadataAugmentationsAugmentationResponses, LibraryGetPartsPartChangestampFilenameData, LibraryGetPartsPartChangestampFilenameErrors, LibraryGetPartsPartChangestampFilenameResponses, LibraryGetPartsPartIndexesIndexData, LibraryGetPartsPartIndexesIndexErrors, LibraryGetPartsPartIndexesIndexOffsetData, LibraryGetPartsPartIndexesIndexOffsetErrors, LibraryGetPartsPartIndexesIndexOffsetResponse, LibraryGetPartsPartIndexesIndexOffsetResponses, LibraryGetPartsPartIndexesIndexResponse, LibraryGetPartsPartIndexesIndexResponses, LibraryGetPeoplePersonData, LibraryGetPeoplePersonErrors, LibraryGetPeoplePersonMediaData, LibraryGetPeoplePersonMediaErrors, LibraryGetPeoplePersonMediaResponse, LibraryGetPeoplePersonMediaResponses, LibraryGetPeoplePersonResponse, LibraryGetPeoplePersonResponses, LibraryGetRandomArtworkData, LibraryGetRandomArtworkResponse, LibraryGetRandomArtworkResponses, LibraryGetSectionsData, LibraryGetSectionsPrefsData, LibraryGetSectionsPrefsErrors, LibraryGetSectionsPrefsResponse, LibraryGetSectionsPrefsResponses, LibraryGetSectionsResponse, LibraryGetSectionsResponses, LibraryGetStreamsStreamData, LibraryGetStreamsStreamErrors, LibraryGetStreamsStreamLevelsData, LibraryGetStreamsStreamLevelsErrors, LibraryGetStreamsStreamLevelsResponse, LibraryGetStreamsStreamLevelsResponses, LibraryGetStreamsStreamLoudnessData, LibraryGetStreamsStreamLoudnessErrors, LibraryGetStreamsStreamLoudnessResponse, LibraryGetStreamsStreamLoudnessResponses, LibraryGetStreamsStreamResponses, LibraryGetTagsData, LibraryGetTagsResponse, LibraryGetTagsResponses, LibraryMetadataDeleteElementData, LibraryMetadataDeleteElementErrors, LibraryMetadataDeleteElementResponses, LibraryMetadataDeleteMarkerMarkerData, LibraryMetadataDeleteMarkerMarkerErrors, LibraryMetadataDeleteMarkerMarkerResponses, LibraryMetadataDeleteMediaMediaItemData, LibraryMetadataDeleteMediaMediaItemErrors, LibraryMetadataDeleteMediaMediaItemResponses, LibraryMetadataDeleteSlashData, LibraryMetadataDeleteSlashErrors, LibraryMetadataDeleteSlashResponses, LibraryMetadataGetAllLeavesData, LibraryMetadataGetAllLeavesResponse, LibraryMetadataGetAllLeavesResponses, LibraryMetadataGetElementData, LibraryMetadataGetElementResponse, LibraryMetadataGetElementResponses, LibraryMetadataGetExtrasData, LibraryMetadataGetExtrasResponse, LibraryMetadataGetExtrasResponses, LibraryMetadataGetFileData, LibraryMetadataGetFileResponse, LibraryMetadataGetFileResponses, LibraryMetadataGetMatchesData, LibraryMetadataGetMatchesResponse, LibraryMetadataGetMatchesResponses, LibraryMetadataGetNearestData, LibraryMetadataGetNearestResponse, LibraryMetadataGetNearestResponses, LibraryMetadataGetRelatedData, LibraryMetadataGetRelatedResponse, LibraryMetadataGetRelatedResponses, LibraryMetadataGetSimilarData, LibraryMetadataGetSimilarResponse, LibraryMetadataGetSimilarResponses, LibraryMetadataGetSlashData, LibraryMetadataGetSlashResponse, LibraryMetadataGetSlashResponses, LibraryMetadataGetTreeData, LibraryMetadataGetTreeResponse, LibraryMetadataGetTreeResponses, LibraryMetadataGetUsersTopData, LibraryMetadataGetUsersTopResponse, LibraryMetadataGetUsersTopResponses, LibraryMetadataPostElementData, LibraryMetadataPostElementResponses, LibraryMetadataPostExtrasData, LibraryMetadataPostExtrasErrors, LibraryMetadataPostExtrasResponses, LibraryMetadataPostMarkerData, LibraryMetadataPostMarkerErrors, LibraryMetadataPostMarkerResponse, LibraryMetadataPostMarkerResponses, LibraryMetadataPostSubtitlesData, LibraryMetadataPostSubtitlesResponses, LibraryMetadataPutAddetectData, LibraryMetadataPutAddetectResponses, LibraryMetadataPutAnalyzeData, LibraryMetadataPutAnalyzeResponses, LibraryMetadataPutChapterThumbsData, LibraryMetadataPutChapterThumbsResponses, LibraryMetadataPutCreditsData, LibraryMetadataPutCreditsResponses, LibraryMetadataPutElementData, LibraryMetadataPutElementResponses, LibraryMetadataPutIndexData, LibraryMetadataPutIndexResponses, LibraryMetadataPutIntroData, LibraryMetadataPutIntroResponses, LibraryMetadataPutMarkerMarkerData, LibraryMetadataPutMarkerMarkerErrors, LibraryMetadataPutMarkerMarkerResponse, LibraryMetadataPutMarkerMarkerResponses, LibraryMetadataPutMatchData, LibraryMetadataPutMatchResponses, LibraryMetadataPutMergeData, LibraryMetadataPutMergeResponses, LibraryMetadataPutPrefsData, LibraryMetadataPutPrefsResponses, LibraryMetadataPutRefreshData, LibraryMetadataPutRefreshResponses, LibraryMetadataPutSlashData, LibraryMetadataPutSlashErrors, LibraryMetadataPutSlashResponses, LibraryMetadataPutSplitData, LibraryMetadataPutSplitResponses, LibraryMetadataPutUnmatchData, LibraryMetadataPutUnmatchResponses, LibraryMetadataPutVoiceActivityData, LibraryMetadataPutVoiceActivityResponses, LibraryPostFileData, LibraryPostFileResponse, LibraryPostFileResponses, LibraryPostSectionData, LibraryPostSectionErrors, LibraryPostSectionResponse, LibraryPostSectionResponses, LibraryPostSectionsRefreshData, LibraryPostSectionsRefreshErrors, LibraryPostSectionsRefreshResponses, LibraryPutCleanBundlesData, LibraryPutCleanBundlesResponses, LibraryPutOptimizeData, LibraryPutOptimizeResponses, LibraryPutPartsPartData, LibraryPutPartsPartErrors, LibraryPutPartsPartResponses, LibraryPutStreamsStreamData, LibraryPutStreamsStreamErrors, LibraryPutStreamsStreamResponses, LibrarySection, LibrarySection2, LibrarySectionDeleteCollectionCollectionData, LibrarySectionDeleteCollectionCollectionErrors, LibrarySectionDeleteCollectionCollectionResponses, LibrarySectionDeleteIndexesData, LibrarySectionDeleteIndexesResponses, LibrarySectionDeleteIntrosData, LibrarySectionDeleteIntrosResponses, LibrarySectionDeleteRefreshData, LibrarySectionDeleteRefreshResponses, LibrarySectionGetAlbumsData, LibrarySectionGetAlbumsResponse, LibrarySectionGetAlbumsResponses, LibrarySectionGetAllData, LibrarySectionGetAllLeavesData, LibrarySectionGetAllLeavesResponse, LibrarySectionGetAllLeavesResponses, LibrarySectionGetAllResponse, LibrarySectionGetAllResponses, LibrarySectionGetArtsData, LibrarySectionGetArtsResponse, LibrarySectionGetArtsResponses, LibrarySectionGetAudioCodecsData, LibrarySectionGetAudioCodecsResponse, LibrarySectionGetAudioCodecsResponses, LibrarySectionGetAudioLayoutsData, LibrarySectionGetAudioLayoutsResponse, LibrarySectionGetAudioLayoutsResponses, LibrarySectionGetAutocompleteData, LibrarySectionGetAutocompleteErrors, LibrarySectionGetAutocompleteResponse, LibrarySectionGetAutocompleteResponses, LibrarySectionGetCategoriesData, LibrarySectionGetCategoriesResponse, LibrarySectionGetCategoriesResponses, LibrarySectionGetClusterData, LibrarySectionGetClusterResponse, LibrarySectionGetClusterResponses, LibrarySectionGetCollectionsData, LibrarySectionGetCollectionsResponse, LibrarySectionGetCollectionsResponses, LibrarySectionGetCommonData, LibrarySectionGetCommonErrors, LibrarySectionGetCommonResponse, LibrarySectionGetCommonResponses, LibrarySectionGetCompositeData, LibrarySectionGetCompositeResponses, LibrarySectionGetComputePathData, LibrarySectionGetComputePathResponse, LibrarySectionGetComputePathResponses, LibrarySectionGetFiltersData, LibrarySectionGetFiltersResponse, LibrarySectionGetFiltersResponses, LibrarySectionGetFirstCharatersData, LibrarySectionGetFirstCharatersResponse, LibrarySectionGetFirstCharatersResponses, LibrarySectionGetLocationsData, LibrarySectionGetLocationsResponse, LibrarySectionGetLocationsResponses, LibrarySectionGetMomentData, LibrarySectionGetMomentResponse, LibrarySectionGetMomentResponses, LibrarySectionGetNearestData, LibrarySectionGetNearestResponse, LibrarySectionGetNearestResponses, LibrarySectionGetPrefsData, LibrarySectionGetPrefsResponse, LibrarySectionGetPrefsResponses, LibrarySectionGetSectionData, LibrarySectionGetSectionResponse, LibrarySectionGetSectionResponses, LibrarySectionGetSortsData, LibrarySectionGetSortsResponse, LibrarySectionGetSortsResponses, LibrarySectionGetSubtitleCodecsData, LibrarySectionGetSubtitleCodecsResponse, LibrarySectionGetSubtitleCodecsResponses, LibrarySectionGetVideoCodecsData, LibrarySectionGetVideoCodecsResponse, LibrarySectionGetVideoCodecsResponses, LibrarySectionPostRefreshData, LibrarySectionPostRefreshResponses, LibrarySectionPutAllData, LibrarySectionPutAllErrors, LibrarySectionPutAllResponses, LibrarySectionPutAnalyzeData, LibrarySectionPutAnalyzeResponses, LibrarySectionPutEmptyTrashData, LibrarySectionPutEmptyTrashResponses, LibrarySectionPutPrefsData, LibrarySectionPutPrefsResponses, LibrarySectionPutSectionData, LibrarySectionPutSectionErrors, LibrarySectionPutSectionResponses, LineupItems, LivetvDvrDeleteDvrData, LivetvDvrDeleteDvrDeviceData, LivetvDvrDeleteDvrDeviceResponse, LivetvDvrDeleteDvrDeviceResponses, LivetvDvrDeleteDvrResponses, LivetvDvrDeleteLineupData, LivetvDvrDeleteLineupResponse, LivetvDvrDeleteLineupResponses, LivetvDvrDeleteReloadGuideData, LivetvDvrDeleteReloadGuideResponses, LivetvDvrGetDvrData, LivetvDvrGetDvrResponse, LivetvDvrGetDvrResponses, LivetvDvrGetSlashData, LivetvDvrGetSlashResponse, LivetvDvrGetSlashResponses, LivetvDvrPostChannelsChannelTuneData, LivetvDvrPostChannelsChannelTuneErrors, LivetvDvrPostChannelsChannelTuneResponse, LivetvDvrPostChannelsChannelTuneResponses, LivetvDvrPostReloadGuideData, LivetvDvrPostReloadGuideResponses, LivetvDvrPostSlashData, LivetvDvrPostSlashResponse, LivetvDvrPostSlashResponses, LivetvDvrPutDvrDeviceData, LivetvDvrPutDvrDeviceResponse, LivetvDvrPutDvrDeviceResponses, LivetvDvrPutLineupData, LivetvDvrPutLineupResponse, LivetvDvrPutLineupResponses, LivetvDvrPutPrefsData, LivetvDvrPutPrefsResponse, LivetvDvrPutPrefsResponses, LivetvEpgGetChannelmapData, LivetvEpgGetChannelmapErrors, LivetvEpgGetChannelmapResponse, LivetvEpgGetChannelmapResponses, LivetvEpgGetChannelsData, LivetvEpgGetChannelsErrors, LivetvEpgGetChannelsResponse, LivetvEpgGetChannelsResponses, LivetvEpgGetCountriesCountryLineupsData, LivetvEpgGetCountriesCountryLineupsErrors, LivetvEpgGetCountriesCountryLineupsResponse, LivetvEpgGetCountriesCountryLineupsResponses, LivetvEpgGetCountriesCountryRegionsData, LivetvEpgGetCountriesCountryRegionsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsData, LivetvEpgGetCountriesCountryRegionsRegionLineupsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsResponse, LivetvEpgGetCountriesCountryRegionsRegionLineupsResponses, LivetvEpgGetCountriesCountryRegionsResponse, LivetvEpgGetCountriesCountryRegionsResponses, LivetvEpgGetCountriesData, LivetvEpgGetCountriesResponse, LivetvEpgGetCountriesResponses, LivetvEpgGetLanguagesData, LivetvEpgGetLanguagesResponse, LivetvEpgGetLanguagesResponses, LivetvEpgGetLineupchannelsData, LivetvEpgGetLineupchannelsErrors, LivetvEpgGetLineupchannelsResponse, LivetvEpgGetLineupchannelsResponses, LivetvEpgGetLineupData, LivetvEpgGetLineupErrors, LivetvEpgGetLineupResponses, LivetvSessionsGetSessionConsumerIndexData, LivetvSessionsGetSessionConsumerIndexErrors, LivetvSessionsGetSessionConsumerIndexResponses, LivetvSessionsGetSessionConsumerSegmentData, LivetvSessionsGetSessionConsumerSegmentErrors, LivetvSessionsGetSessionConsumerSegmentResponses, LivetvSessionsGetSessionData, LivetvSessionsGetSessionResponse, LivetvSessionsGetSessionResponses, LivetvSessionsGetSlashData, LivetvSessionsGetSlashResponse, LivetvSessionsGetSlashResponses, LogPostPapertrailData, LogPostPapertrailErrors, LogPostPapertrailResponses, LogPostSlashData, LogPostSlashErrors, LogPostSlashResponses, LogPutSlashData, LogPutSlashResponses, Media, Media2, MediaContainer, MediaContainer2, MediaContainerWithArtwork, MediaContainerWithArtwork2, MediaContainerWithDecision, MediaContainerWithDevice, MediaContainerWithDevice2, MediaContainerWithLineup, MediaContainerWithLineup2, MediaContainerWithMetadata, MediaContainerWithMetadata2, MediaContainerWithNestedMetadata, MediaContainerWithNestedMetadata2, MediaContainerWithPlaylistMetadata, MediaContainerWithPlaylistMetadata2, MediaContainerWithSettings, MediaContainerWithSettings2, MediaContainerWithStatusPropertiesMediaContainer, MediaContainerWithSubscription, MediaContainerWithSubscription2, MediaGrabberDeleteDevicesDeviceScanData, MediaGrabberDeleteDevicesDeviceScanResponse, MediaGrabberDeleteDevicesDeviceScanResponses, MediaGrabberDeleteOperationsOperationData, MediaGrabberDeleteOperationsOperationErrors, MediaGrabberDeleteOperationsOperationResponses, MediaGrabberDevicesDeviceDeleteSlashData, MediaGrabberDevicesDeviceDeleteSlashErrors, MediaGrabberDevicesDeviceDeleteSlashResponse, MediaGrabberDevicesDeviceDeleteSlashResponses, MediaGrabberDevicesDeviceGetChannelsData, MediaGrabberDevicesDeviceGetChannelsErrors, MediaGrabberDevicesDeviceGetChannelsResponse, MediaGrabberDevicesDeviceGetChannelsResponses, MediaGrabberDevicesDeviceGetSlashData, MediaGrabberDevicesDeviceGetSlashErrors, MediaGrabberDevicesDeviceGetSlashResponse, MediaGrabberDevicesDeviceGetSlashResponses, MediaGrabberDevicesDeviceGetThumbVersionData, MediaGrabberDevicesDeviceGetThumbVersionErrors, MediaGrabberDevicesDeviceGetThumbVersionResponses, MediaGrabberDevicesDevicePostScanData, MediaGrabberDevicesDevicePostScanResponse, MediaGrabberDevicesDevicePostScanResponses, MediaGrabberDevicesDevicePutChannelmapData, MediaGrabberDevicesDevicePutChannelmapResponse, MediaGrabberDevicesDevicePutChannelmapResponses, MediaGrabberDevicesDevicePutPrefsData, MediaGrabberDevicesDevicePutPrefsResponses, MediaGrabberDevicesDevicePutSlashData, MediaGrabberDevicesDevicePutSlashErrors, MediaGrabberDevicesDevicePutSlashResponse, MediaGrabberDevicesDevicePutSlashResponses, MediaGrabberGetDevicesData, MediaGrabberGetDevicesResponse, MediaGrabberGetDevicesResponses, MediaGrabberGetSlashData, MediaGrabberGetSlashResponse, MediaGrabberGetSlashResponses, MediaGrabberPostDeviceDiscoverData, MediaGrabberPostDeviceDiscoverResponse, MediaGrabberPostDeviceDiscoverResponses, MediaGrabberPostDevicesData, MediaGrabberPostDevicesErrors, MediaGrabberPostDevicesResponse, MediaGrabberPostDevicesResponses, MediaGrabOperation, MediaGrabOperation2, MediaProviderEpgChannelsData, MediaProviderEpgChannelsErrors, MediaProviderEpgChannelsResponse, MediaProviderEpgChannelsResponses, MediaProviderEpgGridData, MediaProviderEpgGridErrors, MediaProviderEpgGridResponse, MediaProviderEpgGridResponses, MediaProviderEpgWatchnowAllData, MediaProviderEpgWatchnowAllErrors, MediaProviderEpgWatchnowAllResponse, MediaProviderEpgWatchnowAllResponses, MediaProviderEpgWatchnowData, MediaProviderEpgWatchnowErrors, MediaProviderEpgWatchnowResponse, MediaProviderEpgWatchnowResponses, MediaQuery, MediaSubscription, MediaSubscription2, MediaSubscriptionsDeleteSubscriptionData, MediaSubscriptionsDeleteSubscriptionErrors, MediaSubscriptionsDeleteSubscriptionResponses, MediaSubscriptionsGetScheduledData, MediaSubscriptionsGetScheduledErrors, MediaSubscriptionsGetScheduledResponse, MediaSubscriptionsGetScheduledResponses, MediaSubscriptionsGetSlashData, MediaSubscriptionsGetSlashErrors, MediaSubscriptionsGetSlashResponse, MediaSubscriptionsGetSlashResponses, MediaSubscriptionsGetSubscriptionData, MediaSubscriptionsGetSubscriptionErrors, MediaSubscriptionsGetSubscriptionResponse, MediaSubscriptionsGetSubscriptionResponses, MediaSubscriptionsGetTemplateData, MediaSubscriptionsGetTemplateErrors, MediaSubscriptionsGetTemplateResponse, MediaSubscriptionsGetTemplateResponses, MediaSubscriptionsPostProcessData, MediaSubscriptionsPostProcessErrors, MediaSubscriptionsPostProcessResponses, MediaSubscriptionsPostSlashData, MediaSubscriptionsPostSlashErrors, MediaSubscriptionsPostSlashResponse, MediaSubscriptionsPostSlashResponses, MediaSubscriptionsPutSubscriptionData, MediaSubscriptionsPutSubscriptionErrors, MediaSubscriptionsPutSubscriptionMoveData, MediaSubscriptionsPutSubscriptionMoveErrors, MediaSubscriptionsPutSubscriptionMoveResponse, MediaSubscriptionsPutSubscriptionMoveResponses, MediaSubscriptionsPutSubscriptionResponse, MediaSubscriptionsPutSubscriptionResponses, Metadata, Metadata2, MetadataAgentProvider, MetadataAgentProviderGroup, MetadataAgentProviderGroupItem, Part, Part2, PlaylistDeleteItemsData, PlaylistDeleteItemsErrors, PlaylistDeleteItemsGeneratorData, PlaylistDeleteItemsGeneratorErrors, PlaylistDeleteItemsGeneratorResponse, PlaylistDeleteItemsGeneratorResponses, PlaylistDeleteItemsResponse, PlaylistDeleteItemsResponses, PlaylistDeletePlaylistData, PlaylistDeletePlaylistErrors, PlaylistDeletePlaylistResponses, PlaylistGetGeneratorsData, PlaylistGetGeneratorsErrors, PlaylistGetGeneratorsResponse, PlaylistGetGeneratorsResponses, PlaylistGetItemsData, PlaylistGetItemsErrors, PlaylistGetItemsGeneratorData, PlaylistGetItemsGeneratorErrors, PlaylistGetItemsGeneratorItemsData, PlaylistGetItemsGeneratorItemsErrors, PlaylistGetItemsGeneratorItemsResponse, PlaylistGetItemsGeneratorItemsResponses, PlaylistGetItemsGeneratorResponse, PlaylistGetItemsGeneratorResponses, PlaylistGetItemsResponse, PlaylistGetItemsResponses, PlaylistGetPlaylistData, PlaylistGetPlaylistErrors, PlaylistGetPlaylistResponse, PlaylistGetPlaylistResponses, PlaylistGetSlashData, PlaylistGetSlashResponse, PlaylistGetSlashResponses, PlaylistPostSlashData, PlaylistPostSlashErrors, PlaylistPostSlashResponse, PlaylistPostSlashResponses, PlaylistPostUploadData, PlaylistPostUploadErrors, PlaylistPostUploadResponses, PlaylistPutItemsData, PlaylistPutItemsErrors, PlaylistPutItemsGeneratorData, PlaylistPutItemsGeneratorErrors, PlaylistPutItemsGeneratorReprocessData, PlaylistPutItemsGeneratorReprocessErrors, PlaylistPutItemsGeneratorReprocessResponses, PlaylistPutItemsGeneratorResponse, PlaylistPutItemsGeneratorResponses, PlaylistPutItemsMoveData, PlaylistPutItemsMoveErrors, PlaylistPutItemsMoveResponse, PlaylistPutItemsMoveResponses, PlaylistPutItemsResponse, PlaylistPutItemsResponses, PlaylistPutPlaylistData, PlaylistPutPlaylistErrors, PlaylistPutPlaylistResponses, PlayQueuePlayQueueResetData, PlayQueuePlayQueueResetErrors, PlayQueuePlayQueueResetResponse, PlayQueuePlayQueueResetResponses, PlayQueuePostSlashData, PlayQueuePostSlashErrors, PlayQueuePostSlashResponse, PlayQueuePostSlashResponses, PlayQueueQueueDeleteItemsData, PlayQueueQueueDeleteItemsItemData, PlayQueueQueueDeleteItemsItemErrors, PlayQueueQueueDeleteItemsItemResponse, PlayQueueQueueDeleteItemsItemResponses, PlayQueueQueueDeleteItemsResponse, PlayQueueQueueDeleteItemsResponses, PlayQueueQueueGetSlashData, PlayQueueQueueGetSlashErrors, PlayQueueQueueGetSlashResponse, PlayQueueQueueGetSlashResponses, PlayQueueQueuePutItemsMoveData, PlayQueueQueuePutItemsMoveErrors, PlayQueueQueuePutItemsMoveResponse, PlayQueueQueuePutItemsMoveResponses, PlayQueueQueuePutItemsShuffleData, PlayQueueQueuePutItemsShuffleErrors, PlayQueueQueuePutItemsShuffleResponse, PlayQueueQueuePutItemsShuffleResponses, PlayQueueQueuePutItemsUnshuffleData, PlayQueueQueuePutItemsUnshuffleErrors, PlayQueueQueuePutItemsUnshuffleResponse, PlayQueueQueuePutItemsUnshuffleResponses, PlayQueueQueuePutSlashData, PlayQueueQueuePutSlashErrors, PlayQueueQueuePutSlashResponse, PlayQueueQueuePutSlashResponses, PostMediaProvidersData, PostMediaProvidersErrors, PostMediaProvidersRefreshData, PostMediaProvidersRefreshResponses, PostMediaProvidersResponses, PostMetadataAgentProviderGroupsData, PostMetadataAgentProviderGroupsErrors, PostMetadataAgentProviderGroupsResponse, PostMetadataAgentProviderGroupsResponses, PostMetadataAgentProvidersData, PostMetadataAgentProvidersErrors, PostMetadataAgentProvidersResponse, PostMetadataAgentProvidersResponses, PreferencesGetGetData, PreferencesGetGetErrors, PreferencesGetGetResponse, PreferencesGetGetResponses, PreferencesGetSlashData, PreferencesGetSlashResponse, PreferencesGetSlashResponses, PreferencesPutSlashData, PreferencesPutSlashErrors, PreferencesPutSlashResponses, PropertiesMediaContainer, PutMetadataAgentProviderData, PutMetadataAgentProviderErrors, PutMetadataAgentProviderGroupData, PutMetadataAgentProviderGroupErrors, PutMetadataAgentProviderGroupItemData, PutMetadataAgentProviderGroupItemErrors, PutMetadataAgentProviderGroupItemResponse, PutMetadataAgentProviderGroupItemResponses, PutMetadataAgentProviderGroupResponse, PutMetadataAgentProviderGroupResponses, PutMetadataAgentProviderResponse, PutMetadataAgentProviderResponses, PutRateData, PutRateErrors, PutRateResponses, PutScrobbleData, PutScrobbleErrors, PutScrobbleResponses, PutUnscrobbleData, PutUnscrobbleErrors, PutUnscrobbleResponses, SecurityGetResourcesData, SecurityGetResourcesErrors, SecurityGetResourcesResponse, SecurityGetResourcesResponses, SecurityPostTokenData, SecurityPostTokenErrors, SecurityPostTokenResponse, SecurityPostTokenResponses, ServerConfiguration, ServerConfiguration2, Sort, Sort2, StatusDeleteHistoryData, StatusDeleteHistoryErrors, StatusDeleteHistoryResponse, StatusDeleteHistoryResponses, StatusGetBackgroundData, StatusGetBackgroundResponse, StatusGetBackgroundResponses, StatusGetHistoryAllData, StatusGetHistoryAllResponse, StatusGetHistoryAllResponses, StatusGetHistoryData, StatusGetHistoryErrors, StatusGetHistoryResponse, StatusGetHistoryResponses, StatusGetSlashData, StatusGetSlashResponse, StatusGetSlashResponses, StatusPostTerminateData, StatusPostTerminateErrors, StatusPostTerminateResponses, Stream, Stream2, Tag, Tag2, Thumb, TimelinePostSlashData, TimelinePostSlashErrors, TimelinePostSlashResponse, TimelinePostSlashResponses, Title, TranscodeDecisionData, TranscodeDecisionResponse, TranscodeDecisionResponses, TranscodeFallbackData, TranscodeFallbackErrors, TranscodeFallbackResponses, TranscodeSessionId, TranscodeStartData, TranscodeStartErrors, TranscodeStartResponses, TranscodeSubtitlesData, TranscodeSubtitlesErrors, TranscodeSubtitlesResponses, TranscodeType, Type, UltraBlurGetColorsData, UltraBlurGetColorsErrors, UltraBlurGetColorsResponse, UltraBlurGetColorsResponses, UltraBlurGetImageData, UltraBlurGetImageErrors, UltraBlurGetImageResponse, UltraBlurGetImageResponses, UpdaterGetStatusData, UpdaterGetStatusResponse, UpdaterGetStatusResponses, UpdaterPutApplyData, UpdaterPutApplyErrors, UpdaterPutApplyResponses, UpdaterPutCheckData, UpdaterPutCheckResponses, WebsocketGetSlashData, WebsocketGetSlashResponse, WebsocketGetSlashResponses } from './types.gen'; +export { activitiesDeleteActivity, activitiesGetSlash, butlerDeleteSlash, butlerDeleteTask, butlerGetSlash, butlerPostSlash, butlerPostTask, deleteMediaProvider, deleteMetadataAgentProvider, deleteMetadataAgentProviderGroup, deleteMetadataAgentProviderGroupItem, downloadQueueDeleteQueueItemsItem, downloadQueueGetQueue, downloadQueueGetQueueItemItemDecision, downloadQueueGetQueueItemItemMedia, downloadQueueGetQueueItems, downloadQueueGetQueueItemsItem, downloadQueuePost, downloadQueuePostQueueAdd, downloadQueuePostQueueItemsItemRestart, eventsourceGetSlash, getIdentity, getMediaProviders, getMetadataAgentProvider, getMetadataAgentProviderGroup, getMetadataAgentProviderGroups, getMetadataAgentProviders, getSlash, hubsGetContinueWatching, hubsGetItems, hubsGetMetadataMetadata, hubsGetMetadataMetadataPostplay, hubsGetMetadataMetadataRelated, hubsGetPopularInLibraries, hubsGetPromoted, hubsGetSearch, hubsGetSection, hubsGetSlash, hubsSearchGetVoice, hubsSectionsSectionManageDeleteIdentifier, hubsSectionsSectionManageDeleteSlash, hubsSectionsSectionManageGetSlash, hubsSectionsSectionManagePostSlash, hubsSectionsSectionManagePutIdentifier, hubsSectionsSectionManagePutMove, imageTranscode, libraryCollectionCollectionGetComposite, libraryCollectionCollectionGetItems, libraryCollectionCollectionPutItems, libraryCollectionCollectionPutItemsItem, libraryCollectionCollectionPutItemsItemMove, libraryCollectionPostSlash, libraryDeleteCaches, libraryDeleteSection, libraryDeleteSectionsAllRefresh, libraryDeleteStreamsStream, libraryGetAll, libraryGetMatches, libraryGetMediaMediaChapterImagesChapter, libraryGetMetadataAugmentationsAugmentation, libraryGetPartsPartChangestampFilename, libraryGetPartsPartIndexesIndex, libraryGetPartsPartIndexesIndexOffset, libraryGetPeoplePerson, libraryGetPeoplePersonMedia, libraryGetRandomArtwork, libraryGetSections, libraryGetSectionsPrefs, libraryGetStreamsStream, libraryGetStreamsStreamLevels, libraryGetStreamsStreamLoudness, libraryGetTags, libraryMetadataDeleteElement, libraryMetadataDeleteMarkerMarker, libraryMetadataDeleteMediaMediaItem, libraryMetadataDeleteSlash, libraryMetadataGetAllLeaves, libraryMetadataGetElement, libraryMetadataGetExtras, libraryMetadataGetFile, libraryMetadataGetMatches, libraryMetadataGetNearest, libraryMetadataGetRelated, libraryMetadataGetSimilar, libraryMetadataGetSlash, libraryMetadataGetTree, libraryMetadataGetUsersTop, libraryMetadataPostElement, libraryMetadataPostExtras, libraryMetadataPostMarker, libraryMetadataPostSubtitles, libraryMetadataPutAddetect, libraryMetadataPutAnalyze, libraryMetadataPutAnalyzeLoudness, libraryMetadataPutChapterThumbs, libraryMetadataPutCredits, libraryMetadataPutElement, libraryMetadataPutIndex, libraryMetadataPutIntro, libraryMetadataPutMarkerMarker, libraryMetadataPutMatch, libraryMetadataPutMerge, libraryMetadataPutPrefs, libraryMetadataPutRefresh, libraryMetadataPutSlash, libraryMetadataPutSplit, libraryMetadataPutUnmatch, libraryMetadataPutVoiceActivity, libraryPostFile, libraryPostSection, libraryPostSectionsRefresh, libraryPutCleanBundles, libraryPutOptimize, libraryPutPartsPart, libraryPutStreamsStream, librarySectionDeleteCollectionCollection, librarySectionDeleteIndexes, librarySectionDeleteIntros, librarySectionDeleteRefresh, librarySectionGetAlbums, librarySectionGetAll, librarySectionGetAllLeaves, librarySectionGetArts, librarySectionGetAudioCodecs, librarySectionGetAudioLayouts, librarySectionGetAutocomplete, librarySectionGetCategories, librarySectionGetCluster, librarySectionGetCollections, librarySectionGetCommon, librarySectionGetComposite, librarySectionGetComputePath, librarySectionGetFilters, librarySectionGetFirstCharaters, librarySectionGetLocations, librarySectionGetMoment, librarySectionGetNearest, librarySectionGetPrefs, librarySectionGetSection, librarySectionGetSorts, librarySectionGetSubtitleCodecs, librarySectionGetVideoCodecs, librarySectionPostRefresh, librarySectionPutAll, librarySectionPutAnalyze, librarySectionPutEmptyTrash, librarySectionPutPrefs, librarySectionPutSection, livetvDvrDeleteDvr, livetvDvrDeleteDvrDevice, livetvDvrDeleteLineup, livetvDvrDeleteReloadGuide, livetvDvrGetDvr, livetvDvrGetSlash, livetvDvrPostChannelsChannelTune, livetvDvrPostReloadGuide, livetvDvrPostSlash, livetvDvrPutDvrDevice, livetvDvrPutLineup, livetvDvrPutPrefs, livetvEpgGetChannelmap, livetvEpgGetChannels, livetvEpgGetCountries, livetvEpgGetCountriesCountryLineups, livetvEpgGetCountriesCountryRegions, livetvEpgGetCountriesCountryRegionsRegionLineups, livetvEpgGetLanguages, livetvEpgGetLineup, livetvEpgGetLineupchannels, livetvSessionsGetSession, livetvSessionsGetSessionConsumerIndex, livetvSessionsGetSessionConsumerSegment, livetvSessionsGetSlash, logPostPapertrail, logPostSlash, logPutSlash, mediaGrabberDeleteDevicesDeviceScan, mediaGrabberDeleteOperationsOperation, mediaGrabberDevicesDeviceDeleteSlash, mediaGrabberDevicesDeviceGetChannels, mediaGrabberDevicesDeviceGetSlash, mediaGrabberDevicesDeviceGetThumbVersion, mediaGrabberDevicesDevicePostScan, mediaGrabberDevicesDevicePutChannelmap, mediaGrabberDevicesDevicePutPrefs, mediaGrabberDevicesDevicePutSlash, mediaGrabberGetDevices, mediaGrabberGetSlash, mediaGrabberPostDeviceDiscover, mediaGrabberPostDevices, mediaProviderEpgChannels, mediaProviderEpgGrid, mediaProviderEpgWatchnow, mediaProviderEpgWatchnowAll, mediaSubscriptionsDeleteSubscription, mediaSubscriptionsGetScheduled, mediaSubscriptionsGetSlash, mediaSubscriptionsGetSubscription, mediaSubscriptionsGetTemplate, mediaSubscriptionsPostProcess, mediaSubscriptionsPostSlash, mediaSubscriptionsPutSubscription, mediaSubscriptionsPutSubscriptionMove, type Options, playlistDeleteItems, playlistDeleteItemsGenerator, playlistDeletePlaylist, playlistGetGenerators, playlistGetItems, playlistGetItemsGenerator, playlistGetItemsGeneratorItems, playlistGetPlaylist, playlistGetSlash, playlistPostSlash, playlistPostUpload, playlistPutItems, playlistPutItemsGenerator, playlistPutItemsGeneratorReprocess, playlistPutItemsMove, playlistPutPlaylist, playQueuePlayQueueReset, playQueuePostSlash, playQueueQueueDeleteItems, playQueueQueueDeleteItemsItem, playQueueQueueGetSlash, playQueueQueuePutItemsMove, playQueueQueuePutItemsShuffle, playQueueQueuePutItemsUnshuffle, playQueueQueuePutSlash, postMediaProviders, postMediaProvidersRefresh, postMetadataAgentProviderGroups, postMetadataAgentProviders, preferencesGetGet, preferencesGetSlash, preferencesPutSlash, putMetadataAgentProvider, putMetadataAgentProviderGroup, putMetadataAgentProviderGroupItem, putRate, putScrobble, putUnscrobble, securityGetResources, securityPostToken, statusDeleteHistory, statusGetBackground, statusGetHistory, statusGetHistoryAll, statusGetSlash, statusPostTerminate, timelinePostSlash, transcodeDecision, transcodeFallback, transcodeStart, transcodeSubtitles, ultraBlurGetColors, ultraBlurGetImage, updaterGetStatus, updaterPutApply, updaterPutCheck, websocketGetSlash } from './sdk.gen'; +export type { _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _2, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _3, _30, _31, _32, _33, _34, _35, _4, _5, _6, _7, _8, _9, ActivitiesDeleteActivityData, ActivitiesDeleteActivityErrors, ActivitiesDeleteActivityResponses, ActivitiesGetSlashData, ActivitiesGetSlashResponse, ActivitiesGetSlashResponses, AllowSync, Art, ButlerDeleteSlashData, ButlerDeleteSlashResponses, ButlerDeleteTaskData, ButlerDeleteTaskErrors, ButlerDeleteTaskResponses, ButlerGetSlashData, ButlerGetSlashResponse, ButlerGetSlashResponses, ButlerPostSlashData, ButlerPostSlashResponses, ButlerPostTaskData, ButlerPostTaskErrors, ButlerPostTaskResponses, Channel, ClientOptions, Composite, Content, DeleteMediaProviderData, DeleteMediaProviderErrors, DeleteMediaProviderResponses, DeleteMetadataAgentProviderData, DeleteMetadataAgentProviderErrors, DeleteMetadataAgentProviderGroupData, DeleteMetadataAgentProviderGroupErrors, DeleteMetadataAgentProviderGroupItemData, DeleteMetadataAgentProviderGroupItemErrors, DeleteMetadataAgentProviderGroupItemResponses, DeleteMetadataAgentProviderGroupResponses, DeleteMetadataAgentProviderResponses, DeviceItems, Directory, Directory2, DirectoryType, DirectoryType2, DownloadQueueDeleteQueueItemsItemData, DownloadQueueDeleteQueueItemsItemResponses, DownloadQueueGetQueueData, DownloadQueueGetQueueItemItemDecisionData, DownloadQueueGetQueueItemItemDecisionErrors, DownloadQueueGetQueueItemItemDecisionResponse, DownloadQueueGetQueueItemItemDecisionResponses, DownloadQueueGetQueueItemItemMediaData, DownloadQueueGetQueueItemItemMediaErrors, DownloadQueueGetQueueItemItemMediaResponses, DownloadQueueGetQueueItemsData, DownloadQueueGetQueueItemsItemData, DownloadQueueGetQueueItemsItemResponse, DownloadQueueGetQueueItemsItemResponses, DownloadQueueGetQueueItemsResponse, DownloadQueueGetQueueItemsResponses, DownloadQueueGetQueueResponse, DownloadQueueGetQueueResponses, DownloadQueuePostData, DownloadQueuePostQueueAddData, DownloadQueuePostQueueAddResponse, DownloadQueuePostQueueAddResponses, DownloadQueuePostQueueItemsItemRestartData, DownloadQueuePostQueueItemsItemRestartResponses, DownloadQueuePostResponse, DownloadQueuePostResponses, EventsourceGetSlashData, EventsourceGetSlashResponse, EventsourceGetSlashResponses, Filter, Filter2, GetIdentityData, GetIdentityResponse, GetIdentityResponses, GetMediaProvidersData, GetMediaProvidersResponse, GetMediaProvidersResponses, GetMetadataAgentProviderData, GetMetadataAgentProviderErrors, GetMetadataAgentProviderGroupData, GetMetadataAgentProviderGroupErrors, GetMetadataAgentProviderGroupResponse, GetMetadataAgentProviderGroupResponses, GetMetadataAgentProviderGroupsData, GetMetadataAgentProviderGroupsResponse, GetMetadataAgentProviderGroupsResponses, GetMetadataAgentProviderResponse, GetMetadataAgentProviderResponses, GetMetadataAgentProvidersData, GetMetadataAgentProvidersResponse, GetMetadataAgentProvidersResponses, GetSlashData, GetSlashResponse, GetSlashResponses, Hub, Hub2, HubsGetContinueWatchingData, HubsGetContinueWatchingResponse, HubsGetContinueWatchingResponses, HubsGetItemsData, HubsGetItemsErrors, HubsGetItemsResponse, HubsGetItemsResponses, HubsGetMetadataMetadataData, HubsGetMetadataMetadataErrors, HubsGetMetadataMetadataPostplayData, HubsGetMetadataMetadataPostplayErrors, HubsGetMetadataMetadataPostplayResponse, HubsGetMetadataMetadataPostplayResponses, HubsGetMetadataMetadataRelatedData, HubsGetMetadataMetadataRelatedErrors, HubsGetMetadataMetadataRelatedResponse, HubsGetMetadataMetadataRelatedResponses, HubsGetMetadataMetadataResponse, HubsGetMetadataMetadataResponses, HubsGetPopularInLibrariesData, HubsGetPopularInLibrariesResponse, HubsGetPopularInLibrariesResponses, HubsGetPromotedData, HubsGetPromotedResponse, HubsGetPromotedResponses, HubsGetSearchData, HubsGetSearchErrors, HubsGetSearchResponse, HubsGetSearchResponses, HubsGetSectionData, HubsGetSectionErrors, HubsGetSectionResponse, HubsGetSectionResponses, HubsGetSlashData, HubsGetSlashResponse, HubsGetSlashResponses, HubsSearchGetVoiceData, HubsSearchGetVoiceErrors, HubsSearchGetVoiceResponse, HubsSearchGetVoiceResponses, HubsSectionsSectionManageDeleteIdentifierData, HubsSectionsSectionManageDeleteIdentifierErrors, HubsSectionsSectionManageDeleteIdentifierResponses, HubsSectionsSectionManageDeleteSlashData, HubsSectionsSectionManageDeleteSlashErrors, HubsSectionsSectionManageDeleteSlashResponses, HubsSectionsSectionManageGetSlashData, HubsSectionsSectionManageGetSlashErrors, HubsSectionsSectionManageGetSlashResponse, HubsSectionsSectionManageGetSlashResponses, HubsSectionsSectionManagePostSlashData, HubsSectionsSectionManagePostSlashErrors, HubsSectionsSectionManagePostSlashResponses, HubsSectionsSectionManagePutIdentifierData, HubsSectionsSectionManagePutIdentifierErrors, HubsSectionsSectionManagePutIdentifierResponses, HubsSectionsSectionManagePutMoveData, HubsSectionsSectionManagePutMoveErrors, HubsSectionsSectionManagePutMoveResponse, HubsSectionsSectionManagePutMoveResponses, Image, ImageTranscodeData, ImageTranscodeErrors, ImageTranscodeResponse, ImageTranscodeResponses, Items, Key, LibraryCollectionCollectionGetCompositeData, LibraryCollectionCollectionGetCompositeErrors, LibraryCollectionCollectionGetCompositeResponse, LibraryCollectionCollectionGetCompositeResponses, LibraryCollectionCollectionGetItemsData, LibraryCollectionCollectionGetItemsErrors, LibraryCollectionCollectionGetItemsResponse, LibraryCollectionCollectionGetItemsResponses, LibraryCollectionCollectionPutItemsData, LibraryCollectionCollectionPutItemsErrors, LibraryCollectionCollectionPutItemsItemData, LibraryCollectionCollectionPutItemsItemErrors, LibraryCollectionCollectionPutItemsItemMoveData, LibraryCollectionCollectionPutItemsItemMoveErrors, LibraryCollectionCollectionPutItemsItemMoveResponse, LibraryCollectionCollectionPutItemsItemMoveResponses, LibraryCollectionCollectionPutItemsItemResponse, LibraryCollectionCollectionPutItemsItemResponses, LibraryCollectionCollectionPutItemsResponse, LibraryCollectionCollectionPutItemsResponses, LibraryCollectionPostSlashData, LibraryCollectionPostSlashErrors, LibraryCollectionPostSlashResponse, LibraryCollectionPostSlashResponses, LibraryDeleteCachesData, LibraryDeleteCachesResponses, LibraryDeleteSectionData, LibraryDeleteSectionResponses, LibraryDeleteSectionsAllRefreshData, LibraryDeleteSectionsAllRefreshResponse, LibraryDeleteSectionsAllRefreshResponses, LibraryDeleteStreamsStreamData, LibraryDeleteStreamsStreamErrors, LibraryDeleteStreamsStreamResponses, LibraryGetAllData, LibraryGetAllResponse, LibraryGetAllResponses, LibraryGetMatchesData, LibraryGetMatchesResponse, LibraryGetMatchesResponses, LibraryGetMediaMediaChapterImagesChapterData, LibraryGetMediaMediaChapterImagesChapterErrors, LibraryGetMediaMediaChapterImagesChapterResponse, LibraryGetMediaMediaChapterImagesChapterResponses, LibraryGetMetadataAugmentationsAugmentationData, LibraryGetMetadataAugmentationsAugmentationErrors, LibraryGetMetadataAugmentationsAugmentationResponses, LibraryGetPartsPartChangestampFilenameData, LibraryGetPartsPartChangestampFilenameErrors, LibraryGetPartsPartChangestampFilenameResponses, LibraryGetPartsPartIndexesIndexData, LibraryGetPartsPartIndexesIndexErrors, LibraryGetPartsPartIndexesIndexOffsetData, LibraryGetPartsPartIndexesIndexOffsetErrors, LibraryGetPartsPartIndexesIndexOffsetResponse, LibraryGetPartsPartIndexesIndexOffsetResponses, LibraryGetPartsPartIndexesIndexResponse, LibraryGetPartsPartIndexesIndexResponses, LibraryGetPeoplePersonData, LibraryGetPeoplePersonErrors, LibraryGetPeoplePersonMediaData, LibraryGetPeoplePersonMediaErrors, LibraryGetPeoplePersonMediaResponse, LibraryGetPeoplePersonMediaResponses, LibraryGetPeoplePersonResponse, LibraryGetPeoplePersonResponses, LibraryGetRandomArtworkData, LibraryGetRandomArtworkResponse, LibraryGetRandomArtworkResponses, LibraryGetSectionsData, LibraryGetSectionsPrefsData, LibraryGetSectionsPrefsErrors, LibraryGetSectionsPrefsResponse, LibraryGetSectionsPrefsResponses, LibraryGetSectionsResponse, LibraryGetSectionsResponses, LibraryGetStreamsStreamData, LibraryGetStreamsStreamErrors, LibraryGetStreamsStreamLevelsData, LibraryGetStreamsStreamLevelsErrors, LibraryGetStreamsStreamLevelsResponse, LibraryGetStreamsStreamLevelsResponses, LibraryGetStreamsStreamLoudnessData, LibraryGetStreamsStreamLoudnessErrors, LibraryGetStreamsStreamLoudnessResponse, LibraryGetStreamsStreamLoudnessResponses, LibraryGetStreamsStreamResponses, LibraryGetTagsData, LibraryGetTagsResponse, LibraryGetTagsResponses, LibraryMetadataDeleteElementData, LibraryMetadataDeleteElementErrors, LibraryMetadataDeleteElementResponses, LibraryMetadataDeleteMarkerMarkerData, LibraryMetadataDeleteMarkerMarkerErrors, LibraryMetadataDeleteMarkerMarkerResponses, LibraryMetadataDeleteMediaMediaItemData, LibraryMetadataDeleteMediaMediaItemErrors, LibraryMetadataDeleteMediaMediaItemResponses, LibraryMetadataDeleteSlashData, LibraryMetadataDeleteSlashErrors, LibraryMetadataDeleteSlashResponses, LibraryMetadataGetAllLeavesData, LibraryMetadataGetAllLeavesResponse, LibraryMetadataGetAllLeavesResponses, LibraryMetadataGetElementData, LibraryMetadataGetElementResponse, LibraryMetadataGetElementResponses, LibraryMetadataGetExtrasData, LibraryMetadataGetExtrasResponse, LibraryMetadataGetExtrasResponses, LibraryMetadataGetFileData, LibraryMetadataGetFileResponse, LibraryMetadataGetFileResponses, LibraryMetadataGetMatchesData, LibraryMetadataGetMatchesResponse, LibraryMetadataGetMatchesResponses, LibraryMetadataGetNearestData, LibraryMetadataGetNearestResponse, LibraryMetadataGetNearestResponses, LibraryMetadataGetRelatedData, LibraryMetadataGetRelatedResponse, LibraryMetadataGetRelatedResponses, LibraryMetadataGetSimilarData, LibraryMetadataGetSimilarResponse, LibraryMetadataGetSimilarResponses, LibraryMetadataGetSlashData, LibraryMetadataGetSlashResponse, LibraryMetadataGetSlashResponses, LibraryMetadataGetTreeData, LibraryMetadataGetTreeResponse, LibraryMetadataGetTreeResponses, LibraryMetadataGetUsersTopData, LibraryMetadataGetUsersTopResponse, LibraryMetadataGetUsersTopResponses, LibraryMetadataPostElementData, LibraryMetadataPostElementResponses, LibraryMetadataPostExtrasData, LibraryMetadataPostExtrasErrors, LibraryMetadataPostExtrasResponses, LibraryMetadataPostMarkerData, LibraryMetadataPostMarkerErrors, LibraryMetadataPostMarkerResponse, LibraryMetadataPostMarkerResponses, LibraryMetadataPostSubtitlesData, LibraryMetadataPostSubtitlesResponses, LibraryMetadataPutAddetectData, LibraryMetadataPutAddetectResponses, LibraryMetadataPutAnalyzeData, LibraryMetadataPutAnalyzeLoudnessData, LibraryMetadataPutAnalyzeLoudnessResponses, LibraryMetadataPutAnalyzeResponses, LibraryMetadataPutChapterThumbsData, LibraryMetadataPutChapterThumbsResponses, LibraryMetadataPutCreditsData, LibraryMetadataPutCreditsResponses, LibraryMetadataPutElementData, LibraryMetadataPutElementResponses, LibraryMetadataPutIndexData, LibraryMetadataPutIndexResponses, LibraryMetadataPutIntroData, LibraryMetadataPutIntroResponses, LibraryMetadataPutMarkerMarkerData, LibraryMetadataPutMarkerMarkerErrors, LibraryMetadataPutMarkerMarkerResponse, LibraryMetadataPutMarkerMarkerResponses, LibraryMetadataPutMatchData, LibraryMetadataPutMatchResponses, LibraryMetadataPutMergeData, LibraryMetadataPutMergeResponses, LibraryMetadataPutPrefsData, LibraryMetadataPutPrefsResponses, LibraryMetadataPutRefreshData, LibraryMetadataPutRefreshResponses, LibraryMetadataPutSlashData, LibraryMetadataPutSlashErrors, LibraryMetadataPutSlashResponses, LibraryMetadataPutSplitData, LibraryMetadataPutSplitResponses, LibraryMetadataPutUnmatchData, LibraryMetadataPutUnmatchResponses, LibraryMetadataPutVoiceActivityData, LibraryMetadataPutVoiceActivityResponses, LibraryPostFileData, LibraryPostFileResponse, LibraryPostFileResponses, LibraryPostSectionData, LibraryPostSectionErrors, LibraryPostSectionResponse, LibraryPostSectionResponses, LibraryPostSectionsRefreshData, LibraryPostSectionsRefreshErrors, LibraryPostSectionsRefreshResponses, LibraryPutCleanBundlesData, LibraryPutCleanBundlesResponses, LibraryPutOptimizeData, LibraryPutOptimizeResponses, LibraryPutPartsPartData, LibraryPutPartsPartErrors, LibraryPutPartsPartResponses, LibraryPutStreamsStreamData, LibraryPutStreamsStreamErrors, LibraryPutStreamsStreamResponses, LibrarySection, LibrarySection2, LibrarySectionDeleteCollectionCollectionData, LibrarySectionDeleteCollectionCollectionErrors, LibrarySectionDeleteCollectionCollectionResponses, LibrarySectionDeleteIndexesData, LibrarySectionDeleteIndexesResponses, LibrarySectionDeleteIntrosData, LibrarySectionDeleteIntrosResponses, LibrarySectionDeleteRefreshData, LibrarySectionDeleteRefreshResponses, LibrarySectionGetAlbumsData, LibrarySectionGetAlbumsResponse, LibrarySectionGetAlbumsResponses, LibrarySectionGetAllData, LibrarySectionGetAllLeavesData, LibrarySectionGetAllLeavesResponse, LibrarySectionGetAllLeavesResponses, LibrarySectionGetAllResponse, LibrarySectionGetAllResponses, LibrarySectionGetArtsData, LibrarySectionGetArtsResponse, LibrarySectionGetArtsResponses, LibrarySectionGetAudioCodecsData, LibrarySectionGetAudioCodecsResponse, LibrarySectionGetAudioCodecsResponses, LibrarySectionGetAudioLayoutsData, LibrarySectionGetAudioLayoutsResponse, LibrarySectionGetAudioLayoutsResponses, LibrarySectionGetAutocompleteData, LibrarySectionGetAutocompleteErrors, LibrarySectionGetAutocompleteResponse, LibrarySectionGetAutocompleteResponses, LibrarySectionGetCategoriesData, LibrarySectionGetCategoriesResponse, LibrarySectionGetCategoriesResponses, LibrarySectionGetClusterData, LibrarySectionGetClusterResponse, LibrarySectionGetClusterResponses, LibrarySectionGetCollectionsData, LibrarySectionGetCollectionsResponse, LibrarySectionGetCollectionsResponses, LibrarySectionGetCommonData, LibrarySectionGetCommonErrors, LibrarySectionGetCommonResponse, LibrarySectionGetCommonResponses, LibrarySectionGetCompositeData, LibrarySectionGetCompositeResponses, LibrarySectionGetComputePathData, LibrarySectionGetComputePathResponse, LibrarySectionGetComputePathResponses, LibrarySectionGetFiltersData, LibrarySectionGetFiltersResponse, LibrarySectionGetFiltersResponses, LibrarySectionGetFirstCharatersData, LibrarySectionGetFirstCharatersResponse, LibrarySectionGetFirstCharatersResponses, LibrarySectionGetLocationsData, LibrarySectionGetLocationsResponse, LibrarySectionGetLocationsResponses, LibrarySectionGetMomentData, LibrarySectionGetMomentResponse, LibrarySectionGetMomentResponses, LibrarySectionGetNearestData, LibrarySectionGetNearestResponse, LibrarySectionGetNearestResponses, LibrarySectionGetPrefsData, LibrarySectionGetPrefsResponse, LibrarySectionGetPrefsResponses, LibrarySectionGetSectionData, LibrarySectionGetSectionResponse, LibrarySectionGetSectionResponses, LibrarySectionGetSortsData, LibrarySectionGetSortsResponse, LibrarySectionGetSortsResponses, LibrarySectionGetSubtitleCodecsData, LibrarySectionGetSubtitleCodecsResponse, LibrarySectionGetSubtitleCodecsResponses, LibrarySectionGetVideoCodecsData, LibrarySectionGetVideoCodecsResponse, LibrarySectionGetVideoCodecsResponses, LibrarySectionPostRefreshData, LibrarySectionPostRefreshResponses, LibrarySectionPutAllData, LibrarySectionPutAllErrors, LibrarySectionPutAllResponses, LibrarySectionPutAnalyzeData, LibrarySectionPutAnalyzeResponses, LibrarySectionPutEmptyTrashData, LibrarySectionPutEmptyTrashResponses, LibrarySectionPutPrefsData, LibrarySectionPutPrefsResponses, LibrarySectionPutSectionData, LibrarySectionPutSectionErrors, LibrarySectionPutSectionResponses, LineupItems, LivetvDvrDeleteDvrData, LivetvDvrDeleteDvrDeviceData, LivetvDvrDeleteDvrDeviceResponse, LivetvDvrDeleteDvrDeviceResponses, LivetvDvrDeleteDvrResponses, LivetvDvrDeleteLineupData, LivetvDvrDeleteLineupResponse, LivetvDvrDeleteLineupResponses, LivetvDvrDeleteReloadGuideData, LivetvDvrDeleteReloadGuideResponses, LivetvDvrGetDvrData, LivetvDvrGetDvrResponse, LivetvDvrGetDvrResponses, LivetvDvrGetSlashData, LivetvDvrGetSlashResponse, LivetvDvrGetSlashResponses, LivetvDvrPostChannelsChannelTuneData, LivetvDvrPostChannelsChannelTuneErrors, LivetvDvrPostChannelsChannelTuneResponse, LivetvDvrPostChannelsChannelTuneResponses, LivetvDvrPostReloadGuideData, LivetvDvrPostReloadGuideResponses, LivetvDvrPostSlashData, LivetvDvrPostSlashResponse, LivetvDvrPostSlashResponses, LivetvDvrPutDvrDeviceData, LivetvDvrPutDvrDeviceResponse, LivetvDvrPutDvrDeviceResponses, LivetvDvrPutLineupData, LivetvDvrPutLineupResponse, LivetvDvrPutLineupResponses, LivetvDvrPutPrefsData, LivetvDvrPutPrefsResponse, LivetvDvrPutPrefsResponses, LivetvEpgGetChannelmapData, LivetvEpgGetChannelmapErrors, LivetvEpgGetChannelmapResponse, LivetvEpgGetChannelmapResponses, LivetvEpgGetChannelsData, LivetvEpgGetChannelsErrors, LivetvEpgGetChannelsResponse, LivetvEpgGetChannelsResponses, LivetvEpgGetCountriesCountryLineupsData, LivetvEpgGetCountriesCountryLineupsErrors, LivetvEpgGetCountriesCountryLineupsResponse, LivetvEpgGetCountriesCountryLineupsResponses, LivetvEpgGetCountriesCountryRegionsData, LivetvEpgGetCountriesCountryRegionsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsData, LivetvEpgGetCountriesCountryRegionsRegionLineupsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsResponse, LivetvEpgGetCountriesCountryRegionsRegionLineupsResponses, LivetvEpgGetCountriesCountryRegionsResponse, LivetvEpgGetCountriesCountryRegionsResponses, LivetvEpgGetCountriesData, LivetvEpgGetCountriesResponse, LivetvEpgGetCountriesResponses, LivetvEpgGetLanguagesData, LivetvEpgGetLanguagesResponse, LivetvEpgGetLanguagesResponses, LivetvEpgGetLineupchannelsData, LivetvEpgGetLineupchannelsErrors, LivetvEpgGetLineupchannelsResponse, LivetvEpgGetLineupchannelsResponses, LivetvEpgGetLineupData, LivetvEpgGetLineupErrors, LivetvEpgGetLineupResponses, LivetvSessionsGetSessionConsumerIndexData, LivetvSessionsGetSessionConsumerIndexErrors, LivetvSessionsGetSessionConsumerIndexResponses, LivetvSessionsGetSessionConsumerSegmentData, LivetvSessionsGetSessionConsumerSegmentErrors, LivetvSessionsGetSessionConsumerSegmentResponses, LivetvSessionsGetSessionData, LivetvSessionsGetSessionResponse, LivetvSessionsGetSessionResponses, LivetvSessionsGetSlashData, LivetvSessionsGetSlashResponse, LivetvSessionsGetSlashResponses, LogPostPapertrailData, LogPostPapertrailErrors, LogPostPapertrailResponses, LogPostSlashData, LogPostSlashErrors, LogPostSlashResponses, LogPutSlashData, LogPutSlashResponses, Media, Media2, MediaContainer, MediaContainer2, MediaContainerWithArtwork, MediaContainerWithArtwork2, MediaContainerWithDecision, MediaContainerWithDevice, MediaContainerWithDevice2, MediaContainerWithLineup, MediaContainerWithLineup2, MediaContainerWithMetadata, MediaContainerWithMetadata2, MediaContainerWithNestedMetadata, MediaContainerWithNestedMetadata2, MediaContainerWithPlaylistMetadata, MediaContainerWithPlaylistMetadata2, MediaContainerWithSettings, MediaContainerWithSettings2, MediaContainerWithStatusPropertiesMediaContainer, MediaContainerWithSubscription, MediaContainerWithSubscription2, MediaGrabberDeleteDevicesDeviceScanData, MediaGrabberDeleteDevicesDeviceScanResponse, MediaGrabberDeleteDevicesDeviceScanResponses, MediaGrabberDeleteOperationsOperationData, MediaGrabberDeleteOperationsOperationErrors, MediaGrabberDeleteOperationsOperationResponses, MediaGrabberDevicesDeviceDeleteSlashData, MediaGrabberDevicesDeviceDeleteSlashErrors, MediaGrabberDevicesDeviceDeleteSlashResponse, MediaGrabberDevicesDeviceDeleteSlashResponses, MediaGrabberDevicesDeviceGetChannelsData, MediaGrabberDevicesDeviceGetChannelsErrors, MediaGrabberDevicesDeviceGetChannelsResponse, MediaGrabberDevicesDeviceGetChannelsResponses, MediaGrabberDevicesDeviceGetSlashData, MediaGrabberDevicesDeviceGetSlashErrors, MediaGrabberDevicesDeviceGetSlashResponse, MediaGrabberDevicesDeviceGetSlashResponses, MediaGrabberDevicesDeviceGetThumbVersionData, MediaGrabberDevicesDeviceGetThumbVersionErrors, MediaGrabberDevicesDeviceGetThumbVersionResponses, MediaGrabberDevicesDevicePostScanData, MediaGrabberDevicesDevicePostScanResponse, MediaGrabberDevicesDevicePostScanResponses, MediaGrabberDevicesDevicePutChannelmapData, MediaGrabberDevicesDevicePutChannelmapResponse, MediaGrabberDevicesDevicePutChannelmapResponses, MediaGrabberDevicesDevicePutPrefsData, MediaGrabberDevicesDevicePutPrefsResponses, MediaGrabberDevicesDevicePutSlashData, MediaGrabberDevicesDevicePutSlashErrors, MediaGrabberDevicesDevicePutSlashResponse, MediaGrabberDevicesDevicePutSlashResponses, MediaGrabberGetDevicesData, MediaGrabberGetDevicesResponse, MediaGrabberGetDevicesResponses, MediaGrabberGetSlashData, MediaGrabberGetSlashResponse, MediaGrabberGetSlashResponses, MediaGrabberPostDeviceDiscoverData, MediaGrabberPostDeviceDiscoverResponse, MediaGrabberPostDeviceDiscoverResponses, MediaGrabberPostDevicesData, MediaGrabberPostDevicesErrors, MediaGrabberPostDevicesResponse, MediaGrabberPostDevicesResponses, MediaGrabOperation, MediaGrabOperation2, MediaProviderEpgChannelsData, MediaProviderEpgChannelsErrors, MediaProviderEpgChannelsResponse, MediaProviderEpgChannelsResponses, MediaProviderEpgGridData, MediaProviderEpgGridErrors, MediaProviderEpgGridResponse, MediaProviderEpgGridResponses, MediaProviderEpgWatchnowAllData, MediaProviderEpgWatchnowAllErrors, MediaProviderEpgWatchnowAllResponse, MediaProviderEpgWatchnowAllResponses, MediaProviderEpgWatchnowData, MediaProviderEpgWatchnowErrors, MediaProviderEpgWatchnowResponse, MediaProviderEpgWatchnowResponses, MediaQuery, MediaSubscription, MediaSubscription2, MediaSubscriptionsDeleteSubscriptionData, MediaSubscriptionsDeleteSubscriptionErrors, MediaSubscriptionsDeleteSubscriptionResponses, MediaSubscriptionsGetScheduledData, MediaSubscriptionsGetScheduledErrors, MediaSubscriptionsGetScheduledResponse, MediaSubscriptionsGetScheduledResponses, MediaSubscriptionsGetSlashData, MediaSubscriptionsGetSlashErrors, MediaSubscriptionsGetSlashResponse, MediaSubscriptionsGetSlashResponses, MediaSubscriptionsGetSubscriptionData, MediaSubscriptionsGetSubscriptionErrors, MediaSubscriptionsGetSubscriptionResponse, MediaSubscriptionsGetSubscriptionResponses, MediaSubscriptionsGetTemplateData, MediaSubscriptionsGetTemplateErrors, MediaSubscriptionsGetTemplateResponse, MediaSubscriptionsGetTemplateResponses, MediaSubscriptionsPostProcessData, MediaSubscriptionsPostProcessErrors, MediaSubscriptionsPostProcessResponses, MediaSubscriptionsPostSlashData, MediaSubscriptionsPostSlashErrors, MediaSubscriptionsPostSlashResponse, MediaSubscriptionsPostSlashResponses, MediaSubscriptionsPutSubscriptionData, MediaSubscriptionsPutSubscriptionErrors, MediaSubscriptionsPutSubscriptionMoveData, MediaSubscriptionsPutSubscriptionMoveErrors, MediaSubscriptionsPutSubscriptionMoveResponse, MediaSubscriptionsPutSubscriptionMoveResponses, MediaSubscriptionsPutSubscriptionResponse, MediaSubscriptionsPutSubscriptionResponses, Metadata, Metadata2, MetadataAgentProvider, MetadataAgentProviderGroup, MetadataAgentProviderGroupItem, Part, Part2, PlaylistDeleteItemsData, PlaylistDeleteItemsErrors, PlaylistDeleteItemsGeneratorData, PlaylistDeleteItemsGeneratorErrors, PlaylistDeleteItemsGeneratorResponse, PlaylistDeleteItemsGeneratorResponses, PlaylistDeleteItemsResponse, PlaylistDeleteItemsResponses, PlaylistDeletePlaylistData, PlaylistDeletePlaylistErrors, PlaylistDeletePlaylistResponses, PlaylistGetGeneratorsData, PlaylistGetGeneratorsErrors, PlaylistGetGeneratorsResponse, PlaylistGetGeneratorsResponses, PlaylistGetItemsData, PlaylistGetItemsErrors, PlaylistGetItemsGeneratorData, PlaylistGetItemsGeneratorErrors, PlaylistGetItemsGeneratorItemsData, PlaylistGetItemsGeneratorItemsErrors, PlaylistGetItemsGeneratorItemsResponse, PlaylistGetItemsGeneratorItemsResponses, PlaylistGetItemsGeneratorResponse, PlaylistGetItemsGeneratorResponses, PlaylistGetItemsResponse, PlaylistGetItemsResponses, PlaylistGetPlaylistData, PlaylistGetPlaylistErrors, PlaylistGetPlaylistResponse, PlaylistGetPlaylistResponses, PlaylistGetSlashData, PlaylistGetSlashResponse, PlaylistGetSlashResponses, PlaylistPostSlashData, PlaylistPostSlashErrors, PlaylistPostSlashResponse, PlaylistPostSlashResponses, PlaylistPostUploadData, PlaylistPostUploadErrors, PlaylistPostUploadResponses, PlaylistPutItemsData, PlaylistPutItemsErrors, PlaylistPutItemsGeneratorData, PlaylistPutItemsGeneratorErrors, PlaylistPutItemsGeneratorReprocessData, PlaylistPutItemsGeneratorReprocessErrors, PlaylistPutItemsGeneratorReprocessResponses, PlaylistPutItemsGeneratorResponse, PlaylistPutItemsGeneratorResponses, PlaylistPutItemsMoveData, PlaylistPutItemsMoveErrors, PlaylistPutItemsMoveResponse, PlaylistPutItemsMoveResponses, PlaylistPutItemsResponse, PlaylistPutItemsResponses, PlaylistPutPlaylistData, PlaylistPutPlaylistErrors, PlaylistPutPlaylistResponses, PlayQueuePlayQueueResetData, PlayQueuePlayQueueResetErrors, PlayQueuePlayQueueResetResponse, PlayQueuePlayQueueResetResponses, PlayQueuePostSlashData, PlayQueuePostSlashErrors, PlayQueuePostSlashResponse, PlayQueuePostSlashResponses, PlayQueueQueueDeleteItemsData, PlayQueueQueueDeleteItemsItemData, PlayQueueQueueDeleteItemsItemErrors, PlayQueueQueueDeleteItemsItemResponse, PlayQueueQueueDeleteItemsItemResponses, PlayQueueQueueDeleteItemsResponse, PlayQueueQueueDeleteItemsResponses, PlayQueueQueueGetSlashData, PlayQueueQueueGetSlashErrors, PlayQueueQueueGetSlashResponse, PlayQueueQueueGetSlashResponses, PlayQueueQueuePutItemsMoveData, PlayQueueQueuePutItemsMoveErrors, PlayQueueQueuePutItemsMoveResponse, PlayQueueQueuePutItemsMoveResponses, PlayQueueQueuePutItemsShuffleData, PlayQueueQueuePutItemsShuffleErrors, PlayQueueQueuePutItemsShuffleResponse, PlayQueueQueuePutItemsShuffleResponses, PlayQueueQueuePutItemsUnshuffleData, PlayQueueQueuePutItemsUnshuffleErrors, PlayQueueQueuePutItemsUnshuffleResponse, PlayQueueQueuePutItemsUnshuffleResponses, PlayQueueQueuePutSlashData, PlayQueueQueuePutSlashErrors, PlayQueueQueuePutSlashResponse, PlayQueueQueuePutSlashResponses, PostMediaProvidersData, PostMediaProvidersErrors, PostMediaProvidersRefreshData, PostMediaProvidersRefreshResponses, PostMediaProvidersResponses, PostMetadataAgentProviderGroupsData, PostMetadataAgentProviderGroupsErrors, PostMetadataAgentProviderGroupsResponse, PostMetadataAgentProviderGroupsResponses, PostMetadataAgentProvidersData, PostMetadataAgentProvidersErrors, PostMetadataAgentProvidersResponse, PostMetadataAgentProvidersResponses, PreferencesGetGetData, PreferencesGetGetErrors, PreferencesGetGetResponse, PreferencesGetGetResponses, PreferencesGetSlashData, PreferencesGetSlashResponse, PreferencesGetSlashResponses, PreferencesPutSlashData, PreferencesPutSlashErrors, PreferencesPutSlashResponses, PropertiesMediaContainer, PutMetadataAgentProviderData, PutMetadataAgentProviderErrors, PutMetadataAgentProviderGroupData, PutMetadataAgentProviderGroupErrors, PutMetadataAgentProviderGroupItemData, PutMetadataAgentProviderGroupItemErrors, PutMetadataAgentProviderGroupItemResponse, PutMetadataAgentProviderGroupItemResponses, PutMetadataAgentProviderGroupResponse, PutMetadataAgentProviderGroupResponses, PutMetadataAgentProviderResponse, PutMetadataAgentProviderResponses, PutRateData, PutRateErrors, PutRateResponses, PutScrobbleData, PutScrobbleErrors, PutScrobbleResponses, PutUnscrobbleData, PutUnscrobbleErrors, PutUnscrobbleResponses, SecurityGetResourcesData, SecurityGetResourcesErrors, SecurityGetResourcesResponse, SecurityGetResourcesResponses, SecurityPostTokenData, SecurityPostTokenErrors, SecurityPostTokenResponse, SecurityPostTokenResponses, ServerConfiguration, ServerConfiguration2, Sort, Sort2, StatusDeleteHistoryData, StatusDeleteHistoryErrors, StatusDeleteHistoryResponse, StatusDeleteHistoryResponses, StatusGetBackgroundData, StatusGetBackgroundResponse, StatusGetBackgroundResponses, StatusGetHistoryAllData, StatusGetHistoryAllResponse, StatusGetHistoryAllResponses, StatusGetHistoryData, StatusGetHistoryErrors, StatusGetHistoryResponse, StatusGetHistoryResponses, StatusGetSlashData, StatusGetSlashResponse, StatusGetSlashResponses, StatusPostTerminateData, StatusPostTerminateErrors, StatusPostTerminateResponses, Stream, Stream2, Tag, Tag2, Thumb, TimelinePostSlashData, TimelinePostSlashErrors, TimelinePostSlashResponse, TimelinePostSlashResponses, Title, TranscodeDecisionData, TranscodeDecisionResponse, TranscodeDecisionResponses, TranscodeFallbackData, TranscodeFallbackErrors, TranscodeFallbackResponses, TranscodeSessionId, TranscodeStartData, TranscodeStartErrors, TranscodeStartResponses, TranscodeSubtitlesData, TranscodeSubtitlesErrors, TranscodeSubtitlesResponses, TranscodeType, Type, UltraBlurGetColorsData, UltraBlurGetColorsErrors, UltraBlurGetColorsResponse, UltraBlurGetColorsResponses, UltraBlurGetImageData, UltraBlurGetImageErrors, UltraBlurGetImageResponse, UltraBlurGetImageResponses, UpdaterGetStatusData, UpdaterGetStatusResponse, UpdaterGetStatusResponses, UpdaterPutApplyData, UpdaterPutApplyErrors, UpdaterPutApplyResponses, UpdaterPutCheckData, UpdaterPutCheckResponses, WebsocketGetSlashData, WebsocketGetSlashResponse, WebsocketGetSlashResponses } from './types.gen'; diff --git a/apps/server/src/providers/plex/generated/sdk.gen.ts b/apps/server/src/providers/plex/generated/sdk.gen.ts index 26ba6c40..e857a757 100644 --- a/apps/server/src/providers/plex/generated/sdk.gen.ts +++ b/apps/server/src/providers/plex/generated/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, ClientMeta, Options as Options2, RequestResult, TDataShape } from './client'; import { client } from './client.gen'; -import type { ActivitiesDeleteActivityData, ActivitiesDeleteActivityErrors, ActivitiesDeleteActivityResponses, ActivitiesGetSlashData, ActivitiesGetSlashResponses, ButlerDeleteSlashData, ButlerDeleteSlashResponses, ButlerDeleteTaskData, ButlerDeleteTaskErrors, ButlerDeleteTaskResponses, ButlerGetSlashData, ButlerGetSlashResponses, ButlerPostSlashData, ButlerPostSlashResponses, ButlerPostTaskData, ButlerPostTaskErrors, ButlerPostTaskResponses, DeleteMediaProviderData, DeleteMediaProviderErrors, DeleteMediaProviderResponses, DeleteMetadataAgentProviderData, DeleteMetadataAgentProviderErrors, DeleteMetadataAgentProviderGroupData, DeleteMetadataAgentProviderGroupErrors, DeleteMetadataAgentProviderGroupItemData, DeleteMetadataAgentProviderGroupItemErrors, DeleteMetadataAgentProviderGroupItemResponses, DeleteMetadataAgentProviderGroupResponses, DeleteMetadataAgentProviderResponses, DownloadQueueDeleteQueueItemsItemData, DownloadQueueDeleteQueueItemsItemResponses, DownloadQueueGetQueueData, DownloadQueueGetQueueItemItemDecisionData, DownloadQueueGetQueueItemItemDecisionErrors, DownloadQueueGetQueueItemItemDecisionResponses, DownloadQueueGetQueueItemItemMediaData, DownloadQueueGetQueueItemItemMediaErrors, DownloadQueueGetQueueItemItemMediaResponses, DownloadQueueGetQueueItemsData, DownloadQueueGetQueueItemsItemData, DownloadQueueGetQueueItemsItemResponses, DownloadQueueGetQueueItemsResponses, DownloadQueueGetQueueResponses, DownloadQueuePostData, DownloadQueuePostQueueAddData, DownloadQueuePostQueueAddResponses, DownloadQueuePostQueueItemsItemRestartData, DownloadQueuePostQueueItemsItemRestartResponses, DownloadQueuePostResponses, EventsourceGetSlashData, EventsourceGetSlashResponses, GetIdentityData, GetIdentityResponses, GetMediaProvidersData, GetMediaProvidersResponses, GetMetadataAgentProviderData, GetMetadataAgentProviderErrors, GetMetadataAgentProviderGroupData, GetMetadataAgentProviderGroupErrors, GetMetadataAgentProviderGroupResponses, GetMetadataAgentProviderGroupsData, GetMetadataAgentProviderGroupsResponses, GetMetadataAgentProviderResponses, GetMetadataAgentProvidersData, GetMetadataAgentProvidersResponses, GetSlashData, GetSlashResponses, HubsGetContinueWatchingData, HubsGetContinueWatchingResponses, HubsGetItemsData, HubsGetItemsErrors, HubsGetItemsResponses, HubsGetMetadataMetadataData, HubsGetMetadataMetadataErrors, HubsGetMetadataMetadataPostplayData, HubsGetMetadataMetadataPostplayErrors, HubsGetMetadataMetadataPostplayResponses, HubsGetMetadataMetadataRelatedData, HubsGetMetadataMetadataRelatedErrors, HubsGetMetadataMetadataRelatedResponses, HubsGetMetadataMetadataResponses, HubsGetPromotedData, HubsGetPromotedResponses, HubsGetSearchData, HubsGetSearchErrors, HubsGetSearchResponses, HubsGetSectionData, HubsGetSectionErrors, HubsGetSectionResponses, HubsGetSlashData, HubsGetSlashResponses, HubsSearchGetVoiceData, HubsSearchGetVoiceErrors, HubsSearchGetVoiceResponses, HubsSectionsSectionManageDeleteIdentifierData, HubsSectionsSectionManageDeleteIdentifierErrors, HubsSectionsSectionManageDeleteIdentifierResponses, HubsSectionsSectionManageDeleteSlashData, HubsSectionsSectionManageDeleteSlashErrors, HubsSectionsSectionManageDeleteSlashResponses, HubsSectionsSectionManageGetSlashData, HubsSectionsSectionManageGetSlashErrors, HubsSectionsSectionManageGetSlashResponses, HubsSectionsSectionManagePostSlashData, HubsSectionsSectionManagePostSlashErrors, HubsSectionsSectionManagePostSlashResponses, HubsSectionsSectionManagePutIdentifierData, HubsSectionsSectionManagePutIdentifierErrors, HubsSectionsSectionManagePutIdentifierResponses, HubsSectionsSectionManagePutMoveData, HubsSectionsSectionManagePutMoveErrors, HubsSectionsSectionManagePutMoveResponses, ImageTranscodeData, ImageTranscodeErrors, ImageTranscodeResponses, LibraryCollectionCollectionGetCompositeData, LibraryCollectionCollectionGetCompositeErrors, LibraryCollectionCollectionGetCompositeResponses, LibraryCollectionCollectionGetItemsData, LibraryCollectionCollectionGetItemsErrors, LibraryCollectionCollectionGetItemsResponses, LibraryCollectionCollectionPutItemsData, LibraryCollectionCollectionPutItemsErrors, LibraryCollectionCollectionPutItemsItemData, LibraryCollectionCollectionPutItemsItemErrors, LibraryCollectionCollectionPutItemsItemMoveData, LibraryCollectionCollectionPutItemsItemMoveErrors, LibraryCollectionCollectionPutItemsItemMoveResponses, LibraryCollectionCollectionPutItemsItemResponses, LibraryCollectionCollectionPutItemsResponses, LibraryCollectionPostSlashData, LibraryCollectionPostSlashErrors, LibraryCollectionPostSlashResponses, LibraryDeleteCachesData, LibraryDeleteCachesResponses, LibraryDeleteSectionData, LibraryDeleteSectionResponses, LibraryDeleteSectionsAllRefreshData, LibraryDeleteSectionsAllRefreshResponses, LibraryDeleteStreamsStreamData, LibraryDeleteStreamsStreamErrors, LibraryDeleteStreamsStreamResponses, LibraryGetAllData, LibraryGetAllResponses, LibraryGetMatchesData, LibraryGetMatchesResponses, LibraryGetMediaMediaChapterImagesChapterData, LibraryGetMediaMediaChapterImagesChapterErrors, LibraryGetMediaMediaChapterImagesChapterResponses, LibraryGetMetadataAugmentationsAugmentationData, LibraryGetMetadataAugmentationsAugmentationErrors, LibraryGetMetadataAugmentationsAugmentationResponses, LibraryGetPartsPartChangestampFilenameData, LibraryGetPartsPartChangestampFilenameErrors, LibraryGetPartsPartChangestampFilenameResponses, LibraryGetPartsPartIndexesIndexData, LibraryGetPartsPartIndexesIndexErrors, LibraryGetPartsPartIndexesIndexOffsetData, LibraryGetPartsPartIndexesIndexOffsetErrors, LibraryGetPartsPartIndexesIndexOffsetResponses, LibraryGetPartsPartIndexesIndexResponses, LibraryGetPeoplePersonData, LibraryGetPeoplePersonErrors, LibraryGetPeoplePersonMediaData, LibraryGetPeoplePersonMediaErrors, LibraryGetPeoplePersonMediaResponses, LibraryGetPeoplePersonResponses, LibraryGetRandomArtworkData, LibraryGetRandomArtworkResponses, LibraryGetSectionsData, LibraryGetSectionsPrefsData, LibraryGetSectionsPrefsErrors, LibraryGetSectionsPrefsResponses, LibraryGetSectionsResponses, LibraryGetStreamsStreamData, LibraryGetStreamsStreamErrors, LibraryGetStreamsStreamLevelsData, LibraryGetStreamsStreamLevelsErrors, LibraryGetStreamsStreamLevelsResponses, LibraryGetStreamsStreamLoudnessData, LibraryGetStreamsStreamLoudnessErrors, LibraryGetStreamsStreamLoudnessResponses, LibraryGetStreamsStreamResponses, LibraryGetTagsData, LibraryGetTagsResponses, LibraryMetadataDeleteElementData, LibraryMetadataDeleteElementErrors, LibraryMetadataDeleteElementResponses, LibraryMetadataDeleteMarkerMarkerData, LibraryMetadataDeleteMarkerMarkerErrors, LibraryMetadataDeleteMarkerMarkerResponses, LibraryMetadataDeleteMediaMediaItemData, LibraryMetadataDeleteMediaMediaItemErrors, LibraryMetadataDeleteMediaMediaItemResponses, LibraryMetadataDeleteSlashData, LibraryMetadataDeleteSlashErrors, LibraryMetadataDeleteSlashResponses, LibraryMetadataGetAllLeavesData, LibraryMetadataGetAllLeavesResponses, LibraryMetadataGetElementData, LibraryMetadataGetElementResponses, LibraryMetadataGetExtrasData, LibraryMetadataGetExtrasResponses, LibraryMetadataGetFileData, LibraryMetadataGetFileResponses, LibraryMetadataGetMatchesData, LibraryMetadataGetMatchesResponses, LibraryMetadataGetNearestData, LibraryMetadataGetNearestResponses, LibraryMetadataGetRelatedData, LibraryMetadataGetRelatedResponses, LibraryMetadataGetSimilarData, LibraryMetadataGetSimilarResponses, LibraryMetadataGetSlashData, LibraryMetadataGetSlashResponses, LibraryMetadataGetTreeData, LibraryMetadataGetTreeResponses, LibraryMetadataGetUsersTopData, LibraryMetadataGetUsersTopResponses, LibraryMetadataPostElementData, LibraryMetadataPostElementResponses, LibraryMetadataPostExtrasData, LibraryMetadataPostExtrasErrors, LibraryMetadataPostExtrasResponses, LibraryMetadataPostMarkerData, LibraryMetadataPostMarkerErrors, LibraryMetadataPostMarkerResponses, LibraryMetadataPostSubtitlesData, LibraryMetadataPostSubtitlesResponses, LibraryMetadataPutAddetectData, LibraryMetadataPutAddetectResponses, LibraryMetadataPutAnalyzeData, LibraryMetadataPutAnalyzeResponses, LibraryMetadataPutChapterThumbsData, LibraryMetadataPutChapterThumbsResponses, LibraryMetadataPutCreditsData, LibraryMetadataPutCreditsResponses, LibraryMetadataPutElementData, LibraryMetadataPutElementResponses, LibraryMetadataPutIndexData, LibraryMetadataPutIndexResponses, LibraryMetadataPutIntroData, LibraryMetadataPutIntroResponses, LibraryMetadataPutMarkerMarkerData, LibraryMetadataPutMarkerMarkerErrors, LibraryMetadataPutMarkerMarkerResponses, LibraryMetadataPutMatchData, LibraryMetadataPutMatchResponses, LibraryMetadataPutMergeData, LibraryMetadataPutMergeResponses, LibraryMetadataPutPrefsData, LibraryMetadataPutPrefsResponses, LibraryMetadataPutRefreshData, LibraryMetadataPutRefreshResponses, LibraryMetadataPutSlashData, LibraryMetadataPutSlashErrors, LibraryMetadataPutSlashResponses, LibraryMetadataPutSplitData, LibraryMetadataPutSplitResponses, LibraryMetadataPutUnmatchData, LibraryMetadataPutUnmatchResponses, LibraryMetadataPutVoiceActivityData, LibraryMetadataPutVoiceActivityResponses, LibraryPostFileData, LibraryPostFileResponses, LibraryPostSectionData, LibraryPostSectionErrors, LibraryPostSectionResponses, LibraryPostSectionsRefreshData, LibraryPostSectionsRefreshErrors, LibraryPostSectionsRefreshResponses, LibraryPutCleanBundlesData, LibraryPutCleanBundlesResponses, LibraryPutOptimizeData, LibraryPutOptimizeResponses, LibraryPutPartsPartData, LibraryPutPartsPartErrors, LibraryPutPartsPartResponses, LibraryPutStreamsStreamData, LibraryPutStreamsStreamErrors, LibraryPutStreamsStreamResponses, LibrarySectionDeleteCollectionCollectionData, LibrarySectionDeleteCollectionCollectionErrors, LibrarySectionDeleteCollectionCollectionResponses, LibrarySectionDeleteIndexesData, LibrarySectionDeleteIndexesResponses, LibrarySectionDeleteIntrosData, LibrarySectionDeleteIntrosResponses, LibrarySectionDeleteRefreshData, LibrarySectionDeleteRefreshResponses, LibrarySectionGetAlbumsData, LibrarySectionGetAlbumsResponses, LibrarySectionGetAllData, LibrarySectionGetAllLeavesData, LibrarySectionGetAllLeavesResponses, LibrarySectionGetAllResponses, LibrarySectionGetArtsData, LibrarySectionGetArtsResponses, LibrarySectionGetAudioCodecsData, LibrarySectionGetAudioCodecsResponses, LibrarySectionGetAudioLayoutsData, LibrarySectionGetAudioLayoutsResponses, LibrarySectionGetAutocompleteData, LibrarySectionGetAutocompleteErrors, LibrarySectionGetAutocompleteResponses, LibrarySectionGetCategoriesData, LibrarySectionGetCategoriesResponses, LibrarySectionGetClusterData, LibrarySectionGetClusterResponses, LibrarySectionGetCollectionsData, LibrarySectionGetCollectionsResponses, LibrarySectionGetCommonData, LibrarySectionGetCommonErrors, LibrarySectionGetCommonResponses, LibrarySectionGetCompositeData, LibrarySectionGetCompositeResponses, LibrarySectionGetComputePathData, LibrarySectionGetComputePathResponses, LibrarySectionGetFiltersData, LibrarySectionGetFiltersResponses, LibrarySectionGetFirstCharatersData, LibrarySectionGetFirstCharatersResponses, LibrarySectionGetLocationsData, LibrarySectionGetLocationsResponses, LibrarySectionGetMomentData, LibrarySectionGetMomentResponses, LibrarySectionGetNearestData, LibrarySectionGetNearestResponses, LibrarySectionGetPrefsData, LibrarySectionGetPrefsResponses, LibrarySectionGetSectionData, LibrarySectionGetSectionResponses, LibrarySectionGetSortsData, LibrarySectionGetSortsResponses, LibrarySectionGetSubtitleCodecsData, LibrarySectionGetSubtitleCodecsResponses, LibrarySectionGetVideoCodecsData, LibrarySectionGetVideoCodecsResponses, LibrarySectionPostRefreshData, LibrarySectionPostRefreshResponses, LibrarySectionPutAllData, LibrarySectionPutAllErrors, LibrarySectionPutAllResponses, LibrarySectionPutAnalyzeData, LibrarySectionPutAnalyzeResponses, LibrarySectionPutEmptyTrashData, LibrarySectionPutEmptyTrashResponses, LibrarySectionPutPrefsData, LibrarySectionPutPrefsResponses, LibrarySectionPutSectionData, LibrarySectionPutSectionErrors, LibrarySectionPutSectionResponses, LivetvDvrDeleteDvrData, LivetvDvrDeleteDvrDeviceData, LivetvDvrDeleteDvrDeviceResponses, LivetvDvrDeleteDvrResponses, LivetvDvrDeleteLineupData, LivetvDvrDeleteLineupResponses, LivetvDvrDeleteReloadGuideData, LivetvDvrDeleteReloadGuideResponses, LivetvDvrGetDvrData, LivetvDvrGetDvrResponses, LivetvDvrGetSlashData, LivetvDvrGetSlashResponses, LivetvDvrPostChannelsChannelTuneData, LivetvDvrPostChannelsChannelTuneErrors, LivetvDvrPostChannelsChannelTuneResponses, LivetvDvrPostReloadGuideData, LivetvDvrPostReloadGuideResponses, LivetvDvrPostSlashData, LivetvDvrPostSlashResponses, LivetvDvrPutDvrDeviceData, LivetvDvrPutDvrDeviceResponses, LivetvDvrPutLineupData, LivetvDvrPutLineupResponses, LivetvDvrPutPrefsData, LivetvDvrPutPrefsResponses, LivetvEpgGetChannelmapData, LivetvEpgGetChannelmapErrors, LivetvEpgGetChannelmapResponses, LivetvEpgGetChannelsData, LivetvEpgGetChannelsErrors, LivetvEpgGetChannelsResponses, LivetvEpgGetCountriesCountryLineupsData, LivetvEpgGetCountriesCountryLineupsErrors, LivetvEpgGetCountriesCountryLineupsResponses, LivetvEpgGetCountriesCountryRegionsData, LivetvEpgGetCountriesCountryRegionsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsData, LivetvEpgGetCountriesCountryRegionsRegionLineupsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsResponses, LivetvEpgGetCountriesCountryRegionsResponses, LivetvEpgGetCountriesData, LivetvEpgGetCountriesResponses, LivetvEpgGetLanguagesData, LivetvEpgGetLanguagesResponses, LivetvEpgGetLineupchannelsData, LivetvEpgGetLineupchannelsErrors, LivetvEpgGetLineupchannelsResponses, LivetvEpgGetLineupData, LivetvEpgGetLineupErrors, LivetvEpgGetLineupResponses, LivetvSessionsGetSessionConsumerIndexData, LivetvSessionsGetSessionConsumerIndexErrors, LivetvSessionsGetSessionConsumerIndexResponses, LivetvSessionsGetSessionConsumerSegmentData, LivetvSessionsGetSessionConsumerSegmentErrors, LivetvSessionsGetSessionConsumerSegmentResponses, LivetvSessionsGetSessionData, LivetvSessionsGetSessionResponses, LivetvSessionsGetSlashData, LivetvSessionsGetSlashResponses, LogPostPapertrailData, LogPostPapertrailErrors, LogPostPapertrailResponses, LogPostSlashData, LogPostSlashErrors, LogPostSlashResponses, LogPutSlashData, LogPutSlashResponses, MediaGrabberDeleteDevicesDeviceScanData, MediaGrabberDeleteDevicesDeviceScanResponses, MediaGrabberDeleteOperationsOperationData, MediaGrabberDeleteOperationsOperationErrors, MediaGrabberDeleteOperationsOperationResponses, MediaGrabberDevicesDeviceDeleteSlashData, MediaGrabberDevicesDeviceDeleteSlashErrors, MediaGrabberDevicesDeviceDeleteSlashResponses, MediaGrabberDevicesDeviceGetChannelsData, MediaGrabberDevicesDeviceGetChannelsErrors, MediaGrabberDevicesDeviceGetChannelsResponses, MediaGrabberDevicesDeviceGetSlashData, MediaGrabberDevicesDeviceGetSlashErrors, MediaGrabberDevicesDeviceGetSlashResponses, MediaGrabberDevicesDeviceGetThumbVersionData, MediaGrabberDevicesDeviceGetThumbVersionErrors, MediaGrabberDevicesDeviceGetThumbVersionResponses, MediaGrabberDevicesDevicePostScanData, MediaGrabberDevicesDevicePostScanResponses, MediaGrabberDevicesDevicePutChannelmapData, MediaGrabberDevicesDevicePutChannelmapResponses, MediaGrabberDevicesDevicePutPrefsData, MediaGrabberDevicesDevicePutPrefsResponses, MediaGrabberDevicesDevicePutSlashData, MediaGrabberDevicesDevicePutSlashErrors, MediaGrabberDevicesDevicePutSlashResponses, MediaGrabberGetDevicesData, MediaGrabberGetDevicesResponses, MediaGrabberGetSlashData, MediaGrabberGetSlashResponses, MediaGrabberPostDeviceDiscoverData, MediaGrabberPostDeviceDiscoverResponses, MediaGrabberPostDevicesData, MediaGrabberPostDevicesErrors, MediaGrabberPostDevicesResponses, MediaProviderEpgChannelsData, MediaProviderEpgChannelsErrors, MediaProviderEpgChannelsResponses, MediaProviderEpgGridData, MediaProviderEpgGridErrors, MediaProviderEpgGridResponses, MediaProviderEpgWatchnowAllData, MediaProviderEpgWatchnowAllErrors, MediaProviderEpgWatchnowAllResponses, MediaProviderEpgWatchnowData, MediaProviderEpgWatchnowErrors, MediaProviderEpgWatchnowResponses, MediaSubscriptionsDeleteSubscriptionData, MediaSubscriptionsDeleteSubscriptionErrors, MediaSubscriptionsDeleteSubscriptionResponses, MediaSubscriptionsGetScheduledData, MediaSubscriptionsGetScheduledErrors, MediaSubscriptionsGetScheduledResponses, MediaSubscriptionsGetSlashData, MediaSubscriptionsGetSlashErrors, MediaSubscriptionsGetSlashResponses, MediaSubscriptionsGetSubscriptionData, MediaSubscriptionsGetSubscriptionErrors, MediaSubscriptionsGetSubscriptionResponses, MediaSubscriptionsGetTemplateData, MediaSubscriptionsGetTemplateErrors, MediaSubscriptionsGetTemplateResponses, MediaSubscriptionsPostProcessData, MediaSubscriptionsPostProcessErrors, MediaSubscriptionsPostProcessResponses, MediaSubscriptionsPostSlashData, MediaSubscriptionsPostSlashErrors, MediaSubscriptionsPostSlashResponses, MediaSubscriptionsPutSubscriptionData, MediaSubscriptionsPutSubscriptionErrors, MediaSubscriptionsPutSubscriptionMoveData, MediaSubscriptionsPutSubscriptionMoveErrors, MediaSubscriptionsPutSubscriptionMoveResponses, MediaSubscriptionsPutSubscriptionResponses, PlaylistDeleteItemsData, PlaylistDeleteItemsErrors, PlaylistDeleteItemsGeneratorData, PlaylistDeleteItemsGeneratorErrors, PlaylistDeleteItemsGeneratorResponses, PlaylistDeleteItemsResponses, PlaylistDeletePlaylistData, PlaylistDeletePlaylistErrors, PlaylistDeletePlaylistResponses, PlaylistGetGeneratorsData, PlaylistGetGeneratorsErrors, PlaylistGetGeneratorsResponses, PlaylistGetItemsData, PlaylistGetItemsErrors, PlaylistGetItemsGeneratorData, PlaylistGetItemsGeneratorErrors, PlaylistGetItemsGeneratorItemsData, PlaylistGetItemsGeneratorItemsErrors, PlaylistGetItemsGeneratorItemsResponses, PlaylistGetItemsGeneratorResponses, PlaylistGetItemsResponses, PlaylistGetPlaylistData, PlaylistGetPlaylistErrors, PlaylistGetPlaylistResponses, PlaylistGetSlashData, PlaylistGetSlashResponses, PlaylistPostSlashData, PlaylistPostSlashErrors, PlaylistPostSlashResponses, PlaylistPostUploadData, PlaylistPostUploadErrors, PlaylistPostUploadResponses, PlaylistPutItemsData, PlaylistPutItemsErrors, PlaylistPutItemsGeneratorData, PlaylistPutItemsGeneratorErrors, PlaylistPutItemsGeneratorReprocessData, PlaylistPutItemsGeneratorReprocessErrors, PlaylistPutItemsGeneratorReprocessResponses, PlaylistPutItemsGeneratorResponses, PlaylistPutItemsMoveData, PlaylistPutItemsMoveErrors, PlaylistPutItemsMoveResponses, PlaylistPutItemsResponses, PlaylistPutPlaylistData, PlaylistPutPlaylistErrors, PlaylistPutPlaylistResponses, PlayQueuePlayQueueResetData, PlayQueuePlayQueueResetErrors, PlayQueuePlayQueueResetResponses, PlayQueuePostSlashData, PlayQueuePostSlashErrors, PlayQueuePostSlashResponses, PlayQueueQueueDeleteItemsData, PlayQueueQueueDeleteItemsItemData, PlayQueueQueueDeleteItemsItemErrors, PlayQueueQueueDeleteItemsItemResponses, PlayQueueQueueDeleteItemsResponses, PlayQueueQueueGetSlashData, PlayQueueQueueGetSlashErrors, PlayQueueQueueGetSlashResponses, PlayQueueQueuePutItemsMoveData, PlayQueueQueuePutItemsMoveErrors, PlayQueueQueuePutItemsMoveResponses, PlayQueueQueuePutItemsShuffleData, PlayQueueQueuePutItemsShuffleErrors, PlayQueueQueuePutItemsShuffleResponses, PlayQueueQueuePutItemsUnshuffleData, PlayQueueQueuePutItemsUnshuffleErrors, PlayQueueQueuePutItemsUnshuffleResponses, PlayQueueQueuePutSlashData, PlayQueueQueuePutSlashErrors, PlayQueueQueuePutSlashResponses, PostMediaProvidersData, PostMediaProvidersErrors, PostMediaProvidersRefreshData, PostMediaProvidersRefreshResponses, PostMediaProvidersResponses, PostMetadataAgentProviderGroupsData, PostMetadataAgentProviderGroupsErrors, PostMetadataAgentProviderGroupsResponses, PostMetadataAgentProvidersData, PostMetadataAgentProvidersErrors, PostMetadataAgentProvidersResponses, PreferencesGetGetData, PreferencesGetGetErrors, PreferencesGetGetResponses, PreferencesGetSlashData, PreferencesGetSlashResponses, PreferencesPutSlashData, PreferencesPutSlashErrors, PreferencesPutSlashResponses, PutMetadataAgentProviderData, PutMetadataAgentProviderErrors, PutMetadataAgentProviderGroupData, PutMetadataAgentProviderGroupErrors, PutMetadataAgentProviderGroupItemData, PutMetadataAgentProviderGroupItemErrors, PutMetadataAgentProviderGroupItemResponses, PutMetadataAgentProviderGroupResponses, PutMetadataAgentProviderResponses, PutRateData, PutRateErrors, PutRateResponses, PutScrobbleData, PutScrobbleErrors, PutScrobbleResponses, PutUnscrobbleData, PutUnscrobbleErrors, PutUnscrobbleResponses, SecurityGetResourcesData, SecurityGetResourcesErrors, SecurityGetResourcesResponses, SecurityPostTokenData, SecurityPostTokenErrors, SecurityPostTokenResponses, StatusDeleteHistoryData, StatusDeleteHistoryErrors, StatusDeleteHistoryResponses, StatusGetBackgroundData, StatusGetBackgroundResponses, StatusGetHistoryAllData, StatusGetHistoryAllResponses, StatusGetHistoryData, StatusGetHistoryErrors, StatusGetHistoryResponses, StatusGetSlashData, StatusGetSlashResponses, StatusPostTerminateData, StatusPostTerminateErrors, StatusPostTerminateResponses, TimelinePostSlashData, TimelinePostSlashErrors, TimelinePostSlashResponses, TranscodeDecisionData, TranscodeDecisionResponses, TranscodeFallbackData, TranscodeFallbackErrors, TranscodeFallbackResponses, TranscodeStartData, TranscodeStartErrors, TranscodeStartResponses, TranscodeSubtitlesData, TranscodeSubtitlesErrors, TranscodeSubtitlesResponses, UltraBlurGetColorsData, UltraBlurGetColorsErrors, UltraBlurGetColorsResponses, UltraBlurGetImageData, UltraBlurGetImageErrors, UltraBlurGetImageResponses, UpdaterGetStatusData, UpdaterGetStatusResponses, UpdaterPutApplyData, UpdaterPutApplyErrors, UpdaterPutApplyResponses, UpdaterPutCheckData, UpdaterPutCheckResponses, WebsocketGetSlashData, WebsocketGetSlashResponses } from './types.gen'; +import type { ActivitiesDeleteActivityData, ActivitiesDeleteActivityErrors, ActivitiesDeleteActivityResponses, ActivitiesGetSlashData, ActivitiesGetSlashResponses, ButlerDeleteSlashData, ButlerDeleteSlashResponses, ButlerDeleteTaskData, ButlerDeleteTaskErrors, ButlerDeleteTaskResponses, ButlerGetSlashData, ButlerGetSlashResponses, ButlerPostSlashData, ButlerPostSlashResponses, ButlerPostTaskData, ButlerPostTaskErrors, ButlerPostTaskResponses, DeleteMediaProviderData, DeleteMediaProviderErrors, DeleteMediaProviderResponses, DeleteMetadataAgentProviderData, DeleteMetadataAgentProviderErrors, DeleteMetadataAgentProviderGroupData, DeleteMetadataAgentProviderGroupErrors, DeleteMetadataAgentProviderGroupItemData, DeleteMetadataAgentProviderGroupItemErrors, DeleteMetadataAgentProviderGroupItemResponses, DeleteMetadataAgentProviderGroupResponses, DeleteMetadataAgentProviderResponses, DownloadQueueDeleteQueueItemsItemData, DownloadQueueDeleteQueueItemsItemResponses, DownloadQueueGetQueueData, DownloadQueueGetQueueItemItemDecisionData, DownloadQueueGetQueueItemItemDecisionErrors, DownloadQueueGetQueueItemItemDecisionResponses, DownloadQueueGetQueueItemItemMediaData, DownloadQueueGetQueueItemItemMediaErrors, DownloadQueueGetQueueItemItemMediaResponses, DownloadQueueGetQueueItemsData, DownloadQueueGetQueueItemsItemData, DownloadQueueGetQueueItemsItemResponses, DownloadQueueGetQueueItemsResponses, DownloadQueueGetQueueResponses, DownloadQueuePostData, DownloadQueuePostQueueAddData, DownloadQueuePostQueueAddResponses, DownloadQueuePostQueueItemsItemRestartData, DownloadQueuePostQueueItemsItemRestartResponses, DownloadQueuePostResponses, EventsourceGetSlashData, EventsourceGetSlashResponses, GetIdentityData, GetIdentityResponses, GetMediaProvidersData, GetMediaProvidersResponses, GetMetadataAgentProviderData, GetMetadataAgentProviderErrors, GetMetadataAgentProviderGroupData, GetMetadataAgentProviderGroupErrors, GetMetadataAgentProviderGroupResponses, GetMetadataAgentProviderGroupsData, GetMetadataAgentProviderGroupsResponses, GetMetadataAgentProviderResponses, GetMetadataAgentProvidersData, GetMetadataAgentProvidersResponses, GetSlashData, GetSlashResponses, HubsGetContinueWatchingData, HubsGetContinueWatchingResponses, HubsGetItemsData, HubsGetItemsErrors, HubsGetItemsResponses, HubsGetMetadataMetadataData, HubsGetMetadataMetadataErrors, HubsGetMetadataMetadataPostplayData, HubsGetMetadataMetadataPostplayErrors, HubsGetMetadataMetadataPostplayResponses, HubsGetMetadataMetadataRelatedData, HubsGetMetadataMetadataRelatedErrors, HubsGetMetadataMetadataRelatedResponses, HubsGetMetadataMetadataResponses, HubsGetPopularInLibrariesData, HubsGetPopularInLibrariesResponses, HubsGetPromotedData, HubsGetPromotedResponses, HubsGetSearchData, HubsGetSearchErrors, HubsGetSearchResponses, HubsGetSectionData, HubsGetSectionErrors, HubsGetSectionResponses, HubsGetSlashData, HubsGetSlashResponses, HubsSearchGetVoiceData, HubsSearchGetVoiceErrors, HubsSearchGetVoiceResponses, HubsSectionsSectionManageDeleteIdentifierData, HubsSectionsSectionManageDeleteIdentifierErrors, HubsSectionsSectionManageDeleteIdentifierResponses, HubsSectionsSectionManageDeleteSlashData, HubsSectionsSectionManageDeleteSlashErrors, HubsSectionsSectionManageDeleteSlashResponses, HubsSectionsSectionManageGetSlashData, HubsSectionsSectionManageGetSlashErrors, HubsSectionsSectionManageGetSlashResponses, HubsSectionsSectionManagePostSlashData, HubsSectionsSectionManagePostSlashErrors, HubsSectionsSectionManagePostSlashResponses, HubsSectionsSectionManagePutIdentifierData, HubsSectionsSectionManagePutIdentifierErrors, HubsSectionsSectionManagePutIdentifierResponses, HubsSectionsSectionManagePutMoveData, HubsSectionsSectionManagePutMoveErrors, HubsSectionsSectionManagePutMoveResponses, ImageTranscodeData, ImageTranscodeErrors, ImageTranscodeResponses, LibraryCollectionCollectionGetCompositeData, LibraryCollectionCollectionGetCompositeErrors, LibraryCollectionCollectionGetCompositeResponses, LibraryCollectionCollectionGetItemsData, LibraryCollectionCollectionGetItemsErrors, LibraryCollectionCollectionGetItemsResponses, LibraryCollectionCollectionPutItemsData, LibraryCollectionCollectionPutItemsErrors, LibraryCollectionCollectionPutItemsItemData, LibraryCollectionCollectionPutItemsItemErrors, LibraryCollectionCollectionPutItemsItemMoveData, LibraryCollectionCollectionPutItemsItemMoveErrors, LibraryCollectionCollectionPutItemsItemMoveResponses, LibraryCollectionCollectionPutItemsItemResponses, LibraryCollectionCollectionPutItemsResponses, LibraryCollectionPostSlashData, LibraryCollectionPostSlashErrors, LibraryCollectionPostSlashResponses, LibraryDeleteCachesData, LibraryDeleteCachesResponses, LibraryDeleteSectionData, LibraryDeleteSectionResponses, LibraryDeleteSectionsAllRefreshData, LibraryDeleteSectionsAllRefreshResponses, LibraryDeleteStreamsStreamData, LibraryDeleteStreamsStreamErrors, LibraryDeleteStreamsStreamResponses, LibraryGetAllData, LibraryGetAllResponses, LibraryGetMatchesData, LibraryGetMatchesResponses, LibraryGetMediaMediaChapterImagesChapterData, LibraryGetMediaMediaChapterImagesChapterErrors, LibraryGetMediaMediaChapterImagesChapterResponses, LibraryGetMetadataAugmentationsAugmentationData, LibraryGetMetadataAugmentationsAugmentationErrors, LibraryGetMetadataAugmentationsAugmentationResponses, LibraryGetPartsPartChangestampFilenameData, LibraryGetPartsPartChangestampFilenameErrors, LibraryGetPartsPartChangestampFilenameResponses, LibraryGetPartsPartIndexesIndexData, LibraryGetPartsPartIndexesIndexErrors, LibraryGetPartsPartIndexesIndexOffsetData, LibraryGetPartsPartIndexesIndexOffsetErrors, LibraryGetPartsPartIndexesIndexOffsetResponses, LibraryGetPartsPartIndexesIndexResponses, LibraryGetPeoplePersonData, LibraryGetPeoplePersonErrors, LibraryGetPeoplePersonMediaData, LibraryGetPeoplePersonMediaErrors, LibraryGetPeoplePersonMediaResponses, LibraryGetPeoplePersonResponses, LibraryGetRandomArtworkData, LibraryGetRandomArtworkResponses, LibraryGetSectionsData, LibraryGetSectionsPrefsData, LibraryGetSectionsPrefsErrors, LibraryGetSectionsPrefsResponses, LibraryGetSectionsResponses, LibraryGetStreamsStreamData, LibraryGetStreamsStreamErrors, LibraryGetStreamsStreamLevelsData, LibraryGetStreamsStreamLevelsErrors, LibraryGetStreamsStreamLevelsResponses, LibraryGetStreamsStreamLoudnessData, LibraryGetStreamsStreamLoudnessErrors, LibraryGetStreamsStreamLoudnessResponses, LibraryGetStreamsStreamResponses, LibraryGetTagsData, LibraryGetTagsResponses, LibraryMetadataDeleteElementData, LibraryMetadataDeleteElementErrors, LibraryMetadataDeleteElementResponses, LibraryMetadataDeleteMarkerMarkerData, LibraryMetadataDeleteMarkerMarkerErrors, LibraryMetadataDeleteMarkerMarkerResponses, LibraryMetadataDeleteMediaMediaItemData, LibraryMetadataDeleteMediaMediaItemErrors, LibraryMetadataDeleteMediaMediaItemResponses, LibraryMetadataDeleteSlashData, LibraryMetadataDeleteSlashErrors, LibraryMetadataDeleteSlashResponses, LibraryMetadataGetAllLeavesData, LibraryMetadataGetAllLeavesResponses, LibraryMetadataGetElementData, LibraryMetadataGetElementResponses, LibraryMetadataGetExtrasData, LibraryMetadataGetExtrasResponses, LibraryMetadataGetFileData, LibraryMetadataGetFileResponses, LibraryMetadataGetMatchesData, LibraryMetadataGetMatchesResponses, LibraryMetadataGetNearestData, LibraryMetadataGetNearestResponses, LibraryMetadataGetRelatedData, LibraryMetadataGetRelatedResponses, LibraryMetadataGetSimilarData, LibraryMetadataGetSimilarResponses, LibraryMetadataGetSlashData, LibraryMetadataGetSlashResponses, LibraryMetadataGetTreeData, LibraryMetadataGetTreeResponses, LibraryMetadataGetUsersTopData, LibraryMetadataGetUsersTopResponses, LibraryMetadataPostElementData, LibraryMetadataPostElementResponses, LibraryMetadataPostExtrasData, LibraryMetadataPostExtrasErrors, LibraryMetadataPostExtrasResponses, LibraryMetadataPostMarkerData, LibraryMetadataPostMarkerErrors, LibraryMetadataPostMarkerResponses, LibraryMetadataPostSubtitlesData, LibraryMetadataPostSubtitlesResponses, LibraryMetadataPutAddetectData, LibraryMetadataPutAddetectResponses, LibraryMetadataPutAnalyzeData, LibraryMetadataPutAnalyzeLoudnessData, LibraryMetadataPutAnalyzeLoudnessResponses, LibraryMetadataPutAnalyzeResponses, LibraryMetadataPutChapterThumbsData, LibraryMetadataPutChapterThumbsResponses, LibraryMetadataPutCreditsData, LibraryMetadataPutCreditsResponses, LibraryMetadataPutElementData, LibraryMetadataPutElementResponses, LibraryMetadataPutIndexData, LibraryMetadataPutIndexResponses, LibraryMetadataPutIntroData, LibraryMetadataPutIntroResponses, LibraryMetadataPutMarkerMarkerData, LibraryMetadataPutMarkerMarkerErrors, LibraryMetadataPutMarkerMarkerResponses, LibraryMetadataPutMatchData, LibraryMetadataPutMatchResponses, LibraryMetadataPutMergeData, LibraryMetadataPutMergeResponses, LibraryMetadataPutPrefsData, LibraryMetadataPutPrefsResponses, LibraryMetadataPutRefreshData, LibraryMetadataPutRefreshResponses, LibraryMetadataPutSlashData, LibraryMetadataPutSlashErrors, LibraryMetadataPutSlashResponses, LibraryMetadataPutSplitData, LibraryMetadataPutSplitResponses, LibraryMetadataPutUnmatchData, LibraryMetadataPutUnmatchResponses, LibraryMetadataPutVoiceActivityData, LibraryMetadataPutVoiceActivityResponses, LibraryPostFileData, LibraryPostFileResponses, LibraryPostSectionData, LibraryPostSectionErrors, LibraryPostSectionResponses, LibraryPostSectionsRefreshData, LibraryPostSectionsRefreshErrors, LibraryPostSectionsRefreshResponses, LibraryPutCleanBundlesData, LibraryPutCleanBundlesResponses, LibraryPutOptimizeData, LibraryPutOptimizeResponses, LibraryPutPartsPartData, LibraryPutPartsPartErrors, LibraryPutPartsPartResponses, LibraryPutStreamsStreamData, LibraryPutStreamsStreamErrors, LibraryPutStreamsStreamResponses, LibrarySectionDeleteCollectionCollectionData, LibrarySectionDeleteCollectionCollectionErrors, LibrarySectionDeleteCollectionCollectionResponses, LibrarySectionDeleteIndexesData, LibrarySectionDeleteIndexesResponses, LibrarySectionDeleteIntrosData, LibrarySectionDeleteIntrosResponses, LibrarySectionDeleteRefreshData, LibrarySectionDeleteRefreshResponses, LibrarySectionGetAlbumsData, LibrarySectionGetAlbumsResponses, LibrarySectionGetAllData, LibrarySectionGetAllLeavesData, LibrarySectionGetAllLeavesResponses, LibrarySectionGetAllResponses, LibrarySectionGetArtsData, LibrarySectionGetArtsResponses, LibrarySectionGetAudioCodecsData, LibrarySectionGetAudioCodecsResponses, LibrarySectionGetAudioLayoutsData, LibrarySectionGetAudioLayoutsResponses, LibrarySectionGetAutocompleteData, LibrarySectionGetAutocompleteErrors, LibrarySectionGetAutocompleteResponses, LibrarySectionGetCategoriesData, LibrarySectionGetCategoriesResponses, LibrarySectionGetClusterData, LibrarySectionGetClusterResponses, LibrarySectionGetCollectionsData, LibrarySectionGetCollectionsResponses, LibrarySectionGetCommonData, LibrarySectionGetCommonErrors, LibrarySectionGetCommonResponses, LibrarySectionGetCompositeData, LibrarySectionGetCompositeResponses, LibrarySectionGetComputePathData, LibrarySectionGetComputePathResponses, LibrarySectionGetFiltersData, LibrarySectionGetFiltersResponses, LibrarySectionGetFirstCharatersData, LibrarySectionGetFirstCharatersResponses, LibrarySectionGetLocationsData, LibrarySectionGetLocationsResponses, LibrarySectionGetMomentData, LibrarySectionGetMomentResponses, LibrarySectionGetNearestData, LibrarySectionGetNearestResponses, LibrarySectionGetPrefsData, LibrarySectionGetPrefsResponses, LibrarySectionGetSectionData, LibrarySectionGetSectionResponses, LibrarySectionGetSortsData, LibrarySectionGetSortsResponses, LibrarySectionGetSubtitleCodecsData, LibrarySectionGetSubtitleCodecsResponses, LibrarySectionGetVideoCodecsData, LibrarySectionGetVideoCodecsResponses, LibrarySectionPostRefreshData, LibrarySectionPostRefreshResponses, LibrarySectionPutAllData, LibrarySectionPutAllErrors, LibrarySectionPutAllResponses, LibrarySectionPutAnalyzeData, LibrarySectionPutAnalyzeResponses, LibrarySectionPutEmptyTrashData, LibrarySectionPutEmptyTrashResponses, LibrarySectionPutPrefsData, LibrarySectionPutPrefsResponses, LibrarySectionPutSectionData, LibrarySectionPutSectionErrors, LibrarySectionPutSectionResponses, LivetvDvrDeleteDvrData, LivetvDvrDeleteDvrDeviceData, LivetvDvrDeleteDvrDeviceResponses, LivetvDvrDeleteDvrResponses, LivetvDvrDeleteLineupData, LivetvDvrDeleteLineupResponses, LivetvDvrDeleteReloadGuideData, LivetvDvrDeleteReloadGuideResponses, LivetvDvrGetDvrData, LivetvDvrGetDvrResponses, LivetvDvrGetSlashData, LivetvDvrGetSlashResponses, LivetvDvrPostChannelsChannelTuneData, LivetvDvrPostChannelsChannelTuneErrors, LivetvDvrPostChannelsChannelTuneResponses, LivetvDvrPostReloadGuideData, LivetvDvrPostReloadGuideResponses, LivetvDvrPostSlashData, LivetvDvrPostSlashResponses, LivetvDvrPutDvrDeviceData, LivetvDvrPutDvrDeviceResponses, LivetvDvrPutLineupData, LivetvDvrPutLineupResponses, LivetvDvrPutPrefsData, LivetvDvrPutPrefsResponses, LivetvEpgGetChannelmapData, LivetvEpgGetChannelmapErrors, LivetvEpgGetChannelmapResponses, LivetvEpgGetChannelsData, LivetvEpgGetChannelsErrors, LivetvEpgGetChannelsResponses, LivetvEpgGetCountriesCountryLineupsData, LivetvEpgGetCountriesCountryLineupsErrors, LivetvEpgGetCountriesCountryLineupsResponses, LivetvEpgGetCountriesCountryRegionsData, LivetvEpgGetCountriesCountryRegionsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsData, LivetvEpgGetCountriesCountryRegionsRegionLineupsErrors, LivetvEpgGetCountriesCountryRegionsRegionLineupsResponses, LivetvEpgGetCountriesCountryRegionsResponses, LivetvEpgGetCountriesData, LivetvEpgGetCountriesResponses, LivetvEpgGetLanguagesData, LivetvEpgGetLanguagesResponses, LivetvEpgGetLineupchannelsData, LivetvEpgGetLineupchannelsErrors, LivetvEpgGetLineupchannelsResponses, LivetvEpgGetLineupData, LivetvEpgGetLineupErrors, LivetvEpgGetLineupResponses, LivetvSessionsGetSessionConsumerIndexData, LivetvSessionsGetSessionConsumerIndexErrors, LivetvSessionsGetSessionConsumerIndexResponses, LivetvSessionsGetSessionConsumerSegmentData, LivetvSessionsGetSessionConsumerSegmentErrors, LivetvSessionsGetSessionConsumerSegmentResponses, LivetvSessionsGetSessionData, LivetvSessionsGetSessionResponses, LivetvSessionsGetSlashData, LivetvSessionsGetSlashResponses, LogPostPapertrailData, LogPostPapertrailErrors, LogPostPapertrailResponses, LogPostSlashData, LogPostSlashErrors, LogPostSlashResponses, LogPutSlashData, LogPutSlashResponses, MediaGrabberDeleteDevicesDeviceScanData, MediaGrabberDeleteDevicesDeviceScanResponses, MediaGrabberDeleteOperationsOperationData, MediaGrabberDeleteOperationsOperationErrors, MediaGrabberDeleteOperationsOperationResponses, MediaGrabberDevicesDeviceDeleteSlashData, MediaGrabberDevicesDeviceDeleteSlashErrors, MediaGrabberDevicesDeviceDeleteSlashResponses, MediaGrabberDevicesDeviceGetChannelsData, MediaGrabberDevicesDeviceGetChannelsErrors, MediaGrabberDevicesDeviceGetChannelsResponses, MediaGrabberDevicesDeviceGetSlashData, MediaGrabberDevicesDeviceGetSlashErrors, MediaGrabberDevicesDeviceGetSlashResponses, MediaGrabberDevicesDeviceGetThumbVersionData, MediaGrabberDevicesDeviceGetThumbVersionErrors, MediaGrabberDevicesDeviceGetThumbVersionResponses, MediaGrabberDevicesDevicePostScanData, MediaGrabberDevicesDevicePostScanResponses, MediaGrabberDevicesDevicePutChannelmapData, MediaGrabberDevicesDevicePutChannelmapResponses, MediaGrabberDevicesDevicePutPrefsData, MediaGrabberDevicesDevicePutPrefsResponses, MediaGrabberDevicesDevicePutSlashData, MediaGrabberDevicesDevicePutSlashErrors, MediaGrabberDevicesDevicePutSlashResponses, MediaGrabberGetDevicesData, MediaGrabberGetDevicesResponses, MediaGrabberGetSlashData, MediaGrabberGetSlashResponses, MediaGrabberPostDeviceDiscoverData, MediaGrabberPostDeviceDiscoverResponses, MediaGrabberPostDevicesData, MediaGrabberPostDevicesErrors, MediaGrabberPostDevicesResponses, MediaProviderEpgChannelsData, MediaProviderEpgChannelsErrors, MediaProviderEpgChannelsResponses, MediaProviderEpgGridData, MediaProviderEpgGridErrors, MediaProviderEpgGridResponses, MediaProviderEpgWatchnowAllData, MediaProviderEpgWatchnowAllErrors, MediaProviderEpgWatchnowAllResponses, MediaProviderEpgWatchnowData, MediaProviderEpgWatchnowErrors, MediaProviderEpgWatchnowResponses, MediaSubscriptionsDeleteSubscriptionData, MediaSubscriptionsDeleteSubscriptionErrors, MediaSubscriptionsDeleteSubscriptionResponses, MediaSubscriptionsGetScheduledData, MediaSubscriptionsGetScheduledErrors, MediaSubscriptionsGetScheduledResponses, MediaSubscriptionsGetSlashData, MediaSubscriptionsGetSlashErrors, MediaSubscriptionsGetSlashResponses, MediaSubscriptionsGetSubscriptionData, MediaSubscriptionsGetSubscriptionErrors, MediaSubscriptionsGetSubscriptionResponses, MediaSubscriptionsGetTemplateData, MediaSubscriptionsGetTemplateErrors, MediaSubscriptionsGetTemplateResponses, MediaSubscriptionsPostProcessData, MediaSubscriptionsPostProcessErrors, MediaSubscriptionsPostProcessResponses, MediaSubscriptionsPostSlashData, MediaSubscriptionsPostSlashErrors, MediaSubscriptionsPostSlashResponses, MediaSubscriptionsPutSubscriptionData, MediaSubscriptionsPutSubscriptionErrors, MediaSubscriptionsPutSubscriptionMoveData, MediaSubscriptionsPutSubscriptionMoveErrors, MediaSubscriptionsPutSubscriptionMoveResponses, MediaSubscriptionsPutSubscriptionResponses, PlaylistDeleteItemsData, PlaylistDeleteItemsErrors, PlaylistDeleteItemsGeneratorData, PlaylistDeleteItemsGeneratorErrors, PlaylistDeleteItemsGeneratorResponses, PlaylistDeleteItemsResponses, PlaylistDeletePlaylistData, PlaylistDeletePlaylistErrors, PlaylistDeletePlaylistResponses, PlaylistGetGeneratorsData, PlaylistGetGeneratorsErrors, PlaylistGetGeneratorsResponses, PlaylistGetItemsData, PlaylistGetItemsErrors, PlaylistGetItemsGeneratorData, PlaylistGetItemsGeneratorErrors, PlaylistGetItemsGeneratorItemsData, PlaylistGetItemsGeneratorItemsErrors, PlaylistGetItemsGeneratorItemsResponses, PlaylistGetItemsGeneratorResponses, PlaylistGetItemsResponses, PlaylistGetPlaylistData, PlaylistGetPlaylistErrors, PlaylistGetPlaylistResponses, PlaylistGetSlashData, PlaylistGetSlashResponses, PlaylistPostSlashData, PlaylistPostSlashErrors, PlaylistPostSlashResponses, PlaylistPostUploadData, PlaylistPostUploadErrors, PlaylistPostUploadResponses, PlaylistPutItemsData, PlaylistPutItemsErrors, PlaylistPutItemsGeneratorData, PlaylistPutItemsGeneratorErrors, PlaylistPutItemsGeneratorReprocessData, PlaylistPutItemsGeneratorReprocessErrors, PlaylistPutItemsGeneratorReprocessResponses, PlaylistPutItemsGeneratorResponses, PlaylistPutItemsMoveData, PlaylistPutItemsMoveErrors, PlaylistPutItemsMoveResponses, PlaylistPutItemsResponses, PlaylistPutPlaylistData, PlaylistPutPlaylistErrors, PlaylistPutPlaylistResponses, PlayQueuePlayQueueResetData, PlayQueuePlayQueueResetErrors, PlayQueuePlayQueueResetResponses, PlayQueuePostSlashData, PlayQueuePostSlashErrors, PlayQueuePostSlashResponses, PlayQueueQueueDeleteItemsData, PlayQueueQueueDeleteItemsItemData, PlayQueueQueueDeleteItemsItemErrors, PlayQueueQueueDeleteItemsItemResponses, PlayQueueQueueDeleteItemsResponses, PlayQueueQueueGetSlashData, PlayQueueQueueGetSlashErrors, PlayQueueQueueGetSlashResponses, PlayQueueQueuePutItemsMoveData, PlayQueueQueuePutItemsMoveErrors, PlayQueueQueuePutItemsMoveResponses, PlayQueueQueuePutItemsShuffleData, PlayQueueQueuePutItemsShuffleErrors, PlayQueueQueuePutItemsShuffleResponses, PlayQueueQueuePutItemsUnshuffleData, PlayQueueQueuePutItemsUnshuffleErrors, PlayQueueQueuePutItemsUnshuffleResponses, PlayQueueQueuePutSlashData, PlayQueueQueuePutSlashErrors, PlayQueueQueuePutSlashResponses, PostMediaProvidersData, PostMediaProvidersErrors, PostMediaProvidersRefreshData, PostMediaProvidersRefreshResponses, PostMediaProvidersResponses, PostMetadataAgentProviderGroupsData, PostMetadataAgentProviderGroupsErrors, PostMetadataAgentProviderGroupsResponses, PostMetadataAgentProvidersData, PostMetadataAgentProvidersErrors, PostMetadataAgentProvidersResponses, PreferencesGetGetData, PreferencesGetGetErrors, PreferencesGetGetResponses, PreferencesGetSlashData, PreferencesGetSlashResponses, PreferencesPutSlashData, PreferencesPutSlashErrors, PreferencesPutSlashResponses, PutMetadataAgentProviderData, PutMetadataAgentProviderErrors, PutMetadataAgentProviderGroupData, PutMetadataAgentProviderGroupErrors, PutMetadataAgentProviderGroupItemData, PutMetadataAgentProviderGroupItemErrors, PutMetadataAgentProviderGroupItemResponses, PutMetadataAgentProviderGroupResponses, PutMetadataAgentProviderResponses, PutRateData, PutRateErrors, PutRateResponses, PutScrobbleData, PutScrobbleErrors, PutScrobbleResponses, PutUnscrobbleData, PutUnscrobbleErrors, PutUnscrobbleResponses, SecurityGetResourcesData, SecurityGetResourcesErrors, SecurityGetResourcesResponses, SecurityPostTokenData, SecurityPostTokenErrors, SecurityPostTokenResponses, StatusDeleteHistoryData, StatusDeleteHistoryErrors, StatusDeleteHistoryResponses, StatusGetBackgroundData, StatusGetBackgroundResponses, StatusGetHistoryAllData, StatusGetHistoryAllResponses, StatusGetHistoryData, StatusGetHistoryErrors, StatusGetHistoryResponses, StatusGetSlashData, StatusGetSlashResponses, StatusPostTerminateData, StatusPostTerminateErrors, StatusPostTerminateResponses, TimelinePostSlashData, TimelinePostSlashErrors, TimelinePostSlashResponses, TranscodeDecisionData, TranscodeDecisionResponses, TranscodeFallbackData, TranscodeFallbackErrors, TranscodeFallbackResponses, TranscodeStartData, TranscodeStartErrors, TranscodeStartResponses, TranscodeSubtitlesData, TranscodeSubtitlesErrors, TranscodeSubtitlesResponses, UltraBlurGetColorsData, UltraBlurGetColorsErrors, UltraBlurGetColorsResponses, UltraBlurGetImageData, UltraBlurGetImageErrors, UltraBlurGetImageResponses, UpdaterGetStatusData, UpdaterGetStatusResponses, UpdaterPutApplyData, UpdaterPutApplyErrors, UpdaterPutApplyResponses, UpdaterPutCheckData, UpdaterPutCheckResponses, WebsocketGetSlashData, WebsocketGetSlashResponses } from './types.gen'; export type Options = Options2 & { /** @@ -409,6 +409,17 @@ export const hubsGetMetadataMetadataRelated = (options?: Options): RequestResult => (options?.client ?? client).get({ + security: [{ name: 'X-Plex-Token', type: 'apiKey' }], + url: '/hubs/popularInLibraries', + ...options +}); + /** * Get the hubs which are promoted * @@ -762,6 +773,17 @@ export const libraryMetadataPutAnalyze = ( ...options }); +/** + * Detect loudness of audio streams + * + * Detect loudness properties of all audio streams + */ +export const libraryMetadataPutAnalyzeLoudness = (options: Options): RequestResult => (options.client ?? client).put({ + security: [{ name: 'X-Plex-Token', type: 'apiKey' }], + url: '/library/metadata/{ids}/analyzeLoudness', + ...options +}); + /** * Generate thumbs of chapters for an item * diff --git a/apps/server/src/providers/plex/generated/types.gen.ts b/apps/server/src/providers/plex/generated/types.gen.ts index 6bf71f1b..c2b7c33b 100644 --- a/apps/server/src/providers/plex/generated/types.gen.ts +++ b/apps/server/src/providers/plex/generated/types.gen.ts @@ -1184,6 +1184,10 @@ export type Stream2 = { * For subtitle streams only. If `true` then the server can attempt to automatically sync the subtitle timestamps with the video. */ canAutoSync?: boolean; + /** + * For audio streams only. If `true` then the server can attempt to normalize the loudness levels. + */ + canNormalizeLoudness?: boolean; chromaLocation?: unknown; chromaSubsampling?: unknown; /** @@ -1285,159 +1289,159 @@ export type _3 = number; export type _4 = number; /** - * Indicates the client supports ABR. + * Indicates if the server should normalize the loudness of an audio track based on loudness analysis results. */ export type _5 = 0 | 1; /** - * Indicates if the server should adjust subtitles based on Voice Activity Data. + * Indicates if the server boost the dialog found within an audio track. */ export type _6 = 0 | 1; /** - * Indicates the client supports direct playing the indicated content. + * Indicates the client supports ABR. */ export type _7 = 0 | 1; /** - * Indicates the client supports direct streaming the video of the indicated content. + * Indicates if the server should adjust subtitles based on Voice Activity Data. */ export type _8 = 0 | 1; /** - * Indicates the client supports direct streaming the audio of the indicated content. + * Indicates the client supports direct playing the indicated content. */ export type _9 = 0 | 1; /** - * Indicates if resolution should be adjusted for orientation. + * Indicates the client supports direct streaming the video of the indicated content. */ export type _10 = 0 | 1; /** - * 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 + * Indicates the client supports direct streaming the audio of the indicated content. */ export type _11 = 0 | 1; +/** + * Indicates if resolution should be adjusted for orientation. + */ +export type _12 = 0 | 1; + +/** + * 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 + */ +export type _13 = 0 | 1; + /** * Network type of the client, can be used to help determine target bitrate. */ -export type _12 = 'lan' | 'wan' | 'cellular'; +export type _14 = 'lan' | 'wan' | 'cellular'; /** * 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. */ -export type _13 = number; +export type _15 = number; /** * Index of the media to transcode. -1 or not specified indicates let the server choose. */ -export type _14 = number; +export type _16 = number; /** * Target bitrate for audio only files (in kbps, used to transcode). */ -export type _15 = number; +export type _17 = number; /** * Offset from the start of the media (in seconds). */ -export type _16 = number; +export type _18 = number; /** * Index of the part to transcode. -1 or not specified indicates the server should join parts together in a transcode */ -export type _17 = number; +export type _19 = number; /** * Internal PMS path of the media to transcode. */ -export type _18 = string; +export type _20 = string; /** * Maximum bitrate (in kbps) to use in ABR. */ -export type _19 = number; +export type _21 = number; /** * Target photo resolution. */ -export type _20 = string; +export type _22 = string; /** * Indicates the network streaming protocol to be used for the transcode session: * 'http' - include the file in the http response such as MKV streaming * 'hls' - hls stream (RFC 8216) * 'dash' - dash stream (ISO/IEC 23009-1:2022) * */ -export type _21 = 'http' | 'hls' | 'dash'; +export type _23 = 'http' | 'hls' | 'dash'; /** * Number of seconds to include in each transcoded segment */ -export type _22 = number; +export type _24 = number; /** * Percentage of original subtitle size to use when burning subtitles (100 is equivalent to original size, 50 is half, ect) */ -export type _23 = number; +export type _25 = number; /** * Indicates how subtitles should be included: * 'auto' - Compute the appropriate subtitle setting automatically * 'burn' - Burn the selected subtitle; auto if no selected subtitle * 'none' - Ignore all subtitle streams * 'sidecar' - The selected subtitle should be provided as a sidecar * 'embedded' - The selected subtitle should be provided as an embedded stream * 'segmented' - The selected subtitle should be provided as a segmented stream * */ -export type _24 = 'auto' | 'burn' | 'none' | 'sidecar' | 'embedded' | 'segmented' | 'unknown'; +export type _26 = 'auto' | 'burn' | 'none' | 'sidecar' | 'embedded' | 'segmented' | 'unknown'; /** * Target video bitrate (in kbps). */ -export type _25 = number; +export type _27 = number; /** * Target photo quality. */ -export type _26 = number; +export type _28 = number; /** * Target maximum video resolution. */ -export type _27 = string; - -/** - * Unique per client. - */ -export type _28 = string; - -/** - * See [Profile Augmentations](#section/API-Info/Profile-Augmentations) . - */ export type _29 = string; /** - * Which built in Client Profile to use in the decision. Generally should only be used to specify the Generic profile. + * Unique per client. */ export type _30 = string; /** - * Device the client is running on + * See [Profile Augmentations](#section/API-Info/Profile-Augmentations) . */ export type _31 = string; /** - * Model of the device the client is running on + * Which built in Client Profile to use in the decision. Generally should only be used to specify the Generic profile. */ export type _32 = string; /** - * Client Platform + * Device the client is running on */ export type _33 = string; /** - * Client Platform Version + * Model of the device the client is running on */ export type _34 = string; /** - * Unique per client playback session. Used if a client can playback multiple items at a time (such as a browser with multiple tabs) + * Client Platform */ export type _35 = string; @@ -2215,14 +2219,6 @@ export type DownloadQueuePostQueueAddData = { * Client Platform */ 'X-Plex-Platform'?: string; - /** - * Client Platform Version - */ - 'X-Plex-Platform-Version'?: string; - /** - * Unique per client playback session. Used if a client can playback multiple items at a time (such as a browser with multiple tabs) - */ - 'X-Plex-Session-Identifier'?: string; }; path: { /** @@ -2248,6 +2244,14 @@ export type DownloadQueuePostQueueAddData = { * Target video number of audio channels. */ audioChannelCount?: number; + /** + * Indicates if the server should normalize the loudness of an audio track based on loudness analysis results. + */ + normalizeLoudness?: 0 | 1; + /** + * Indicates if the server boost the dialog found within an audio track. + */ + boostDialog?: 0 | 1; /** * Indicates the client supports ABR. */ @@ -2876,6 +2880,35 @@ export type HubsGetMetadataMetadataRelatedResponses = { export type HubsGetMetadataMetadataRelatedResponse = HubsGetMetadataMetadataRelatedResponses[keyof HubsGetMetadataMetadataRelatedResponses]; +export type HubsGetPopularInLibrariesData = { + body?: never; + path?: never; + query?: { + /** + * Limit hub entry to count items + */ + count?: number; + /** + * Restrict the hub to the given content directory ids + */ + contentDirectoryID?: Array; + }; + url: '/hubs/popularInLibraries'; +}; + +export type HubsGetPopularInLibrariesResponses = { + /** + * OK + */ + 200: { + MediaContainer?: MediaContainer & { + Hub?: Array; + }; + }; +}; + +export type HubsGetPopularInLibrariesResponse = HubsGetPopularInLibrariesResponses[keyof HubsGetPopularInLibrariesResponses]; + export type HubsGetPromotedData = { body?: never; path?: never; @@ -4041,6 +4074,31 @@ export type LibraryMetadataPutAnalyzeResponses = { 200: unknown; }; +export type LibraryMetadataPutAnalyzeLoudnessData = { + body?: never; + path: { + ids: string; + }; + query?: { + /** + * Indicate whether detection should be re-run + */ + force?: 0 | 1; + /** + * Indicate whether detection is manually run + */ + manual?: 0 | 1; + }; + url: '/library/metadata/{ids}/analyzeLoudness'; +}; + +export type LibraryMetadataPutAnalyzeLoudnessResponses = { + /** + * OK + */ + 200: unknown; +}; + export type LibraryMetadataPutChapterThumbsData = { body?: never; path: { @@ -9611,12 +9669,14 @@ export type PlaylistGetItemsGeneratorResponses = { audioChannelCount?: number; autoAdjustQuality?: boolean; autoAdjustSubtitle?: boolean; + boostDialog?: boolean; directPlay?: boolean; directStream?: boolean; directStreamAudio?: boolean; disableResolutionRotation?: boolean; maxVideoBitrate?: number; musicBitrate?: number; + normalizeLoudness?: boolean; peakBitrate?: number; photoQuality?: number; photoResolution?: string; @@ -10807,6 +10867,14 @@ export type TranscodeDecisionData = { * Target video number of audio channels. */ audioChannelCount?: number; + /** + * Indicates if the server should normalize the loudness of an audio track based on loudness analysis results. + */ + normalizeLoudness?: 0 | 1; + /** + * Indicates if the server boost the dialog found within an audio track. + */ + boostDialog?: 0 | 1; /** * Indicates the client supports ABR. */ @@ -11013,6 +11081,14 @@ export type TranscodeStartData = { * Target video number of audio channels. */ audioChannelCount?: number; + /** + * Indicates if the server should normalize the loudness of an audio track based on loudness analysis results. + */ + normalizeLoudness?: 0 | 1; + /** + * Indicates if the server boost the dialog found within an audio track. + */ + boostDialog?: 0 | 1; /** * Indicates the client supports ABR. */ @@ -11193,6 +11269,14 @@ export type TranscodeSubtitlesData = { * Target video number of audio channels. */ audioChannelCount?: number; + /** + * Indicates if the server should normalize the loudness of an audio track based on loudness analysis results. + */ + normalizeLoudness?: 0 | 1; + /** + * Indicates if the server boost the dialog found within an audio track. + */ + boostDialog?: 0 | 1; /** * Indicates the client supports ABR. */ diff --git a/apps/server/src/providers/plex/openapi/manifest.json b/apps/server/src/providers/plex/openapi/manifest.json index a5d36c65..dc8bbf35 100644 --- a/apps/server/src/providers/plex/openapi/manifest.json +++ b/apps/server/src/providers/plex/openapi/manifest.json @@ -1,12 +1,12 @@ { "sourceUrl": "https://developer.plex.tv/pms/", - "upstreamVersion": "1.2.2", + "upstreamVersion": "1.2.3", "openapiVersion": "3.1.0", - "pathCount": 205, - "specSha256": "790038c11318312980c8a4317acd9711d93b717865f7fdc183cf60a8c43587d0", + "pathCount": 207, + "specSha256": "d6d86b0187ff51391d21f08ebd35fbe7e7c8d34747759d383db4152ddc8f010d", "generatedBy": { "package": "@hey-api/openapi-ts", "version": "0.98.2" }, - "fetchedAt": "2026-06-19T21:16:05.766Z" + "fetchedAt": "2026-09-11T14:28:20.412Z" } diff --git a/apps/server/src/providers/plex/openapi/pms.json b/apps/server/src/providers/plex/openapi/pms.json index 7313a180..180c6367 100644 --- a/apps/server/src/providers/plex/openapi/pms.json +++ b/apps/server/src/providers/plex/openapi/pms.json @@ -37,6 +37,32 @@ } }, "5": { + "description": "Indicates if the server should normalize the loudness of an audio track based on loudness analysis results.", + "example": 1, + "in": "query", + "name": "normalizeLoudness", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, + "6": { + "description": "Indicates if the server boost the dialog found within an audio track.", + "example": 1, + "in": "query", + "name": "boostDialog", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, + "7": { "description": "Indicates the client supports ABR.", "example": 1, "in": "query", @@ -49,7 +75,7 @@ "type": "integer" } }, - "6": { + "8": { "description": "Indicates if the server should adjust subtitles based on Voice Activity Data.", "example": 1, "in": "query", @@ -62,7 +88,7 @@ "type": "integer" } }, - "7": { + "9": { "description": "Indicates the client supports direct playing the indicated content.", "example": 1, "in": "query", @@ -75,7 +101,7 @@ "type": "integer" } }, - "8": { + "10": { "description": "Indicates the client supports direct streaming the video of the indicated content.", "example": 1, "in": "query", @@ -88,7 +114,7 @@ "type": "integer" } }, - "9": { + "11": { "description": "Indicates the client supports direct streaming the audio of the indicated content.", "example": 1, "in": "query", @@ -101,7 +127,7 @@ "type": "integer" } }, - "10": { + "12": { "description": "Indicates if resolution should be adjusted for orientation.", "example": 1, "in": "query", @@ -114,7 +140,7 @@ "type": "integer" } }, - "11": { + "13": { "description": "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", "example": 1, "in": "query", @@ -127,7 +153,7 @@ "type": "integer" } }, - "12": { + "14": { "description": "Network type of the client, can be used to help determine target bitrate.", "example": "wan", "in": "query", @@ -141,7 +167,7 @@ "type": "string" } }, - "13": { + "15": { "description": "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.", "example": 102400, "in": "query", @@ -150,7 +176,7 @@ "type": "integer" } }, - "14": { + "16": { "description": "Index of the media to transcode. -1 or not specified indicates let the server choose.", "example": 0, "in": "query", @@ -159,7 +185,7 @@ "type": "integer" } }, - "15": { + "17": { "description": "Target bitrate for audio only files (in kbps, used to transcode).", "example": 5000, "in": "query", @@ -169,7 +195,7 @@ "type": "integer" } }, - "16": { + "18": { "description": "Offset from the start of the media (in seconds).", "example": 90.5, "in": "query", @@ -178,7 +204,7 @@ "type": "number" } }, - "17": { + "19": { "description": "Index of the part to transcode. -1 or not specified indicates the server should join parts together in a transcode", "example": 0, "in": "query", @@ -187,7 +213,7 @@ "type": "integer" } }, - "18": { + "20": { "description": "Internal PMS path of the media to transcode.", "example": "/library/metadata/151671", "in": "query", @@ -196,7 +222,7 @@ "type": "string" } }, - "19": { + "21": { "description": "Maximum bitrate (in kbps) to use in ABR.", "example": 12000, "in": "query", @@ -206,7 +232,7 @@ "type": "integer" } }, - "20": { + "22": { "description": "Target photo resolution.", "example": "1080x1080", "in": "query", @@ -216,7 +242,7 @@ "type": "string" } }, - "21": { + "23": { "description": "Indicates the network streaming protocol to be used for the transcode session: * 'http' - include the file in the http response such as MKV streaming * 'hls' - hls stream (RFC 8216) * 'dash' - dash stream (ISO/IEC 23009-1:2022)\n", "example": "dash", "in": "query", @@ -230,7 +256,7 @@ "type": "string" } }, - "22": { + "24": { "description": "Number of seconds to include in each transcoded segment", "example": 5, "in": "query", @@ -239,7 +265,7 @@ "type": "integer" } }, - "23": { + "25": { "description": "Percentage of original subtitle size to use when burning subtitles (100 is equivalent to original size, 50 is half, ect)", "example": 50, "in": "query", @@ -249,7 +275,7 @@ "type": "integer" } }, - "24": { + "26": { "description": "Indicates how subtitles should be included: * 'auto' - Compute the appropriate subtitle setting automatically * 'burn' - Burn the selected subtitle; auto if no selected subtitle * 'none' - Ignore all subtitle streams * 'sidecar' - The selected subtitle should be provided as a sidecar * 'embedded' - The selected subtitle should be provided as an embedded stream * 'segmented' - The selected subtitle should be provided as a segmented stream\n", "example": "Burn", "in": "query", @@ -267,7 +293,7 @@ "type": "string" } }, - "25": { + "27": { "description": "Target video bitrate (in kbps).", "example": 12000, "in": "query", @@ -277,7 +303,7 @@ "type": "integer" } }, - "26": { + "28": { "description": "Target photo quality.", "example": 50, "in": "query", @@ -288,7 +314,7 @@ "type": "integer" } }, - "27": { + "29": { "description": "Target maximum video resolution.", "example": "1080x1080", "in": "query", @@ -298,7 +324,7 @@ "type": "string" } }, - "28": { + "30": { "description": "Unique per client.", "in": "header", "name": "X-Plex-Client-Identifier", @@ -307,7 +333,7 @@ "type": "string" } }, - "29": { + "31": { "description": "See [Profile Augmentations](#section/API-Info/Profile-Augmentations) .", "example": "add-limitation(scope=videoCodec&scopeName=*&type=upperBound&name=video.frameRate&value=60&replace=true)+append-transcode-target-codec(type=videoProfile&context=streaming&videoCodec=h264%2Chevc&audioCodec=aac&protocol=dash)", "in": "header", @@ -316,7 +342,7 @@ "type": "string" } }, - "30": { + "32": { "description": "Which built in Client Profile to use in the decision. Generally should only be used to specify the Generic profile.", "example": "generic", "in": "header", @@ -325,7 +351,7 @@ "type": "string" } }, - "31": { + "33": { "description": "Device the client is running on", "example": "Windows", "in": "header", @@ -334,7 +360,7 @@ "type": "string" } }, - "32": { + "34": { "description": "Model of the device the client is running on", "example": "standalone", "in": "header", @@ -343,7 +369,7 @@ "type": "string" } }, - "33": { + "35": { "description": "Client Platform", "example": "Chrome", "in": "header", @@ -352,23 +378,6 @@ "type": "string" } }, - "34": { - "description": "Client Platform Version", - "example": 135, - "in": "header", - "name": "X-Plex-Platform-Version", - "schema": { - "type": "string" - } - }, - "35": { - "description": "Unique per client playback session. Used if a client can playback multiple items at a time (such as a browser with multiple tabs)", - "in": "header", - "name": "X-Plex-Session-Identifier", - "schema": { - "type": "string" - } - }, "composite": { "examples": { "default": { @@ -3902,6 +3911,11 @@ "example": true, "type": "boolean" }, + "canNormalizeLoudness": { + "description": "For audio streams only. If `true` then the server can attempt to normalize the loudness levels.", + "example": true, + "type": "boolean" + }, "chromaLocation": { "example": "topleft" }, @@ -4058,13 +4072,13 @@ } }, "info": { - "description": "# API Info\n## Content Types\nThe API supports responses in both XML and JSON, and clients can request one or the other using the standard `Accept` HTTP header. The default is XML, so JSON will only be returned if it's explicitly requested (`Accept: application/json`). New applications should use JSON.\n\nThroughout the docs, it's common for a examples to be given in JSON only since the JSON response would be preferred for new applications.\n\n## Headers\n\nPMS accept a variety of custom headers that follow the pattern `X-Plex-{name}`. The full set of headers isn't enumerated here since some may only apply to certain endpoints, but common headers that can be included on all requests include:\n\n| Header | Description | Sample |\n| --- | --- | --- |\n| X-Plex-Client-Identifier | An opaque identifier unique to the client | abc123 |\n| X-Plex-Token | An authentication token, obtained from plex.tv | XXXXXXXXXXXX |\n| X-Plex-Product | The name of the client product | Plex for Roku |\n| X-Plex-Version | The version of the client application | 2.4.1 |\n| X-Plex-Platform | The platform of the client | Roku |\n| X-Plex-Platform-Version | The version of the platform | 4.3 build 1057 |\n| X-Plex-Device | A relatively friendly name for the client device | Roku 3 |\n| X-Plex-Model | A potentially less friendly identifier for the device model | 4200X |\n| X-Plex-Device-Vendor | The device vendor | Roku |\n| X-Plex-Device-Name | A friendly name for the client | Living Room TV |\n| X-Plex-Marketplace | The marketplace on which the client application is distributed | googlePlay |\n\n`X-Plex-Client-Identifier` is typically required, as is `X-Plex-Token` for authentication.\n\nThere's no standard way to send non-ASCII values as HTTP headers. We attempt to recognize and parse UTF-8 and ISO-8859-1. If you're sending something that may include non-ASCII characters (often `X-Plex-Device-Name`), use UTF-8 if possible.\n\nThese are referred to as headers throughout documentation, but all `X-Plex-` headers can also be sent as query string arguments.\n\n## Auth\n\nMost endpoints require token based authentication, and the token is expected to be sent in the `X-Plex-Token` header. Tokens are obtained from plex.tv. See the Authenticating with Plex section.\n\n## Paths and Keys\n\nMany parts of the API reference things that can be fetched by their `key`. These keys follow a sort of relative URL resolution pattern. Some examples will help clarify.\n\n- For a request to `/library/sections` that includes an item with a `key` of `home` in the response, that item can be fetched at `/library/sections/home`.\n- For a request to `/library/sections/home` that includes an item with a `key` of `/library/metadata/deadbeef` in the response, that item can be fetched at `/library/metadata/deadbeef`.\n\nWe say this follows a \"sort of\" relative URL resolution pattern because all requests are treated as though they have a trailing slash.\n\n```\n/library/sections/ + home => /library/sections/home\n/library/sections + home => /library/sections/home\n/library/sections + /library/sections/home => /library/sections/home\n```\n\nJust like URL resolution, keys may contain absolute URLs as well, especially absolute `https://...` URLs or custom `view://...` URLs. In these cases the key resolved by simply using it, the parent is irrelevant.\n\nAlso note that the features described in this API can generally be present at a different paths. The `/media/providers` path defines where all features can be found. Note that a PMS can contain multiple providers which will be enumerated here. For simplicity, these docs use the most common, default paths. But when we say that `/library/sections/{id}` is part of the API, what we really mean is that a endpoint exists which is composed of the key for the `content` feature and the key for the library section.\n\nFinally, it's worth noting that many paths can potentially be discovered by walking API responses and fetching `key`s, but paths that aren't documented here aren't part of the API contract, they just happen to exist for a particular provider. For example, a particular content directory might include a directory with `key={baseLibraryPath}/genre`. That's not an official part of the API that's guaranteed to exist for every content directory, it's just a `key` that happened to exist within that content directory.\n\n## Types\n\nMany elements throughout the API have a `type` attribute. These types are meant to give helpful information, such as whether something is a movie library or a TV show library. Some API elements rely on a type number so both are provided below\n\n### List of Metadata Types\n\n| Type Name | Type Number |\n| -- | -- |\n| `movie` | 1 |\n| `show` | 2 |\n| `season` | 3 |\n| `episode` | 4 |\n| `trailer` | 5 |\n| `person` | 7 |\n| `artist` | 8 |\n| `album` | 9 |\n| `track` | 10 |\n| `clip` | 12 |\n| `photo` | 13 |\n| `photoalbum` | 14 |\n| `playlist` | 15 |\n| `playlistfolder` | 16 |\n| `collection` | 18 |\n\nWhen an element has both `type` and `key` attributes, the type describes what will be returned when fetching that key. Some types will return a list of other elements. That list may have a `Meta` element describing the specific types within the list. Consider the following examples:\n\n```json\n[\n {\n \"key\": \"/foo\",\n \"type\": \"movie\",\n \"title\": \"A Movie\"\n },\n {\n \"key\": \"/bar\",\n \"type\": \"collection\",\n \"title\": \"My Favorite Movies\"\n },\n {\n \"key\": \"/baz\",\n \"type\": \"show\",\n \"title\": \"A Show\"\n }\n]\n```\n\nIn each case, the `type` describes what will be returned when fetching the key. One exception is the `/children` key for parents like shows and seasons. It will return a list of children even though the `type` describes the parent.\n\nSome elements may also include an optional `subtype` attribute. The subtype is meant to be a refinement of the type, not a completely different type. One test is trying to explain the type in natural language. `type=\"clip\" subtype=\"news\"` passes the test that \"This is a clip, a news clip specifically.\" Another test is considering the client UI. A client should be functional if it ignores the subtype, and optimized if it respects it. If `type=\"track\" subtype=\"podcast\"`, a client can successfully play the podcast in an audio player based purely on the type, but it may tweak the display or which advanced playback controls are visible based on the subtype.\n\n### List of Metadata Subtypes\n\n- `podcast`\n- `webshow`\n- `news`\n- `photo`\n\n#### Collection Subtypes\n\n- `movie`\n- `show`\n- `artist`\n- `album`\n\n#### Extras Subtypes\n\n- `trailer`\n- `deletedScene`\n- `interview`\n- `musicVideo`\n- `behindTheScenes`\n- `sceneOrSample`\n- `liveMusicVideo`\n- `lyricMusicVideo`\n- `concert`\n- `featurette`\n- `short`\n- `other`\n\n## Sources\n\nSource URIs and attributes make it possible to uniquely reference content outside the local server context without requiring a fixed url. This might be desirable when showing related albums from a friend's shared media server, building a universal play queue, or returning aggregated hubs that span multiple providers. Source components are immutable and act as pointers to a single item or directory in the Plex ecosystem.\n\nA source URI from a media server uses the `server` scheme while a cloud provider uses the `provider` scheme.\n\n```\nserver://{SERVER_ID}/{PROVIDER_ID}/{PATH}\nprovider://{PROVIDER_ID}/{PATH}\n```\n\nAs a single regular expression, that's:\n\n```\n/^(server|provider):\\/\\/([a-fA-F0-9-]+)?\\/?([^/]+)([^\\?]+)\\??(.*)?/\n```\n\nThe server id is the server's `machineIdentifier`. The provider id is the provider's `identifier`. The rest of the path represents the path of the content at the provider and may include additional query parameters like `X-Plex-` headers or media query syntax for sorts and filters.\n\nSome examples may be helpful:\n\n```\nserver://546684a3d18ac5c39037360ec9ce900b7af9cc36/com.plexapp.plugins.library/library/metadata/2814936\nprovider://tv.plex.provider.podcasts/library/sections/audio/all\n```\n\nThe `source` attribute has the same structure as the source URI, but omits the path.\n\n```\n{SOURCE_TYPE}://{SOURCE_ID}/{PROVIDER_ID?}\n```\n```\n/^(server|provider):\\/\\/([a-fA-F0-9-]+)?\\/?([^/]+)$/\n```\n\n```\nsource=\"server://546684a3d18ac5c39037360ec9ce900b7af9cc36/com.plexapp.plugins.library\"\nsource=\"provider://tv.plex.provider.podcasts\"\n```\n\nSource attributes can be used as a base and combined with `key` or other root-relative path components to construct unique source URIs.\n\n## Pagination\n\nMany endpoints that return a list of items support pagination. Additionally some endpoints will force pagination and limit number of elements returned if the client attempts to request all items. To request a specific subset of data, add two headers to specify the starting offset and the number of desired items.\n\n- **X-Plex-Container-Start** - The desired starting offset\n- **X-Plex-Container-Size** - The desired number of items\n\nBoth headers should be sent in order to request paginated content. Note that it's possible to request a size of 0 on supported endpoints in order to learn the total size without actually getting any content.\n\nThe response **must** be checked to see if the response is in fact paginated. The response might not be paginated at all, or it might include a different number of items than what was requested. A paginated response will include the headers:\n\n- **X-Plex-Container-Start** - The offset of the first returned item\n- **X-Plex-Container-Total-Size** - The **total** size of the collection (optional but typically present)\n\nThe response body will also typically include pagination info. If the response is a `MediaContainer`, then it will have `offset` and `size` attributes representing the start index and the number of items in the current response along with an optional `totalSize` attribute for the total number of elements in the collection.\n\n```\nHTTP/1.1 200 OK\nX-Plex-Container-Start: 2\nX-Plex-Container-Total-Size: 5\nContent-Type: application/xml\n\n{\n \"MediaContainer\": {\n \"size\": 3,\n \"totalSize\": 5,\n \"offset\": 2,\n \"Metadata\" : [\n …\n ]\n }\n}\n```\n\nRather than requesting a page starting at an index, it is also possible in some lists to request a page centered on a specific item in the list.\n\n- **X-Plex-Container-Focus-Key** - The key of an item to center on\n- **X-Plex-Container-Size** - The desired number of items\n\nThe requested size is respected regardless of the position of the focus item in the list. If the item is at the start of the list and 10 items are requested, 9 items in the response will be after the item. If the item is in the middle of the list and 10 items are requested, 4 items will be before the item and 5 items will be after.\n\nEndpoints that support rich media queries also have a `limit` parameter that interacts with pagination. Sending `limit` in a query string limits the desired number of items, much like the `X-Plex-Container-Size` header. There are two major differences:\n\n1. When using `limit`, the total size of the collection is not returned. The minimum of the limit and the actual total size will be returned as the total size.\n2. The request may be more efficient when using `limit`, since the total size doesn't have to be known.\n\nIf the total size of the collection isn't needed, use `limit`, since the request may be more efficient.\n\nNote that `limit` and `X-Plex-Container-Size` aren't mutually exclusive. You can page within the results that are bounded by the limit. If you want a total of 1000 items from a collection of many thousands of items, but you want to page through them 20 at a time, you'd use `limit=1000&X-Plex-Container-Size=20&X-Plex-Container-Start=0`.\n\n## API Versioning\n\nPMS has never used API versioning before the creation of this document. The first published API is considered `1.0` with the API prior to publication considered `0.0`. A client species its version via the `X-Plex-Pms-Api-Version` header on requests. If no header is provided, the version `0.0` is assumed.\n\n### API Changes\n - 1.0.0 (Supported in PMS >= 1.41.9)\n - Added `/downloadQueue` endpoints.\n - Public release of API.\n - The `includeFields` parameter has been renamed to `includeOptionalFields`. The `includeFields` parameter now means \"include only these fields\" where in the past it meant \"please add these fields you wouldn't normally include.\" This was changed to be consistent with the cloud provider API.\n\n\n- 1.1.0 (Supported in PMS >= 1.42.0)\n - Added ability to filter '/media/providers/metadata' endpoint by metadata types (PM-3702)\n - Changed `types` in `/playlists/{playlistId}/items` to array of integers.\n - Document the `/photo/:/transcode` endpoints\n - Fixed serialization of MetadataType objects for '/media/providers/metadata' calls.\n\n\n- 1.1.1 (Supported in PMS >= 1.42.2)\n - Added 'metadataAgentProviderGroupId' query param to create and edit library section (PM-3577)\n - Fixed Add library section method type.\n\n\n- 1.2.0 (Supported in PMS >= 1.43.0)\n - Added 'squareArt' as additional element type for image assets (PM-2959)\n - Added `/media/providers/metadata` endpoints (PM-1012)\n - Added delete method for /library/metadata/{id}/{element} (PM-4094)\n - Added documentation for Metadata-type Media Providers (PM-3051)\n\n\n- 1.2.1 (Supported in PMS >= 1.43.1)\n - Added `/tv.plex.providers.epg.{identifier}:{deviceId}` endpoints (PM-4017)\n - Added new state to itemsGeneratorItems endpoint (PM-3475)\n\n\n- 1.2.2 (Supported in PMS >= 1.43.2)\n - Added `audioLayout` endpoint (PM-5118)\n - Added `videoCodec`, `audioCodec`, and `subtitleCodec` endpoints (PM-5117)\n\n## Response Customization\n\nMany endpoints allow the data that is included in the response to be tailored to exactly what the client wants. This is possible by either specifying things that should be excluded or the set of things that should be included. PMS's ability to include/exclude elements and fields is currently limited but expanding so this should be used with care.\n\nAttributes can be customized by using a query string arg of either `excludeFields` or `includeFields`. This single parameter should be a comma-separated list of attribute names. For example, a request with `excludeFields=summary,tagline` is asking for the summary and title attributes to be left off any metadata items while the `includeFields` parameter indicated that only the specified fields should be included.\n\nChild elements can be customized by using a query string arg of either `excludeElements` or `includeElements`. This single parameter should be a comma-separated list of element names. For example, a request with `excludeElements=Media` is asking for the `Media` elements to be omitted while the `includeElements` parameter indicated that only the specified elements should be included.\n\nIn addition to the above are the parameters `includeOptionalFields` and `includeOptionalElements`. These indicate that the fields/elements which are not normally included should be included in this request. One example is `includeOptionalElements=musicAnalysis` on metadata will include the `musicAnalysis` parameter which can be large and typically not needed by a client.\n\nTrimming the response to only include what a client will actually use can result in much better performance, especially in large collections. Increasingly these are being used to select which data is fetched from the database. So if a client knows it will only ever use a few parameters from a request, it should specify those with `includeFields`.\n\nNote that these inclusions/exclusions are treated as requests, not guarantees. Some endpoints will disregard them completely, and others may ignore them for specific items and insist on returning data that the client didn't necessarily ask for.\n\n## Media Providers\n\nMedia providers are general purpose entities which supply media to Plex clients. Their API describes the Plex Media Server API, via a set of features on the \"root\" endpoint of the provider. Media provider can be hosted by a media server or in the cloud, linked to a specific Plex account. This section explains media providers generally, and then provides the specific server-hosted APIs around media providers.\n\n### Client Guide to Media Providers\n\nThe philosophy behind media providers in general is to allow a common API between cloud servers and PMS, since the APIs are nearly identical to a normal PMS. The general guidelines are:\n- Consume `/media/providers` instead of `/library/sections`\n\n The new providers endpoint give you a list of all providers exported by a server and their features. Remember that the library itself is considered a (very rich) provider! This change will also require changing the client to not hardwire paths on the server, but rather read them from the feature keys directly (e.g. scrobble and rating endpoints).\n\n- Gate management functionality on the `manage` feature\n\n Server libraries allow management (e.g. media deletion). The correct way to gate this functionality is via the manage feature.\n\n- Make sure key construction is correct for things like genre lists\n\n For example, `/library/sections/x/genre` returns a relative key for each genre, but there's nothing which says that the `key` can't be an absolute URL. This is why servers pass back `fastKey` separately so as to not break clients which don't do key construction correctly. Media providers do not pass back `fastKey`, but assume clients will be doing correct key construction.\n\n- Don't call `/library/sections/X/filters|sorts`\n\n You can get all that information (and more) in a single call by hitting `/library/sections/X?includeDetails=1`. Media providers include the extra information by default.\n\n- Respect the Type keys in `/library/sections/x`\n\n The top-level type pivots have their own keys, which should be used over the old \"just append `/all` to the path and add the type\" approach. Not only is this more flexible, it also allows for \"virtual\" pivots, like music videos inside a music library.\n\n- Look for the `skipChildren`/`skipParent` attributes for shows\n\n Because of things like Podcasts, single-season shows can now be made to skip seasons. This is indicated by a `skipChildren` attribute on the show, or a `skipParent` attribute on an episode. If this is set on a show, the client should use `/grandchildren` instead of `/children` in the show's key.\n\n### Features\n\nThe list of supported features, along with the API endpoints each feature represents is shown in the following list. Note that each feature can define a custom endpoint URL, so it doesn't have to match the server API exactly.\n\n- **search**: This feature implies that it supports search via the provided key.\n\n- **metadata**: This feature implies that it supports metadata endpoint. For example, if the `key` were `/library/metadata` then the endpoints `/library/metadata/X`, `/library/metadata/X/children` and `/library/metadata/X/grandchildren` would be supported. This endpoint family allows browsing a hierarchical tree of media (e.g. show to episodes, or artist to tracks).\n\n- **content**: This feature implies that the provider exposes a content catalog, in the form of libraries to browse (grid of content), or discover (via hubs). Each entry in the content feature can contain:\n\n - `hubKey`: This implies it supports a discovery endpoint with hubs.\n - `key`: This implies it supports a content catalog.\n - `icon`: Optional, specifies the icon used for a content directory.\n\n Each content feature can contain one or both of these keys, depending on the structure. More details on the various combinations are provided below.\n\n- **match**: The match feature is used to match a piece of media to the provider's content catalog via a set of hints. As a specific example, you might pass in a title hint of \"Attack of the 50 Foot Woman\" and a year hint of 1958 for the movie type. The provider would then use all the hints to attempt to match to entries in its catalog.\n\n- **manage**: The manage feature implies a whole host of endpoints around _changing_ data inside a library (e.g. editing fields, customizing artwork, etc.). This feature is generally only available on an actual server and generally only to the admin.\n\n- **timeline**: The timeline feature implies that the provider wants to receive timeline (playback notifications) requests from a client at the endpoint defined by `key`. The feature may additionally specify the `scrobbleKey` and `unscrobbleKey` attributes, which represent the endpoints which allow marking a piece of media played or unplayed.\n\n- **rate**: This feature implies the provider supports the endpoint which allows rating content.\n\n- **playqueue**: This feature implies the provider supports the play queue family of endpoints. The `flavor` attribute further specifies the subset; the only supported flavor is currently `full`.\n\n- **playlist**: This feature implies the provider supports the playlist family of endpoints. If `readonly` is set, that means that the provider only allows listing and playing playlists (via play queue API), not actually creating or editing them.\n\n- **subscribe**: This provider allows media subscriptions to be created. If the flavor is `record` then media can be recorded from this library (such as DVR). If the flavor is `download` then the user is allowed to download from this library.\n\n- **promoted**: This feature allows the provider to supply an endpoint that will return a collection of \"promoted\" hubs that many clients show on a user's home screen.\n\n- **continuewatching**: This feature allows the provider to supply an endpoint that will return a hub for merging into a global Continue Watching hub.\n\n- **collection**: This feature implies the provider supports the collection family of endpoints.\n\n- **actions**\n - **removeFromContinueWatching** - Action to remove an item from continue watching\n\n- **imagetranscoder** - This feature implies the provider supports the image transcoder endpoints used to scale images for clients where memory and processor is at a premium\n\n- **queryParser** - This feature implies the provider supports the media queries language below\n\n- **grid** - This feature implies the provider supports displaying metadata in a grid over time (such as live TV)\n\n##### Home discovery and browsable libraries\n\nShown in the example in [/media/providers](#tag/Provider/operation/getMediaProviders), in this media provider the first content directory is an item with only `hubKey`, meaning it only providers discovery hubs. This is the set of hubs covering the whole library which contains continue watching, recently added, recommendations, etc. It's essentially \"landing page\" for the provider.\n\nThe subsequent directories also have a browse `key`, which means they provide a list view of the content with options for filtering and sorting. EPG providers may have only the `key` and no `hubKey`.\n\n##### Minimal provider\n\nThere's no requirement to provide the content feature, given that there are two other ways to access content within a provider: search and match. The former can contribute to global search, whereas the latter is used for things like the DVR engine; once media subscriptions are set up, they look for matching content using the match feature, and examined using the metadata feature.\n\n##### Deeper Hierarchies\n\nIf you examine an app like Spotify, you'll see many of the concepts here apply to their content hierarchy. Their content screens are either grids or hubs. But one notable difference is that the content hierarchy runs a bit deeper than the examples we've examined thus far. For example, one of the top-level selections is \"Genres & Moods\". Diving into one of the genres leads to a discovery area with different hubs for popular playlists, artists, and albums from the genre. Selecting a mood leads to a grid with popular playlists for the mood. In order to support this sort of hierarchy, we need an extension to the regular library, which is a *content directory*. This allows us to nest content, without losing any of the power and features—for example, the grid with popular playlists could list filters and sorts specific for that grid. This is power you simply don't have with the old channel architecture.\n\n##### Extensions to regular libraries\n\nThis section examines extensions to plain libraries which content providers can use, and which clients need to be aware of.\n\n- **Nested content directories**: In regular libraries, there are fixed types of directories (e.g. shows, or music albums). In content providers, we want to have the ability to display other types of things (e.g. stations, or moods, or genres) as first-class things in a grid or discovery layout. Here's an example of what a nested content directory looks like. Given the `type` of content, the client knows that this directory should be treated like a content directory feature entry.\n\n ```json\n {\n \"Directory\":[\n {\n \"key\":\"foo\",\n \"hubKey\":\"foo2\",\n \"type\":\"content\",\n \"aspectRatio\":\"1:1\",\n \"title\":\"Genres and Moods\"\n }\n ]\n }\n ```\n\n- **Aspect ratio hint**: Because the entities listed in content directories can be arbitrary, it's important to tell the client some information about how they should be displayed. The `thumb` attribute contains no information about aspect ratio, so clients make assumptions based upon known types (e.g. movies are 2:3, episode thumbs are 16:9, etc.). This attributes allows the provider to specify exactly the aspect ratio of the thing being displayed.\n\n## Metadata Providers\n\nThis section describes the specific Media Providers which supply the `metadata` feature. These providers can be created and used in Plex Media Server to supply metadata to items inside Movie and TV Show libraries (music libraries are currently not supported).\n\n### Common Request Headers\n\nThere are a few headers which are common to both the Metadata and Match features. These can be passed as either headers or query parameters.\n\n| Header | Support Required? | Description |\n|--------|-------------------|-------------|\n| X-Plex-Language | No | IETF language tag including the region subtag (e.g. 'en-US', 'de-DE'). Used for localization.\n| X-Plex-Country | No | ISO 3166 two-letter country code. Used primarily to define the country for certification data, or can be used to determine release dates for the specific country.\n| X-Plex-Container-Size | Yes | For paged requests. This determines what the maximum container size should be of a single response.\n| X-Plex-Container-Start | Yes | For paged requests. This determines the starting index for the paged request.\n\n### Response Paging\n\nCertain responses may contain a large number of objects. The consumer may want to limit the size of the MediaContainer by paging through them using the `X-Plex-Container-Size` and `X-Plex-Container-Start` headers/params. Responses should them limit the object count inside the MediaContainer to `X-Plex-Container-Size` and start at the index provided by `X-Plex-Container-Start`.\n\nSee the [Pagination](#pagination) section for more details on how paging works.\n\nThe only two endpoints that require mandatory paging are the Metadata `/children` and `/grandchildren` endpoints as these will potentially contain many items. Passing no paging headers here should only return the first 20 Metadata objects.\n\n### Common return codes\n\nIt is important to return the correct HTTP return codes.\n\n| Code | Common Name | Description |\n|------|-------------|-------------|\n| 200 | OK | An response for an item or match is successfully returned |\n| 404 | Not Found | If an item with the requested ratingKey is not found (Metadata feature only) |\n| 400 | Bad Request | A request was made which cannot be fulfilled because the request is malformed |\n| 500 | Internal Server Error | A request was made which cannot be fulfilled because the server encountered an internal error |\n\n### Response Customization (Optional)\n\nThere may be cases where a reduced response is wanted, i.e. we only want to return specific attributes or exclude specific attributes. These are handled with `includeFields`, `excludeFields`, `includeElements` and `excludeElements`.\n\nInformation on its use can be found in the [Response Customization](#response-customization).\n\nYou may wish to add support for this to keep response sizes down, however it is not required and you can safely ignore when these parameters are passed.\n\n### Metadata Feature\n\nThis is a path to retrieve metadata for a specific piece of content by its id.\n\nIt is called by making a `GET` request to the path defined by the `Metadata` feature inside the root of your provider with the `ratingKey` of the metadata item.\n\nFor example, the request may be something like `GET http://localhost/library/metadata/tmdb-movie-123` which should return a [Metadata Object](#metadata-object) for the item with the `ratingKey` of \"tmdb-movie-123\".\n\nSee some [Example Responses](#example-responses)\n\n#### Supported Query Parameters\n\nThere are some query parameters available to media provider to augment the responses. Not all of these are required to be supported by all providers, support requirement is detailed in the below table.\n\n| Param | Type | Support Required? | Description |\n|-------|------|-------------------|-------------|\n| `includeChildren` | integer (1/0) | Yes (TV Shows/Seasons only) | Returns a [Children Object](#children-object) when the metadata type has direct child objects (e.g. a TV Show should return Season Children)\n| `episodeOrder` | string | No | When making a request that returns seasons in the response, pass back the appropriate season items for the requested [SeasonType id](#seasontype-array-optional). It is expected that if no seasons exist for the requested episodeOrder, that no season data should be returned.\n\n#### Image endpoint (Recommended)\n\nThe Metadata feature should also provide a `/images` path for calls to specific items, e.g. `/library/metadata/tmdb-movie-123/images`. This endpoint should return a [MediaContainer](#mediacontainer) object containing and [Image Array](#image-array-highly-recommended) of all the available image assets for that item.\n\nExample:\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 3,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 3,\n \"Image\": [\n {\n \"type\": \"coverPoster\",\n \"url\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n },\n {\n \"type\": \"background\",\n \"url\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n },\n {\n \"type\": \"clearLogo\",\n \"url\": \"https://image.tmdb.org/t/p/original/rIi0lY2UftYuKDJ4OlIefDdijve.png\",\n }\n ]\n }\n}\n```\n\n### Children and Grandchildren Requests\n\nFor items which contain child items, like TV Shows and Seasons, these types should also respond to requests for `/children` and `/grandchildren`, e.g. `/library/metadata/tmdb-show-123/children`.\n\nFor TV Shows and Seasons this should return a [MediaContainer](#mediacontainer) object with an array of [Metadata Objects](#metadata-object) for their Seasons and Episodes respectively.\n\nIt is required that these two endpoints support paged requests via the `X-Plex-Container-Size` and `X-Plex-Container-Start` headers/params.\n\n### Match Feature\n\nThis is a path to retrieve potential matches to metadata items based on contextual hints passed in your request body. This should return a [MediaContainer Object](#mediacontainer) possibly containing multiple Metadata objects (by default should only return the best result only).\n\nIt is called by making a `POST` request to the path defined by the `Match` feature inside the root of your provider.\n\nThis may be where it is useful supporting [Response Customization](#response-customization-optional) as match responses don't always need to contain the full Metadata object responses.\n\nA request body is required which can contain the attributes listed below.\n\n| Attribute | Type | Support Required? | Optional | Description |\n|-----------|------|-------------------|----------|-------------|\n| `type` | integer | Yes | No | The numeric metadata type for the requested match. See [Metadata Types Table](#metadata-types-table) |\n| `title` | string | Yes | No* | A title for the item. *Movies and TV Shows only. |\n| `parentTitle` | string | Yes | No* | A title for the TV Show. *Seasons only. |\n| `grandparentTitle` | string | Yes | No* | A title for the TV Show. *Episodes only. |\n| `includeChildren` | integer (1/0) | Yes (TV Shows/Seasons only) | Yes* | Returns a [Children Object](#children-object) when the metadata type has direct child objects (e.g. a TV Show should return Season Children). *Is only optional for Movie and Episode types.\n| `episodeOrder` | string | No | Yes | When making a request that returns seasons in the response, pass back the appropriate season items for the requested [SeasonType id](#seasontype-array-optional). It is expected that if no seasons exist for the requested episodeOrder, that no season data should be returned. |\n| `year` | integer | Yes | Yes | The release year for the requested match. |\n| `guid` | string | Yes | Yes | An external id which can help matching precisely (e.g. `tvdb://12345) |\n| `index` | integer | Yes | Yes* | For Seasons, the season number. For Episodes, the episode number. |\n| `parentIndex` | integer | Yes | Yes* | For Episodes, the season number. |\n| `filename` | string | No | Yes | The relative path for the underlying media file. For TV Shows and Seasons this will return the first file found. e.g. `/Movies/Back to the Future (1985).mp4` |\n| `date` | string | Yes | Yes* | When matching an TV Episode, if `index` and `parentIndex` are not available, a date must be passed representing the air date of the episode.\n| `manual` | integer (1/0) | Yes | Yes | When a value of `1` is passed, the response should contain an array of the best matches for the request ordered by highest to lowest confidence. When this value is not passed or is `0`, only the best match should be returned. |\n| `includeAdult` | integer (1/0) | No | Yes | If your provider supports explicit/adult content this value should be taken into consideration when returning responses and any explicit results should be filtered out unless a value of `1` is passed. |\n\n#### Match Example\n\n##### JSON Body\n\n```json\n{\n \"parentTitle\": \"Adventure Time\",\n \"type\": 3,\n \"index\": 8,\n \"filename\": \"TV Shows/Adventure Time/Adventure Time S08E01.mp4\",\n \"includeElements\": \"Metadata,Children\",\n \"includeFields\": \"guid,parentGuid,title,parentTitle,thumb,parentThumb,index,originallyAvailableAt,year,type\",\n \"includeChildren\": 1\n}\n```\n\n##### CURL Command\n\n```\ncurl -X POST \\\n 'http://localhost/library/metadata/matches?X-Plex-Country=US&X-Plex-Language=en-US' \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"parentTitle\": \"Adventure Time\",\n \"type\": 3,\n \"index\": 8,\n \"filename\": \"TV Shows/Adventure Time/Adventure Time S08E01.mp4\",\n \"includeElements\": \"Metadata,Children\",\n \"includeFields\": \"guid,parentGuid,title,parentTitle,thumb,parentThumb,index,originallyAvailableAt,year,type\",\n \"includeChildren\": 1\n}'\n```\n\n##### Response\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"guid\": \"plex://season/5d9c0939e9d5a1001f4def89\",\n \"type\": \"season\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/zIDoU6YZXE3oz9MNBjE2Ld94Xuu.jpg\",\n \"title\": \"Season 8\",\n \"parentTitle\": \"Adventure Time\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"parentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"index\": 8,\n \"originallyAvailableAt\": \"2016-03-26\",\n \"year\": 2016,\n \"Children\": {\n \"size\": 2,\n \"Metadata\": [\n {\n \"guid\": \"plex://episode/5eeb4fc1d39938003f7753c0\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/3WXclCno2MYKhdnUidQVsPSpolk.jpg\",\n \"title\": \"Broke His Crown\",\n \"parentTitle\": \"Season 8\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/zIDoU6YZXE3oz9MNBjE2Ld94Xuu.jpg\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def89\",\n \"index\": 1,\n \"originallyAvailableAt\": \"2016-03-26\",\n \"year\": 2016\n },\n {\n \"guid\": \"plex://episode/5eeb4fc1d39938003f7753be\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/mhhq4BXNmnZZfzfqsBvZwMvcngt.jpg\",\n \"title\": \"Don't Look\",\n \"parentTitle\": \"Season 8\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/zIDoU6YZXE3oz9MNBjE2Ld94Xuu.jpg\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def89\",\n \"index\": 2,\n \"originallyAvailableAt\": \"2016-04-02\",\n \"year\": 2016\n }\n ]\n }\n }\n ]\n }\n}\n```\n\n## MediaProvider Response\n\nThis document describes the JSON response schema for Plex-compatible metadata-specific Media Providers.\n\nThe root of the Media Provider must return some necessary attributes which define a metadata provider.\n\n### MediaProvider\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `identifier` | string | Yes | Unique identifier for this media provider |\n| `title` | string | Yes | A human readable title for the media provider |\n| `version` | string | No | The version of the API being called |\n| `Feature` | array | Yes | Array containing the features provided by the media provider |\n\n### `Types` Array (Required)\n\nThis defines what metadata types are supported by the provider.\n\nPlease note that is recommended to support one specific metadata parent type per provider as this will make it easier for consumers to combine this provider with others inside Plex Media Server. This is because in order to combine providers, each provider in a combine group must support the types the other supports as well. Limiting the scope of types will make it more widely compatible.\n\nIf you wish to support both movie and TV Shows, consider creating two separate providers. This isn't a hard requirement but is recommended.\n\nWhen supporting TV Shows, it is necessary to add a type for TV Shows, Seasons and Episodes (i.e. types 2, 3 and 4).\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | integer | Yes | The metadata type represented by its numeric value (see mapping table below) |\n| `Scheme` | array | Yes | Array defining the GUID-scheme (the prefix) for items returned by this provider |\n\n### `Scheme` Array (Required)\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `scheme` | string | Yes | The GUID-scheme. Should be identical to the provider identifier. |\n\n#### Metadata Types Table\n\nCustom metadata provider currently support a subset of the full metadata types outline in the [Metadata Types](#metadata-types) section.\n\n| Type Name | Type Number |\n|-----------|-------------|\n| `movie` | 1 |\n| `show` | 2 |\n| `season` | 3 |\n| `episode` | 4 |\n\n### `Feature` Array (Required)\n\nA feature, as its name implies, defines a feature available to the specific provider.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | string | Yes | Feature type (see feature table below) |\n| `key` | string | Yes | API endpoint path to call this feature |\n\n#### Available Features\n\n| Type | Required | Description |\n|------|----------|-------------|\n| metadata | Yes | Path to retrieve metadata for a specific piece of content by its id. See Metadata Feature section. |\n| match | Yes | Path to return a potential match for a specific piece of content using contextual hints. See Match Feature section. |\n\n### Example Response\n\n```json\n{\n \"MediaProvider\": {\n \"identifier\": \"tv.plex.agents.custom.johnz.tmdb\",\n \"title\": \"John Z's TV Show Provider\",\n \"version\": \"1.0.0\",\n \"Types\": [\n {\n \"type\": 2,\n \"Scheme\": [\n {\n \"scheme\": \"tv.plex.agents.custom.johnz.tmdb\"\n }\n ]\n },\n {\n \"type\": 3,\n \"Scheme\": [\n {\n \"scheme\": \"tv.plex.agents.custom.johnz.tmdb\"\n }\n ]\n },\n {\n \"type\": 4,\n \"Scheme\": [\n {\n \"scheme\": \"tv.plex.agents.custom.johnz.tmdb\"\n }\n ]\n }\n ],\n \"Feature\": [\n {\n \"type\": \"metadata\",\n \"key\": \"/library/metadata\"\n },\n {\n \"type\": \"match\",\n \"key\": \"/library/metadata/matches\"\n }\n ]\n }\n}\n```\n\n### Defining an identifier\n\nCustom metadata providers need to provide an identifier using a scheme with the `tv.plex.agents.custom.` prefix. A custom provider can choose its own scheme as long as it is prefixed with this value, for example a provider for a custom TheMovieDB implementation might use a scheme like:\n\n`tv.plex.agents.custom.johnz.tmdb`\n\nIt is important to note that you should try and keep the identifier unique as there is no guarantee that it will be the only provider added to a Plex user's server and could conflict with a another existing provider already in use. So avoid using very generic suffixes like `tmdb`, `tvdb`, etc.\n\nThe characters allowed for your suffix is very strict and can only contain ASCII letters, numbers and periods (`regex [a-zA-Z0-9.]`).\n\nThis identifier must be used as the scheme for the Metadata items the provider returns. See [GUID Construction](#guid-construction).\n\n## Metadata Response\n\nThis section describes the JSON response schema for Plex-compatible metadata responses from Media Providers. This does not describe the Metadata response in its entirety only what is required for Media Provider responses.\n\nThe response consists of a `MediaContainer` object that wraps `Metadata` objects representing the movie, TV show, season or episode data.\n\nThe different metadata types may have specific attributes only returned by that type. e.g. Season and episode types will have some attributes specific to their parent like `parentTitle` which would not be serialized by a movie or TV show type.\n\n### MediaContainer\n\nThe root object that contains metadata and pagination information.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `offset` | integer | The starting position in the result set (always 0 for single items) |\n| `totalSize` | integer | Total number of items in the response (always 1 for single items) |\n| `identifier` | string | The provider identifier (e.g., \"tv.plex.provider.metadata\") |\n| `size` | integer | Number of items in the current response (always 1 for single items) |\n| `Metadata` | array | Array containing a single movie metadata object |\n\n### Metadata Object\n\nThe main object containing all the item information.\n\n#### Core Attributes (applicable to all metadata types)\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `ratingKey` | string | Yes | Unique identifier for this metadata item in Plex |\n| `key` | string | Yes | API endpoint path to retrieve this metadata |\n| `guid` | string | Yes | Global unique identifier in Plex-compatible format. See the 'Guid construction' section. |\n| `type` | string | Yes | Content type (`movie`, `show`, `season` or `episode`) |\n| `title` | string | Yes | The metadata title, e.g. \"Back to the Future\" |\n| `originallyAvailableAt` | string | Yes | Original release date in ISO 8601 format (YYYY-MM-DD) |\n| `thumb` | string | No | A publicly accessible URL to the default poster/thumbnail for the item |\n| `art` | string | No | A publicly accessible URL to the default background artwork for the item |\n| `contentRating` | string | No | Age rating/certification (e.g., \"PG\", \"R\", \"PG-13\"). For non-US ratings please prepend 2-letter country code followed by a forward slash (e.g. za/15) |\n| `originalTitle` | string | No | If the request is made for language that is different to the original language of the release, return the title in its original language. |\n| `titleSort` | string | No | Returned if the content should be sorted by a different value, e.g. \"Quiet Place, A\". This will be added automatically by the media server, so its inclusion is only necessary if you require a specific sorting value which the media server does not accommodate. |\n| `year` | integer | No | Release year |\n| `summary` | string | No | Full plot synopsis |\n| `isAdult` | bool | No | Return `true` for explicit/adult content. |\n\n#### Movie, TV Show and Episode Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `duration` | integer | No | Runtime in milliseconds |\n\n#### Movie and TV Show Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tagline` | string | No | Movie tagline or promotional text |\n| `studio` | string | No | Primary production studio |\n| `theme` | string | No | A publicly accessible URL to an audio snippet of the item's theme music (MP3 only, preferably keep max length to around 30 seconds) |\n\n#### Season and Episode Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `parentRatingKey` | string | Yes | Unique identifier for parent (the TV show for a season and the season for an episode) metadata item in Plex |\n| `parentKey` | string | Yes | API endpoint path to retrieve the parent metadata |\n| `parentGuid` | string | Yes | Global unique identifier in Plex-compatible format for the parent. See the 'Guid construction' section. |\n| `parentType` | string | Yes | the content type of the parent (i.e. `show` for a season, `season` for an episode) |\n| `parentTitle` | string | Yes | The metadata title of the parent. |\n| `parentThumb` | string | No | A publicly accessible URL to the default poster/thubnail for the parent |\n| `index` | integer | Yes | The item index. For a season this is the season number, for an episode it's the episode number |\n\n#### Episode Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `grandparentRatingKey` | string | Yes | Unique identifier for grandparent (the TV Show item) metadata item in Plex |\n| `grandparentKey` | string | Yes | API endpoint path to retrieve the grandparent metadata |\n| `grandparentGuid` | string | Yes | Global unique identifier in Plex-compatible format for the grandparent. See the 'Guid construction' section. |\n| `grandparentType` | string | Yes | `show` - the content type of the grandparent |\n| `grandparentTitle` | string | Yes | The metadata title of the grandparent e.g. `Adventure Time` |\n| `grandparentThumb` | string | No | A publicly accessible URL to the default poster/thubnail for the grandparent |\n| `parentIndex` | integer | Yes | The season index, e.g. `8` |\n\n#### `Image` Array (Highly Recommended)\n\nArray of all available image assets in various dimensions.\n\nNot all types are required but it is recommended to supply at least \"coverPoster\" (or \"snapshot\" for episode items) and \"background\". \"clearLogo\" and \"backgroundSquare\" are also utilized inside Plex client applications for movies and TV shows and should be supplied to provide the best experience for these types.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | string | Yes | Image type: \"background\", \"backgroundSquare\", \"clearLogo\", \"coverPoster\", \"snapshot\" |\n| `url` | string | Yes | Full URL to the image asset |\n| `alt` | string | No | Alt text for accessibility (typically movie title) |\n\n#### `OriginalImage` Array (Recommended)\n\nThe same attributes as `Image` but provides images in the original language of the content if the requested language doesn't match the original language.\n\n#### `Genre` Array (Recommended)\n\nArray of genres associated with the content.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Display name of the genre (e.g. \"Action\") |\n| `originalTag` | string | No | Original language of genre name if request is made in a language different from the original |\n\n#### `Guid` Array (Optional)\n\nArray of external identifier mappings. This is very useful to provide exact mappings to other metadata providers which can improve matching accuracy and speed when combining multiple metadata providers.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `id` | string | Yes | External ID in format \"provider://id\" (e.g., \"imdb://tt0088763\", \"tmdb://105\") |\n\nInternally supported providers include:\n- `imdb` - IMDb\n- `tmdb` - TheMovieDB\n- `tvdb` - TVDB\n\n#### `Country` Array (Optional)\n\nArray of production countries.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Full country name |\n\n#### People\n\nThere are common attributes among `Role`, `Producer`, `Director` and `Writer` arrays.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Person's full name |\n| `thumb` | string | No | URL to person's photo |\n| `role` | string | No | Character name or role description |\n| `order` | integer | No | Display order in cast list |\n\n#### `Role` Array (Recommended)\n\nArray of cast members and their characters.\n\nSee \"People\" section for attributes.\n\n#### `Director` Array (Recommended)\n\nArray of directors.\n\nSee \"People\" section for attributes.\n\n#### `Producer` Array (Recommended)\n\nArray of producers.\n\nSee \"People\" section for attributes.\n\n#### `Writer` Array (Recommended)\n\nArray of writers/screenwriters.\n\nSee \"People\" section for attributes.\n\n#### `Similar` Array (Optional)\n\nArray of similar titles.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `guid` | string | Yes | GUID for the similar movie |\n| `tag` | string | No | Title of the similar movie |\n\n#### `Studio` Array (Optional)\n\nArray of production studios and companies.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Studio/company name |\n\n#### `Rating` Array (Optional)\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `image` | string | Yes | Image identifier for critic rating badge (see supported identifiers below) |\n| `type` | string | Yes | `audience` or `critic` - always `audience` for user-generated ratings |\n| `value` | float | Yes | The rating represented by a floating point value between 0 and 10 |\n\n#### Rating image identifiers\n\nThese are built-in mappings to display the appropriate badge inside the Plex client. Adding new types is not currently supported.\n\n| Identifier | Source |\n|------------|--------|\n| `imdb://image.rating` | IMDb ratings |\n| `themoviedb://image.rating` | TheMovieDb ratings |\n| `rottentomatoes://image.rating.ripe` | Rotten Tomatoes for critic ratings |\n| `rottentomatoes://image.rating.upright` | Rotten Tomatoes for audience ratings |\n\n#### `Network` Array (Optional)\n\nTV Shows only.\n\nArray of television networks that the TV Show originally aired on.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Network name |\n\n#### `SeasonType` Array (Optional)\n\nTV Shows only.\n\nThe provider must support the `episodeOrdering` query parameter to use this.\n\nArray of available episode orderings for a specific TV Show e.g. (\"DVD Order\", \"Airing Order\", etc.).\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `id` | string | Yes | Unique identifier for the SeasonType, used as query parameter when making requests for TV Shows. ASCII characters only (e.g. \"blurayOrder\") |\n| `source` | string | Yes | The source of the data, e.g. \"tmdb\" |\n| `tag` | string | Yes | A human readable descriptor for the SeasonType, e.g. \"Bluray\" or \"Airing\" |\n| `title` | string | Yes | A full description for the SeasonType as shown in the Plex UI (e.g. \"TheMovieDB (Netflix Order)\") |\n\n#### `Children` Object\n\nThis is required to be supported for TV Shows and Seasons and should only be returned when a request with `includeChildren=1` is passed.\n\nThis is a simplified `MediaContainer` object inside a `Metadata` object which provides an array of child items for the parent object (i.e. when requesting a TV Show, `Children` will contain the list of Seasons of that TV Show).\n\nNote: it is expected that all the child objects be returned in this array. In some edge cases this may result in very large arrays. Please see fit to ensure your provider can handle this and simplify the child objects with only the required attributes if necessary.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `size` | integer | Number of items in the `Metadata` array |\n| `Metadata` | array | Array containing all child `Metadata` objects |\n\n### GUID construction\n\nPlex-compatible GUIDs are constructed out of the following components:\n\n`{scheme}://{metadataType}/{ratingKey}`\n\nFor an item from the Plex metadata provider this will look something like this:\n\n`plex://movie/5d7768244de0ee001fcc7fed`\n\n#### `Scheme` component\n\nCustom metadata providers need to provide a GUID in this same format using a scheme with the `tv.plex.agents.custom.` prefix. The scheme should match the metadata provider's `identifier` (see [Defining an identifier](#defining-an-identifier)), for example a provider for a custom TheMovieDB implementation might use a scheme like:\n\n`tv.plex.agents.custom.johnz.tmdb`\n\n#### `metadataType` component\n\nThis should just be the string representation of the metadata type being returned, i.e. `movie`, `show`, `season` or `episode`.\n\n#### `ratingKey` component\n\nThis value should match the `ratingKey` attribute on the metadata item and is what is used when making a metadata request to the provider (e.g. `http://localhost/library/metadata/{ratingKey}`).\n\nThe `ratingKey` can constist of ASCII letters, numbers, dashes and underscores (`regex [a-zA-Z0-9_-]`).\n\n#### Custom GUID examples\n\nSome valid GUIDs could look like this:\n\n- `tv.plex.agents.custom.johnz.tmdb://movie/tmdb-movie-19934`\n- `tv.plex.agents.custom.barkley.tvdb://show/78874`\n- `tv.plex.agents.custom.finn.imdb://movie/tt0379786`\n\n### Example Responses\n\n#### Movie Type\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"art\": \"https://metadata-static.plex.tv/d/gracenote/dc6be8ceb098b8e14a708786ea071c6e.jpg\",\n \"guid\": \"plex://movie/5d7768244de0ee001fcc7fed\",\n \"key\": \"/library/metadata/5d7768244de0ee001fcc7fed\",\n \"ratingKey\": \"5d7768244de0ee001fcc7fed\",\n \"studio\": \"Universal Pictures\",\n \"summary\": \"Marty McFly, a typical American teenager of the Eighties, is accidentally sent back to 1955 in a plutonium-powered DeLorean \\\"time machine\\\" invented by a slightly mad scientist. During his often hysterical, always amazing trip back in time, Marty must make sure his teenage parents-to-be meet and fall in love to get back to the future.\",\n \"tagline\": \"He was never in time for his classes... He wasn't in time for his dinner... Then one day... he wasn't in his time at all.\",\n \"type\": \"movie\",\n \"thumb\": \"https://metadata-static.plex.tv/9/gracenote/9cf50a3c04a44ff7d53e1134222e3929.jpg\",\n \"duration\": 6960000,\n \"title\": \"Back to the Future\",\n \"contentRating\": \"PG\",\n \"originallyAvailableAt\": \"1985-07-03\",\n \"year\": 1985,\n \"Image\": [\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"background\",\n \"url\": \"https://metadata-static.plex.tv/d/gracenote/dc6be8ceb098b8e14a708786ea071c6e.jpg\"\n },\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"backgroundSquare\",\n \"url\": \"https://metadata-static.plex.tv/a/gracenote/ab63d5222db8e9b9c319b478f81bf1b6.jpg\"\n },\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"clearLogo\",\n \"url\": \"https://metadata-static.plex.tv/f/683a142553/f44fe9b4a2cb1a6eb3eadbd22eb09add.png\"\n },\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"coverPoster\",\n \"url\": \"https://metadata-static.plex.tv/9/gracenote/9cf50a3c04a44ff7d53e1134222e3929.jpg\"\n }\n ],\n \"Genre\": [\n {\n \"tag\": \"Adventure\",\n },\n {\n \"tag\": \"Comedy\",\n },\n {\n \"tag\": \"Science Fiction\",\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt0088763\"\n },\n {\n \"id\": \"tmdb://105\"\n },\n {\n \"id\": \"tvdb://299\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.5\n },\n {\n \"image\": \"rottentomatoes://image.rating.ripe\",\n \"type\": \"critic\",\n \"value\": 9.3\n },\n {\n \"image\": \"rottentomatoes://image.rating.upright\",\n \"type\": \"audience\",\n \"value\": 9.5\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.321\n }\n ],\n \"Country\": [\n {\n \"tag\": \"United States of America\"\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Michael J. Fox\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/835031cfa837a2bee58d4c0c345f617b.jpg\",\n \"role\": \"Marty McFly\"\n },\n {\n \"order\": 2,\n \"tag\": \"Christopher Lloyd\",\n \"thumb\": \"https://metadata-static.plex.tv/2/people/21ab248996f621004036e057a1bad43e.jpg\",\n \"role\": \"Emmett Brown\"\n },\n {\n \"order\": 3,\n \"tag\": \"Crispin Glover\",\n \"thumb\": \"https://metadata-static.plex.tv/4/people/490bb62cd498add695195a06dd0ca87e.jpg\",\n \"role\": \"George McFly\"\n },\n {\n \"order\": 4,\n \"tag\": \"Lea Thompson\",\n \"thumb\": \"https://metadata-static.plex.tv/1/people/170afcdfe5b74c88f5ea5f74a31d107d.jpg\",\n \"role\": \"Lorraine Baines\"\n }\n ],\n \"Director\": [\n {\n \"tag\": \"Robert Zemeckis\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/b6a7e4d5e61c2c4613be3ece75dace8e.jpg\",\n \"role\": \"Director\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Neil Canton\",\n \"thumb\": \"https://metadata-static.plex.tv/4/people/481b0c2f5f012c3a532e2bf48fef1d80.jpg\",\n \"role\": \"Producer\"\n },\n {\n \"tag\": \"Bob Gale\",\n \"thumb\": \"https://metadata-static.plex.tv/people/5d7768244de0ee001fcc80b8.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Robert Zemeckis\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/b6a7e4d5e61c2c4613be3ece75dace8e.jpg\",\n \"role\": \"Writer\"\n },\n {\n \"tag\": \"Bob Gale\",\n \"thumb\": \"https://metadata-static.plex.tv/people/5d7768244de0ee001fcc80b8.jpg\",\n \"role\": \"Writer\"\n }\n ],\n \"Similar\": [\n {\n \"guid\": \"plex://movie/5d776d1023d5a3001f52001d\",\n \"tag\": \"Back to the Future Part II\"\n },\n {\n \"guid\": \"plex://movie/5d776d1723d5a3001f520400\",\n \"tag\": \"The Karate Kid\"\n },\n {\n \"guid\": \"plex://movie/5d776d10fb0d55001f596237\",\n \"tag\": \"Back to the Future Part III\"\n },\n {\n \"guid\": \"plex://movie/5d77682a6f4521001ea99e2c\",\n \"tag\": \"The Breakfast Club\"\n }\n ],\n \"Studio\": [\n {\n \"tag\": \"Universal Pictures\"\n },\n {\n \"tag\": \"Amblin Entertainment\"\n }\n ]\n }\n ]\n }\n}\n```\n\n#### Show Type\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"art\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"guid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"key\": \"/library/metadata/5d9c07f72df347001e3a70b4/children\",\n \"ratingKey\": \"5d9c07f72df347001e3a70b4\",\n \"studio\": \"Frederator Studios\",\n \"summary\": \"Unlikely heroes Finn and Jake are buddies who traverse the mystical Land of Ooo. The best of friends, our heroes always find themselves in the middle of escapades. Finn and Jake depend on each other through thick and thin.\",\n \"type\": \"show\",\n \"theme\": \"https://tvthemes.plexapp.com/152831.mp3\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"duration\": 660000,\n \"title\": \"Adventure Time\",\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2010-04-05\",\n \"year\": 2010,\n \"Image\": [\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"background\",\n \"url\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\"\n },\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"backgroundSquare\",\n \"url\": \"https://metadata-static.plex.tv/1/gracenote/1c09b028e1b15c0325917c51966a47d7.jpg\"\n },\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"clearLogo\",\n \"url\": \"https://metadata-static.plex.tv/9/683a142553/9bf0c95f0dede66fce0e507fbfedc653.png\"\n },\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"coverPoster\",\n \"url\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\"\n }\n ],\n \"Genre\": [\n {\n \"tag\": \"Animation\"\n },\n {\n \"tag\": \"Comedy\"\n },\n {\n \"tag\": \"Action\"\n },\n {\n \"tag\": \"Adventure\"\n },\n {\n \"tag\": \"Family\"\n },\n {\n \"tag\": \"Fantasy\"\n },\n {\n \"tag\": \"Science Fiction\"\n },\n {\n \"tag\": \"Sci-Fi & Fantasy\"\n },\n {\n \"tag\": \"Children\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt1305826\"\n },\n {\n \"id\": \"tmdb://15260\"\n },\n {\n \"id\": \"tvdb://152831\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.6\n },\n {\n \"image\": \"rottentomatoes://image.rating.ripe\",\n \"type\": \"critic\",\n \"value\": 10\n },\n {\n \"image\": \"rottentomatoes://image.rating.upright\",\n \"type\": \"audience\",\n \"value\": 9.4\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.504\n }\n ],\n \"Country\": [\n {\n \"tag\": \"United States of America\"\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n },\n {\n \"order\": 3,\n \"tag\": \"Tom Kenny\",\n \"thumb\": \"https://metadata-static.plex.tv/7/people/7a7654471f4b87c2f8ce757357e860b5.jpg\",\n \"role\": \"Ice King (voice)\"\n },\n {\n \"order\": 4,\n \"tag\": \"Hynden Walch\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/b2588be9b38393facd27de7fc4081720.jpg\",\n \"role\": \"Princess Bubblegum (voice)\"\n },\n {\n \"order\": 5,\n \"tag\": \"Olivia Olson\",\n \"thumb\": \"https://metadata-static.plex.tv/4/people/4eec0b6c6d36f6c4cd0574af354d74aa.jpg\",\n \"role\": \"Marceline the Vampire Queen (voice)\"\n }\n ],\n \"Director\": [\n {\n \"tag\": \"Larry Leichliter\",\n \"role\": \"Director\"\n },\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Director\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Derek Drymon\",\n \"thumb\": \"https://metadata-static.plex.tv/c/people/cb057ffd3860076eb0f0c1fb55c8fef1.jpg\",\n \"role\": \"Producer\"\n },\n {\n \"tag\": \"Kelly Crews\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Tim McKeon\",\n \"role\": \"Writer\"\n },\n {\n \"tag\": \"Sean Jimenez\",\n \"role\": \"Writer\"\n }\n ],\n \"Network\": [\n {\n \"tag\": \"Cartoon Network\"\n }\n ],\n \"SeasonType\": [\n {\n \"id\": \"tmdbAiring\",\n \"source\": \"tmdb\",\n \"tag\": \"Aired\",\n \"title\": \"The Movie Database (Aired)\"\n },\n {\n \"id\": \"tvdbAiring\",\n \"source\": \"tvdb\",\n \"tag\": \"Aired\",\n \"title\": \"TheTVDB (Aired)\"\n },\n {\n \"id\": \"tvdbDvd\",\n \"source\": \"tvdb\",\n \"tag\": \"DVD\",\n \"title\": \"TheTVDB (DVD)\"\n },\n {\n \"id\": \"tvdbAbsolute\",\n \"source\": \"tvdb\",\n \"tag\": \"Absolute\",\n \"title\": \"TheTVDB (Absolute)\"\n }\n ],\n \"Similar\": [\n {\n \"guid\": \"plex://show/611cdc357032b6002cb92e97\",\n \"tag\": \"Adventure Time: Fionna & Cake\"\n },\n {\n \"guid\": \"plex://show/5d9c0875ba6eb9001fba4e43\",\n \"tag\": \"Johnny Bravo\"\n },\n {\n \"guid\": \"plex://show/5d9c084de264b7001fc4088c\",\n \"tag\": \"Regular Show\"\n }\n ],\n \"Studio\": [\n {\n \"tag\": \"Frederator Studios\"\n },\n {\n \"tag\": \"Cartoon Network Studios\"\n }\n ]\n }\n ]\n }\n}\n```\n\n#### Season Type (with `Children`)\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"guid\": \"plex://season/602e59ccfdd281002cddb790\",\n \"key\": \"/library/metadata/602e59ccfdd281002cddb790/children\",\n \"ratingKey\": \"602e59ccfdd281002cddb790\",\n \"type\": \"season\",\n \"thumb\": \"http://assets.fanart.tv/fanart/tv/152831/seasonposter/adventure-time-with-finn-and-jake-5c8d180f9b002.jpg\",\n \"title\": \"Season 10\",\n \"parentTitle\": \"Adventure Time\",\n \"parentType\": \"show\",\n \"parentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"parentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"parentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"parentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"index\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"Season 10\",\n \"type\": \"background\",\n \"url\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\"\n },\n {\n \"alt\": \"Season 10\",\n \"type\": \"backgroundSquare\",\n \"url\": \"https://metadata-static.plex.tv/1/gracenote/1c09b028e1b15c0325917c51966a47d7.jpg\"\n },\n {\n \"alt\": \"Season 10\",\n \"type\": \"coverPoster\",\n \"url\": \"http://assets.fanart.tv/fanart/tv/152831/seasonposter/adventure-time-with-finn-and-jake-5c8d180f9b002.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"tvdb://1823714\"\n }\n ],\n \"Children\": {\n \"size\": 2,\n \"Metadata\": [\n {\n \"guid\": \"plex://episode/5d9c0b7ee98e47001eb2e3a0\",\n \"key\": \"/library/metadata/5d9c0b7ee98e47001eb2e3a0\",\n \"ratingKey\": \"5d9c0b7ee98e47001eb2e3a0\",\n \"summary\": \"A fierce creature is terrorizing the Candy Kingdom but before Finn can slay the beast, he must first overcome a guilty conscience.\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\",\n \"duration\": 660000,\n \"title\": \"The Wild Hunt\",\n \"grandparentTitle\": \"Adventure Time\",\n \"grandparentType\": \"show\",\n \"grandparentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"grandparentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"grandparentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"grandparentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"grandparentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"parentTitle\": \"Season 10\",\n \"parentType\": \"season\",\n \"parentArt\": \"https://metadata-static.plex.tv/9/gracenote/9e06ae7ff36bd8d62fa1600287f80794.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/w8mYplN3ysIJ5DIYYgmfGTvuNzd.jpg\",\n \"parentRatingKey\": \"5d9c0939e9d5a1001f4def80\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def80\",\n \"parentKey\": \"/library/metadata/5d9c0939e9d5a1001f4def80\",\n \"index\": 1,\n \"parentIndex\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"The Wild Hunt\",\n \"type\": \"snapshot\",\n \"url\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt7308394\"\n },\n {\n \"id\": \"tmdb://1418023\"\n },\n {\n \"id\": \"tvdb://6179251\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.3\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 7.9\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Pendleton Ward\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/83eb3402f017498e3a0fd5e44af8d1ae.jpg\",\n \"role\": \"Creator\"\n }\n ]\n },\n {\n \"guid\": \"plex://episode/5d9c0b7ee98e47001eb2e38b\",\n \"key\": \"/library/metadata/5d9c0b7ee98e47001eb2e38b\",\n \"ratingKey\": \"5d9c0b7ee98e47001eb2e38b\",\n \"summary\": \"BMO and Ice King hit the road as door to door salesmen and stumble upon an irresistible opportunity.\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/fvREJ2bNoXM2WAGVPCGa3ryQtJs.jpg\",\n \"duration\": 660000,\n \"title\": \"Always BMO Closing\",\n \"grandparentTitle\": \"Adventure Time\",\n \"grandparentType\": \"show\",\n \"grandparentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"grandparentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"grandparentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"grandparentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"grandparentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"parentTitle\": \"Season 10\",\n \"parentType\": \"season\",\n \"parentArt\": \"https://metadata-static.plex.tv/9/gracenote/9e06ae7ff36bd8d62fa1600287f80794.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/w8mYplN3ysIJ5DIYYgmfGTvuNzd.jpg\",\n \"parentRatingKey\": \"5d9c0939e9d5a1001f4def80\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def80\",\n \"parentKey\": \"/library/metadata/5d9c0939e9d5a1001f4def80\",\n \"index\": 2,\n \"parentIndex\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"Always BMO Closing\",\n \"type\": \"snapshot\",\n \"url\": \"https://image.tmdb.org/t/p/original/fvREJ2bNoXM2WAGVPCGa3ryQtJs.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt7308402\"\n },\n {\n \"id\": \"tmdb://1418024\"\n },\n {\n \"id\": \"tvdb://6305580\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 7.6\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 6.7\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Pendleton Ward\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/83eb3402f017498e3a0fd5e44af8d1ae.jpg\",\n \"role\": \"Creator\"\n }\n ]\n }\n ]\n }\n }\n ]\n }\n}\n```\n\n#### Episode Type\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"guid\": \"plex://episode/5d9c0b7ee98e47001eb2e3a0\",\n \"key\": \"/library/metadata/5d9c0b7ee98e47001eb2e3a0\",\n \"ratingKey\": \"5d9c0b7ee98e47001eb2e3a0\",\n \"summary\": \"A fierce creature is terrorizing the Candy Kingdom but before Finn can slay the beast, he must first overcome a guilty conscience.\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\",\n \"duration\": 660000,\n \"title\": \"The Wild Hunt\",\n \"grandparentTitle\": \"Adventure Time\",\n \"grandparentType\": \"show\",\n \"grandparentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"grandparentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"grandparentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"grandparentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"grandparentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"parentTitle\": \"Season 10\",\n \"parentType\": \"season\",\n \"parentArt\": \"https://metadata-static.plex.tv/9/gracenote/9e06ae7ff36bd8d62fa1600287f80794.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/w8mYplN3ysIJ5DIYYgmfGTvuNzd.jpg\",\n \"parentRatingKey\": \"5d9c0939e9d5a1001f4def80\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def80\",\n \"parentKey\": \"/library/metadata/5d9c0939e9d5a1001f4def80\",\n \"index\": 1,\n \"parentIndex\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"The Wild Hunt\",\n \"type\": \"snapshot\",\n \"url\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt7308394\"\n },\n {\n \"id\": \"tmdb://1418023\"\n },\n {\n \"id\": \"tvdb://6179251\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.3\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 7.9\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Pendleton Ward\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/83eb3402f017498e3a0fd5e44af8d1ae.jpg\",\n \"role\": \"Creator\"\n }\n ]\n }\n ]\n }\n}\n\n```\n\n## Media Queries\n\nMedia queries are a querystring-based filtering language used to select subsets of media. The language is rich, and can express complex expressions for media selection, as well as sorting and grouping.\n\n### Fields\n\nQueries reference fields, which can be of a few types:\n\n - *integer*: numbers\n - *boolean*: true/false\n - *tag*: integers representing tag IDs.\n - *string*: strings\n - *date*: epoch seconds\n - *language*: string in ISO639-2b format.\n\nThese fields are detailed in `Field` elements in the section description endpoint (e.g. `/library/sections/X?includeDetails=1`).\n\n### Operators\n\nGiven that media queries are expressible using querystrings, the operator syntax might look a bit quirky, because a) they have to include the `=` character, and b) characters to the left of the equal sign usually have to be URI encoded.\n\nOperators are defined per type:\n\n - *integer*: `=` (equals), `!=` (not equals), `>>=` (greater than), `<<=` (less than), `<=` (less than or equals), `>=` (greater than or equals)\n - *boolean*: `=0` (false) and `=1` (true)\n - *tag*: `=` (is) and `!=` (is not)\n - *string*: `=` (contains), `!=` (does not contain), `==` (equals), `!==` (does not equal), `<=` (begins with), `>=` (ends with)\n - *date*: `=` (equals), `!=` (not equals), `>>=` (after), `<<=` (before)\n - *language*: `=` (equals), `!=` (not equals)\n\n### Relative Values and Units\n\nFor some types, values can be specified as relative. For dates, epoch seconds can be specified as relative to “now” as follows: `+N` (in N seconds from now and `-N` (N seconds ago).\n\nIn addition, the following unit suffixes can be used on date values:\n\n - *m*: minutes\n - *h*: hours\n - *d*: days\n - *w*: weeks\n - *mon*: months\n - *y*: years\n\nFor example, `>>=-3y` means “within the last 3 years”.\n\n### Field Scoping\n\nSome media is organized hierarchically (e.g. shows), and in those cases, many fields are common to different elements in the hierarchy (e.g. show title vs episode title). The following rules are used to resolve field references.\n\n - A `type` parameter must be included to specify the result type.\n - Any non-qualified field is defaulted to refer to the result type.\n - In order to refer to other levels of the hierarchy, use the scoping operator, e.g. `show.title` or `episode.year`. A query may be comprised of multiple fields from different levels of the hierarchy.\n - the `sourceType` parameter may be used to change the default level to which fields refer. For example, `type=4&sourceType=2&title==24` means “all episodes where the show title is 24”.\n\n### Sorting\n\nThe `sort` parameter is used to indicate an ordering on results. Typically, the sort value is a field (including optional scoping). The `:` character is used to indicate additional features of the sort, and the `,` character is used to include multiple fields to the sort.\n\nFor example, `sort=title,index` means “sort first by title ascending, then by index”. Sort features are:\n\n - *desc*: indicates a descending sort.\n - *nullsLast*: indicates that null values are sorted last.\n\nSort features may be mixed and matched, e.g. `sort=title,index:desc`.\n\n### Grouping\n\nThe `group` parameter is used to group results by a field, similar to the SQL feature `group by`. For example, when listing popular tracks, we use the query `type=10&sort=ratingCount:desc&group=title`, because we don't want multiple tracks with the same name (e.g. same track on different albums) showing up.\n\n### Limits\n\nThe `limit` parameter is used to limit the number of results returned. Because it's implemented on top of the SQL `limit` operator, it currently only operates at the level of the type returned. In other words, `type=10&limit=100` will return at most 100 tracks, but you can't select tracks from a limit of 10 _albums_.\n\n### Boolean Operators\n\nGiven the nature of querystrings, it makes a lot of sense to interpret the `&` character as a boolean AND operator. For example `rating=10&index=5` means “rating is 10 AND index is 5”.\n\nWe leverage the `,` operator to signify the boolean OR operator. SO `rating=1,2,3` means “rating is 1 OR 2 OR 3. Given standard precedence rules, `rating=1,2,3&index=5` is parsed as `(rating = 1 or rating = 2 or rating = 3) and index = 5)`.\n\n### Complex Expressions\n\nThere's only so many expressions you can form using vanilla querystring-to-boolean mapping (essentially, “ANDs of ORs”). In order to fully represent complex boolean expressions, there are a few synthetic additions:\n\n - *push=1* and *pop=1*: These are the equivalent of opening and closing parenthesis.\n - *or=1*: These is an explicit OR operator.\n\nAs an example: `push=1&index=1&or=1&rating=2&pop=1&duration=10` parses into `(index = 1 OR rating = 2) AND duration = 10`. This could not be expressed by the simplified syntax above.\n\nHappy query building!\n\n## Profile Augmentations\n\nThe universal transcode endpoint supports the following header or query string parameter: ```X-Plex-Client-Profile-Extra```.\n\nThe value of this parameter is url-encoded. When url-decoded, it consists of a string expressed in the following (poor man's) BNF grammar:\n\n```\n ::= \"+\" *\n :: = \n ::= \"add-direct-play-profile\" | \"add-limitation\" | \"add-transcode-target-codec\" | \"append-transcode-target-codec\" | \"add-transcode-target\" | \"add-settings\"\n ::= \"(\" ( \"=\" ) \"&\")*\n ::= \n ::= \n```\n\n### add-direct-play-profile\nThis directive augments the set of Direct Play profiles in the client profile. The following parameters are required:\n\n- `type` = \"videoProfile\" | \"musicProfile\" | \"photoProfile\" | \"subtitleProfile\"\n- `container` = * or a comma-separated list of containers\n- `videoCodec` = * or a comma-separated list of video codecs\n- `audioCodec` = * or a comma-separated list of audio codecs\n- `subtitleCodec` = * or a comma-separated list of subtitle formats\n\n`*` means to use all existing matching values in the profile. At least one of the `videoCodec`, `audioCodec` and `subtitleCodec` parameters must not be `*`.\n\n\n#### add-direct-play-profile example\nTo add `ac3` as a video audio codec for mp4 and mov containers:\n\n```\nadd-direct-play-profile(type=videoProfile&container=mp4,mov&videoCodec=*&audioCodec=ac3&subtitleCodec=*)\n```\n\n### add-limitation\nThis directive adds a scoped limitation to the profile. The following parameters are required:\n\n- `scope` = \"videoContainer\" | \"musicContainer\" | \"photoContainer\" | \"videoCodec\" | \"videoAudioCodec\" | \"musicCodec\" | \"subtitleCodec\" | \"transcodeTarget\"\n- `scopeName` = the name of the relevant container or codec\n- `type` = \"match\" | \"notMatch\" | \"upperBound\" | \"lowerBound\"\n- `name` = the name of the limitation\n\nThe following parameters are optional:\n- `isRequired` = true|false (default is false)\n- `allStreams` = true|false (default is false)\n- `replace` = true|false (default is false)\n\nIf the `replace` parameter is true, the limitation will replace any similarly scoped limitations (i.e. identical `scope` and `scopeName`. If false, the new limitation will simply add itself to the list of limitations.\n\nExactly one of the following three parameters is required:\n- `value` = the value of the limitation\n- `substring` = the substring of the limitation\n- `regex` = the regex of the limitation\n\nThe `transcodeTarget` scope exists to attach a limitation to a transcode target. This allows clients to tell the MDE to select a specific transcode target for a context/protocol pair, based on specific information about the media itself. When multiple transcode targets match, the first one in the profile will be selected.\n\n\n#### add-limitation examples\nTo add a limitation on ac3 audio tracks in video media specifying a maximum of 6 channels:\n```\nadd-limitation(scope=videoAudioCodec&scopeName=ac3&type=upperBound&name=audio.channels&value=6)\n```\n\nTo add a limitation on ac3 audio tracks in video media specifying a maximum bitrate:\n```\nadd-limitation(scope=videoAudioCodec&scopeName=ac3&type=upperBound&name=audio.bitrate&value=160)\n```\n\nTo add a limitation on h264 video specifying a maximum level:\n```\nadd-limitation(scope=videoCodec&scopeName=h264&type=upperBound&name=video.level&value=40&isRequired=true)\n```\n\nTo add a limitation to a transcode target:\n```\nadd-limitation(scope=transcodeTarget&scopeName=MyTranscodeProfile&type=upperBound&name=audio.channels&value=2)\n```\n\n### add-transcode-target-codec\nThis directive adds additional codecs to the beginning of the audioCodec and/or subtitleCodec lists for the specified transcode target. The following parameters are required:\n\n- `type` = \"videoProfile\" | \"musicProfile\" | \"photoProfile\" | \"subtitleProfile\"\n\nEither `id` or `context` and `protocol` are required:\n\n- `id` = a transcode target identifier\n- `context` = a transcode context (\"streaming\" | \"static\")\n- `protocol` = a protocol (\"hls\" | \"http\" | \"slss\" ... )\n\nAt least one of the following parameters are also required:\n\n- `videoCodec` = a comma-separated list of videoCodecs, which are added to the set of video codecs on the target.\n- `audioCodec` = a comma-separated list of audioCodecs, which are added to the set of audio codecs on the target.\n- `subtitleCodec` = a comma-separated list of audioCodecs, which are added to the set of subtitle codecs on the target.\n\n#### add-transcode-target-codec example\nTo add `ac3` as an additional transcode target option to a HTTP Live Streaming target:\n\n```\nadd-transcode-target-codec(type=videoProfile&context=streaming&protocol=hls&audioCodec=ac3)\n```\n\n### append-transcode-target-codec\nThis directive appends additional codecs to the end of the audioCodec and/or subtitleCodec lists for the specified transcode target. The parameters are the same as for `add-transcode-target-codec`.\n\n```\nappend-transcode-target-codec(type=videoProfile&context=streaming&protocol=hls&audioCodec=dca)\n```\n\n### add-transcode-target\nThis directive adds a new transcode target. If a transcode target matching the type/context/profile already exists in the profile, then this directive is ignored. The following parameters are required:\n\n- `type` = \"videoProfile\" | \"musicProfile\" | \"photoProfile\" | \"subtitleProfile\"\n- `context` = a transcode context (\"streaming\" | \"static\")\n- `protocol` = a protocol (\"hls\" | \"http\" | \"slss\" ... )\n- `container` = a container\n\nThe following parameters are optional:\n\n- `id` = a transcode target identifier\n- `replace` = true|false (default is false)\n\nIf the `replace` parameter is true, the transcode target will replace any similarly scoped transcode target (i.e. identical `type`, `context` and `protocol`. If false, the augmentation will fail if there is an existing transcode target.\n\nThe following parameters are required, depending on the type:\n\n- `videoCodec` = a video codec (required for video) or a comma-separated list of video codecs\n- `audioCodec` = an audio codec (required for music and video) or a comma-separated list of audio codecs\n- `subtitleCodec` = an subtitle codec (required for subtitles and optional for video) or a comma-separated list of subtitle codecs\n\n#### add-transcode-target examples\n\n```\nadd-transcode-target(type=videoProfile&context=streaming&protocol=http&container=mkv&videoCodec=h264&audioCodec=aac,ac3&subtitleCodec=srt)\n```\n\n```\nadd-transcode-target(type=musicProfile&context=streaming&protocol=http&container=flac&audioCodec=flac)\n```\n\n```\nadd-transcode-target(type=subtitleProfile&context=all&protocol=http&container=webvtt&subtitleCodec=webvtt)\n```\n\n### add-settings\nThis directive overrides global settings for the profile. The parameters are name/value pairs matching existing client profile settings.\n\n```\nadd-settings(DirectPlayStreamSelection=false&RandomAccessDataModel=limited)\n```\n\n## Authenticating with Plex\n\nPlex supports two authentication methods:\n\n### JWT Authentication (Recommended)\n\nPlex now supports JSON Web Token (JWT) authentication that provides better security, shorter token lifespans, and improved protection against potential security breaches.\n\n#### Why JWT Authentication?\n\nThe new JWT system addresses security concerns by:\n- **Short-lived tokens**: Tokens expire after 7 days\n- **Public-key cryptography**: Uses modern cryptographic standards (ED25519) for enhanced security\n- **Better clock synchronization**: Built-in timestamp validation helps devices stay in sync\n\n#### How JWT Authentication Works\n\n**1. Register your public key**\n\nThe new system uses a public-key authentication model where each device uploads a public key (JWK) and then requests short-lived JWT tokens. There are two ways to get started with JWT authentication:\n\n**Option 1: PIN Authentication Flow (Recommended for New Apps)**\n\nThis method allows you to get JWT tokens without needing any existing tokens first. It's the preferred approach for new applications.\n\n**Step 1: Generate a PIN with JWK**\n\n```bash\nPOST https://clients.plex.tv/api/v2/pins\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n\nBody:\n{\n \"jwk\": {\n \"kty\": \"OKP\",\n \"crv\": \"Ed25519\",\n \"x\": \"your-public-key-data\",\n \"kid\": \"your-key-id\",\n \"alg\": \"EdDSA\"\n },\n \"strong\": true\n}\n```\n\n**Step 2: User Authentication**\n\nConstruct the Auth App URL and have the user authenticate:\n```\nhttps://app.plex.tv/auth#?clientID=&code=&context%5Bdevice%5D%5Bproduct%5D=My%20Cool%20Plex%20App&forwardUrl=https%3A%2F%2Fmy-cool-plex-app.com\n```\n\nFor 4-digit pins, you need to use the link page: `https://plex.tv/link/?pin=`\n\n**Step 3: Exchange PIN for JWT Token**\n\n```bash\nGET https://clients.plex.tv/api/v2/pins/?deviceJWT=\n```\n\nThe signed JWT must include:\n- `\"aud\": \"plex.tv\"`\n- `\"iss\": \"\"`\n- `\"kid\"` and `\"alg\"` in the header\n\nYou will get the Plex JWT token in the `authToken` field of the response.\n\n**Option 2: Register your public key with existing tokens (For Existing Apps)**\n\nIf you already have a legacy token, you can use it to register your device for JWT authentication:\n\n```bash\nPOST https://clients.plex.tv/api/v2/auth/jwk\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n X-Plex-Token: your-existing-token\n\nBody:\n{\n \"jwk\": {\n \"kty\": \"OKP\",\n \"crv\": \"Ed25519\",\n \"x\": \"your-public-key-data\",\n \"kid\": \"your-key-id\",\n \"use\": \"sig\",\n \"alg\": \"EdDSA\"\n }\n}\n```\n\nAfter registering your public key, you should follow the same steps described below to refresh your token to get your first JWT.\n\n**2. Token Refresh Process**\n\nOnce registered, your device must refresh its token every 7 days using this three-step process:\n\n**Step 1: Get a Nonce**\n\n```bash\nGET https://clients.plex.tv/api/v2/auth/nonce\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n```\n\nThis returns a unique nonce valid for 5 minutes:\n```json\n{\n \"nonce\": \"7c415b56-8f48-488a-98ab-847ef4460442\"\n}\n```\n\n**Step 2: Create a Device JWT**\n\nYour device creates a JWT containing:\n- The nonce from step 1\n- Required scope permissions (see Scope Details below)\n- Audience set to `plex.tv`\n- Issuer set to your `client_identifier`\n- Signed with your device's private key\n\n**Important JWT Header Requirements:**\n\nYour JWT must include these header fields:\n- `\"kid\"`: The key identifier from your JWK registration\n- `\"alg\"`: Must be `\"EdDSA\"` for ED25519 signatures, or `\"RS256\"` for RSA signatures\n\n**Scope Details:**\n\nThe scope field in your device JWT should contain comma-separated values for the user data you need included in the JWT:\n- `username` - Access to the user's username\n- `email` - Access to the user's email address\n- `friendly_name` - Access to the user's friendly name\n- `restricted` - Access to the user's restricted status\n- `anonymous` - Access to the user's anonymous status\n- `joinedAt` - Access to the user's account creation timestamp\n\n**Example Device JWT Header:**\n\n```json\n{\n \"kid\": \"your-key-id\",\n \"alg\": \"EdDSA\",\n \"typ\": \"JWT\"\n}\n```\n\n**Example Device JWT Payload:**\n\n```json\n{\n \"nonce\": \"7c415b56-8f48-488a-98ab-847ef4460442\",\n \"scope\": \"username,email,friendly_name\",\n \"aud\": \"plex.tv\",\n \"iss\": \"your-client-identifier\",\n \"iat\": 1705785603,\n \"exp\": 1705789203\n}\n```\n\n**Step 3: Exchange for Plex Token**\n\n```bash\nPOST https://clients.plex.tv/api/v2/auth/token\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n\nBody:\n{\n \"jwt\": \"your-device-signed-jwt\"\n}\n```\n\nThis returns a new Plex.tv JWT valid for 7 days:\n\n```json\n{\n \"auth_token\": \"eyJraWQiOiJYeVRRN21seXFtVmhJcEo0U1pDZGltdXo3ZjdEYXU1Ym9MLXU2MG5JeEdJIiwidHlwIjoiSldUIiwiYWxnIjoiRWREU0EifQ...\"\n}\n```\n\n**Using Your JWT Token**\n\nOnce you have a JWT token, use it exactly like the old tokens in the `X-Plex-Token` header. Note it can be used to access any Plex.tv endpoint or your Plex Media Server instance:\n\n```bash\nGET http://your-plex-server:32400/library/sections\nHeaders:\n X-Plex-Token: your-jwt-token\n```\n\n#### JWT Authentication Benefits\n\n**Security Features:**\n\n- **Token Rotation**: Automatic expiration every 7 days\n- **Individual Revocation**: Each device can be individually disabled\n- **Cryptographic Verification**: Uses industry-standard ED25519 signatures\n- **Nonce Protection**: Prevents replay attacks\n\n**Developer Experience:**\n\n- **Familiar Interface**: Same `X-Plex-Token` header usage\n- **Automatic Clock Sync**: Built-in timestamp validation\n- **Clear Error Codes**: Specific error responses for different failure modes\n- **Rate Limiting**: Built-in protection against abuse\n\n#### Error Handling\n\nThe JWT system provides clear error responses with specific HTTP status codes:\n\n**Common Error Responses:**\n\n- **498 Token Expired**: Your JWT has expired and needs refresh\n- **422 Signature Verification Failed**: Invalid device signature or JWT structure\n- **422 Thumbprint Already Taken**: JWK already registered by another device\n- **400 Bad Request**: Invalid request format or missing required fields\n- **429 Too Many Requests**: Rate limit exceeded (nonce requests are rate-limited)\n\n**Troubleshooting Tips:**\n\n- **Missing `kid` field**: Ensure your JWT header includes the `kid` field matching your registered JWK\n- **Invalid signature**: Verify your private key matches the public key you registered\n- **Clock synchronization**: Ensure your device's clock is accurate (JWT includes timestamp validation)\n- **Nonce expiration**: Nonces are only valid for 5 minutes - request a new one if yours has expired\n- **Rate limiting**: Nonce requests are rate-limited to prevent abuse\n\n#### Migration Guide\n\n**For New Applications or new users:**\n\n1. Generate an ED25519 key pair for your device\n2. Use the PIN authentication flow (Option 1 above) to register your device and get JWT tokens\n3. Implement the token refresh flow for ongoing authentication\n4. Use the returned JWT in your `X-Plex-Token` header\n\n**To replace legacy tokens of existing applications:**\n\n1. Continue using your current token for now\n2. Register your public key with your existing tokens (Option 2 above)\n3. Generate your first JWT token using the token refresh process (Your legacy token will expire after this process)\n4. Implement the token refresh flow for ongoing authentication\n5. Use the returned JWT in your `X-Plex-Token` header\n\n\n**Token Refresh:**\n\nJWT tokens expire after 7 days but can be refreshed at any time, including after expiration. Use the token refresh process described above.\n\n### Traditional Token Authentication (Legacy)\n\nYou're developing an app that needs access to a user's Plex account. To do this, you'll need to get access to the user's Access Token. This document details how to check whether an Access Token is valid, and how to obtain a new one.\n\n#### High-level Steps\n\n1. Choose a unique app name, like \"My Cool App\"\n2. Check storage for your app's Client Identifier; generate and store one if none is present.\n3. Check storage for the user's Access Token; if present, verify its validity and carry on.\n4. If an Access Token is missing or invalid, generate a PIN, and store its `id`.\n5. Construct an Auth App url and send the user's browser there to authenticate.\n6. After authentication, check the PIN's `id` to obtain and store the user's Access Token.\n\n#### Detailed Steps\n\n1. Choose a unique app name\n\n The app name you choose will be visible in the user's Authorized Devices view. The name you choose should be different from any existing Plex products.\n\n1. Generate a Client Identifier\n\n The Client Identifier identifies the specific instance of your app. A random string or UUID is sufficient here. There are no hard requirements for Client Identifier length or format, but once one is generated the client should store and re-use this identifier for subsequent requests.\n\n1. Verify stored Access Token validity\n\n You can check whether a user's stored Access Token is valid by requesting user info from the plex.tv API and examining the HTTP status code of the response.\n\n ```\n $ curl -X GET https://plex.tv/api/v2/user \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Product: My Cool App' \\\n -H 'X-Plex-Client-Identifier: ' \\\n -H 'X-Plex-Token: '\n ```\n\n | HTTP Status Code | |\n |-|-|\n | `200` | Access Token is valid |\n | `401` | Access Token is invalid |\n\n If an Access Token is invalid, it should be discarded, and new one should be obtained through the authentication process.\n\n If plex.tv cannot be reached, or if you receive any other status code it indicates an error state, but does not indicate an invalid Access Token.\n\n\n1. Generate a PIN\n\n To sign a user in, the app must create a time-limited PIN. The user is then led through a process to \"claim\" the PIN, associating it with their account and granting the app access to the user's plex.tv account.\n\n ```\n $ curl -X POST https://plex.tv/api/v2/pins?strong=true \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Product: My Cool App' \\\n -H 'X-Plex-Client-Identifier: '\n ```\n\n Note: the `strong=true` header provides a longer length pin which will have a longer lifetime. This is useful in cases where the user is not expected to type in the pin themselves. If not specified, a shorter pin is created but will have a much shorter lifetime.\n\n The response will be a JSON payload; the two important properties are `id` and `code`. Store the `id` locally, and use the `code` to construct the Auth App url.\n\n ```\n {\n \"id\": 564964751,\n \"code\": \"8lzjqnq8lye02n52jq3fqxf8e\",\n …\n }\n ```\n\n1. Checking the PIN\n\n There are two primary ways apps interact with the Auth App and the PIN-claiming process; **Forwarding** and **Polling**.\n\n **Forwarding** is used by web-based apps. A user visits your app in their web browser, leaves your app to authenticate with Plex, and returns to your app via a `forwardUrl` your app provides.\n\n **Polling** is used by native apps running outside of a web browser. A user indicates their intention to sign-in from within your app, and your app opens a web browser pointing to the Auth App where the user completes sign-in. Your app will periodically poll on the generated PIN until it is claimed, or it expires.\n\n1. Construct the Auth App url\n\n The user will authenticate with the plex.tv Auth App through their web browser.\n\n If you're using the **Forwarding** flow, the user will be returned to your app after authenticating where you'll be able to check the created PIN to determine the user's Access Token. The `forwardUrl` to which the user will be returned can carry the PIN `id` which needs to be checked on their return to the app.\n\n Auth App urls are encoded as parameters to the url fragment. Practically, this means that your Auth App url will be prefixed with `https://app.plex.tv/auth#?`; the `#?` at the end indicates the beginning of the url fragment, and that the content of the fragment afterwards is encoded as url parameter key-values pairs.\n\n Append these parameters to construct the final URL.\n\n | Parameter | |\n |----------------------------------|-----------------------------------------------------------------|\n | `clientID` | Your client identifier |\n | `code` | The `code` from the generated PIN |\n | `forwardUrl` | The url to which the user will be returned after authenticating. |\n | `context%5Bdevice%5D%5Bproduct%5D` | The name of your App; ex \"My Cool App\" |\n\n *Example*\n\n ```\n https://app.plex.tv/auth#?clientID=&code=&context%5Bdevice%5D%5Bproduct%5D=My%20Cool%20Plex%20App&forwardUrl=https%3A%2F%2Fmy-cool-plex-app.com\n ```\n\n You can use the [`qs`](https://www.npmjs.com/package/qs) module to encode all necessary parameters, including the nested `context` parameter.\n\n\n ```js\n const authAppUrl =\n 'https://app.plex.tv/auth#?' +\n require('qs').stringify({\n clientID: '',\n code: '',\n forwardUrl: 'https://my-cool-plex-app.com',\n context: {\n device: {\n product: 'My Cool App',\n },\n },\n });\n ```\n\n1. Send user's browser to constructed Auth App url\n\n Once the Auth App URL has been constructed, send the user's browser there to authenticate.\n\n1. Check PIN\n\n If you're using the **Polling** flow, your app should periodically (once per second) check the PIN `id` to determine when the user has signed-in.\n\n If you're using the **Forwarding** flow, check the stored PIN `id` from the PIN creation step. If the PIN has been claimed, the `authToken` field in the response will contain the user's Access Token you need to make API calls on behalf of the user. If authentication failed, the `authToken` field will remain `null`.\n\n ```\n $ curl -X GET 'https://plex.tv/api/v2/pins/' \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Client-Identifier: '\n ```\n### Talking to PMS\n\nOnce you have a token to talk to plex.tv, you will need to obtain a different set of tokens used to talk to PMS instances.\n\n```\n$ curl https://clients.plex.tv/api/v2/resources?includeHttps=1&includeRelay=1&includeIPv6=1 \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Product: My Cool App' \\\n -H 'X-Plex-Client-Identifier: ' \\\n -H 'X-Plex-Token: '\n```\n\nThe response will be a JSON document which will contain available PMS instances, the `accessToken` used in communication with this PMS, and the list of connection URLs where the PMS may be contacted. Connections labeled as `local` should be preferred over those that are not, and `relay` should only be used as a last resort as bandwidth on relay connections is limited.\n", + "description": "# API Info\n## Content Types\nThe API supports responses in both XML and JSON, and clients can request one or the other using the standard `Accept` HTTP header. The default is XML, so JSON will only be returned if it's explicitly requested (`Accept: application/json`). New applications should use JSON.\n\nThroughout the docs, it's common for a examples to be given in JSON only since the JSON response would be preferred for new applications.\n\n## Headers\n\nPMS accept a variety of custom headers that follow the pattern `X-Plex-{name}`. The full set of headers isn't enumerated here since some may only apply to certain endpoints, but common headers that can be included on all requests include:\n\n| Header | Description | Sample |\n| --- | --- | --- |\n| X-Plex-Client-Identifier | An opaque identifier unique to the client | abc123 |\n| X-Plex-Token | An authentication token, obtained from plex.tv | XXXXXXXXXXXX |\n| X-Plex-Product | The name of the client product | Plex for Roku |\n| X-Plex-Version | The version of the client application | 2.4.1 |\n| X-Plex-Platform | The platform of the client | Roku |\n| X-Plex-Platform-Version | The version of the platform | 4.3 build 1057 |\n| X-Plex-Device | A relatively friendly name for the client device | Roku 3 |\n| X-Plex-Model | A potentially less friendly identifier for the device model | 4200X |\n| X-Plex-Device-Vendor | The device vendor | Roku |\n| X-Plex-Device-Name | A friendly name for the client | Living Room TV |\n| X-Plex-Marketplace | The marketplace on which the client application is distributed | googlePlay |\n\n`X-Plex-Client-Identifier` is typically required, as is `X-Plex-Token` for authentication.\n\nThere's no standard way to send non-ASCII values as HTTP headers. We attempt to recognize and parse UTF-8 and ISO-8859-1. If you're sending something that may include non-ASCII characters (often `X-Plex-Device-Name`), use UTF-8 if possible.\n\nThese are referred to as headers throughout documentation, but all `X-Plex-` headers can also be sent as query string arguments.\n\n## Auth\n\nMost endpoints require token based authentication, and the token is expected to be sent in the `X-Plex-Token` header. Tokens are obtained from plex.tv. See the Authenticating with Plex section.\n\n## Paths and Keys\n\nMany parts of the API reference things that can be fetched by their `key`. These keys follow a sort of relative URL resolution pattern. Some examples will help clarify.\n\n- For a request to `/library/sections` that includes an item with a `key` of `home` in the response, that item can be fetched at `/library/sections/home`.\n- For a request to `/library/sections/home` that includes an item with a `key` of `/library/metadata/deadbeef` in the response, that item can be fetched at `/library/metadata/deadbeef`.\n\nWe say this follows a \"sort of\" relative URL resolution pattern because all requests are treated as though they have a trailing slash.\n\n```\n/library/sections/ + home => /library/sections/home\n/library/sections + home => /library/sections/home\n/library/sections + /library/sections/home => /library/sections/home\n```\n\nJust like URL resolution, keys may contain absolute URLs as well, especially absolute `https://...` URLs or custom `view://...` URLs. In these cases the key resolved by simply using it, the parent is irrelevant.\n\nAlso note that the features described in this API can generally be present at a different paths. The `/media/providers` path defines where all features can be found. Note that a PMS can contain multiple providers which will be enumerated here. For simplicity, these docs use the most common, default paths. But when we say that `/library/sections/{id}` is part of the API, what we really mean is that a endpoint exists which is composed of the key for the `content` feature and the key for the library section.\n\nFinally, it's worth noting that many paths can potentially be discovered by walking API responses and fetching `key`s, but paths that aren't documented here aren't part of the API contract, they just happen to exist for a particular provider. For example, a particular content directory might include a directory with `key={baseLibraryPath}/genre`. That's not an official part of the API that's guaranteed to exist for every content directory, it's just a `key` that happened to exist within that content directory.\n\n## Types\n\nMany elements throughout the API have a `type` attribute. These types are meant to give helpful information, such as whether something is a movie library or a TV show library. Some API elements rely on a type number so both are provided below\n\n### List of Metadata Types\n\n| Type Name | Type Number |\n| -- | -- |\n| `movie` | 1 |\n| `show` | 2 |\n| `season` | 3 |\n| `episode` | 4 |\n| `trailer` | 5 |\n| `person` | 7 |\n| `artist` | 8 |\n| `album` | 9 |\n| `track` | 10 |\n| `clip` | 12 |\n| `photo` | 13 |\n| `photoalbum` | 14 |\n| `playlist` | 15 |\n| `playlistfolder` | 16 |\n| `collection` | 18 |\n\nWhen an element has both `type` and `key` attributes, the type describes what will be returned when fetching that key. Some types will return a list of other elements. That list may have a `Meta` element describing the specific types within the list. Consider the following examples:\n\n```json\n[\n {\n \"key\": \"/foo\",\n \"type\": \"movie\",\n \"title\": \"A Movie\"\n },\n {\n \"key\": \"/bar\",\n \"type\": \"collection\",\n \"title\": \"My Favorite Movies\"\n },\n {\n \"key\": \"/baz\",\n \"type\": \"show\",\n \"title\": \"A Show\"\n }\n]\n```\n\nIn each case, the `type` describes what will be returned when fetching the key. One exception is the `/children` key for parents like shows and seasons. It will return a list of children even though the `type` describes the parent.\n\nSome elements may also include an optional `subtype` attribute. The subtype is meant to be a refinement of the type, not a completely different type. One test is trying to explain the type in natural language. `type=\"clip\" subtype=\"news\"` passes the test that \"This is a clip, a news clip specifically.\" Another test is considering the client UI. A client should be functional if it ignores the subtype, and optimized if it respects it. If `type=\"track\" subtype=\"podcast\"`, a client can successfully play the podcast in an audio player based purely on the type, but it may tweak the display or which advanced playback controls are visible based on the subtype.\n\n### List of Metadata Subtypes\n\n- `podcast`\n- `webshow`\n- `news`\n- `photo`\n\n#### Collection Subtypes\n\n- `movie`\n- `show`\n- `artist`\n- `album`\n\n#### Extras Subtypes\n\n- `trailer`\n- `deletedScene`\n- `interview`\n- `musicVideo`\n- `behindTheScenes`\n- `sceneOrSample`\n- `liveMusicVideo`\n- `lyricMusicVideo`\n- `concert`\n- `featurette`\n- `short`\n- `other`\n\n## Sources\n\nSource URIs and attributes make it possible to uniquely reference content outside the local server context without requiring a fixed url. This might be desirable when showing related albums from a friend's shared media server, building a universal play queue, or returning aggregated hubs that span multiple providers. Source components are immutable and act as pointers to a single item or directory in the Plex ecosystem.\n\nA source URI from a media server uses the `server` scheme while a cloud provider uses the `provider` scheme.\n\n```\nserver://{SERVER_ID}/{PROVIDER_ID}/{PATH}\nprovider://{PROVIDER_ID}/{PATH}\n```\n\nAs a single regular expression, that's:\n\n```\n/^(server|provider):\\/\\/([a-fA-F0-9-]+)?\\/?([^/]+)([^\\?]+)\\??(.*)?/\n```\n\nThe server id is the server's `machineIdentifier`. The provider id is the provider's `identifier`. The rest of the path represents the path of the content at the provider and may include additional query parameters like `X-Plex-` headers or media query syntax for sorts and filters.\n\nSome examples may be helpful:\n\n```\nserver://546684a3d18ac5c39037360ec9ce900b7af9cc36/com.plexapp.plugins.library/library/metadata/2814936\nprovider://tv.plex.provider.podcasts/library/sections/audio/all\n```\n\nThe `source` attribute has the same structure as the source URI, but omits the path.\n\n```\n{SOURCE_TYPE}://{SOURCE_ID}/{PROVIDER_ID?}\n```\n```\n/^(server|provider):\\/\\/([a-fA-F0-9-]+)?\\/?([^/]+)$/\n```\n\n```\nsource=\"server://546684a3d18ac5c39037360ec9ce900b7af9cc36/com.plexapp.plugins.library\"\nsource=\"provider://tv.plex.provider.podcasts\"\n```\n\nSource attributes can be used as a base and combined with `key` or other root-relative path components to construct unique source URIs.\n\n## Pagination\n\nMany endpoints that return a list of items support pagination. Additionally some endpoints will force pagination and limit number of elements returned if the client attempts to request all items. To request a specific subset of data, add two headers to specify the starting offset and the number of desired items.\n\n- **X-Plex-Container-Start** - The desired starting offset\n- **X-Plex-Container-Size** - The desired number of items\n\nBoth headers should be sent in order to request paginated content. Note that it's possible to request a size of 0 on supported endpoints in order to learn the total size without actually getting any content.\n\nThe response **must** be checked to see if the response is in fact paginated. The response might not be paginated at all, or it might include a different number of items than what was requested. A paginated response will include the headers:\n\n- **X-Plex-Container-Start** - The offset of the first returned item\n- **X-Plex-Container-Total-Size** - The **total** size of the collection (optional but typically present)\n\nThe response body will also typically include pagination info. If the response is a `MediaContainer`, then it will have `offset` and `size` attributes representing the start index and the number of items in the current response along with an optional `totalSize` attribute for the total number of elements in the collection.\n\n```\nHTTP/1.1 200 OK\nX-Plex-Container-Start: 2\nX-Plex-Container-Total-Size: 5\nContent-Type: application/xml\n\n{\n \"MediaContainer\": {\n \"size\": 3,\n \"totalSize\": 5,\n \"offset\": 2,\n \"Metadata\" : [\n …\n ]\n }\n}\n```\n\nRather than requesting a page starting at an index, it is also possible in some lists to request a page centered on a specific item in the list.\n\n- **X-Plex-Container-Focus-Key** - The key of an item to center on\n- **X-Plex-Container-Size** - The desired number of items\n\nThe requested size is respected regardless of the position of the focus item in the list. If the item is at the start of the list and 10 items are requested, 9 items in the response will be after the item. If the item is in the middle of the list and 10 items are requested, 4 items will be before the item and 5 items will be after.\n\nEndpoints that support rich media queries also have a `limit` parameter that interacts with pagination. Sending `limit` in a query string limits the desired number of items, much like the `X-Plex-Container-Size` header. There are two major differences:\n\n1. When using `limit`, the total size of the collection is not returned. The minimum of the limit and the actual total size will be returned as the total size.\n2. The request may be more efficient when using `limit`, since the total size doesn't have to be known.\n\nIf the total size of the collection isn't needed, use `limit`, since the request may be more efficient.\n\nNote that `limit` and `X-Plex-Container-Size` aren't mutually exclusive. You can page within the results that are bounded by the limit. If you want a total of 1000 items from a collection of many thousands of items, but you want to page through them 20 at a time, you'd use `limit=1000&X-Plex-Container-Size=20&X-Plex-Container-Start=0`.\n\n## API Versioning\n\nPMS has never used API versioning before the creation of this document. The first published API is considered `1.0` with the API prior to publication considered `0.0`. A client species its version via the `X-Plex-Pms-Api-Version` header on requests. If no header is provided, the version `0.0` is assumed.\n\n### API Changes\n - 1.0.0 (Supported in PMS >= 1.41.9)\n - Added `/downloadQueue` endpoints.\n - Public release of API.\n - The `includeFields` parameter has been renamed to `includeOptionalFields`. The `includeFields` parameter now means \"include only these fields\" where in the past it meant \"please add these fields you wouldn't normally include.\" This was changed to be consistent with the cloud provider API.\n\n\n- 1.1.0 (Supported in PMS >= 1.42.0)\n - Added ability to filter '/media/providers/metadata' endpoint by metadata types (PM-3702)\n - Changed `types` in `/playlists/{playlistId}/items` to array of integers.\n - Document the `/photo/:/transcode` endpoints\n - Fixed serialization of MetadataType objects for '/media/providers/metadata' calls.\n\n\n- 1.1.1 (Supported in PMS >= 1.42.2)\n - Added 'metadataAgentProviderGroupId' query param to create and edit library section (PM-3577)\n - Fixed Add library section method type.\n\n\n- 1.2.0 (Supported in PMS >= 1.43.0)\n - Added 'squareArt' as additional element type for image assets (PM-2959)\n - Added `/media/providers/metadata` endpoints (PM-1012)\n - Added delete method for /library/metadata/{id}/{element} (PM-4094)\n - Added documentation for Metadata-type Media Providers (PM-3051)\n\n\n- 1.2.1 (Supported in PMS >= 1.43.1)\n - Added `/tv.plex.providers.epg.{identifier}:{deviceId}` endpoints (PM-4017)\n - Added new state to itemsGeneratorItems endpoint (PM-3475)\n\n\n- 1.2.2 (Supported in PMS >= 1.43.2)\n - Added `audioLayout` endpoint (PM-5118)\n - Added `videoCodec`, `audioCodec`, and `subtitleCodec` endpoints (PM-5117)\n\n\n- 1.2.3 (Supported in PMS >= 1.43.4)\n - Added support for audio enhancements including new MediaContainer fields and the analyzeLoudness endpoint\n\n## Response Customization\n\nMany endpoints allow the data that is included in the response to be tailored to exactly what the client wants. This is possible by either specifying things that should be excluded or the set of things that should be included. PMS's ability to include/exclude elements and fields is currently limited but expanding so this should be used with care.\n\nAttributes can be customized by using a query string arg of either `excludeFields` or `includeFields`. This single parameter should be a comma-separated list of attribute names. For example, a request with `excludeFields=summary,tagline` is asking for the summary and title attributes to be left off any metadata items while the `includeFields` parameter indicated that only the specified fields should be included.\n\nChild elements can be customized by using a query string arg of either `excludeElements` or `includeElements`. This single parameter should be a comma-separated list of element names. For example, a request with `excludeElements=Media` is asking for the `Media` elements to be omitted while the `includeElements` parameter indicated that only the specified elements should be included.\n\nIn addition to the above are the parameters `includeOptionalFields` and `includeOptionalElements`. These indicate that the fields/elements which are not normally included should be included in this request. One example is `includeOptionalElements=musicAnalysis` on metadata will include the `musicAnalysis` parameter which can be large and typically not needed by a client.\n\nTrimming the response to only include what a client will actually use can result in much better performance, especially in large collections. Increasingly these are being used to select which data is fetched from the database. So if a client knows it will only ever use a few parameters from a request, it should specify those with `includeFields`.\n\nNote that these inclusions/exclusions are treated as requests, not guarantees. Some endpoints will disregard them completely, and others may ignore them for specific items and insist on returning data that the client didn't necessarily ask for.\n\n## Media Providers\n\nMedia providers are general purpose entities which supply media to Plex clients. Their API describes the Plex Media Server API, via a set of features on the \"root\" endpoint of the provider. Media provider can be hosted by a media server or in the cloud, linked to a specific Plex account. This section explains media providers generally, and then provides the specific server-hosted APIs around media providers.\n\n### Client Guide to Media Providers\n\nThe philosophy behind media providers in general is to allow a common API between cloud servers and PMS, since the APIs are nearly identical to a normal PMS. The general guidelines are:\n- Consume `/media/providers` instead of `/library/sections`\n\n The new providers endpoint give you a list of all providers exported by a server and their features. Remember that the library itself is considered a (very rich) provider! This change will also require changing the client to not hardwire paths on the server, but rather read them from the feature keys directly (e.g. scrobble and rating endpoints).\n\n- Gate management functionality on the `manage` feature\n\n Server libraries allow management (e.g. media deletion). The correct way to gate this functionality is via the manage feature.\n\n- Make sure key construction is correct for things like genre lists\n\n For example, `/library/sections/x/genre` returns a relative key for each genre, but there's nothing which says that the `key` can't be an absolute URL. This is why servers pass back `fastKey` separately so as to not break clients which don't do key construction correctly. Media providers do not pass back `fastKey`, but assume clients will be doing correct key construction.\n\n- Don't call `/library/sections/X/filters|sorts`\n\n You can get all that information (and more) in a single call by hitting `/library/sections/X?includeDetails=1`. Media providers include the extra information by default.\n\n- Respect the Type keys in `/library/sections/x`\n\n The top-level type pivots have their own keys, which should be used over the old \"just append `/all` to the path and add the type\" approach. Not only is this more flexible, it also allows for \"virtual\" pivots, like music videos inside a music library.\n\n- Look for the `skipChildren`/`skipParent` attributes for shows\n\n Because of things like Podcasts, single-season shows can now be made to skip seasons. This is indicated by a `skipChildren` attribute on the show, or a `skipParent` attribute on an episode. If this is set on a show, the client should use `/grandchildren` instead of `/children` in the show's key.\n\n### Features\n\nThe list of supported features, along with the API endpoints each feature represents is shown in the following list. Note that each feature can define a custom endpoint URL, so it doesn't have to match the server API exactly.\n\n- **search**: This feature implies that it supports search via the provided key.\n\n- **metadata**: This feature implies that it supports metadata endpoint. For example, if the `key` were `/library/metadata` then the endpoints `/library/metadata/X`, `/library/metadata/X/children` and `/library/metadata/X/grandchildren` would be supported. This endpoint family allows browsing a hierarchical tree of media (e.g. show to episodes, or artist to tracks).\n\n- **content**: This feature implies that the provider exposes a content catalog, in the form of libraries to browse (grid of content), or discover (via hubs). Each entry in the content feature can contain:\n\n - `hubKey`: This implies it supports a discovery endpoint with hubs.\n - `key`: This implies it supports a content catalog.\n - `icon`: Optional, specifies the icon used for a content directory.\n\n Each content feature can contain one or both of these keys, depending on the structure. More details on the various combinations are provided below.\n\n- **match**: The match feature is used to match a piece of media to the provider's content catalog via a set of hints. As a specific example, you might pass in a title hint of \"Attack of the 50 Foot Woman\" and a year hint of 1958 for the movie type. The provider would then use all the hints to attempt to match to entries in its catalog.\n\n- **manage**: The manage feature implies a whole host of endpoints around _changing_ data inside a library (e.g. editing fields, customizing artwork, etc.). This feature is generally only available on an actual server and generally only to the admin.\n\n- **timeline**: The timeline feature implies that the provider wants to receive timeline (playback notifications) requests from a client at the endpoint defined by `key`. The feature may additionally specify the `scrobbleKey` and `unscrobbleKey` attributes, which represent the endpoints which allow marking a piece of media played or unplayed.\n\n- **rate**: This feature implies the provider supports the endpoint which allows rating content.\n\n- **playqueue**: This feature implies the provider supports the play queue family of endpoints. The `flavor` attribute further specifies the subset; the only supported flavor is currently `full`.\n\n- **playlist**: This feature implies the provider supports the playlist family of endpoints. If `readonly` is set, that means that the provider only allows listing and playing playlists (via play queue API), not actually creating or editing them.\n\n- **subscribe**: This provider allows media subscriptions to be created. If the flavor is `record` then media can be recorded from this library (such as DVR). If the flavor is `download` then the user is allowed to download from this library.\n\n- **promoted**: This feature allows the provider to supply an endpoint that will return a collection of \"promoted\" hubs that many clients show on a user's home screen.\n\n- **continuewatching**: This feature allows the provider to supply an endpoint that will return a hub for merging into a global Continue Watching hub.\n\n- **collection**: This feature implies the provider supports the collection family of endpoints.\n\n- **actions**\n - **removeFromContinueWatching** - Action to remove an item from continue watching\n\n- **imagetranscoder** - This feature implies the provider supports the image transcoder endpoints used to scale images for clients where memory and processor is at a premium\n\n- **queryParser** - This feature implies the provider supports the media queries language below\n\n- **grid** - This feature implies the provider supports displaying metadata in a grid over time (such as live TV)\n\n##### Home discovery and browsable libraries\n\nShown in the example in [/media/providers](#tag/Provider/operation/getMediaProviders), in this media provider the first content directory is an item with only `hubKey`, meaning it only providers discovery hubs. This is the set of hubs covering the whole library which contains continue watching, recently added, recommendations, etc. It's essentially \"landing page\" for the provider.\n\nThe subsequent directories also have a browse `key`, which means they provide a list view of the content with options for filtering and sorting. EPG providers may have only the `key` and no `hubKey`.\n\n##### Minimal provider\n\nThere's no requirement to provide the content feature, given that there are two other ways to access content within a provider: search and match. The former can contribute to global search, whereas the latter is used for things like the DVR engine; once media subscriptions are set up, they look for matching content using the match feature, and examined using the metadata feature.\n\n##### Deeper Hierarchies\n\nIf you examine an app like Spotify, you'll see many of the concepts here apply to their content hierarchy. Their content screens are either grids or hubs. But one notable difference is that the content hierarchy runs a bit deeper than the examples we've examined thus far. For example, one of the top-level selections is \"Genres & Moods\". Diving into one of the genres leads to a discovery area with different hubs for popular playlists, artists, and albums from the genre. Selecting a mood leads to a grid with popular playlists for the mood. In order to support this sort of hierarchy, we need an extension to the regular library, which is a *content directory*. This allows us to nest content, without losing any of the power and features—for example, the grid with popular playlists could list filters and sorts specific for that grid. This is power you simply don't have with the old channel architecture.\n\n##### Extensions to regular libraries\n\nThis section examines extensions to plain libraries which content providers can use, and which clients need to be aware of.\n\n- **Nested content directories**: In regular libraries, there are fixed types of directories (e.g. shows, or music albums). In content providers, we want to have the ability to display other types of things (e.g. stations, or moods, or genres) as first-class things in a grid or discovery layout. Here's an example of what a nested content directory looks like. Given the `type` of content, the client knows that this directory should be treated like a content directory feature entry.\n\n ```json\n {\n \"Directory\":[\n {\n \"key\":\"foo\",\n \"hubKey\":\"foo2\",\n \"type\":\"content\",\n \"aspectRatio\":\"1:1\",\n \"title\":\"Genres and Moods\"\n }\n ]\n }\n ```\n\n- **Aspect ratio hint**: Because the entities listed in content directories can be arbitrary, it's important to tell the client some information about how they should be displayed. The `thumb` attribute contains no information about aspect ratio, so clients make assumptions based upon known types (e.g. movies are 2:3, episode thumbs are 16:9, etc.). This attributes allows the provider to specify exactly the aspect ratio of the thing being displayed.\n\n## Metadata Providers\n\nThis section describes the specific Media Providers which supply the `metadata` feature. These providers can be created and used in Plex Media Server to supply metadata to items inside Movie and TV Show libraries (music libraries are currently not supported).\n\n### Common Request Headers\n\nThere are a few headers which are common to both the Metadata and Match features. These can be passed as either headers or query parameters.\n\n| Header | Support Required? | Description |\n|--------|-------------------|-------------|\n| X-Plex-Language | No | IETF language tag including the region subtag (e.g. 'en-US', 'de-DE'). Used for localization.\n| X-Plex-Country | No | ISO 3166 two-letter country code. Used primarily to define the country for certification data, or can be used to determine release dates for the specific country.\n| X-Plex-Container-Size | Yes | For paged requests. This determines what the maximum container size should be of a single response.\n| X-Plex-Container-Start | Yes | For paged requests. This determines the starting index for the paged request.\n\n### Response Paging\n\nCertain responses may contain a large number of objects. The consumer may want to limit the size of the MediaContainer by paging through them using the `X-Plex-Container-Size` and `X-Plex-Container-Start` headers/params. Responses should them limit the object count inside the MediaContainer to `X-Plex-Container-Size` and start at the index provided by `X-Plex-Container-Start`.\n\nSee the [Pagination](#pagination) section for more details on how paging works.\n\nThe only two endpoints that require mandatory paging are the Metadata `/children` and `/grandchildren` endpoints as these will potentially contain many items. Passing no paging headers here should only return the first 20 Metadata objects.\n\n### Common return codes\n\nIt is important to return the correct HTTP return codes.\n\n| Code | Common Name | Description |\n|------|-------------|-------------|\n| 200 | OK | An response for an item or match is successfully returned |\n| 404 | Not Found | If an item with the requested ratingKey is not found (Metadata feature only) |\n| 400 | Bad Request | A request was made which cannot be fulfilled because the request is malformed |\n| 500 | Internal Server Error | A request was made which cannot be fulfilled because the server encountered an internal error |\n\n### Response Customization (Optional)\n\nThere may be cases where a reduced response is wanted, i.e. we only want to return specific attributes or exclude specific attributes. These are handled with `includeFields`, `excludeFields`, `includeElements` and `excludeElements`.\n\nInformation on its use can be found in the [Response Customization](#response-customization).\n\nYou may wish to add support for this to keep response sizes down, however it is not required and you can safely ignore when these parameters are passed.\n\n### Metadata Feature\n\nThis is a path to retrieve metadata for a specific piece of content by its id.\n\nIt is called by making a `GET` request to the path defined by the `Metadata` feature inside the root of your provider with the `ratingKey` of the metadata item.\n\nFor example, the request may be something like `GET http://localhost/library/metadata/tmdb-movie-123` which should return a [Metadata Object](#metadata-object) for the item with the `ratingKey` of \"tmdb-movie-123\".\n\nSee some [Example Responses](#example-responses)\n\n#### Supported Query Parameters\n\nThere are some query parameters available to media provider to augment the responses. Not all of these are required to be supported by all providers, support requirement is detailed in the below table.\n\n| Param | Type | Support Required? | Description |\n|-------|------|-------------------|-------------|\n| `includeChildren` | integer (1/0) | Yes (TV Shows/Seasons only) | Returns a [Children Object](#children-object) when the metadata type has direct child objects (e.g. a TV Show should return Season Children)\n| `episodeOrder` | string | No | When making a request that returns seasons in the response, pass back the appropriate season items for the requested [SeasonType id](#seasontype-array-optional). It is expected that if no seasons exist for the requested episodeOrder, that no season data should be returned.\n\n#### Image endpoint (Recommended)\n\nThe Metadata feature should also provide a `/images` path for calls to specific items, e.g. `/library/metadata/tmdb-movie-123/images`. This endpoint should return a [MediaContainer](#mediacontainer) object containing and [Image Array](#image-array-highly-recommended) of all the available image assets for that item.\n\nExample:\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 3,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 3,\n \"Image\": [\n {\n \"type\": \"coverPoster\",\n \"url\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n },\n {\n \"type\": \"background\",\n \"url\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n },\n {\n \"type\": \"clearLogo\",\n \"url\": \"https://image.tmdb.org/t/p/original/rIi0lY2UftYuKDJ4OlIefDdijve.png\",\n }\n ]\n }\n}\n```\n\n### Children and Grandchildren Requests\n\nFor items which contain child items, like TV Shows and Seasons, these types should also respond to requests for `/children` and `/grandchildren`, e.g. `/library/metadata/tmdb-show-123/children`.\n\nFor TV Shows and Seasons this should return a [MediaContainer](#mediacontainer) object with an array of [Metadata Objects](#metadata-object) for their Seasons and Episodes respectively.\n\nIt is required that these two endpoints support paged requests via the `X-Plex-Container-Size` and `X-Plex-Container-Start` headers/params.\n\n### Match Feature\n\nThis is a path to retrieve potential matches to metadata items based on contextual hints passed in your request body. This should return a [MediaContainer Object](#mediacontainer) possibly containing multiple Metadata objects (by default should only return the best result only).\n\nIt is called by making a `POST` request to the path defined by the `Match` feature inside the root of your provider.\n\nThis may be where it is useful supporting [Response Customization](#response-customization-optional) as match responses don't always need to contain the full Metadata object responses.\n\nA request body is required which can contain the attributes listed below.\n\n| Attribute | Type | Support Required? | Optional | Description |\n|-----------|------|-------------------|----------|-------------|\n| `type` | integer | Yes | No | The numeric metadata type for the requested match. See [Metadata Types Table](#metadata-types-table) |\n| `title` | string | Yes | No* | A title for the item. *Movies and TV Shows only. |\n| `parentTitle` | string | Yes | No* | A title for the TV Show. *Seasons only. |\n| `grandparentTitle` | string | Yes | No* | A title for the TV Show. *Episodes only. |\n| `includeChildren` | integer (1/0) | Yes (TV Shows/Seasons only) | Yes* | Returns a [Children Object](#children-object) when the metadata type has direct child objects (e.g. a TV Show should return Season Children). *Is only optional for Movie and Episode types.\n| `episodeOrder` | string | No | Yes | When making a request that returns seasons in the response, pass back the appropriate season items for the requested [SeasonType id](#seasontype-array-optional). It is expected that if no seasons exist for the requested episodeOrder, that no season data should be returned. |\n| `year` | integer | Yes | Yes | The release year for the requested match. |\n| `guid` | string | Yes | Yes | An external id which can help matching precisely (e.g. `tvdb://12345) |\n| `index` | integer | Yes | Yes* | For Seasons, the season number. For Episodes, the episode number. |\n| `parentIndex` | integer | Yes | Yes* | For Episodes, the season number. |\n| `filename` | string | No | Yes | The relative path for the underlying media file. For TV Shows and Seasons this will return the first file found. e.g. `/Movies/Back to the Future (1985).mp4` |\n| `date` | string | Yes | Yes* | When matching an TV Episode, if `index` and `parentIndex` are not available, a date must be passed representing the air date of the episode.\n| `manual` | integer (1/0) | Yes | Yes | When a value of `1` is passed, the response should contain an array of the best matches for the request ordered by highest to lowest confidence. When this value is not passed or is `0`, only the best match should be returned. |\n| `includeAdult` | integer (1/0) | No | Yes | If your provider supports explicit/adult content this value should be taken into consideration when returning responses and any explicit results should be filtered out unless a value of `1` is passed. |\n\n#### Match Example\n\n##### JSON Body\n\n```json\n{\n \"parentTitle\": \"Adventure Time\",\n \"type\": 3,\n \"index\": 8,\n \"filename\": \"TV Shows/Adventure Time/Adventure Time S08E01.mp4\",\n \"includeElements\": \"Metadata,Children\",\n \"includeFields\": \"guid,parentGuid,title,parentTitle,thumb,parentThumb,index,originallyAvailableAt,year,type\",\n \"includeChildren\": 1\n}\n```\n\n##### CURL Command\n\n```\ncurl -X POST \\\n 'http://localhost/library/metadata/matches?X-Plex-Country=US&X-Plex-Language=en-US' \\\n --header 'Accept: application/json' \\\n --header 'Content-Type: application/json' \\\n --data-raw '{\n \"parentTitle\": \"Adventure Time\",\n \"type\": 3,\n \"index\": 8,\n \"filename\": \"TV Shows/Adventure Time/Adventure Time S08E01.mp4\",\n \"includeElements\": \"Metadata,Children\",\n \"includeFields\": \"guid,parentGuid,title,parentTitle,thumb,parentThumb,index,originallyAvailableAt,year,type\",\n \"includeChildren\": 1\n}'\n```\n\n##### Response\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"guid\": \"plex://season/5d9c0939e9d5a1001f4def89\",\n \"type\": \"season\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/zIDoU6YZXE3oz9MNBjE2Ld94Xuu.jpg\",\n \"title\": \"Season 8\",\n \"parentTitle\": \"Adventure Time\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"parentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"index\": 8,\n \"originallyAvailableAt\": \"2016-03-26\",\n \"year\": 2016,\n \"Children\": {\n \"size\": 2,\n \"Metadata\": [\n {\n \"guid\": \"plex://episode/5eeb4fc1d39938003f7753c0\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/3WXclCno2MYKhdnUidQVsPSpolk.jpg\",\n \"title\": \"Broke His Crown\",\n \"parentTitle\": \"Season 8\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/zIDoU6YZXE3oz9MNBjE2Ld94Xuu.jpg\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def89\",\n \"index\": 1,\n \"originallyAvailableAt\": \"2016-03-26\",\n \"year\": 2016\n },\n {\n \"guid\": \"plex://episode/5eeb4fc1d39938003f7753be\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/mhhq4BXNmnZZfzfqsBvZwMvcngt.jpg\",\n \"title\": \"Don't Look\",\n \"parentTitle\": \"Season 8\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/zIDoU6YZXE3oz9MNBjE2Ld94Xuu.jpg\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def89\",\n \"index\": 2,\n \"originallyAvailableAt\": \"2016-04-02\",\n \"year\": 2016\n }\n ]\n }\n }\n ]\n }\n}\n```\n\n## MediaProvider Response\n\nThis document describes the JSON response schema for Plex-compatible metadata-specific Media Providers.\n\nThe root of the Media Provider must return some necessary attributes which define a metadata provider.\n\n### MediaProvider\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `identifier` | string | Yes | Unique identifier for this media provider |\n| `title` | string | Yes | A human readable title for the media provider |\n| `version` | string | No | The version of the API being called |\n| `Feature` | array | Yes | Array containing the features provided by the media provider |\n\n### `Types` Array (Required)\n\nThis defines what metadata types are supported by the provider.\n\nPlease note that is recommended to support one specific metadata parent type per provider as this will make it easier for consumers to combine this provider with others inside Plex Media Server. This is because in order to combine providers, each provider in a combine group must support the types the other supports as well. Limiting the scope of types will make it more widely compatible.\n\nIf you wish to support both movie and TV Shows, consider creating two separate providers. This isn't a hard requirement but is recommended.\n\nWhen supporting TV Shows, it is necessary to add a type for TV Shows, Seasons and Episodes (i.e. types 2, 3 and 4).\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | integer | Yes | The metadata type represented by its numeric value (see mapping table below) |\n| `Scheme` | array | Yes | Array defining the GUID-scheme (the prefix) for items returned by this provider |\n\n### `Scheme` Array (Required)\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `scheme` | string | Yes | The GUID-scheme. Should be identical to the provider identifier. |\n\n#### Metadata Types Table\n\nCustom metadata provider currently support a subset of the full metadata types outline in the [Metadata Types](#metadata-types) section.\n\n| Type Name | Type Number |\n|-----------|-------------|\n| `movie` | 1 |\n| `show` | 2 |\n| `season` | 3 |\n| `episode` | 4 |\n\n### `Feature` Array (Required)\n\nA feature, as its name implies, defines a feature available to the specific provider.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | string | Yes | Feature type (see feature table below) |\n| `key` | string | Yes | API endpoint path to call this feature |\n\n#### Available Features\n\n| Type | Required | Description |\n|------|----------|-------------|\n| metadata | Yes | Path to retrieve metadata for a specific piece of content by its id. See Metadata Feature section. |\n| match | Yes | Path to return a potential match for a specific piece of content using contextual hints. See Match Feature section. |\n\n### Example Response\n\n```json\n{\n \"MediaProvider\": {\n \"identifier\": \"tv.plex.agents.custom.johnz.tmdb\",\n \"title\": \"John Z's TV Show Provider\",\n \"version\": \"1.0.0\",\n \"Types\": [\n {\n \"type\": 2,\n \"Scheme\": [\n {\n \"scheme\": \"tv.plex.agents.custom.johnz.tmdb\"\n }\n ]\n },\n {\n \"type\": 3,\n \"Scheme\": [\n {\n \"scheme\": \"tv.plex.agents.custom.johnz.tmdb\"\n }\n ]\n },\n {\n \"type\": 4,\n \"Scheme\": [\n {\n \"scheme\": \"tv.plex.agents.custom.johnz.tmdb\"\n }\n ]\n }\n ],\n \"Feature\": [\n {\n \"type\": \"metadata\",\n \"key\": \"/library/metadata\"\n },\n {\n \"type\": \"match\",\n \"key\": \"/library/metadata/matches\"\n }\n ]\n }\n}\n```\n\n### Defining an identifier\n\nCustom metadata providers need to provide an identifier using a scheme with the `tv.plex.agents.custom.` prefix. A custom provider can choose its own scheme as long as it is prefixed with this value, for example a provider for a custom TheMovieDB implementation might use a scheme like:\n\n`tv.plex.agents.custom.johnz.tmdb`\n\nIt is important to note that you should try and keep the identifier unique as there is no guarantee that it will be the only provider added to a Plex user's server and could conflict with a another existing provider already in use. So avoid using very generic suffixes like `tmdb`, `tvdb`, etc.\n\nThe characters allowed for your suffix is very strict and can only contain ASCII letters, numbers and periods (`regex [a-zA-Z0-9.]`).\n\nThis identifier must be used as the scheme for the Metadata items the provider returns. See [GUID Construction](#guid-construction).\n\n## Metadata Response\n\nThis section describes the JSON response schema for Plex-compatible metadata responses from Media Providers. This does not describe the Metadata response in its entirety only what is required for Media Provider responses.\n\nThe response consists of a `MediaContainer` object that wraps `Metadata` objects representing the movie, TV show, season or episode data.\n\nThe different metadata types may have specific attributes only returned by that type. e.g. Season and episode types will have some attributes specific to their parent like `parentTitle` which would not be serialized by a movie or TV show type.\n\n### MediaContainer\n\nThe root object that contains metadata and pagination information.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `offset` | integer | The starting position in the result set (always 0 for single items) |\n| `totalSize` | integer | Total number of items in the response (always 1 for single items) |\n| `identifier` | string | The provider identifier (e.g., \"tv.plex.provider.metadata\") |\n| `size` | integer | Number of items in the current response (always 1 for single items) |\n| `Metadata` | array | Array containing a single movie metadata object |\n\n### Metadata Object\n\nThe main object containing all the item information.\n\n#### Core Attributes (applicable to all metadata types)\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `ratingKey` | string | Yes | Unique identifier for this metadata item in Plex |\n| `key` | string | Yes | API endpoint path to retrieve this metadata |\n| `guid` | string | Yes | Global unique identifier in Plex-compatible format. See the 'Guid construction' section. |\n| `type` | string | Yes | Content type (`movie`, `show`, `season` or `episode`) |\n| `title` | string | Yes | The metadata title, e.g. \"Back to the Future\" |\n| `originallyAvailableAt` | string | Yes | Original release date in ISO 8601 format (YYYY-MM-DD) |\n| `thumb` | string | No | A publicly accessible URL to the default poster/thumbnail for the item |\n| `art` | string | No | A publicly accessible URL to the default background artwork for the item |\n| `contentRating` | string | No | Age rating/certification (e.g., \"PG\", \"R\", \"PG-13\"). For non-US ratings please prepend 2-letter country code followed by a forward slash (e.g. za/15) |\n| `originalTitle` | string | No | If the request is made for language that is different to the original language of the release, return the title in its original language. |\n| `titleSort` | string | No | Returned if the content should be sorted by a different value, e.g. \"Quiet Place, A\". This will be added automatically by the media server, so its inclusion is only necessary if you require a specific sorting value which the media server does not accommodate. |\n| `year` | integer | No | Release year |\n| `summary` | string | No | Full plot synopsis |\n| `isAdult` | bool | No | Return `true` for explicit/adult content. |\n\n#### Movie, TV Show and Episode Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `duration` | integer | No | Runtime in milliseconds |\n\n#### Movie and TV Show Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tagline` | string | No | Movie tagline or promotional text |\n| `studio` | string | No | Primary production studio |\n| `theme` | string | No | A publicly accessible URL to an audio snippet of the item's theme music (MP3 only, preferably keep max length to around 30 seconds) |\n\n#### Season and Episode Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `parentRatingKey` | string | Yes | Unique identifier for parent (the TV show for a season and the season for an episode) metadata item in Plex |\n| `parentKey` | string | Yes | API endpoint path to retrieve the parent metadata |\n| `parentGuid` | string | Yes | Global unique identifier in Plex-compatible format for the parent. See the 'Guid construction' section. |\n| `parentType` | string | Yes | the content type of the parent (i.e. `show` for a season, `season` for an episode) |\n| `parentTitle` | string | Yes | The metadata title of the parent. |\n| `parentThumb` | string | No | A publicly accessible URL to the default poster/thubnail for the parent |\n| `index` | integer | Yes | The item index. For a season this is the season number, for an episode it's the episode number |\n\n#### Episode Attributes\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `grandparentRatingKey` | string | Yes | Unique identifier for grandparent (the TV Show item) metadata item in Plex |\n| `grandparentKey` | string | Yes | API endpoint path to retrieve the grandparent metadata |\n| `grandparentGuid` | string | Yes | Global unique identifier in Plex-compatible format for the grandparent. See the 'Guid construction' section. |\n| `grandparentType` | string | Yes | `show` - the content type of the grandparent |\n| `grandparentTitle` | string | Yes | The metadata title of the grandparent e.g. `Adventure Time` |\n| `grandparentThumb` | string | No | A publicly accessible URL to the default poster/thubnail for the grandparent |\n| `parentIndex` | integer | Yes | The season index, e.g. `8` |\n\n#### `Image` Array (Highly Recommended)\n\nArray of all available image assets in various dimensions.\n\nNot all types are required but it is recommended to supply at least \"coverPoster\" (or \"snapshot\" for episode items) and \"background\". \"clearLogo\" and \"backgroundSquare\" are also utilized inside Plex client applications for movies and TV shows and should be supplied to provide the best experience for these types.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `type` | string | Yes | Image type: \"background\", \"backgroundSquare\", \"clearLogo\", \"coverPoster\", \"snapshot\" |\n| `url` | string | Yes | Full URL to the image asset |\n| `alt` | string | No | Alt text for accessibility (typically movie title) |\n\n#### `OriginalImage` Array (Recommended)\n\nThe same attributes as `Image` but provides images in the original language of the content if the requested language doesn't match the original language.\n\n#### `Genre` Array (Recommended)\n\nArray of genres associated with the content.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Display name of the genre (e.g. \"Action\") |\n| `originalTag` | string | No | Original language of genre name if request is made in a language different from the original |\n\n#### `Guid` Array (Optional)\n\nArray of external identifier mappings. This is very useful to provide exact mappings to other metadata providers which can improve matching accuracy and speed when combining multiple metadata providers.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `id` | string | Yes | External ID in format \"provider://id\" (e.g., \"imdb://tt0088763\", \"tmdb://105\") |\n\nInternally supported providers include:\n- `imdb` - IMDb\n- `tmdb` - TheMovieDB\n- `tvdb` - TVDB\n\n#### `Country` Array (Optional)\n\nArray of production countries.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Full country name |\n\n#### People\n\nThere are common attributes among `Role`, `Producer`, `Director` and `Writer` arrays.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Person's full name |\n| `thumb` | string | No | URL to person's photo |\n| `role` | string | No | Character name or role description |\n| `order` | integer | No | Display order in cast list |\n\n#### `Role` Array (Recommended)\n\nArray of cast members and their characters.\n\nSee \"People\" section for attributes.\n\n#### `Director` Array (Recommended)\n\nArray of directors.\n\nSee \"People\" section for attributes.\n\n#### `Producer` Array (Recommended)\n\nArray of producers.\n\nSee \"People\" section for attributes.\n\n#### `Writer` Array (Recommended)\n\nArray of writers/screenwriters.\n\nSee \"People\" section for attributes.\n\n#### `Similar` Array (Optional)\n\nArray of similar titles.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `guid` | string | Yes | GUID for the similar movie |\n| `tag` | string | No | Title of the similar movie |\n\n#### `Studio` Array (Optional)\n\nArray of production studios and companies.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Studio/company name |\n\n#### `Rating` Array (Optional)\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `image` | string | Yes | Image identifier for critic rating badge (see supported identifiers below) |\n| `type` | string | Yes | `audience` or `critic` - always `audience` for user-generated ratings |\n| `value` | float | Yes | The rating represented by a floating point value between 0 and 10 |\n\n#### Rating image identifiers\n\nThese are built-in mappings to display the appropriate badge inside the Plex client. Adding new types is not currently supported.\n\n| Identifier | Source |\n|------------|--------|\n| `imdb://image.rating` | IMDb ratings |\n| `themoviedb://image.rating` | TheMovieDb ratings |\n| `rottentomatoes://image.rating.ripe` | Rotten Tomatoes for critic ratings |\n| `rottentomatoes://image.rating.upright` | Rotten Tomatoes for audience ratings |\n\n#### `Network` Array (Optional)\n\nTV Shows only.\n\nArray of television networks that the TV Show originally aired on.\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `tag` | string | Yes | Network name |\n\n#### `SeasonType` Array (Optional)\n\nTV Shows only.\n\nThe provider must support the `episodeOrdering` query parameter to use this.\n\nArray of available episode orderings for a specific TV Show e.g. (\"DVD Order\", \"Airing Order\", etc.).\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `id` | string | Yes | Unique identifier for the SeasonType, used as query parameter when making requests for TV Shows. ASCII characters only (e.g. \"blurayOrder\") |\n| `source` | string | Yes | The source of the data, e.g. \"tmdb\" |\n| `tag` | string | Yes | A human readable descriptor for the SeasonType, e.g. \"Bluray\" or \"Airing\" |\n| `title` | string | Yes | A full description for the SeasonType as shown in the Plex UI (e.g. \"TheMovieDB (Netflix Order)\") |\n\n#### `Children` Object\n\nThis is required to be supported for TV Shows and Seasons and should only be returned when a request with `includeChildren=1` is passed.\n\nThis is a simplified `MediaContainer` object inside a `Metadata` object which provides an array of child items for the parent object (i.e. when requesting a TV Show, `Children` will contain the list of Seasons of that TV Show).\n\nNote: it is expected that all the child objects be returned in this array. In some edge cases this may result in very large arrays. Please see fit to ensure your provider can handle this and simplify the child objects with only the required attributes if necessary.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `size` | integer | Number of items in the `Metadata` array |\n| `Metadata` | array | Array containing all child `Metadata` objects |\n\n### GUID construction\n\nPlex-compatible GUIDs are constructed out of the following components:\n\n`{scheme}://{metadataType}/{ratingKey}`\n\nFor an item from the Plex metadata provider this will look something like this:\n\n`plex://movie/5d7768244de0ee001fcc7fed`\n\n#### `Scheme` component\n\nCustom metadata providers need to provide a GUID in this same format using a scheme with the `tv.plex.agents.custom.` prefix. The scheme should match the metadata provider's `identifier` (see [Defining an identifier](#defining-an-identifier)), for example a provider for a custom TheMovieDB implementation might use a scheme like:\n\n`tv.plex.agents.custom.johnz.tmdb`\n\n#### `metadataType` component\n\nThis should just be the string representation of the metadata type being returned, i.e. `movie`, `show`, `season` or `episode`.\n\n#### `ratingKey` component\n\nThis value should match the `ratingKey` attribute on the metadata item and is what is used when making a metadata request to the provider (e.g. `http://localhost/library/metadata/{ratingKey}`).\n\nThe `ratingKey` can constist of ASCII letters, numbers, dashes and underscores (`regex [a-zA-Z0-9_-]`).\n\n#### Custom GUID examples\n\nSome valid GUIDs could look like this:\n\n- `tv.plex.agents.custom.johnz.tmdb://movie/tmdb-movie-19934`\n- `tv.plex.agents.custom.barkley.tvdb://show/78874`\n- `tv.plex.agents.custom.finn.imdb://movie/tt0379786`\n\n### Example Responses\n\n#### Movie Type\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"art\": \"https://metadata-static.plex.tv/d/gracenote/dc6be8ceb098b8e14a708786ea071c6e.jpg\",\n \"guid\": \"plex://movie/5d7768244de0ee001fcc7fed\",\n \"key\": \"/library/metadata/5d7768244de0ee001fcc7fed\",\n \"ratingKey\": \"5d7768244de0ee001fcc7fed\",\n \"studio\": \"Universal Pictures\",\n \"summary\": \"Marty McFly, a typical American teenager of the Eighties, is accidentally sent back to 1955 in a plutonium-powered DeLorean \\\"time machine\\\" invented by a slightly mad scientist. During his often hysterical, always amazing trip back in time, Marty must make sure his teenage parents-to-be meet and fall in love to get back to the future.\",\n \"tagline\": \"He was never in time for his classes... He wasn't in time for his dinner... Then one day... he wasn't in his time at all.\",\n \"type\": \"movie\",\n \"thumb\": \"https://metadata-static.plex.tv/9/gracenote/9cf50a3c04a44ff7d53e1134222e3929.jpg\",\n \"duration\": 6960000,\n \"title\": \"Back to the Future\",\n \"contentRating\": \"PG\",\n \"originallyAvailableAt\": \"1985-07-03\",\n \"year\": 1985,\n \"Image\": [\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"background\",\n \"url\": \"https://metadata-static.plex.tv/d/gracenote/dc6be8ceb098b8e14a708786ea071c6e.jpg\"\n },\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"backgroundSquare\",\n \"url\": \"https://metadata-static.plex.tv/a/gracenote/ab63d5222db8e9b9c319b478f81bf1b6.jpg\"\n },\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"clearLogo\",\n \"url\": \"https://metadata-static.plex.tv/f/683a142553/f44fe9b4a2cb1a6eb3eadbd22eb09add.png\"\n },\n {\n \"alt\": \"Back to the Future\",\n \"type\": \"coverPoster\",\n \"url\": \"https://metadata-static.plex.tv/9/gracenote/9cf50a3c04a44ff7d53e1134222e3929.jpg\"\n }\n ],\n \"Genre\": [\n {\n \"tag\": \"Adventure\",\n },\n {\n \"tag\": \"Comedy\",\n },\n {\n \"tag\": \"Science Fiction\",\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt0088763\"\n },\n {\n \"id\": \"tmdb://105\"\n },\n {\n \"id\": \"tvdb://299\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.5\n },\n {\n \"image\": \"rottentomatoes://image.rating.ripe\",\n \"type\": \"critic\",\n \"value\": 9.3\n },\n {\n \"image\": \"rottentomatoes://image.rating.upright\",\n \"type\": \"audience\",\n \"value\": 9.5\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.321\n }\n ],\n \"Country\": [\n {\n \"tag\": \"United States of America\"\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Michael J. Fox\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/835031cfa837a2bee58d4c0c345f617b.jpg\",\n \"role\": \"Marty McFly\"\n },\n {\n \"order\": 2,\n \"tag\": \"Christopher Lloyd\",\n \"thumb\": \"https://metadata-static.plex.tv/2/people/21ab248996f621004036e057a1bad43e.jpg\",\n \"role\": \"Emmett Brown\"\n },\n {\n \"order\": 3,\n \"tag\": \"Crispin Glover\",\n \"thumb\": \"https://metadata-static.plex.tv/4/people/490bb62cd498add695195a06dd0ca87e.jpg\",\n \"role\": \"George McFly\"\n },\n {\n \"order\": 4,\n \"tag\": \"Lea Thompson\",\n \"thumb\": \"https://metadata-static.plex.tv/1/people/170afcdfe5b74c88f5ea5f74a31d107d.jpg\",\n \"role\": \"Lorraine Baines\"\n }\n ],\n \"Director\": [\n {\n \"tag\": \"Robert Zemeckis\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/b6a7e4d5e61c2c4613be3ece75dace8e.jpg\",\n \"role\": \"Director\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Neil Canton\",\n \"thumb\": \"https://metadata-static.plex.tv/4/people/481b0c2f5f012c3a532e2bf48fef1d80.jpg\",\n \"role\": \"Producer\"\n },\n {\n \"tag\": \"Bob Gale\",\n \"thumb\": \"https://metadata-static.plex.tv/people/5d7768244de0ee001fcc80b8.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Robert Zemeckis\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/b6a7e4d5e61c2c4613be3ece75dace8e.jpg\",\n \"role\": \"Writer\"\n },\n {\n \"tag\": \"Bob Gale\",\n \"thumb\": \"https://metadata-static.plex.tv/people/5d7768244de0ee001fcc80b8.jpg\",\n \"role\": \"Writer\"\n }\n ],\n \"Similar\": [\n {\n \"guid\": \"plex://movie/5d776d1023d5a3001f52001d\",\n \"tag\": \"Back to the Future Part II\"\n },\n {\n \"guid\": \"plex://movie/5d776d1723d5a3001f520400\",\n \"tag\": \"The Karate Kid\"\n },\n {\n \"guid\": \"plex://movie/5d776d10fb0d55001f596237\",\n \"tag\": \"Back to the Future Part III\"\n },\n {\n \"guid\": \"plex://movie/5d77682a6f4521001ea99e2c\",\n \"tag\": \"The Breakfast Club\"\n }\n ],\n \"Studio\": [\n {\n \"tag\": \"Universal Pictures\"\n },\n {\n \"tag\": \"Amblin Entertainment\"\n }\n ]\n }\n ]\n }\n}\n```\n\n#### Show Type\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"art\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"guid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"key\": \"/library/metadata/5d9c07f72df347001e3a70b4/children\",\n \"ratingKey\": \"5d9c07f72df347001e3a70b4\",\n \"studio\": \"Frederator Studios\",\n \"summary\": \"Unlikely heroes Finn and Jake are buddies who traverse the mystical Land of Ooo. The best of friends, our heroes always find themselves in the middle of escapades. Finn and Jake depend on each other through thick and thin.\",\n \"type\": \"show\",\n \"theme\": \"https://tvthemes.plexapp.com/152831.mp3\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"duration\": 660000,\n \"title\": \"Adventure Time\",\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2010-04-05\",\n \"year\": 2010,\n \"Image\": [\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"background\",\n \"url\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\"\n },\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"backgroundSquare\",\n \"url\": \"https://metadata-static.plex.tv/1/gracenote/1c09b028e1b15c0325917c51966a47d7.jpg\"\n },\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"clearLogo\",\n \"url\": \"https://metadata-static.plex.tv/9/683a142553/9bf0c95f0dede66fce0e507fbfedc653.png\"\n },\n {\n \"alt\": \"Adventure Time\",\n \"type\": \"coverPoster\",\n \"url\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\"\n }\n ],\n \"Genre\": [\n {\n \"tag\": \"Animation\"\n },\n {\n \"tag\": \"Comedy\"\n },\n {\n \"tag\": \"Action\"\n },\n {\n \"tag\": \"Adventure\"\n },\n {\n \"tag\": \"Family\"\n },\n {\n \"tag\": \"Fantasy\"\n },\n {\n \"tag\": \"Science Fiction\"\n },\n {\n \"tag\": \"Sci-Fi & Fantasy\"\n },\n {\n \"tag\": \"Children\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt1305826\"\n },\n {\n \"id\": \"tmdb://15260\"\n },\n {\n \"id\": \"tvdb://152831\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.6\n },\n {\n \"image\": \"rottentomatoes://image.rating.ripe\",\n \"type\": \"critic\",\n \"value\": 10\n },\n {\n \"image\": \"rottentomatoes://image.rating.upright\",\n \"type\": \"audience\",\n \"value\": 9.4\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.504\n }\n ],\n \"Country\": [\n {\n \"tag\": \"United States of America\"\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n },\n {\n \"order\": 3,\n \"tag\": \"Tom Kenny\",\n \"thumb\": \"https://metadata-static.plex.tv/7/people/7a7654471f4b87c2f8ce757357e860b5.jpg\",\n \"role\": \"Ice King (voice)\"\n },\n {\n \"order\": 4,\n \"tag\": \"Hynden Walch\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/b2588be9b38393facd27de7fc4081720.jpg\",\n \"role\": \"Princess Bubblegum (voice)\"\n },\n {\n \"order\": 5,\n \"tag\": \"Olivia Olson\",\n \"thumb\": \"https://metadata-static.plex.tv/4/people/4eec0b6c6d36f6c4cd0574af354d74aa.jpg\",\n \"role\": \"Marceline the Vampire Queen (voice)\"\n }\n ],\n \"Director\": [\n {\n \"tag\": \"Larry Leichliter\",\n \"role\": \"Director\"\n },\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Director\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Derek Drymon\",\n \"thumb\": \"https://metadata-static.plex.tv/c/people/cb057ffd3860076eb0f0c1fb55c8fef1.jpg\",\n \"role\": \"Producer\"\n },\n {\n \"tag\": \"Kelly Crews\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Tim McKeon\",\n \"role\": \"Writer\"\n },\n {\n \"tag\": \"Sean Jimenez\",\n \"role\": \"Writer\"\n }\n ],\n \"Network\": [\n {\n \"tag\": \"Cartoon Network\"\n }\n ],\n \"SeasonType\": [\n {\n \"id\": \"tmdbAiring\",\n \"source\": \"tmdb\",\n \"tag\": \"Aired\",\n \"title\": \"The Movie Database (Aired)\"\n },\n {\n \"id\": \"tvdbAiring\",\n \"source\": \"tvdb\",\n \"tag\": \"Aired\",\n \"title\": \"TheTVDB (Aired)\"\n },\n {\n \"id\": \"tvdbDvd\",\n \"source\": \"tvdb\",\n \"tag\": \"DVD\",\n \"title\": \"TheTVDB (DVD)\"\n },\n {\n \"id\": \"tvdbAbsolute\",\n \"source\": \"tvdb\",\n \"tag\": \"Absolute\",\n \"title\": \"TheTVDB (Absolute)\"\n }\n ],\n \"Similar\": [\n {\n \"guid\": \"plex://show/611cdc357032b6002cb92e97\",\n \"tag\": \"Adventure Time: Fionna & Cake\"\n },\n {\n \"guid\": \"plex://show/5d9c0875ba6eb9001fba4e43\",\n \"tag\": \"Johnny Bravo\"\n },\n {\n \"guid\": \"plex://show/5d9c084de264b7001fc4088c\",\n \"tag\": \"Regular Show\"\n }\n ],\n \"Studio\": [\n {\n \"tag\": \"Frederator Studios\"\n },\n {\n \"tag\": \"Cartoon Network Studios\"\n }\n ]\n }\n ]\n }\n}\n```\n\n#### Season Type (with `Children`)\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"guid\": \"plex://season/602e59ccfdd281002cddb790\",\n \"key\": \"/library/metadata/602e59ccfdd281002cddb790/children\",\n \"ratingKey\": \"602e59ccfdd281002cddb790\",\n \"type\": \"season\",\n \"thumb\": \"http://assets.fanart.tv/fanart/tv/152831/seasonposter/adventure-time-with-finn-and-jake-5c8d180f9b002.jpg\",\n \"title\": \"Season 10\",\n \"parentTitle\": \"Adventure Time\",\n \"parentType\": \"show\",\n \"parentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"parentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"parentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"parentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"index\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"Season 10\",\n \"type\": \"background\",\n \"url\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\"\n },\n {\n \"alt\": \"Season 10\",\n \"type\": \"backgroundSquare\",\n \"url\": \"https://metadata-static.plex.tv/1/gracenote/1c09b028e1b15c0325917c51966a47d7.jpg\"\n },\n {\n \"alt\": \"Season 10\",\n \"type\": \"coverPoster\",\n \"url\": \"http://assets.fanart.tv/fanart/tv/152831/seasonposter/adventure-time-with-finn-and-jake-5c8d180f9b002.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"tvdb://1823714\"\n }\n ],\n \"Children\": {\n \"size\": 2,\n \"Metadata\": [\n {\n \"guid\": \"plex://episode/5d9c0b7ee98e47001eb2e3a0\",\n \"key\": \"/library/metadata/5d9c0b7ee98e47001eb2e3a0\",\n \"ratingKey\": \"5d9c0b7ee98e47001eb2e3a0\",\n \"summary\": \"A fierce creature is terrorizing the Candy Kingdom but before Finn can slay the beast, he must first overcome a guilty conscience.\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\",\n \"duration\": 660000,\n \"title\": \"The Wild Hunt\",\n \"grandparentTitle\": \"Adventure Time\",\n \"grandparentType\": \"show\",\n \"grandparentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"grandparentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"grandparentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"grandparentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"grandparentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"parentTitle\": \"Season 10\",\n \"parentType\": \"season\",\n \"parentArt\": \"https://metadata-static.plex.tv/9/gracenote/9e06ae7ff36bd8d62fa1600287f80794.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/w8mYplN3ysIJ5DIYYgmfGTvuNzd.jpg\",\n \"parentRatingKey\": \"5d9c0939e9d5a1001f4def80\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def80\",\n \"parentKey\": \"/library/metadata/5d9c0939e9d5a1001f4def80\",\n \"index\": 1,\n \"parentIndex\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"The Wild Hunt\",\n \"type\": \"snapshot\",\n \"url\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt7308394\"\n },\n {\n \"id\": \"tmdb://1418023\"\n },\n {\n \"id\": \"tvdb://6179251\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.3\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 7.9\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Pendleton Ward\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/83eb3402f017498e3a0fd5e44af8d1ae.jpg\",\n \"role\": \"Creator\"\n }\n ]\n },\n {\n \"guid\": \"plex://episode/5d9c0b7ee98e47001eb2e38b\",\n \"key\": \"/library/metadata/5d9c0b7ee98e47001eb2e38b\",\n \"ratingKey\": \"5d9c0b7ee98e47001eb2e38b\",\n \"summary\": \"BMO and Ice King hit the road as door to door salesmen and stumble upon an irresistible opportunity.\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/fvREJ2bNoXM2WAGVPCGa3ryQtJs.jpg\",\n \"duration\": 660000,\n \"title\": \"Always BMO Closing\",\n \"grandparentTitle\": \"Adventure Time\",\n \"grandparentType\": \"show\",\n \"grandparentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"grandparentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"grandparentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"grandparentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"grandparentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"parentTitle\": \"Season 10\",\n \"parentType\": \"season\",\n \"parentArt\": \"https://metadata-static.plex.tv/9/gracenote/9e06ae7ff36bd8d62fa1600287f80794.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/w8mYplN3ysIJ5DIYYgmfGTvuNzd.jpg\",\n \"parentRatingKey\": \"5d9c0939e9d5a1001f4def80\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def80\",\n \"parentKey\": \"/library/metadata/5d9c0939e9d5a1001f4def80\",\n \"index\": 2,\n \"parentIndex\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"Always BMO Closing\",\n \"type\": \"snapshot\",\n \"url\": \"https://image.tmdb.org/t/p/original/fvREJ2bNoXM2WAGVPCGa3ryQtJs.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt7308402\"\n },\n {\n \"id\": \"tmdb://1418024\"\n },\n {\n \"id\": \"tvdb://6305580\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 7.6\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 6.7\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Pendleton Ward\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/83eb3402f017498e3a0fd5e44af8d1ae.jpg\",\n \"role\": \"Creator\"\n }\n ]\n }\n ]\n }\n }\n ]\n }\n}\n```\n\n#### Episode Type\n\n```json\n{\n \"MediaContainer\": {\n \"offset\": 0,\n \"totalSize\": 1,\n \"identifier\": \"tv.plex.provider.metadata\",\n \"size\": 1,\n \"Metadata\": [\n {\n \"guid\": \"plex://episode/5d9c0b7ee98e47001eb2e3a0\",\n \"key\": \"/library/metadata/5d9c0b7ee98e47001eb2e3a0\",\n \"ratingKey\": \"5d9c0b7ee98e47001eb2e3a0\",\n \"summary\": \"A fierce creature is terrorizing the Candy Kingdom but before Finn can slay the beast, he must first overcome a guilty conscience.\",\n \"type\": \"episode\",\n \"thumb\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\",\n \"duration\": 660000,\n \"title\": \"The Wild Hunt\",\n \"grandparentTitle\": \"Adventure Time\",\n \"grandparentType\": \"show\",\n \"grandparentArt\": \"https://image.tmdb.org/t/p/original/3uE9SUywNbj1qSAuYCGgbTTYku5.jpg\",\n \"grandparentThumb\": \"https://image.tmdb.org/t/p/original/qk3eQ8jW4opJ48gFWYUXWaMT4l.jpg\",\n \"grandparentRatingKey\": \"5d9c07f72df347001e3a70b4\",\n \"grandparentGuid\": \"plex://show/5d9c07f72df347001e3a70b4\",\n \"grandparentKey\": \"/library/metadata/5d9c07f72df347001e3a70b4\",\n \"parentTitle\": \"Season 10\",\n \"parentType\": \"season\",\n \"parentArt\": \"https://metadata-static.plex.tv/9/gracenote/9e06ae7ff36bd8d62fa1600287f80794.jpg\",\n \"parentThumb\": \"https://image.tmdb.org/t/p/original/w8mYplN3ysIJ5DIYYgmfGTvuNzd.jpg\",\n \"parentRatingKey\": \"5d9c0939e9d5a1001f4def80\",\n \"parentGuid\": \"plex://season/5d9c0939e9d5a1001f4def80\",\n \"parentKey\": \"/library/metadata/5d9c0939e9d5a1001f4def80\",\n \"index\": 1,\n \"parentIndex\": 10,\n \"contentRating\": \"TV-PG\",\n \"originallyAvailableAt\": \"2017-09-17\",\n \"year\": 2017,\n \"Image\": [\n {\n \"alt\": \"The Wild Hunt\",\n \"type\": \"snapshot\",\n \"url\": \"https://image.tmdb.org/t/p/original/qgKsxcwvkDbAIjUceuDrv2AgtOF.jpg\"\n }\n ],\n \"Guid\": [\n {\n \"id\": \"imdb://tt7308394\"\n },\n {\n \"id\": \"tmdb://1418023\"\n },\n {\n \"id\": \"tvdb://6179251\"\n }\n ],\n \"Rating\": [\n {\n \"image\": \"imdb://image.rating\",\n \"type\": \"audience\",\n \"value\": 8.3\n },\n {\n \"image\": \"themoviedb://image.rating\",\n \"type\": \"audience\",\n \"value\": 7.9\n }\n ],\n \"Role\": [\n {\n \"order\": 1,\n \"tag\": \"Jeremy Shada\",\n \"thumb\": \"https://metadata-static.plex.tv/b/people/ba6413846e4fc49884ec7694d012b198.jpg\",\n \"role\": \"Finn the Human (voice)\"\n },\n {\n \"order\": 2,\n \"tag\": \"John DiMaggio\",\n \"thumb\": \"https://metadata-static.plex.tv/0/people/0a945543418d442fea7ae4948b2a2fda.jpg\",\n \"role\": \"Jake the Dog (voice)\"\n }\n ],\n \"Producer\": [\n {\n \"tag\": \"Adam Muto\",\n \"thumb\": \"https://metadata-static.plex.tv/e/people/e385c2d25614f10d505701e5f590372a.jpg\",\n \"role\": \"Producer\"\n }\n ],\n \"Writer\": [\n {\n \"tag\": \"Pendleton Ward\",\n \"thumb\": \"https://metadata-static.plex.tv/8/people/83eb3402f017498e3a0fd5e44af8d1ae.jpg\",\n \"role\": \"Creator\"\n }\n ]\n }\n ]\n }\n}\n\n```\n\n## Media Queries\n\nMedia queries are a querystring-based filtering language used to select subsets of media. The language is rich, and can express complex expressions for media selection, as well as sorting and grouping.\n\n### Fields\n\nQueries reference fields, which can be of a few types:\n\n - *integer*: numbers\n - *boolean*: true/false\n - *tag*: integers representing tag IDs.\n - *string*: strings\n - *date*: epoch seconds\n - *language*: string in ISO639-2b format.\n\nThese fields are detailed in `Field` elements in the section description endpoint (e.g. `/library/sections/X?includeDetails=1`).\n\n### Operators\n\nGiven that media queries are expressible using querystrings, the operator syntax might look a bit quirky, because a) they have to include the `=` character, and b) characters to the left of the equal sign usually have to be URI encoded.\n\nOperators are defined per type:\n\n - *integer*: `=` (equals), `!=` (not equals), `>>=` (greater than), `<<=` (less than), `<=` (less than or equals), `>=` (greater than or equals)\n - *boolean*: `=0` (false) and `=1` (true)\n - *tag*: `=` (is) and `!=` (is not)\n - *string*: `=` (contains), `!=` (does not contain), `==` (equals), `!==` (does not equal), `<=` (begins with), `>=` (ends with)\n - *date*: `=` (equals), `!=` (not equals), `>>=` (after), `<<=` (before)\n - *language*: `=` (equals), `!=` (not equals)\n\n### Relative Values and Units\n\nFor some types, values can be specified as relative. For dates, epoch seconds can be specified as relative to “now” as follows: `+N` (in N seconds from now and `-N` (N seconds ago).\n\nIn addition, the following unit suffixes can be used on date values:\n\n - *m*: minutes\n - *h*: hours\n - *d*: days\n - *w*: weeks\n - *mon*: months\n - *y*: years\n\nFor example, `>>=-3y` means “within the last 3 years”.\n\n### Field Scoping\n\nSome media is organized hierarchically (e.g. shows), and in those cases, many fields are common to different elements in the hierarchy (e.g. show title vs episode title). The following rules are used to resolve field references.\n\n - A `type` parameter must be included to specify the result type.\n - Any non-qualified field is defaulted to refer to the result type.\n - In order to refer to other levels of the hierarchy, use the scoping operator, e.g. `show.title` or `episode.year`. A query may be comprised of multiple fields from different levels of the hierarchy.\n - the `sourceType` parameter may be used to change the default level to which fields refer. For example, `type=4&sourceType=2&title==24` means “all episodes where the show title is 24”.\n\n### Sorting\n\nThe `sort` parameter is used to indicate an ordering on results. Typically, the sort value is a field (including optional scoping). The `:` character is used to indicate additional features of the sort, and the `,` character is used to include multiple fields to the sort.\n\nFor example, `sort=title,index` means “sort first by title ascending, then by index”. Sort features are:\n\n - *desc*: indicates a descending sort.\n - *nullsLast*: indicates that null values are sorted last.\n\nSort features may be mixed and matched, e.g. `sort=title,index:desc`.\n\n### Grouping\n\nThe `group` parameter is used to group results by a field, similar to the SQL feature `group by`. For example, when listing popular tracks, we use the query `type=10&sort=ratingCount:desc&group=title`, because we don't want multiple tracks with the same name (e.g. same track on different albums) showing up.\n\n### Limits\n\nThe `limit` parameter is used to limit the number of results returned. Because it's implemented on top of the SQL `limit` operator, it currently only operates at the level of the type returned. In other words, `type=10&limit=100` will return at most 100 tracks, but you can't select tracks from a limit of 10 _albums_.\n\n### Boolean Operators\n\nGiven the nature of querystrings, it makes a lot of sense to interpret the `&` character as a boolean AND operator. For example `rating=10&index=5` means “rating is 10 AND index is 5”.\n\nWe leverage the `,` operator to signify the boolean OR operator. SO `rating=1,2,3` means “rating is 1 OR 2 OR 3. Given standard precedence rules, `rating=1,2,3&index=5` is parsed as `(rating = 1 or rating = 2 or rating = 3) and index = 5)`.\n\n### Complex Expressions\n\nThere's only so many expressions you can form using vanilla querystring-to-boolean mapping (essentially, “ANDs of ORs”). In order to fully represent complex boolean expressions, there are a few synthetic additions:\n\n - *push=1* and *pop=1*: These are the equivalent of opening and closing parenthesis.\n - *or=1*: These is an explicit OR operator.\n\nAs an example: `push=1&index=1&or=1&rating=2&pop=1&duration=10` parses into `(index = 1 OR rating = 2) AND duration = 10`. This could not be expressed by the simplified syntax above.\n\nHappy query building!\n\n## Profile Augmentations\n\nThe universal transcode endpoint supports the following header or query string parameter: ```X-Plex-Client-Profile-Extra```.\n\nThe value of this parameter is url-encoded. When url-decoded, it consists of a string expressed in the following (poor man's) BNF grammar:\n\n```\n ::= \"+\" *\n :: = \n ::= \"add-direct-play-profile\" | \"add-limitation\" | \"add-transcode-target-codec\" | \"append-transcode-target-codec\" | \"add-transcode-target\" | \"add-settings\"\n ::= \"(\" ( \"=\" ) \"&\")*\n ::= \n ::= \n```\n\n### add-direct-play-profile\nThis directive augments the set of Direct Play profiles in the client profile. The following parameters are required:\n\n- `type` = \"videoProfile\" | \"musicProfile\" | \"photoProfile\" | \"subtitleProfile\"\n- `container` = * or a comma-separated list of containers\n- `videoCodec` = * or a comma-separated list of video codecs\n- `audioCodec` = * or a comma-separated list of audio codecs\n- `subtitleCodec` = * or a comma-separated list of subtitle formats\n\n`*` means to use all existing matching values in the profile. At least one of the `videoCodec`, `audioCodec` and `subtitleCodec` parameters must not be `*`.\n\n\n#### add-direct-play-profile example\nTo add `ac3` as a video audio codec for mp4 and mov containers:\n\n```\nadd-direct-play-profile(type=videoProfile&container=mp4,mov&videoCodec=*&audioCodec=ac3&subtitleCodec=*)\n```\n\n### add-limitation\nThis directive adds a scoped limitation to the profile. The following parameters are required:\n\n- `scope` = \"videoContainer\" | \"musicContainer\" | \"photoContainer\" | \"videoCodec\" | \"videoAudioCodec\" | \"musicCodec\" | \"subtitleCodec\" | \"transcodeTarget\"\n- `scopeName` = the name of the relevant container or codec\n- `type` = \"match\" | \"notMatch\" | \"upperBound\" | \"lowerBound\"\n- `name` = the name of the limitation\n\nThe following parameters are optional:\n- `isRequired` = true|false (default is false)\n- `allStreams` = true|false (default is false)\n- `replace` = true|false (default is false)\n\nIf the `replace` parameter is true, the limitation will replace any similarly scoped limitations (i.e. identical `scope` and `scopeName`. If false, the new limitation will simply add itself to the list of limitations.\n\nExactly one of the following three parameters is required:\n- `value` = the value of the limitation\n- `substring` = the substring of the limitation\n- `regex` = the regex of the limitation\n\nThe `transcodeTarget` scope exists to attach a limitation to a transcode target. This allows clients to tell the MDE to select a specific transcode target for a context/protocol pair, based on specific information about the media itself. When multiple transcode targets match, the first one in the profile will be selected.\n\n\n#### add-limitation examples\nTo add a limitation on ac3 audio tracks in video media specifying a maximum of 6 channels:\n```\nadd-limitation(scope=videoAudioCodec&scopeName=ac3&type=upperBound&name=audio.channels&value=6)\n```\n\nTo add a limitation on ac3 audio tracks in video media specifying a maximum bitrate:\n```\nadd-limitation(scope=videoAudioCodec&scopeName=ac3&type=upperBound&name=audio.bitrate&value=160)\n```\n\nTo add a limitation on h264 video specifying a maximum level:\n```\nadd-limitation(scope=videoCodec&scopeName=h264&type=upperBound&name=video.level&value=40&isRequired=true)\n```\n\nTo add a limitation to a transcode target:\n```\nadd-limitation(scope=transcodeTarget&scopeName=MyTranscodeProfile&type=upperBound&name=audio.channels&value=2)\n```\n\n### add-transcode-target-codec\nThis directive adds additional codecs to the beginning of the audioCodec and/or subtitleCodec lists for the specified transcode target. The following parameters are required:\n\n- `type` = \"videoProfile\" | \"musicProfile\" | \"photoProfile\" | \"subtitleProfile\"\n\nEither `id` or `context` and `protocol` are required:\n\n- `id` = a transcode target identifier\n- `context` = a transcode context (\"streaming\" | \"static\")\n- `protocol` = a protocol (\"hls\" | \"http\" | \"slss\" ... )\n\nAt least one of the following parameters are also required:\n\n- `videoCodec` = a comma-separated list of videoCodecs, which are added to the set of video codecs on the target.\n- `audioCodec` = a comma-separated list of audioCodecs, which are added to the set of audio codecs on the target.\n- `subtitleCodec` = a comma-separated list of audioCodecs, which are added to the set of subtitle codecs on the target.\n\n#### add-transcode-target-codec example\nTo add `ac3` as an additional transcode target option to a HTTP Live Streaming target:\n\n```\nadd-transcode-target-codec(type=videoProfile&context=streaming&protocol=hls&audioCodec=ac3)\n```\n\n### append-transcode-target-codec\nThis directive appends additional codecs to the end of the audioCodec and/or subtitleCodec lists for the specified transcode target. The parameters are the same as for `add-transcode-target-codec`.\n\n```\nappend-transcode-target-codec(type=videoProfile&context=streaming&protocol=hls&audioCodec=dca)\n```\n\n### add-transcode-target\nThis directive adds a new transcode target. If a transcode target matching the type/context/profile already exists in the profile, then this directive is ignored. The following parameters are required:\n\n- `type` = \"videoProfile\" | \"musicProfile\" | \"photoProfile\" | \"subtitleProfile\"\n- `context` = a transcode context (\"streaming\" | \"static\")\n- `protocol` = a protocol (\"hls\" | \"http\" | \"slss\" ... )\n- `container` = a container\n\nThe following parameters are optional:\n\n- `id` = a transcode target identifier\n- `replace` = true|false (default is false)\n\nIf the `replace` parameter is true, the transcode target will replace any similarly scoped transcode target (i.e. identical `type`, `context` and `protocol`. If false, the augmentation will fail if there is an existing transcode target.\n\nThe following parameters are required, depending on the type:\n\n- `videoCodec` = a video codec (required for video) or a comma-separated list of video codecs\n- `audioCodec` = an audio codec (required for music and video) or a comma-separated list of audio codecs\n- `subtitleCodec` = an subtitle codec (required for subtitles and optional for video) or a comma-separated list of subtitle codecs\n\n#### add-transcode-target examples\n\n```\nadd-transcode-target(type=videoProfile&context=streaming&protocol=http&container=mkv&videoCodec=h264&audioCodec=aac,ac3&subtitleCodec=srt)\n```\n\n```\nadd-transcode-target(type=musicProfile&context=streaming&protocol=http&container=flac&audioCodec=flac)\n```\n\n```\nadd-transcode-target(type=subtitleProfile&context=all&protocol=http&container=webvtt&subtitleCodec=webvtt)\n```\n\n### add-settings\nThis directive overrides global settings for the profile. The parameters are name/value pairs matching existing client profile settings.\n\n```\nadd-settings(DirectPlayStreamSelection=false&RandomAccessDataModel=limited)\n```\n\n## Authenticating with Plex\n\nPlex supports two authentication methods:\n\n### JWT Authentication (Recommended)\n\nPlex now supports JSON Web Token (JWT) authentication that provides better security, shorter token lifespans, and improved protection against potential security breaches.\n\n#### Why JWT Authentication?\n\nThe new JWT system addresses security concerns by:\n- **Short-lived tokens**: Tokens expire after 7 days\n- **Public-key cryptography**: Uses modern cryptographic standards (ED25519) for enhanced security\n- **Better clock synchronization**: Built-in timestamp validation helps devices stay in sync\n\n#### How JWT Authentication Works\n\n**1. Register your public key**\n\nThe new system uses a public-key authentication model where each device uploads a public key (JWK) and then requests short-lived JWT tokens. There are two ways to get started with JWT authentication:\n\n**Option 1: PIN Authentication Flow (Recommended for New Apps)**\n\nThis method allows you to get JWT tokens without needing any existing tokens first. It's the preferred approach for new applications.\n\n**Step 1: Generate a PIN with JWK**\n\n```bash\nPOST https://clients.plex.tv/api/v2/pins\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n\nBody:\n{\n \"jwk\": {\n \"kty\": \"OKP\",\n \"crv\": \"Ed25519\",\n \"x\": \"your-public-key-data\",\n \"kid\": \"your-key-id\",\n \"alg\": \"EdDSA\"\n },\n \"strong\": true\n}\n```\n\n**Step 2: User Authentication**\n\nConstruct the Auth App URL and have the user authenticate:\n```\nhttps://app.plex.tv/auth#?clientID=&code=&context%5Bdevice%5D%5Bproduct%5D=My%20Cool%20Plex%20App&forwardUrl=https%3A%2F%2Fmy-cool-plex-app.com\n```\n\nFor 4-digit pins, you need to use the link page: `https://plex.tv/link/?pin=`\n\n**Step 3: Exchange PIN for JWT Token**\n\n```bash\nGET https://clients.plex.tv/api/v2/pins/?deviceJWT=\n```\n\nThe signed JWT must include:\n- `\"aud\": \"plex.tv\"`\n- `\"iss\": \"\"`\n- `\"kid\"` and `\"alg\"` in the header\n\nYou will get the Plex JWT token in the `authToken` field of the response.\n\n**Option 2: Register your public key with existing tokens (For Existing Apps)**\n\nIf you already have a legacy token, you can use it to register your device for JWT authentication:\n\n```bash\nPOST https://clients.plex.tv/api/v2/auth/jwk\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n X-Plex-Token: your-existing-token\n\nBody:\n{\n \"jwk\": {\n \"kty\": \"OKP\",\n \"crv\": \"Ed25519\",\n \"x\": \"your-public-key-data\",\n \"kid\": \"your-key-id\",\n \"use\": \"sig\",\n \"alg\": \"EdDSA\"\n }\n}\n```\n\nAfter registering your public key, you should follow the same steps described below to refresh your token to get your first JWT.\n\n**2. Token Refresh Process**\n\nOnce registered, your device must refresh its token every 7 days using this three-step process:\n\n**Step 1: Get a Nonce**\n\n```bash\nGET https://clients.plex.tv/api/v2/auth/nonce\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n```\n\nThis returns a unique nonce valid for 5 minutes:\n```json\n{\n \"nonce\": \"7c415b56-8f48-488a-98ab-847ef4460442\"\n}\n```\n\n**Step 2: Create a Device JWT**\n\nYour device creates a JWT containing:\n- The nonce from step 1\n- Required scope permissions (see Scope Details below)\n- Audience set to `plex.tv`\n- Issuer set to your `client_identifier`\n- Signed with your device's private key\n\n**Important JWT Header Requirements:**\n\nYour JWT must include these header fields:\n- `\"kid\"`: The key identifier from your JWK registration\n- `\"alg\"`: Must be `\"EdDSA\"` for ED25519 signatures, or `\"RS256\"` for RSA signatures\n\n**Scope Details:**\n\nThe scope field in your device JWT should contain comma-separated values for the user data you need included in the JWT:\n- `username` - Access to the user's username\n- `email` - Access to the user's email address\n- `friendly_name` - Access to the user's friendly name\n- `restricted` - Access to the user's restricted status\n- `anonymous` - Access to the user's anonymous status\n- `joinedAt` - Access to the user's account creation timestamp\n\n**Example Device JWT Header:**\n\n```json\n{\n \"kid\": \"your-key-id\",\n \"alg\": \"EdDSA\",\n \"typ\": \"JWT\"\n}\n```\n\n**Example Device JWT Payload:**\n\n```json\n{\n \"nonce\": \"7c415b56-8f48-488a-98ab-847ef4460442\",\n \"scope\": \"username,email,friendly_name\",\n \"aud\": \"plex.tv\",\n \"iss\": \"your-client-identifier\",\n \"iat\": 1705785603,\n \"exp\": 1705789203\n}\n```\n\n**Step 3: Exchange for Plex Token**\n\n```bash\nPOST https://clients.plex.tv/api/v2/auth/token\nHeaders:\n X-Plex-Client-Identifier: your-device-identifier\n\nBody:\n{\n \"jwt\": \"your-device-signed-jwt\"\n}\n```\n\nThis returns a new Plex.tv JWT valid for 7 days:\n\n```json\n{\n \"auth_token\": \"eyJraWQiOiJYeVRRN21seXFtVmhJcEo0U1pDZGltdXo3ZjdEYXU1Ym9MLXU2MG5JeEdJIiwidHlwIjoiSldUIiwiYWxnIjoiRWREU0EifQ...\"\n}\n```\n\n**Using Your JWT Token**\n\nOnce you have a JWT token, use it exactly like the old tokens in the `X-Plex-Token` header. Note it can be used to access any Plex.tv endpoint or your Plex Media Server instance:\n\n```bash\nGET http://your-plex-server:32400/library/sections\nHeaders:\n X-Plex-Token: your-jwt-token\n```\n\n#### JWT Authentication Benefits\n\n**Security Features:**\n\n- **Token Rotation**: Automatic expiration every 7 days\n- **Individual Revocation**: Each device can be individually disabled\n- **Cryptographic Verification**: Uses industry-standard ED25519 signatures\n- **Nonce Protection**: Prevents replay attacks\n\n**Developer Experience:**\n\n- **Familiar Interface**: Same `X-Plex-Token` header usage\n- **Automatic Clock Sync**: Built-in timestamp validation\n- **Clear Error Codes**: Specific error responses for different failure modes\n- **Rate Limiting**: Built-in protection against abuse\n\n#### Error Handling\n\nThe JWT system provides clear error responses with specific HTTP status codes:\n\n**Common Error Responses:**\n\n- **498 Token Expired**: Your JWT has expired and needs refresh\n- **422 Signature Verification Failed**: Invalid device signature or JWT structure\n- **422 Thumbprint Already Taken**: JWK already registered by another device\n- **400 Bad Request**: Invalid request format or missing required fields\n- **429 Too Many Requests**: Rate limit exceeded (nonce requests are rate-limited)\n\n**Troubleshooting Tips:**\n\n- **Missing `kid` field**: Ensure your JWT header includes the `kid` field matching your registered JWK\n- **Invalid signature**: Verify your private key matches the public key you registered\n- **Clock synchronization**: Ensure your device's clock is accurate (JWT includes timestamp validation)\n- **Nonce expiration**: Nonces are only valid for 5 minutes - request a new one if yours has expired\n- **Rate limiting**: Nonce requests are rate-limited to prevent abuse\n\n#### Migration Guide\n\n**For New Applications or new users:**\n\n1. Generate an ED25519 key pair for your device\n2. Use the PIN authentication flow (Option 1 above) to register your device and get JWT tokens\n3. Implement the token refresh flow for ongoing authentication\n4. Use the returned JWT in your `X-Plex-Token` header\n\n**To replace legacy tokens of existing applications:**\n\n1. Continue using your current token for now\n2. Register your public key with your existing tokens (Option 2 above)\n3. Generate your first JWT token using the token refresh process (Your legacy token will expire after this process)\n4. Implement the token refresh flow for ongoing authentication\n5. Use the returned JWT in your `X-Plex-Token` header\n\n\n**Token Refresh:**\n\nJWT tokens expire after 7 days but can be refreshed at any time, including after expiration. Use the token refresh process described above.\n\n### Traditional Token Authentication (Legacy)\n\nYou're developing an app that needs access to a user's Plex account. To do this, you'll need to get access to the user's Access Token. This document details how to check whether an Access Token is valid, and how to obtain a new one.\n\n#### High-level Steps\n\n1. Choose a unique app name, like \"My Cool App\"\n2. Check storage for your app's Client Identifier; generate and store one if none is present.\n3. Check storage for the user's Access Token; if present, verify its validity and carry on.\n4. If an Access Token is missing or invalid, generate a PIN, and store its `id`.\n5. Construct an Auth App url and send the user's browser there to authenticate.\n6. After authentication, check the PIN's `id` to obtain and store the user's Access Token.\n\n#### Detailed Steps\n\n1. Choose a unique app name\n\n The app name you choose will be visible in the user's Authorized Devices view. The name you choose should be different from any existing Plex products.\n\n1. Generate a Client Identifier\n\n The Client Identifier identifies the specific instance of your app. A random string or UUID is sufficient here. There are no hard requirements for Client Identifier length or format, but once one is generated the client should store and re-use this identifier for subsequent requests.\n\n1. Verify stored Access Token validity\n\n You can check whether a user's stored Access Token is valid by requesting user info from the plex.tv API and examining the HTTP status code of the response.\n\n ```\n $ curl -X GET https://plex.tv/api/v2/user \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Product: My Cool App' \\\n -H 'X-Plex-Client-Identifier: ' \\\n -H 'X-Plex-Token: '\n ```\n\n | HTTP Status Code | |\n |-|-|\n | `200` | Access Token is valid |\n | `401` | Access Token is invalid |\n\n If an Access Token is invalid, it should be discarded, and new one should be obtained through the authentication process.\n\n If plex.tv cannot be reached, or if you receive any other status code it indicates an error state, but does not indicate an invalid Access Token.\n\n\n1. Generate a PIN\n\n To sign a user in, the app must create a time-limited PIN. The user is then led through a process to \"claim\" the PIN, associating it with their account and granting the app access to the user's plex.tv account.\n\n ```\n $ curl -X POST https://plex.tv/api/v2/pins?strong=true \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Product: My Cool App' \\\n -H 'X-Plex-Client-Identifier: '\n ```\n\n Note: the `strong=true` header provides a longer length pin which will have a longer lifetime. This is useful in cases where the user is not expected to type in the pin themselves. If not specified, a shorter pin is created but will have a much shorter lifetime.\n\n The response will be a JSON payload; the two important properties are `id` and `code`. Store the `id` locally, and use the `code` to construct the Auth App url.\n\n ```\n {\n \"id\": 564964751,\n \"code\": \"8lzjqnq8lye02n52jq3fqxf8e\",\n …\n }\n ```\n\n1. Checking the PIN\n\n There are two primary ways apps interact with the Auth App and the PIN-claiming process; **Forwarding** and **Polling**.\n\n **Forwarding** is used by web-based apps. A user visits your app in their web browser, leaves your app to authenticate with Plex, and returns to your app via a `forwardUrl` your app provides.\n\n **Polling** is used by native apps running outside of a web browser. A user indicates their intention to sign-in from within your app, and your app opens a web browser pointing to the Auth App where the user completes sign-in. Your app will periodically poll on the generated PIN until it is claimed, or it expires.\n\n1. Construct the Auth App url\n\n The user will authenticate with the plex.tv Auth App through their web browser.\n\n If you're using the **Forwarding** flow, the user will be returned to your app after authenticating where you'll be able to check the created PIN to determine the user's Access Token. The `forwardUrl` to which the user will be returned can carry the PIN `id` which needs to be checked on their return to the app.\n\n Auth App urls are encoded as parameters to the url fragment. Practically, this means that your Auth App url will be prefixed with `https://app.plex.tv/auth#?`; the `#?` at the end indicates the beginning of the url fragment, and that the content of the fragment afterwards is encoded as url parameter key-values pairs.\n\n Append these parameters to construct the final URL.\n\n | Parameter | |\n |----------------------------------|-----------------------------------------------------------------|\n | `clientID` | Your client identifier |\n | `code` | The `code` from the generated PIN |\n | `forwardUrl` | The url to which the user will be returned after authenticating. |\n | `context%5Bdevice%5D%5Bproduct%5D` | The name of your App; ex \"My Cool App\" |\n\n *Example*\n\n ```\n https://app.plex.tv/auth#?clientID=&code=&context%5Bdevice%5D%5Bproduct%5D=My%20Cool%20Plex%20App&forwardUrl=https%3A%2F%2Fmy-cool-plex-app.com\n ```\n\n You can use the [`qs`](https://www.npmjs.com/package/qs) module to encode all necessary parameters, including the nested `context` parameter.\n\n\n ```js\n const authAppUrl =\n 'https://app.plex.tv/auth#?' +\n require('qs').stringify({\n clientID: '',\n code: '',\n forwardUrl: 'https://my-cool-plex-app.com',\n context: {\n device: {\n product: 'My Cool App',\n },\n },\n });\n ```\n\n1. Send user's browser to constructed Auth App url\n\n Once the Auth App URL has been constructed, send the user's browser there to authenticate.\n\n1. Check PIN\n\n If you're using the **Polling** flow, your app should periodically (once per second) check the PIN `id` to determine when the user has signed-in.\n\n If you're using the **Forwarding** flow, check the stored PIN `id` from the PIN creation step. If the PIN has been claimed, the `authToken` field in the response will contain the user's Access Token you need to make API calls on behalf of the user. If authentication failed, the `authToken` field will remain `null`.\n\n ```\n $ curl -X GET 'https://plex.tv/api/v2/pins/' \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Client-Identifier: '\n ```\n### Talking to PMS\n\nOnce you have a token to talk to plex.tv, you will need to obtain a different set of tokens used to talk to PMS instances.\n\n```\n$ curl https://clients.plex.tv/api/v2/resources?includeHttps=1&includeRelay=1&includeIPv6=1 \\\n -H 'Accept: application/json' \\\n -H 'X-Plex-Product: My Cool App' \\\n -H 'X-Plex-Client-Identifier: ' \\\n -H 'X-Plex-Token: '\n```\n\nThe response will be a JSON document which will contain available PMS instances, the `accessToken` used in communication with this PMS, and the list of connection URLs where the PMS may be contacted. Connections labeled as `local` should be preferred over those that are not, and `relay` should only be used as a last resort as bandwidth on relay connections is limited.\n", "license": { "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "title": "Plex Media Server", - "version": "1.2.2" + "version": "1.2.3" }, "openapi": "3.1.0", "paths": { @@ -7550,6 +7564,201 @@ ] } }, + "/hubs/popularInLibraries": { + "get": { + "description": "Get the global popular in your libraries hub", + "operationId": "hubsGetPopularInLibraries", + "parameters": [ + { + "description": "Limit hub entry to count items", + "in": "query", + "name": "count", + "schema": { + "type": "integer" + } + }, + { + "description": "Restrict the hub to the given content directory ids", + "in": "query", + "name": "contentDirectoryID", + "schema": { + "items": { + "type": "integer" + }, + "type": "array" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "examples": { + "someHubs": { + "summary": "An example of global hubs", + "value": { + "MediaContainer": { + "Hub": [ + { + "Metadata": [], + "context": "hub.home.continue", + "hubIdentifier": "home.continue", + "hubKey": "/library/metadata/37", + "key": "/hubs/home/continueWatching", + "more": false, + "promoted": true, + "size": 1, + "style": "hero", + "title": "Continue Watching", + "type": "mixed" + }, + { + "Metadata": [], + "context": "hub.home.ondeck", + "hubIdentifier": "home.ondeck", + "hubKey": "/library/metadata/217", + "key": "/hubs/home/onDeck", + "more": false, + "promoted": true, + "size": 1, + "style": "shelf", + "title": "On Deck", + "type": "episode" + }, + { + "Metadata": [], + "context": "hub.home.movies.recent", + "hubIdentifier": "home.movies.recent", + "hubKey": "/library/metadata/146,37,38,67,81,3", + "key": "/hubs/home/recentlyAdded?type=1", + "more": true, + "promoted": true, + "size": 6, + "style": "shelf", + "title": "Recently Added Movies", + "type": "movie" + }, + { + "Metadata": [], + "context": "hub.home.television.recent", + "hubIdentifier": "home.television.recent", + "hubKey": "/library/metadata/192,164,203,155,199,236", + "key": "/hubs/home/recentlyAdded?type=2", + "more": true, + "promoted": true, + "size": 6, + "style": "shelf", + "title": "Recently Added TV", + "type": "mixed" + }, + { + "Metadata": [], + "context": "hub.home.music.recent", + "hubIdentifier": "home.music.recent", + "hubKey": "/library/metadata/370,365,334,308,294,281", + "key": "/hubs/home/recentlyAdded?type=8", + "more": true, + "promoted": true, + "size": 6, + "style": "shelf", + "title": "Recently Added Music", + "type": "album" + }, + { + "Metadata": [], + "context": "hub.home.photos.recent", + "hubIdentifier": "home.photos.recent", + "hubKey": "/library/metadata/3390,3391,3392,3393,4230,4229", + "key": "/hubs/home/recentlyAdded?type=13", + "more": true, + "promoted": true, + "size": 6, + "style": "shelf", + "title": "Recently Added Photos", + "type": "photo" + }, + { + "Metadata": [], + "context": "hub.home.videos.recent", + "hubIdentifier": "home.videos.recent", + "hubKey": "/library/metadata/3376,3339,3340,3341,3342,3343", + "key": "/hubs/home/recentlyAdded?type=1&personal=1", + "more": true, + "promoted": true, + "size": 6, + "style": "shelf", + "title": "Recently Added Videos", + "type": "clip" + }, + { + "Metadata": [], + "context": "hub.home.playlists", + "hubIdentifier": "home.playlists", + "hubKey": "/library/metadata/3373,3225", + "key": "/playlists/all?type=15&sort=lastViewedAt:desc&playlistType=video,audio", + "more": false, + "promoted": true, + "size": 2, + "style": "shelf", + "title": "Recent Playlists", + "type": "playlist" + } + ], + "allowSync": true, + "identifier": "com.plexapp.plugins.library", + "size": 8 + } + } + } + }, + "schema": { + "properties": { + "MediaContainer": { + "allOf": [ + { + "$ref": "#/components/schemas/MediaContainer" + }, + { + "properties": { + "Hub": { + "items": { + "$ref": "#/components/schemas/hub" + }, + "type": "array" + } + }, + "type": "object" + } + ] + } + }, + "type": "object" + } + } + }, + "description": "OK", + "headers": { + "X-Plex-Container-Start": { + "description": "Provided on all MediaContainer objects indicating the offset of where this container page starts", + "schema": { + "type": "integer" + } + }, + "X-Plex-Container-Total-Size": { + "description": "Provided on all MediaContainer objects indicating the total size of objects available", + "schema": { + "type": "integer" + } + } + } + } + }, + "summary": "Get the popular in your libraries hub", + "tags": [ + "Hubs" + ] + } + }, "/hubs/promoted": { "get": { "description": "Get the global hubs which are promoted (should be displayed on the home screen)", @@ -11067,6 +11276,64 @@ ] } }, + "/library/metadata/{ids}/analyzeLoudness": { + "put": { + "description": "Detect loudness properties of all audio streams", + "operationId": "libraryMetadataPutAnalyzeLoudness", + "parameters": [ + { + "in": "path", + "name": "ids", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Indicate whether detection should be re-run", + "in": "query", + "name": "force", + "required": false, + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, + { + "description": "Indicate whether detection is manually run", + "in": "query", + "name": "manual", + "required": false, + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/200" + } + }, + "security": [ + { + "user_token": [ + "admin" + ] + } + ], + "summary": "Detect loudness of audio streams", + "tags": [ + "Library" + ] + } + }, "/library/metadata/{ids}/chapterThumbs": { "put": { "description": "Start the chapter thumb generation for an item", @@ -27692,6 +27959,9 @@ "autoAdjustSubtitle": { "type": "boolean" }, + "boostDialog": { + "type": "boolean" + }, "directPlay": { "type": "boolean" }, @@ -27710,6 +27980,9 @@ "musicBitrate": { "type": "integer" }, + "normalizeLoudness": { + "type": "boolean" + }, "peakBitrate": { "type": "integer" }, @@ -30530,6 +30803,32 @@ "type": "integer" } }, + { + "description": "Indicates if the server should normalize the loudness of an audio track based on loudness analysis results.", + "example": 1, + "in": "query", + "name": "normalizeLoudness", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, + { + "description": "Indicates if the server boost the dialog found within an audio track.", + "example": 1, + "in": "query", + "name": "boostDialog", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, { "description": "Indicates the client supports ABR.", "example": 1, @@ -31126,6 +31425,32 @@ "type": "integer" } }, + { + "description": "Indicates if the server should normalize the loudness of an audio track based on loudness analysis results.", + "example": 1, + "in": "query", + "name": "normalizeLoudness", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, + { + "description": "Indicates if the server boost the dialog found within an audio track.", + "example": 1, + "in": "query", + "name": "boostDialog", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, { "description": "Indicates the client supports ABR.", "example": 1, @@ -31540,6 +31865,32 @@ "type": "integer" } }, + { + "description": "Indicates if the server should normalize the loudness of an audio track based on loudness analysis results.", + "example": 1, + "in": "query", + "name": "normalizeLoudness", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, + { + "description": "Indicates if the server boost the dialog found within an audio track.", + "example": 1, + "in": "query", + "name": "boostDialog", + "schema": { + "enum": [ + 0, + 1 + ], + "type": "integer" + } + }, { "description": "Indicates the client supports ABR.", "example": 1,