package main
import(
"context"
"github.com/LukeHagar/plexgo/models/components"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
plexgo.WithAccepts(components.AcceptsApplicationXML),
plexgo.WithClientIdentifier("abc123"),
plexgo.WithProduct("Plex for Roku"),
plexgo.WithVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithPlatformVersion("4.3 build 1057"),
plexgo.WithDevice("Roku 3"),
plexgo.WithModel("4200X"),
plexgo.WithDeviceVendor("Roku"),
plexgo.WithDeviceName("Living Room TV"),
plexgo.WithMarketplace("googlePlay"),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
)
res, err := s.Library.GetLibraryMatches(ctx, operations.GetLibraryMatchesRequest{
Type: components.MediaTypeTvShow.ToPointer(),
IncludeFullMetadata: components.BoolIntTrue.ToPointer(),
IncludeAncestorMetadata: components.BoolIntTrue.ToPointer(),
IncludeAlternateMetadataSources: components.BoolIntTrue.ToPointer(),
})
if err != nil {
log.Fatal(err)
}
if res.MediaContainerWithMetadata != nil {
// handle response
}
}{
"MediaContainer": {
"identifier": "<string>",
"offset": 123,
"size": 123,
"totalSize": 123,
"Metadata": [
{
"title": "<string>",
"type": "<string>",
"addedAt": 123,
"key": "<string>",
"absoluteIndex": 123,
"art": "/library/metadata/58683/art/1703239236",
"audienceRating": 5,
"audienceRatingImage": "<string>",
"Autotag": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"banner": "<string>",
"chapterSource": "media",
"childCount": 1,
"composite": "<string>",
"contentRating": "<string>",
"Country": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"Director": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"duration": 123,
"Filter": [
{
"title": "<string>",
"type": "<string>",
"art": "<string>",
"content": true,
"filter": "<string>",
"hasPrefs": true,
"hasStoreServices": true,
"hubKey": "<string>",
"identifier": "<string>",
"key": "<string>",
"lastAccessedAt": 123,
"Pivot": [
{
"title": "<string>",
"type": "<string>",
"context": "<string>",
"id": "<string>",
"key": "<string>",
"symbol": "<string>"
}
],
"share": 123,
"thumb": "<string>",
"titleBar": "<string>",
"filterType": "<string>"
}
],
"Genre": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"grandparentArt": "<string>",
"grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4",
"grandparentHero": "<string>",
"grandparentKey": "<string>",
"grandparentRatingKey": "<string>",
"grandparentTheme": "<string>",
"grandparentThumb": "<string>",
"grandparentTitle": "<string>",
"guid": "plex://movie/5d7768ba96b655001fdc0408",
"Guid": [
{
"id": {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
}
}
],
"hero": "<string>",
"Image": [
{
"type": "background",
"alt": "<string>",
"url": "<string>"
}
],
"index": 123,
"lastViewedAt": 1556281940,
"leafCount": 123,
"Media": [
{
"id": 1,
"aspectRatio": 2.35,
"audioChannels": 2,
"audioCodec": "aac",
"audioProfile": "lc",
"bitrate": 5612,
"container": "mov",
"duration": 150192,
"has64bitOffsets": false,
"hasVoiceActivity": true,
"height": 544,
"optimizedForStreaming": false,
"Part": [
{
"id": 1,
"key": "/library/parts/1/1531779263/file.mov",
"accessible": true,
"audioProfile": "lc",
"container": "mov",
"duration": 150192,
"exists": true,
"file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov",
"has64bitOffsets": false,
"indexes": "sd",
"optimizedForStreaming": false,
"size": 105355654,
"Stream": [
{
"codec": "hevc",
"displayTitle": "4K DoVi/HDR10 (HEVC Main 10)",
"id": 1002625,
"key": "/library/streams/216389",
"streamType": 1,
"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,
"colorPrimaries": "bt2020",
"colorRange": "tv",
"colorSpace": "bt2020nc",
"colorTrc": "smpte2084",
"extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)",
"frameRate": 23.976,
"hasScalingMatrix": false,
"height": 1602,
"index": 0,
"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": "2022-12-14",
"originalTitle": "<string>",
"parentGuid": "plex://show/5d9c081b170e24001f2a7be4",
"parentHero": "<string>",
"parentIndex": 123,
"parentKey": "<string>",
"parentRatingKey": "<string>",
"parentThumb": "<string>",
"parentTitle": "<string>",
"primaryExtraKey": "<string>",
"prompt": "<string>",
"rating": 5,
"Rating": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"ratingCount": 123,
"ratingImage": "<string>",
"ratingKey": "<string>",
"Role": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"search": true,
"secondary": true,
"skipChildren": true,
"skipParent": true,
"Sort": [
{
"title": "<string>",
"type": "<string>",
"art": "<string>",
"content": true,
"filter": "<string>",
"hasPrefs": true,
"hasStoreServices": true,
"hubKey": "<string>",
"identifier": "<string>",
"key": "<string>",
"lastAccessedAt": 123,
"Pivot": [
{
"title": "<string>",
"type": "<string>",
"context": "<string>",
"id": "<string>",
"key": "<string>",
"symbol": "<string>"
}
],
"share": 123,
"thumb": "<string>",
"titleBar": "<string>",
"default": "asc",
"defaultDirection": "asc",
"descKey": "<string>",
"firstCharacterKey": "<string>"
}
],
"studio": "<string>",
"subtype": "<string>",
"summary": "<string>",
"tagline": "<string>",
"theme": "/library/metadata/1/theme/1705636920",
"thumb": "/library/metadata/58683/thumb/1703239236",
"titleSort": "<string>",
"updatedAt": 123,
"userRating": 5,
"viewCount": 123,
"viewedLeafCount": 123,
"viewOffset": 123,
"Writer": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"year": 123
}
]
}
}The matches endpoint is used to match content external to the library with content inside the library. This is done by passing a series of semantic “hints” about the content (its type, name, or release year). Each type (e.g. movie) has a canonical set of minimal required hints.
This ability to match content is useful in a variety of scenarios. For example, in the DVR, the EPG uses the endpoint to match recording rules against airing content. And in the cloud, the UMP uses the endpoint to match up a piece of media with rich metadata.
The endpoint response can including multiple matches, if there is ambiguity, each one containing a score from 0 to 100. For somewhat historical reasons, anything over 85 is considered a positive match (we prefer false negatives over false positives in general for matching).
The guid hint is somewhat special, in that it generally represents a unique identity for a piece of media (e.g. the IMDB ttXXX) identifier, in contrast with other hints which can be much more ambiguous (e.g. a title of Jane Eyre, which could refer to the 1943 or the 2011 version).
Episodes require either a season/episode pair, or an air date (or both). Either the path must be sent, or the show title
package main
import(
"context"
"github.com/LukeHagar/plexgo/models/components"
"github.com/LukeHagar/plexgo"
"github.com/LukeHagar/plexgo/models/operations"
"log"
)
func main() {
ctx := context.Background()
s := plexgo.New(
plexgo.WithAccepts(components.AcceptsApplicationXML),
plexgo.WithClientIdentifier("abc123"),
plexgo.WithProduct("Plex for Roku"),
plexgo.WithVersion("2.4.1"),
plexgo.WithPlatform("Roku"),
plexgo.WithPlatformVersion("4.3 build 1057"),
plexgo.WithDevice("Roku 3"),
plexgo.WithModel("4200X"),
plexgo.WithDeviceVendor("Roku"),
plexgo.WithDeviceName("Living Room TV"),
plexgo.WithMarketplace("googlePlay"),
plexgo.WithSecurity("<YOUR_API_KEY_HERE>"),
)
res, err := s.Library.GetLibraryMatches(ctx, operations.GetLibraryMatchesRequest{
Type: components.MediaTypeTvShow.ToPointer(),
IncludeFullMetadata: components.BoolIntTrue.ToPointer(),
IncludeAncestorMetadata: components.BoolIntTrue.ToPointer(),
IncludeAlternateMetadataSources: components.BoolIntTrue.ToPointer(),
})
if err != nil {
log.Fatal(err)
}
if res.MediaContainerWithMetadata != nil {
// handle response
}
}{
"MediaContainer": {
"identifier": "<string>",
"offset": 123,
"size": 123,
"totalSize": 123,
"Metadata": [
{
"title": "<string>",
"type": "<string>",
"addedAt": 123,
"key": "<string>",
"absoluteIndex": 123,
"art": "/library/metadata/58683/art/1703239236",
"audienceRating": 5,
"audienceRatingImage": "<string>",
"Autotag": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"banner": "<string>",
"chapterSource": "media",
"childCount": 1,
"composite": "<string>",
"contentRating": "<string>",
"Country": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"Director": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"duration": 123,
"Filter": [
{
"title": "<string>",
"type": "<string>",
"art": "<string>",
"content": true,
"filter": "<string>",
"hasPrefs": true,
"hasStoreServices": true,
"hubKey": "<string>",
"identifier": "<string>",
"key": "<string>",
"lastAccessedAt": 123,
"Pivot": [
{
"title": "<string>",
"type": "<string>",
"context": "<string>",
"id": "<string>",
"key": "<string>",
"symbol": "<string>"
}
],
"share": 123,
"thumb": "<string>",
"titleBar": "<string>",
"filterType": "<string>"
}
],
"Genre": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"grandparentArt": "<string>",
"grandparentGuid": "plex://show/5d9c081b170e24001f2a7be4",
"grandparentHero": "<string>",
"grandparentKey": "<string>",
"grandparentRatingKey": "<string>",
"grandparentTheme": "<string>",
"grandparentThumb": "<string>",
"grandparentTitle": "<string>",
"guid": "plex://movie/5d7768ba96b655001fdc0408",
"Guid": [
{
"id": {
"imdbExample": {
"summary": "IMDB example",
"value": "imdb://tt13015952"
},
"tmdbExample": {
"summary": "TMDB example",
"value": "tmdb://2434012"
},
"tvdbExample": {
"summary": "TVDB example",
"value": "tvdb://7945991"
}
}
}
],
"hero": "<string>",
"Image": [
{
"type": "background",
"alt": "<string>",
"url": "<string>"
}
],
"index": 123,
"lastViewedAt": 1556281940,
"leafCount": 123,
"Media": [
{
"id": 1,
"aspectRatio": 2.35,
"audioChannels": 2,
"audioCodec": "aac",
"audioProfile": "lc",
"bitrate": 5612,
"container": "mov",
"duration": 150192,
"has64bitOffsets": false,
"hasVoiceActivity": true,
"height": 544,
"optimizedForStreaming": false,
"Part": [
{
"id": 1,
"key": "/library/parts/1/1531779263/file.mov",
"accessible": true,
"audioProfile": "lc",
"container": "mov",
"duration": 150192,
"exists": true,
"file": "/home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov",
"has64bitOffsets": false,
"indexes": "sd",
"optimizedForStreaming": false,
"size": 105355654,
"Stream": [
{
"codec": "hevc",
"displayTitle": "4K DoVi/HDR10 (HEVC Main 10)",
"id": 1002625,
"key": "/library/streams/216389",
"streamType": 1,
"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,
"colorPrimaries": "bt2020",
"colorRange": "tv",
"colorSpace": "bt2020nc",
"colorTrc": "smpte2084",
"extendedDisplayTitle": "4K DoVi/HDR10 (HEVC Main 10)",
"frameRate": 23.976,
"hasScalingMatrix": false,
"height": 1602,
"index": 0,
"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": "2022-12-14",
"originalTitle": "<string>",
"parentGuid": "plex://show/5d9c081b170e24001f2a7be4",
"parentHero": "<string>",
"parentIndex": 123,
"parentKey": "<string>",
"parentRatingKey": "<string>",
"parentThumb": "<string>",
"parentTitle": "<string>",
"primaryExtraKey": "<string>",
"prompt": "<string>",
"rating": 5,
"Rating": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"ratingCount": 123,
"ratingImage": "<string>",
"ratingKey": "<string>",
"Role": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"search": true,
"secondary": true,
"skipChildren": true,
"skipParent": true,
"Sort": [
{
"title": "<string>",
"type": "<string>",
"art": "<string>",
"content": true,
"filter": "<string>",
"hasPrefs": true,
"hasStoreServices": true,
"hubKey": "<string>",
"identifier": "<string>",
"key": "<string>",
"lastAccessedAt": 123,
"Pivot": [
{
"title": "<string>",
"type": "<string>",
"context": "<string>",
"id": "<string>",
"key": "<string>",
"symbol": "<string>"
}
],
"share": 123,
"thumb": "<string>",
"titleBar": "<string>",
"default": "asc",
"defaultDirection": "asc",
"descKey": "<string>",
"firstCharacterKey": "<string>"
}
],
"studio": "<string>",
"subtype": "<string>",
"summary": "<string>",
"tagline": "<string>",
"theme": "/library/metadata/1/theme/1705636920",
"thumb": "/library/metadata/58683/thumb/1703239236",
"titleSort": "<string>",
"updatedAt": 123,
"userRating": 5,
"viewCount": 123,
"viewedLeafCount": 123,
"viewOffset": 123,
"Writer": [
{
"tag": "Shaun Lawton",
"confidence": 123,
"context": "<string>",
"filter": "actor=49",
"id": 123,
"ratingKey": "58683",
"role": "Secretary",
"tagKey": "5d3ee12c4cde6a001c3e0b27",
"tagType": 123,
"thumb": "http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg"
}
],
"year": 123
}
]
}
}The token which identifies the user accessing the PMS. This can be either:
JWT tokens provide better security with:
Indicates the client accepts the indicated media types
application/json, application/xml An opaque identifier unique to the client
"abc123"
The name of the client product
"Plex for Roku"
The version of the client application
"2.4.1"
The platform of the client
"Roku"
The version of the platform
"4.3 build 1057"
A relatively friendly name for the client device
"Roku 3"
A potentially less friendly identifier for the device model
"4200X"
The device vendor
"Roku"
A friendly name for the client
"Living Room TV"
The marketplace on which the client application is distributed
"googlePlay"
The type of media to retrieve or filter by.
1 = movie 2 = show 3 = season 4 = episode 5 = artist 6 = album 7 = track 8 = photo_album 9 = photo
E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries
1, 2, 3, 4, 5, 6, 7, 8, 9 2
Whether or not to include full metadata on a positive match. When set, and the best match exceeds a score threshold of 85, metadata as rich as possible is sent back.
0, 1 1
Whether or not to include metadata for the item's ancestor (e.g. show and season data for an episode).
0, 1 1
Whether or not to return all sources for each metadata field, which results in a different structure being passed back.
0, 1 1
Used for movies, shows, artists, albums, and tracks. Allowed for various URI schemes, to be defined.
The title to filter by or assign
Used for movies shows, and albums. Optional.
Used for movies, episodes, and tracks. The full path to the media file, used for "cloud-scanning" an item.
Used for episodes and tracks. The title of the show/artist. Required if path isn't passed.
Used for episodes. The year of the show.
Used for episodes and tracks. The season/album number.
Used for episodes and tracks. The episode/tracks number in the season/album.
Used for episodes. In the format YYYY-MM-DD.
Used for albums and tracks. The artist name for albums or the album name for tracks.
OK
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.
Show child attributes
Was this page helpful?