From 881c5eaae2713ba502bd1cd542ab308406631a77 Mon Sep 17 00:00:00 2001 From: seferturan Date: Fri, 13 Feb 2026 17:14:10 +0100 Subject: [PATCH 1/2] feat(media): adds support for media end points Fixes https://github.com/trakt/trakt-api/issues/716 --- commitlint.config.js | 1 + projects/api/src/contracts/media/index.ts | 46 +++++++++++++++++++ .../mediaAnticipatedResponseSchema.ts | 9 ++++ .../response/mediaPopularResponseSchema.ts | 8 ++++ .../response/mediaTrendingResponseSchema.ts | 9 ++++ projects/api/src/contracts/traktContract.ts | 2 + projects/api/src/index.ts | 1 + 7 files changed, 76 insertions(+) create mode 100644 projects/api/src/contracts/media/index.ts create mode 100644 projects/api/src/contracts/media/schema/response/mediaAnticipatedResponseSchema.ts create mode 100644 projects/api/src/contracts/media/schema/response/mediaPopularResponseSchema.ts create mode 100644 projects/api/src/contracts/media/schema/response/mediaTrendingResponseSchema.ts diff --git a/commitlint.config.js b/commitlint.config.js index e120cf34..c22c5c40 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -45,6 +45,7 @@ module.exports = { 'layout', 'link', 'list', + 'media', 'movie', 'oauth', 'person', diff --git a/projects/api/src/contracts/media/index.ts b/projects/api/src/contracts/media/index.ts new file mode 100644 index 00000000..74fe4f3a --- /dev/null +++ b/projects/api/src/contracts/media/index.ts @@ -0,0 +1,46 @@ +import { builder } from '../_internal/builder.ts'; +import { extendedMediaQuerySchema } from '../_internal/request/extendedMediaQuerySchema.ts'; +import { ignoreQuerySchema } from '../_internal/request/ignoreQuerySchema.ts'; +import { mediaFilterParamsSchema } from '../_internal/request/mediaFilterParamsSchema.ts'; +import { pageQuerySchema } from '../_internal/request/pageQuerySchema.ts'; +import { mediaAnticipatedResponseSchema } from './schema/response/mediaAnticipatedResponseSchema.ts'; +import { mediaPopularResponseSchema } from './schema/response/mediaPopularResponseSchema.ts'; +import { mediaTrendingResponseSchema } from './schema/response/mediaTrendingResponseSchema.ts'; + +export const media = builder.router({ + trending: { + path: '/trending', + method: 'GET', + query: extendedMediaQuerySchema + .merge(mediaFilterParamsSchema) + .merge(pageQuerySchema) + .merge(ignoreQuerySchema), + responses: { + 200: mediaTrendingResponseSchema.array(), + }, + }, + anticipated: { + path: '/anticipated', + method: 'GET', + query: extendedMediaQuerySchema + .merge(mediaFilterParamsSchema) + .merge(pageQuerySchema) + .merge(ignoreQuerySchema), + responses: { + 200: mediaAnticipatedResponseSchema.array(), + }, + }, + popular: { + path: '/popular', + method: 'GET', + query: extendedMediaQuerySchema + .merge(mediaFilterParamsSchema) + .merge(pageQuerySchema) + .merge(ignoreQuerySchema), + responses: { + 200: mediaPopularResponseSchema.array(), + }, + }, +}, { + pathPrefix: '/media', +}); diff --git a/projects/api/src/contracts/media/schema/response/mediaAnticipatedResponseSchema.ts b/projects/api/src/contracts/media/schema/response/mediaAnticipatedResponseSchema.ts new file mode 100644 index 00000000..39a9223e --- /dev/null +++ b/projects/api/src/contracts/media/schema/response/mediaAnticipatedResponseSchema.ts @@ -0,0 +1,9 @@ +import { z } from '../../../_internal/z.ts'; +import { movieResponseSchema } from '../../../movies/index.ts'; +import { showResponseSchema } from '../../../shows/index.ts'; + +export const mediaAnticipatedResponseSchema = z.object({ + list_count: z.number().int(), + movie: movieResponseSchema.nullish(), + show: showResponseSchema.nullish(), +}); diff --git a/projects/api/src/contracts/media/schema/response/mediaPopularResponseSchema.ts b/projects/api/src/contracts/media/schema/response/mediaPopularResponseSchema.ts new file mode 100644 index 00000000..f08d7d2e --- /dev/null +++ b/projects/api/src/contracts/media/schema/response/mediaPopularResponseSchema.ts @@ -0,0 +1,8 @@ +import { z } from '../../../_internal/z.ts'; +import { movieResponseSchema } from '../../../movies/index.ts'; +import { showResponseSchema } from '../../../shows/index.ts'; + +export const mediaPopularResponseSchema = z.union([ + movieResponseSchema, + showResponseSchema, +]); diff --git a/projects/api/src/contracts/media/schema/response/mediaTrendingResponseSchema.ts b/projects/api/src/contracts/media/schema/response/mediaTrendingResponseSchema.ts new file mode 100644 index 00000000..66e9bed8 --- /dev/null +++ b/projects/api/src/contracts/media/schema/response/mediaTrendingResponseSchema.ts @@ -0,0 +1,9 @@ +import { z } from '../../../_internal/z.ts'; +import { movieResponseSchema } from '../../../movies/index.ts'; +import { showResponseSchema } from '../../../shows/index.ts'; + +export const mediaTrendingResponseSchema = z.object({ + watchers: z.number().int(), + movie: movieResponseSchema.nullish(), + show: showResponseSchema.nullish(), +}); diff --git a/projects/api/src/contracts/traktContract.ts b/projects/api/src/contracts/traktContract.ts index 35f1da80..b1ea1aa6 100644 --- a/projects/api/src/contracts/traktContract.ts +++ b/projects/api/src/contracts/traktContract.ts @@ -5,6 +5,7 @@ import { checkin } from './checkin/index.ts'; import { comments } from './comments/index.ts'; import { episodes } from './episodes/index.ts'; import { lists } from './lists/index.ts'; +import { media } from './media/index.ts'; import { movies } from './movies/index.ts'; import { oauth } from './oauth/index.ts'; import { people } from './people/index.ts'; @@ -27,6 +28,7 @@ export const traktContract = builder sync, recommendations, social_recommendations, + media, movies, shows, search, diff --git a/projects/api/src/index.ts b/projects/api/src/index.ts index 88f3be98..0760e79e 100644 --- a/projects/api/src/index.ts +++ b/projects/api/src/index.ts @@ -8,6 +8,7 @@ export * from './contracts/checkin/index.ts'; export * from './contracts/comments/index.ts'; export * from './contracts/enums/index.ts'; export * from './contracts/lists/index.ts'; +export * from './contracts/media/index.ts'; export * from './contracts/models/index.ts'; export * from './contracts/movies/index.ts'; export * from './contracts/oauth/index.ts'; From a1ee0f59a6a20b59a2f017909710cdb5ec88184a Mon Sep 17 00:00:00 2001 From: seferturan Date: Fri, 13 Feb 2026 17:14:31 +0100 Subject: [PATCH 2/2] chore: bump version to 0.3.9 --- projects/api/deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/api/deno.json b/projects/api/deno.json index 8d7eafe1..5131cdc4 100644 --- a/projects/api/deno.json +++ b/projects/api/deno.json @@ -1,7 +1,7 @@ { "name": "@trakt/api", "exports": "./src/index.ts", - "version": "0.3.8", + "version": "0.3.9", "imports": { "@anatine/zod-openapi": "npm:@anatine/zod-openapi@^2.2.6", "@std/testing": "jsr:@std/testing@^1.0.5",