diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 5d14502..3358b0d 100755 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: 5d77204e-e413-4fd0-a14a-bad3aee2247a management: - docChecksum: 71aea44b27d124ce7bc7da09090777b5 + docChecksum: 68de03e6e877c4fc50ebfdd47bb117ac docVersion: 0.0.3 speakeasyVersion: 1.405.6 generationVersion: 2.428.1 - releaseVersion: 0.10.3 - configChecksum: dcd7ce4467e633ce1e902da38de6e695 + releaseVersion: 0.10.5 + configChecksum: 790454501490a723d47f574b8b1648a7 repoURL: https://github.com/LukeHagar/plexswift.git features: swift: @@ -73,6 +73,7 @@ generatedFiles: - Sources/Plexswift/internal/models/GetAllMediaLibraryActiveDirection+Serialization.swift - Sources/Plexswift/internal/models/GetAllMediaLibraryDefaultDirection+Serialization.swift - Sources/Plexswift/internal/models/GetAllMediaLibraryHasThumbnail+Serialization.swift + - Sources/Plexswift/internal/models/GetAllMediaLibraryLibrary1+Serialization.swift - Sources/Plexswift/internal/models/GetAllMediaLibraryLibraryOptimizedForStreaming+Serialization.swift - Sources/Plexswift/internal/models/GetAllMediaLibraryLibraryResponseType+Serialization.swift - Sources/Plexswift/internal/models/GetAllMediaLibraryLibraryType+Serialization.swift @@ -92,9 +93,6 @@ generatedFiles: - Sources/Plexswift/internal/models/GetLibraryHubsRequest+Serialization.swift - Sources/Plexswift/internal/models/GetLibraryItemsActiveDirection+Serialization.swift - Sources/Plexswift/internal/models/GetLibraryItemsDefaultDirection+Serialization.swift - - Sources/Plexswift/internal/models/GetLibraryItemsEnableCreditsMarkerGeneration+Serialization.swift - - Sources/Plexswift/internal/models/GetLibraryItemsEpisodeSort+Serialization.swift - - Sources/Plexswift/internal/models/GetLibraryItemsFlattenSeasons+Serialization.swift - Sources/Plexswift/internal/models/GetLibraryItemsHasThumbnail+Serialization.swift - Sources/Plexswift/internal/models/GetLibraryItemsLibraryActiveDirection+Serialization.swift - Sources/Plexswift/internal/models/GetLibraryItemsLibraryDefaultDirection+Serialization.swift @@ -104,7 +102,6 @@ generatedFiles: - Sources/Plexswift/internal/models/GetLibraryItemsQueryParamIncludeMeta+Serialization.swift - Sources/Plexswift/internal/models/GetLibraryItemsQueryParamType+Serialization.swift - Sources/Plexswift/internal/models/GetLibraryItemsRequest+Serialization.swift - - Sources/Plexswift/internal/models/GetLibraryItemsShowOrdering+Serialization.swift - Sources/Plexswift/internal/models/GetMediaMetaData1+Serialization.swift - Sources/Plexswift/internal/models/GetMediaMetaDataHasThumbnail+Serialization.swift - Sources/Plexswift/internal/models/GetMediaMetaDataLibrary1+Serialization.swift @@ -118,11 +115,13 @@ generatedFiles: - Sources/Plexswift/internal/models/GetPlaylistContentsRequest+Serialization.swift - Sources/Plexswift/internal/models/GetPlaylistRequest+Serialization.swift - Sources/Plexswift/internal/models/GetPlaylistsRequest+Serialization.swift + - Sources/Plexswift/internal/models/GetRecentlyAdded1+Serialization.swift - Sources/Plexswift/internal/models/GetRecentlyAddedActiveDirection+Serialization.swift - Sources/Plexswift/internal/models/GetRecentlyAddedDefaultDirection+Serialization.swift - Sources/Plexswift/internal/models/GetRecentlyAddedHubsResponseType+Serialization.swift - Sources/Plexswift/internal/models/GetRecentlyAddedHubsType+Serialization.swift - Sources/Plexswift/internal/models/GetRecentlyAddedLibraryRequest+Serialization.swift + - Sources/Plexswift/internal/models/GetRecentlyAddedOptimizedForStreaming+Serialization.swift - Sources/Plexswift/internal/models/GetRecentlyAddedRequest+Serialization.swift - Sources/Plexswift/internal/models/GetRefreshLibraryMetadataRequest+Serialization.swift - Sources/Plexswift/internal/models/GetResizedPhotoRequest+Serialization.swift @@ -363,8 +362,10 @@ generatedFiles: - Sources/Plexswift/models/operations/GetAllMediaLibraryFieldType.swift - Sources/Plexswift/models/operations/GetAllMediaLibraryFilter.swift - Sources/Plexswift/models/operations/GetAllMediaLibraryGenre.swift + - Sources/Plexswift/models/operations/GetAllMediaLibraryGuids.swift - Sources/Plexswift/models/operations/GetAllMediaLibraryHasThumbnail.swift - Sources/Plexswift/models/operations/GetAllMediaLibraryImage.swift + - Sources/Plexswift/models/operations/GetAllMediaLibraryLibrary1.swift - Sources/Plexswift/models/operations/GetAllMediaLibraryLibraryErrors.swift - Sources/Plexswift/models/operations/GetAllMediaLibraryLibraryOptimizedForStreaming.swift - Sources/Plexswift/models/operations/GetAllMediaLibraryLibraryResponseType.swift @@ -514,13 +515,10 @@ generatedFiles: - Sources/Plexswift/models/operations/GetLibraryItemsCountry.swift - Sources/Plexswift/models/operations/GetLibraryItemsDefaultDirection.swift - Sources/Plexswift/models/operations/GetLibraryItemsDirector.swift - - Sources/Plexswift/models/operations/GetLibraryItemsEnableCreditsMarkerGeneration.swift - - Sources/Plexswift/models/operations/GetLibraryItemsEpisodeSort.swift - Sources/Plexswift/models/operations/GetLibraryItemsErrors.swift - Sources/Plexswift/models/operations/GetLibraryItemsField.swift - Sources/Plexswift/models/operations/GetLibraryItemsFieldType.swift - Sources/Plexswift/models/operations/GetLibraryItemsFilter.swift - - Sources/Plexswift/models/operations/GetLibraryItemsFlattenSeasons.swift - Sources/Plexswift/models/operations/GetLibraryItemsGenre.swift - Sources/Plexswift/models/operations/GetLibraryItemsHasThumbnail.swift - Sources/Plexswift/models/operations/GetLibraryItemsImage.swift @@ -538,9 +536,7 @@ generatedFiles: - Sources/Plexswift/models/operations/GetLibraryItemsLocation.swift - Sources/Plexswift/models/operations/GetLibraryItemsMedia.swift - Sources/Plexswift/models/operations/GetLibraryItemsMediaContainer.swift - - Sources/Plexswift/models/operations/GetLibraryItemsMediaGuid.swift - Sources/Plexswift/models/operations/GetLibraryItemsMeta.swift - - Sources/Plexswift/models/operations/GetLibraryItemsMetaDataRating.swift - Sources/Plexswift/models/operations/GetLibraryItemsMetadata.swift - Sources/Plexswift/models/operations/GetLibraryItemsOperator.swift - Sources/Plexswift/models/operations/GetLibraryItemsOptimizedForStreaming.swift @@ -551,7 +547,6 @@ generatedFiles: - Sources/Plexswift/models/operations/GetLibraryItemsResponse.swift - Sources/Plexswift/models/operations/GetLibraryItemsResponseBody.swift - Sources/Plexswift/models/operations/GetLibraryItemsRole.swift - - Sources/Plexswift/models/operations/GetLibraryItemsShowOrdering.swift - Sources/Plexswift/models/operations/GetLibraryItemsSort.swift - Sources/Plexswift/models/operations/GetLibraryItemsStream.swift - Sources/Plexswift/models/operations/GetLibraryItemsType.swift @@ -576,10 +571,12 @@ generatedFiles: - Sources/Plexswift/models/operations/GetMediaMetaDataMetadata.swift - Sources/Plexswift/models/operations/GetMediaMetaDataOptimizedForStreaming.swift - Sources/Plexswift/models/operations/GetMediaMetaDataPart.swift + - Sources/Plexswift/models/operations/GetMediaMetaDataProducer.swift - Sources/Plexswift/models/operations/GetMediaMetaDataRequest.swift - Sources/Plexswift/models/operations/GetMediaMetaDataResponse.swift - Sources/Plexswift/models/operations/GetMediaMetaDataResponseBody.swift - Sources/Plexswift/models/operations/GetMediaMetaDataRole.swift + - Sources/Plexswift/models/operations/GetMediaMetaDataSimilar.swift - Sources/Plexswift/models/operations/GetMediaMetaDataStream.swift - Sources/Plexswift/models/operations/GetMediaMetaDataUltraBlurColors.swift - Sources/Plexswift/models/operations/GetMediaMetaDataUnauthorized.swift @@ -609,18 +606,6 @@ generatedFiles: - Sources/Plexswift/models/operations/GetMyPlexAccountResponseBody.swift - Sources/Plexswift/models/operations/GetMyPlexAccountServerErrors.swift - Sources/Plexswift/models/operations/GetMyPlexAccountUnauthorized.swift - - Sources/Plexswift/models/operations/GetOnDeckBadRequest.swift - - Sources/Plexswift/models/operations/GetOnDeckErrors.swift - - Sources/Plexswift/models/operations/GetOnDeckGuids.swift - - Sources/Plexswift/models/operations/GetOnDeckLibraryErrors.swift - - Sources/Plexswift/models/operations/GetOnDeckMedia.swift - - Sources/Plexswift/models/operations/GetOnDeckMediaContainer.swift - - Sources/Plexswift/models/operations/GetOnDeckMetadata.swift - - Sources/Plexswift/models/operations/GetOnDeckPart.swift - - Sources/Plexswift/models/operations/GetOnDeckResponse.swift - - Sources/Plexswift/models/operations/GetOnDeckResponseBody.swift - - Sources/Plexswift/models/operations/GetOnDeckStream.swift - - Sources/Plexswift/models/operations/GetOnDeckUnauthorized.swift - Sources/Plexswift/models/operations/GetPinAuthPinContainer.swift - Sources/Plexswift/models/operations/GetPinBadRequest.swift - Sources/Plexswift/models/operations/GetPinErrors.swift @@ -661,6 +646,7 @@ generatedFiles: - Sources/Plexswift/models/operations/GetPlaylistsResponse.swift - Sources/Plexswift/models/operations/GetPlaylistsResponseBody.swift - Sources/Plexswift/models/operations/GetPlaylistsUnauthorized.swift + - Sources/Plexswift/models/operations/GetRecentlyAdded1.swift - Sources/Plexswift/models/operations/GetRecentlyAddedActiveDirection.swift - Sources/Plexswift/models/operations/GetRecentlyAddedDefaultDirection.swift - Sources/Plexswift/models/operations/GetRecentlyAddedField.swift @@ -690,6 +676,7 @@ generatedFiles: - Sources/Plexswift/models/operations/GetRecentlyAddedMediaContainer.swift - Sources/Plexswift/models/operations/GetRecentlyAddedMetadata.swift - Sources/Plexswift/models/operations/GetRecentlyAddedOperator.swift + - Sources/Plexswift/models/operations/GetRecentlyAddedOptimizedForStreaming.swift - Sources/Plexswift/models/operations/GetRecentlyAddedRequest.swift - Sources/Plexswift/models/operations/GetRecentlyAddedResponse.swift - Sources/Plexswift/models/operations/GetRecentlyAddedResponseBody.swift @@ -1046,6 +1033,7 @@ generatedFiles: - Sources/Plexswift/models/operations/QueryParamOnlyTransient.swift - Sources/Plexswift/models/operations/QueryParamSmart.swift - Sources/Plexswift/models/operations/QueryParamType.swift + - Sources/Plexswift/models/operations/Rating.swift - Sources/Plexswift/models/operations/Ratings.swift - Sources/Plexswift/models/operations/Release.swift - Sources/Plexswift/models/operations/ResponseBody.swift @@ -1525,7 +1513,7 @@ examples: X-Plex-Container-Size: 50 responses: "200": - application/json: {"MediaContainer": {"size": 50, "identifier": "com.plexapp.plugins.library", "allowSync": false, "Meta": {"Type": [{"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}], "FieldType": [{"type": "tag", "Operator": [{"key": "=", "title": "is"}]}, {"type": "tag", "Operator": []}, {"type": "tag", "Operator": []}]}, "Metadata": [{"ratingKey": "58683", "key": "/library/metadata/58683", "guid": "plex://movie/5d7768ba96b655001fdc0408", "studio": "20th Century Studios", "skipChildren": false, "librarySectionID": 1, "librarySectionTitle": "Movies", "librarySectionKey": "/library/sections/1", "type": "movie", "title": "Avatar: The Way of Water", "slug": "4-for-texas", "contentRating": "PG-13", "summary": "Jake Sully lives with his newfound family formed on the extrasolar moon Pandora. Once a familiar threat returns to finish what was previously started, Jake must work with Neytiri and the army of the Na'vi race to protect their home.", "rating": 7.6, "audienceRating": 9.2, "year": 2022, "seasonCount": 2022, "tagline": "Return to Pandora.", "flattenSeasons": "1", "episodeSort": "0", "enableCreditsMarkerGeneration": "-1", "showOrdering": "absolute", "thumb": "/library/metadata/58683/thumb/1703239236", "art": "/library/metadata/58683/art/1703239236", "banner": "/library/metadata/58683/banner/1703239236", "duration": 11558112, "originallyAvailableAt": "2022-12-14T00:00:00Z", "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "rottentomatoes://image.rating.upright", "chapterSource": "media", "primaryExtraKey": "/library/metadata/58684", "ratingImage": "rottentomatoes://image.rating.ripe", "grandparentRatingKey": "66", "grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentKey": "/library/metadata/66", "grandparentTitle": "Caprica", "grandparentThumb": "/library/metadata/66/thumb/1705716261", "parentSlug": "alice-in-borderland-2020", "grandparentSlug": "alice-in-borderland-2020", "grandparentArt": "/library/metadata/66/art/1705716261", "grandparentTheme": "/library/metadata/66/theme/1705716261", "Media": [{"id": 119534, "duration": 11558112, "bitrate": 25025, "width": 3840, "height": 2072, "aspectRatio": 1.85, "audioProfile": "dts", "audioChannels": 6, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": [{"id": 119542, "key": "/library/parts/119542/1680457526/file.mkv", "duration": 11558112, "file": "/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv", "size": 36158371307, "container": "mkv", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "videoProfile": "main 10", "indexes": "sd", "hasThumbnail": "1", "Stream": [{"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}, {"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}]}, {"id": 119542, "key": "/library/parts/119542/1680457526/file.mkv", "duration": 11558112, "file": "/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv", "size": 36158371307, "container": "mkv", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "videoProfile": "main 10", "indexes": "sd", "hasThumbnail": "1", "Stream": [{"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}]}]}], "Genre": [{"tag": "Adventure"}], "Country": [{"tag": "United States of America"}], "Director": [{"tag": "James Cameron"}, {"tag": "James Cameron"}], "Writer": [{"tag": "James Cameron"}], "Collection": [{"tag": "Working NL Subs"}], "Role": [{"id": 294129, "filter": "actor=294129", "thumb": "https://metadata-static.plex.tv/2/people/27b85844536c39f3f9ac943aaad46608.jpg", "tag": "Mike Smith", "tagKey": "668e7e7b22bcad9064350c91", "role": "Self"}, {"id": 294129, "filter": "actor=294129", "thumb": "https://metadata-static.plex.tv/2/people/27b85844536c39f3f9ac943aaad46608.jpg", "tag": "Mike Smith", "tagKey": "668e7e7b22bcad9064350c91", "role": "Self"}, {"id": 294129, "filter": "actor=294129", "thumb": "https://metadata-static.plex.tv/2/people/27b85844536c39f3f9ac943aaad46608.jpg", "tag": "Mike Smith", "tagKey": "668e7e7b22bcad9064350c91", "role": "Self"}], "Location": [{"path": "/TV Shows/House"}, {"path": "/TV Shows/House"}, {"path": "/TV Shows/House"}], "Guid": [{"id": "imdb://tt13015952"}], "UltraBlurColors": {"topLeft": "11333b", "topRight": "0a232d", "bottomRight": "73958", "bottomLeft": "1f5066"}, "Rating": [{"image": "themoviedb://image.rating", "value": 3, "type": "audience"}, {"image": "themoviedb://image.rating", "value": 3, "type": "audience"}, {"image": "themoviedb://image.rating", "value": 3, "type": "audience"}], "Image": [{"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}], "titleSort": "Whale", "viewCount": 1, "lastViewedAt": 1682752242, "originalTitle": "映画 ブラッククローバー 魔法帝の剣", "viewOffset": 5222500, "skipCount": 1, "index": 1, "theme": "/library/metadata/1/theme/1705636920", "leafCount": 14, "viewedLeafCount": 0, "childCount": 1, "hasPremiumExtras": "1", "hasPremiumPrimaryExtra": "1", "parentRatingKey": "66", "parentGuid": "plex://show/5d9c081b170e24001f2a7be4", "parentStudio": "UCP", "parentKey": "/library/metadata/66", "parentTitle": "Caprica", "parentIndex": 1, "parentYear": 2010, "parentThumb": "/library/metadata/66/thumb/1705716261", "parentTheme": "/library/metadata/66/theme/1705716261"}, {"ratingKey": "58683", "key": "/library/metadata/58683", "guid": "plex://movie/5d7768ba96b655001fdc0408", "studio": "20th Century Studios", "skipChildren": false, "librarySectionID": 1, "librarySectionTitle": "Movies", "librarySectionKey": "/library/sections/1", "type": "movie", "title": "Avatar: The Way of Water", "slug": "4-for-texas", "contentRating": "PG-13", "summary": "Jake Sully lives with his newfound family formed on the extrasolar moon Pandora. Once a familiar threat returns to finish what was previously started, Jake must work with Neytiri and the army of the Na'vi race to protect their home.", "rating": 7.6, "audienceRating": 9.2, "year": 2022, "seasonCount": 2022, "tagline": "Return to Pandora.", "flattenSeasons": "1", "episodeSort": "0", "enableCreditsMarkerGeneration": "-1", "showOrdering": "absolute", "thumb": "/library/metadata/58683/thumb/1703239236", "art": "/library/metadata/58683/art/1703239236", "banner": "/library/metadata/58683/banner/1703239236", "duration": 11558112, "originallyAvailableAt": "2022-12-14T00:00:00Z", "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "rottentomatoes://image.rating.upright", "chapterSource": "media", "primaryExtraKey": "/library/metadata/58684", "ratingImage": "rottentomatoes://image.rating.ripe", "grandparentRatingKey": "66", "grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentKey": "/library/metadata/66", "grandparentTitle": "Caprica", "grandparentThumb": "/library/metadata/66/thumb/1705716261", "parentSlug": "alice-in-borderland-2020", "grandparentSlug": "alice-in-borderland-2020", "grandparentArt": "/library/metadata/66/art/1705716261", "grandparentTheme": "/library/metadata/66/theme/1705716261", "Media": [{"id": 119534, "duration": 11558112, "bitrate": 25025, "width": 3840, "height": 2072, "aspectRatio": 1.85, "audioProfile": "dts", "audioChannels": 6, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": []}, {"id": 119534, "duration": 11558112, "bitrate": 25025, "width": 3840, "height": 2072, "aspectRatio": 1.85, "audioProfile": "dts", "audioChannels": 6, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": [{"id": 119542, "key": "/library/parts/119542/1680457526/file.mkv", "duration": 11558112, "file": "/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv", "size": 36158371307, "container": "mkv", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "videoProfile": "main 10", "indexes": "sd", "hasThumbnail": "1", "Stream": [{"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}, {"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}, {"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}]}, {"id": 119542, "key": "/library/parts/119542/1680457526/file.mkv", "duration": 11558112, "file": "/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv", "size": 36158371307, "container": "mkv", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "videoProfile": "main 10", "indexes": "sd", "hasThumbnail": "1", "Stream": [{"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}]}]}, {"id": 119534, "duration": 11558112, "bitrate": 25025, "width": 3840, "height": 2072, "aspectRatio": 1.85, "audioProfile": "dts", "audioChannels": 6, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": [{"id": 119542, "key": "/library/parts/119542/1680457526/file.mkv", "duration": 11558112, "file": "/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv", "size": 36158371307, "container": "mkv", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "videoProfile": "main 10", "indexes": "sd", "hasThumbnail": "1", "Stream": [{"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}]}, {"id": 119542, "key": "/library/parts/119542/1680457526/file.mkv", "duration": 11558112, "file": "/movies/Avatar The Way of Water (2022)/Avatar.The.Way.of.Water.2022.2160p.WEB-DL.DDP5.1.Atmos.DV.HDR10.HEVC-CMRG.mkv", "size": 36158371307, "container": "mkv", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "videoProfile": "main 10", "indexes": "sd", "hasThumbnail": "1", "Stream": [{"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}, {"id": 272796, "streamType": 1, "default": true, "selected": true, "codec": "h264", "index": 0, "bitrate": 6273, "colorPrimaries": "bt709", "colorRange": "tv", "colorSpace": "bt709", "colorTrc": "bt709", "bitDepth": 8, "chromaLocation": "left", "streamIdentifier": "2", "chromaSubsampling": "4:2:0", "codedHeight": 1088, "codedWidth": 1920, "frameRate": 29.97, "hasScalingMatrix": false, "hearingImpaired": false, "closedCaptions": false, "embeddedInVideo": "1", "height": 1080, "level": 40, "profile": "main", "refFrames": 4, "scanType": "progressive", "width": 1920, "displayTitle": "1080p (H.264)", "extendedDisplayTitle": "1080p (H.264)", "channels": 2, "language": "English", "languageTag": "en", "languageCode": "eng", "audioChannelLayout": "stereo", "samplingRate": 48000, "title": "English", "canAutoSync": false}]}]}], "Genre": [{"tag": "Adventure"}], "Country": [{"tag": "United States of America"}], "Director": [{"tag": "James Cameron"}, {"tag": "James Cameron"}], "Writer": [{"tag": "James Cameron"}], "Collection": [{"tag": "Working NL Subs"}, {"tag": "Working NL Subs"}], "Role": [{"id": 294129, "filter": "actor=294129", "thumb": "https://metadata-static.plex.tv/2/people/27b85844536c39f3f9ac943aaad46608.jpg", "tag": "Mike Smith", "tagKey": "668e7e7b22bcad9064350c91", "role": "Self"}, {"id": 294129, "filter": "actor=294129", "thumb": "https://metadata-static.plex.tv/2/people/27b85844536c39f3f9ac943aaad46608.jpg", "tag": "Mike Smith", "tagKey": "668e7e7b22bcad9064350c91", "role": "Self"}], "Location": [{"path": "/TV Shows/House"}], "Guid": [{"id": "imdb://tt13015952"}, {"id": "imdb://tt13015952"}], "UltraBlurColors": {"topLeft": "11333b", "topRight": "0a232d", "bottomRight": "73958", "bottomLeft": "1f5066"}, "Rating": [{"image": "themoviedb://image.rating", "value": 3, "type": "audience"}], "Image": [{"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}, {"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}, {"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}], "titleSort": "Whale", "viewCount": 1, "lastViewedAt": 1682752242, "originalTitle": "映画 ブラッククローバー 魔法帝の剣", "viewOffset": 5222500, "skipCount": 1, "index": 1, "theme": "/library/metadata/1/theme/1705636920", "leafCount": 14, "viewedLeafCount": 0, "childCount": 1, "hasPremiumExtras": "1", "hasPremiumPrimaryExtra": "1", "parentRatingKey": "66", "parentGuid": "plex://show/5d9c081b170e24001f2a7be4", "parentStudio": "UCP", "parentKey": "/library/metadata/66", "parentTitle": "Caprica", "parentIndex": 1, "parentYear": 2010, "parentThumb": "/library/metadata/66/thumb/1705716261", "parentTheme": "/library/metadata/66/theme/1705716261"}]}} + application/json: {"MediaContainer": {"size": 50, "totalSize": 50, "offset": 0, "allowSync": false, "identifier": "com.plexapp.plugins.library", "Meta": {"Type": [{"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}], "FieldType": [{"type": "tag", "Operator": [{"key": "=", "title": "is"}]}, {"type": "tag", "Operator": []}, {"type": "tag", "Operator": []}]}, "Metadata": [{"addedAt": 1556281940, "art": "/library/metadata/58683/art/1703239236", "audienceRatingImage": "rottentomatoes://image.rating.upright", "audienceRating": 9.2, "chapterSource": "media", "childCount": 1, "contentRating": "PG-13", "createdAtAccuracy": "epoch,local", "createdAtTZOffset": "0", "duration": 11558112, "grandparentArt": "/library/metadata/66/art/1705716261", "grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentKey": "/library/metadata/66", "grandparentRatingKey": "66", "grandparentSlug": "alice-in-borderland-2020", "grandparentTheme": "/library/metadata/66/theme/1705716261", "grandparentThumb": "/library/metadata/66/thumb/1705716261", "grandparentTitle": "Caprica", "guid": "plex://movie/5d7768ba96b655001fdc0408", "index": 1, "key": "/library/metadata/58683", "lastRatedAt": 1721813113, "lastViewedAt": 1682752242, "leafCount": 14, "librarySectionID": 1, "librarySectionKey": "/library/sections/1", "librarySectionTitle": "Movies", "originalTitle": "映画 ブラッククローバー 魔法帝の剣", "originallyAvailableAt": "2022-12-14", "parentGuid": "plex://show/5d9c081b170e24001f2a7be4", "parentIndex": 1, "parentKey": "/library/metadata/66", "parentRatingKey": "66", "parentSlug": "alice-in-borderland-2020", "parentStudio": "UCP", "parentTheme": "/library/metadata/66/theme/1705716261", "parentThumb": "/library/metadata/66/thumb/1705716261", "parentTitle": "Caprica", "parentYear": 2010, "primaryExtraKey": "/library/metadata/58684", "ratingImage": "rottentomatoes://image.rating.ripe", "ratingKey": "58683", "rating": 7.6, "seasonCount": 2022, "skipCount": 1, "slug": "4-for-texas", "studio": "20th Century Studios", "subtype": "clip", "summary": "Jake Sully lives with his newfound family formed on the extrasolar moon Pandora.\nOnce a familiar threat returns to finish what was previously started, Jake must\nwork with Neytiri and the army of the Na'vi race to protect their home.\n", "tagline": "Return to Pandora.", "theme": "/library/metadata/1/theme/1705636920", "thumb": "/library/metadata/58683/thumb/1703239236", "titleSort": "Whale", "title": "Avatar: The Way of Water", "type": "movie", "updatedAt": 1556281940, "userRating": 10, "viewCount": 1, "viewOffset": 5222500, "viewedLeafCount": 0, "year": 2022, "Image": [{"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}], "UltraBlurColors": {"topLeft": "11333b", "topRight": "0a232d", "bottomRight": "73958", "bottomLeft": "1f5066"}, "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": 1, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": true, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}], "Genre": [{"id": 259, "filter": "genre=19", "tag": "Crime"}], "Country": [{"id": 259, "tag": "United States of America", "filter": "country=19"}], "Director": [{"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}], "Writer": [{"id": 126522, "filter": "writer=126522", "tag": "Jamie P. Hanson", "tagKey": "5d77683d85719b001f3a535e"}], "Role": [{"id": 126522, "filter": "actor=126522", "tag": "Teller", "tagKey": "5d77683d85719b001f3a535e", "role": "Self - Judge", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}, {"id": 126522, "filter": "actor=126522", "tag": "Teller", "tagKey": "5d77683d85719b001f3a535e", "role": "Self - Judge", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}, {"id": 126522, "filter": "actor=126522", "tag": "Teller", "tagKey": "5d77683d85719b001f3a535e", "role": "Self - Judge", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}], "Producer": [{"id": 126522, "filter": "producer=126522", "tag": "Amelia Knapp", "tagKey": "5d77683d85719b001f3a535e", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}, {"id": 126522, "filter": "producer=126522", "tag": "Amelia Knapp", "tagKey": "5d77683d85719b001f3a535e", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}, {"id": 126522, "filter": "producer=126522", "tag": "Amelia Knapp", "tagKey": "5d77683d85719b001f3a535e", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}], "Rating": [{"image": "imdb://image.rating", "value": 5.1, "type": "audience"}, {"image": "imdb://image.rating", "value": 5.1, "type": "audience"}, {"image": "imdb://image.rating", "value": 5.1, "type": "audience"}], "Similar": [{"id": 259, "filter": "similar=259", "tag": "Criss Angel Mindfreak"}, {"id": 259, "filter": "similar=259", "tag": "Criss Angel Mindfreak"}, {"id": 259, "filter": "similar=259", "tag": "Criss Angel Mindfreak"}], "Location": [{"path": "/TV Shows/Clarkson's Farm"}, {"path": "/TV Shows/Clarkson's Farm"}, {"path": "/TV Shows/Clarkson's Farm"}], "Guid": [{"id": "tvdb://2337"}], "Collection": [{"tag": "My Awesome Collection"}]}, {"addedAt": 1556281940, "art": "/library/metadata/58683/art/1703239236", "audienceRatingImage": "rottentomatoes://image.rating.upright", "audienceRating": 9.2, "chapterSource": "media", "childCount": 1, "contentRating": "PG-13", "createdAtAccuracy": "epoch,local", "createdAtTZOffset": "0", "duration": 11558112, "grandparentArt": "/library/metadata/66/art/1705716261", "grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentKey": "/library/metadata/66", "grandparentRatingKey": "66", "grandparentSlug": "alice-in-borderland-2020", "grandparentTheme": "/library/metadata/66/theme/1705716261", "grandparentThumb": "/library/metadata/66/thumb/1705716261", "grandparentTitle": "Caprica", "guid": "plex://movie/5d7768ba96b655001fdc0408", "index": 1, "key": "/library/metadata/58683", "lastRatedAt": 1721813113, "lastViewedAt": 1682752242, "leafCount": 14, "librarySectionID": 1, "librarySectionKey": "/library/sections/1", "librarySectionTitle": "Movies", "originalTitle": "映画 ブラッククローバー 魔法帝の剣", "originallyAvailableAt": "2022-12-14", "parentGuid": "plex://show/5d9c081b170e24001f2a7be4", "parentIndex": 1, "parentKey": "/library/metadata/66", "parentRatingKey": "66", "parentSlug": "alice-in-borderland-2020", "parentStudio": "UCP", "parentTheme": "/library/metadata/66/theme/1705716261", "parentThumb": "/library/metadata/66/thumb/1705716261", "parentTitle": "Caprica", "parentYear": 2010, "primaryExtraKey": "/library/metadata/58684", "ratingImage": "rottentomatoes://image.rating.ripe", "ratingKey": "58683", "rating": 7.6, "seasonCount": 2022, "skipCount": 1, "slug": "4-for-texas", "studio": "20th Century Studios", "subtype": "clip", "summary": "Jake Sully lives with his newfound family formed on the extrasolar moon Pandora.\nOnce a familiar threat returns to finish what was previously started, Jake must\nwork with Neytiri and the army of the Na'vi race to protect their home.\n", "tagline": "Return to Pandora.", "theme": "/library/metadata/1/theme/1705636920", "thumb": "/library/metadata/58683/thumb/1703239236", "titleSort": "Whale", "title": "Avatar: The Way of Water", "type": "movie", "updatedAt": 1556281940, "userRating": 10, "viewCount": 1, "viewOffset": 5222500, "viewedLeafCount": 0, "year": 2022, "Image": [{"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}, {"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}, {"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}], "UltraBlurColors": {"topLeft": "11333b", "topRight": "0a232d", "bottomRight": "73958", "bottomLeft": "1f5066"}, "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": []}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": 1, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": true, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "optimizedForStreaming": 1, "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "optimizedForStreaming": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}], "Genre": [{"id": 259, "filter": "genre=19", "tag": "Crime"}], "Country": [{"id": 259, "tag": "United States of America", "filter": "country=19"}], "Director": [{"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}], "Writer": [{"id": 126522, "filter": "writer=126522", "tag": "Jamie P. Hanson", "tagKey": "5d77683d85719b001f3a535e"}], "Role": [{"id": 126522, "filter": "actor=126522", "tag": "Teller", "tagKey": "5d77683d85719b001f3a535e", "role": "Self - Judge", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}, {"id": 126522, "filter": "actor=126522", "tag": "Teller", "tagKey": "5d77683d85719b001f3a535e", "role": "Self - Judge", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}], "Producer": [{"id": 126522, "filter": "producer=126522", "tag": "Amelia Knapp", "tagKey": "5d77683d85719b001f3a535e", "thumb": "https://metadata-static.plex.tv/7/people/708568fd018d7aa8b1032dcf867747e8.jpg"}], "Rating": [{"image": "imdb://image.rating", "value": 5.1, "type": "audience"}], "Similar": [{"id": 259, "filter": "similar=259", "tag": "Criss Angel Mindfreak"}, {"id": 259, "filter": "similar=259", "tag": "Criss Angel Mindfreak"}], "Location": [{"path": "/TV Shows/Clarkson's Farm"}], "Guid": [{"id": "tvdb://2337"}, {"id": "tvdb://2337"}], "Collection": [{"tag": "My Awesome Collection"}, {"tag": "My Awesome Collection"}]}]}} getLibraryHubs: speakeasy-default-get-library-hubs: parameters: @@ -2228,7 +2216,7 @@ examples: asyncRefreshLocalMediaAgent: true responses: "200": - application/json: {"MediaContainer": {"size": 50, "allowSync": false, "identifier": "com.plexapp.plugins.library", "librarySectionID": 2, "librarySectionTitle": "TV Series", "librarySectionUUID": "e69655a2-ef48-4aba-bb19-0cc34d1e7d36", "mediaTagPrefix": "/system/bundle/media/flags/", "mediaTagVersion": 1734362201, "Metadata": [{"ratingKey": "44288", "parentRatingKey": "48047", "grandparentRatingKey": "45520", "parentGuid": "plex://season/618b89208dde18df707ad15c", "grandparentGuid": "plex://show/5e16253691c20300412003a8", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/45520", "parentKey": "/library/metadata/48047", "key": "/library/metadata/44288/children", "guid": "plex://show/5d9c08254eefaa001f5d6dcb", "slug": "better-call-saul", "studio": "Sony Pictures Television", "type": "show", "title": "Better Call Saul", "originalTitle": "Wicked: Part I", "librarySectionTitle": "TV Series ", "librarySectionID": 2, "librarySectionKey": "/library/sections/2", "contentRating": "TV-MA", "summary": "Before Saul Goodman, he was Jimmy McGill. And if you're calling Jimmy, you're in real trouble. The prequel to \"Breaking Bad\" follows small-time attorney, Jimmy McGill, as he transforms into Walter White's morally challenged lawyer, Saul Goodman.", "index": 1, "grandparentTitle": "Alice in Borderland", "parentTitle": "Season 2", "audienceRating": 8.7, "viewCount": 4, "skipCount": 1, "lastViewedAt": 1625764795, "year": 2015, "rating": 6, "ratingImage": "rottentomatoes://image.rating.ripe", "tagline": "Make the call", "chapterSource": "media", "primaryExtraKey": "/library/metadata/134704", "thumb": "/library/metadata/44288/thumb/1736487993", "art": "/library/metadata/44288/art/1736487993", "theme": "/library/metadata/44288/theme/1736487993", "duration": 2700000, "originallyAvailableAt": "2015-02-08", "leafCount": 63, "viewedLeafCount": 4, "childCount": 6, "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "themoviedb://image.rating", "parentIndex": 2, "parentThumb": "/library/metadata/48047/thumb/1671800243", "grandparentThumb": "/library/metadata/45520/thumb/1736488003", "grandparentArt": "/library/metadata/45520/art/1736488003", "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": []}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": []}], "Image": [{"alt": "Better Call Saul", "type": "coverPoster", "url": "/library/metadata/44288/thumb/1736487993"}, {"alt": "Better Call Saul", "type": "coverPoster", "url": "/library/metadata/44288/thumb/1736487993"}], "UltraBlurColors": {"topLeft": "11333a", "topRight": "1d2721", "bottomRight": "5c451d", "bottomLeft": "372c10"}, "Genre": [{"id": 1057, "filter": "genre=1057", "tag": "Crime"}], "Country": [{"id": 58591, "filter": "country=58591", "tag": "United States of America"}, {"id": 58591, "filter": "country=58591", "tag": "United States of America"}], "Guid": [{"id": "imdb://tt3032476"}], "Rating": [{"image": "imdb://image.rating", "value": 9, "type": "audience"}], "Role": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Director": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Writer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Producer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Similar": [{"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}], "Location": [{"path": "/TV Shows/Better Call Saul"}]}, {"ratingKey": "44288", "parentRatingKey": "48047", "grandparentRatingKey": "45520", "parentGuid": "plex://season/618b89208dde18df707ad15c", "grandparentGuid": "plex://show/5e16253691c20300412003a8", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/45520", "parentKey": "/library/metadata/48047", "key": "/library/metadata/44288/children", "guid": "plex://show/5d9c08254eefaa001f5d6dcb", "slug": "better-call-saul", "studio": "Sony Pictures Television", "type": "show", "title": "Better Call Saul", "originalTitle": "Wicked: Part I", "librarySectionTitle": "TV Series ", "librarySectionID": 2, "librarySectionKey": "/library/sections/2", "contentRating": "TV-MA", "summary": "Before Saul Goodman, he was Jimmy McGill. And if you're calling Jimmy, you're in real trouble. The prequel to \"Breaking Bad\" follows small-time attorney, Jimmy McGill, as he transforms into Walter White's morally challenged lawyer, Saul Goodman.", "index": 1, "grandparentTitle": "Alice in Borderland", "parentTitle": "Season 2", "audienceRating": 8.7, "viewCount": 4, "skipCount": 1, "lastViewedAt": 1625764795, "year": 2015, "rating": 6, "ratingImage": "rottentomatoes://image.rating.ripe", "tagline": "Make the call", "chapterSource": "media", "primaryExtraKey": "/library/metadata/134704", "thumb": "/library/metadata/44288/thumb/1736487993", "art": "/library/metadata/44288/art/1736487993", "theme": "/library/metadata/44288/theme/1736487993", "duration": 2700000, "originallyAvailableAt": "2015-02-08", "leafCount": 63, "viewedLeafCount": 4, "childCount": 6, "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "themoviedb://image.rating", "parentIndex": 2, "parentThumb": "/library/metadata/48047/thumb/1671800243", "grandparentThumb": "/library/metadata/45520/thumb/1736488003", "grandparentArt": "/library/metadata/45520/art/1736488003", "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": []}], "Image": [], "UltraBlurColors": {"topLeft": "11333a", "topRight": "1d2721", "bottomRight": "5c451d", "bottomLeft": "372c10"}, "Genre": [{"id": 1057, "filter": "genre=1057", "tag": "Crime"}], "Country": [{"id": 58591, "filter": "country=58591", "tag": "United States of America"}, {"id": 58591, "filter": "country=58591", "tag": "United States of America"}], "Guid": [{"id": "imdb://tt3032476"}, {"id": "imdb://tt3032476"}], "Rating": [], "Role": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Director": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Writer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Producer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Similar": [{"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}], "Location": [{"path": "/TV Shows/Better Call Saul"}, {"path": "/TV Shows/Better Call Saul"}]}, {"ratingKey": "44288", "parentRatingKey": "48047", "grandparentRatingKey": "45520", "parentGuid": "plex://season/618b89208dde18df707ad15c", "grandparentGuid": "plex://show/5e16253691c20300412003a8", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/45520", "parentKey": "/library/metadata/48047", "key": "/library/metadata/44288/children", "guid": "plex://show/5d9c08254eefaa001f5d6dcb", "slug": "better-call-saul", "studio": "Sony Pictures Television", "type": "show", "title": "Better Call Saul", "originalTitle": "Wicked: Part I", "librarySectionTitle": "TV Series ", "librarySectionID": 2, "librarySectionKey": "/library/sections/2", "contentRating": "TV-MA", "summary": "Before Saul Goodman, he was Jimmy McGill. And if you're calling Jimmy, you're in real trouble. The prequel to \"Breaking Bad\" follows small-time attorney, Jimmy McGill, as he transforms into Walter White's morally challenged lawyer, Saul Goodman.", "index": 1, "grandparentTitle": "Alice in Borderland", "parentTitle": "Season 2", "audienceRating": 8.7, "viewCount": 4, "skipCount": 1, "lastViewedAt": 1625764795, "year": 2015, "rating": 6, "ratingImage": "rottentomatoes://image.rating.ripe", "tagline": "Make the call", "chapterSource": "media", "primaryExtraKey": "/library/metadata/134704", "thumb": "/library/metadata/44288/thumb/1736487993", "art": "/library/metadata/44288/art/1736487993", "theme": "/library/metadata/44288/theme/1736487993", "duration": 2700000, "originallyAvailableAt": "2015-02-08", "leafCount": 63, "viewedLeafCount": 4, "childCount": 6, "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "themoviedb://image.rating", "parentIndex": 2, "parentThumb": "/library/metadata/48047/thumb/1671800243", "grandparentThumb": "/library/metadata/45520/thumb/1736488003", "grandparentArt": "/library/metadata/45520/art/1736488003", "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": []}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}], "Image": [{"alt": "Better Call Saul", "type": "coverPoster", "url": "/library/metadata/44288/thumb/1736487993"}], "UltraBlurColors": {"topLeft": "11333a", "topRight": "1d2721", "bottomRight": "5c451d", "bottomLeft": "372c10"}, "Genre": [{"id": 1057, "filter": "genre=1057", "tag": "Crime"}], "Country": [{"id": 58591, "filter": "country=58591", "tag": "United States of America"}, {"id": 58591, "filter": "country=58591", "tag": "United States of America"}], "Guid": [], "Rating": [{"image": "imdb://image.rating", "value": 9, "type": "audience"}, {"image": "imdb://image.rating", "value": 9, "type": "audience"}], "Role": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Director": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Writer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Producer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Similar": [{"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}], "Location": [{"path": "/TV Shows/Better Call Saul"}]}]}} + application/json: {"MediaContainer": {"size": 50, "allowSync": false, "identifier": "com.plexapp.plugins.library", "librarySectionID": 2, "librarySectionTitle": "TV Series", "librarySectionUUID": "e69655a2-ef48-4aba-bb19-0cc34d1e7d36", "mediaTagPrefix": "/system/bundle/media/flags/", "mediaTagVersion": 1734362201, "Metadata": [{"ratingKey": "44288", "parentRatingKey": "48047", "grandparentRatingKey": "45520", "parentGuid": "plex://season/618b89208dde18df707ad15c", "grandparentGuid": "plex://show/5e16253691c20300412003a8", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/45520", "parentKey": "/library/metadata/48047", "key": "/library/metadata/44288/children", "guid": "plex://show/5d9c08254eefaa001f5d6dcb", "slug": "better-call-saul", "studio": "Sony Pictures Television", "type": "show", "title": "Better Call Saul", "originalTitle": "Wicked: Part I", "librarySectionTitle": "TV Series ", "librarySectionID": 2, "librarySectionKey": "/library/sections/2", "contentRating": "TV-MA", "summary": "Before Saul Goodman, he was Jimmy McGill. And if you're calling Jimmy, you're in real trouble. The prequel to \"Breaking Bad\" follows small-time attorney, Jimmy McGill, as he transforms into Walter White's morally challenged lawyer, Saul Goodman.", "index": 1, "grandparentTitle": "Alice in Borderland", "parentTitle": "Season 2", "audienceRating": 8.7, "viewCount": 4, "skipCount": 1, "lastViewedAt": 1625764795, "year": 2015, "rating": 6, "ratingImage": "rottentomatoes://image.rating.ripe", "tagline": "Make the call", "chapterSource": "media", "primaryExtraKey": "/library/metadata/134704", "thumb": "/library/metadata/44288/thumb/1736487993", "art": "/library/metadata/44288/art/1736487993", "theme": "/library/metadata/44288/theme/1736487993", "duration": 2700000, "originallyAvailableAt": "2015-02-08", "leafCount": 63, "viewedLeafCount": 4, "childCount": 6, "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "themoviedb://image.rating", "parentIndex": 2, "parentThumb": "/library/metadata/48047/thumb/1671800243", "grandparentThumb": "/library/metadata/45520/thumb/1736488003", "grandparentArt": "/library/metadata/45520/art/1736488003", "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": []}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": []}], "Image": [{"alt": "Better Call Saul", "type": "coverPoster", "url": "/library/metadata/44288/thumb/1736487993"}, {"alt": "Better Call Saul", "type": "coverPoster", "url": "/library/metadata/44288/thumb/1736487993"}], "UltraBlurColors": {"topLeft": "11333a", "topRight": "1d2721", "bottomRight": "5c451d", "bottomLeft": "372c10"}, "Genre": [{"id": 1057, "filter": "genre=1057", "tag": "Crime"}], "Country": [{"id": 58591, "filter": "country=58591", "tag": "United States of America"}, {"id": 58591, "filter": "country=58591", "tag": "United States of America"}], "Guid": [{"id": "imdb://tt3032476"}], "Rating": [{"image": "imdb://image.rating", "value": 9, "type": "audience"}], "Role": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Director": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Writer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Producer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Similar": [{"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}], "Location": [{"path": "/TV Shows/Better Call Saul"}]}, {"ratingKey": "44288", "parentRatingKey": "48047", "grandparentRatingKey": "45520", "parentGuid": "plex://season/618b89208dde18df707ad15c", "grandparentGuid": "plex://show/5e16253691c20300412003a8", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/45520", "parentKey": "/library/metadata/48047", "key": "/library/metadata/44288/children", "guid": "plex://show/5d9c08254eefaa001f5d6dcb", "slug": "better-call-saul", "studio": "Sony Pictures Television", "type": "show", "title": "Better Call Saul", "originalTitle": "Wicked: Part I", "librarySectionTitle": "TV Series ", "librarySectionID": 2, "librarySectionKey": "/library/sections/2", "contentRating": "TV-MA", "summary": "Before Saul Goodman, he was Jimmy McGill. And if you're calling Jimmy, you're in real trouble. The prequel to \"Breaking Bad\" follows small-time attorney, Jimmy McGill, as he transforms into Walter White's morally challenged lawyer, Saul Goodman.", "index": 1, "grandparentTitle": "Alice in Borderland", "parentTitle": "Season 2", "audienceRating": 8.7, "viewCount": 4, "skipCount": 1, "lastViewedAt": 1625764795, "year": 2015, "rating": 6, "ratingImage": "rottentomatoes://image.rating.ripe", "tagline": "Make the call", "chapterSource": "media", "primaryExtraKey": "/library/metadata/134704", "thumb": "/library/metadata/44288/thumb/1736487993", "art": "/library/metadata/44288/art/1736487993", "theme": "/library/metadata/44288/theme/1736487993", "duration": 2700000, "originallyAvailableAt": "2015-02-08", "leafCount": 63, "viewedLeafCount": 4, "childCount": 6, "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "themoviedb://image.rating", "parentIndex": 2, "parentThumb": "/library/metadata/48047/thumb/1671800243", "grandparentThumb": "/library/metadata/45520/thumb/1736488003", "grandparentArt": "/library/metadata/45520/art/1736488003", "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": []}], "Image": [], "UltraBlurColors": {"topLeft": "11333a", "topRight": "1d2721", "bottomRight": "5c451d", "bottomLeft": "372c10"}, "Genre": [{"id": 1057, "filter": "genre=1057", "tag": "Crime"}], "Country": [{"id": 58591, "filter": "country=58591", "tag": "United States of America"}, {"id": 58591, "filter": "country=58591", "tag": "United States of America"}], "Guid": [{"id": "imdb://tt3032476"}, {"id": "imdb://tt3032476"}], "Rating": [], "Role": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Director": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Writer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Producer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Similar": [{"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}], "Location": [{"path": "/TV Shows/Better Call Saul"}, {"path": "/TV Shows/Better Call Saul"}]}, {"ratingKey": "44288", "parentRatingKey": "48047", "grandparentRatingKey": "45520", "parentGuid": "plex://season/618b89208dde18df707ad15c", "grandparentGuid": "plex://show/5e16253691c20300412003a8", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/45520", "parentKey": "/library/metadata/48047", "key": "/library/metadata/44288/children", "guid": "plex://show/5d9c08254eefaa001f5d6dcb", "slug": "better-call-saul", "studio": "Sony Pictures Television", "type": "show", "title": "Better Call Saul", "originalTitle": "Wicked: Part I", "librarySectionTitle": "TV Series ", "librarySectionID": 2, "librarySectionKey": "/library/sections/2", "contentRating": "TV-MA", "summary": "Before Saul Goodman, he was Jimmy McGill. And if you're calling Jimmy, you're in real trouble. The prequel to \"Breaking Bad\" follows small-time attorney, Jimmy McGill, as he transforms into Walter White's morally challenged lawyer, Saul Goodman.", "index": 1, "grandparentTitle": "Alice in Borderland", "parentTitle": "Season 2", "audienceRating": 8.7, "viewCount": 4, "skipCount": 1, "lastViewedAt": 1625764795, "year": 2015, "rating": 6, "ratingImage": "rottentomatoes://image.rating.ripe", "tagline": "Make the call", "chapterSource": "media", "primaryExtraKey": "/library/metadata/134704", "thumb": "/library/metadata/44288/thumb/1736487993", "art": "/library/metadata/44288/art/1736487993", "theme": "/library/metadata/44288/theme/1736487993", "duration": 2700000, "originallyAvailableAt": "2015-02-08", "leafCount": 63, "viewedLeafCount": 4, "childCount": 6, "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "themoviedb://image.rating", "parentIndex": 2, "parentThumb": "/library/metadata/48047/thumb/1671800243", "grandparentThumb": "/library/metadata/45520/thumb/1736488003", "grandparentArt": "/library/metadata/45520/art/1736488003", "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": []}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}], "Image": [{"alt": "Better Call Saul", "type": "coverPoster", "url": "/library/metadata/44288/thumb/1736487993"}], "UltraBlurColors": {"topLeft": "11333a", "topRight": "1d2721", "bottomRight": "5c451d", "bottomLeft": "372c10"}, "Genre": [{"id": 1057, "filter": "genre=1057", "tag": "Crime"}], "Country": [{"id": 58591, "filter": "country=58591", "tag": "United States of America"}, {"id": 58591, "filter": "country=58591", "tag": "United States of America"}], "Guid": [], "Rating": [{"image": "imdb://image.rating", "value": 9, "type": "audience"}, {"image": "imdb://image.rating", "value": 9, "type": "audience"}], "Role": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Director": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Writer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Producer": [{"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}, {"id": 109501, "filter": "actor=109501", "tag": "Bob Odenkirk", "tagKey": "5d77683254f42c001f8c3f69", "role": "Jimmy McGill", "thumb": "https://metadata-static.plex.tv/f/people/f2ca7b474cc984efbdd5c503a096285a.jpg"}], "Similar": [{"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}, {"id": 26, "filter": "similar=26", "tag": "Breaking Bad"}], "Location": [{"path": "/TV Shows/Better Call Saul"}]}]}} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}, {"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": @@ -2249,7 +2237,7 @@ examples: X-Plex-Container-Size: 50 responses: "200": - application/json: {"MediaContainer": {"size": 50, "totalSize": 50, "offset": 0, "allowSync": false, "art": "/:/resources/show-fanart.jpg", "content": "secondary", "identifier": "com.plexapp.plugins.library", "librarySectionID": 2, "librarySectionTitle": "TV Series", "librarySectionUUID": "e69655a2-ef48-4aba-bb19-0cc34d1e7d36", "mediaTagPrefix": "/system/bundle/media/flags/", "mediaTagVersion": 1734362201, "thumb": "/:/resources/show.png", "nocache": true, "title1": "TV Series", "title2": "By Starring Actor", "viewGroup": "secondary", "Meta": {"Type": [{"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}], "FieldType": [{"type": "tag", "Operator": []}]}, "Metadata": [{"ratingKey": "58683", "key": "/library/metadata/58683", "guid": "plex://movie/5d7768ba96b655001fdc0408", "slug": "4-for-texas", "studio": "20th Century Studios", "type": "movie", "title": "Avatar: The Way of Water", "titleSort": "Whale", "contentRating": "PG-13", "summary": "Jake Sully lives with his newfound family formed on the extrasolar moon Pandora.\nOnce a familiar threat returns to finish what was previously started, Jake must\nwork with Neytiri and the army of the Na'vi race to protect their home.\n", "rating": 7.6, "audienceRating": 9.2, "year": 2022, "tagline": "Return to Pandora.", "thumb": "/library/metadata/58683/thumb/1703239236", "art": "/library/metadata/58683/art/1703239236", "theme": "/library/metadata/1/theme/1705636920", "index": 1, "leafCount": 14, "viewedLeafCount": 0, "childCount": 1, "seasonCount": 2022, "duration": 11558112, "originallyAvailableAt": "2022-12-14", "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "rottentomatoes://image.rating.upright", "chapterSource": "media", "primaryExtraKey": "/library/metadata/58684", "originalTitle": "映画 ブラッククローバー 魔法帝の剣", "parentRatingKey": "66", "grandparentRatingKey": "66", "parentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/66", "parentKey": "/library/metadata/66", "grandparentTitle": "Caprica", "grandparentThumb": "/library/metadata/66/thumb/1705716261", "grandparentTheme": "/library/metadata/66/theme/1705716261", "grandparentArt": "/library/metadata/66/art/1705716261", "parentTitle": "Caprica", "parentIndex": 1, "parentThumb": "/library/metadata/66/thumb/1705716261", "ratingImage": "rottentomatoes://image.rating.ripe", "viewCount": 1, "viewOffset": 5222500, "skipCount": 1, "subtype": "clip", "lastRatedAt": 1721813113, "createdAtAccuracy": "epoch,local", "createdAtTZOffset": "0", "lastViewedAt": 1682752242, "userRating": 10, "Image": [{"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}, {"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}], "UltraBlurColors": {"topLeft": "11333b", "topRight": "0a232d", "bottomRight": "73958", "bottomLeft": "1f5066"}, "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": []}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}], "Genre": [{"tag": "United States of America"}, {"tag": "United States of America"}, {"tag": "United States of America"}], "Country": [{"tag": "United States of America"}, {"tag": "United States of America"}, {"tag": "United States of America"}], "Director": [{"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}], "Writer": [{"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}], "Role": [{"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}], "Guid": [{"id": "tvdb://2337"}, {"id": "tvdb://2337"}], "Collection": [{"tag": "My Awesome Collection"}]}]}} + application/json: {"MediaContainer": {"size": 50, "totalSize": 50, "offset": 0, "allowSync": false, "art": "/:/resources/show-fanart.jpg", "content": "secondary", "identifier": "com.plexapp.plugins.library", "librarySectionID": 2, "librarySectionTitle": "TV Series", "librarySectionUUID": "e69655a2-ef48-4aba-bb19-0cc34d1e7d36", "mediaTagPrefix": "/system/bundle/media/flags/", "mediaTagVersion": 1734362201, "thumb": "/:/resources/show.png", "nocache": true, "title1": "TV Series", "title2": "By Starring Actor", "viewGroup": "secondary", "Meta": {"Type": [{"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}, {"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}, {"key": "/library/sections/2/all?type=2", "type": "filter", "subtype": "clip", "title": "TV Shows", "active": false, "Filter": [{"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}, {"filter": "genre", "filterType": "string", "key": "/library/sections/2/genre?type=2", "title": "Genre", "type": "filter", "advanced": true}], "Sort": [{"default": "asc", "active": false, "activeDirection": "asc", "defaultDirection": "asc", "descKey": "titleSort:desc", "firstCharacterKey": "/library/sections/2/firstCharacter", "key": "titleSort", "title": "Title"}], "Field": [{"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}, {"key": "show.title", "title": "Show Title", "type": "string", "subType": "rating"}]}], "FieldType": [{"type": "tag", "Operator": []}]}, "Metadata": [{"ratingKey": "58683", "key": "/library/metadata/58683", "guid": "plex://movie/5d7768ba96b655001fdc0408", "slug": "4-for-texas", "studio": "20th Century Studios", "type": "movie", "title": "Avatar: The Way of Water", "titleSort": "Whale", "contentRating": "PG-13", "summary": "Jake Sully lives with his newfound family formed on the extrasolar moon Pandora.\nOnce a familiar threat returns to finish what was previously started, Jake must\nwork with Neytiri and the army of the Na'vi race to protect their home.\n", "rating": 7.6, "audienceRating": 9.2, "year": 2022, "tagline": "Return to Pandora.", "thumb": "/library/metadata/58683/thumb/1703239236", "art": "/library/metadata/58683/art/1703239236", "theme": "/library/metadata/1/theme/1705636920", "index": 1, "leafCount": 14, "viewedLeafCount": 0, "childCount": 1, "seasonCount": 2022, "duration": 11558112, "originallyAvailableAt": "2022-12-14", "addedAt": 1556281940, "updatedAt": 1556281940, "audienceRatingImage": "rottentomatoes://image.rating.upright", "chapterSource": "media", "primaryExtraKey": "/library/metadata/58684", "originalTitle": "映画 ブラッククローバー 魔法帝の剣", "parentRatingKey": "66", "grandparentRatingKey": "66", "parentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4", "grandparentSlug": "alice-in-borderland-2020", "grandparentKey": "/library/metadata/66", "parentKey": "/library/metadata/66", "grandparentTitle": "Caprica", "grandparentThumb": "/library/metadata/66/thumb/1705716261", "grandparentTheme": "/library/metadata/66/theme/1705716261", "grandparentArt": "/library/metadata/66/art/1705716261", "parentTitle": "Caprica", "parentIndex": 1, "parentThumb": "/library/metadata/66/thumb/1705716261", "ratingImage": "rottentomatoes://image.rating.ripe", "viewCount": 1, "viewOffset": 5222500, "skipCount": 1, "subtype": "clip", "lastRatedAt": 1721813113, "createdAtAccuracy": "epoch,local", "createdAtTZOffset": "0", "lastViewedAt": 1682752242, "userRating": 10, "Image": [{"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}, {"alt": "Episode 1", "type": "background", "url": "/library/metadata/45521/thumb/1644710589"}], "UltraBlurColors": {"topLeft": "11333b", "topRight": "0a232d", "bottomRight": "73958", "bottomLeft": "1f5066"}, "Media": [{"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": []}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}, {"id": 387322, "duration": 9610350, "bitrate": 25512, "width": 3840, "height": 1602, "aspectRatio": 2.35, "audioChannels": 6, "displayOffset": 50, "audioCodec": "eac3", "videoCodec": "hevc", "videoResolution": "4k", "container": "mkv", "videoFrameRate": "24p", "videoProfile": "main 10", "hasVoiceActivity": false, "audioProfile": "dts", "has64bitOffsets": false, "Part": [{"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}, {"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}, {"accessible": true, "exists": true, "id": 418385, "key": "/library/parts/418385/1735864239/file.mkv", "indexes": "sd", "duration": 9610350, "file": "/mnt/Movies_1/W/Wicked (2024).mkv", "size": 30649952104, "packetLength": 188, "container": "mkv", "videoProfile": "main 10", "audioProfile": "dts", "has64bitOffsets": false, "hasThumbnail": "1", "Stream": [{"id": 1002625, "streamType": 1, "default": true, "codec": "hevc", "index": 0, "bitrate": 24743, "language": "English", "languageTag": "en", "languageCode": "eng", "headerCompression": true, "DOVIBLCompatID": 1, "DOVIBLPresent": true, "DOVIELPresent": false, "DOVILevel": 6, "DOVIPresent": true, "DOVIProfile": 8, "DOVIRPUPresent": true, "DOVIVersion": "1.0", "bitDepth": 10, "chromaLocation": "topleft", "chromaSubsampling": "4:2:0", "codedHeight": 1608, "codedWidth": 3840, "closedCaptions": true, "colorPrimaries": "bt2020", "colorRange": "tv", "colorSpace": "bt2020nc", "colorTrc": "smpte2084", "frameRate": 23.976, "height": 1602, "level": 150, "original": true, "hasScalingMatrix": false, "profile": "main 10", "scanType": "progressive", "embeddedInVideo": "progressive", "refFrames": 1, "width": 3840, "displayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)", "selected": true, "forced": true, "channels": 6, "audioChannelLayout": "5.1(side)", "samplingRate": 48000, "canAutoSync": false, "hearingImpaired": true, "dub": true, "title": "SDH"}]}]}], "Genre": [{"tag": "Crime"}, {"tag": "Crime"}, {"tag": "Crime"}], "Country": [{"tag": "United States of America"}, {"tag": "United States of America"}, {"tag": "United States of America"}], "Director": [{"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}, {"tag": "Danny Boyle"}], "Writer": [{"tag": "Jamie P. Hanson"}, {"tag": "Jamie P. Hanson"}], "Role": [{"tag": "Teller"}, {"tag": "Teller"}], "Guid": [{"id": "tvdb://2337"}, {"id": "tvdb://2337"}], "Collection": [{"tag": "My Awesome Collection"}]}]}} "400": application/json: {"errors": [{"code": 1000, "message": "X-Plex-Client-Identifier is missing", "status": 400}]} "401": diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 2e8f938..617a410 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -14,7 +14,7 @@ generation: auth: oAuth2ClientCredentialsEnabled: true swift: - version: 0.10.3 + version: 0.10.5 author: LukeHagar description: Swift Client SDK Generated by Speakeasy imports: diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 7ec89fb..3ab2f4c 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -9,8 +9,8 @@ sources: - main plexapi: sourceNamespace: plexapi - sourceRevisionDigest: sha256:bf7001af017ce5072c503bfbaf60793f94549163b517489dc53e4f7b685659c0 - sourceBlobDigest: sha256:ed2b29043c84f32d2efa92a126083fd9a81644a7ce9c6ac86d9aeb3493cbd6f8 + sourceRevisionDigest: sha256:2066ba94b55e21d651c79003e3cf402fb77c52a0969fc52310b3383fbed038f4 + sourceBlobDigest: sha256:1737023e29cd9cf36c07ccd8c8c48c47e14f47ce22b4d6ba9ee241afbbd8f351 tags: - latest - main @@ -18,10 +18,10 @@ targets: plexswift: source: plexapi sourceNamespace: plexapi - sourceRevisionDigest: sha256:bf7001af017ce5072c503bfbaf60793f94549163b517489dc53e4f7b685659c0 - sourceBlobDigest: sha256:ed2b29043c84f32d2efa92a126083fd9a81644a7ce9c6ac86d9aeb3493cbd6f8 + sourceRevisionDigest: sha256:2066ba94b55e21d651c79003e3cf402fb77c52a0969fc52310b3383fbed038f4 + sourceBlobDigest: sha256:1737023e29cd9cf36c07ccd8c8c48c47e14f47ce22b4d6ba9ee241afbbd8f351 codeSamplesNamespace: code-samples-swift-plexswift - codeSamplesRevisionDigest: sha256:2791c989a9154c63541c0e45d5db9e043305012a241de17c40de5c038efcc7e4 + codeSamplesRevisionDigest: sha256:d7b2b324db0f365223bee21d09cb657417756c519e67d3425094d0bf48cea1d3 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README.md b/README.md index 6f9be74..09215b9 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ You can add `plexswift` to your project directly in Xcode `(File > Add Packages. ```bash dependencies: [ - .package(url: "https://github.com/LukeHagar/plexswift.git", .upToNextMajor(from: "0.10.3")) + .package(url: "https://github.com/LukeHagar/plexswift.git", .upToNextMajor(from: "0.10.5")) ] ``` @@ -148,7 +148,6 @@ case .empty: * [getMediaMetaData](docs/sdks/library/README.md#getmediametadata) - Get Media Metadata * [getMetadataChildren](docs/sdks/library/README.md#getmetadatachildren) - Get Items Children * [getTopWatchedContent](docs/sdks/library/README.md#gettopwatchedcontent) - Get Top Watched Content -* [getOnDeck](docs/sdks/library/README.md#getondeck) - Get On Deck ### [Log](docs/sdks/log/README.md) diff --git a/RELEASES.md b/RELEASES.md index 367a0e3..ab56cab 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -862,4 +862,14 @@ Based on: ### Generated - [swift v0.10.3] . ### Releases -- [Swift Package Manager v0.10.3] https://github.com/LukeHagar/plexswift/releases/tag/v0.10.3 - . \ No newline at end of file +- [Swift Package Manager v0.10.3] https://github.com/LukeHagar/plexswift/releases/tag/v0.10.3 - . + +## 2025-03-10 00:07:14 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.405.6 (2.428.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [swift v0.10.5] . +### Releases +- [Swift Package Manager v0.10.5] https://github.com/LukeHagar/plexswift/releases/tag/v0.10.5 - . \ No newline at end of file diff --git a/Sources/Plexswift/Plexswift.docc/Plexswift.md b/Sources/Plexswift/Plexswift.docc/Plexswift.md index 739bfdc..840c64f 100644 --- a/Sources/Plexswift/Plexswift.docc/Plexswift.md +++ b/Sources/Plexswift/Plexswift.docc/Plexswift.md @@ -148,7 +148,6 @@ case .empty: - ``Operations/GetLibraryHubsBadRequest`` - ``Operations/GetMetadataChildrenBadRequest`` - ``Operations/GetMyPlexAccountBadRequest`` -- ``Operations/GetOnDeckBadRequest`` - ``Operations/GetPinBadRequest`` - ``Operations/GetPlaylistBadRequest`` - ``Operations/GetPlaylistContentsBadRequest`` @@ -231,7 +230,6 @@ case .empty: - ``Operations/GetLibraryHubsResponse`` - ``Operations/GetMetadataChildrenResponse`` - ``Operations/GetMyPlexAccountResponse`` -- ``Operations/GetOnDeckResponse`` - ``Operations/GetPinResponse`` - ``Operations/GetPlaylistResponse`` - ``Operations/GetPlaylistContentsResponse`` @@ -379,8 +377,10 @@ case .empty: - ``Operations/GetAllMediaLibraryFieldType`` - ``Operations/GetAllMediaLibraryFilter`` - ``Operations/GetAllMediaLibraryGenre`` +- ``Operations/GetAllMediaLibraryGuids`` - ``Operations/GetAllMediaLibraryHasThumbnail`` - ``Operations/GetAllMediaLibraryImage`` +- ``Operations/GetAllMediaLibraryLibrary1`` - ``Operations/GetAllMediaLibraryLibraryErrors`` - ``Operations/GetAllMediaLibraryLibraryOptimizedForStreaming`` - ``Operations/GetAllMediaLibraryLibraryResponseType`` @@ -441,13 +441,10 @@ case .empty: - ``Operations/GetLibraryItemsCountry`` - ``Operations/GetLibraryItemsDefaultDirection`` - ``Operations/GetLibraryItemsDirector`` -- ``Operations/GetLibraryItemsEnableCreditsMarkerGeneration`` -- ``Operations/GetLibraryItemsEpisodeSort`` - ``Operations/GetLibraryItemsErrors`` - ``Operations/GetLibraryItemsField`` - ``Operations/GetLibraryItemsFieldType`` - ``Operations/GetLibraryItemsFilter`` -- ``Operations/GetLibraryItemsFlattenSeasons`` - ``Operations/GetLibraryItemsGenre`` - ``Operations/GetLibraryItemsHasThumbnail`` - ``Operations/GetLibraryItemsImage`` @@ -465,10 +462,8 @@ case .empty: - ``Operations/GetLibraryItemsLocation`` - ``Operations/GetLibraryItemsMedia`` - ``Operations/GetLibraryItemsMediaContainer`` -- ``Operations/GetLibraryItemsMediaGuid`` - ``Operations/GetLibraryItemsMeta`` - ``Operations/GetLibraryItemsMetadata`` -- ``Operations/GetLibraryItemsMetaDataRating`` - ``Operations/GetLibraryItemsOperator`` - ``Operations/GetLibraryItemsOptimizedForStreaming`` - ``Operations/GetLibraryItemsPart`` @@ -477,7 +472,6 @@ case .empty: - ``Operations/GetLibraryItemsRequest`` - ``Operations/GetLibraryItemsResponseBody`` - ``Operations/GetLibraryItemsRole`` -- ``Operations/GetLibraryItemsShowOrdering`` - ``Operations/GetLibraryItemsSort`` - ``Operations/GetLibraryItemsStream`` - ``Operations/GetLibraryItemsType`` @@ -501,9 +495,11 @@ case .empty: - ``Operations/GetMediaMetaDataMetadata`` - ``Operations/GetMediaMetaDataOptimizedForStreaming`` - ``Operations/GetMediaMetaDataPart`` +- ``Operations/GetMediaMetaDataProducer`` - ``Operations/GetMediaMetaDataRequest`` - ``Operations/GetMediaMetaDataResponseBody`` - ``Operations/GetMediaMetaDataRole`` +- ``Operations/GetMediaMetaDataSimilar`` - ``Operations/GetMediaMetaDataStream`` - ``Operations/GetMediaMetaDataUltraBlurColors`` - ``Operations/GetMediaMetaDataUnauthorized`` @@ -515,6 +511,7 @@ case .empty: - ``Operations/GetMediaProvidersResponseBody`` - ``Operations/GetMediaProvidersServerErrors`` - ``Operations/GetMediaProvidersUnauthorized`` +- ``Operations/GetRecentlyAdded1`` - ``Operations/GetRecentlyAddedActiveDirection`` - ``Operations/GetRecentlyAddedDefaultDirection`` - ``Operations/GetRecentlyAddedField`` @@ -526,6 +523,7 @@ case .empty: - ``Operations/GetRecentlyAddedMediaContainer`` - ``Operations/GetRecentlyAddedMetadata`` - ``Operations/GetRecentlyAddedOperator`` +- ``Operations/GetRecentlyAddedOptimizedForStreaming`` - ``Operations/GetRecentlyAddedRequest`` - ``Operations/GetRecentlyAddedResponseBody`` - ``Operations/GetRecentlyAddedSort`` @@ -683,16 +681,6 @@ case .empty: - ``Operations/GetMyPlexAccountResponseBody`` - ``Operations/GetMyPlexAccountServerErrors`` - ``Operations/GetMyPlexAccountUnauthorized`` -- ``Operations/GetOnDeckErrors`` -- ``Operations/GetOnDeckGuids`` -- ``Operations/GetOnDeckLibraryErrors`` -- ``Operations/GetOnDeckMedia`` -- ``Operations/GetOnDeckMediaContainer`` -- ``Operations/GetOnDeckMetadata`` -- ``Operations/GetOnDeckPart`` -- ``Operations/GetOnDeckResponseBody`` -- ``Operations/GetOnDeckStream`` -- ``Operations/GetOnDeckUnauthorized`` - ``Operations/GetPinAuthPinContainer`` - ``Operations/GetPinErrors`` - ``Operations/GetPinRequest`` @@ -942,6 +930,7 @@ case .empty: - ``Operations/QueryParamOnlyTransient`` - ``Operations/QueryParamSmart`` - ``Operations/QueryParamType`` +- ``Operations/Rating`` - ``Operations/Ratings`` - ``Operations/Release`` - ``Operations/ResponseBody`` diff --git a/Sources/Plexswift/internal/api/_LibraryAPI.swift b/Sources/Plexswift/internal/api/_LibraryAPI.swift index 0942a82..0b3437a 100644 --- a/Sources/Plexswift/internal/api/_LibraryAPI.swift +++ b/Sources/Plexswift/internal/api/_LibraryAPI.swift @@ -153,15 +153,6 @@ class _LibraryAPI: LibraryAPI { handleResponse: handleGetTopWatchedContentResponse ) } - - public func getOnDeck() async throws -> Response { - return try await client.makeRequest( - configureRequest: { configuration in - try configureGetOnDeckRequest(with: configuration) - }, - handleResponse: handleGetOnDeckResponse - ) - } } @@ -289,12 +280,6 @@ private func configureGetTopWatchedContentRequest(with configuration: URLRequest configuration.telemetryHeader = .userAgent } -private func configureGetOnDeckRequest(with configuration: URLRequestConfiguration) throws { - configuration.path = "/library/onDeck" - configuration.method = .get - configuration.telemetryHeader = .userAgent -} - // MARK: - Response Handlers private func handleGetFileHashResponse(response: Client.APIResponse) throws -> Operations.GetFileHashResponse { @@ -801,35 +786,3 @@ private func handleGetTopWatchedContentResponse(response: Client.APIResponse) th return .empty } -private func handleGetOnDeckResponse(response: Client.APIResponse) throws -> Operations.GetOnDeckResponse { - let httpResponse = response.httpResponse - - if httpResponse.statusCode == 200 { - if httpResponse.contentType.matchContentType(pattern: "application/json"), let data = response.data { - do { - return .object(try JSONDecoder().decode(Operations.GetOnDeckResponseBody.self, from: data)) - } catch { - throw ResponseHandlerError.failedToDecodeJSON(error) - } - } - } else if httpResponse.statusCode == 400 { - if httpResponse.contentType.matchContentType(pattern: "application/json"), let data = response.data { - do { - return .badRequest(try JSONDecoder().decode(Operations.GetOnDeckBadRequest.self, from: data)) - } catch { - throw ResponseHandlerError.failedToDecodeJSON(error) - } - } - } else if httpResponse.statusCode == 401 { - if httpResponse.contentType.matchContentType(pattern: "application/json"), let data = response.data { - do { - return .unauthorized(try JSONDecoder().decode(Operations.GetOnDeckUnauthorized.self, from: data)) - } catch { - throw ResponseHandlerError.failedToDecodeJSON(error) - } - } - } - - return .empty -} - diff --git a/Sources/Plexswift/internal/models/GetLibraryItemsEpisodeSort+Serialization.swift b/Sources/Plexswift/internal/models/GetAllMediaLibraryLibrary1+Serialization.swift similarity index 86% rename from Sources/Plexswift/internal/models/GetLibraryItemsEpisodeSort+Serialization.swift rename to Sources/Plexswift/internal/models/GetAllMediaLibraryLibrary1+Serialization.swift index d6cf46c..7638fa3 100644 --- a/Sources/Plexswift/internal/models/GetLibraryItemsEpisodeSort+Serialization.swift +++ b/Sources/Plexswift/internal/models/GetAllMediaLibraryLibrary1+Serialization.swift @@ -3,7 +3,7 @@ import Foundation -extension Operations.GetLibraryItemsEpisodeSort: Serializable { +extension Operations.GetAllMediaLibraryLibrary1: Serializable { func serialize(with format: SerializableFormat) throws -> String { return try rawValue.serialize(with: format) } diff --git a/Sources/Plexswift/internal/models/GetLibraryItemsEnableCreditsMarkerGeneration+Serialization.swift b/Sources/Plexswift/internal/models/GetLibraryItemsEnableCreditsMarkerGeneration+Serialization.swift deleted file mode 100644 index 2e6aca1..0000000 --- a/Sources/Plexswift/internal/models/GetLibraryItemsEnableCreditsMarkerGeneration+Serialization.swift +++ /dev/null @@ -1,14 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - - -import Foundation - -extension Operations.GetLibraryItemsEnableCreditsMarkerGeneration: Serializable { - func serialize(with format: SerializableFormat) throws -> String { - return try rawValue.serialize(with: format) - } - - func serializeQueryParameters(with format: SerializableFormat) throws -> [QueryParameter] { - return [QueryParameter(key: [], serialized: try serialize(with: format))] - } -} diff --git a/Sources/Plexswift/internal/models/GetLibraryItemsFlattenSeasons+Serialization.swift b/Sources/Plexswift/internal/models/GetLibraryItemsFlattenSeasons+Serialization.swift deleted file mode 100644 index 9b50561..0000000 --- a/Sources/Plexswift/internal/models/GetLibraryItemsFlattenSeasons+Serialization.swift +++ /dev/null @@ -1,14 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - - -import Foundation - -extension Operations.GetLibraryItemsFlattenSeasons: Serializable { - func serialize(with format: SerializableFormat) throws -> String { - return try rawValue.serialize(with: format) - } - - func serializeQueryParameters(with format: SerializableFormat) throws -> [QueryParameter] { - return [QueryParameter(key: [], serialized: try serialize(with: format))] - } -} diff --git a/Sources/Plexswift/internal/models/GetLibraryItemsShowOrdering+Serialization.swift b/Sources/Plexswift/internal/models/GetRecentlyAdded1+Serialization.swift similarity index 86% rename from Sources/Plexswift/internal/models/GetLibraryItemsShowOrdering+Serialization.swift rename to Sources/Plexswift/internal/models/GetRecentlyAdded1+Serialization.swift index 5df3635..f2bbd57 100644 --- a/Sources/Plexswift/internal/models/GetLibraryItemsShowOrdering+Serialization.swift +++ b/Sources/Plexswift/internal/models/GetRecentlyAdded1+Serialization.swift @@ -3,7 +3,7 @@ import Foundation -extension Operations.GetLibraryItemsShowOrdering: Serializable { +extension Operations.GetRecentlyAdded1: Serializable { func serialize(with format: SerializableFormat) throws -> String { return try rawValue.serialize(with: format) } diff --git a/Sources/Plexswift/internal/models/GetRecentlyAddedOptimizedForStreaming+Serialization.swift b/Sources/Plexswift/internal/models/GetRecentlyAddedOptimizedForStreaming+Serialization.swift new file mode 100644 index 0000000..b2c14d4 --- /dev/null +++ b/Sources/Plexswift/internal/models/GetRecentlyAddedOptimizedForStreaming+Serialization.swift @@ -0,0 +1,10 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + + +import Foundation + +extension Operations.GetRecentlyAddedOptimizedForStreaming: Serializable { + func serialize(with format: SerializableFormat) throws -> String { + return "" + } +} diff --git a/Sources/Plexswift/internal/models/OptimizedForStreaming+Serialization.swift b/Sources/Plexswift/internal/models/OptimizedForStreaming+Serialization.swift index 58a1ab1..010c845 100644 --- a/Sources/Plexswift/internal/models/OptimizedForStreaming+Serialization.swift +++ b/Sources/Plexswift/internal/models/OptimizedForStreaming+Serialization.swift @@ -5,10 +5,6 @@ import Foundation extension Operations.OptimizedForStreaming: Serializable { func serialize(with format: SerializableFormat) throws -> String { - return try rawValue.serialize(with: format) - } - - func serializeQueryParameters(with format: SerializableFormat) throws -> [QueryParameter] { - return [QueryParameter(key: [], serialized: try serialize(with: format))] + return "" } } diff --git a/Sources/Plexswift/models/operations/Collection.swift b/Sources/Plexswift/models/operations/Collection.swift index 78ed0c1..660804e 100644 --- a/Sources/Plexswift/models/operations/Collection.swift +++ b/Sources/Plexswift/models/operations/Collection.swift @@ -5,12 +5,14 @@ import Foundation extension Operations { /// A model object public struct Collection { - public let tag: String? + /// The user-made collection this media item belongs to + public let tag: String /// Creates an object with the specified parameters /// + /// - Parameter tag: The user-made collection this media item belongs to /// - public init(tag: String? = nil) { + public init(tag: String) { self.tag = tag } }} diff --git a/Sources/Plexswift/models/operations/Country.swift b/Sources/Plexswift/models/operations/Country.swift index 6f003fc..aeea551 100644 --- a/Sources/Plexswift/models/operations/Country.swift +++ b/Sources/Plexswift/models/operations/Country.swift @@ -3,21 +3,29 @@ import Foundation extension Operations { - /// A model object + /// The filter query string for country media items. public struct Country { - public let tag: String? + public let id: Int + /// The country of origin of this media item + public let tag: String + public let filter: String? /// Creates an object with the specified parameters /// + /// - Parameter tag: The country of origin of this media item /// - public init(tag: String? = nil) { + public init(id: Int, tag: String, filter: String? = nil) { + self.id = id self.tag = tag + self.filter = filter } }} extension Operations.Country: Codable { enum CodingKeys: String, CodingKey { + case id case tag + case filter } } diff --git a/Sources/Plexswift/models/operations/Director.swift b/Sources/Plexswift/models/operations/Director.swift index 13cf63f..29cb1ee 100644 --- a/Sources/Plexswift/models/operations/Director.swift +++ b/Sources/Plexswift/models/operations/Director.swift @@ -5,12 +5,14 @@ import Foundation extension Operations { /// A model object public struct Director { - public let tag: String? + /// The role of Director + public let tag: String /// Creates an object with the specified parameters /// + /// - Parameter tag: The role of Director /// - public init(tag: String? = nil) { + public init(tag: String) { self.tag = tag } }} diff --git a/Sources/Plexswift/models/operations/Genre.swift b/Sources/Plexswift/models/operations/Genre.swift index a872c36..21a66e0 100644 --- a/Sources/Plexswift/models/operations/Genre.swift +++ b/Sources/Plexswift/models/operations/Genre.swift @@ -3,20 +3,30 @@ import Foundation extension Operations { - /// A model object + /// The filter query string for similar items. public struct Genre { - public let tag: String? + public let filter: String + public let id: Int + /// The genre name of this media-item + /// + public let tag: String /// Creates an object with the specified parameters /// + /// - Parameter tag: The genre name of this media-item + /// /// - public init(tag: String? = nil) { + public init(filter: String, id: Int, tag: String) { + self.filter = filter + self.id = id self.tag = tag } }} extension Operations.Genre: Codable { enum CodingKeys: String, CodingKey { + case filter + case id case tag } } diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryGenre.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryGenre.swift index 7d4b6bd..0591398 100644 --- a/Sources/Plexswift/models/operations/GetAllMediaLibraryGenre.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryGenre.swift @@ -5,12 +5,14 @@ import Foundation extension Operations { /// A model object public struct GetAllMediaLibraryGenre { - /// The country of origin of this media item + /// The genre name of this media-item + /// public let tag: String /// Creates an object with the specified parameters /// - /// - Parameter tag: The country of origin of this media item + /// - Parameter tag: The genre name of this media-item + /// /// public init(tag: String) { self.tag = tag diff --git a/Sources/Plexswift/models/operations/GetOnDeckGuids.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryGuids.swift similarity index 54% rename from Sources/Plexswift/models/operations/GetOnDeckGuids.swift rename to Sources/Plexswift/models/operations/GetAllMediaLibraryGuids.swift index c625bab..1670fba 100644 --- a/Sources/Plexswift/models/operations/GetOnDeckGuids.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryGuids.swift @@ -4,18 +4,22 @@ import Foundation extension Operations { /// A model object - public struct GetOnDeckGuids { + public struct GetAllMediaLibraryGuids { + /// The unique identifier for the Guid. Can be imdb://tt0286347, tmdb://1763, tvdb://2337 + /// public let id: String? /// Creates an object with the specified parameters /// + /// - Parameter id: The unique identifier for the Guid. Can be imdb://tt0286347, tmdb://1763, tvdb://2337 + /// /// public init(id: String? = nil) { self.id = id } }} -extension Operations.GetOnDeckGuids: Codable { +extension Operations.GetAllMediaLibraryGuids: Codable { enum CodingKeys: String, CodingKey { case id } diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryLibrary1.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryLibrary1.swift new file mode 100644 index 0000000..7f0732a --- /dev/null +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryLibrary1.swift @@ -0,0 +1,9 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +import Foundation + +extension Operations { + public enum GetAllMediaLibraryLibrary1: Int, Codable, APIValue { + case zero = 0 + case one = 1 + }} diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryLibraryOptimizedForStreaming.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryLibraryOptimizedForStreaming.swift index 821bca4..b76a138 100644 --- a/Sources/Plexswift/models/operations/GetAllMediaLibraryLibraryOptimizedForStreaming.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryLibraryOptimizedForStreaming.swift @@ -5,14 +5,14 @@ import Foundation extension Operations { /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true public enum GetAllMediaLibraryLibraryOptimizedForStreaming { - case getAllMediaLibrary1(Operations.GetAllMediaLibrary1) + case getAllMediaLibraryLibrary1(Operations.GetAllMediaLibraryLibrary1) case bool(Bool) }} extension Operations.GetAllMediaLibraryLibraryOptimizedForStreaming: Codable { public init(from decoder: Decoder) throws { - if let value = try? Operations.GetAllMediaLibrary1(from: decoder) { - self = .getAllMediaLibrary1(value) + if let value = try? Operations.GetAllMediaLibraryLibrary1(from: decoder) { + self = .getAllMediaLibraryLibrary1(value) } else if let value = try? Bool(from: decoder) { self = .bool(value) } else { @@ -22,7 +22,7 @@ extension Operations.GetAllMediaLibraryLibraryOptimizedForStreaming: Codable { public func encode(to encoder: Encoder) throws { switch self { - case .getAllMediaLibrary1(let value): + case .getAllMediaLibraryLibrary1(let value): try value.encode(to: encoder) case .bool(let value): try value.encode(to: encoder) diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryMedia.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryMedia.swift index ff72729..f261aa2 100644 --- a/Sources/Plexswift/models/operations/GetAllMediaLibraryMedia.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryMedia.swift @@ -5,12 +5,8 @@ import Foundation extension Operations { /// A model object public struct GetAllMediaLibraryMedia { - /// Indicates whether voice activity is detected. - public let hasVoiceActivity: Bool /// Unique media identifier. public let id: Int - /// An array of parts for this media item. - public let part: [Operations.GetAllMediaLibraryPart] /// Aspect ratio of the video. @DecimalSerialized public private(set) var aspectRatio: Double? @@ -28,10 +24,14 @@ extension Operations { /// Duration of the media in milliseconds. public let duration: Int? public let has64bitOffsets: Bool? + /// Indicates whether voice activity is detected. + public let hasVoiceActivity: Bool? /// Video height in pixels. public let height: Int? /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true public let optimizedForStreaming: Operations.GetAllMediaLibraryOptimizedForStreaming? + /// An array of parts for this media item. + public let part: [Operations.GetAllMediaLibraryPart]? /// Video codec used. public let videoCodec: String? /// Frame rate of the video. Values found include NTSC, PAL, 24p @@ -46,9 +46,7 @@ extension Operations { /// Creates an object with the specified parameters /// - /// - Parameter hasVoiceActivity: Indicates whether voice activity is detected. /// - Parameter id: Unique media identifier. - /// - Parameter part: An array of parts for this media item. /// - Parameter aspectRatio: Aspect ratio of the video. /// - Parameter audioChannels: Number of audio channels. /// - Parameter audioCodec: Audio codec used. @@ -56,8 +54,10 @@ extension Operations { /// - Parameter bitrate: Bitrate in bits per second. /// - Parameter container: File container type. /// - Parameter duration: Duration of the media in milliseconds. + /// - Parameter hasVoiceActivity: Indicates whether voice activity is detected. /// - Parameter height: Video height in pixels. /// - Parameter optimizedForStreaming: Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true + /// - Parameter part: An array of parts for this media item. /// - Parameter videoCodec: Video codec used. /// - Parameter videoFrameRate: Frame rate of the video. Values found include NTSC, PAL, 24p /// @@ -65,10 +65,8 @@ extension Operations { /// - Parameter videoResolution: Video resolution (e.g., 4k). /// - Parameter width: Video width in pixels. /// - public init(hasVoiceActivity: Bool, id: Int, part: [Operations.GetAllMediaLibraryPart], aspectRatio: Double? = nil, audioChannels: Int? = nil, audioCodec: String? = nil, audioProfile: String? = nil, bitrate: Int? = nil, container: String? = nil, displayOffset: Int? = nil, duration: Int? = nil, has64bitOffsets: Bool? = nil, height: Int? = nil, optimizedForStreaming: Operations.GetAllMediaLibraryOptimizedForStreaming? = nil, videoCodec: String? = nil, videoFrameRate: String? = nil, videoProfile: String? = nil, videoResolution: String? = nil, width: Int? = nil) { - self.hasVoiceActivity = hasVoiceActivity + public init(id: Int, aspectRatio: Double? = nil, audioChannels: Int? = nil, audioCodec: String? = nil, audioProfile: String? = nil, bitrate: Int? = nil, container: String? = nil, displayOffset: Int? = nil, duration: Int? = nil, has64bitOffsets: Bool? = nil, hasVoiceActivity: Bool? = nil, height: Int? = nil, optimizedForStreaming: Operations.GetAllMediaLibraryOptimizedForStreaming? = nil, part: [Operations.GetAllMediaLibraryPart]? = nil, videoCodec: String? = nil, videoFrameRate: String? = nil, videoProfile: String? = nil, videoResolution: String? = nil, width: Int? = nil) { self.id = id - self.part = part self._aspectRatio = DecimalSerialized(wrappedValue: aspectRatio) self.audioChannels = audioChannels self.audioCodec = audioCodec @@ -78,8 +76,10 @@ extension Operations { self.displayOffset = displayOffset self.duration = duration self.has64bitOffsets = has64bitOffsets + self.hasVoiceActivity = hasVoiceActivity self.height = height self.optimizedForStreaming = optimizedForStreaming + self.part = part self.videoCodec = videoCodec self.videoFrameRate = videoFrameRate self.videoProfile = videoProfile @@ -90,9 +90,7 @@ extension Operations { extension Operations.GetAllMediaLibraryMedia: Codable { enum CodingKeys: String, CodingKey { - case hasVoiceActivity case id - case part = "Part" case aspectRatio case audioChannels case audioCodec @@ -102,8 +100,10 @@ extension Operations.GetAllMediaLibraryMedia: Codable { case displayOffset case duration case has64bitOffsets + case hasVoiceActivity case height case optimizedForStreaming + case part = "Part" case videoCodec case videoFrameRate case videoProfile @@ -113,9 +113,7 @@ extension Operations.GetAllMediaLibraryMedia: Codable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - self.hasVoiceActivity = try container.decode(Bool.self, forKey: .hasVoiceActivity) self.id = try container.decode(Int.self, forKey: .id) - self.part = try container.decode([Operations.GetAllMediaLibraryPart].self, forKey: .part) self._aspectRatio = try container.decodeIfPresent(DecimalSerialized.self, forKey: .aspectRatio) ?? DecimalSerialized(wrappedValue: nil) self.audioChannels = try container.decodeIfPresent(Int.self, forKey: .audioChannels) self.audioCodec = try container.decodeIfPresent(String.self, forKey: .audioCodec) @@ -125,8 +123,10 @@ extension Operations.GetAllMediaLibraryMedia: Codable { self.displayOffset = try container.decodeIfPresent(Int.self, forKey: .displayOffset) self.duration = try container.decodeIfPresent(Int.self, forKey: .duration) self.has64bitOffsets = try container.decodeIfPresent(Bool.self, forKey: .has64bitOffsets) + self.hasVoiceActivity = try container.decodeIfPresent(Bool.self, forKey: .hasVoiceActivity) self.height = try container.decodeIfPresent(Int.self, forKey: .height) self.optimizedForStreaming = try container.decodeIfPresent(Operations.GetAllMediaLibraryOptimizedForStreaming.self, forKey: .optimizedForStreaming) + self.part = try container.decodeIfPresent([Operations.GetAllMediaLibraryPart].self, forKey: .part) self.videoCodec = try container.decodeIfPresent(String.self, forKey: .videoCodec) self.videoFrameRate = try container.decodeIfPresent(String.self, forKey: .videoFrameRate) self.videoProfile = try container.decodeIfPresent(String.self, forKey: .videoProfile) @@ -136,9 +136,7 @@ extension Operations.GetAllMediaLibraryMedia: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(self.hasVoiceActivity, forKey: .hasVoiceActivity) try container.encode(self.id, forKey: .id) - try container.encode(self.part, forKey: .part) if self.aspectRatio != nil { try container.encode(self._aspectRatio, forKey: .aspectRatio) } @@ -150,8 +148,10 @@ extension Operations.GetAllMediaLibraryMedia: Codable { try container.encodeIfPresent(self.displayOffset, forKey: .displayOffset) try container.encodeIfPresent(self.duration, forKey: .duration) try container.encodeIfPresent(self.has64bitOffsets, forKey: .has64bitOffsets) + try container.encodeIfPresent(self.hasVoiceActivity, forKey: .hasVoiceActivity) try container.encodeIfPresent(self.height, forKey: .height) try container.encodeIfPresent(self.optimizedForStreaming, forKey: .optimizedForStreaming) + try container.encodeIfPresent(self.part, forKey: .part) try container.encodeIfPresent(self.videoCodec, forKey: .videoCodec) try container.encodeIfPresent(self.videoFrameRate, forKey: .videoFrameRate) try container.encodeIfPresent(self.videoProfile, forKey: .videoProfile) diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryMetadata.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryMetadata.swift index 084a07f..0a0e4f2 100644 --- a/Sources/Plexswift/models/operations/GetAllMediaLibraryMetadata.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryMetadata.swift @@ -47,8 +47,6 @@ extension Operations { /// The sort title used for ordering media items. public let titleSort: String public let type: Operations.GetAllMediaLibraryLibraryType - /// The release year of the media item. - public let year: Int /// The URL for the audience rating image. public let audienceRatingImage: String? /// The source from which chapter data is derived. @@ -79,7 +77,7 @@ extension Operations { public let grandparentThumb: String? /// The title of the grandparent media item. public let grandparentTitle: String? - public let guids: [Operations.Guids]? + public let guids: [Operations.GetAllMediaLibraryGuids]? public let image: [Operations.GetAllMediaLibraryImage]? /// The Unix timestamp representing the last time the item was rated. public let lastRatedAt: Int? @@ -126,6 +124,8 @@ extension Operations { /// The current playback offset (in milliseconds). public let viewOffset: Int? public let writer: [Operations.GetAllMediaLibraryWriter]? + /// The release year of the media item. + public let year: Int? /// Creates an object with the specified parameters /// @@ -147,7 +147,6 @@ extension Operations { /// - Parameter thumb: The thumbnail image URL for the media item. /// - Parameter title: The title of the media item. /// - Parameter titleSort: The sort title used for ordering media items. - /// - Parameter year: The release year of the media item. /// - Parameter audienceRatingImage: The URL for the audience rating image. /// - Parameter chapterSource: The source from which chapter data is derived. /// - Parameter contentRating: The content rating for the media item. @@ -181,8 +180,9 @@ extension Operations { /// - Parameter viewCount: The number of times this media item has been viewed. /// - Parameter viewedLeafCount: The number of leaf items that have been viewed. /// - Parameter viewOffset: The current playback offset (in milliseconds). + /// - Parameter year: The release year of the media item. /// - public init(addedAt: Int, art: String, audienceRating: Double, childCount: Int, duration: Int, guid: String, index: Int, key: String, originallyAvailableAt: Date, rating: Double, ratingKey: String, seasonCount: Int, slug: String, summary: String, tagline: String, theme: String, thumb: String, title: String, titleSort: String, type: Operations.GetAllMediaLibraryLibraryType, year: Int, audienceRatingImage: String? = nil, chapterSource: String? = nil, collection: [Operations.GetAllMediaLibraryCollection]? = nil, contentRating: String? = nil, country: [Operations.GetAllMediaLibraryCountry]? = nil, createdAtAccuracy: String? = nil, createdAtTZOffset: String? = nil, director: [Operations.GetAllMediaLibraryDirector]? = nil, genre: [Operations.GetAllMediaLibraryGenre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentTheme: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, guids: [Operations.Guids]? = nil, image: [Operations.GetAllMediaLibraryImage]? = nil, lastRatedAt: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, media: [Operations.GetAllMediaLibraryMedia]? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, primaryExtraKey: String? = nil, ratingImage: String? = nil, role: [Operations.GetAllMediaLibraryRole]? = nil, skipCount: Int? = nil, studio: String? = nil, subtype: String? = nil, ultraBlurColors: Operations.GetAllMediaLibraryUltraBlurColors? = nil, updatedAt: Int? = nil, userRating: Double? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, viewOffset: Int? = nil, writer: [Operations.GetAllMediaLibraryWriter]? = nil) { + public init(addedAt: Int, art: String, audienceRating: Double, childCount: Int, duration: Int, guid: String, index: Int, key: String, originallyAvailableAt: Date, rating: Double, ratingKey: String, seasonCount: Int, slug: String, summary: String, tagline: String, theme: String, thumb: String, title: String, titleSort: String, type: Operations.GetAllMediaLibraryLibraryType, audienceRatingImage: String? = nil, chapterSource: String? = nil, collection: [Operations.GetAllMediaLibraryCollection]? = nil, contentRating: String? = nil, country: [Operations.GetAllMediaLibraryCountry]? = nil, createdAtAccuracy: String? = nil, createdAtTZOffset: String? = nil, director: [Operations.GetAllMediaLibraryDirector]? = nil, genre: [Operations.GetAllMediaLibraryGenre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentTheme: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, guids: [Operations.GetAllMediaLibraryGuids]? = nil, image: [Operations.GetAllMediaLibraryImage]? = nil, lastRatedAt: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, media: [Operations.GetAllMediaLibraryMedia]? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, primaryExtraKey: String? = nil, ratingImage: String? = nil, role: [Operations.GetAllMediaLibraryRole]? = nil, skipCount: Int? = nil, studio: String? = nil, subtype: String? = nil, ultraBlurColors: Operations.GetAllMediaLibraryUltraBlurColors? = nil, updatedAt: Int? = nil, userRating: Double? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, viewOffset: Int? = nil, writer: [Operations.GetAllMediaLibraryWriter]? = nil, year: Int? = nil) { self.addedAt = addedAt self.art = art self._audienceRating = DecimalSerialized(wrappedValue: audienceRating) @@ -203,7 +203,6 @@ extension Operations { self.title = title self.titleSort = titleSort self.type = type - self.year = year self.audienceRatingImage = audienceRatingImage self.chapterSource = chapterSource self.collection = collection @@ -247,6 +246,7 @@ extension Operations { self.viewedLeafCount = viewedLeafCount self.viewOffset = viewOffset self.writer = writer + self.year = year } }} @@ -272,7 +272,6 @@ extension Operations.GetAllMediaLibraryMetadata: Codable { case title case titleSort case type - case year case audienceRatingImage case chapterSource case collection = "Collection" @@ -316,6 +315,7 @@ extension Operations.GetAllMediaLibraryMetadata: Codable { case viewedLeafCount case viewOffset case writer = "Writer" + case year } public init(from decoder: Decoder) throws { @@ -340,7 +340,6 @@ extension Operations.GetAllMediaLibraryMetadata: Codable { self.title = try container.decode(String.self, forKey: .title) self.titleSort = try container.decode(String.self, forKey: .titleSort) self.type = try container.decode(Operations.GetAllMediaLibraryLibraryType.self, forKey: .type) - self.year = try container.decode(Int.self, forKey: .year) self.audienceRatingImage = try container.decodeIfPresent(String.self, forKey: .audienceRatingImage) self.chapterSource = try container.decodeIfPresent(String.self, forKey: .chapterSource) self.collection = try container.decodeIfPresent([Operations.GetAllMediaLibraryCollection].self, forKey: .collection) @@ -358,7 +357,7 @@ extension Operations.GetAllMediaLibraryMetadata: Codable { self.grandparentTheme = try container.decodeIfPresent(String.self, forKey: .grandparentTheme) self.grandparentThumb = try container.decodeIfPresent(String.self, forKey: .grandparentThumb) self.grandparentTitle = try container.decodeIfPresent(String.self, forKey: .grandparentTitle) - self.guids = try container.decodeIfPresent([Operations.Guids].self, forKey: .guids) + self.guids = try container.decodeIfPresent([Operations.GetAllMediaLibraryGuids].self, forKey: .guids) self.image = try container.decodeIfPresent([Operations.GetAllMediaLibraryImage].self, forKey: .image) self.lastRatedAt = try container.decodeIfPresent(Int.self, forKey: .lastRatedAt) self.lastViewedAt = try container.decodeIfPresent(Int.self, forKey: .lastViewedAt) @@ -384,6 +383,7 @@ extension Operations.GetAllMediaLibraryMetadata: Codable { self.viewedLeafCount = try container.decodeIfPresent(Int.self, forKey: .viewedLeafCount) self.viewOffset = try container.decodeIfPresent(Int.self, forKey: .viewOffset) self.writer = try container.decodeIfPresent([Operations.GetAllMediaLibraryWriter].self, forKey: .writer) + self.year = try container.decodeIfPresent(Int.self, forKey: .year) } public func encode(to encoder: Encoder) throws { @@ -408,7 +408,6 @@ extension Operations.GetAllMediaLibraryMetadata: Codable { try container.encode(self.title, forKey: .title) try container.encode(self.titleSort, forKey: .titleSort) try container.encode(self.type, forKey: .type) - try container.encode(self.year, forKey: .year) try container.encodeIfPresent(self.audienceRatingImage, forKey: .audienceRatingImage) try container.encodeIfPresent(self.chapterSource, forKey: .chapterSource) try container.encodeIfPresent(self.collection, forKey: .collection) @@ -454,6 +453,7 @@ extension Operations.GetAllMediaLibraryMetadata: Codable { try container.encodeIfPresent(self.viewedLeafCount, forKey: .viewedLeafCount) try container.encodeIfPresent(self.viewOffset, forKey: .viewOffset) try container.encodeIfPresent(self.writer, forKey: .writer) + try container.encodeIfPresent(self.year, forKey: .year) } } diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryOptimizedForStreaming.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryOptimizedForStreaming.swift index 122d8b0..6d4a609 100644 --- a/Sources/Plexswift/models/operations/GetAllMediaLibraryOptimizedForStreaming.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryOptimizedForStreaming.swift @@ -5,14 +5,14 @@ import Foundation extension Operations { /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true public enum GetAllMediaLibraryOptimizedForStreaming { - case one(Operations.One) + case getAllMediaLibrary1(Operations.GetAllMediaLibrary1) case bool(Bool) }} extension Operations.GetAllMediaLibraryOptimizedForStreaming: Codable { public init(from decoder: Decoder) throws { - if let value = try? Operations.One(from: decoder) { - self = .one(value) + if let value = try? Operations.GetAllMediaLibrary1(from: decoder) { + self = .getAllMediaLibrary1(value) } else if let value = try? Bool(from: decoder) { self = .bool(value) } else { @@ -22,7 +22,7 @@ extension Operations.GetAllMediaLibraryOptimizedForStreaming: Codable { public func encode(to encoder: Encoder) throws { switch self { - case .one(let value): + case .getAllMediaLibrary1(let value): try value.encode(to: encoder) case .bool(let value): try value.encode(to: encoder) diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryRole.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryRole.swift index 47fc784..b510f65 100644 --- a/Sources/Plexswift/models/operations/GetAllMediaLibraryRole.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryRole.swift @@ -5,12 +5,12 @@ import Foundation extension Operations { /// A model object public struct GetAllMediaLibraryRole { - /// The name of the actor for this role + /// The display tag for the actor (typically the actor's name). public let tag: String /// Creates an object with the specified parameters /// - /// - Parameter tag: The name of the actor for this role + /// - Parameter tag: The display tag for the actor (typically the actor's name). /// public init(tag: String) { self.tag = tag diff --git a/Sources/Plexswift/models/operations/GetAllMediaLibraryStream.swift b/Sources/Plexswift/models/operations/GetAllMediaLibraryStream.swift index 073f8eb..c049d29 100644 --- a/Sources/Plexswift/models/operations/GetAllMediaLibraryStream.swift +++ b/Sources/Plexswift/models/operations/GetAllMediaLibraryStream.swift @@ -15,12 +15,6 @@ extension Operations { public let id: Int /// Index of the stream. public let index: Int - /// Language of the stream. - public let language: String - /// ISO language code. - public let languageCode: String - /// Language tag (e.g., en). - public let languageTag: String /// Stream type (1=video, 2=audio, 3=subtitle). public let streamType: Int /// Audio channel layout. @@ -37,6 +31,7 @@ extension Operations { public let chromaLocation: String? /// Chroma subsampling format. public let chromaSubsampling: String? + public let closedCaptions: Bool? /// Coded video height. public let codedHeight: Int? /// Coded video width. @@ -69,6 +64,7 @@ extension Operations { public let doviVersion: String? /// Indicates if the stream is a dub. public let dub: Bool? + public let embeddedInVideo: String? public let forced: Bool? /// Frame rate of the stream. @DecimalSerialized @@ -80,6 +76,12 @@ extension Operations { public let hearingImpaired: Bool? /// Height of the video stream. public let height: Int? + /// Language of the stream. + public let language: String? + /// ISO language code. + public let languageCode: String? + /// Language tag (e.g., en). + public let languageTag: String? /// Video level. public let level: Int? /// Indicates if this is the original stream. @@ -105,9 +107,6 @@ extension Operations { /// - Parameter extendedDisplayTitle: Extended display title for the stream. /// - Parameter id: Unique stream identifier. /// - Parameter index: Index of the stream. - /// - Parameter language: Language of the stream. - /// - Parameter languageCode: ISO language code. - /// - Parameter languageTag: Language tag (e.g., en). /// - Parameter streamType: Stream type (1=video, 2=audio, 3=subtitle). /// - Parameter audioChannelLayout: Audio channel layout. /// - Parameter bitDepth: Bit depth of the video stream. @@ -136,6 +135,9 @@ extension Operations { /// - Parameter headerCompression: Indicates whether header compression is enabled. /// - Parameter hearingImpaired: Indicates if the stream is for the hearing impaired. /// - Parameter height: Height of the video stream. + /// - Parameter language: Language of the stream. + /// - Parameter languageCode: ISO language code. + /// - Parameter languageTag: Language tag (e.g., en). /// - Parameter level: Video level. /// - Parameter original: Indicates if this is the original stream. /// - Parameter profile: Video profile. @@ -145,15 +147,12 @@ extension Operations { /// - Parameter title: Optional title for the stream (e.g., language variant). /// - Parameter width: Width of the video stream. /// - public init(codec: String, displayTitle: String, extendedDisplayTitle: String, id: Int, index: Int, language: String, languageCode: String, languageTag: String, streamType: Int, audioChannelLayout: String? = nil, bitDepth: Int? = nil, bitrate: Int? = nil, canAutoSync: Bool? = nil, channels: Int? = nil, chromaLocation: String? = nil, chromaSubsampling: String? = nil, codedHeight: Int? = nil, codedWidth: Int? = nil, colorPrimaries: String? = nil, colorRange: String? = nil, colorSpace: String? = nil, colorTrc: String? = nil, `default`: Bool? = nil, doviblCompatID: Int? = nil, doviblPresent: Bool? = nil, dovielPresent: Bool? = nil, doviLevel: Int? = nil, doviPresent: Bool? = nil, doviProfile: Int? = nil, dovirpuPresent: Bool? = nil, doviVersion: String? = nil, dub: Bool? = nil, forced: Bool? = nil, frameRate: Double? = nil, hasScalingMatrix: Bool? = nil, headerCompression: Bool? = nil, hearingImpaired: Bool? = nil, height: Int? = nil, level: Int? = nil, original: Bool? = nil, profile: String? = nil, refFrames: Int? = nil, samplingRate: Int? = nil, scanType: String? = nil, selected: Bool? = nil, title: String? = nil, width: Int? = nil) { + public init(codec: String, displayTitle: String, extendedDisplayTitle: String, id: Int, index: Int, streamType: Int, audioChannelLayout: String? = nil, bitDepth: Int? = nil, bitrate: Int? = nil, canAutoSync: Bool? = nil, channels: Int? = nil, chromaLocation: String? = nil, chromaSubsampling: String? = nil, closedCaptions: Bool? = nil, codedHeight: Int? = nil, codedWidth: Int? = nil, colorPrimaries: String? = nil, colorRange: String? = nil, colorSpace: String? = nil, colorTrc: String? = nil, `default`: Bool? = nil, doviblCompatID: Int? = nil, doviblPresent: Bool? = nil, dovielPresent: Bool? = nil, doviLevel: Int? = nil, doviPresent: Bool? = nil, doviProfile: Int? = nil, dovirpuPresent: Bool? = nil, doviVersion: String? = nil, dub: Bool? = nil, embeddedInVideo: String? = nil, forced: Bool? = nil, frameRate: Double? = nil, hasScalingMatrix: Bool? = nil, headerCompression: Bool? = nil, hearingImpaired: Bool? = nil, height: Int? = nil, language: String? = nil, languageCode: String? = nil, languageTag: String? = nil, level: Int? = nil, original: Bool? = nil, profile: String? = nil, refFrames: Int? = nil, samplingRate: Int? = nil, scanType: String? = nil, selected: Bool? = nil, title: String? = nil, width: Int? = nil) { self.codec = codec self.displayTitle = displayTitle self.extendedDisplayTitle = extendedDisplayTitle self.id = id self.index = index - self.language = language - self.languageCode = languageCode - self.languageTag = languageTag self.streamType = streamType self.audioChannelLayout = audioChannelLayout self.bitDepth = bitDepth @@ -162,6 +161,7 @@ extension Operations { self.channels = channels self.chromaLocation = chromaLocation self.chromaSubsampling = chromaSubsampling + self.closedCaptions = closedCaptions self.codedHeight = codedHeight self.codedWidth = codedWidth self.colorPrimaries = colorPrimaries @@ -178,12 +178,16 @@ extension Operations { self.dovirpuPresent = dovirpuPresent self.doviVersion = doviVersion self.dub = dub + self.embeddedInVideo = embeddedInVideo self.forced = forced self._frameRate = DecimalSerialized(wrappedValue: frameRate) self.hasScalingMatrix = hasScalingMatrix self.headerCompression = headerCompression self.hearingImpaired = hearingImpaired self.height = height + self.language = language + self.languageCode = languageCode + self.languageTag = languageTag self.level = level self.original = original self.profile = profile @@ -203,9 +207,6 @@ extension Operations.GetAllMediaLibraryStream: Codable { case extendedDisplayTitle case id case index - case language - case languageCode - case languageTag case streamType case audioChannelLayout case bitDepth @@ -214,6 +215,7 @@ extension Operations.GetAllMediaLibraryStream: Codable { case channels case chromaLocation case chromaSubsampling + case closedCaptions case codedHeight case codedWidth case colorPrimaries @@ -230,12 +232,16 @@ extension Operations.GetAllMediaLibraryStream: Codable { case dovirpuPresent = "DOVIRPUPresent" case doviVersion = "DOVIVersion" case dub + case embeddedInVideo case forced case frameRate case hasScalingMatrix case headerCompression case hearingImpaired case height + case language + case languageCode + case languageTag case level case original case profile @@ -254,9 +260,6 @@ extension Operations.GetAllMediaLibraryStream: Codable { self.extendedDisplayTitle = try container.decode(String.self, forKey: .extendedDisplayTitle) self.id = try container.decode(Int.self, forKey: .id) self.index = try container.decode(Int.self, forKey: .index) - self.language = try container.decode(String.self, forKey: .language) - self.languageCode = try container.decode(String.self, forKey: .languageCode) - self.languageTag = try container.decode(String.self, forKey: .languageTag) self.streamType = try container.decode(Int.self, forKey: .streamType) self.audioChannelLayout = try container.decodeIfPresent(String.self, forKey: .audioChannelLayout) self.bitDepth = try container.decodeIfPresent(Int.self, forKey: .bitDepth) @@ -265,6 +268,7 @@ extension Operations.GetAllMediaLibraryStream: Codable { self.channels = try container.decodeIfPresent(Int.self, forKey: .channels) self.chromaLocation = try container.decodeIfPresent(String.self, forKey: .chromaLocation) self.chromaSubsampling = try container.decodeIfPresent(String.self, forKey: .chromaSubsampling) + self.closedCaptions = try container.decodeIfPresent(Bool.self, forKey: .closedCaptions) self.codedHeight = try container.decodeIfPresent(Int.self, forKey: .codedHeight) self.codedWidth = try container.decodeIfPresent(Int.self, forKey: .codedWidth) self.colorPrimaries = try container.decodeIfPresent(String.self, forKey: .colorPrimaries) @@ -281,12 +285,16 @@ extension Operations.GetAllMediaLibraryStream: Codable { self.dovirpuPresent = try container.decodeIfPresent(Bool.self, forKey: .dovirpuPresent) self.doviVersion = try container.decodeIfPresent(String.self, forKey: .doviVersion) self.dub = try container.decodeIfPresent(Bool.self, forKey: .dub) + self.embeddedInVideo = try container.decodeIfPresent(String.self, forKey: .embeddedInVideo) self.forced = try container.decodeIfPresent(Bool.self, forKey: .forced) self._frameRate = try container.decodeIfPresent(DecimalSerialized.self, forKey: .frameRate) ?? DecimalSerialized(wrappedValue: nil) self.hasScalingMatrix = try container.decodeIfPresent(Bool.self, forKey: .hasScalingMatrix) self.headerCompression = try container.decodeIfPresent(Bool.self, forKey: .headerCompression) self.hearingImpaired = try container.decodeIfPresent(Bool.self, forKey: .hearingImpaired) self.height = try container.decodeIfPresent(Int.self, forKey: .height) + self.language = try container.decodeIfPresent(String.self, forKey: .language) + self.languageCode = try container.decodeIfPresent(String.self, forKey: .languageCode) + self.languageTag = try container.decodeIfPresent(String.self, forKey: .languageTag) self.level = try container.decodeIfPresent(Int.self, forKey: .level) self.original = try container.decodeIfPresent(Bool.self, forKey: .original) self.profile = try container.decodeIfPresent(String.self, forKey: .profile) @@ -305,9 +313,6 @@ extension Operations.GetAllMediaLibraryStream: Codable { try container.encode(self.extendedDisplayTitle, forKey: .extendedDisplayTitle) try container.encode(self.id, forKey: .id) try container.encode(self.index, forKey: .index) - try container.encode(self.language, forKey: .language) - try container.encode(self.languageCode, forKey: .languageCode) - try container.encode(self.languageTag, forKey: .languageTag) try container.encode(self.streamType, forKey: .streamType) try container.encodeIfPresent(self.audioChannelLayout, forKey: .audioChannelLayout) try container.encodeIfPresent(self.bitDepth, forKey: .bitDepth) @@ -316,6 +321,7 @@ extension Operations.GetAllMediaLibraryStream: Codable { try container.encodeIfPresent(self.channels, forKey: .channels) try container.encodeIfPresent(self.chromaLocation, forKey: .chromaLocation) try container.encodeIfPresent(self.chromaSubsampling, forKey: .chromaSubsampling) + try container.encodeIfPresent(self.closedCaptions, forKey: .closedCaptions) try container.encodeIfPresent(self.codedHeight, forKey: .codedHeight) try container.encodeIfPresent(self.codedWidth, forKey: .codedWidth) try container.encodeIfPresent(self.colorPrimaries, forKey: .colorPrimaries) @@ -332,6 +338,7 @@ extension Operations.GetAllMediaLibraryStream: Codable { try container.encodeIfPresent(self.dovirpuPresent, forKey: .dovirpuPresent) try container.encodeIfPresent(self.doviVersion, forKey: .doviVersion) try container.encodeIfPresent(self.dub, forKey: .dub) + try container.encodeIfPresent(self.embeddedInVideo, forKey: .embeddedInVideo) try container.encodeIfPresent(self.forced, forKey: .forced) if self.frameRate != nil { try container.encode(self._frameRate, forKey: .frameRate) @@ -340,6 +347,9 @@ extension Operations.GetAllMediaLibraryStream: Codable { try container.encodeIfPresent(self.headerCompression, forKey: .headerCompression) try container.encodeIfPresent(self.hearingImpaired, forKey: .hearingImpaired) try container.encodeIfPresent(self.height, forKey: .height) + try container.encodeIfPresent(self.language, forKey: .language) + try container.encodeIfPresent(self.languageCode, forKey: .languageCode) + try container.encodeIfPresent(self.languageTag, forKey: .languageTag) try container.encodeIfPresent(self.level, forKey: .level) try container.encodeIfPresent(self.original, forKey: .original) try container.encodeIfPresent(self.profile, forKey: .profile) diff --git a/Sources/Plexswift/models/operations/GetLibraryItemsEnableCreditsMarkerGeneration.swift b/Sources/Plexswift/models/operations/GetLibraryItemsEnableCreditsMarkerGeneration.swift deleted file mode 100644 index 769f54d..0000000 --- a/Sources/Plexswift/models/operations/GetLibraryItemsEnableCreditsMarkerGeneration.swift +++ /dev/null @@ -1,10 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). - public enum GetLibraryItemsEnableCreditsMarkerGeneration: String, Codable, APIValue { - case libraryDefault = "-1" - case disabled = "0" - }} diff --git a/Sources/Plexswift/models/operations/GetLibraryItemsEpisodeSort.swift b/Sources/Plexswift/models/operations/GetLibraryItemsEpisodeSort.swift deleted file mode 100644 index 51c5b31..0000000 --- a/Sources/Plexswift/models/operations/GetLibraryItemsEpisodeSort.swift +++ /dev/null @@ -1,11 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first). - public enum GetLibraryItemsEpisodeSort: String, Codable, APIValue { - case libraryDefault = "-1" - case oldestFirst = "0" - case newestFirst = "1" - }} diff --git a/Sources/Plexswift/models/operations/GetLibraryItemsFlattenSeasons.swift b/Sources/Plexswift/models/operations/GetLibraryItemsFlattenSeasons.swift deleted file mode 100644 index a386258..0000000 --- a/Sources/Plexswift/models/operations/GetLibraryItemsFlattenSeasons.swift +++ /dev/null @@ -1,11 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). - public enum GetLibraryItemsFlattenSeasons: String, Codable, APIValue { - case libraryDefault = "-1" - case hide = "0" - case show = "1" - }} diff --git a/Sources/Plexswift/models/operations/GetLibraryItemsMediaGuid.swift b/Sources/Plexswift/models/operations/GetLibraryItemsMediaGuid.swift deleted file mode 100644 index ef91c6f..0000000 --- a/Sources/Plexswift/models/operations/GetLibraryItemsMediaGuid.swift +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetLibraryItemsMediaGuid { - /// Can be one of the following formats: - /// imdb://tt13015952, tmdb://2434012, tvdb://7945991 - /// - public let id: String - - /// Creates an object with the specified parameters - /// - /// - Parameter id: Can be one of the following formats: - /// imdb://tt13015952, tmdb://2434012, tvdb://7945991 - /// - /// - public init(id: String) { - self.id = id - } - }} - -extension Operations.GetLibraryItemsMediaGuid: Codable { - enum CodingKeys: String, CodingKey { - case id - } -} - diff --git a/Sources/Plexswift/models/operations/GetLibraryItemsMetadata.swift b/Sources/Plexswift/models/operations/GetLibraryItemsMetadata.swift index 54078ad..4fb38db 100644 --- a/Sources/Plexswift/models/operations/GetLibraryItemsMetadata.swift +++ b/Sources/Plexswift/models/operations/GetLibraryItemsMetadata.swift @@ -31,11 +31,11 @@ extension Operations { public let director: [Operations.GetLibraryItemsDirector]? public let duration: Int? /// Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). - public let enableCreditsMarkerGeneration: Operations.GetLibraryItemsEnableCreditsMarkerGeneration? + public let enableCreditsMarkerGeneration: Operations.EnableCreditsMarkerGeneration? /// Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first). - public let episodeSort: Operations.GetLibraryItemsEpisodeSort? + public let episodeSort: Operations.EpisodeSort? /// Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). - public let flattenSeasons: Operations.GetLibraryItemsFlattenSeasons? + public let flattenSeasons: Operations.FlattenSeasons? public let genre: [Operations.GetLibraryItemsGenre]? public let grandparentArt: String? public let grandparentGuid: String? @@ -60,8 +60,8 @@ extension Operations { public let media: [Operations.GetLibraryItemsMedia]? /// The Guid object is only included in the response if the `includeGuids` parameter is set to `1`. /// - public let mediaGuid: [Operations.GetLibraryItemsMediaGuid]? - public let metaDataRating: [Operations.GetLibraryItemsMetaDataRating]? + public let mediaGuid: [Operations.MediaGuid]? + public let metaDataRating: [Operations.MetaDataRating]? @DateOnly public private(set) var originallyAvailableAt: Date? public let originalTitle: String? @@ -90,7 +90,7 @@ extension Operations { /// dvd = TheTVDB (DVD), /// absolute = TheTVDB (Absolute)). /// - public let showOrdering: Operations.GetLibraryItemsShowOrdering? + public let showOrdering: Operations.ShowOrdering? public let skipChildren: Bool? public let skipCount: Int? public let slug: String? @@ -134,7 +134,7 @@ extension Operations { /// /// - Parameter updatedAt: Unix epoch datetime in seconds /// - public init(addedAt: Int, guid: String, key: String, ratingKey: String, summary: String, title: String, type: Operations.GetLibraryItemsLibraryType, art: String? = nil, audienceRating: Double? = nil, audienceRatingImage: String? = nil, banner: String? = nil, chapterSource: String? = nil, childCount: Int? = nil, collection: [Operations.GetLibraryItemsCollection]? = nil, contentRating: String? = nil, country: [Operations.GetLibraryItemsCountry]? = nil, director: [Operations.GetLibraryItemsDirector]? = nil, duration: Int? = nil, enableCreditsMarkerGeneration: Operations.GetLibraryItemsEnableCreditsMarkerGeneration? = nil, episodeSort: Operations.GetLibraryItemsEpisodeSort? = nil, flattenSeasons: Operations.GetLibraryItemsFlattenSeasons? = nil, genre: [Operations.GetLibraryItemsGenre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentTheme: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, hasPremiumExtras: String? = nil, hasPremiumPrimaryExtra: String? = nil, image: [Operations.GetLibraryItemsImage]? = nil, index: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, librarySectionID: Int? = nil, librarySectionKey: String? = nil, librarySectionTitle: String? = nil, location: [Operations.GetLibraryItemsLocation]? = nil, media: [Operations.GetLibraryItemsMedia]? = nil, mediaGuid: [Operations.GetLibraryItemsMediaGuid]? = nil, metaDataRating: [Operations.GetLibraryItemsMetaDataRating]? = nil, originallyAvailableAt: Date? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentSlug: String? = nil, parentStudio: String? = nil, parentTheme: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, parentYear: Int? = nil, primaryExtraKey: String? = nil, rating: Double? = nil, ratingImage: String? = nil, role: [Operations.GetLibraryItemsRole]? = nil, seasonCount: Int? = nil, showOrdering: Operations.GetLibraryItemsShowOrdering? = nil, skipChildren: Bool? = nil, skipCount: Int? = nil, slug: String? = nil, studio: String? = nil, tagline: String? = nil, theme: String? = nil, thumb: String? = nil, titleSort: String? = nil, ultraBlurColors: Operations.GetLibraryItemsUltraBlurColors? = nil, updatedAt: Int? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, viewOffset: Int? = nil, writer: [Operations.GetLibraryItemsWriter]? = nil, year: Int? = nil) { + public init(addedAt: Int, guid: String, key: String, ratingKey: String, summary: String, title: String, type: Operations.GetLibraryItemsLibraryType, art: String? = nil, audienceRating: Double? = nil, audienceRatingImage: String? = nil, banner: String? = nil, chapterSource: String? = nil, childCount: Int? = nil, collection: [Operations.GetLibraryItemsCollection]? = nil, contentRating: String? = nil, country: [Operations.GetLibraryItemsCountry]? = nil, director: [Operations.GetLibraryItemsDirector]? = nil, duration: Int? = nil, enableCreditsMarkerGeneration: Operations.EnableCreditsMarkerGeneration? = nil, episodeSort: Operations.EpisodeSort? = nil, flattenSeasons: Operations.FlattenSeasons? = nil, genre: [Operations.GetLibraryItemsGenre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentTheme: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, hasPremiumExtras: String? = nil, hasPremiumPrimaryExtra: String? = nil, image: [Operations.GetLibraryItemsImage]? = nil, index: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, librarySectionID: Int? = nil, librarySectionKey: String? = nil, librarySectionTitle: String? = nil, location: [Operations.GetLibraryItemsLocation]? = nil, media: [Operations.GetLibraryItemsMedia]? = nil, mediaGuid: [Operations.MediaGuid]? = nil, metaDataRating: [Operations.MetaDataRating]? = nil, originallyAvailableAt: Date? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentSlug: String? = nil, parentStudio: String? = nil, parentTheme: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, parentYear: Int? = nil, primaryExtraKey: String? = nil, rating: Double? = nil, ratingImage: String? = nil, role: [Operations.GetLibraryItemsRole]? = nil, seasonCount: Int? = nil, showOrdering: Operations.ShowOrdering? = nil, skipChildren: Bool? = nil, skipCount: Int? = nil, slug: String? = nil, studio: String? = nil, tagline: String? = nil, theme: String? = nil, thumb: String? = nil, titleSort: String? = nil, ultraBlurColors: Operations.GetLibraryItemsUltraBlurColors? = nil, updatedAt: Int? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, viewOffset: Int? = nil, writer: [Operations.GetLibraryItemsWriter]? = nil, year: Int? = nil) { self.addedAt = addedAt self.guid = guid self.key = key @@ -314,9 +314,9 @@ extension Operations.GetLibraryItemsMetadata: Codable { self.country = try container.decodeIfPresent([Operations.GetLibraryItemsCountry].self, forKey: .country) self.director = try container.decodeIfPresent([Operations.GetLibraryItemsDirector].self, forKey: .director) self.duration = try container.decodeIfPresent(Int.self, forKey: .duration) - self.enableCreditsMarkerGeneration = try container.decodeIfPresent(Operations.GetLibraryItemsEnableCreditsMarkerGeneration.self, forKey: .enableCreditsMarkerGeneration) - self.episodeSort = try container.decodeIfPresent(Operations.GetLibraryItemsEpisodeSort.self, forKey: .episodeSort) - self.flattenSeasons = try container.decodeIfPresent(Operations.GetLibraryItemsFlattenSeasons.self, forKey: .flattenSeasons) + self.enableCreditsMarkerGeneration = try container.decodeIfPresent(Operations.EnableCreditsMarkerGeneration.self, forKey: .enableCreditsMarkerGeneration) + self.episodeSort = try container.decodeIfPresent(Operations.EpisodeSort.self, forKey: .episodeSort) + self.flattenSeasons = try container.decodeIfPresent(Operations.FlattenSeasons.self, forKey: .flattenSeasons) self.genre = try container.decodeIfPresent([Operations.GetLibraryItemsGenre].self, forKey: .genre) self.grandparentArt = try container.decodeIfPresent(String.self, forKey: .grandparentArt) self.grandparentGuid = try container.decodeIfPresent(String.self, forKey: .grandparentGuid) @@ -337,8 +337,8 @@ extension Operations.GetLibraryItemsMetadata: Codable { self.librarySectionTitle = try container.decodeIfPresent(String.self, forKey: .librarySectionTitle) self.location = try container.decodeIfPresent([Operations.GetLibraryItemsLocation].self, forKey: .location) self.media = try container.decodeIfPresent([Operations.GetLibraryItemsMedia].self, forKey: .media) - self.mediaGuid = try container.decodeIfPresent([Operations.GetLibraryItemsMediaGuid].self, forKey: .mediaGuid) - self.metaDataRating = try container.decodeIfPresent([Operations.GetLibraryItemsMetaDataRating].self, forKey: .metaDataRating) + self.mediaGuid = try container.decodeIfPresent([Operations.MediaGuid].self, forKey: .mediaGuid) + self.metaDataRating = try container.decodeIfPresent([Operations.MetaDataRating].self, forKey: .metaDataRating) self._originallyAvailableAt = try container.decodeIfPresent(DateOnly.self, forKey: .originallyAvailableAt) ?? DateOnly(wrappedValue: nil) self.originalTitle = try container.decodeIfPresent(String.self, forKey: .originalTitle) self.parentGuid = try container.decodeIfPresent(String.self, forKey: .parentGuid) @@ -356,7 +356,7 @@ extension Operations.GetLibraryItemsMetadata: Codable { self.ratingImage = try container.decodeIfPresent(String.self, forKey: .ratingImage) self.role = try container.decodeIfPresent([Operations.GetLibraryItemsRole].self, forKey: .role) self.seasonCount = try container.decodeIfPresent(Int.self, forKey: .seasonCount) - self.showOrdering = try container.decodeIfPresent(Operations.GetLibraryItemsShowOrdering.self, forKey: .showOrdering) + self.showOrdering = try container.decodeIfPresent(Operations.ShowOrdering.self, forKey: .showOrdering) self.skipChildren = try container.decodeIfPresent(Bool.self, forKey: .skipChildren) self.skipCount = try container.decodeIfPresent(Int.self, forKey: .skipCount) self.slug = try container.decodeIfPresent(String.self, forKey: .slug) diff --git a/Sources/Plexswift/models/operations/GetLibraryItemsShowOrdering.swift b/Sources/Plexswift/models/operations/GetLibraryItemsShowOrdering.swift deleted file mode 100644 index c6778ce..0000000 --- a/Sources/Plexswift/models/operations/GetLibraryItemsShowOrdering.swift +++ /dev/null @@ -1,19 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// Setting that indicates the episode ordering for the show. - /// None = Library default, - /// tmdbAiring = The Movie Database (Aired), - /// aired = TheTVDB (Aired), - /// dvd = TheTVDB (DVD), - /// absolute = TheTVDB (Absolute)). - /// - public enum GetLibraryItemsShowOrdering: String, Codable, APIValue { - case `none` = "None" - case tmdbAiring = "tmdbAiring" - case tvdbAired = "aired" - case tvdbDvd = "dvd" - case tvdbAbsolute = "absolute" - }} diff --git a/Sources/Plexswift/models/operations/GetMediaMetaDataMedia.swift b/Sources/Plexswift/models/operations/GetMediaMetaDataMedia.swift index 1d23388..524a7a7 100644 --- a/Sources/Plexswift/models/operations/GetMediaMetaDataMedia.swift +++ b/Sources/Plexswift/models/operations/GetMediaMetaDataMedia.swift @@ -5,12 +5,8 @@ import Foundation extension Operations { /// A model object public struct GetMediaMetaDataMedia { - /// Indicates whether voice activity is detected. - public let hasVoiceActivity: Bool /// Unique media identifier. public let id: Int - /// An array of parts for this media item. - public let part: [Operations.GetMediaMetaDataPart] /// Aspect ratio of the video. @DecimalSerialized public private(set) var aspectRatio: Double? @@ -28,10 +24,14 @@ extension Operations { /// Duration of the media in milliseconds. public let duration: Int? public let has64bitOffsets: Bool? + /// Indicates whether voice activity is detected. + public let hasVoiceActivity: Bool? /// Video height in pixels. public let height: Int? /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true public let optimizedForStreaming: Operations.GetMediaMetaDataOptimizedForStreaming? + /// An array of parts for this media item. + public let part: [Operations.GetMediaMetaDataPart]? /// Video codec used. public let videoCodec: String? /// Frame rate of the video. Values found include NTSC, PAL, 24p @@ -46,9 +46,7 @@ extension Operations { /// Creates an object with the specified parameters /// - /// - Parameter hasVoiceActivity: Indicates whether voice activity is detected. /// - Parameter id: Unique media identifier. - /// - Parameter part: An array of parts for this media item. /// - Parameter aspectRatio: Aspect ratio of the video. /// - Parameter audioChannels: Number of audio channels. /// - Parameter audioCodec: Audio codec used. @@ -56,8 +54,10 @@ extension Operations { /// - Parameter bitrate: Bitrate in bits per second. /// - Parameter container: File container type. /// - Parameter duration: Duration of the media in milliseconds. + /// - Parameter hasVoiceActivity: Indicates whether voice activity is detected. /// - Parameter height: Video height in pixels. /// - Parameter optimizedForStreaming: Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true + /// - Parameter part: An array of parts for this media item. /// - Parameter videoCodec: Video codec used. /// - Parameter videoFrameRate: Frame rate of the video. Values found include NTSC, PAL, 24p /// @@ -65,10 +65,8 @@ extension Operations { /// - Parameter videoResolution: Video resolution (e.g., 4k). /// - Parameter width: Video width in pixels. /// - public init(hasVoiceActivity: Bool, id: Int, part: [Operations.GetMediaMetaDataPart], aspectRatio: Double? = nil, audioChannels: Int? = nil, audioCodec: String? = nil, audioProfile: String? = nil, bitrate: Int? = nil, container: String? = nil, displayOffset: Int? = nil, duration: Int? = nil, has64bitOffsets: Bool? = nil, height: Int? = nil, optimizedForStreaming: Operations.GetMediaMetaDataOptimizedForStreaming? = nil, videoCodec: String? = nil, videoFrameRate: String? = nil, videoProfile: String? = nil, videoResolution: String? = nil, width: Int? = nil) { - self.hasVoiceActivity = hasVoiceActivity + public init(id: Int, aspectRatio: Double? = nil, audioChannels: Int? = nil, audioCodec: String? = nil, audioProfile: String? = nil, bitrate: Int? = nil, container: String? = nil, displayOffset: Int? = nil, duration: Int? = nil, has64bitOffsets: Bool? = nil, hasVoiceActivity: Bool? = nil, height: Int? = nil, optimizedForStreaming: Operations.GetMediaMetaDataOptimizedForStreaming? = nil, part: [Operations.GetMediaMetaDataPart]? = nil, videoCodec: String? = nil, videoFrameRate: String? = nil, videoProfile: String? = nil, videoResolution: String? = nil, width: Int? = nil) { self.id = id - self.part = part self._aspectRatio = DecimalSerialized(wrappedValue: aspectRatio) self.audioChannels = audioChannels self.audioCodec = audioCodec @@ -78,8 +76,10 @@ extension Operations { self.displayOffset = displayOffset self.duration = duration self.has64bitOffsets = has64bitOffsets + self.hasVoiceActivity = hasVoiceActivity self.height = height self.optimizedForStreaming = optimizedForStreaming + self.part = part self.videoCodec = videoCodec self.videoFrameRate = videoFrameRate self.videoProfile = videoProfile @@ -90,9 +90,7 @@ extension Operations { extension Operations.GetMediaMetaDataMedia: Codable { enum CodingKeys: String, CodingKey { - case hasVoiceActivity case id - case part = "Part" case aspectRatio case audioChannels case audioCodec @@ -102,8 +100,10 @@ extension Operations.GetMediaMetaDataMedia: Codable { case displayOffset case duration case has64bitOffsets + case hasVoiceActivity case height case optimizedForStreaming + case part = "Part" case videoCodec case videoFrameRate case videoProfile @@ -113,9 +113,7 @@ extension Operations.GetMediaMetaDataMedia: Codable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - self.hasVoiceActivity = try container.decode(Bool.self, forKey: .hasVoiceActivity) self.id = try container.decode(Int.self, forKey: .id) - self.part = try container.decode([Operations.GetMediaMetaDataPart].self, forKey: .part) self._aspectRatio = try container.decodeIfPresent(DecimalSerialized.self, forKey: .aspectRatio) ?? DecimalSerialized(wrappedValue: nil) self.audioChannels = try container.decodeIfPresent(Int.self, forKey: .audioChannels) self.audioCodec = try container.decodeIfPresent(String.self, forKey: .audioCodec) @@ -125,8 +123,10 @@ extension Operations.GetMediaMetaDataMedia: Codable { self.displayOffset = try container.decodeIfPresent(Int.self, forKey: .displayOffset) self.duration = try container.decodeIfPresent(Int.self, forKey: .duration) self.has64bitOffsets = try container.decodeIfPresent(Bool.self, forKey: .has64bitOffsets) + self.hasVoiceActivity = try container.decodeIfPresent(Bool.self, forKey: .hasVoiceActivity) self.height = try container.decodeIfPresent(Int.self, forKey: .height) self.optimizedForStreaming = try container.decodeIfPresent(Operations.GetMediaMetaDataOptimizedForStreaming.self, forKey: .optimizedForStreaming) + self.part = try container.decodeIfPresent([Operations.GetMediaMetaDataPart].self, forKey: .part) self.videoCodec = try container.decodeIfPresent(String.self, forKey: .videoCodec) self.videoFrameRate = try container.decodeIfPresent(String.self, forKey: .videoFrameRate) self.videoProfile = try container.decodeIfPresent(String.self, forKey: .videoProfile) @@ -136,9 +136,7 @@ extension Operations.GetMediaMetaDataMedia: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(self.hasVoiceActivity, forKey: .hasVoiceActivity) try container.encode(self.id, forKey: .id) - try container.encode(self.part, forKey: .part) if self.aspectRatio != nil { try container.encode(self._aspectRatio, forKey: .aspectRatio) } @@ -150,8 +148,10 @@ extension Operations.GetMediaMetaDataMedia: Codable { try container.encodeIfPresent(self.displayOffset, forKey: .displayOffset) try container.encodeIfPresent(self.duration, forKey: .duration) try container.encodeIfPresent(self.has64bitOffsets, forKey: .has64bitOffsets) + try container.encodeIfPresent(self.hasVoiceActivity, forKey: .hasVoiceActivity) try container.encodeIfPresent(self.height, forKey: .height) try container.encodeIfPresent(self.optimizedForStreaming, forKey: .optimizedForStreaming) + try container.encodeIfPresent(self.part, forKey: .part) try container.encodeIfPresent(self.videoCodec, forKey: .videoCodec) try container.encodeIfPresent(self.videoFrameRate, forKey: .videoFrameRate) try container.encodeIfPresent(self.videoProfile, forKey: .videoProfile) diff --git a/Sources/Plexswift/models/operations/GetMediaMetaDataMetadata.swift b/Sources/Plexswift/models/operations/GetMediaMetaDataMetadata.swift index 009c821..ae5de80 100644 --- a/Sources/Plexswift/models/operations/GetMediaMetaDataMetadata.swift +++ b/Sources/Plexswift/models/operations/GetMediaMetaDataMetadata.swift @@ -96,7 +96,7 @@ extension Operations { public let parentTitle: String? public let primaryExtraKey: String? /// An array of Writer roles. - public let producer: [Operations.Producer]? + public let producer: [Operations.GetMediaMetaDataProducer]? /// The general rating @DecimalSerialized public private(set) var rating: Double? @@ -107,7 +107,7 @@ extension Operations { /// An array of Actor roles. public let role: [Operations.GetMediaMetaDataRole]? /// An array of similar content objects. - public let similar: [Operations.Similar]? + public let similar: [Operations.GetMediaMetaDataSimilar]? /// The number of times the item has been skipped. public let skipCount: Int? /// A URL-friendly identifier for the item. @@ -183,7 +183,7 @@ extension Operations { /// - Parameter viewedLeafCount: The number of episodes that have been viewed. /// - Parameter writer: An array of Writer roles. /// - public init(addedAt: Int, art: String, duration: Int, guid: String, image: [Operations.GetMediaMetaDataImage], key: String, librarySectionID: Int, librarySectionKey: String, librarySectionTitle: String, ratingKey: String, summary: String, thumb: String, title: String, type: String, ultraBlurColors: Operations.GetMediaMetaDataUltraBlurColors, updatedAt: Int, year: Int, audienceRating: Double? = nil, audienceRatingImage: String? = nil, chapterSource: String? = nil, childCount: Int? = nil, contentRating: String? = nil, country: [Operations.GetMediaMetaDataCountry]? = nil, director: [Operations.GetMediaMetaDataDirector]? = nil, genre: [Operations.GetMediaMetaDataGenre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, guids: [Operations.GetMediaMetaDataGuids]? = nil, index: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, location: [Operations.GetMediaMetaDataLocation]? = nil, media: [Operations.GetMediaMetaDataMedia]? = nil, originallyAvailableAt: Date? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, primaryExtraKey: String? = nil, producer: [Operations.Producer]? = nil, rating: Double? = nil, ratingImage: String? = nil, ratings: [Operations.Ratings]? = nil, role: [Operations.GetMediaMetaDataRole]? = nil, similar: [Operations.Similar]? = nil, skipCount: Int? = nil, slug: String? = nil, studio: String? = nil, tagline: String? = nil, theme: String? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, writer: [Operations.GetMediaMetaDataWriter]? = nil) { + public init(addedAt: Int, art: String, duration: Int, guid: String, image: [Operations.GetMediaMetaDataImage], key: String, librarySectionID: Int, librarySectionKey: String, librarySectionTitle: String, ratingKey: String, summary: String, thumb: String, title: String, type: String, ultraBlurColors: Operations.GetMediaMetaDataUltraBlurColors, updatedAt: Int, year: Int, audienceRating: Double? = nil, audienceRatingImage: String? = nil, chapterSource: String? = nil, childCount: Int? = nil, contentRating: String? = nil, country: [Operations.GetMediaMetaDataCountry]? = nil, director: [Operations.GetMediaMetaDataDirector]? = nil, genre: [Operations.GetMediaMetaDataGenre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, guids: [Operations.GetMediaMetaDataGuids]? = nil, index: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, location: [Operations.GetMediaMetaDataLocation]? = nil, media: [Operations.GetMediaMetaDataMedia]? = nil, originallyAvailableAt: Date? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, primaryExtraKey: String? = nil, producer: [Operations.GetMediaMetaDataProducer]? = nil, rating: Double? = nil, ratingImage: String? = nil, ratings: [Operations.Ratings]? = nil, role: [Operations.GetMediaMetaDataRole]? = nil, similar: [Operations.GetMediaMetaDataSimilar]? = nil, skipCount: Int? = nil, slug: String? = nil, studio: String? = nil, tagline: String? = nil, theme: String? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, writer: [Operations.GetMediaMetaDataWriter]? = nil) { self.addedAt = addedAt self.art = art self.duration = duration @@ -362,12 +362,12 @@ extension Operations.GetMediaMetaDataMetadata: Codable { self.parentThumb = try container.decodeIfPresent(String.self, forKey: .parentThumb) self.parentTitle = try container.decodeIfPresent(String.self, forKey: .parentTitle) self.primaryExtraKey = try container.decodeIfPresent(String.self, forKey: .primaryExtraKey) - self.producer = try container.decodeIfPresent([Operations.Producer].self, forKey: .producer) + self.producer = try container.decodeIfPresent([Operations.GetMediaMetaDataProducer].self, forKey: .producer) self._rating = try container.decodeIfPresent(DecimalSerialized.self, forKey: .rating) ?? DecimalSerialized(wrappedValue: nil) self.ratingImage = try container.decodeIfPresent(String.self, forKey: .ratingImage) self.ratings = try container.decodeIfPresent([Operations.Ratings].self, forKey: .ratings) self.role = try container.decodeIfPresent([Operations.GetMediaMetaDataRole].self, forKey: .role) - self.similar = try container.decodeIfPresent([Operations.Similar].self, forKey: .similar) + self.similar = try container.decodeIfPresent([Operations.GetMediaMetaDataSimilar].self, forKey: .similar) self.skipCount = try container.decodeIfPresent(Int.self, forKey: .skipCount) self.slug = try container.decodeIfPresent(String.self, forKey: .slug) self.studio = try container.decodeIfPresent(String.self, forKey: .studio) diff --git a/Sources/Plexswift/models/operations/GetMediaMetaDataProducer.swift b/Sources/Plexswift/models/operations/GetMediaMetaDataProducer.swift new file mode 100644 index 0000000..8f1a025 --- /dev/null +++ b/Sources/Plexswift/models/operations/GetMediaMetaDataProducer.swift @@ -0,0 +1,50 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +import Foundation + +extension Operations { + /// A model object + public struct GetMediaMetaDataProducer { + /// The filter string for the role. + public let filter: String + /// The unique role identifier. + public let id: Int + /// The actor's name. + public let tag: String + /// A key associated with the actor tag. + public let tagKey: String + /// The character name or role. + public let role: String? + /// URL for the role thumbnail image. + public let thumb: String? + + /// Creates an object with the specified parameters + /// + /// - Parameter filter: The filter string for the role. + /// - Parameter id: The unique role identifier. + /// - Parameter tag: The actor's name. + /// - Parameter tagKey: A key associated with the actor tag. + /// - Parameter role: The character name or role. + /// - Parameter thumb: URL for the role thumbnail image. + /// + public init(filter: String, id: Int, tag: String, tagKey: String, role: String? = nil, thumb: String? = nil) { + self.filter = filter + self.id = id + self.tag = tag + self.tagKey = tagKey + self.role = role + self.thumb = thumb + } + }} + +extension Operations.GetMediaMetaDataProducer: Codable { + enum CodingKeys: String, CodingKey { + case filter + case id + case tag + case tagKey + case role + case thumb + } +} + diff --git a/Sources/Plexswift/models/operations/GetMediaMetaDataSimilar.swift b/Sources/Plexswift/models/operations/GetMediaMetaDataSimilar.swift new file mode 100644 index 0000000..9fb73c5 --- /dev/null +++ b/Sources/Plexswift/models/operations/GetMediaMetaDataSimilar.swift @@ -0,0 +1,35 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +import Foundation + +extension Operations { + /// A model object + public struct GetMediaMetaDataSimilar { + /// The filter string for similar items. + public let filter: String + /// The unique similar item identifier. + public let id: Int + /// The tag or title of the similar content. + public let tag: String + + /// Creates an object with the specified parameters + /// + /// - Parameter filter: The filter string for similar items. + /// - Parameter id: The unique similar item identifier. + /// - Parameter tag: The tag or title of the similar content. + /// + public init(filter: String, id: Int, tag: String) { + self.filter = filter + self.id = id + self.tag = tag + } + }} + +extension Operations.GetMediaMetaDataSimilar: Codable { + enum CodingKeys: String, CodingKey { + case filter + case id + case tag + } +} + diff --git a/Sources/Plexswift/models/operations/GetMediaMetaDataStream.swift b/Sources/Plexswift/models/operations/GetMediaMetaDataStream.swift index fdbe4ab..cebffea 100644 --- a/Sources/Plexswift/models/operations/GetMediaMetaDataStream.swift +++ b/Sources/Plexswift/models/operations/GetMediaMetaDataStream.swift @@ -15,12 +15,6 @@ extension Operations { public let id: Int /// Index of the stream. public let index: Int - /// Language of the stream. - public let language: String - /// ISO language code. - public let languageCode: String - /// Language tag (e.g., en). - public let languageTag: String /// Stream type (1=video, 2=audio, 3=subtitle). public let streamType: Int /// Audio channel layout. @@ -37,6 +31,7 @@ extension Operations { public let chromaLocation: String? /// Chroma subsampling format. public let chromaSubsampling: String? + public let closedCaptions: Bool? /// Coded video height. public let codedHeight: Int? /// Coded video width. @@ -69,6 +64,7 @@ extension Operations { public let doviVersion: String? /// Indicates if the stream is a dub. public let dub: Bool? + public let embeddedInVideo: String? public let forced: Bool? /// Frame rate of the stream. @DecimalSerialized @@ -80,6 +76,12 @@ extension Operations { public let hearingImpaired: Bool? /// Height of the video stream. public let height: Int? + /// Language of the stream. + public let language: String? + /// ISO language code. + public let languageCode: String? + /// Language tag (e.g., en). + public let languageTag: String? /// Video level. public let level: Int? /// Indicates if this is the original stream. @@ -105,9 +107,6 @@ extension Operations { /// - Parameter extendedDisplayTitle: Extended display title for the stream. /// - Parameter id: Unique stream identifier. /// - Parameter index: Index of the stream. - /// - Parameter language: Language of the stream. - /// - Parameter languageCode: ISO language code. - /// - Parameter languageTag: Language tag (e.g., en). /// - Parameter streamType: Stream type (1=video, 2=audio, 3=subtitle). /// - Parameter audioChannelLayout: Audio channel layout. /// - Parameter bitDepth: Bit depth of the video stream. @@ -136,6 +135,9 @@ extension Operations { /// - Parameter headerCompression: Indicates whether header compression is enabled. /// - Parameter hearingImpaired: Indicates if the stream is for the hearing impaired. /// - Parameter height: Height of the video stream. + /// - Parameter language: Language of the stream. + /// - Parameter languageCode: ISO language code. + /// - Parameter languageTag: Language tag (e.g., en). /// - Parameter level: Video level. /// - Parameter original: Indicates if this is the original stream. /// - Parameter profile: Video profile. @@ -145,15 +147,12 @@ extension Operations { /// - Parameter title: Optional title for the stream (e.g., language variant). /// - Parameter width: Width of the video stream. /// - public init(codec: String, displayTitle: String, extendedDisplayTitle: String, id: Int, index: Int, language: String, languageCode: String, languageTag: String, streamType: Int, audioChannelLayout: String? = nil, bitDepth: Int? = nil, bitrate: Int? = nil, canAutoSync: Bool? = nil, channels: Int? = nil, chromaLocation: String? = nil, chromaSubsampling: String? = nil, codedHeight: Int? = nil, codedWidth: Int? = nil, colorPrimaries: String? = nil, colorRange: String? = nil, colorSpace: String? = nil, colorTrc: String? = nil, `default`: Bool? = nil, doviblCompatID: Int? = nil, doviblPresent: Bool? = nil, dovielPresent: Bool? = nil, doviLevel: Int? = nil, doviPresent: Bool? = nil, doviProfile: Int? = nil, dovirpuPresent: Bool? = nil, doviVersion: String? = nil, dub: Bool? = nil, forced: Bool? = nil, frameRate: Double? = nil, hasScalingMatrix: Bool? = nil, headerCompression: Bool? = nil, hearingImpaired: Bool? = nil, height: Int? = nil, level: Int? = nil, original: Bool? = nil, profile: String? = nil, refFrames: Int? = nil, samplingRate: Int? = nil, scanType: String? = nil, selected: Bool? = nil, title: String? = nil, width: Int? = nil) { + public init(codec: String, displayTitle: String, extendedDisplayTitle: String, id: Int, index: Int, streamType: Int, audioChannelLayout: String? = nil, bitDepth: Int? = nil, bitrate: Int? = nil, canAutoSync: Bool? = nil, channels: Int? = nil, chromaLocation: String? = nil, chromaSubsampling: String? = nil, closedCaptions: Bool? = nil, codedHeight: Int? = nil, codedWidth: Int? = nil, colorPrimaries: String? = nil, colorRange: String? = nil, colorSpace: String? = nil, colorTrc: String? = nil, `default`: Bool? = nil, doviblCompatID: Int? = nil, doviblPresent: Bool? = nil, dovielPresent: Bool? = nil, doviLevel: Int? = nil, doviPresent: Bool? = nil, doviProfile: Int? = nil, dovirpuPresent: Bool? = nil, doviVersion: String? = nil, dub: Bool? = nil, embeddedInVideo: String? = nil, forced: Bool? = nil, frameRate: Double? = nil, hasScalingMatrix: Bool? = nil, headerCompression: Bool? = nil, hearingImpaired: Bool? = nil, height: Int? = nil, language: String? = nil, languageCode: String? = nil, languageTag: String? = nil, level: Int? = nil, original: Bool? = nil, profile: String? = nil, refFrames: Int? = nil, samplingRate: Int? = nil, scanType: String? = nil, selected: Bool? = nil, title: String? = nil, width: Int? = nil) { self.codec = codec self.displayTitle = displayTitle self.extendedDisplayTitle = extendedDisplayTitle self.id = id self.index = index - self.language = language - self.languageCode = languageCode - self.languageTag = languageTag self.streamType = streamType self.audioChannelLayout = audioChannelLayout self.bitDepth = bitDepth @@ -162,6 +161,7 @@ extension Operations { self.channels = channels self.chromaLocation = chromaLocation self.chromaSubsampling = chromaSubsampling + self.closedCaptions = closedCaptions self.codedHeight = codedHeight self.codedWidth = codedWidth self.colorPrimaries = colorPrimaries @@ -178,12 +178,16 @@ extension Operations { self.dovirpuPresent = dovirpuPresent self.doviVersion = doviVersion self.dub = dub + self.embeddedInVideo = embeddedInVideo self.forced = forced self._frameRate = DecimalSerialized(wrappedValue: frameRate) self.hasScalingMatrix = hasScalingMatrix self.headerCompression = headerCompression self.hearingImpaired = hearingImpaired self.height = height + self.language = language + self.languageCode = languageCode + self.languageTag = languageTag self.level = level self.original = original self.profile = profile @@ -203,9 +207,6 @@ extension Operations.GetMediaMetaDataStream: Codable { case extendedDisplayTitle case id case index - case language - case languageCode - case languageTag case streamType case audioChannelLayout case bitDepth @@ -214,6 +215,7 @@ extension Operations.GetMediaMetaDataStream: Codable { case channels case chromaLocation case chromaSubsampling + case closedCaptions case codedHeight case codedWidth case colorPrimaries @@ -230,12 +232,16 @@ extension Operations.GetMediaMetaDataStream: Codable { case dovirpuPresent = "DOVIRPUPresent" case doviVersion = "DOVIVersion" case dub + case embeddedInVideo case forced case frameRate case hasScalingMatrix case headerCompression case hearingImpaired case height + case language + case languageCode + case languageTag case level case original case profile @@ -254,9 +260,6 @@ extension Operations.GetMediaMetaDataStream: Codable { self.extendedDisplayTitle = try container.decode(String.self, forKey: .extendedDisplayTitle) self.id = try container.decode(Int.self, forKey: .id) self.index = try container.decode(Int.self, forKey: .index) - self.language = try container.decode(String.self, forKey: .language) - self.languageCode = try container.decode(String.self, forKey: .languageCode) - self.languageTag = try container.decode(String.self, forKey: .languageTag) self.streamType = try container.decode(Int.self, forKey: .streamType) self.audioChannelLayout = try container.decodeIfPresent(String.self, forKey: .audioChannelLayout) self.bitDepth = try container.decodeIfPresent(Int.self, forKey: .bitDepth) @@ -265,6 +268,7 @@ extension Operations.GetMediaMetaDataStream: Codable { self.channels = try container.decodeIfPresent(Int.self, forKey: .channels) self.chromaLocation = try container.decodeIfPresent(String.self, forKey: .chromaLocation) self.chromaSubsampling = try container.decodeIfPresent(String.self, forKey: .chromaSubsampling) + self.closedCaptions = try container.decodeIfPresent(Bool.self, forKey: .closedCaptions) self.codedHeight = try container.decodeIfPresent(Int.self, forKey: .codedHeight) self.codedWidth = try container.decodeIfPresent(Int.self, forKey: .codedWidth) self.colorPrimaries = try container.decodeIfPresent(String.self, forKey: .colorPrimaries) @@ -281,12 +285,16 @@ extension Operations.GetMediaMetaDataStream: Codable { self.dovirpuPresent = try container.decodeIfPresent(Bool.self, forKey: .dovirpuPresent) self.doviVersion = try container.decodeIfPresent(String.self, forKey: .doviVersion) self.dub = try container.decodeIfPresent(Bool.self, forKey: .dub) + self.embeddedInVideo = try container.decodeIfPresent(String.self, forKey: .embeddedInVideo) self.forced = try container.decodeIfPresent(Bool.self, forKey: .forced) self._frameRate = try container.decodeIfPresent(DecimalSerialized.self, forKey: .frameRate) ?? DecimalSerialized(wrappedValue: nil) self.hasScalingMatrix = try container.decodeIfPresent(Bool.self, forKey: .hasScalingMatrix) self.headerCompression = try container.decodeIfPresent(Bool.self, forKey: .headerCompression) self.hearingImpaired = try container.decodeIfPresent(Bool.self, forKey: .hearingImpaired) self.height = try container.decodeIfPresent(Int.self, forKey: .height) + self.language = try container.decodeIfPresent(String.self, forKey: .language) + self.languageCode = try container.decodeIfPresent(String.self, forKey: .languageCode) + self.languageTag = try container.decodeIfPresent(String.self, forKey: .languageTag) self.level = try container.decodeIfPresent(Int.self, forKey: .level) self.original = try container.decodeIfPresent(Bool.self, forKey: .original) self.profile = try container.decodeIfPresent(String.self, forKey: .profile) @@ -305,9 +313,6 @@ extension Operations.GetMediaMetaDataStream: Codable { try container.encode(self.extendedDisplayTitle, forKey: .extendedDisplayTitle) try container.encode(self.id, forKey: .id) try container.encode(self.index, forKey: .index) - try container.encode(self.language, forKey: .language) - try container.encode(self.languageCode, forKey: .languageCode) - try container.encode(self.languageTag, forKey: .languageTag) try container.encode(self.streamType, forKey: .streamType) try container.encodeIfPresent(self.audioChannelLayout, forKey: .audioChannelLayout) try container.encodeIfPresent(self.bitDepth, forKey: .bitDepth) @@ -316,6 +321,7 @@ extension Operations.GetMediaMetaDataStream: Codable { try container.encodeIfPresent(self.channels, forKey: .channels) try container.encodeIfPresent(self.chromaLocation, forKey: .chromaLocation) try container.encodeIfPresent(self.chromaSubsampling, forKey: .chromaSubsampling) + try container.encodeIfPresent(self.closedCaptions, forKey: .closedCaptions) try container.encodeIfPresent(self.codedHeight, forKey: .codedHeight) try container.encodeIfPresent(self.codedWidth, forKey: .codedWidth) try container.encodeIfPresent(self.colorPrimaries, forKey: .colorPrimaries) @@ -332,6 +338,7 @@ extension Operations.GetMediaMetaDataStream: Codable { try container.encodeIfPresent(self.dovirpuPresent, forKey: .dovirpuPresent) try container.encodeIfPresent(self.doviVersion, forKey: .doviVersion) try container.encodeIfPresent(self.dub, forKey: .dub) + try container.encodeIfPresent(self.embeddedInVideo, forKey: .embeddedInVideo) try container.encodeIfPresent(self.forced, forKey: .forced) if self.frameRate != nil { try container.encode(self._frameRate, forKey: .frameRate) @@ -340,6 +347,9 @@ extension Operations.GetMediaMetaDataStream: Codable { try container.encodeIfPresent(self.headerCompression, forKey: .headerCompression) try container.encodeIfPresent(self.hearingImpaired, forKey: .hearingImpaired) try container.encodeIfPresent(self.height, forKey: .height) + try container.encodeIfPresent(self.language, forKey: .language) + try container.encodeIfPresent(self.languageCode, forKey: .languageCode) + try container.encodeIfPresent(self.languageTag, forKey: .languageTag) try container.encodeIfPresent(self.level, forKey: .level) try container.encodeIfPresent(self.original, forKey: .original) try container.encodeIfPresent(self.profile, forKey: .profile) diff --git a/Sources/Plexswift/models/operations/GetOnDeckBadRequest.swift b/Sources/Plexswift/models/operations/GetOnDeckBadRequest.swift deleted file mode 100644 index 74fb88e..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckBadRequest.swift +++ /dev/null @@ -1,23 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// Bad Request - A parameter was not specified, or was specified incorrectly. - public struct GetOnDeckBadRequest { - public let errors: [Operations.GetOnDeckErrors]? - - /// Creates a request model with the specified parameters - /// - /// - public init(errors: [Operations.GetOnDeckErrors]? = nil) { - self.errors = errors - } - }} - -extension Operations.GetOnDeckBadRequest: Codable { - enum CodingKeys: String, CodingKey { - case errors - } -} - diff --git a/Sources/Plexswift/models/operations/GetOnDeckErrors.swift b/Sources/Plexswift/models/operations/GetOnDeckErrors.swift deleted file mode 100644 index 016b8a7..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckErrors.swift +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetOnDeckErrors { - public let code: Int? - public let message: String? - public let status: Int? - - /// Creates an object with the specified parameters - /// - /// - public init(code: Int? = nil, message: String? = nil, status: Int? = nil) { - self.code = code - self.message = message - self.status = status - } - }} - -extension Operations.GetOnDeckErrors: Codable { - enum CodingKeys: String, CodingKey { - case code - case message - case status - } -} - diff --git a/Sources/Plexswift/models/operations/GetOnDeckLibraryErrors.swift b/Sources/Plexswift/models/operations/GetOnDeckLibraryErrors.swift deleted file mode 100644 index df2d53d..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckLibraryErrors.swift +++ /dev/null @@ -1,29 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetOnDeckLibraryErrors { - public let code: Int? - public let message: String? - public let status: Int? - - /// Creates an object with the specified parameters - /// - /// - public init(code: Int? = nil, message: String? = nil, status: Int? = nil) { - self.code = code - self.message = message - self.status = status - } - }} - -extension Operations.GetOnDeckLibraryErrors: Codable { - enum CodingKeys: String, CodingKey { - case code - case message - case status - } -} - diff --git a/Sources/Plexswift/models/operations/GetOnDeckMedia.swift b/Sources/Plexswift/models/operations/GetOnDeckMedia.swift deleted file mode 100644 index 4398ef9..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckMedia.swift +++ /dev/null @@ -1,147 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetOnDeckMedia { - @DecimalSerialized - public private(set) var aspectRatio: Double? - @DecimalSerialized - public private(set) var audioChannels: Double? - public let audioCodec: String? - public let audioProfile: String? - @DecimalSerialized - public private(set) var bitrate: Double? - public let container: String? - @DecimalSerialized - public private(set) var duration: Double? - @DecimalSerialized - public private(set) var height: Double? - @DecimalSerialized - public private(set) var id: Double? - public let part: [Operations.GetOnDeckPart]? - public let videoCodec: String? - public let videoFrameRate: String? - public let videoProfile: String? - public let videoResolution: String? - @DecimalSerialized - public private(set) var width: Double? - - /// Creates an object with the specified parameters - /// - /// - public init(aspectRatio: Double? = nil, audioChannels: Double? = nil, audioCodec: String? = nil, audioProfile: String? = nil, bitrate: Double? = nil, container: String? = nil, duration: Double? = nil, height: Double? = nil, id: Double? = nil, part: [Operations.GetOnDeckPart]? = nil, videoCodec: String? = nil, videoFrameRate: String? = nil, videoProfile: String? = nil, videoResolution: String? = nil, width: Double? = nil) { - self._aspectRatio = DecimalSerialized(wrappedValue: aspectRatio) - self._audioChannels = DecimalSerialized(wrappedValue: audioChannels) - self.audioCodec = audioCodec - self.audioProfile = audioProfile - self._bitrate = DecimalSerialized(wrappedValue: bitrate) - self.container = container - self._duration = DecimalSerialized(wrappedValue: duration) - self._height = DecimalSerialized(wrappedValue: height) - self._id = DecimalSerialized(wrappedValue: id) - self.part = part - self.videoCodec = videoCodec - self.videoFrameRate = videoFrameRate - self.videoProfile = videoProfile - self.videoResolution = videoResolution - self._width = DecimalSerialized(wrappedValue: width) - } - }} - -extension Operations.GetOnDeckMedia: Codable { - enum CodingKeys: String, CodingKey { - case aspectRatio - case audioChannels - case audioCodec - case audioProfile - case bitrate - case container - case duration - case height - case id - case part = "Part" - case videoCodec - case videoFrameRate - case videoProfile - case videoResolution - case width - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self._aspectRatio = try container.decodeIfPresent(DecimalSerialized.self, forKey: .aspectRatio) ?? DecimalSerialized(wrappedValue: nil) - self._audioChannels = try container.decodeIfPresent(DecimalSerialized.self, forKey: .audioChannels) ?? DecimalSerialized(wrappedValue: nil) - self.audioCodec = try container.decodeIfPresent(String.self, forKey: .audioCodec) - self.audioProfile = try container.decodeIfPresent(String.self, forKey: .audioProfile) - self._bitrate = try container.decodeIfPresent(DecimalSerialized.self, forKey: .bitrate) ?? DecimalSerialized(wrappedValue: nil) - self.container = try container.decodeIfPresent(String.self, forKey: .container) - self._duration = try container.decodeIfPresent(DecimalSerialized.self, forKey: .duration) ?? DecimalSerialized(wrappedValue: nil) - self._height = try container.decodeIfPresent(DecimalSerialized.self, forKey: .height) ?? DecimalSerialized(wrappedValue: nil) - self._id = try container.decodeIfPresent(DecimalSerialized.self, forKey: .id) ?? DecimalSerialized(wrappedValue: nil) - self.part = try container.decodeIfPresent([Operations.GetOnDeckPart].self, forKey: .part) - self.videoCodec = try container.decodeIfPresent(String.self, forKey: .videoCodec) - self.videoFrameRate = try container.decodeIfPresent(String.self, forKey: .videoFrameRate) - self.videoProfile = try container.decodeIfPresent(String.self, forKey: .videoProfile) - self.videoResolution = try container.decodeIfPresent(String.self, forKey: .videoResolution) - self._width = try container.decodeIfPresent(DecimalSerialized.self, forKey: .width) ?? DecimalSerialized(wrappedValue: nil) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - if self.aspectRatio != nil { - try container.encode(self._aspectRatio, forKey: .aspectRatio) - } - if self.audioChannels != nil { - try container.encode(self._audioChannels, forKey: .audioChannels) - } - try container.encodeIfPresent(self.audioCodec, forKey: .audioCodec) - try container.encodeIfPresent(self.audioProfile, forKey: .audioProfile) - if self.bitrate != nil { - try container.encode(self._bitrate, forKey: .bitrate) - } - try container.encodeIfPresent(self.container, forKey: .container) - if self.duration != nil { - try container.encode(self._duration, forKey: .duration) - } - if self.height != nil { - try container.encode(self._height, forKey: .height) - } - if self.id != nil { - try container.encode(self._id, forKey: .id) - } - try container.encodeIfPresent(self.part, forKey: .part) - try container.encodeIfPresent(self.videoCodec, forKey: .videoCodec) - try container.encodeIfPresent(self.videoFrameRate, forKey: .videoFrameRate) - try container.encodeIfPresent(self.videoProfile, forKey: .videoProfile) - try container.encodeIfPresent(self.videoResolution, forKey: .videoResolution) - if self.width != nil { - try container.encode(self._width, forKey: .width) - } - } -} - -extension Operations.GetOnDeckMedia { - var idWrapper: DecimalSerialized { - return _id - } - var durationWrapper: DecimalSerialized { - return _duration - } - var bitrateWrapper: DecimalSerialized { - return _bitrate - } - var widthWrapper: DecimalSerialized { - return _width - } - var heightWrapper: DecimalSerialized { - return _height - } - var aspectRatioWrapper: DecimalSerialized { - return _aspectRatio - } - var audioChannelsWrapper: DecimalSerialized { - return _audioChannels - } -} diff --git a/Sources/Plexswift/models/operations/GetOnDeckMediaContainer.swift b/Sources/Plexswift/models/operations/GetOnDeckMediaContainer.swift deleted file mode 100644 index a67816c..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckMediaContainer.swift +++ /dev/null @@ -1,77 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetOnDeckMediaContainer { - public let allowSync: Bool? - public let identifier: String? - public let mediaTagPrefix: String? - @DecimalSerialized - public private(set) var mediaTagVersion: Double? - public let metadata: [Operations.GetOnDeckMetadata]? - public let mixedParents: Bool? - @DecimalSerialized - public private(set) var size: Double? - - /// Creates an object with the specified parameters - /// - /// - public init(allowSync: Bool? = nil, identifier: String? = nil, mediaTagPrefix: String? = nil, mediaTagVersion: Double? = nil, metadata: [Operations.GetOnDeckMetadata]? = nil, mixedParents: Bool? = nil, size: Double? = nil) { - self.allowSync = allowSync - self.identifier = identifier - self.mediaTagPrefix = mediaTagPrefix - self._mediaTagVersion = DecimalSerialized(wrappedValue: mediaTagVersion) - self.metadata = metadata - self.mixedParents = mixedParents - self._size = DecimalSerialized(wrappedValue: size) - } - }} - -extension Operations.GetOnDeckMediaContainer: Codable { - enum CodingKeys: String, CodingKey { - case allowSync - case identifier - case mediaTagPrefix - case mediaTagVersion - case metadata = "Metadata" - case mixedParents - case size - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.allowSync = try container.decodeIfPresent(Bool.self, forKey: .allowSync) - self.identifier = try container.decodeIfPresent(String.self, forKey: .identifier) - self.mediaTagPrefix = try container.decodeIfPresent(String.self, forKey: .mediaTagPrefix) - self._mediaTagVersion = try container.decodeIfPresent(DecimalSerialized.self, forKey: .mediaTagVersion) ?? DecimalSerialized(wrappedValue: nil) - self.metadata = try container.decodeIfPresent([Operations.GetOnDeckMetadata].self, forKey: .metadata) - self.mixedParents = try container.decodeIfPresent(Bool.self, forKey: .mixedParents) - self._size = try container.decodeIfPresent(DecimalSerialized.self, forKey: .size) ?? DecimalSerialized(wrappedValue: nil) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(self.allowSync, forKey: .allowSync) - try container.encodeIfPresent(self.identifier, forKey: .identifier) - try container.encodeIfPresent(self.mediaTagPrefix, forKey: .mediaTagPrefix) - if self.mediaTagVersion != nil { - try container.encode(self._mediaTagVersion, forKey: .mediaTagVersion) - } - try container.encodeIfPresent(self.metadata, forKey: .metadata) - try container.encodeIfPresent(self.mixedParents, forKey: .mixedParents) - if self.size != nil { - try container.encode(self._size, forKey: .size) - } - } -} - -extension Operations.GetOnDeckMediaContainer { - var sizeWrapper: DecimalSerialized { - return _size - } - var mediaTagVersionWrapper: DecimalSerialized { - return _mediaTagVersion - } -} diff --git a/Sources/Plexswift/models/operations/GetOnDeckMetadata.swift b/Sources/Plexswift/models/operations/GetOnDeckMetadata.swift deleted file mode 100644 index 3ee47e1..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckMetadata.swift +++ /dev/null @@ -1,282 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetOnDeckMetadata { - @DecimalSerialized - public private(set) var addedAt: Double? - public let allowSync: Bool? - public let art: String? - public let contentRating: String? - @DecimalSerialized - public private(set) var duration: Double? - public let grandparentArt: String? - public let grandparentGuid: String? - public let grandparentKey: String? - @DecimalSerialized - public private(set) var grandparentRatingKey: Double? - public let grandparentTheme: String? - public let grandparentThumb: String? - public let grandparentTitle: String? - public let guid: String? - public let guids: [Operations.GetOnDeckGuids]? - @DecimalSerialized - public private(set) var index: Double? - public let key: String? - @DecimalSerialized - public private(set) var lastViewedAt: Double? - @DecimalSerialized - public private(set) var librarySectionID: Double? - public let librarySectionKey: String? - public let librarySectionTitle: String? - public let librarySectionUUID: String? - public let media: [Operations.GetOnDeckMedia]? - @DateTime - public private(set) var originallyAvailableAt: Date? - public let parentGuid: String? - @DecimalSerialized - public private(set) var parentIndex: Double? - public let parentKey: String? - @DecimalSerialized - public private(set) var parentRatingKey: Double? - public let parentThumb: String? - public let parentTitle: String? - @DecimalSerialized - public private(set) var ratingKey: Double? - public let summary: String? - public let thumb: String? - public let title: String? - public let type: String? - @DecimalSerialized - public private(set) var updatedAt: Double? - @DecimalSerialized - public private(set) var year: Double? - - /// Creates an object with the specified parameters - /// - /// - public init(addedAt: Double? = nil, allowSync: Bool? = nil, art: String? = nil, contentRating: String? = nil, duration: Double? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: Double? = nil, grandparentTheme: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, guid: String? = nil, guids: [Operations.GetOnDeckGuids]? = nil, index: Double? = nil, key: String? = nil, lastViewedAt: Double? = nil, librarySectionID: Double? = nil, librarySectionKey: String? = nil, librarySectionTitle: String? = nil, librarySectionUUID: String? = nil, media: [Operations.GetOnDeckMedia]? = nil, originallyAvailableAt: Date? = nil, parentGuid: String? = nil, parentIndex: Double? = nil, parentKey: String? = nil, parentRatingKey: Double? = nil, parentThumb: String? = nil, parentTitle: String? = nil, ratingKey: Double? = nil, summary: String? = nil, thumb: String? = nil, title: String? = nil, type: String? = nil, updatedAt: Double? = nil, year: Double? = nil) { - self._addedAt = DecimalSerialized(wrappedValue: addedAt) - self.allowSync = allowSync - self.art = art - self.contentRating = contentRating - self._duration = DecimalSerialized(wrappedValue: duration) - self.grandparentArt = grandparentArt - self.grandparentGuid = grandparentGuid - self.grandparentKey = grandparentKey - self._grandparentRatingKey = DecimalSerialized(wrappedValue: grandparentRatingKey) - self.grandparentTheme = grandparentTheme - self.grandparentThumb = grandparentThumb - self.grandparentTitle = grandparentTitle - self.guid = guid - self.guids = guids - self._index = DecimalSerialized(wrappedValue: index) - self.key = key - self._lastViewedAt = DecimalSerialized(wrappedValue: lastViewedAt) - self._librarySectionID = DecimalSerialized(wrappedValue: librarySectionID) - self.librarySectionKey = librarySectionKey - self.librarySectionTitle = librarySectionTitle - self.librarySectionUUID = librarySectionUUID - self.media = media - self._originallyAvailableAt = DateTime(wrappedValue: originallyAvailableAt) - self.parentGuid = parentGuid - self._parentIndex = DecimalSerialized(wrappedValue: parentIndex) - self.parentKey = parentKey - self._parentRatingKey = DecimalSerialized(wrappedValue: parentRatingKey) - self.parentThumb = parentThumb - self.parentTitle = parentTitle - self._ratingKey = DecimalSerialized(wrappedValue: ratingKey) - self.summary = summary - self.thumb = thumb - self.title = title - self.type = type - self._updatedAt = DecimalSerialized(wrappedValue: updatedAt) - self._year = DecimalSerialized(wrappedValue: year) - } - }} - -extension Operations.GetOnDeckMetadata: Codable { - enum CodingKeys: String, CodingKey { - case addedAt - case allowSync - case art - case contentRating - case duration - case grandparentArt - case grandparentGuid - case grandparentKey - case grandparentRatingKey - case grandparentTheme - case grandparentThumb - case grandparentTitle - case guid - case guids = "Guid" - case index - case key - case lastViewedAt - case librarySectionID - case librarySectionKey - case librarySectionTitle - case librarySectionUUID - case media = "Media" - case originallyAvailableAt - case parentGuid - case parentIndex - case parentKey - case parentRatingKey - case parentThumb - case parentTitle - case ratingKey - case summary - case thumb - case title - case type - case updatedAt - case year - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self._addedAt = try container.decodeIfPresent(DecimalSerialized.self, forKey: .addedAt) ?? DecimalSerialized(wrappedValue: nil) - self.allowSync = try container.decodeIfPresent(Bool.self, forKey: .allowSync) - self.art = try container.decodeIfPresent(String.self, forKey: .art) - self.contentRating = try container.decodeIfPresent(String.self, forKey: .contentRating) - self._duration = try container.decodeIfPresent(DecimalSerialized.self, forKey: .duration) ?? DecimalSerialized(wrappedValue: nil) - self.grandparentArt = try container.decodeIfPresent(String.self, forKey: .grandparentArt) - self.grandparentGuid = try container.decodeIfPresent(String.self, forKey: .grandparentGuid) - self.grandparentKey = try container.decodeIfPresent(String.self, forKey: .grandparentKey) - self._grandparentRatingKey = try container.decodeIfPresent(DecimalSerialized.self, forKey: .grandparentRatingKey) ?? DecimalSerialized(wrappedValue: nil) - self.grandparentTheme = try container.decodeIfPresent(String.self, forKey: .grandparentTheme) - self.grandparentThumb = try container.decodeIfPresent(String.self, forKey: .grandparentThumb) - self.grandparentTitle = try container.decodeIfPresent(String.self, forKey: .grandparentTitle) - self.guid = try container.decodeIfPresent(String.self, forKey: .guid) - self.guids = try container.decodeIfPresent([Operations.GetOnDeckGuids].self, forKey: .guids) - self._index = try container.decodeIfPresent(DecimalSerialized.self, forKey: .index) ?? DecimalSerialized(wrappedValue: nil) - self.key = try container.decodeIfPresent(String.self, forKey: .key) - self._lastViewedAt = try container.decodeIfPresent(DecimalSerialized.self, forKey: .lastViewedAt) ?? DecimalSerialized(wrappedValue: nil) - self._librarySectionID = try container.decodeIfPresent(DecimalSerialized.self, forKey: .librarySectionID) ?? DecimalSerialized(wrappedValue: nil) - self.librarySectionKey = try container.decodeIfPresent(String.self, forKey: .librarySectionKey) - self.librarySectionTitle = try container.decodeIfPresent(String.self, forKey: .librarySectionTitle) - self.librarySectionUUID = try container.decodeIfPresent(String.self, forKey: .librarySectionUUID) - self.media = try container.decodeIfPresent([Operations.GetOnDeckMedia].self, forKey: .media) - self._originallyAvailableAt = try container.decodeIfPresent(DateTime.self, forKey: .originallyAvailableAt) ?? DateTime(wrappedValue: nil) - self.parentGuid = try container.decodeIfPresent(String.self, forKey: .parentGuid) - self._parentIndex = try container.decodeIfPresent(DecimalSerialized.self, forKey: .parentIndex) ?? DecimalSerialized(wrappedValue: nil) - self.parentKey = try container.decodeIfPresent(String.self, forKey: .parentKey) - self._parentRatingKey = try container.decodeIfPresent(DecimalSerialized.self, forKey: .parentRatingKey) ?? DecimalSerialized(wrappedValue: nil) - self.parentThumb = try container.decodeIfPresent(String.self, forKey: .parentThumb) - self.parentTitle = try container.decodeIfPresent(String.self, forKey: .parentTitle) - self._ratingKey = try container.decodeIfPresent(DecimalSerialized.self, forKey: .ratingKey) ?? DecimalSerialized(wrappedValue: nil) - self.summary = try container.decodeIfPresent(String.self, forKey: .summary) - self.thumb = try container.decodeIfPresent(String.self, forKey: .thumb) - self.title = try container.decodeIfPresent(String.self, forKey: .title) - self.type = try container.decodeIfPresent(String.self, forKey: .type) - self._updatedAt = try container.decodeIfPresent(DecimalSerialized.self, forKey: .updatedAt) ?? DecimalSerialized(wrappedValue: nil) - self._year = try container.decodeIfPresent(DecimalSerialized.self, forKey: .year) ?? DecimalSerialized(wrappedValue: nil) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - if self.addedAt != nil { - try container.encode(self._addedAt, forKey: .addedAt) - } - try container.encodeIfPresent(self.allowSync, forKey: .allowSync) - try container.encodeIfPresent(self.art, forKey: .art) - try container.encodeIfPresent(self.contentRating, forKey: .contentRating) - if self.duration != nil { - try container.encode(self._duration, forKey: .duration) - } - try container.encodeIfPresent(self.grandparentArt, forKey: .grandparentArt) - try container.encodeIfPresent(self.grandparentGuid, forKey: .grandparentGuid) - try container.encodeIfPresent(self.grandparentKey, forKey: .grandparentKey) - if self.grandparentRatingKey != nil { - try container.encode(self._grandparentRatingKey, forKey: .grandparentRatingKey) - } - try container.encodeIfPresent(self.grandparentTheme, forKey: .grandparentTheme) - try container.encodeIfPresent(self.grandparentThumb, forKey: .grandparentThumb) - try container.encodeIfPresent(self.grandparentTitle, forKey: .grandparentTitle) - try container.encodeIfPresent(self.guid, forKey: .guid) - try container.encodeIfPresent(self.guids, forKey: .guids) - if self.index != nil { - try container.encode(self._index, forKey: .index) - } - try container.encodeIfPresent(self.key, forKey: .key) - if self.lastViewedAt != nil { - try container.encode(self._lastViewedAt, forKey: .lastViewedAt) - } - if self.librarySectionID != nil { - try container.encode(self._librarySectionID, forKey: .librarySectionID) - } - try container.encodeIfPresent(self.librarySectionKey, forKey: .librarySectionKey) - try container.encodeIfPresent(self.librarySectionTitle, forKey: .librarySectionTitle) - try container.encodeIfPresent(self.librarySectionUUID, forKey: .librarySectionUUID) - try container.encodeIfPresent(self.media, forKey: .media) - if self.originallyAvailableAt != nil { - try container.encode(self._originallyAvailableAt, forKey: .originallyAvailableAt) - } - try container.encodeIfPresent(self.parentGuid, forKey: .parentGuid) - if self.parentIndex != nil { - try container.encode(self._parentIndex, forKey: .parentIndex) - } - try container.encodeIfPresent(self.parentKey, forKey: .parentKey) - if self.parentRatingKey != nil { - try container.encode(self._parentRatingKey, forKey: .parentRatingKey) - } - try container.encodeIfPresent(self.parentThumb, forKey: .parentThumb) - try container.encodeIfPresent(self.parentTitle, forKey: .parentTitle) - if self.ratingKey != nil { - try container.encode(self._ratingKey, forKey: .ratingKey) - } - try container.encodeIfPresent(self.summary, forKey: .summary) - try container.encodeIfPresent(self.thumb, forKey: .thumb) - try container.encodeIfPresent(self.title, forKey: .title) - try container.encodeIfPresent(self.type, forKey: .type) - if self.updatedAt != nil { - try container.encode(self._updatedAt, forKey: .updatedAt) - } - if self.year != nil { - try container.encode(self._year, forKey: .year) - } - } -} - -extension Operations.GetOnDeckMetadata { - var librarySectionIDWrapper: DecimalSerialized { - return _librarySectionID - } - var ratingKeyWrapper: DecimalSerialized { - return _ratingKey - } - var parentRatingKeyWrapper: DecimalSerialized { - return _parentRatingKey - } - var grandparentRatingKeyWrapper: DecimalSerialized { - return _grandparentRatingKey - } - var indexWrapper: DecimalSerialized { - return _index - } - var parentIndexWrapper: DecimalSerialized { - return _parentIndex - } - var lastViewedAtWrapper: DecimalSerialized { - return _lastViewedAt - } - var yearWrapper: DecimalSerialized { - return _year - } - var durationWrapper: DecimalSerialized { - return _duration - } - var originallyAvailableAtWrapper: DateTime { - return _originallyAvailableAt - } - var addedAtWrapper: DecimalSerialized { - return _addedAt - } - var updatedAtWrapper: DecimalSerialized { - return _updatedAt - } -} diff --git a/Sources/Plexswift/models/operations/GetOnDeckPart.swift b/Sources/Plexswift/models/operations/GetOnDeckPart.swift deleted file mode 100644 index be56fbc..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckPart.swift +++ /dev/null @@ -1,93 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetOnDeckPart { - public let audioProfile: String? - public let container: String? - @DecimalSerialized - public private(set) var duration: Double? - public let file: String? - @DecimalSerialized - public private(set) var id: Double? - public let key: String? - @DecimalSerialized - public private(set) var size: Double? - public let stream: [Operations.GetOnDeckStream]? - public let videoProfile: String? - - /// Creates an object with the specified parameters - /// - /// - public init(audioProfile: String? = nil, container: String? = nil, duration: Double? = nil, file: String? = nil, id: Double? = nil, key: String? = nil, size: Double? = nil, stream: [Operations.GetOnDeckStream]? = nil, videoProfile: String? = nil) { - self.audioProfile = audioProfile - self.container = container - self._duration = DecimalSerialized(wrappedValue: duration) - self.file = file - self._id = DecimalSerialized(wrappedValue: id) - self.key = key - self._size = DecimalSerialized(wrappedValue: size) - self.stream = stream - self.videoProfile = videoProfile - } - }} - -extension Operations.GetOnDeckPart: Codable { - enum CodingKeys: String, CodingKey { - case audioProfile - case container - case duration - case file - case id - case key - case size - case stream = "Stream" - case videoProfile - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self.audioProfile = try container.decodeIfPresent(String.self, forKey: .audioProfile) - self.container = try container.decodeIfPresent(String.self, forKey: .container) - self._duration = try container.decodeIfPresent(DecimalSerialized.self, forKey: .duration) ?? DecimalSerialized(wrappedValue: nil) - self.file = try container.decodeIfPresent(String.self, forKey: .file) - self._id = try container.decodeIfPresent(DecimalSerialized.self, forKey: .id) ?? DecimalSerialized(wrappedValue: nil) - self.key = try container.decodeIfPresent(String.self, forKey: .key) - self._size = try container.decodeIfPresent(DecimalSerialized.self, forKey: .size) ?? DecimalSerialized(wrappedValue: nil) - self.stream = try container.decodeIfPresent([Operations.GetOnDeckStream].self, forKey: .stream) - self.videoProfile = try container.decodeIfPresent(String.self, forKey: .videoProfile) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(self.audioProfile, forKey: .audioProfile) - try container.encodeIfPresent(self.container, forKey: .container) - if self.duration != nil { - try container.encode(self._duration, forKey: .duration) - } - try container.encodeIfPresent(self.file, forKey: .file) - if self.id != nil { - try container.encode(self._id, forKey: .id) - } - try container.encodeIfPresent(self.key, forKey: .key) - if self.size != nil { - try container.encode(self._size, forKey: .size) - } - try container.encodeIfPresent(self.stream, forKey: .stream) - try container.encodeIfPresent(self.videoProfile, forKey: .videoProfile) - } -} - -extension Operations.GetOnDeckPart { - var idWrapper: DecimalSerialized { - return _id - } - var durationWrapper: DecimalSerialized { - return _duration - } - var sizeWrapper: DecimalSerialized { - return _size - } -} diff --git a/Sources/Plexswift/models/operations/GetOnDeckResponse.swift b/Sources/Plexswift/models/operations/GetOnDeckResponse.swift deleted file mode 100644 index 437e745..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckResponse.swift +++ /dev/null @@ -1,41 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A response model - public enum GetOnDeckResponse { - case empty - case badRequest(Operations.GetOnDeckBadRequest) - case object(Operations.GetOnDeckResponseBody) - case unauthorized(Operations.GetOnDeckUnauthorized) - - var isEmpty: Bool { - if case .empty = self { - return true - } else { - return false - } - } - - public func badRequest() throws -> Operations.GetOnDeckBadRequest { - guard case .badRequest(let value) = self else { - throw PlexswiftError.missingResponseData - } - return value - } - - public func object() throws -> Operations.GetOnDeckResponseBody { - guard case .object(let value) = self else { - throw PlexswiftError.missingResponseData - } - return value - } - - public func unauthorized() throws -> Operations.GetOnDeckUnauthorized { - guard case .unauthorized(let value) = self else { - throw PlexswiftError.missingResponseData - } - return value - } - }} diff --git a/Sources/Plexswift/models/operations/GetOnDeckResponseBody.swift b/Sources/Plexswift/models/operations/GetOnDeckResponseBody.swift deleted file mode 100644 index 5570454..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckResponseBody.swift +++ /dev/null @@ -1,23 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// The on Deck content - public struct GetOnDeckResponseBody { - public let mediaContainer: Operations.GetOnDeckMediaContainer? - - /// Creates an object with the specified parameters - /// - /// - public init(mediaContainer: Operations.GetOnDeckMediaContainer? = nil) { - self.mediaContainer = mediaContainer - } - }} - -extension Operations.GetOnDeckResponseBody: Codable { - enum CodingKeys: String, CodingKey { - case mediaContainer = "MediaContainer" - } -} - diff --git a/Sources/Plexswift/models/operations/GetOnDeckStream.swift b/Sources/Plexswift/models/operations/GetOnDeckStream.swift deleted file mode 100644 index e31e774..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckStream.swift +++ /dev/null @@ -1,217 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// A model object - public struct GetOnDeckStream { - @DecimalSerialized - public private(set) var bitDepth: Double? - @DecimalSerialized - public private(set) var bitrate: Double? - public let chromaLocation: String? - public let chromaSubsampling: String? - public let codec: String? - @DecimalSerialized - public private(set) var codedHeight: Double? - @DecimalSerialized - public private(set) var codedWidth: Double? - public let colorRange: String? - public let `default`: Bool? - public let displayTitle: String? - public let extendedDisplayTitle: String? - @DecimalSerialized - public private(set) var frameRate: Double? - @DecimalSerialized - public private(set) var height: Double? - @DecimalSerialized - public private(set) var id: Double? - @DecimalSerialized - public private(set) var index: Double? - public let language: String? - public let languageCode: String? - public let languageTag: String? - @DecimalSerialized - public private(set) var level: Double? - public let profile: String? - @DecimalSerialized - public private(set) var refFrames: Double? - @DecimalSerialized - public private(set) var streamType: Double? - @DecimalSerialized - public private(set) var width: Double? - - /// Creates an object with the specified parameters - /// - /// - public init(bitDepth: Double? = nil, bitrate: Double? = nil, chromaLocation: String? = nil, chromaSubsampling: String? = nil, codec: String? = nil, codedHeight: Double? = nil, codedWidth: Double? = nil, colorRange: String? = nil, `default`: Bool? = nil, displayTitle: String? = nil, extendedDisplayTitle: String? = nil, frameRate: Double? = nil, height: Double? = nil, id: Double? = nil, index: Double? = nil, language: String? = nil, languageCode: String? = nil, languageTag: String? = nil, level: Double? = nil, profile: String? = nil, refFrames: Double? = nil, streamType: Double? = nil, width: Double? = nil) { - self._bitDepth = DecimalSerialized(wrappedValue: bitDepth) - self._bitrate = DecimalSerialized(wrappedValue: bitrate) - self.chromaLocation = chromaLocation - self.chromaSubsampling = chromaSubsampling - self.codec = codec - self._codedHeight = DecimalSerialized(wrappedValue: codedHeight) - self._codedWidth = DecimalSerialized(wrappedValue: codedWidth) - self.colorRange = colorRange - self.`default` = `default` - self.displayTitle = displayTitle - self.extendedDisplayTitle = extendedDisplayTitle - self._frameRate = DecimalSerialized(wrappedValue: frameRate) - self._height = DecimalSerialized(wrappedValue: height) - self._id = DecimalSerialized(wrappedValue: id) - self._index = DecimalSerialized(wrappedValue: index) - self.language = language - self.languageCode = languageCode - self.languageTag = languageTag - self._level = DecimalSerialized(wrappedValue: level) - self.profile = profile - self._refFrames = DecimalSerialized(wrappedValue: refFrames) - self._streamType = DecimalSerialized(wrappedValue: streamType) - self._width = DecimalSerialized(wrappedValue: width) - } - }} - -extension Operations.GetOnDeckStream: Codable { - enum CodingKeys: String, CodingKey { - case bitDepth - case bitrate - case chromaLocation - case chromaSubsampling - case codec - case codedHeight - case codedWidth - case colorRange - case `default` = "default" - case displayTitle - case extendedDisplayTitle - case frameRate - case height - case id - case index - case language - case languageCode - case languageTag - case level - case profile - case refFrames - case streamType - case width - } - - public init(from decoder: Decoder) throws { - let container = try decoder.container(keyedBy: CodingKeys.self) - self._bitDepth = try container.decodeIfPresent(DecimalSerialized.self, forKey: .bitDepth) ?? DecimalSerialized(wrappedValue: nil) - self._bitrate = try container.decodeIfPresent(DecimalSerialized.self, forKey: .bitrate) ?? DecimalSerialized(wrappedValue: nil) - self.chromaLocation = try container.decodeIfPresent(String.self, forKey: .chromaLocation) - self.chromaSubsampling = try container.decodeIfPresent(String.self, forKey: .chromaSubsampling) - self.codec = try container.decodeIfPresent(String.self, forKey: .codec) - self._codedHeight = try container.decodeIfPresent(DecimalSerialized.self, forKey: .codedHeight) ?? DecimalSerialized(wrappedValue: nil) - self._codedWidth = try container.decodeIfPresent(DecimalSerialized.self, forKey: .codedWidth) ?? DecimalSerialized(wrappedValue: nil) - self.colorRange = try container.decodeIfPresent(String.self, forKey: .colorRange) - self.`default` = try container.decodeIfPresent(Bool.self, forKey: .`default`) - self.displayTitle = try container.decodeIfPresent(String.self, forKey: .displayTitle) - self.extendedDisplayTitle = try container.decodeIfPresent(String.self, forKey: .extendedDisplayTitle) - self._frameRate = try container.decodeIfPresent(DecimalSerialized.self, forKey: .frameRate) ?? DecimalSerialized(wrappedValue: nil) - self._height = try container.decodeIfPresent(DecimalSerialized.self, forKey: .height) ?? DecimalSerialized(wrappedValue: nil) - self._id = try container.decodeIfPresent(DecimalSerialized.self, forKey: .id) ?? DecimalSerialized(wrappedValue: nil) - self._index = try container.decodeIfPresent(DecimalSerialized.self, forKey: .index) ?? DecimalSerialized(wrappedValue: nil) - self.language = try container.decodeIfPresent(String.self, forKey: .language) - self.languageCode = try container.decodeIfPresent(String.self, forKey: .languageCode) - self.languageTag = try container.decodeIfPresent(String.self, forKey: .languageTag) - self._level = try container.decodeIfPresent(DecimalSerialized.self, forKey: .level) ?? DecimalSerialized(wrappedValue: nil) - self.profile = try container.decodeIfPresent(String.self, forKey: .profile) - self._refFrames = try container.decodeIfPresent(DecimalSerialized.self, forKey: .refFrames) ?? DecimalSerialized(wrappedValue: nil) - self._streamType = try container.decodeIfPresent(DecimalSerialized.self, forKey: .streamType) ?? DecimalSerialized(wrappedValue: nil) - self._width = try container.decodeIfPresent(DecimalSerialized.self, forKey: .width) ?? DecimalSerialized(wrappedValue: nil) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - if self.bitDepth != nil { - try container.encode(self._bitDepth, forKey: .bitDepth) - } - if self.bitrate != nil { - try container.encode(self._bitrate, forKey: .bitrate) - } - try container.encodeIfPresent(self.chromaLocation, forKey: .chromaLocation) - try container.encodeIfPresent(self.chromaSubsampling, forKey: .chromaSubsampling) - try container.encodeIfPresent(self.codec, forKey: .codec) - if self.codedHeight != nil { - try container.encode(self._codedHeight, forKey: .codedHeight) - } - if self.codedWidth != nil { - try container.encode(self._codedWidth, forKey: .codedWidth) - } - try container.encodeIfPresent(self.colorRange, forKey: .colorRange) - try container.encodeIfPresent(self.`default`, forKey: .`default`) - try container.encodeIfPresent(self.displayTitle, forKey: .displayTitle) - try container.encodeIfPresent(self.extendedDisplayTitle, forKey: .extendedDisplayTitle) - if self.frameRate != nil { - try container.encode(self._frameRate, forKey: .frameRate) - } - if self.height != nil { - try container.encode(self._height, forKey: .height) - } - if self.id != nil { - try container.encode(self._id, forKey: .id) - } - if self.index != nil { - try container.encode(self._index, forKey: .index) - } - try container.encodeIfPresent(self.language, forKey: .language) - try container.encodeIfPresent(self.languageCode, forKey: .languageCode) - try container.encodeIfPresent(self.languageTag, forKey: .languageTag) - if self.level != nil { - try container.encode(self._level, forKey: .level) - } - try container.encodeIfPresent(self.profile, forKey: .profile) - if self.refFrames != nil { - try container.encode(self._refFrames, forKey: .refFrames) - } - if self.streamType != nil { - try container.encode(self._streamType, forKey: .streamType) - } - if self.width != nil { - try container.encode(self._width, forKey: .width) - } - } -} - -extension Operations.GetOnDeckStream { - var idWrapper: DecimalSerialized { - return _id - } - var streamTypeWrapper: DecimalSerialized { - return _streamType - } - var indexWrapper: DecimalSerialized { - return _index - } - var bitrateWrapper: DecimalSerialized { - return _bitrate - } - var bitDepthWrapper: DecimalSerialized { - return _bitDepth - } - var codedHeightWrapper: DecimalSerialized { - return _codedHeight - } - var codedWidthWrapper: DecimalSerialized { - return _codedWidth - } - var frameRateWrapper: DecimalSerialized { - return _frameRate - } - var heightWrapper: DecimalSerialized { - return _height - } - var levelWrapper: DecimalSerialized { - return _level - } - var refFramesWrapper: DecimalSerialized { - return _refFrames - } - var widthWrapper: DecimalSerialized { - return _width - } -} diff --git a/Sources/Plexswift/models/operations/GetOnDeckUnauthorized.swift b/Sources/Plexswift/models/operations/GetOnDeckUnauthorized.swift deleted file mode 100644 index 7ece509..0000000 --- a/Sources/Plexswift/models/operations/GetOnDeckUnauthorized.swift +++ /dev/null @@ -1,23 +0,0 @@ -// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. - -import Foundation - -extension Operations { - /// Unauthorized - Returned if the X-Plex-Token is missing from the header or query. - public struct GetOnDeckUnauthorized { - public let errors: [Operations.GetOnDeckLibraryErrors]? - - /// Creates an object with the specified parameters - /// - /// - public init(errors: [Operations.GetOnDeckLibraryErrors]? = nil) { - self.errors = errors - } - }} - -extension Operations.GetOnDeckUnauthorized: Codable { - enum CodingKeys: String, CodingKey { - case errors - } -} - diff --git a/Sources/Plexswift/models/operations/GetRecentlyAdded1.swift b/Sources/Plexswift/models/operations/GetRecentlyAdded1.swift new file mode 100644 index 0000000..f0d7e6a --- /dev/null +++ b/Sources/Plexswift/models/operations/GetRecentlyAdded1.swift @@ -0,0 +1,9 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +import Foundation + +extension Operations { + public enum GetRecentlyAdded1: Int, Codable, APIValue { + case zero = 0 + case one = 1 + }} diff --git a/Sources/Plexswift/models/operations/GetRecentlyAddedMediaContainer.swift b/Sources/Plexswift/models/operations/GetRecentlyAddedMediaContainer.swift index 132aa2d..a251ff0 100644 --- a/Sources/Plexswift/models/operations/GetRecentlyAddedMediaContainer.swift +++ b/Sources/Plexswift/models/operations/GetRecentlyAddedMediaContainer.swift @@ -5,41 +5,53 @@ import Foundation extension Operations { /// A model object public struct GetRecentlyAddedMediaContainer { + /// Indicates whether syncing is allowed. + public let allowSync: Bool + /// An plugin identifier for the media container. + public let identifier: String + /// Offset value for pagination. + public let offset: Int + /// Number of media items returned in this response. public let size: Int - public let allowSync: Bool? - public let identifier: String? + /// Total number of media items in the library. + public let totalSize: Int /// The Meta object is only included in the response if the `includeMeta` parameter is set to `1`. /// public let meta: Operations.Meta? + /// An array of metadata items. public let metadata: [Operations.GetRecentlyAddedMetadata]? - public let offset: Int? - public let totalSize: Int? /// Creates an object with the specified parameters /// + /// - Parameter allowSync: Indicates whether syncing is allowed. + /// - Parameter identifier: An plugin identifier for the media container. + /// - Parameter offset: Offset value for pagination. + /// - Parameter size: Number of media items returned in this response. + /// - Parameter totalSize: Total number of media items in the library. /// - Parameter meta: The Meta object is only included in the response if the `includeMeta` parameter is set to `1`. /// + /// - Parameter metadata: An array of metadata items. /// - public init(size: Int, allowSync: Bool? = nil, identifier: String? = nil, meta: Operations.Meta? = nil, metadata: [Operations.GetRecentlyAddedMetadata]? = nil, offset: Int? = nil, totalSize: Int? = nil) { - self.size = size + public init(allowSync: Bool, identifier: String, offset: Int, size: Int, totalSize: Int, meta: Operations.Meta? = nil, metadata: [Operations.GetRecentlyAddedMetadata]? = nil) { self.allowSync = allowSync self.identifier = identifier + self.offset = offset + self.size = size + self.totalSize = totalSize self.meta = meta self.metadata = metadata - self.offset = offset - self.totalSize = totalSize } }} extension Operations.GetRecentlyAddedMediaContainer: Codable { enum CodingKeys: String, CodingKey { - case size case allowSync case identifier + case offset + case size + case totalSize case meta = "Meta" case metadata = "Metadata" - case offset - case totalSize } } diff --git a/Sources/Plexswift/models/operations/GetRecentlyAddedMetadata.swift b/Sources/Plexswift/models/operations/GetRecentlyAddedMetadata.swift index f788a25..b9e0cae 100644 --- a/Sources/Plexswift/models/operations/GetRecentlyAddedMetadata.swift +++ b/Sources/Plexswift/models/operations/GetRecentlyAddedMetadata.swift @@ -3,159 +3,244 @@ import Foundation extension Operations { - /// A model object + /// Unknown + /// public struct GetRecentlyAddedMetadata { - /// Unix epoch datetime in seconds public let addedAt: Int - public let guid: String - public let key: String - /// The rating key (Media ID) of this media item. - /// Note: This is always an integer, but is represented as a string in the API. - /// - public let ratingKey: String - public let summary: String - public let title: String - /// The type of media content - /// - public let type: Operations.GetRecentlyAddedHubsType - public let art: String? + /// The art image URL for the media item. + public let art: String + /// The audience rating for the media item. @DecimalSerialized - public private(set) var audienceRating: Double? + public private(set) var audienceRating: Double + /// The number of child items associated with this media item. + public let childCount: Int + /// The duration of the media item in milliseconds. + public let duration: Int + /// The globally unique identifier for the media item. + public let guid: String + /// The index position of the media item. + public let index: Int + /// The unique key for the media item. + public let key: String + /// The identifier for the library section. + public let librarySectionID: Int + /// The key corresponding to the library section. + public let librarySectionKey: String + /// The title of the library section. + public let librarySectionTitle: String + /// The original release date of the media item. + @DateOnly + public private(set) var originallyAvailableAt: Date + /// The studio of the parent media item. + public let parentStudio: String + /// The theme URL for the parent media item. + public let parentTheme: String + /// The critic rating for the media item. + @DecimalSerialized + public private(set) var rating: Double + /// The rating key (Media ID) of this media item. Note: Although this is always an integer, it is represented as a string in the API. + public let ratingKey: String + /// The total number of seasons (for TV shows). + public let seasonCount: Int + /// A URL‐friendly version of the media title. + public let slug: String + /// A synopsis of the media item. + public let summary: String + /// A brief tagline for the media item. + public let tagline: String + /// The theme URL for the media item. + public let theme: String + /// The thumbnail image URL for the media item. + public let thumb: String + /// The title of the media item. + public let title: String + /// The sort title used for ordering media items. + public let titleSort: String + public let type: Operations.GetRecentlyAddedHubsType + /// The URL for the audience rating image. public let audienceRatingImage: String? - public let banner: String? + /// The source from which chapter data is derived. public let chapterSource: String? - public let childCount: Int? public let collection: [Operations.Collection]? + /// The content rating for the media item. public let contentRating: String? public let country: [Operations.Country]? + /// The accuracy of the creation timestamp. This value indicates the format(s) provided (for example, 'epoch,local' means both epoch and local time formats are available). + public let createdAtAccuracy: String? + /// The time zone offset for the creation timestamp, represented as a string. This offset indicates the difference from UTC. + public let createdAtTZOffset: String? public let director: [Operations.Director]? - public let duration: Int? - /// Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). - public let enableCreditsMarkerGeneration: Operations.EnableCreditsMarkerGeneration? - /// Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first). - public let episodeSort: Operations.EpisodeSort? - /// Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). - public let flattenSeasons: Operations.FlattenSeasons? public let genre: [Operations.Genre]? + /// The art URL for the grandparent media item. public let grandparentArt: String? + /// The GUID of the grandparent media item. public let grandparentGuid: String? + /// The key of the grandparent media item. public let grandparentKey: String? + /// The rating key of the grandparent media item. public let grandparentRatingKey: String? + /// The slug for the grandparent media item. public let grandparentSlug: String? + /// The theme URL for the grandparent media item. public let grandparentTheme: String? + /// The thumbnail URL for the grandparent media item. public let grandparentThumb: String? + /// The title of the grandparent media item. public let grandparentTitle: String? - public let hasPremiumExtras: String? - public let hasPremiumPrimaryExtra: String? + public let guids: [Operations.Guids]? public let image: [Operations.GetRecentlyAddedImage]? - public let index: Int? + /// The Unix timestamp representing the last time the item was rated. + public let lastRatedAt: Int? + /// Unix timestamp for when the media item was last viewed. public let lastViewedAt: Int? + /// The number of leaf items (end nodes) under this media item. public let leafCount: Int? - public let librarySectionID: Int? - public let librarySectionKey: String? - public let librarySectionTitle: String? public let location: [Operations.Location]? - /// The Media object is only included when type query is `4` or higher. - /// public let media: [Operations.Media]? - /// The Guid object is only included in the response if the `includeGuids` parameter is set to `1`. - /// - public let mediaGuid: [Operations.MediaGuid]? - public let metaDataRating: [Operations.MetaDataRating]? - @DateOnly - public private(set) var originallyAvailableAt: Date? + /// The original title of the media item (if different). public let originalTitle: String? + /// The GUID of the parent media item. public let parentGuid: String? + /// The index position of the parent media item. public let parentIndex: Int? + /// The key of the parent media item. public let parentKey: String? - /// The rating key of the parent item. - /// + /// The rating key of the parent media item. public let parentRatingKey: String? + /// The slug for the parent media item. public let parentSlug: String? - public let parentStudio: String? - public let parentTheme: String? + /// The thumbnail URL for the parent media item. public let parentThumb: String? + /// The title of the parent media item. public let parentTitle: String? + /// The release year of the parent media item. public let parentYear: Int? + /// The primary extra key associated with this media item. public let primaryExtraKey: String? - @DecimalSerialized - public private(set) var rating: Double? + public let producer: [Operations.Producer]? + public let rating1: [Operations.Rating]? + /// The URL for the rating image. public let ratingImage: String? public let role: [Operations.Role]? - public let seasonCount: Int? - /// Setting that indicates the episode ordering for the show. - /// None = Library default, - /// tmdbAiring = The Movie Database (Aired), - /// aired = TheTVDB (Aired), - /// dvd = TheTVDB (DVD), - /// absolute = TheTVDB (Absolute)). - /// - public let showOrdering: Operations.ShowOrdering? - public let skipChildren: Bool? + public let similar: [Operations.Similar]? + /// The number of times this media item has been skipped. public let skipCount: Int? - public let slug: String? + /// The studio that produced the media item. public let studio: String? - public let tagline: String? - public let theme: String? - public let thumb: String? - public let titleSort: String? + /// A classification that further describes the type of media item. For example, 'clip' indicates that the item is a short video clip. + public let subtype: String? public let ultraBlurColors: Operations.UltraBlurColors? /// Unix epoch datetime in seconds public let updatedAt: Int? + /// The rating provided by a user for the item. This value is expressed as a decimal number. + @DecimalSerialized + public private(set) var userRating: Double? + /// The number of times this media item has been viewed. public let viewCount: Int? + /// The number of leaf items that have been viewed. public let viewedLeafCount: Int? + /// The current playback offset (in milliseconds). public let viewOffset: Int? public let writer: [Operations.Writer]? + /// The release year of the media item. public let year: Int? /// Creates an object with the specified parameters /// - /// - Parameter addedAt: Unix epoch datetime in seconds - /// - Parameter ratingKey: The rating key (Media ID) of this media item. - /// Note: This is always an integer, but is represented as a string in the API. - /// - /// - Parameter type: The type of media content - /// - /// - Parameter enableCreditsMarkerGeneration: Setting that indicates if credits markers detection is enabled. (-1 = Library default, 0 = Disabled). - /// - Parameter episodeSort: Setting that indicates how episodes are sorted for the show. (-1 = Library default, 0 = Oldest first, 1 = Newest first). - /// - Parameter flattenSeasons: Setting that indicates if seasons are set to hidden for the show. (-1 = Library default, 0 = Hide, 1 = Show). - /// - Parameter media: The Media object is only included when type query is `4` or higher. - /// - /// - Parameter mediaGuid: The Guid object is only included in the response if the `includeGuids` parameter is set to `1`. - /// - /// - Parameter parentRatingKey: The rating key of the parent item. - /// - /// - Parameter showOrdering: Setting that indicates the episode ordering for the show. - /// None = Library default, - /// tmdbAiring = The Movie Database (Aired), - /// aired = TheTVDB (Aired), - /// dvd = TheTVDB (DVD), - /// absolute = TheTVDB (Absolute)). - /// + /// - Parameter art: The art image URL for the media item. + /// - Parameter audienceRating: The audience rating for the media item. + /// - Parameter childCount: The number of child items associated with this media item. + /// - Parameter duration: The duration of the media item in milliseconds. + /// - Parameter guid: The globally unique identifier for the media item. + /// - Parameter index: The index position of the media item. + /// - Parameter key: The unique key for the media item. + /// - Parameter librarySectionID: The identifier for the library section. + /// - Parameter librarySectionKey: The key corresponding to the library section. + /// - Parameter librarySectionTitle: The title of the library section. + /// - Parameter originallyAvailableAt: The original release date of the media item. + /// - Parameter parentStudio: The studio of the parent media item. + /// - Parameter parentTheme: The theme URL for the parent media item. + /// - Parameter rating: The critic rating for the media item. + /// - Parameter ratingKey: The rating key (Media ID) of this media item. Note: Although this is always an integer, it is represented as a string in the API. + /// - Parameter seasonCount: The total number of seasons (for TV shows). + /// - Parameter slug: A URL‐friendly version of the media title. + /// - Parameter summary: A synopsis of the media item. + /// - Parameter tagline: A brief tagline for the media item. + /// - Parameter theme: The theme URL for the media item. + /// - Parameter thumb: The thumbnail image URL for the media item. + /// - Parameter title: The title of the media item. + /// - Parameter titleSort: The sort title used for ordering media items. + /// - Parameter audienceRatingImage: The URL for the audience rating image. + /// - Parameter chapterSource: The source from which chapter data is derived. + /// - Parameter contentRating: The content rating for the media item. + /// - Parameter createdAtAccuracy: The accuracy of the creation timestamp. This value indicates the format(s) provided (for example, 'epoch,local' means both epoch and local time formats are available). + /// - Parameter createdAtTZOffset: The time zone offset for the creation timestamp, represented as a string. This offset indicates the difference from UTC. + /// - Parameter grandparentArt: The art URL for the grandparent media item. + /// - Parameter grandparentGuid: The GUID of the grandparent media item. + /// - Parameter grandparentKey: The key of the grandparent media item. + /// - Parameter grandparentRatingKey: The rating key of the grandparent media item. + /// - Parameter grandparentSlug: The slug for the grandparent media item. + /// - Parameter grandparentTheme: The theme URL for the grandparent media item. + /// - Parameter grandparentThumb: The thumbnail URL for the grandparent media item. + /// - Parameter grandparentTitle: The title of the grandparent media item. + /// - Parameter lastRatedAt: The Unix timestamp representing the last time the item was rated. + /// - Parameter lastViewedAt: Unix timestamp for when the media item was last viewed. + /// - Parameter leafCount: The number of leaf items (end nodes) under this media item. + /// - Parameter originalTitle: The original title of the media item (if different). + /// - Parameter parentGuid: The GUID of the parent media item. + /// - Parameter parentIndex: The index position of the parent media item. + /// - Parameter parentKey: The key of the parent media item. + /// - Parameter parentRatingKey: The rating key of the parent media item. + /// - Parameter parentSlug: The slug for the parent media item. + /// - Parameter parentThumb: The thumbnail URL for the parent media item. + /// - Parameter parentTitle: The title of the parent media item. + /// - Parameter parentYear: The release year of the parent media item. + /// - Parameter primaryExtraKey: The primary extra key associated with this media item. + /// - Parameter ratingImage: The URL for the rating image. + /// - Parameter skipCount: The number of times this media item has been skipped. + /// - Parameter studio: The studio that produced the media item. + /// - Parameter subtype: A classification that further describes the type of media item. For example, 'clip' indicates that the item is a short video clip. /// - Parameter updatedAt: Unix epoch datetime in seconds + /// - Parameter userRating: The rating provided by a user for the item. This value is expressed as a decimal number. + /// - Parameter viewCount: The number of times this media item has been viewed. + /// - Parameter viewedLeafCount: The number of leaf items that have been viewed. + /// - Parameter viewOffset: The current playback offset (in milliseconds). + /// - Parameter year: The release year of the media item. /// - public init(addedAt: Int, guid: String, key: String, ratingKey: String, summary: String, title: String, type: Operations.GetRecentlyAddedHubsType, art: String? = nil, audienceRating: Double? = nil, audienceRatingImage: String? = nil, banner: String? = nil, chapterSource: String? = nil, childCount: Int? = nil, collection: [Operations.Collection]? = nil, contentRating: String? = nil, country: [Operations.Country]? = nil, director: [Operations.Director]? = nil, duration: Int? = nil, enableCreditsMarkerGeneration: Operations.EnableCreditsMarkerGeneration? = nil, episodeSort: Operations.EpisodeSort? = nil, flattenSeasons: Operations.FlattenSeasons? = nil, genre: [Operations.Genre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentTheme: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, hasPremiumExtras: String? = nil, hasPremiumPrimaryExtra: String? = nil, image: [Operations.GetRecentlyAddedImage]? = nil, index: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, librarySectionID: Int? = nil, librarySectionKey: String? = nil, librarySectionTitle: String? = nil, location: [Operations.Location]? = nil, media: [Operations.Media]? = nil, mediaGuid: [Operations.MediaGuid]? = nil, metaDataRating: [Operations.MetaDataRating]? = nil, originallyAvailableAt: Date? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentSlug: String? = nil, parentStudio: String? = nil, parentTheme: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, parentYear: Int? = nil, primaryExtraKey: String? = nil, rating: Double? = nil, ratingImage: String? = nil, role: [Operations.Role]? = nil, seasonCount: Int? = nil, showOrdering: Operations.ShowOrdering? = nil, skipChildren: Bool? = nil, skipCount: Int? = nil, slug: String? = nil, studio: String? = nil, tagline: String? = nil, theme: String? = nil, thumb: String? = nil, titleSort: String? = nil, ultraBlurColors: Operations.UltraBlurColors? = nil, updatedAt: Int? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, viewOffset: Int? = nil, writer: [Operations.Writer]? = nil, year: Int? = nil) { + public init(addedAt: Int, art: String, audienceRating: Double, childCount: Int, duration: Int, guid: String, index: Int, key: String, librarySectionID: Int, librarySectionKey: String, librarySectionTitle: String, originallyAvailableAt: Date, parentStudio: String, parentTheme: String, rating: Double, ratingKey: String, seasonCount: Int, slug: String, summary: String, tagline: String, theme: String, thumb: String, title: String, titleSort: String, type: Operations.GetRecentlyAddedHubsType, audienceRatingImage: String? = nil, chapterSource: String? = nil, collection: [Operations.Collection]? = nil, contentRating: String? = nil, country: [Operations.Country]? = nil, createdAtAccuracy: String? = nil, createdAtTZOffset: String? = nil, director: [Operations.Director]? = nil, genre: [Operations.Genre]? = nil, grandparentArt: String? = nil, grandparentGuid: String? = nil, grandparentKey: String? = nil, grandparentRatingKey: String? = nil, grandparentSlug: String? = nil, grandparentTheme: String? = nil, grandparentThumb: String? = nil, grandparentTitle: String? = nil, guids: [Operations.Guids]? = nil, image: [Operations.GetRecentlyAddedImage]? = nil, lastRatedAt: Int? = nil, lastViewedAt: Int? = nil, leafCount: Int? = nil, location: [Operations.Location]? = nil, media: [Operations.Media]? = nil, originalTitle: String? = nil, parentGuid: String? = nil, parentIndex: Int? = nil, parentKey: String? = nil, parentRatingKey: String? = nil, parentSlug: String? = nil, parentThumb: String? = nil, parentTitle: String? = nil, parentYear: Int? = nil, primaryExtraKey: String? = nil, producer: [Operations.Producer]? = nil, rating1: [Operations.Rating]? = nil, ratingImage: String? = nil, role: [Operations.Role]? = nil, similar: [Operations.Similar]? = nil, skipCount: Int? = nil, studio: String? = nil, subtype: String? = nil, ultraBlurColors: Operations.UltraBlurColors? = nil, updatedAt: Int? = nil, userRating: Double? = nil, viewCount: Int? = nil, viewedLeafCount: Int? = nil, viewOffset: Int? = nil, writer: [Operations.Writer]? = nil, year: Int? = nil) { self.addedAt = addedAt - self.guid = guid - self.key = key - self.ratingKey = ratingKey - self.summary = summary - self.title = title - self.type = type self.art = art - self._audienceRating = DecimalSerialized(wrappedValue: audienceRating) - self.audienceRatingImage = audienceRatingImage - self.banner = banner - self.chapterSource = chapterSource + self._audienceRating = DecimalSerialized(wrappedValue: audienceRating) self.childCount = childCount + self.duration = duration + self.guid = guid + self.index = index + self.key = key + self.librarySectionID = librarySectionID + self.librarySectionKey = librarySectionKey + self.librarySectionTitle = librarySectionTitle + self._originallyAvailableAt = DateOnly(wrappedValue: originallyAvailableAt) + self.parentStudio = parentStudio + self.parentTheme = parentTheme + self._rating = DecimalSerialized(wrappedValue: rating) + self.ratingKey = ratingKey + self.seasonCount = seasonCount + self.slug = slug + self.summary = summary + self.tagline = tagline + self.theme = theme + self.thumb = thumb + self.title = title + self.titleSort = titleSort + self.type = type + self.audienceRatingImage = audienceRatingImage + self.chapterSource = chapterSource self.collection = collection self.contentRating = contentRating self.country = country + self.createdAtAccuracy = createdAtAccuracy + self.createdAtTZOffset = createdAtTZOffset self.director = director - self.duration = duration - self.enableCreditsMarkerGeneration = enableCreditsMarkerGeneration - self.episodeSort = episodeSort - self.flattenSeasons = flattenSeasons self.genre = genre self.grandparentArt = grandparentArt self.grandparentGuid = grandparentGuid @@ -165,47 +250,34 @@ extension Operations { self.grandparentTheme = grandparentTheme self.grandparentThumb = grandparentThumb self.grandparentTitle = grandparentTitle - self.hasPremiumExtras = hasPremiumExtras - self.hasPremiumPrimaryExtra = hasPremiumPrimaryExtra + self.guids = guids self.image = image - self.index = index + self.lastRatedAt = lastRatedAt self.lastViewedAt = lastViewedAt self.leafCount = leafCount - self.librarySectionID = librarySectionID - self.librarySectionKey = librarySectionKey - self.librarySectionTitle = librarySectionTitle self.location = location self.media = media - self.mediaGuid = mediaGuid - self.metaDataRating = metaDataRating - self._originallyAvailableAt = DateOnly(wrappedValue: originallyAvailableAt) self.originalTitle = originalTitle self.parentGuid = parentGuid self.parentIndex = parentIndex self.parentKey = parentKey self.parentRatingKey = parentRatingKey self.parentSlug = parentSlug - self.parentStudio = parentStudio - self.parentTheme = parentTheme self.parentThumb = parentThumb self.parentTitle = parentTitle self.parentYear = parentYear self.primaryExtraKey = primaryExtraKey - self._rating = DecimalSerialized(wrappedValue: rating) + self.producer = producer + self.rating1 = rating1 self.ratingImage = ratingImage self.role = role - self.seasonCount = seasonCount - self.showOrdering = showOrdering - self.skipChildren = skipChildren + self.similar = similar self.skipCount = skipCount - self.slug = slug self.studio = studio - self.tagline = tagline - self.theme = theme - self.thumb = thumb - self.titleSort = titleSort + self.subtype = subtype self.ultraBlurColors = ultraBlurColors self.updatedAt = updatedAt + self._userRating = DecimalSerialized(wrappedValue: userRating) self.viewCount = viewCount self.viewedLeafCount = viewedLeafCount self.viewOffset = viewOffset @@ -217,26 +289,38 @@ extension Operations { extension Operations.GetRecentlyAddedMetadata: Codable { enum CodingKeys: String, CodingKey { case addedAt - case guid - case key - case ratingKey - case summary - case title - case type case art case audienceRating - case audienceRatingImage - case banner - case chapterSource case childCount + case duration + case guid + case index + case key + case librarySectionID + case librarySectionKey + case librarySectionTitle + case originallyAvailableAt + case parentStudio + case parentTheme + case rating + case ratingKey + case seasonCount + case slug + case summary + case tagline + case theme + case thumb + case title + case titleSort + case type + case audienceRatingImage + case chapterSource case collection = "Collection" case contentRating case country = "Country" + case createdAtAccuracy + case createdAtTZOffset case director = "Director" - case duration - case enableCreditsMarkerGeneration - case episodeSort - case flattenSeasons case genre = "Genre" case grandparentArt case grandparentGuid @@ -246,47 +330,34 @@ extension Operations.GetRecentlyAddedMetadata: Codable { case grandparentTheme case grandparentThumb case grandparentTitle - case hasPremiumExtras - case hasPremiumPrimaryExtra + case guids = "Guid" case image = "Image" - case index + case lastRatedAt case lastViewedAt case leafCount - case librarySectionID - case librarySectionKey - case librarySectionTitle case location = "Location" case media = "Media" - case mediaGuid = "Guid" - case metaDataRating = "Rating" - case originallyAvailableAt case originalTitle case parentGuid case parentIndex case parentKey case parentRatingKey case parentSlug - case parentStudio - case parentTheme case parentThumb case parentTitle case parentYear case primaryExtraKey - case rating + case producer = "Producer" + case rating1 = "Rating" case ratingImage case role = "Role" - case seasonCount - case showOrdering - case skipChildren + case similar = "Similar" case skipCount - case slug case studio - case tagline - case theme - case thumb - case titleSort + case subtype case ultraBlurColors = "UltraBlurColors" case updatedAt + case userRating case viewCount case viewedLeafCount case viewOffset @@ -297,26 +368,38 @@ extension Operations.GetRecentlyAddedMetadata: Codable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.addedAt = try container.decode(Int.self, forKey: .addedAt) + self.art = try container.decode(String.self, forKey: .art) + self._audienceRating = try container.decode(DecimalSerialized.self, forKey: .audienceRating) + self.childCount = try container.decode(Int.self, forKey: .childCount) + self.duration = try container.decode(Int.self, forKey: .duration) self.guid = try container.decode(String.self, forKey: .guid) + self.index = try container.decode(Int.self, forKey: .index) self.key = try container.decode(String.self, forKey: .key) + self.librarySectionID = try container.decode(Int.self, forKey: .librarySectionID) + self.librarySectionKey = try container.decode(String.self, forKey: .librarySectionKey) + self.librarySectionTitle = try container.decode(String.self, forKey: .librarySectionTitle) + self._originallyAvailableAt = try container.decode(DateOnly.self, forKey: .originallyAvailableAt) + self.parentStudio = try container.decode(String.self, forKey: .parentStudio) + self.parentTheme = try container.decode(String.self, forKey: .parentTheme) + self._rating = try container.decode(DecimalSerialized.self, forKey: .rating) self.ratingKey = try container.decode(String.self, forKey: .ratingKey) + self.seasonCount = try container.decode(Int.self, forKey: .seasonCount) + self.slug = try container.decode(String.self, forKey: .slug) self.summary = try container.decode(String.self, forKey: .summary) + self.tagline = try container.decode(String.self, forKey: .tagline) + self.theme = try container.decode(String.self, forKey: .theme) + self.thumb = try container.decode(String.self, forKey: .thumb) self.title = try container.decode(String.self, forKey: .title) + self.titleSort = try container.decode(String.self, forKey: .titleSort) self.type = try container.decode(Operations.GetRecentlyAddedHubsType.self, forKey: .type) - self.art = try container.decodeIfPresent(String.self, forKey: .art) - self._audienceRating = try container.decodeIfPresent(DecimalSerialized.self, forKey: .audienceRating) ?? DecimalSerialized(wrappedValue: nil) self.audienceRatingImage = try container.decodeIfPresent(String.self, forKey: .audienceRatingImage) - self.banner = try container.decodeIfPresent(String.self, forKey: .banner) self.chapterSource = try container.decodeIfPresent(String.self, forKey: .chapterSource) - self.childCount = try container.decodeIfPresent(Int.self, forKey: .childCount) self.collection = try container.decodeIfPresent([Operations.Collection].self, forKey: .collection) self.contentRating = try container.decodeIfPresent(String.self, forKey: .contentRating) self.country = try container.decodeIfPresent([Operations.Country].self, forKey: .country) + self.createdAtAccuracy = try container.decodeIfPresent(String.self, forKey: .createdAtAccuracy) + self.createdAtTZOffset = try container.decodeIfPresent(String.self, forKey: .createdAtTZOffset) self.director = try container.decodeIfPresent([Operations.Director].self, forKey: .director) - self.duration = try container.decodeIfPresent(Int.self, forKey: .duration) - self.enableCreditsMarkerGeneration = try container.decodeIfPresent(Operations.EnableCreditsMarkerGeneration.self, forKey: .enableCreditsMarkerGeneration) - self.episodeSort = try container.decodeIfPresent(Operations.EpisodeSort.self, forKey: .episodeSort) - self.flattenSeasons = try container.decodeIfPresent(Operations.FlattenSeasons.self, forKey: .flattenSeasons) self.genre = try container.decodeIfPresent([Operations.Genre].self, forKey: .genre) self.grandparentArt = try container.decodeIfPresent(String.self, forKey: .grandparentArt) self.grandparentGuid = try container.decodeIfPresent(String.self, forKey: .grandparentGuid) @@ -326,47 +409,34 @@ extension Operations.GetRecentlyAddedMetadata: Codable { self.grandparentTheme = try container.decodeIfPresent(String.self, forKey: .grandparentTheme) self.grandparentThumb = try container.decodeIfPresent(String.self, forKey: .grandparentThumb) self.grandparentTitle = try container.decodeIfPresent(String.self, forKey: .grandparentTitle) - self.hasPremiumExtras = try container.decodeIfPresent(String.self, forKey: .hasPremiumExtras) - self.hasPremiumPrimaryExtra = try container.decodeIfPresent(String.self, forKey: .hasPremiumPrimaryExtra) + self.guids = try container.decodeIfPresent([Operations.Guids].self, forKey: .guids) self.image = try container.decodeIfPresent([Operations.GetRecentlyAddedImage].self, forKey: .image) - self.index = try container.decodeIfPresent(Int.self, forKey: .index) + self.lastRatedAt = try container.decodeIfPresent(Int.self, forKey: .lastRatedAt) self.lastViewedAt = try container.decodeIfPresent(Int.self, forKey: .lastViewedAt) self.leafCount = try container.decodeIfPresent(Int.self, forKey: .leafCount) - self.librarySectionID = try container.decodeIfPresent(Int.self, forKey: .librarySectionID) - self.librarySectionKey = try container.decodeIfPresent(String.self, forKey: .librarySectionKey) - self.librarySectionTitle = try container.decodeIfPresent(String.self, forKey: .librarySectionTitle) self.location = try container.decodeIfPresent([Operations.Location].self, forKey: .location) self.media = try container.decodeIfPresent([Operations.Media].self, forKey: .media) - self.mediaGuid = try container.decodeIfPresent([Operations.MediaGuid].self, forKey: .mediaGuid) - self.metaDataRating = try container.decodeIfPresent([Operations.MetaDataRating].self, forKey: .metaDataRating) - self._originallyAvailableAt = try container.decodeIfPresent(DateOnly.self, forKey: .originallyAvailableAt) ?? DateOnly(wrappedValue: nil) self.originalTitle = try container.decodeIfPresent(String.self, forKey: .originalTitle) self.parentGuid = try container.decodeIfPresent(String.self, forKey: .parentGuid) self.parentIndex = try container.decodeIfPresent(Int.self, forKey: .parentIndex) self.parentKey = try container.decodeIfPresent(String.self, forKey: .parentKey) self.parentRatingKey = try container.decodeIfPresent(String.self, forKey: .parentRatingKey) self.parentSlug = try container.decodeIfPresent(String.self, forKey: .parentSlug) - self.parentStudio = try container.decodeIfPresent(String.self, forKey: .parentStudio) - self.parentTheme = try container.decodeIfPresent(String.self, forKey: .parentTheme) self.parentThumb = try container.decodeIfPresent(String.self, forKey: .parentThumb) self.parentTitle = try container.decodeIfPresent(String.self, forKey: .parentTitle) self.parentYear = try container.decodeIfPresent(Int.self, forKey: .parentYear) self.primaryExtraKey = try container.decodeIfPresent(String.self, forKey: .primaryExtraKey) - self._rating = try container.decodeIfPresent(DecimalSerialized.self, forKey: .rating) ?? DecimalSerialized(wrappedValue: nil) + self.producer = try container.decodeIfPresent([Operations.Producer].self, forKey: .producer) + self.rating1 = try container.decodeIfPresent([Operations.Rating].self, forKey: .rating1) self.ratingImage = try container.decodeIfPresent(String.self, forKey: .ratingImage) self.role = try container.decodeIfPresent([Operations.Role].self, forKey: .role) - self.seasonCount = try container.decodeIfPresent(Int.self, forKey: .seasonCount) - self.showOrdering = try container.decodeIfPresent(Operations.ShowOrdering.self, forKey: .showOrdering) - self.skipChildren = try container.decodeIfPresent(Bool.self, forKey: .skipChildren) + self.similar = try container.decodeIfPresent([Operations.Similar].self, forKey: .similar) self.skipCount = try container.decodeIfPresent(Int.self, forKey: .skipCount) - self.slug = try container.decodeIfPresent(String.self, forKey: .slug) self.studio = try container.decodeIfPresent(String.self, forKey: .studio) - self.tagline = try container.decodeIfPresent(String.self, forKey: .tagline) - self.theme = try container.decodeIfPresent(String.self, forKey: .theme) - self.thumb = try container.decodeIfPresent(String.self, forKey: .thumb) - self.titleSort = try container.decodeIfPresent(String.self, forKey: .titleSort) + self.subtype = try container.decodeIfPresent(String.self, forKey: .subtype) self.ultraBlurColors = try container.decodeIfPresent(Operations.UltraBlurColors.self, forKey: .ultraBlurColors) self.updatedAt = try container.decodeIfPresent(Int.self, forKey: .updatedAt) + self._userRating = try container.decodeIfPresent(DecimalSerialized.self, forKey: .userRating) ?? DecimalSerialized(wrappedValue: nil) self.viewCount = try container.decodeIfPresent(Int.self, forKey: .viewCount) self.viewedLeafCount = try container.decodeIfPresent(Int.self, forKey: .viewedLeafCount) self.viewOffset = try container.decodeIfPresent(Int.self, forKey: .viewOffset) @@ -377,28 +447,38 @@ extension Operations.GetRecentlyAddedMetadata: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(self.addedAt, forKey: .addedAt) + try container.encode(self.art, forKey: .art) + try container.encode(self._audienceRating, forKey: .audienceRating) + try container.encode(self.childCount, forKey: .childCount) + try container.encode(self.duration, forKey: .duration) try container.encode(self.guid, forKey: .guid) + try container.encode(self.index, forKey: .index) try container.encode(self.key, forKey: .key) + try container.encode(self.librarySectionID, forKey: .librarySectionID) + try container.encode(self.librarySectionKey, forKey: .librarySectionKey) + try container.encode(self.librarySectionTitle, forKey: .librarySectionTitle) + try container.encode(self._originallyAvailableAt, forKey: .originallyAvailableAt) + try container.encode(self.parentStudio, forKey: .parentStudio) + try container.encode(self.parentTheme, forKey: .parentTheme) + try container.encode(self._rating, forKey: .rating) try container.encode(self.ratingKey, forKey: .ratingKey) + try container.encode(self.seasonCount, forKey: .seasonCount) + try container.encode(self.slug, forKey: .slug) try container.encode(self.summary, forKey: .summary) + try container.encode(self.tagline, forKey: .tagline) + try container.encode(self.theme, forKey: .theme) + try container.encode(self.thumb, forKey: .thumb) try container.encode(self.title, forKey: .title) + try container.encode(self.titleSort, forKey: .titleSort) try container.encode(self.type, forKey: .type) - try container.encodeIfPresent(self.art, forKey: .art) - if self.audienceRating != nil { - try container.encode(self._audienceRating, forKey: .audienceRating) - } try container.encodeIfPresent(self.audienceRatingImage, forKey: .audienceRatingImage) - try container.encodeIfPresent(self.banner, forKey: .banner) try container.encodeIfPresent(self.chapterSource, forKey: .chapterSource) - try container.encodeIfPresent(self.childCount, forKey: .childCount) try container.encodeIfPresent(self.collection, forKey: .collection) try container.encodeIfPresent(self.contentRating, forKey: .contentRating) try container.encodeIfPresent(self.country, forKey: .country) + try container.encodeIfPresent(self.createdAtAccuracy, forKey: .createdAtAccuracy) + try container.encodeIfPresent(self.createdAtTZOffset, forKey: .createdAtTZOffset) try container.encodeIfPresent(self.director, forKey: .director) - try container.encodeIfPresent(self.duration, forKey: .duration) - try container.encodeIfPresent(self.enableCreditsMarkerGeneration, forKey: .enableCreditsMarkerGeneration) - try container.encodeIfPresent(self.episodeSort, forKey: .episodeSort) - try container.encodeIfPresent(self.flattenSeasons, forKey: .flattenSeasons) try container.encodeIfPresent(self.genre, forKey: .genre) try container.encodeIfPresent(self.grandparentArt, forKey: .grandparentArt) try container.encodeIfPresent(self.grandparentGuid, forKey: .grandparentGuid) @@ -408,51 +488,36 @@ extension Operations.GetRecentlyAddedMetadata: Codable { try container.encodeIfPresent(self.grandparentTheme, forKey: .grandparentTheme) try container.encodeIfPresent(self.grandparentThumb, forKey: .grandparentThumb) try container.encodeIfPresent(self.grandparentTitle, forKey: .grandparentTitle) - try container.encodeIfPresent(self.hasPremiumExtras, forKey: .hasPremiumExtras) - try container.encodeIfPresent(self.hasPremiumPrimaryExtra, forKey: .hasPremiumPrimaryExtra) + try container.encodeIfPresent(self.guids, forKey: .guids) try container.encodeIfPresent(self.image, forKey: .image) - try container.encodeIfPresent(self.index, forKey: .index) + try container.encodeIfPresent(self.lastRatedAt, forKey: .lastRatedAt) try container.encodeIfPresent(self.lastViewedAt, forKey: .lastViewedAt) try container.encodeIfPresent(self.leafCount, forKey: .leafCount) - try container.encodeIfPresent(self.librarySectionID, forKey: .librarySectionID) - try container.encodeIfPresent(self.librarySectionKey, forKey: .librarySectionKey) - try container.encodeIfPresent(self.librarySectionTitle, forKey: .librarySectionTitle) try container.encodeIfPresent(self.location, forKey: .location) try container.encodeIfPresent(self.media, forKey: .media) - try container.encodeIfPresent(self.mediaGuid, forKey: .mediaGuid) - try container.encodeIfPresent(self.metaDataRating, forKey: .metaDataRating) - if self.originallyAvailableAt != nil { - try container.encode(self._originallyAvailableAt, forKey: .originallyAvailableAt) - } try container.encodeIfPresent(self.originalTitle, forKey: .originalTitle) try container.encodeIfPresent(self.parentGuid, forKey: .parentGuid) try container.encodeIfPresent(self.parentIndex, forKey: .parentIndex) try container.encodeIfPresent(self.parentKey, forKey: .parentKey) try container.encodeIfPresent(self.parentRatingKey, forKey: .parentRatingKey) try container.encodeIfPresent(self.parentSlug, forKey: .parentSlug) - try container.encodeIfPresent(self.parentStudio, forKey: .parentStudio) - try container.encodeIfPresent(self.parentTheme, forKey: .parentTheme) try container.encodeIfPresent(self.parentThumb, forKey: .parentThumb) try container.encodeIfPresent(self.parentTitle, forKey: .parentTitle) try container.encodeIfPresent(self.parentYear, forKey: .parentYear) try container.encodeIfPresent(self.primaryExtraKey, forKey: .primaryExtraKey) - if self.rating != nil { - try container.encode(self._rating, forKey: .rating) - } + try container.encodeIfPresent(self.producer, forKey: .producer) + try container.encodeIfPresent(self.rating1, forKey: .rating1) try container.encodeIfPresent(self.ratingImage, forKey: .ratingImage) try container.encodeIfPresent(self.role, forKey: .role) - try container.encodeIfPresent(self.seasonCount, forKey: .seasonCount) - try container.encodeIfPresent(self.showOrdering, forKey: .showOrdering) - try container.encodeIfPresent(self.skipChildren, forKey: .skipChildren) + try container.encodeIfPresent(self.similar, forKey: .similar) try container.encodeIfPresent(self.skipCount, forKey: .skipCount) - try container.encodeIfPresent(self.slug, forKey: .slug) try container.encodeIfPresent(self.studio, forKey: .studio) - try container.encodeIfPresent(self.tagline, forKey: .tagline) - try container.encodeIfPresent(self.theme, forKey: .theme) - try container.encodeIfPresent(self.thumb, forKey: .thumb) - try container.encodeIfPresent(self.titleSort, forKey: .titleSort) + try container.encodeIfPresent(self.subtype, forKey: .subtype) try container.encodeIfPresent(self.ultraBlurColors, forKey: .ultraBlurColors) try container.encodeIfPresent(self.updatedAt, forKey: .updatedAt) + if self.userRating != nil { + try container.encode(self._userRating, forKey: .userRating) + } try container.encodeIfPresent(self.viewCount, forKey: .viewCount) try container.encodeIfPresent(self.viewedLeafCount, forKey: .viewedLeafCount) try container.encodeIfPresent(self.viewOffset, forKey: .viewOffset) @@ -462,13 +527,16 @@ extension Operations.GetRecentlyAddedMetadata: Codable { } extension Operations.GetRecentlyAddedMetadata { - var ratingWrapper: DecimalSerialized { - return _rating - } - var audienceRatingWrapper: DecimalSerialized { + var audienceRatingWrapper: DecimalSerialized { return _audienceRating } - var originallyAvailableAtWrapper: DateOnly { + var originallyAvailableAtWrapper: DateOnly { return _originallyAvailableAt } + var ratingWrapper: DecimalSerialized { + return _rating + } + var userRatingWrapper: DecimalSerialized { + return _userRating + } } diff --git a/Sources/Plexswift/models/operations/GetRecentlyAddedOptimizedForStreaming.swift b/Sources/Plexswift/models/operations/GetRecentlyAddedOptimizedForStreaming.swift new file mode 100644 index 0000000..ec0e56d --- /dev/null +++ b/Sources/Plexswift/models/operations/GetRecentlyAddedOptimizedForStreaming.swift @@ -0,0 +1,32 @@ +// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT. + +import Foundation + +extension Operations { + /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true + public enum GetRecentlyAddedOptimizedForStreaming { + case getRecentlyAdded1(Operations.GetRecentlyAdded1) + case bool(Bool) + }} + +extension Operations.GetRecentlyAddedOptimizedForStreaming: Codable { + public init(from decoder: Decoder) throws { + if let value = try? Operations.GetRecentlyAdded1(from: decoder) { + self = .getRecentlyAdded1(value) + } else if let value = try? Bool(from: decoder) { + self = .bool(value) + } else { + throw PlexswiftError.failedToHandleResponse(.failedToDecodeResponse) + } + } + + public func encode(to encoder: Encoder) throws { + switch self { + case .getRecentlyAdded1(let value): + try value.encode(to: encoder) + case .bool(let value): + try value.encode(to: encoder) + } + } +} + diff --git a/Sources/Plexswift/models/operations/HasThumbnail.swift b/Sources/Plexswift/models/operations/HasThumbnail.swift index 3d79293..3feb5d5 100644 --- a/Sources/Plexswift/models/operations/HasThumbnail.swift +++ b/Sources/Plexswift/models/operations/HasThumbnail.swift @@ -3,6 +3,7 @@ import Foundation extension Operations { + /// Indicates if the part has a thumbnail. public enum HasThumbnail: String, Codable, APIValue { case `false` = "0" case `true` = "1" diff --git a/Sources/Plexswift/models/operations/Location.swift b/Sources/Plexswift/models/operations/Location.swift index 519f6f9..2335585 100644 --- a/Sources/Plexswift/models/operations/Location.swift +++ b/Sources/Plexswift/models/operations/Location.swift @@ -3,14 +3,14 @@ import Foundation extension Operations { - /// A model object + /// The folder path for the media item. public struct Location { - public let path: String? + public let path: String /// Creates an object with the specified parameters /// /// - public init(path: String? = nil) { + public init(path: String) { self.path = path } }} diff --git a/Sources/Plexswift/models/operations/Media.swift b/Sources/Plexswift/models/operations/Media.swift index e364df9..db0eb61 100644 --- a/Sources/Plexswift/models/operations/Media.swift +++ b/Sources/Plexswift/models/operations/Media.swift @@ -5,43 +5,81 @@ import Foundation extension Operations { /// A model object public struct Media { - public let container: String + /// Unique media identifier. public let id: Int - public let part: [Operations.Part] + /// Aspect ratio of the video. @DecimalSerialized public private(set) var aspectRatio: Double? + /// Number of audio channels. public let audioChannels: Int? + /// Audio codec used. public let audioCodec: String? + /// The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). public let audioProfile: String? + /// Bitrate in bits per second. public let bitrate: Int? + /// File container type. + public let container: String? + public let displayOffset: Int? + /// Duration of the media in milliseconds. public let duration: Int? public let has64bitOffsets: Bool? + /// Indicates whether voice activity is detected. public let hasVoiceActivity: Bool? + /// Video height in pixels. public let height: Int? + /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true public let optimizedForStreaming: Operations.OptimizedForStreaming? + /// An array of parts for this media item. + public let part: [Operations.Part]? + /// Video codec used. public let videoCodec: String? + /// Frame rate of the video. Values found include NTSC, PAL, 24p + /// public let videoFrameRate: String? + /// Video profile (e.g., main 10). public let videoProfile: String? + /// Video resolution (e.g., 4k). public let videoResolution: String? + /// Video width in pixels. public let width: Int? /// Creates an object with the specified parameters /// + /// - Parameter id: Unique media identifier. + /// - Parameter aspectRatio: Aspect ratio of the video. + /// - Parameter audioChannels: Number of audio channels. + /// - Parameter audioCodec: Audio codec used. + /// - Parameter audioProfile: The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). + /// - Parameter bitrate: Bitrate in bits per second. + /// - Parameter container: File container type. + /// - Parameter duration: Duration of the media in milliseconds. + /// - Parameter hasVoiceActivity: Indicates whether voice activity is detected. + /// - Parameter height: Video height in pixels. + /// - Parameter optimizedForStreaming: Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true + /// - Parameter part: An array of parts for this media item. + /// - Parameter videoCodec: Video codec used. + /// - Parameter videoFrameRate: Frame rate of the video. Values found include NTSC, PAL, 24p + /// + /// - Parameter videoProfile: Video profile (e.g., main 10). + /// - Parameter videoResolution: Video resolution (e.g., 4k). + /// - Parameter width: Video width in pixels. /// - public init(container: String, id: Int, part: [Operations.Part], aspectRatio: Double? = nil, audioChannels: Int? = nil, audioCodec: String? = nil, audioProfile: String? = nil, bitrate: Int? = nil, duration: Int? = nil, has64bitOffsets: Bool? = nil, hasVoiceActivity: Bool? = nil, height: Int? = nil, optimizedForStreaming: Operations.OptimizedForStreaming? = nil, videoCodec: String? = nil, videoFrameRate: String? = nil, videoProfile: String? = nil, videoResolution: String? = nil, width: Int? = nil) { - self.container = container + public init(id: Int, aspectRatio: Double? = nil, audioChannels: Int? = nil, audioCodec: String? = nil, audioProfile: String? = nil, bitrate: Int? = nil, container: String? = nil, displayOffset: Int? = nil, duration: Int? = nil, has64bitOffsets: Bool? = nil, hasVoiceActivity: Bool? = nil, height: Int? = nil, optimizedForStreaming: Operations.OptimizedForStreaming? = nil, part: [Operations.Part]? = nil, videoCodec: String? = nil, videoFrameRate: String? = nil, videoProfile: String? = nil, videoResolution: String? = nil, width: Int? = nil) { self.id = id - self.part = part self._aspectRatio = DecimalSerialized(wrappedValue: aspectRatio) self.audioChannels = audioChannels self.audioCodec = audioCodec self.audioProfile = audioProfile self.bitrate = bitrate + self.container = container + self.displayOffset = displayOffset self.duration = duration self.has64bitOffsets = has64bitOffsets self.hasVoiceActivity = hasVoiceActivity self.height = height self.optimizedForStreaming = optimizedForStreaming + self.part = part self.videoCodec = videoCodec self.videoFrameRate = videoFrameRate self.videoProfile = videoProfile @@ -52,19 +90,20 @@ extension Operations { extension Operations.Media: Codable { enum CodingKeys: String, CodingKey { - case container case id - case part = "Part" case aspectRatio case audioChannels case audioCodec case audioProfile case bitrate + case container + case displayOffset case duration case has64bitOffsets case hasVoiceActivity case height case optimizedForStreaming + case part = "Part" case videoCodec case videoFrameRate case videoProfile @@ -74,19 +113,20 @@ extension Operations.Media: Codable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) - self.container = try container.decode(String.self, forKey: .container) self.id = try container.decode(Int.self, forKey: .id) - self.part = try container.decode([Operations.Part].self, forKey: .part) self._aspectRatio = try container.decodeIfPresent(DecimalSerialized.self, forKey: .aspectRatio) ?? DecimalSerialized(wrappedValue: nil) self.audioChannels = try container.decodeIfPresent(Int.self, forKey: .audioChannels) self.audioCodec = try container.decodeIfPresent(String.self, forKey: .audioCodec) self.audioProfile = try container.decodeIfPresent(String.self, forKey: .audioProfile) self.bitrate = try container.decodeIfPresent(Int.self, forKey: .bitrate) + self.container = try container.decodeIfPresent(String.self, forKey: .container) + self.displayOffset = try container.decodeIfPresent(Int.self, forKey: .displayOffset) self.duration = try container.decodeIfPresent(Int.self, forKey: .duration) self.has64bitOffsets = try container.decodeIfPresent(Bool.self, forKey: .has64bitOffsets) self.hasVoiceActivity = try container.decodeIfPresent(Bool.self, forKey: .hasVoiceActivity) self.height = try container.decodeIfPresent(Int.self, forKey: .height) self.optimizedForStreaming = try container.decodeIfPresent(Operations.OptimizedForStreaming.self, forKey: .optimizedForStreaming) + self.part = try container.decodeIfPresent([Operations.Part].self, forKey: .part) self.videoCodec = try container.decodeIfPresent(String.self, forKey: .videoCodec) self.videoFrameRate = try container.decodeIfPresent(String.self, forKey: .videoFrameRate) self.videoProfile = try container.decodeIfPresent(String.self, forKey: .videoProfile) @@ -96,9 +136,7 @@ extension Operations.Media: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(self.container, forKey: .container) try container.encode(self.id, forKey: .id) - try container.encode(self.part, forKey: .part) if self.aspectRatio != nil { try container.encode(self._aspectRatio, forKey: .aspectRatio) } @@ -106,11 +144,14 @@ extension Operations.Media: Codable { try container.encodeIfPresent(self.audioCodec, forKey: .audioCodec) try container.encodeIfPresent(self.audioProfile, forKey: .audioProfile) try container.encodeIfPresent(self.bitrate, forKey: .bitrate) + try container.encodeIfPresent(self.container, forKey: .container) + try container.encodeIfPresent(self.displayOffset, forKey: .displayOffset) try container.encodeIfPresent(self.duration, forKey: .duration) try container.encodeIfPresent(self.has64bitOffsets, forKey: .has64bitOffsets) try container.encodeIfPresent(self.hasVoiceActivity, forKey: .hasVoiceActivity) try container.encodeIfPresent(self.height, forKey: .height) try container.encodeIfPresent(self.optimizedForStreaming, forKey: .optimizedForStreaming) + try container.encodeIfPresent(self.part, forKey: .part) try container.encodeIfPresent(self.videoCodec, forKey: .videoCodec) try container.encodeIfPresent(self.videoFrameRate, forKey: .videoFrameRate) try container.encodeIfPresent(self.videoProfile, forKey: .videoProfile) diff --git a/Sources/Plexswift/models/operations/OptimizedForStreaming.swift b/Sources/Plexswift/models/operations/OptimizedForStreaming.swift index c5fd1ed..7c8e822 100644 --- a/Sources/Plexswift/models/operations/OptimizedForStreaming.swift +++ b/Sources/Plexswift/models/operations/OptimizedForStreaming.swift @@ -3,7 +3,30 @@ import Foundation extension Operations { - public enum OptimizedForStreaming: Int, Codable, APIValue { - case disable = 0 - case enable = 1 + /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true + public enum OptimizedForStreaming { + case one(Operations.One) + case bool(Bool) }} + +extension Operations.OptimizedForStreaming: Codable { + public init(from decoder: Decoder) throws { + if let value = try? Operations.One(from: decoder) { + self = .one(value) + } else if let value = try? Bool(from: decoder) { + self = .bool(value) + } else { + throw PlexswiftError.failedToHandleResponse(.failedToDecodeResponse) + } + } + + public func encode(to encoder: Encoder) throws { + switch self { + case .one(let value): + try value.encode(to: encoder) + case .bool(let value): + try value.encode(to: encoder) + } + } +} + diff --git a/Sources/Plexswift/models/operations/Part.swift b/Sources/Plexswift/models/operations/Part.swift index 7a909a1..49425b5 100644 --- a/Sources/Plexswift/models/operations/Part.swift +++ b/Sources/Plexswift/models/operations/Part.swift @@ -5,39 +5,65 @@ import Foundation extension Operations { /// A model object public struct Part { - /// The container format of the media file. - /// - public let container: String + /// File path for the part. public let file: String + /// Unique part identifier. public let id: Int + /// Key to access this part. public let key: String + /// File size in bytes. public let size: Int + /// Indicates if the part is accessible. + public let accessible: Bool? + /// The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). public let audioProfile: String? + /// Container format of the part. + public let container: String? + /// Duration of the part in milliseconds. public let duration: Int? + /// Indicates if the part exists. + public let exists: Bool? public let has64bitOffsets: Bool? public let hasThumbnail: Operations.HasThumbnail? public let indexes: String? - public let optimizedForStreaming: Bool? + /// Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true + public let optimizedForStreaming: Operations.GetRecentlyAddedOptimizedForStreaming? + public let packetLength: Int? + /// An array of streams for this part. public let stream: [Operations.Stream]? + /// Video profile for the part. public let videoProfile: String? /// Creates an object with the specified parameters /// - /// - Parameter container: The container format of the media file. - /// + /// - Parameter file: File path for the part. + /// - Parameter id: Unique part identifier. + /// - Parameter key: Key to access this part. + /// - Parameter size: File size in bytes. + /// - Parameter accessible: Indicates if the part is accessible. + /// - Parameter audioProfile: The audio profile used for the media (e.g., DTS, Dolby Digital, etc.). + /// - Parameter container: Container format of the part. + /// - Parameter duration: Duration of the part in milliseconds. + /// - Parameter exists: Indicates if the part exists. + /// - Parameter optimizedForStreaming: Has this media been optimized for streaming. NOTE: This can be 0, 1, false or true + /// - Parameter stream: An array of streams for this part. + /// - Parameter videoProfile: Video profile for the part. /// - public init(container: String, file: String, id: Int, key: String, size: Int, audioProfile: String? = nil, duration: Int? = nil, has64bitOffsets: Bool? = nil, hasThumbnail: Operations.HasThumbnail? = nil, indexes: String? = nil, optimizedForStreaming: Bool? = nil, stream: [Operations.Stream]? = nil, videoProfile: String? = nil) { - self.container = container + public init(file: String, id: Int, key: String, size: Int, accessible: Bool? = nil, audioProfile: String? = nil, container: String? = nil, duration: Int? = nil, exists: Bool? = nil, has64bitOffsets: Bool? = nil, hasThumbnail: Operations.HasThumbnail? = nil, indexes: String? = nil, optimizedForStreaming: Operations.GetRecentlyAddedOptimizedForStreaming? = nil, packetLength: Int? = nil, stream: [Operations.Stream]? = nil, videoProfile: String? = nil) { self.file = file self.id = id self.key = key self.size = size + self.accessible = accessible self.audioProfile = audioProfile + self.container = container self.duration = duration + self.exists = exists self.has64bitOffsets = has64bitOffsets self.hasThumbnail = hasThumbnail self.indexes = indexes self.optimizedForStreaming = optimizedForStreaming + self.packetLength = packetLength self.stream = stream self.videoProfile = videoProfile } @@ -45,17 +71,20 @@ extension Operations { extension Operations.Part: Codable { enum CodingKeys: String, CodingKey { - case container case file case id case key case size + case accessible case audioProfile + case container case duration + case exists case has64bitOffsets case hasThumbnail case indexes case optimizedForStreaming + case packetLength case stream = "Stream" case videoProfile } diff --git a/Sources/Plexswift/models/operations/Producer.swift b/Sources/Plexswift/models/operations/Producer.swift index fdd999a..eba6b93 100644 --- a/Sources/Plexswift/models/operations/Producer.swift +++ b/Sources/Plexswift/models/operations/Producer.swift @@ -5,34 +5,30 @@ import Foundation extension Operations { /// A model object public struct Producer { - /// The filter string for the role. + /// The filter string used to query this producer. public let filter: String - /// The unique role identifier. + /// Unique identifier for the producer. public let id: Int - /// The actor's name. + /// The name of the producer public let tag: String - /// A key associated with the actor tag. - public let tagKey: String - /// The character name or role. - public let role: String? - /// URL for the role thumbnail image. + /// A unique key associated with the producer's tag, used for internal identification. + public let tagKey: String? + /// The URL of the thumbnail image for the actor. public let thumb: String? /// Creates an object with the specified parameters /// - /// - Parameter filter: The filter string for the role. - /// - Parameter id: The unique role identifier. - /// - Parameter tag: The actor's name. - /// - Parameter tagKey: A key associated with the actor tag. - /// - Parameter role: The character name or role. - /// - Parameter thumb: URL for the role thumbnail image. + /// - Parameter filter: The filter string used to query this producer. + /// - Parameter id: Unique identifier for the producer. + /// - Parameter tag: The name of the producer + /// - Parameter tagKey: A unique key associated with the producer's tag, used for internal identification. + /// - Parameter thumb: The URL of the thumbnail image for the actor. /// - public init(filter: String, id: Int, tag: String, tagKey: String, role: String? = nil, thumb: String? = nil) { + public init(filter: String, id: Int, tag: String, tagKey: String? = nil, thumb: String? = nil) { self.filter = filter self.id = id self.tag = tag self.tagKey = tagKey - self.role = role self.thumb = thumb } }} @@ -43,7 +39,6 @@ extension Operations.Producer: Codable { case id case tag case tagKey - case role case thumb } } diff --git a/Sources/Plexswift/models/operations/GetLibraryItemsMetaDataRating.swift b/Sources/Plexswift/models/operations/Rating.swift similarity index 72% rename from Sources/Plexswift/models/operations/GetLibraryItemsMetaDataRating.swift rename to Sources/Plexswift/models/operations/Rating.swift index da1ce60..4fdff52 100644 --- a/Sources/Plexswift/models/operations/GetLibraryItemsMetaDataRating.swift +++ b/Sources/Plexswift/models/operations/Rating.swift @@ -3,21 +3,15 @@ import Foundation extension Operations { - /// A model object - public struct GetLibraryItemsMetaDataRating { - /// A URI or path to the rating image. + /// The type of rating, for example 'audience' or 'critic'. + public struct Rating { public let image: String - /// The type of rating (e.g., audience, critic). public let type: String - /// The value of the rating. @DecimalSerialized public private(set) var value: Double /// Creates an object with the specified parameters /// - /// - Parameter image: A URI or path to the rating image. - /// - Parameter type: The type of rating (e.g., audience, critic). - /// - Parameter value: The value of the rating. /// public init(image: String, type: String, value: Double) { self.image = image @@ -26,7 +20,7 @@ extension Operations { } }} -extension Operations.GetLibraryItemsMetaDataRating: Codable { +extension Operations.Rating: Codable { enum CodingKeys: String, CodingKey { case image case type @@ -48,7 +42,7 @@ extension Operations.GetLibraryItemsMetaDataRating: Codable { } } -extension Operations.GetLibraryItemsMetaDataRating { +extension Operations.Rating { var valueWrapper: DecimalSerialized { return _value } diff --git a/Sources/Plexswift/models/operations/Role.swift b/Sources/Plexswift/models/operations/Role.swift index c03f757..23543bf 100644 --- a/Sources/Plexswift/models/operations/Role.swift +++ b/Sources/Plexswift/models/operations/Role.swift @@ -5,33 +5,33 @@ import Foundation extension Operations { /// A model object public struct Role { - /// The filter used to find the actor or tag. - public let filter: String? - /// The ID of the tag or actor. - public let id: Int? - /// The role of the actor or tag in the media. + /// The filter string used to query this actor. For example, it may indicate that this is an actor with a given key. + public let filter: String + /// Unique identifier for the actor or role. + public let id: Int + /// The display tag for the actor (typically the actor's name). + public let tag: String + /// The role played by the actor in the media item. public let role: String? - /// The name of the tag or actor. - public let tag: String? - /// Unique identifier for the tag. + /// A unique key associated with the actor's tag, used for internal identification. public let tagKey: String? - /// The thumbnail of the actor + /// The URL of the thumbnail image for the actor. public let thumb: String? /// Creates an object with the specified parameters /// - /// - Parameter filter: The filter used to find the actor or tag. - /// - Parameter id: The ID of the tag or actor. - /// - Parameter role: The role of the actor or tag in the media. - /// - Parameter tag: The name of the tag or actor. - /// - Parameter tagKey: Unique identifier for the tag. - /// - Parameter thumb: The thumbnail of the actor + /// - Parameter filter: The filter string used to query this actor. For example, it may indicate that this is an actor with a given key. + /// - Parameter id: Unique identifier for the actor or role. + /// - Parameter tag: The display tag for the actor (typically the actor's name). + /// - Parameter role: The role played by the actor in the media item. + /// - Parameter tagKey: A unique key associated with the actor's tag, used for internal identification. + /// - Parameter thumb: The URL of the thumbnail image for the actor. /// - public init(filter: String? = nil, id: Int? = nil, role: String? = nil, tag: String? = nil, tagKey: String? = nil, thumb: String? = nil) { + public init(filter: String, id: Int, tag: String, role: String? = nil, tagKey: String? = nil, thumb: String? = nil) { self.filter = filter self.id = id - self.role = role self.tag = tag + self.role = role self.tagKey = tagKey self.thumb = thumb } @@ -41,8 +41,8 @@ extension Operations.Role: Codable { enum CodingKeys: String, CodingKey { case filter case id - case role case tag + case role case tagKey case thumb } diff --git a/Sources/Plexswift/models/operations/Similar.swift b/Sources/Plexswift/models/operations/Similar.swift index 3b1a4eb..8b8b047 100644 --- a/Sources/Plexswift/models/operations/Similar.swift +++ b/Sources/Plexswift/models/operations/Similar.swift @@ -3,20 +3,14 @@ import Foundation extension Operations { - /// A model object + /// The display tag for the similar item, typically the title. public struct Similar { - /// The filter string for similar items. public let filter: String - /// The unique similar item identifier. public let id: Int - /// The tag or title of the similar content. public let tag: String /// Creates an object with the specified parameters /// - /// - Parameter filter: The filter string for similar items. - /// - Parameter id: The unique similar item identifier. - /// - Parameter tag: The tag or title of the similar content. /// public init(filter: String, id: Int, tag: String) { self.filter = filter diff --git a/Sources/Plexswift/models/operations/Stream.swift b/Sources/Plexswift/models/operations/Stream.swift index 4c4a43b..5c55f5a 100644 --- a/Sources/Plexswift/models/operations/Stream.swift +++ b/Sources/Plexswift/models/operations/Stream.swift @@ -5,119 +5,152 @@ import Foundation extension Operations { /// A model object public struct Stream { - /// Codec used by the stream + /// Codec used by the stream. public let codec: String + /// Display title for the stream. + public let displayTitle: String + /// Extended display title for the stream. + public let extendedDisplayTitle: String + /// Unique stream identifier. public let id: Int - /// The index of the stream + /// Index of the stream. public let index: Int - /// Type of stream (1 = video, 2 = audio, 3 = subtitle) + /// Stream type (1=video, 2=audio, 3=subtitle). public let streamType: Int - /// The audio channel layout + /// Audio channel layout. public let audioChannelLayout: String? - /// The bit depth of the video stream + /// Bit depth of the video stream. public let bitDepth: Int? - /// The bitrate of the stream in kbps + /// Bitrate of the stream. public let bitrate: Int? - /// Indicates if the subtitle stream can auto-sync + /// Indicates if the stream can auto-sync. public let canAutoSync: Bool? - /// Number of audio channels (for audio streams) + /// Number of audio channels (for audio streams). public let channels: Int? - /// The chroma location of the video stream + /// Chroma sample location. public let chromaLocation: String? - /// The chroma subsampling format + /// Chroma subsampling format. public let chromaSubsampling: String? public let closedCaptions: Bool? - /// The coded height of the video stream + /// Coded video height. public let codedHeight: Int? - /// The coded width of the video stream + /// Coded video width. public let codedWidth: Int? - /// The color primaries of the video stream + /// Color primaries used. public let colorPrimaries: String? - /// The color range of the video stream + /// Color range (e.g., tv). public let colorRange: String? - /// The color space of the video stream + /// Color space. public let colorSpace: String? - /// The transfer characteristics (TRC) of the video stream + /// Color transfer characteristics. public let colorTrc: String? - /// Indicates if this is the default stream + /// Indicates if this stream is default. public let `default`: Bool? - /// Display title of the stream - public let displayTitle: String? + /// Dolby Vision BL compatibility ID. + public let doviblCompatID: Int? + /// Indicates if Dolby Vision BL is present. + public let doviblPresent: Bool? + /// Indicates if Dolby Vision EL is present. + public let dovielPresent: Bool? + /// Dolby Vision level. + public let doviLevel: Int? + /// Indicates if Dolby Vision is present. + public let doviPresent: Bool? + /// Dolby Vision profile. + public let doviProfile: Int? + /// Indicates if Dolby Vision RPU is present. + public let dovirpuPresent: Bool? + /// Dolby Vision version. + public let doviVersion: String? + /// Indicates if the stream is a dub. + public let dub: Bool? public let embeddedInVideo: String? - /// Extended display title of the stream - public let extendedDisplayTitle: String? - /// The frame rate of the video stream + public let forced: Bool? + /// Frame rate of the stream. @DecimalSerialized public private(set) var frameRate: Double? - /// Indicates if the stream has a scaling matrix public let hasScalingMatrix: Bool? + /// Indicates whether header compression is enabled. + public let headerCompression: Bool? + /// Indicates if the stream is for the hearing impaired. public let hearingImpaired: Bool? - /// The height of the video stream + /// Height of the video stream. public let height: Int? - /// The language of the stream (for audio/subtitle streams) + /// Language of the stream. public let language: String? - /// Language code of the stream + /// ISO language code. public let languageCode: String? - /// Language tag of the stream + /// Language tag (e.g., en). public let languageTag: String? - /// The level of the video codec + /// Video level. public let level: Int? - /// The profile of the video codec + /// Indicates if this is the original stream. + public let original: Bool? + /// Video profile. public let profile: String? - /// Number of reference frames + /// Number of reference frames. public let refFrames: Int? - /// Sampling rate of the audio stream in Hz + /// Sampling rate for the audio stream. public let samplingRate: Int? - /// The scan type (progressive or interlaced) public let scanType: String? - /// Indicates if the stream is selected + /// Indicates if this stream is selected (applicable for audio streams). public let selected: Bool? - /// The identifier of the video stream - public let streamIdentifier: String? - /// Title of the subtitle track (for subtitle streams) + /// Optional title for the stream (e.g., language variant). public let title: String? - /// The width of the video stream + /// Width of the video stream. public let width: Int? /// Creates an object with the specified parameters /// - /// - Parameter codec: Codec used by the stream - /// - Parameter index: The index of the stream - /// - Parameter streamType: Type of stream (1 = video, 2 = audio, 3 = subtitle) - /// - Parameter audioChannelLayout: The audio channel layout - /// - Parameter bitDepth: The bit depth of the video stream - /// - Parameter bitrate: The bitrate of the stream in kbps - /// - Parameter canAutoSync: Indicates if the subtitle stream can auto-sync - /// - Parameter channels: Number of audio channels (for audio streams) - /// - Parameter chromaLocation: The chroma location of the video stream - /// - Parameter chromaSubsampling: The chroma subsampling format - /// - Parameter codedHeight: The coded height of the video stream - /// - Parameter codedWidth: The coded width of the video stream - /// - Parameter colorPrimaries: The color primaries of the video stream - /// - Parameter colorRange: The color range of the video stream - /// - Parameter colorSpace: The color space of the video stream - /// - Parameter colorTrc: The transfer characteristics (TRC) of the video stream - /// - Parameter `default`: Indicates if this is the default stream - /// - Parameter displayTitle: Display title of the stream - /// - Parameter extendedDisplayTitle: Extended display title of the stream - /// - Parameter frameRate: The frame rate of the video stream - /// - Parameter hasScalingMatrix: Indicates if the stream has a scaling matrix - /// - Parameter height: The height of the video stream - /// - Parameter language: The language of the stream (for audio/subtitle streams) - /// - Parameter languageCode: Language code of the stream - /// - Parameter languageTag: Language tag of the stream - /// - Parameter level: The level of the video codec - /// - Parameter profile: The profile of the video codec - /// - Parameter refFrames: Number of reference frames - /// - Parameter samplingRate: Sampling rate of the audio stream in Hz - /// - Parameter scanType: The scan type (progressive or interlaced) - /// - Parameter selected: Indicates if the stream is selected - /// - Parameter streamIdentifier: The identifier of the video stream - /// - Parameter title: Title of the subtitle track (for subtitle streams) - /// - Parameter width: The width of the video stream + /// - Parameter codec: Codec used by the stream. + /// - Parameter displayTitle: Display title for the stream. + /// - Parameter extendedDisplayTitle: Extended display title for the stream. + /// - Parameter id: Unique stream identifier. + /// - Parameter index: Index of the stream. + /// - Parameter streamType: Stream type (1=video, 2=audio, 3=subtitle). + /// - Parameter audioChannelLayout: Audio channel layout. + /// - Parameter bitDepth: Bit depth of the video stream. + /// - Parameter bitrate: Bitrate of the stream. + /// - Parameter canAutoSync: Indicates if the stream can auto-sync. + /// - Parameter channels: Number of audio channels (for audio streams). + /// - Parameter chromaLocation: Chroma sample location. + /// - Parameter chromaSubsampling: Chroma subsampling format. + /// - Parameter codedHeight: Coded video height. + /// - Parameter codedWidth: Coded video width. + /// - Parameter colorPrimaries: Color primaries used. + /// - Parameter colorRange: Color range (e.g., tv). + /// - Parameter colorSpace: Color space. + /// - Parameter colorTrc: Color transfer characteristics. + /// - Parameter `default`: Indicates if this stream is default. + /// - Parameter doviblCompatID: Dolby Vision BL compatibility ID. + /// - Parameter doviblPresent: Indicates if Dolby Vision BL is present. + /// - Parameter dovielPresent: Indicates if Dolby Vision EL is present. + /// - Parameter doviLevel: Dolby Vision level. + /// - Parameter doviPresent: Indicates if Dolby Vision is present. + /// - Parameter doviProfile: Dolby Vision profile. + /// - Parameter dovirpuPresent: Indicates if Dolby Vision RPU is present. + /// - Parameter doviVersion: Dolby Vision version. + /// - Parameter dub: Indicates if the stream is a dub. + /// - Parameter frameRate: Frame rate of the stream. + /// - Parameter headerCompression: Indicates whether header compression is enabled. + /// - Parameter hearingImpaired: Indicates if the stream is for the hearing impaired. + /// - Parameter height: Height of the video stream. + /// - Parameter language: Language of the stream. + /// - Parameter languageCode: ISO language code. + /// - Parameter languageTag: Language tag (e.g., en). + /// - Parameter level: Video level. + /// - Parameter original: Indicates if this is the original stream. + /// - Parameter profile: Video profile. + /// - Parameter refFrames: Number of reference frames. + /// - Parameter samplingRate: Sampling rate for the audio stream. + /// - Parameter selected: Indicates if this stream is selected (applicable for audio streams). + /// - Parameter title: Optional title for the stream (e.g., language variant). + /// - Parameter width: Width of the video stream. /// - public init(codec: String, id: Int, index: Int, streamType: Int, audioChannelLayout: String? = nil, bitDepth: Int? = nil, bitrate: Int? = nil, canAutoSync: Bool? = nil, channels: Int? = nil, chromaLocation: String? = nil, chromaSubsampling: String? = nil, closedCaptions: Bool? = nil, codedHeight: Int? = nil, codedWidth: Int? = nil, colorPrimaries: String? = nil, colorRange: String? = nil, colorSpace: String? = nil, colorTrc: String? = nil, `default`: Bool? = nil, displayTitle: String? = nil, embeddedInVideo: String? = nil, extendedDisplayTitle: String? = nil, frameRate: Double? = nil, hasScalingMatrix: Bool? = nil, hearingImpaired: Bool? = nil, height: Int? = nil, language: String? = nil, languageCode: String? = nil, languageTag: String? = nil, level: Int? = nil, profile: String? = nil, refFrames: Int? = nil, samplingRate: Int? = nil, scanType: String? = nil, selected: Bool? = nil, streamIdentifier: String? = nil, title: String? = nil, width: Int? = nil) { + public init(codec: String, displayTitle: String, extendedDisplayTitle: String, id: Int, index: Int, streamType: Int, audioChannelLayout: String? = nil, bitDepth: Int? = nil, bitrate: Int? = nil, canAutoSync: Bool? = nil, channels: Int? = nil, chromaLocation: String? = nil, chromaSubsampling: String? = nil, closedCaptions: Bool? = nil, codedHeight: Int? = nil, codedWidth: Int? = nil, colorPrimaries: String? = nil, colorRange: String? = nil, colorSpace: String? = nil, colorTrc: String? = nil, `default`: Bool? = nil, doviblCompatID: Int? = nil, doviblPresent: Bool? = nil, dovielPresent: Bool? = nil, doviLevel: Int? = nil, doviPresent: Bool? = nil, doviProfile: Int? = nil, dovirpuPresent: Bool? = nil, doviVersion: String? = nil, dub: Bool? = nil, embeddedInVideo: String? = nil, forced: Bool? = nil, frameRate: Double? = nil, hasScalingMatrix: Bool? = nil, headerCompression: Bool? = nil, hearingImpaired: Bool? = nil, height: Int? = nil, language: String? = nil, languageCode: String? = nil, languageTag: String? = nil, level: Int? = nil, original: Bool? = nil, profile: String? = nil, refFrames: Int? = nil, samplingRate: Int? = nil, scanType: String? = nil, selected: Bool? = nil, title: String? = nil, width: Int? = nil) { self.codec = codec + self.displayTitle = displayTitle + self.extendedDisplayTitle = extendedDisplayTitle self.id = id self.index = index self.streamType = streamType @@ -136,23 +169,32 @@ extension Operations { self.colorSpace = colorSpace self.colorTrc = colorTrc self.`default` = `default` - self.displayTitle = displayTitle + self.doviblCompatID = doviblCompatID + self.doviblPresent = doviblPresent + self.dovielPresent = dovielPresent + self.doviLevel = doviLevel + self.doviPresent = doviPresent + self.doviProfile = doviProfile + self.dovirpuPresent = dovirpuPresent + self.doviVersion = doviVersion + self.dub = dub self.embeddedInVideo = embeddedInVideo - self.extendedDisplayTitle = extendedDisplayTitle + self.forced = forced self._frameRate = DecimalSerialized(wrappedValue: frameRate) self.hasScalingMatrix = hasScalingMatrix + self.headerCompression = headerCompression self.hearingImpaired = hearingImpaired self.height = height self.language = language self.languageCode = languageCode self.languageTag = languageTag self.level = level + self.original = original self.profile = profile self.refFrames = refFrames self.samplingRate = samplingRate self.scanType = scanType self.selected = selected - self.streamIdentifier = streamIdentifier self.title = title self.width = width } @@ -161,6 +203,8 @@ extension Operations { extension Operations.Stream: Codable { enum CodingKeys: String, CodingKey { case codec + case displayTitle + case extendedDisplayTitle case id case index case streamType @@ -179,23 +223,32 @@ extension Operations.Stream: Codable { case colorSpace case colorTrc case `default` = "default" - case displayTitle + case doviblCompatID = "DOVIBLCompatID" + case doviblPresent = "DOVIBLPresent" + case dovielPresent = "DOVIELPresent" + case doviLevel = "DOVILevel" + case doviPresent = "DOVIPresent" + case doviProfile = "DOVIProfile" + case dovirpuPresent = "DOVIRPUPresent" + case doviVersion = "DOVIVersion" + case dub case embeddedInVideo - case extendedDisplayTitle + case forced case frameRate case hasScalingMatrix + case headerCompression case hearingImpaired case height case language case languageCode case languageTag case level + case original case profile case refFrames case samplingRate case scanType case selected - case streamIdentifier case title case width } @@ -203,6 +256,8 @@ extension Operations.Stream: Codable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.codec = try container.decode(String.self, forKey: .codec) + self.displayTitle = try container.decode(String.self, forKey: .displayTitle) + self.extendedDisplayTitle = try container.decode(String.self, forKey: .extendedDisplayTitle) self.id = try container.decode(Int.self, forKey: .id) self.index = try container.decode(Int.self, forKey: .index) self.streamType = try container.decode(Int.self, forKey: .streamType) @@ -221,23 +276,32 @@ extension Operations.Stream: Codable { self.colorSpace = try container.decodeIfPresent(String.self, forKey: .colorSpace) self.colorTrc = try container.decodeIfPresent(String.self, forKey: .colorTrc) self.`default` = try container.decodeIfPresent(Bool.self, forKey: .`default`) - self.displayTitle = try container.decodeIfPresent(String.self, forKey: .displayTitle) + self.doviblCompatID = try container.decodeIfPresent(Int.self, forKey: .doviblCompatID) + self.doviblPresent = try container.decodeIfPresent(Bool.self, forKey: .doviblPresent) + self.dovielPresent = try container.decodeIfPresent(Bool.self, forKey: .dovielPresent) + self.doviLevel = try container.decodeIfPresent(Int.self, forKey: .doviLevel) + self.doviPresent = try container.decodeIfPresent(Bool.self, forKey: .doviPresent) + self.doviProfile = try container.decodeIfPresent(Int.self, forKey: .doviProfile) + self.dovirpuPresent = try container.decodeIfPresent(Bool.self, forKey: .dovirpuPresent) + self.doviVersion = try container.decodeIfPresent(String.self, forKey: .doviVersion) + self.dub = try container.decodeIfPresent(Bool.self, forKey: .dub) self.embeddedInVideo = try container.decodeIfPresent(String.self, forKey: .embeddedInVideo) - self.extendedDisplayTitle = try container.decodeIfPresent(String.self, forKey: .extendedDisplayTitle) + self.forced = try container.decodeIfPresent(Bool.self, forKey: .forced) self._frameRate = try container.decodeIfPresent(DecimalSerialized.self, forKey: .frameRate) ?? DecimalSerialized(wrappedValue: nil) self.hasScalingMatrix = try container.decodeIfPresent(Bool.self, forKey: .hasScalingMatrix) + self.headerCompression = try container.decodeIfPresent(Bool.self, forKey: .headerCompression) self.hearingImpaired = try container.decodeIfPresent(Bool.self, forKey: .hearingImpaired) self.height = try container.decodeIfPresent(Int.self, forKey: .height) self.language = try container.decodeIfPresent(String.self, forKey: .language) self.languageCode = try container.decodeIfPresent(String.self, forKey: .languageCode) self.languageTag = try container.decodeIfPresent(String.self, forKey: .languageTag) self.level = try container.decodeIfPresent(Int.self, forKey: .level) + self.original = try container.decodeIfPresent(Bool.self, forKey: .original) self.profile = try container.decodeIfPresent(String.self, forKey: .profile) self.refFrames = try container.decodeIfPresent(Int.self, forKey: .refFrames) self.samplingRate = try container.decodeIfPresent(Int.self, forKey: .samplingRate) self.scanType = try container.decodeIfPresent(String.self, forKey: .scanType) self.selected = try container.decodeIfPresent(Bool.self, forKey: .selected) - self.streamIdentifier = try container.decodeIfPresent(String.self, forKey: .streamIdentifier) self.title = try container.decodeIfPresent(String.self, forKey: .title) self.width = try container.decodeIfPresent(Int.self, forKey: .width) } @@ -245,6 +309,8 @@ extension Operations.Stream: Codable { public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(self.codec, forKey: .codec) + try container.encode(self.displayTitle, forKey: .displayTitle) + try container.encode(self.extendedDisplayTitle, forKey: .extendedDisplayTitle) try container.encode(self.id, forKey: .id) try container.encode(self.index, forKey: .index) try container.encode(self.streamType, forKey: .streamType) @@ -263,25 +329,34 @@ extension Operations.Stream: Codable { try container.encodeIfPresent(self.colorSpace, forKey: .colorSpace) try container.encodeIfPresent(self.colorTrc, forKey: .colorTrc) try container.encodeIfPresent(self.`default`, forKey: .`default`) - try container.encodeIfPresent(self.displayTitle, forKey: .displayTitle) + try container.encodeIfPresent(self.doviblCompatID, forKey: .doviblCompatID) + try container.encodeIfPresent(self.doviblPresent, forKey: .doviblPresent) + try container.encodeIfPresent(self.dovielPresent, forKey: .dovielPresent) + try container.encodeIfPresent(self.doviLevel, forKey: .doviLevel) + try container.encodeIfPresent(self.doviPresent, forKey: .doviPresent) + try container.encodeIfPresent(self.doviProfile, forKey: .doviProfile) + try container.encodeIfPresent(self.dovirpuPresent, forKey: .dovirpuPresent) + try container.encodeIfPresent(self.doviVersion, forKey: .doviVersion) + try container.encodeIfPresent(self.dub, forKey: .dub) try container.encodeIfPresent(self.embeddedInVideo, forKey: .embeddedInVideo) - try container.encodeIfPresent(self.extendedDisplayTitle, forKey: .extendedDisplayTitle) + try container.encodeIfPresent(self.forced, forKey: .forced) if self.frameRate != nil { try container.encode(self._frameRate, forKey: .frameRate) } try container.encodeIfPresent(self.hasScalingMatrix, forKey: .hasScalingMatrix) + try container.encodeIfPresent(self.headerCompression, forKey: .headerCompression) try container.encodeIfPresent(self.hearingImpaired, forKey: .hearingImpaired) try container.encodeIfPresent(self.height, forKey: .height) try container.encodeIfPresent(self.language, forKey: .language) try container.encodeIfPresent(self.languageCode, forKey: .languageCode) try container.encodeIfPresent(self.languageTag, forKey: .languageTag) try container.encodeIfPresent(self.level, forKey: .level) + try container.encodeIfPresent(self.original, forKey: .original) try container.encodeIfPresent(self.profile, forKey: .profile) try container.encodeIfPresent(self.refFrames, forKey: .refFrames) try container.encodeIfPresent(self.samplingRate, forKey: .samplingRate) try container.encodeIfPresent(self.scanType, forKey: .scanType) try container.encodeIfPresent(self.selected, forKey: .selected) - try container.encodeIfPresent(self.streamIdentifier, forKey: .streamIdentifier) try container.encodeIfPresent(self.title, forKey: .title) try container.encodeIfPresent(self.width, forKey: .width) } diff --git a/Sources/Plexswift/models/operations/Writer.swift b/Sources/Plexswift/models/operations/Writer.swift index 70294d0..73558b6 100644 --- a/Sources/Plexswift/models/operations/Writer.swift +++ b/Sources/Plexswift/models/operations/Writer.swift @@ -5,19 +5,36 @@ import Foundation extension Operations { /// A model object public struct Writer { - public let tag: String? + /// The filter string used to query this writer. + public let filter: String + /// Unique identifier for the writer. + public let id: Int + /// The role of Writer + public let tag: String + /// A unique key associated with the writers tag, used for internal identification. + public let tagKey: String? /// Creates an object with the specified parameters /// + /// - Parameter filter: The filter string used to query this writer. + /// - Parameter id: Unique identifier for the writer. + /// - Parameter tag: The role of Writer + /// - Parameter tagKey: A unique key associated with the writers tag, used for internal identification. /// - public init(tag: String? = nil) { + public init(filter: String, id: Int, tag: String, tagKey: String? = nil) { + self.filter = filter + self.id = id self.tag = tag + self.tagKey = tagKey } }} extension Operations.Writer: Codable { enum CodingKeys: String, CodingKey { + case filter + case id case tag + case tagKey } } diff --git a/Sources/plexswift/PlexswiftAPI.swift b/Sources/plexswift/PlexswiftAPI.swift index c2b96e4..69a1d79 100644 --- a/Sources/plexswift/PlexswiftAPI.swift +++ b/Sources/plexswift/PlexswiftAPI.swift @@ -749,7 +749,6 @@ public protocol SearchAPI { /// - ``getMediaMetaData(request:)`` /// - ``getMetadataChildren(request:)`` /// - ``getTopWatchedContent(request:)`` -/// - ``getOnDeck()`` /// public protocol LibraryAPI { /// This resource returns hash values for local files @@ -956,13 +955,6 @@ public protocol LibraryAPI { /// - Returns: A ``Operations/GetTopWatchedContentResponse`` object describing the result of the API operation /// - Throws: An error of type ``PlexswiftError`` func getTopWatchedContent(request: Operations.GetTopWatchedContentRequest) async throws -> Response - - /// This endpoint will return the on deck content. - /// - /// - /// - Returns: A ``Operations/GetOnDeckResponse`` object describing the result of the API operation - /// - Throws: An error of type ``PlexswiftError`` - func getOnDeck() async throws -> Response } // MARK: - WatchlistAPI diff --git a/Sources/plexswift/internal/client/URLRequestBuilder.swift b/Sources/plexswift/internal/client/URLRequestBuilder.swift index 1ad9b48..53f8fca 100644 --- a/Sources/plexswift/internal/client/URLRequestBuilder.swift +++ b/Sources/plexswift/internal/client/URLRequestBuilder.swift @@ -62,7 +62,7 @@ final class URLRequestBuilder: URLRequestConfiguration { urlRequest.setValue(contentType, forHTTPHeaderField: "Content-Type") } - urlRequest.setValue("speakeasy-sdk/swift 0.10.3 2.428.1 0.0.3 plexswift", forHTTPHeaderField: telemetryHeader.headerName) + urlRequest.setValue("speakeasy-sdk/swift 0.10.5 2.428.1 0.0.3 plexswift", forHTTPHeaderField: telemetryHeader.headerName) addSecurityParameters(to: &urlRequest) diff --git a/codeSamples.yaml b/codeSamples.yaml index 36ff1a4..da84107 100644 --- a/codeSamples.yaml +++ b/codeSamples.yaml @@ -586,33 +586,6 @@ actions: - lang: swift label: image source: "import Foundation\nimport Plexswift\n\nlet client = Client(security: .accessToken(\"\"))\n\nlet response = try await client.media.getThumbImage(\n request: Operations.GetThumbImageRequest(\n height: 396, \n minSize: 1, \n ratingKey: 9518, \n upscale: 1, \n width: 396, \n xPlexToken: \"CV5xoxjTpFKUzBTShsaf\"\n )\n)\n\nswitch response.data {\ncase .bytes(let bytes):\n // Handle response\n break\ncase .badRequest(let badRequest):\n // Handle response\n break\ncase .unauthorized(let unauthorized):\n // Handle response\n break\ncase .empty:\n // Handle empty response\n break\n}" - - target: $["paths"]["/library/onDeck"]["get"] - update: - x-codeSamples: - - lang: swift - label: getOnDeck - source: |- - import Foundation - import Plexswift - - let client = Client(security: .accessToken("")) - - let response = try await client.library.getOnDeck() - - switch response.data { - case .object(let object): - // Handle response - break - case .badRequest(let badRequest): - // Handle response - break - case .unauthorized(let unauthorized): - // Handle response - break - case .empty: - // Handle empty response - break - } - target: $["paths"]["/library/recentlyAdded"]["get"] update: x-codeSamples: