mirror of
https://github.com/LukeHagar/plexjs.git
synced 2025-12-06 04:20:46 +00:00
* `plex-api.libraryPlaylists.addPlaylistItems()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.hubs.getMetadataHubs()`: * `request.onlyTransient` **Changed** * `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryCollections.moveCollectionItem()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryCollections.deleteCollectionItem()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryCollections.addCollectionItems()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.content.getSonicallySimilar()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.butler.stopTask()`: `request` **Changed** **Breaking** ⚠️ * `plex-api.butler.startTask()`: `request` **Changed** **Breaking** ⚠️ * `plex-api.content.getSonicPath()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.downloadQueue.getItemDecision()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.hubs.getAllHubs()`: * `request.onlyTransient` **Changed** * `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.hubs.getContinueWatching()`: `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.hubs.getPromotedHubs()`: `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.content.getAllLeaves()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.hubs.getPostplayHubs()`: * `request.onlyTransient` **Changed** * `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.hubs.getRelatedHubs()`: * `request.onlyTransient` **Changed** * `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.hubs.getSectionHubs()`: * `request.onlyTransient` **Changed** * `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.content.listContent()`: * `request` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.content.getAlbums()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.search.searchHubs()`: `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.search.voiceSearchHubs()`: * `request.type` **Changed** **Breaking** ⚠️ * `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getLibraryItems()`: * `request.mediaQuery` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.ingestTransientItem()`: * `request` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getLibraryMatches()`: * `request` **Changed** **Breaking** ⚠️ * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.content.getMetadataItem()`: * `request` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getSections()`: `response.mediacontainer.directory.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.addSection()`: * `request` **Changed** * `response.mediacontainer.directory.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getTags()`: * `request.type` **Changed** **Breaking** ⚠️ * `plex-api.content.getCollectionItems()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getAllItemLeaves()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.status.listSessions()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.movePlayQueueItem()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getExtras()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.deletePlayQueueItem()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.unshuffle()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.listMatches()`: * `request.manual` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.listSonicallySimilar()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.resetPlayQueue()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getRelatedItems()`: `response.mediacontainer.hub.[].metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.listSimilar()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.clearPlayQueue()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getItemTree()`: `response.mediacontainer.metadataItem.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.addToPlayQueue()`: * `request.next` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.getPlayQueue()`: * `request` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryPlaylists.movePlaylistItem()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getPerson()`: `response.mediacontainer.directory.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.listPersonMedia()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryPlaylists.getPlaylistGeneratorItems()`: `response.mediacontainer.metadata` **Changed** **Breaking** ⚠️ * `plex-api.library.getLibraryDetails()`: * `request.includeDetails` **Changed** * `response.mediacontainer.directory.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryPlaylists.modifyPlaylistGenerator()`: * `request.item` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.autocomplete()`: * `request.mediaQuery` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getCollections()`: * `request.mediaQuery` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.getCommon()`: * `request.mediaQuery` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryPlaylists.deletePlaylistItem()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryPlaylists.clearPlaylistItems()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playQueue.shuffle()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.libraryPlaylists.createPlaylist()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playlist.getPlaylistItems()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playlist.getPlaylist()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.collections.createCollection()`: * `request.type` **Changed** **Breaking** ⚠️ * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.dvRs.tuneChannel()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.liveTv.getSessions()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.liveTv.getLiveTvSession()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.playlist.listPlaylists()`: `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.subscriptions.getAllSubscriptions()`: * `request` **Changed** * `response.mediacontainer.mediaSubscription.[].mediaGrabOperation.[].metadata` **Changed** **Breaking** ⚠️ * `plex-api.subscriptions.createSubscription()`: `response.mediacontainer.mediaSubscription.[].mediaGrabOperation.[].metadata` **Changed** **Breaking** ⚠️ * `plex-api.subscriptions.getScheduledRecordings()`: `response.mediacontainer.mediaGrabOperation.[].metadata` **Changed** **Breaking** ⚠️ * `plex-api.subscriptions.getTemplate()`: `response.mediacontainer.subscriptionTemplate.[].mediaSubscription.[].mediaGrabOperation.[].metadata` **Changed** **Breaking** ⚠️ * `plex-api.subscriptions.getSubscription()`: * `request` **Changed** * `response.mediacontainer.mediaSubscription.[].mediaGrabOperation.[].metadata` **Changed** **Breaking** ⚠️ * `plex-api.subscriptions.editSubscriptionPreferences()`: `response.mediacontainer.mediaSubscription.[].mediaGrabOperation.[].metadata` **Changed** **Breaking** ⚠️ * `plex-api.subscriptions.reorderSubscription()`: `response.mediacontainer.mediaSubscription.[].mediaGrabOperation.[].metadata` **Changed** **Breaking** ⚠️ * `plex-api.transcoder.makeDecision()`: * `request` **Changed** * `response.mediacontainer.metadata.[]` **Changed** **Breaking** ⚠️ * `plex-api.library.refreshItemsMetadata()`: * `request.markUpdated` **Changed** * `plex-api.authentication.postUsersSignInData()`: **Added** * `plex-api.transcoder.startTranscodeSession()`: `request` **Changed** * `plex-api.devices.modifyDevice()`: * `request.enabled` **Changed** * `plex-api.library.getMediaPart()`: * `request.download` **Changed** * `plex-api.library.detectIntros()`: * `request.force` **Changed** * `plex-api.library.refreshSection()`: * `request.force` **Changed** * `plex-api.libraryPlaylists.uploadPlaylist()`: * `request.force` **Changed** * `plex-api.library.deleteMediaItem()`: * `request.proxy` **Changed** * `plex-api.authentication.getTokenDetails()`: **Added** * `plex-api.library.getFirstCharacters()`: * `request.mediaQuery` **Changed** * `plex-api.library.updateItems()`: * `request.field.locked` **Changed** * `plex-api.library.deleteLibrarySection()`: * `request.async` **Changed** * `plex-api.library.setStreamSelection()`: * `request.allParts` **Changed** * `plex-api.playQueue.createPlayQueue()`: `request` **Changed** * `plex-api.library.getAugmentationStatus()`: * `request.wait` **Changed** * `plex-api.library.detectVoiceActivity()`: `request` **Changed** * `plex-api.transcoder.transcodeImage()`: `request` **Changed** * `plex-api.transcoder.transcodeSubtitles()`: `request` **Changed** * `plex-api.library.addSubtitles()`: `request` **Changed** * `plex-api.library.getStream()`: * `request.autoAdjustSubtitle` **Changed** * `plex-api.library.startBifGeneration()`: * `request.force` **Changed** * `plex-api.library.detectCredits()`: `request` **Changed** * `plex-api.ultraBlur.getImage()`: * `request.noise` **Changed** * `plex-api.library.generateThumbs()`: * `request.force` **Changed** * `plex-api.updater.applyUpdates()`: `request` **Changed** * `plex-api.updater.checkUpdates()`: * `request.download` **Changed** * `plex-api.library.deleteMetadataItem()`: * `request.proxy` **Changed** * `plex-api.library.optimizeDatabase()`: * `request.async` **Changed** * `plex-api.hubs.updateHubVisibility()`: `request` **Changed** * `plex-api.hubs.createCustomHub()`: `request` **Changed** * `plex-api.library.getSectionImage()`: * `request.mediaQuery` **Changed** * `plex-api.downloadQueue.addDownloadQueueItems()`: `request` **Changed** * `plex-api.timeline.report()`: `request` **Changed** * `plex-api.general.getSourceConnectionInformation()`: * `request.refresh` **Changed** * `plex-api.plex.getServerResources()`: **Added** * `plex-api.users.getUsers()`: **Added**
233 lines
13 KiB
Markdown
233 lines
13 KiB
Markdown
# GetTemplateMediaContainer
|
|
|
|
`MediaContainer` is the root element of most Plex API responses. It serves as a generic container for various types of content (Metadata, Hubs, Directories, etc.) and includes pagination information (offset, size, totalSize) when applicable.
|
|
Common attributes: - identifier: Unique identifier for this container - size: Number of items in this response page - totalSize: Total number of items available (for pagination) - offset: Starting index of this page (for pagination)
|
|
The container often "hoists" common attributes from its children. For example, if all tracks in a container share the same album title, the `parentTitle` attribute may appear on the MediaContainer rather than being repeated on each track.
|
|
|
|
|
|
## Example Usage
|
|
|
|
```typescript
|
|
import { GetTemplateMediaContainer } from "@lukehagar/plexjs/sdk/models/operations";
|
|
import { RFCDate } from "@lukehagar/plexjs/sdk/types";
|
|
|
|
let value: GetTemplateMediaContainer = {
|
|
subscriptionTemplate: [
|
|
{
|
|
mediaSubscription: [
|
|
{
|
|
title: "This Episode",
|
|
mediaGrabOperation: [
|
|
{
|
|
metadata: {
|
|
title: "<value>",
|
|
type: "<value>",
|
|
addedAt: 3539,
|
|
art: "/library/metadata/58683/art/1703239236",
|
|
autotag: [
|
|
{
|
|
filter: "actor=49",
|
|
ratingKey: "58683",
|
|
role: "Secretary",
|
|
tag: "Shaun Lawton",
|
|
tagKey: "5d3ee12c4cde6a001c3e0b27",
|
|
thumb:
|
|
"http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg",
|
|
},
|
|
],
|
|
chapterSource: "media",
|
|
childCount: 1,
|
|
country: [
|
|
{
|
|
filter: "actor=49",
|
|
ratingKey: "58683",
|
|
role: "Secretary",
|
|
tag: "Shaun Lawton",
|
|
tagKey: "5d3ee12c4cde6a001c3e0b27",
|
|
thumb:
|
|
"http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg",
|
|
},
|
|
],
|
|
director: [
|
|
{
|
|
filter: "actor=49",
|
|
ratingKey: "58683",
|
|
role: "Secretary",
|
|
tag: "Shaun Lawton",
|
|
tagKey: "5d3ee12c4cde6a001c3e0b27",
|
|
thumb:
|
|
"http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg",
|
|
},
|
|
],
|
|
genre: [
|
|
{
|
|
filter: "actor=49",
|
|
ratingKey: "58683",
|
|
role: "Secretary",
|
|
tag: "Shaun Lawton",
|
|
tagKey: "5d3ee12c4cde6a001c3e0b27",
|
|
thumb:
|
|
"http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg",
|
|
},
|
|
],
|
|
grandparentGuid: "plex://show/5d9c081b170e24001f2a7be4",
|
|
guid: "plex://movie/5d7768ba96b655001fdc0408",
|
|
guids: [
|
|
{
|
|
id:
|
|
"{\"imdbExample\":{\"summary\":\"IMDB example\",\"value\":\"imdb://tt13015952\"},\"tmdbExample\":{\"summary\":\"TMDB example\",\"value\":\"tmdb://2434012\"},\"tvdbExample\":{\"summary\":\"TVDB example\",\"value\":\"tvdb://7945991\"}}",
|
|
},
|
|
],
|
|
key: "<key>",
|
|
lastViewedAt: 1556281940,
|
|
media: [
|
|
{
|
|
aspectRatio: 2.35,
|
|
audioChannels: 2,
|
|
audioCodec: "aac",
|
|
audioProfile: "lc",
|
|
bitrate: 5612,
|
|
container: "mov",
|
|
duration: 150192,
|
|
has64bitOffsets: false,
|
|
hasVoiceActivity: true,
|
|
height: 544,
|
|
id: 1,
|
|
optimizedForStreaming: false,
|
|
part: [
|
|
{
|
|
accessible: true,
|
|
audioProfile: "lc",
|
|
container: "mov",
|
|
duration: 150192,
|
|
exists: true,
|
|
file:
|
|
"/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov",
|
|
has64bitOffsets: false,
|
|
id: 1,
|
|
indexes: "sd",
|
|
key: "/library/parts/1/1531779263/file.mov",
|
|
optimizedForStreaming: false,
|
|
size: 105355654,
|
|
stream: [
|
|
{
|
|
default: true,
|
|
audioChannelLayout: "5.1(side)",
|
|
channels: 6,
|
|
bitDepth: 10,
|
|
doviblCompatID: 1,
|
|
doviblPresent: true,
|
|
dovielPresent: false,
|
|
doviLevel: 6,
|
|
doviPresent: true,
|
|
doviProfile: 8,
|
|
dovirpuPresent: true,
|
|
doviVersion: "1.0",
|
|
bitrate: 24743,
|
|
canAutoSync: false,
|
|
chromaLocation: "topleft",
|
|
chromaSubsampling: "4:2:0",
|
|
codedHeight: 1608,
|
|
codedWidth: 3840,
|
|
closedCaptions: true,
|
|
codec: "hevc",
|
|
colorPrimaries: "bt2020",
|
|
colorRange: "tv",
|
|
colorSpace: "bt2020nc",
|
|
colorTrc: "smpte2084",
|
|
displayTitle: "4K DoVi/HDR10 (HEVC Main 10)",
|
|
extendedDisplayTitle:
|
|
"4K DoVi/HDR10 (HEVC Main 10)",
|
|
frameRate: 23.976,
|
|
hasScalingMatrix: false,
|
|
height: 1602,
|
|
id: 1002625,
|
|
index: 0,
|
|
key: "/library/streams/216389",
|
|
language: "English",
|
|
languageCode: "eng",
|
|
languageTag: "en",
|
|
format: "srt",
|
|
headerCompression: true,
|
|
level: 150,
|
|
original: true,
|
|
profile: "main 10",
|
|
refFrames: 1,
|
|
samplingRate: 48000,
|
|
scanType: "progressive",
|
|
embeddedInVideo: "progressive",
|
|
selected: true,
|
|
forced: true,
|
|
hearingImpaired: true,
|
|
dub: true,
|
|
title: "SDH",
|
|
streamIdentifier: 1,
|
|
width: 3840,
|
|
},
|
|
],
|
|
videoProfile: "main",
|
|
},
|
|
],
|
|
videoCodec: "h264",
|
|
videoFrameRate: "24p",
|
|
videoProfile: "main",
|
|
videoResolution: "720",
|
|
width: 1280,
|
|
},
|
|
],
|
|
originallyAvailableAt: new RFCDate("2022-12-14"),
|
|
parentGuid: "plex://show/5d9c081b170e24001f2a7be4",
|
|
ratingArray: [
|
|
{
|
|
filter: "actor=49",
|
|
ratingKey: "58683",
|
|
role: "Secretary",
|
|
tag: "Shaun Lawton",
|
|
tagKey: "5d3ee12c4cde6a001c3e0b27",
|
|
thumb:
|
|
"http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg",
|
|
},
|
|
],
|
|
role: [
|
|
{
|
|
filter: "actor=49",
|
|
ratingKey: "58683",
|
|
role: "Secretary",
|
|
tag: "Shaun Lawton",
|
|
tagKey: "5d3ee12c4cde6a001c3e0b27",
|
|
thumb:
|
|
"http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg",
|
|
},
|
|
],
|
|
theme: "/library/metadata/1/theme/1705636920",
|
|
thumb: "/library/metadata/58683/thumb/1703239236",
|
|
writer: [
|
|
{
|
|
filter: "actor=49",
|
|
ratingKey: "58683",
|
|
role: "Secretary",
|
|
tag: "Shaun Lawton",
|
|
tagKey: "5d3ee12c4cde6a001c3e0b27",
|
|
thumb:
|
|
"http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
],
|
|
};
|
|
```
|
|
|
|
## Fields
|
|
|
|
| Field | Type | Required | Description |
|
|
| ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
| `identifier` | *string* | :heavy_minus_sign: | N/A |
|
|
| `offset` | *number* | :heavy_minus_sign: | The offset of where this container page starts among the total objects available. Also provided in the `X-Plex-Container-Start` header.<br/> |
|
|
| `size` | *number* | :heavy_minus_sign: | N/A |
|
|
| `totalSize` | *number* | :heavy_minus_sign: | The total size of objects available. Also provided in the `X-Plex-Container-Total-Size` header.<br/> |
|
|
| `subscriptionTemplate` | [operations.SubscriptionTemplate](../../../sdk/models/operations/subscriptiontemplate.md)[] | :heavy_minus_sign: | N/A | |