diff --git a/src/models/media-container/search-result/directory/count.yaml b/src/models/media-container/search-result/directory/count.yaml new file mode 100644 index 00000000..5a067d72 --- /dev/null +++ b/src/models/media-container/search-result/directory/count.yaml @@ -0,0 +1,6 @@ +type: object +properties: + count: + description: "The number of items associated with this search result." + type: integer + example: 10 \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/filter.yaml b/src/models/media-container/search-result/directory/filter.yaml new file mode 100644 index 00000000..af4b00f6 --- /dev/null +++ b/src/models/media-container/search-result/directory/filter.yaml @@ -0,0 +1,6 @@ +type: object +properties: + filter: + description: "The filter string used to query this specific item in the library." + type: string + example: "actor=197429" \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/id.yaml b/src/models/media-container/search-result/directory/id.yaml new file mode 100644 index 00000000..1a54db4e --- /dev/null +++ b/src/models/media-container/search-result/directory/id.yaml @@ -0,0 +1,5 @@ +type: object +properties: + id: + type: integer + example: 197429 \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/key.yaml b/src/models/media-container/search-result/directory/key.yaml new file mode 100644 index 00000000..c5aac312 --- /dev/null +++ b/src/models/media-container/search-result/directory/key.yaml @@ -0,0 +1,6 @@ +type: object +properties: + key: + description: "The unique identifier path for the search result item." + type: string + example: "/library/sections/3/all?actor=197429" \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/library-section-id.yaml b/src/models/media-container/search-result/directory/library-section-id.yaml new file mode 100644 index 00000000..959e754a --- /dev/null +++ b/src/models/media-container/search-result/directory/library-section-id.yaml @@ -0,0 +1,6 @@ +type: object +properties: + librarySectionID: + description: "The unique identifier of the library section containing this item." + type: integer + example: 3 \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/library-section-key.yaml b/src/models/media-container/search-result/directory/library-section-key.yaml new file mode 100644 index 00000000..65ca8d0b --- /dev/null +++ b/src/models/media-container/search-result/directory/library-section-key.yaml @@ -0,0 +1,6 @@ +type: object +properties: + librarySectionKey: + description: "The path to access the library section containing this item." + type: string + example: "/library/sections/3" \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/library-section-title.yaml b/src/models/media-container/search-result/directory/library-section-title.yaml new file mode 100644 index 00000000..3c78e3ad --- /dev/null +++ b/src/models/media-container/search-result/directory/library-section-title.yaml @@ -0,0 +1,5 @@ +type: object +properties: + librarySectionTitle: + type: string + example: "Movies" \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/library-section-type.yaml b/src/models/media-container/search-result/directory/library-section-type.yaml new file mode 100644 index 00000000..2037c7dd --- /dev/null +++ b/src/models/media-container/search-result/directory/library-section-type.yaml @@ -0,0 +1,9 @@ +type: object +properties: + librarySectionType: + type: integer + oneOf: + - const: 1 + title: Movie + - const: 2 + title: TV Show \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/tag-key.yaml b/src/models/media-container/search-result/directory/tag-key.yaml new file mode 100644 index 00000000..968d5243 --- /dev/null +++ b/src/models/media-container/search-result/directory/tag-key.yaml @@ -0,0 +1,6 @@ +type: object +properties: + tagKey: + description: "The unique identifier for the tag associated with this search result." + type: string + example: "5d776826999c64001ec2c606" \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/tag-type.yaml b/src/models/media-container/search-result/directory/tag-type.yaml new file mode 100644 index 00000000..906ee757 --- /dev/null +++ b/src/models/media-container/search-result/directory/tag-type.yaml @@ -0,0 +1,10 @@ +type: object +properties: + tagType: + description: "The type of tag associated with this search result (e.g., Director, Actor)." + type: integer + oneOf: + - const: 4 + title: Director + - const: 6 + title: Actor \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/tag.yaml b/src/models/media-container/search-result/directory/tag.yaml new file mode 100644 index 00000000..10782979 --- /dev/null +++ b/src/models/media-container/search-result/directory/tag.yaml @@ -0,0 +1,5 @@ +type: object +properties: + tag: + type: string + example: "Ben Stiller" diff --git a/src/models/media-container/search-result/directory/thumb.yaml b/src/models/media-container/search-result/directory/thumb.yaml new file mode 100644 index 00000000..b7973700 --- /dev/null +++ b/src/models/media-container/search-result/directory/thumb.yaml @@ -0,0 +1,7 @@ +type: object +properties: + thumb: + description: "The URL to the thumbnail image associated with this search result." + type: string + format: uri + example: "https://metadata-static.plex.tv/5/people/57bd7c7d6c5c9e2881251b30e5603d3d.jpg" \ No newline at end of file diff --git a/src/models/media-container/search-result/directory/type.yaml b/src/models/media-container/search-result/directory/type.yaml new file mode 100644 index 00000000..8aeb4988 --- /dev/null +++ b/src/models/media-container/search-result/directory/type.yaml @@ -0,0 +1,6 @@ +type: object +properties: + type: + description: "The type of the directory." + type: string + example: tag diff --git a/src/models/media-container/search-result/score.yaml b/src/models/media-container/search-result/score.yaml new file mode 100644 index 00000000..85dcd9fe --- /dev/null +++ b/src/models/media-container/search-result/score.yaml @@ -0,0 +1,7 @@ +type: object +properties: + score: + description: "The score of the search result, typically a float value between 0 and 1." + type: number + format: float + example: 0.92 diff --git a/src/models/media/video-frame-rate.yaml b/src/models/media/video-frame-rate.yaml index abee471d..ef541859 100644 --- a/src/models/media/video-frame-rate.yaml +++ b/src/models/media/video-frame-rate.yaml @@ -1,6 +1,4 @@ type: object -required: - - videoFrameRate properties: videoFrameRate: type: string diff --git a/src/models/media/video-profile.yaml b/src/models/media/video-profile.yaml index 1d88ec53..60b5dc9a 100644 --- a/src/models/media/video-profile.yaml +++ b/src/models/media/video-profile.yaml @@ -1,6 +1,4 @@ type: object -required: - - videoProfile properties: videoProfile: type: string diff --git a/src/paths/library/get-search-all-libraries.yaml b/src/paths/library/get-search-all-libraries.yaml index 0d3e9cee..cde02afd 100644 --- a/src/paths/library/get-search-all-libraries.yaml +++ b/src/paths/library/get-search-all-libraries.yaml @@ -56,26 +56,209 @@ get: - MediaContainer properties: MediaContainer: - type: object - required: - - size - - SearchResult - properties: - size: - type: number - SearchResult: - type: array - items: - type: object - required: - - score - - Metadata - properties: - score: - type: number - format: float # This is correct for 32-bit floating-point numbers - Metadata: - $ref: "../../models/MetaData.yaml" + allOf: + - $ref: "../../models/media-container/size.yaml" + - $ref: "../../models/media-container/allow-sync.yaml" + - $ref: "../../models/media-container/identifier.yaml" + - $ref: "../../models/media-container/library-section-id.yaml" + - $ref: "../../models/media-container/library-section-title.yaml" + - $ref: "../../models/media-container/library-section-uuid.yaml" + - $ref: "../../models/media-container/media-tag-prefix.yaml" + - $ref: "../../models/media-container/media-tag-version.yaml" + - type: object + required: + - SearchResult + properties: + SearchResult: + type: array + items: + allOf: + - type: object + required: + - score + - $ref: "../../models/media-container/search-result/score.yaml" + - type: object + properties: + Directory: + allOf: + - type: object + required: + - key + - librarySectionID + - librarySectionKey + - librarySectionTitle + - type + - id + - tag + - $ref: "../../models/media-container/search-result/directory/key.yaml" + - $ref: "../../models/meta-data/library-section-id.yaml" + - $ref: "../../models/meta-data/library-section-key.yaml" + - $ref: "../../models/meta-data/library-section-title.yaml" + - $ref: "../../models/media-container/search-result/directory/library-section-type.yaml" + - $ref: "../../models/media-container/search-result/directory/type.yaml" + - $ref: "../../models/media-container/search-result/directory/id.yaml" + - $ref: "../../models/media-container/search-result/directory/filter.yaml" + - $ref: "../../models/media-container/search-result/directory/tag.yaml" + - $ref: "../../models/media-container/search-result/directory/tag-type.yaml" + - $ref: "../../models/media-container/search-result/directory/tag-key.yaml" + - $ref: "../../models/media-container/search-result/directory/thumb.yaml" + - $ref: "../../models/media-container/search-result/directory/count.yaml" + Metadata: + type: object + allOf: + - $ref: "../../models/meta-data/rating-key.yaml" + - $ref: "../../models/meta-data/key.yaml" + - $ref: "../../models/meta-data/guid.yaml" + - $ref: "../../models/meta-data/slug.yaml" + - $ref: "../../models/meta-data/studio.yaml" + - $ref: "../../models/meta-data/type.yaml" + - $ref: "../../models/meta-data/title.yaml" + - $ref: "../../models/meta-data/banner.yaml" + - $ref: "../../models/meta-data/title-sort.yaml" + - $ref: "../../models/meta-data/content-rating.yaml" + - $ref: "../../models/meta-data/summary.yaml" + - $ref: "../../models/meta-data/rating.yaml" + - $ref: "../../models/meta-data/audience-rating.yaml" + - $ref: "../../models/meta-data/year.yaml" + - $ref: "../../models/meta-data/tagline.yaml" + - $ref: "../../models/meta-data/thumb.yaml" + - $ref: "../../models/meta-data/art.yaml" + - $ref: "../../models/meta-data/theme.yaml" + - $ref: "../../models/meta-data/index.yaml" + - $ref: "../../models/meta-data/leaf-count.yaml" + - $ref: "../../models/meta-data/viewed-leaf-count.yaml" + - $ref: "../../models/meta-data/child-count.yaml" + - $ref: "../../models/meta-data/season-count.yaml" + - $ref: "../../models/meta-data/duration.yaml" + - $ref: "../../models/meta-data/originally-available-at.yaml" + - $ref: "../../models/meta-data/added-at.yaml" + - $ref: "../../models/meta-data/updated-at.yaml" + - $ref: "../../models/meta-data/parent-year.yaml" + - $ref: "../../models/meta-data/audience-rating-image.yaml" + - $ref: "../../models/meta-data/chapter-source.yaml" + - $ref: "../../models/meta-data/primary-extra-key.yaml" + - $ref: "../../models/meta-data/original-title.yaml" + - $ref: "../../models/meta-data/parent-rating-key.yaml" + - $ref: "../../models/meta-data/grandparent-rating-key.yaml" + - $ref: "../../models/meta-data/parent-guid.yaml" + - $ref: "../../models/meta-data/grandparent-guid.yaml" + - $ref: "../../models/meta-data/grandparent-slug.yaml" + - $ref: "../../models/meta-data/grandparent-key.yaml" + - $ref: "../../models/meta-data/parent-key.yaml" + - $ref: "../../models/meta-data/grandparent-title.yaml" + - $ref: "../../models/meta-data/grandparent-thumb.yaml" + - $ref: "../../models/meta-data/grandparent-theme.yaml" + - $ref: "../../models/meta-data/grandparent-art.yaml" + - $ref: "../../models/meta-data/parent-title.yaml" + - $ref: "../../models/meta-data/parent-index.yaml" + - $ref: "../../models/meta-data/parent-thumb.yaml" + - $ref: "../../models/meta-data/rating-image.yaml" + - $ref: "../../models/meta-data/view-count.yaml" + - $ref: "../../models/meta-data/view-offset.yaml" + - $ref: "../../models/meta-data/skip-count.yaml" + - $ref: "../../models/meta-data/subtype.yaml" + - $ref: "../../models/meta-data/last-rated-at.yaml" + - $ref: "../../models/meta-data/created-at-accuracy.yaml" + - $ref: "../../models/meta-data/created-at-tz-offset.yaml" + - $ref: "../../models/meta-data/last-viewed-at.yaml" + - $ref: "../../models/meta-data/user-rating.yaml" + - $ref: "../../models/meta-data/objects/image.yaml" + - $ref: "../../models/meta-data/objects/ultra-blur-colors.yaml" + - $ref: "../../models/meta-data/guid/guid-array.yaml" + - $ref: "../../models/meta-data/library-section-id.yaml" + - $ref: "../../models/meta-data/library-section-title.yaml" + - $ref: "../../models/meta-data/library-section-key.yaml" + - $ref: "../../models/meta-data/show-ordering.yaml" + - $ref: "../../models/meta-data/flatten-seasons.yaml" + - $ref: "../../models/meta-data/skip-children.yaml" + - type: object + properties: + Media: + type: array + items: + allOf: + - $ref: "../../models/media/id.yaml" + - $ref: "../../models/media/duration.yaml" + - $ref: "../../models/media/bitrate.yaml" + - $ref: "../../models/media/width.yaml" + - $ref: "../../models/media/height.yaml" + - $ref: "../../models/media/aspect-ratio.yaml" + - $ref: "../../models/media/audio-channels.yaml" + - $ref: "../../models/media/display-offset.yaml" + - $ref: "../../models/media/audio-codec.yaml" + - $ref: "../../models/media/video-codec.yaml" + - $ref: "../../models/media/video-resolution.yaml" + - $ref: "../../models/media/container.yaml" + - $ref: "../../models/media/video-frame-rate.yaml" + - $ref: "../../models/media/video-profile.yaml" + - $ref: "../../models/media/has-voice-activity.yaml" + - $ref: "../../models/media/audio-profile.yaml" + - $ref: "../../models/media/optimized-for-streaming.yaml" + - $ref: "../../models/media/has-64bit-offsets.yaml" + - type: object + properties: + Part: + type: array + items: + allOf: + - $ref: "../../models/media/part/accessible.yaml" + - $ref: "../../models/media/part/exists.yaml" + - $ref: "../../models/media/part/id.yaml" + - $ref: "../../models/media/part/key.yaml" + - $ref: "../../models/media/part/indexes.yaml" + - $ref: "../../models/media/part/duration.yaml" + - $ref: "../../models/media/part/file.yaml" + - $ref: "../../models/media/part/size.yaml" + - $ref: "../../models/media/part/packet-length.yaml" + - $ref: "../../models/media/part/container.yaml" + - $ref: "../../models/media/part/video-profile.yaml" + - $ref: "../../models/media/part/audio-profile.yaml" + - $ref: "../../models/media/part/has-64bit-offsets.yaml" + - $ref: "../../models/media/part/optimized-for-streaming.yaml" + - $ref: "../../models/media/part/has-thumbnail.yaml" + Genre: + type: array + items: + allOf: + - $ref: "../../models/genre/id.yaml" + - $ref: "../../models/genre/tag.yaml" + Country: + type: array + items: + allOf: + - $ref: "../../models/country/id.yaml" + - $ref: "../../models/country/tag.yaml" + Director: + type: array + items: + allOf: + - $ref: "../../models/director/id.yaml" + - $ref: "../../models/director/tag.yaml" + - $ref: "../../models/director/thumb.yaml" + Writer: + type: array + items: + allOf: + - $ref: "../../models/writer/id.yaml" + - $ref: "../../models/writer/tag.yaml" + - $ref: "../../models/writer/thumb.yaml" + Role: + type: array + items: + allOf: + - $ref: "../../models/role/id.yaml" + - $ref: "../../models/role/tag.yaml" + - $ref: "../../models/role/role.yaml" + - $ref: "../../models/role/thumb.yaml" + Location: + type: array + items: + allOf: + - type: object + required: + - path + - $ref: "../../models/meta-data/location/path.yaml" + "400": $ref: "../../responses/400.yaml" "401": diff --git a/src/paths/library/sections/[sectionKey]/get-library-items.yaml b/src/paths/library/sections/[sectionKey]/get-library-items.yaml index 1c788014..355ae369 100644 --- a/src/paths/library/sections/[sectionKey]/get-library-items.yaml +++ b/src/paths/library/sections/[sectionKey]/get-library-items.yaml @@ -303,14 +303,11 @@ get: Location: type: array items: - type: object - required: - - path - properties: - path: - type: string - description: "The file path for the location." - example: "/TV Shows/Better Call Saul" + allOf: + - type: object + required: + - path + - $ref: "../../../../models/meta-data/location/path.yaml" Chapter: type: array items: diff --git a/tests/paths/library/get-search-library.spec.ts b/tests/paths/library/get-search-library.spec.ts index 90831baa..5ef95dd0 100644 --- a/tests/paths/library/get-search-library.spec.ts +++ b/tests/paths/library/get-search-library.spec.ts @@ -35301,4 +35301,73 @@ describe("GET /library/search", () => { validateResponseSpec("/library/search", "get", 200, response) }) + + it("SAMPLE #4 - should validate the 200 response when the API spec is valid", () => { + const response = { + MediaContainer: { + size: 3, + SearchResult: [ + { + score: 0.92, + Directory: { + key: "/library/sections/3/all?actor=197429", + librarySectionID: 3, + librarySectionKey: "/library/sections/3", + librarySectionTitle: "Movies", + librarySectionType: 1, + type: "tag", + id: 197429, + filter: "actor=197429", + tag: "Ben Stiller", + tagType: 6, + tagKey: "5d776826999c64001ec2c606", + thumb: + "https://metadata-static.plex.tv/5/people/57bd7c7d6c5c9e2881251b30e5603d3d.jpg", + count: 10 + } + }, + { + score: 0.92, + Directory: { + key: "/library/sections/1/all?actor=197429", + librarySectionID: 1, + librarySectionKey: "/library/sections/1", + librarySectionTitle: "TV Shows", + librarySectionType: 2, + type: "tag", + id: 197429, + filter: "actor=197429", + tag: "Ben Stiller", + tagType: 6, + tagKey: "5d776826999c64001ec2c606", + thumb: + "https://metadata-static.plex.tv/5/people/57bd7c7d6c5c9e2881251b30e5603d3d.jpg", + count: 4 + } + }, + { + score: 0.92, + Directory: { + key: "/library/sections/3/all?director=227480", + librarySectionID: 3, + librarySectionKey: "/library/sections/3", + librarySectionTitle: "Movies", + librarySectionType: 1, + type: "tag", + id: 227480, + filter: "director=227480", + tag: "Ben Stiller", + tagType: 4, + tagKey: "5d776826999c64001ec2c606", + thumb: + "https://metadata-static.plex.tv/5/people/57bd7c7d6c5c9e2881251b30e5603d3d.jpg", + count: 1 + } + } + ] + } + } + + validateResponseSpec("/library/search", "get", 200, response) + }) })