diff --git a/.dockerignore b/.dockerignore index e81f3a6..c197e60 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,4 @@ node_modules -.next .git .gitignore *.md @@ -7,10 +6,10 @@ node_modules *.db-* .env .env.* -!.env.example -data .DS_Store -.vercel +data coverage .vscode .idea +.turbo +.tanstack diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 64ea74a..48bcbff 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -41,7 +41,7 @@ jobs: - name: Get app version id: version - run: echo "version=$(jq -r .version package.json)" >> "$GITHUB_OUTPUT" + run: echo "version=$(jq -r .version apps/web/package.json)" >> "$GITHUB_OUTPUT" - name: Docker metadata id: meta diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0d7c711..bd95614 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,11 +18,11 @@ jobs: - name: Install dependencies run: bun install --frozen-lockfile - - name: Run tests with coverage - run: bun test --coverage --coverage-reporter=lcov + - name: Lint + run: bunx turbo run lint - # - name: Upload to Codecov - # uses: codecov/codecov-action@v3 - # with: - # file: ./coverage/lcov.info - # fail_ci_if_error: true + - name: Type check + run: bunx turbo run check-types + + - name: Run tests + run: bunx turbo run test -- --coverage --coverage-reporter=lcov diff --git a/.gitignore b/.gitignore index 2a4f035..f246a0e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,47 +1,56 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. -# dependencies -/node_modules -/.pnp -.pnp.* -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/versions +# Dependencies +node_modules +.pnp +.pnp.js -# testing -/coverage +# Build outputs +dist +build +*.tsbuildinfo +.tanstack -# next.js -/.next/ -/out/ +# Environment variables +.env +.env*.local +!.env.example -# production -/build -/data - -# misc +# IDEs and editors +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.idea +*.swp +*.swo +*~ .DS_Store -*.pem -# sqlite -*.db -*.db-* - -# debug +# Logs +logs +*.log npm-debug.log* yarn-debug.log* yarn-error.log* +lerna-debug.log* .pnpm-debug.log* -# env files (can opt-in for committing if needed) -.env* -!.env.example +# Turbo +.turbo -# vercel -.vercel +# Testing +coverage +.nyc_output -# typescript -*.tsbuildinfo -next-env.d.ts +# Misc +*.tgz +.cache +tmp +temp + +# local data +*.db +*.db-* +/data diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..17a9ff2 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "biomejs.biome", + "bradlc.vscode-tailwindcss", + "vitest.explorer", + "vercel.turbo-vsc" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..71c928b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,41 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "editor.defaultFormatter": "biomejs.biome", + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.codeActionsOnSave": { + "source.fixAll.biome": "explicit", + "source.organizeImports.biome": "explicit" + }, + "files.readonlyInclude": { + "**/routeTree.gen.ts": true + }, + "files.watcherExclude": { + "**/routeTree.gen.ts": true + }, + "search.exclude": { + "**/routeTree.gen.ts": true + }, + "emmet.showExpandedAbbreviation": "never", + "[javascript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescript]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[json]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[jsonc]": { + "editor.defaultFormatter": "biomejs.biome" + }, + "[css]": { + "editor.defaultFormatter": "biomejs.biome" + } +} diff --git a/CLAUDE.md b/CLAUDE.md index 9487df0..6d4fe56 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -5,14 +5,19 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Commands ```bash -bun run dev # Start Next.js dev server -bun run build # Production build +# Root commands (via Turborepo) +bun run dev # Start API server + Vite dev server +bun run build # Production build (both apps) bun run lint # Biome lint check bun run format # Biome format (auto-fix) -bun run db:push # Push schema changes to SQLite database -bun run db:generate # Generate Drizzle migration files -bun run db:migrate # Run Drizzle migrations -bun run db:studio # Open Drizzle Studio (visual DB browser) +bun run check-types # TypeScript type check +bun run test # Run tests + +# Database commands (run from packages/db/) +cd packages/db && bun run db:push # Push schema changes to SQLite database +cd packages/db && bun run db:generate # Generate Drizzle migration files +cd packages/db && bun run db:migrate # Run Drizzle migrations +cd packages/db && bun run db:studio # Open Drizzle Studio (visual DB browser) ``` IMPORTANT: Default to using Bun instead of Node.js: @@ -39,67 +44,113 @@ bun run test ## Architecture -**Sofa** is a self-hosted movie & TV tracking app (like Trakt/TVTime) built as a single Next.js 16 application with SQLite. +**Sofa** is a self-hosted movie & TV tracking app (like Trakt/TVTime) built as a Turborepo monorepo with a standalone Hono API server, a Vite + TanStack Router SPA frontend, and shared packages. + +### Monorepo structure + +``` +couch-potato/ +├── apps/ +│ ├── server/ # @sofa/server — Hono API server (oRPC, auth, cron, webhooks) +│ └── web/ # @sofa/web — Vite SPA (TanStack Router, TanStack Query) +├── packages/ +│ ├── api/ # @sofa/api — oRPC contract + Zod schemas (shared) +│ ├── auth/ # @sofa/auth — Better Auth server config +│ ├── core/ # @sofa/core — Business logic services +│ ├── db/ # @sofa/db — Database client, schema, migrations, constants, logger +│ └── tmdb/ # @sofa/tmdb — TMDB API client + image URL helper +├── turbo.json # Turborepo task configuration +├── biome.json # Shared Biome config +├── Dockerfile # Multi-stage Docker build (turbo prune, single process) +└── package.json # Root workspace config +``` + +- **`@sofa/server`** (`apps/server/`) — Hono API server. Hosts oRPC procedures, Better Auth, webhook/image/backup routes, and cron jobs. Runs DB migrations on startup. In production, also serves the SPA static files on port 3000. In dev, runs on port 3001. +- **`@sofa/web`** (`apps/web/`) — Vite SPA with TanStack Router (file-based routing). No SSR, no DB access, no services. All data fetched via oRPC client calls. Vite dev server proxies `/api/*` and `/rpc/*` to the API server. +- **`@sofa/api`** (`packages/api/`) — JIT package with the oRPC contract and Zod schemas. No build step. +- **`@sofa/db`** (`packages/db/`) — Database layer: Drizzle schema, client, migrations, constants, logger. +- **`@sofa/tmdb`** (`packages/tmdb/`) — TMDB API client (openapi-fetch) and image URL construction. +- **`@sofa/core`** (`packages/core/`) — All business logic services (metadata, tracking, discovery, etc.). +- **`@sofa/auth`** (`packages/auth/`) — Better Auth server config + environment checks. + +All shared packages are JIT (raw TypeScript exports, no build step). Consumers transpile via their own bundlers. ### Stack -- **Framework**: Next.js 16 (App Router), React 19, TypeScript +- **Frontend**: Vite 7 SPA, React 19, TypeScript, TanStack Router (file-based routing) +- **API Server**: Hono (standalone Bun server) +- **Monorepo**: Turborepo with Bun workspaces - **Database**: SQLite via bun:sqlite + Drizzle ORM (WAL mode, singleton via `globalThis`, sync queries, auto-migrations on startup) - **Auth**: Better Auth with Drizzle adapter — email/password + optional OIDC/SSO via `genericOAuth` plugin -- **Styling**: Tailwind CSS v4, shadcn components, dark cinema theme with warm primary accents -- **Fonts**: DM Serif Display (display), DM Sans (body), Geist Mono (mono) +- **Styling**: Tailwind CSS v4 (via `@tailwindcss/vite`), shadcn components, dark cinema theme with warm primary accents +- **Fonts**: DM Serif Display (display), DM Sans (body), Geist Mono (mono) — self-hosted via `@fontsource` - **API**: oRPC (contract-first, type-safe RPC) with `@orpc/tanstack-query` for TanStack Query integration - **State**: Jotai (client), TanStack Query (data fetching & mutations via oRPC) -- **Linting**: Biome (2-space indent, organized imports, React/Next.js recommended rules) +- **Linting**: Biome (2-space indent, organized imports, React recommended rules) - **External API**: TMDB (The Movie Database) with Bearer token auth -### Path alias +### Package imports -`@/*` maps to project root (`./`), e.g. `@/lib/db/client` → `./lib/db/client`. +Within `apps/web/`, `@/*` maps to `apps/web/src/`, e.g. `@/components/nav-bar` → `apps/web/src/components/nav-bar`. + +Cross-package imports use the package name: +- `@sofa/api/contract`, `@sofa/api/schemas` — Contract and types +- `@sofa/db/client`, `@sofa/db/schema`, `@sofa/db/constants`, `@sofa/db/logger` — Database layer +- `@sofa/tmdb/client`, `@sofa/tmdb/image` — TMDB client +- `@sofa/core/metadata`, `@sofa/core/tracking`, etc. — Business logic +- `@sofa/auth/server`, `@sofa/auth/config` — Auth config ### Key directories -- `lib/db/schema.ts` — Single file with all Drizzle table definitions (auth tables + app tables) -- `lib/db/migrate.ts` — Auto-migration runner (executed on startup via instrumentation) -- `lib/services/` — Business logic layer (metadata, tracking, discovery, availability, credits, person, webhooks, backup, settings, colors, update-check, system-health) -- `lib/tmdb/` — TMDB API client and TypeScript types -- `lib/auth/` — Better Auth server config (`server.ts`), client hooks (`client.ts`), cached session helper (`session.ts`) -- `lib/config.ts` — Server-side environment checks (TMDB configured, OIDC configured, etc.) -- `lib/logger.ts` — Structured logger with `LOG_LEVEL` support -- `lib/types/` — Shared TypeScript types (e.g. `title.ts`) -- `lib/cron.ts` — Background job scheduler (croner, `globalThis` singleton) -- `lib/query-client.ts` — Singleton `QueryClient` with default options (30s stale time) -- `lib/orpc/` — oRPC API layer (contract-first, type-safe RPC): - - `contract.ts` — Full API contract definition (~30 procedures) - - `schemas.ts` — Shared Zod input schemas used by contract - - `context.ts` — Context type & `os` implementer - - `middleware.ts` — Auth (`authed`) and admin (`admin`) middleware - - `router.ts` — Assembled router implementing the contract - - `handler.ts` — RPCHandler instance with error logging - - `client.ts` — Client-side oRPC client (RPCLink) - - `client.server.ts` — Server-side oRPC client (zero HTTP overhead for SSR) - - `tanstack.ts` — `orpc` utils for TanStack Query (`orpc.*.queryOptions()`) - - `procedures/` — Procedure implementations by domain (titles, episodes, seasons, people, dashboard, explore, search, discover, stats, status, integrations, admin, account, watchlist) -- `app/rpc/[[...rest]]/route.ts` — Next.js catch-all route handler for oRPC -- `app/api/` — Non-RPC routes (auth, images, avatars, backups, webhooks, lists, health) -- `app/(pages)/` — Authenticated pages (dashboard, explore, titles/[id], people/[id], settings) -- `app/(auth)/` — Auth pages (login, register, setup) +**API server** (`apps/server/src/`): +- `index.ts` — Hono app entry point, startup, CORS, route mounting, graceful shutdown +- `cron.ts` — Background job scheduler (croner) +- `orpc/` — oRPC server layer (context, middleware, router, handler, procedures/) +- `routes/` — Non-RPC Hono routes (auth, images, avatars, backups, webhooks, lists, health) + +**Web app** (`apps/web/src/`): +- `main.tsx` — React root: creates router + renders `` +- `routes/` — TanStack Router file-based routes (auto-generates `routeTree.gen.ts`) + - `__root.tsx` — Root layout (providers, head meta, global error/not-found) + - `_app.tsx` — Authenticated layout (auth guard via `beforeLoad`, navbar, shell) + - `_app/dashboard.tsx`, `_app/explore.tsx`, `_app/settings.tsx`, `_app/titles.$id.tsx`, `_app/people.$id.tsx` + - `_auth.tsx` — Auth layout (centering wrapper) + - `_auth/login.tsx`, `_auth/register.tsx` + - `index.tsx`, `setup.tsx` - `components/` — App components + `components/ui/` for shadcn primitives -- `components/query-provider.tsx` — `QueryClientProvider` wrapper used in root layout +- `lib/orpc/client.ts` — oRPC client (always same-origin via Vite proxy or Hono static serving) +- `lib/orpc/tanstack.ts` — `orpc` utils for TanStack Query +- `lib/auth/client.ts` — Better Auth client hooks +- `lib/theme.ts` — Color theme CSS properties from title palettes +- `styles/globals.css` — Tailwind + font imports + +**Shared packages**: +- `packages/api/src/contract.ts` — Full oRPC API contract definition (~30 procedures) +- `packages/api/src/schemas.ts` — Shared Zod schemas and inferred TypeScript types +- `packages/db/src/schema.ts` — All Drizzle table definitions +- `packages/db/drizzle/` — Migration files +- `packages/core/src/` — All service files (metadata, tracking, discovery, availability, credits, person, webhooks, backup, settings, colors, update-check, system-health, lists, image-cache) +- `packages/core/test/` — Service tests with in-memory SQLite ### Auth pattern -Server components and layouts use the cached session helper to avoid redundant lookups: +**Web app** — Route `beforeLoad` guards check session via Better Auth client SDK: ```typescript -import { getSession } from "@/lib/auth/session"; -const session = await getSession(); +// In route file (e.g. _app.tsx) +beforeLoad: async () => { + const { data: session } = await authClient.getSession(); + if (!session) throw redirect({ to: "/login" }); + return { session }; +}, ``` -oRPC procedures use auth middleware that calls Better Auth: +Session is available to child routes via `Route.useRouteContext()`. + +**API server** — oRPC procedures use auth middleware that calls Better Auth: ```typescript -// lib/orpc/middleware.ts — applied to procedures +// apps/server/src/orpc/middleware.ts export const authed = base.middleware(async ({ context, next }) => { const session = await auth.api.getSession({ headers: context.headers }); if (!session) throw new ORPCError("UNAUTHORIZED"); @@ -109,12 +160,18 @@ export const authed = base.middleware(async ({ context, next }) => { ### oRPC API layer -All API procedures use oRPC with a contract-first approach. The contract defines the API shape in `lib/orpc/contract.ts`, procedures implement it in `lib/orpc/procedures/`, and the client consumes it with full type safety. +All API procedures use oRPC with a contract-first approach. The contract is defined in `packages/api/src/contract.ts`, procedures implement it in `apps/server/src/orpc/procedures/`, and the client consumes it with full type safety. + +**Pattern — importing types from the shared package:** +```typescript +import type { ResolvedTitle, Season } from "@sofa/api/schemas"; +import { contract } from "@sofa/api/contract"; +``` **Pattern — query in component:** ```typescript import { useQuery } from "@tanstack/react-query"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; const { data } = useQuery(orpc.dashboard.stats.queryOptions()); ``` @@ -126,32 +183,36 @@ import { client } from "@/lib/orpc/client"; await client.titles.updateStatus({ id: titleId, status: "in_progress" }); ``` -**Pattern — procedure definition:** +**Pattern — route loader with TanStack Query prefetch:** ```typescript -// lib/orpc/procedures/dashboard.ts -export const stats = os.dashboard.stats.func(async (input, context, meta) => { - const { user } = context; - return getUserStats(user.id); -}, authed); +export const Route = createFileRoute("/_app/titles/$id")({ + loader: async ({ params, context }) => { + await context.queryClient.ensureQueryData( + orpc.titles.detail.queryOptions({ input: { id: params.id } }), + ); + }, + component: TitlePage, +}); ``` **Page patterns:** -- **Thin server shell** (titles, people): Server component fetches initial data via service layer, passes as `initialData` prop to client component that uses TanStack Query via `orpc` for refetching/mutations. -- **Full client-side** (dashboard, explore, settings): Server component handles auth only; client components fetch all data via `orpc.*.queryOptions()` with skeleton loading states. +- **Route loaders** (titles, people): `beforeLoad`/`loader` prefetch data into TanStack Query cache via `queryClient.ensureQueryData()`. Components read via `useQuery()`/`useSuspenseQuery()`. +- **Full client-side** (dashboard, explore, settings): Components fetch all data via `orpc.*.queryOptions()` with skeleton loading states. +- **Error/loading states**: Routes use `pendingComponent`, `errorComponent`, `notFoundComponent`. -### Non-RPC routes +### Non-RPC routes (API server) -Only file-serving, auth, and webhook routes remain as traditional Next.js API routes: -- `/api/auth/[...all]` — Better Auth catch-all -- `/api/images/[...path]` — Image proxy/cache serving -- `/api/avatars/[userId]` — Avatar file serving -- `/api/account/avatar` — Avatar upload (FormData) -- `/api/admin/backups/restore` — Backup restore (FormData upload) -- `/api/backup/[filename]` — Backup file download -- `/api/webhooks/[token]` — Plex/Jellyfin/Emby webhooks -- `/api/lists/[token]` — External list feeds +Hono route handlers in `apps/server/src/routes/`: +- `/images/:category/:filename` — Image proxy/cache serving +- `/api/auth/*` — Better Auth catch-all +- `/api/avatars/:userId` — Avatar file serving +- `/api/backup/:filename` — Backup file download +- `/api/webhooks/:token` — Plex/Jellyfin/Emby webhooks +- `/api/lists/:token` — External list feeds (Sonarr/Radarr) - `/api/health` — Simple health check (no auth) +In dev, Vite proxies these to the API server. In production, Hono serves both API and SPA — the browser only sees port 3000. + ### Database schema All app tables use UUIDv7 text primary keys generated via `Bun.randomUUIDv7()`. Better Auth tables use their own ID format. Key relationships: @@ -167,35 +228,31 @@ All app tables use UUIDv7 text primary keys generated via `Bun.randomUUIDv7()`. - `cronRuns` — Background job execution history - `appSettings` — Key-value store for runtime app configuration -### Service layer +### Service layer (`packages/core/src/`) - **metadata.ts**: `importTitle()` fetches from TMDB, inserts into DB, fire-and-forgets availability + recommendations + credits + image caching. `refreshTvChildren()` fetches all seasons/episodes with 250ms rate limiting. -- **image-cache.ts**: Downloads and caches TMDB images to local disk. `cacheImagesForTitle()` caches poster + backdrop, `cacheEpisodeStills()` caches episode stills, `cacheProviderLogos()` caches streaming provider logos, `cacheProfilePhotos()` caches person profile images. +- **image-cache.ts**: Downloads and caches TMDB images to local disk. - **tracking.ts**: Auto-transitions — logging a movie watch sets status to `completed`; logging an episode watch sets `in_progress`; all episodes watched auto-completes the series. -- **discovery.ts**: Feed generators — continue watching (next unwatched episode per in-progress show), library titles with availability, personalized recommendations from completed/highly-rated titles. +- **discovery.ts**: Feed generators — continue watching, library with availability, personalized recommendations. - **availability.ts**: Caches US streaming providers from TMDB watch/providers endpoint. -- **credits.ts**: Fetches and caches cast/crew data from TMDB, links persons to titles via `titleCast`. +- **credits.ts**: Fetches and caches cast/crew data from TMDB. - **person.ts**: Person detail and filmography lookups. -- **webhooks.ts**: Processes incoming Plex/Jellyfin/Emby webhook events to auto-log watches. -- **backup.ts**: Database backup/restore with configurable scheduled backups and retention pruning. -- **settings.ts**: Runtime app settings (registration open/closed, backup config, etc.) via `appSettings` table. +- **webhooks.ts**: Processes incoming Plex/Jellyfin/Emby webhook events. +- **backup.ts**: Database backup/restore with configurable scheduled backups. +- **settings.ts**: Runtime app settings via `appSettings` table. - **colors.ts**: Extracts dominant color palettes from title posters via node-vibrant. - **update-check.ts**: Checks for new Sofa releases. - **system-health.ts**: System health diagnostics. ### TMDB images -Only paths are stored in DB. Image URLs are resolved **server-side only** — API routes and server components call `tmdbImageUrl()` from `lib/tmdb/image.ts` before sending data to clients. Client components never import `tmdbImageUrl`; they receive ready-to-use URLs. +Only paths are stored in DB. Image URLs are resolved by the API server — `tmdbImageUrl()` from `@sofa/tmdb/image` is called before sending data to clients. Client components receive ready-to-use URLs. -When `IMAGE_CACHE_ENABLED` is set (default), images are downloaded to local disk (`CACHE_DIR`, derived from `DATA_DIR/images`) and served via `app/api/images/[...path]/route.ts`. Categories: `posters` (w500), `backdrops` (w1280), `stills` (w1280), `logos` (w92), `profiles` (w185). When disabled, `tmdbImageUrl()` returns direct TMDB CDN URLs using `TMDB_IMAGE_BASE_URL` (defaults to `https://image.tmdb.org/t/p`). - -Core files: `lib/services/image-cache.ts` (caching logic), `lib/tmdb/image.ts` (URL construction), `app/api/images/[...path]/route.ts` (proxy route). +When `IMAGE_CACHE_ENABLED` is set (default), images are downloaded to local disk and served via `/images/:category/:filename`. When disabled, `tmdbImageUrl()` returns direct TMDB CDN URLs. ### Background jobs -Defined in `lib/cron.ts` using croner cron expressions, started via Next.js instrumentation hook (`instrumentation.ts`) when `NEXT_RUNTIME === "nodejs"`. The instrumentation hook also runs DB migrations on startup and registers graceful shutdown handlers. - -Jobs (all use `protect: true` to prevent overlapping runs, 300ms delay between TMDB calls): +Defined in `apps/server/src/cron.ts` using croner, started when the API server boots. Jobs (all use `protect: true` to prevent overlapping runs, 300ms delay between TMDB calls): - `nightlyRefreshLibrary` (`0 3 * * *`) — refreshes stale library titles (7d) and non-library titles (30d) - `refreshAvailability` (`0 */6 * * *`) — streaming provider data - `refreshRecommendations` (`0 */12 * * *`) @@ -207,10 +264,14 @@ Jobs (all use `protect: true` to prevent overlapping runs, 300ms delay between T ### Environment variables -See `.env.example`: `DATA_DIR` (root for DB + cache, default `./data`), `TMDB_API_READ_ACCESS_TOKEN`, `BETTER_AUTH_SECRET`, `BETTER_AUTH_URL`. `DATABASE_URL` and `CACHE_DIR` are derived from `DATA_DIR` but can be overridden individually. +`DATA_DIR` (root for DB + cache, default `./data`), `TMDB_API_READ_ACCESS_TOKEN`, `BETTER_AUTH_SECRET`, `BETTER_AUTH_URL`. `DATABASE_URL` and `CACHE_DIR` are derived from `DATA_DIR` but can be overridden individually. Optional: `OIDC_CLIENT_ID`, `OIDC_CLIENT_SECRET`, `OIDC_ISSUER_URL`, `OIDC_PROVIDER_NAME`, `OIDC_AUTO_REGISTER`, `DISABLE_PASSWORD_LOGIN` (OIDC/SSO support). `LOG_LEVEL` (error/warn/info/debug, default: info). `IMAGE_CACHE_ENABLED` (default: true). +### Docker deployment + +Single container, single process. Hono serves both the API and the Vite-built SPA static files on port 3000. API routes (`/rpc/*`, `/api/*`) are mounted first; unmatched routes fall back to `index.html` for SPA routing. + ## Browser Automation Use `agent-browser` for web automation. Run `agent-browser --help` for all commands. diff --git a/Dockerfile b/Dockerfile index a9bf4c8..5519b31 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,62 +1,59 @@ # syntax=docker/dockerfile:1 FROM oven/bun:1-alpine AS base -# --- Dependencies --- +# --- Prune workspace for Docker layer caching --- +FROM base AS prepare +WORKDIR /app +RUN bun add -g turbo@^2 +COPY . . +RUN turbo prune @sofa/web @sofa/server --docker + +# --- Install dependencies (cached by package.json + lockfile only) --- FROM base AS deps WORKDIR /app - -COPY package.json bun.lock ./ - +COPY --from=prepare /app/out/json/ . RUN --mount=type=cache,target=/root/.bun/install/cache \ bun install --no-save --frozen-lockfile -# --- Builder --- +# --- Build --- FROM base AS builder WORKDIR /app - -COPY --from=deps /app/node_modules ./node_modules -COPY . . +COPY --from=deps /app/ . +COPY --from=prepare /app/out/full/ . ARG APP_VERSION ARG GIT_COMMIT_SHA ENV NODE_ENV=production ENV APP_VERSION=${APP_VERSION} ENV GIT_COMMIT_SHA=${GIT_COMMIT_SHA} -ENV NEXT_TELEMETRY_DISABLED=1 -RUN bun run build +RUN bunx turbo run build --filter=@sofa/web --filter=@sofa/server -# --- Runner --- +# --- Production runner --- FROM base AS runner WORKDIR /app -ARG APP_VERSION -ARG GIT_COMMIT_SHA ENV NODE_ENV=production ENV PORT=3000 ENV HOSTNAME=0.0.0.0 ENV DATA_DIR=/data -ENV APP_VERSION=${APP_VERSION} -ENV GIT_COMMIT_SHA=${GIT_COMMIT_SHA} -ENV NEXT_TELEMETRY_DISABLED=1 -COPY --from=builder --chown=bun:bun /app/public ./public +# API server + packages +COPY --from=builder --chown=bun:bun /app/apps/server/ ./apps/server/ +COPY --from=builder --chown=bun:bun /app/packages/ ./packages/ +COPY --from=builder --chown=bun:bun /app/node_modules/ ./node_modules/ -RUN mkdir .next \ - && chown bun:bun .next +# Built SPA +COPY --from=builder --chown=bun:bun /app/apps/web/dist/ ./apps/web/dist/ -COPY --from=builder --chown=bun:bun /app/.next/standalone ./ -COPY --from=builder --chown=bun:bun /app/.next/static ./.next/static -COPY --from=builder --chown=bun:bun /app/.next/cache ./.next/cache -COPY --from=builder --chown=bun:bun /app/drizzle ./drizzle - -RUN mkdir -p /data \ - && chown bun:bun /data +# DB migrations +COPY --from=builder --chown=bun:bun /app/packages/db/drizzle/ ./packages/db/drizzle/ +RUN mkdir -p /data && chown bun:bun /data USER bun EXPOSE 3000 HEALTHCHECK --interval=30s --timeout=10s --start-period=15s --retries=3 \ - CMD ["bun", "-e", "fetch('http://localhost:3000/api/health').then(r => process.exit(+!r.ok)).catch(() => process.exit(1))"] + CMD ["bun", "-e", "fetch('http://localhost:3000/api/health').then(r=>process.exit(+!r.ok)).catch(()=>process.exit(1))"] -CMD ["bun", "server.js"] +CMD ["bun", "apps/server/src/index.ts"] diff --git a/app/(auth)/layout.tsx b/app/(auth)/layout.tsx deleted file mode 100644 index bf0c7b1..0000000 --- a/app/(auth)/layout.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Suspense } from "react"; - -export default function AuthLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( -
-
- {children} -
-
- ); -} diff --git a/app/(auth)/login/page.tsx b/app/(auth)/login/page.tsx deleted file mode 100644 index efd2eb4..0000000 --- a/app/(auth)/login/page.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { redirect } from "next/navigation"; -import { AuthForm } from "@/components/auth-form"; -import { getSession } from "@/lib/auth/session"; -import { - getOidcProviderName, - isOidcConfigured, - isPasswordLoginDisabled, -} from "@/lib/config"; -import { getUserCount, isRegistrationOpen } from "@/lib/services/settings"; - -export default async function LoginPage() { - const session = await getSession(); - if (session) redirect("/dashboard"); - - if (getUserCount() === 0) { - redirect("/register"); - } - - const oidcEnabled = isOidcConfigured(); - - return ( - - ); -} diff --git a/app/(pages)/dashboard/page.tsx b/app/(pages)/dashboard/page.tsx deleted file mode 100644 index f121d55..0000000 --- a/app/(pages)/dashboard/page.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { getSession } from "@/lib/auth/session"; -import { ContinueWatchingSection } from "./_components/continue-watching-section"; -import { LibrarySection } from "./_components/library-section"; -import { RecommendationsSection } from "./_components/recommendations-section"; -import { StatsSection } from "./_components/stats-section"; -import { WelcomeHeader } from "./_components/welcome-header"; - -export default async function DashboardPage() { - const session = await getSession(); - if (!session) return null; - - return ( -
- - - - - -
- ); -} diff --git a/app/(pages)/explore/loading.tsx b/app/(pages)/explore/loading.tsx deleted file mode 100644 index 835a907..0000000 --- a/app/(pages)/explore/loading.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { TitleCardSkeleton } from "@/components/title-card"; -import { Skeleton } from "@/components/ui/skeleton"; - -function TitleRowSkeleton({ withGenreChips }: { withGenreChips?: boolean }) { - return ( -
-
- - -
- {withGenreChips && ( -
- {Array.from({ length: 7 }).map((_, i) => ( - - ))} -
- )} -
- {Array.from({ length: 6 }).map((_, i) => ( - // biome-ignore lint/suspicious/noArrayIndexKey: static skeleton placeholders -
- -
- ))} -
-
- ); -} - -export default function ExploreLoading() { - return ( -
- {/* Hero skeleton — full viewport width like the actual HeroBanner */} -
- -
- - - - -
- ); -} diff --git a/app/(pages)/explore/page.tsx b/app/(pages)/explore/page.tsx deleted file mode 100644 index c48ba47..0000000 --- a/app/(pages)/explore/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { ExploreClient } from "./_components/explore-client"; - -export default function ExplorePage() { - return ; -} diff --git a/app/(pages)/layout.tsx b/app/(pages)/layout.tsx deleted file mode 100644 index 000ae68..0000000 --- a/app/(pages)/layout.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { redirect } from "next/navigation"; -import { Suspense } from "react"; -import { CommandPalette } from "@/components/command-palette"; -import { MobileTabBar, NavBar } from "@/components/nav-bar"; -import { ProgressProvider } from "@/components/navigation-progress"; -import { QueryProvider } from "@/components/query-provider"; -import { UpdateToast } from "@/components/update-toast"; -import { getSession } from "@/lib/auth/session"; -import { getCachedUpdateCheck } from "@/lib/services/update-check"; - -export default function PagesLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - - - {children} - - - - ); -} - -async function AuthenticatedShell({ children }: { children: React.ReactNode }) { - const session = await getSession(); - if (!session) redirect("/login"); - - return ( - <> -
- - {/* Ambient glow — smaller on mobile to add warmth without overwhelming */} -
-
- {children} -
-
- - - {session.user.role === "admin" && ( - - )} - - ); -} diff --git a/app/(pages)/people/[id]/loading.tsx b/app/(pages)/people/[id]/loading.tsx deleted file mode 100644 index d519d15..0000000 --- a/app/(pages)/people/[id]/loading.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { PersonDetailSkeleton } from "./_components/person-detail-client"; - -export default function PersonLoading() { - return ; -} diff --git a/app/(pages)/people/[id]/page.tsx b/app/(pages)/people/[id]/page.tsx deleted file mode 100644 index 7edb8f8..0000000 --- a/app/(pages)/people/[id]/page.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { eq } from "drizzle-orm"; -import type { Metadata } from "next"; -import { notFound } from "next/navigation"; -import { getSession } from "@/lib/auth/session"; -import { db } from "@/lib/db/client"; -import { persons } from "@/lib/db/schema"; -import { getLocalFilmography, getOrFetchPerson } from "@/lib/services/person"; -import { getUserStatusesByTitleIds } from "@/lib/services/tracking"; -import { PersonDetailClient } from "./_components/person-detail-client"; - -export async function generateMetadata({ - params, -}: { - params: Promise<{ id: string }>; -}): Promise { - const { id } = await params; - const person = db.select().from(persons).where(eq(persons.id, id)).get(); - if (!person) return { title: "Not Found — Sofa" }; - - return { - title: `${person.name} — Sofa`, - description: person.biography?.slice(0, 160), - }; -} - -export default async function PersonDetailPage({ - params, -}: { - params: Promise<{ id: string }>; -}) { - const { id } = await params; - - const person = await getOrFetchPerson(id); - if (!person) notFound(); - - const filmography = getLocalFilmography(person.id); - const session = await getSession(); - const userStatuses = session - ? getUserStatusesByTitleIds( - session.user.id, - filmography.map((c) => c.titleId), - ) - : {}; - - return ( - - ); -} diff --git a/app/(pages)/settings/loading.tsx b/app/(pages)/settings/loading.tsx deleted file mode 100644 index 6ce91f2..0000000 --- a/app/(pages)/settings/loading.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Skeleton } from "@/components/ui/skeleton"; - -function SectionSkeleton({ - headingWidth, - children, -}: { - headingWidth: string; - children: React.ReactNode; -}) { - return ( -
-
- - -
- {children} -
- ); -} - -export default function SettingsLoading() { - return ( -
- {/* Header */} -
-
- - -
- -
- - {/* Account card */} - - - - - {/* Integrations cards */} - -
- - - -
-
-
- ); -} diff --git a/app/(pages)/titles/[id]/_components/async-title-seasons.tsx b/app/(pages)/titles/[id]/_components/async-title-seasons.tsx deleted file mode 100644 index efe2149..0000000 --- a/app/(pages)/titles/[id]/_components/async-title-seasons.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { ensureTvHydrated } from "@/lib/services/metadata"; -import { TitleSeasons } from "./title-seasons"; - -export async function AsyncTitleSeasons({ - titleId, - tmdbId, -}: { - titleId: string; - tmdbId: number; -}) { - const seasons = await ensureTvHydrated(titleId, tmdbId); - if (seasons.length === 0) return null; - return ; -} diff --git a/app/(pages)/titles/[id]/_components/title-provider.tsx b/app/(pages)/titles/[id]/_components/title-provider.tsx deleted file mode 100644 index ad4b8a7..0000000 --- a/app/(pages)/titles/[id]/_components/title-provider.tsx +++ /dev/null @@ -1,74 +0,0 @@ -"use client"; - -import { useQueryClient } from "@tanstack/react-query"; -import { useEffect, useState } from "react"; -import type { Season } from "@/lib/orpc/schemas"; -import { orpc } from "@/lib/orpc/tanstack"; -import { TitleContext } from "./title-context"; - -export function TitleProvider({ - titleId, - titleType, - titleName, - initialStatus, - initialRating, - initialEpisodeWatches, - seasons: initialSeasons, - children, -}: { - titleId: string; - titleType: "movie" | "tv"; - titleName: string; - initialStatus: string | null; - initialRating: number; - initialEpisodeWatches: string[]; - seasons: Season[]; - children: React.ReactNode; -}) { - const queryClient = useQueryClient(); - const [seasons, setSeasons] = useState(initialSeasons); - const [watchingEp, setWatchingEp] = useState(null); - - // Seed the query cache with server-fetched data on mount. - // Unlike initialData (which is a no-op when the cache already has an entry), - // this ensures revisiting a title or signing into a different account never - // renders stale or another user's data. - // The parent passes key={title.id}, so React remounts on navigation and the - // cache for the new title ID starts empty. - useEffect(() => { - queryClient.setQueryData( - orpc.titles.userInfo.queryKey({ input: { id: titleId } }), - { - status: initialStatus as - | "watchlist" - | "in_progress" - | "completed" - | null, - rating: initialRating, - episodeWatches: initialEpisodeWatches, - }, - ); - }, [ - queryClient, - titleId, - initialStatus, - initialRating, - initialEpisodeWatches, - ]); - - return ( - - {children} - - ); -} diff --git a/app/(pages)/titles/[id]/loading.tsx b/app/(pages)/titles/[id]/loading.tsx deleted file mode 100644 index 35eef42..0000000 --- a/app/(pages)/titles/[id]/loading.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Skeleton } from "@/components/ui/skeleton"; - -export default function TitleDetailLoading() { - return ( -
- -
- -
-
- -
- - - - -
-
-
- - - -
-
- - - -
-
-
-
- ); -} diff --git a/app/(pages)/titles/[id]/not-found.tsx b/app/(pages)/titles/[id]/not-found.tsx deleted file mode 100644 index e20dfc1..0000000 --- a/app/(pages)/titles/[id]/not-found.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import Link from "next/link"; - -export default function TitleNotFound() { - return ( -
-

- 404 -

- -
-

- Title not found -

-

- The title you're looking for doesn't exist or may have been - removed from the database. -

-
- -
- - Explore titles -
- - - Dashboard - -
-
- ); -} diff --git a/app/(pages)/titles/[id]/page.tsx b/app/(pages)/titles/[id]/page.tsx deleted file mode 100644 index a77e31e..0000000 --- a/app/(pages)/titles/[id]/page.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { eq } from "drizzle-orm"; -import type { Metadata } from "next"; -import { notFound } from "next/navigation"; -import { cache, Suspense } from "react"; -import { getSession } from "@/lib/auth/session"; -import { db } from "@/lib/db/client"; -import { titles } from "@/lib/db/schema"; -import { getOrFetchTitle } from "@/lib/services/metadata"; -import { getUserTitleInfo } from "@/lib/services/tracking"; -import { getThemeCssProperties } from "@/lib/theme"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; -import { AsyncTitleSeasons } from "./_components/async-title-seasons"; -import { TitleActions } from "./_components/title-actions"; -import { TitleAvailability } from "./_components/title-availability"; -import { TitleCast } from "./_components/title-cast"; -import { TitleHero } from "./_components/title-hero"; -import { TitleKeyboardShortcuts } from "./_components/title-keyboard-shortcuts"; -import { TitleProvider } from "./_components/title-provider"; -import { TitleRecommendations } from "./_components/title-recommendations"; -import { SeasonsSkeleton, TitleSeasons } from "./_components/title-seasons"; -import { TitleTheme } from "./_components/title-theme"; - -const getCachedOrFetchTitle = cache((id: string) => getOrFetchTitle(id)); - -export async function generateMetadata({ - params, -}: { - params: Promise<{ id: string }>; -}): Promise { - const { id } = await params; - const title = db.select().from(titles).where(eq(titles.id, id)).get(); - if (!title) return { title: "Not Found — Sofa" }; - - const year = (title.releaseDate ?? title.firstAirDate)?.slice(0, 4); - return { - title: `${title.title}${year ? ` (${year})` : ""} — Sofa`, - description: title.overview?.slice(0, 160), - openGraph: { - title: title.title, - images: title.posterPath - ? [{ url: tmdbImageUrl(title.posterPath, "posters") ?? "" }] - : [], - }, - }; -} - -export default async function TitleDetailPage({ - params, -}: { - params: Promise<{ id: string }>; -}) { - const { id } = await params; - - // Fetch title + user info in parallel - const session = await getSession(); - const [result, userInfo] = await Promise.all([ - getCachedOrFetchTitle(id), - session ? getUserTitleInfo(session.user.id, id) : null, - ]); - if (!result) notFound(); - - const { title, seasons, needsHydration, availability, cast } = result; - - const themeStyle = getThemeCssProperties(title.colorPalette); - - return ( -
- } /> - - } - > - - - - {title.type === "tv" && needsHydration && ( - }> - - - )} - {title.type === "tv" && !needsHydration && seasons.length > 0 && ( - - )} - - - - - - - -
- ); -} diff --git a/app/api/auth/[...all]/route.ts b/app/api/auth/[...all]/route.ts deleted file mode 100644 index 08e4e64..0000000 --- a/app/api/auth/[...all]/route.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { toNextJsHandler } from "better-auth/next-js"; -import { auth } from "@/lib/auth/server"; - -export const { GET, POST } = toNextJsHandler(auth); diff --git a/app/api/avatars/[userId]/route.ts b/app/api/avatars/[userId]/route.ts deleted file mode 100644 index 221ff5d..0000000 --- a/app/api/avatars/[userId]/route.ts +++ /dev/null @@ -1,42 +0,0 @@ -import path from "node:path"; -import { type NextRequest, NextResponse } from "next/server"; -import { getSession } from "@/lib/auth/session"; -import { AVATAR_DIR } from "@/lib/constants"; - -export async function GET( - _req: NextRequest, - { params }: { params: Promise<{ userId: string }> }, -) { - const session = await getSession(); - if (!session) { - return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); - } - - const { userId } = await params; - - // Sanitize userId to prevent path traversal - const safeUserId = path.basename(userId); - if (!safeUserId || safeUserId !== userId || safeUserId.includes("..")) { - return NextResponse.json({ error: "Invalid user ID" }, { status: 400 }); - } - - // Find the avatar file (could be .jpg, .png, .webp, .gif) - const glob = new Bun.Glob(`${safeUserId}.*`); - const matches = await Array.fromAsync(glob.scan(AVATAR_DIR)); - if (matches.length === 0) { - return NextResponse.json({ error: "Not found" }, { status: 404 }); - } - - const file = Bun.file(path.join(AVATAR_DIR, matches[0])); - if (!(await file.exists())) { - return NextResponse.json({ error: "Not found" }, { status: 404 }); - } - - // Cache for 1 year (cache-busted via ?v= query param) - return new NextResponse(await file.arrayBuffer(), { - status: 200, - headers: { - "Content-Type": file.type, - }, - }); -} diff --git a/app/api/backup/[filename]/route.ts b/app/api/backup/[filename]/route.ts deleted file mode 100644 index 825663f..0000000 --- a/app/api/backup/[filename]/route.ts +++ /dev/null @@ -1,42 +0,0 @@ -import path from "node:path"; -import { type NextRequest, NextResponse } from "next/server"; -import { getSession } from "@/lib/auth/session"; -import { getBackupPath } from "@/lib/services/backup"; - -export async function GET( - _req: NextRequest, - { params }: { params: Promise<{ filename: string }> }, -) { - const session = await getSession(); - if (!session) { - return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); - } - if (session.user.role !== "admin") { - return NextResponse.json({ error: "Forbidden" }, { status: 403 }); - } - - const { filename } = await params; - - // Sanitize to prevent path traversal - const safe = path.basename(filename); - if (!safe || safe !== filename || safe.includes("..")) { - return NextResponse.json({ error: "Invalid filename" }, { status: 400 }); - } - - const backupPath = await getBackupPath(safe); - if (!backupPath) { - return NextResponse.json({ error: "Not found" }, { status: 404 }); - } - - const file = Bun.file(backupPath); - const buffer = await file.arrayBuffer(); - - return new NextResponse(new Uint8Array(buffer), { - status: 200, - headers: { - "Content-Type": "application/x-sqlite3", - "Content-Disposition": `attachment; filename="${safe}"`, - "Content-Length": String(file.size), - }, - }); -} diff --git a/app/api/health/route.ts b/app/api/health/route.ts deleted file mode 100644 index cd71f5b..0000000 --- a/app/api/health/route.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { sql } from "drizzle-orm"; -import { connection, NextResponse } from "next/server"; -import { db } from "@/lib/db/client"; -import { createLogger } from "@/lib/logger"; - -const log = createLogger("health"); - -export async function GET() { - await connection(); - - try { - db.run(sql`SELECT 1`); - - return NextResponse.json({ status: "healthy" }, { status: 200 }); - } catch (err) { - log.error("Health check failed:", err); - return NextResponse.json({ status: "unhealthy" }, { status: 503 }); - } -} diff --git a/app/api/images/[...path]/route.ts b/app/api/images/[...path]/route.ts deleted file mode 100644 index cf10726..0000000 --- a/app/api/images/[...path]/route.ts +++ /dev/null @@ -1,64 +0,0 @@ -import path from "node:path"; -import { type NextRequest, NextResponse } from "next/server"; -import { z } from "zod"; -import { - fetchAndMaybeCache, - imageCacheEnabled, -} from "@/lib/services/image-cache"; - -const categorySchema = z.enum([ - "posters", - "backdrops", - "stills", - "logos", - "profiles", -]); - -const IMMUTABLE_CACHE = "public, max-age=31536000, immutable"; - -export async function GET( - _req: NextRequest, - { params }: { params: Promise<{ path: string[] }> }, -) { - const segments = await params; - - if (!imageCacheEnabled()) { - return NextResponse.json( - { error: "Image cache disabled" }, - { status: 404 }, - ); - } - - if (segments.path.length !== 2) { - return NextResponse.json({ error: "Invalid path" }, { status: 400 }); - } - - const [rawCategory, rawFilename] = segments.path; - - const catResult = categorySchema.safeParse(rawCategory); - if (!catResult.success) { - return NextResponse.json({ error: "Invalid category" }, { status: 400 }); - } - const category = catResult.data; - - // Sanitize filename — only allow basename to prevent path traversal - const filename = path.basename(rawFilename); - if (!filename || filename !== rawFilename || filename.includes("..")) { - return NextResponse.json({ error: "Invalid filename" }, { status: 400 }); - } - - const tmdbPath = `/${filename}`; - const result = await fetchAndMaybeCache(tmdbPath, category); - - if (!result) { - return NextResponse.json({ error: "Not found" }, { status: 404 }); - } - - return new NextResponse(new Uint8Array(result.buffer), { - status: 200, - headers: { - "Content-Type": result.contentType, - "Cache-Control": IMMUTABLE_CACHE, - }, - }); -} diff --git a/app/api/lists/[token]/route.ts b/app/api/lists/[token]/route.ts deleted file mode 100644 index 831ecf1..0000000 --- a/app/api/lists/[token]/route.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { NextRequest } from "next/server"; -import { NextResponse } from "next/server"; -import { - getRadarrList, - getSonarrList, - parseStatusParam, - resolveListToken, -} from "@/lib/services/lists"; - -export async function GET( - req: NextRequest, - { params }: { params: Promise<{ token: string }> }, -) { - const { token } = await params; - const result = resolveListToken(token); - if (!result) { - return NextResponse.json([]); - } - - const statuses = parseStatusParam(req.nextUrl.searchParams.get("status")); - - if (result.provider === "sonarr") { - return NextResponse.json(await getSonarrList(result.userId, statuses)); - } - return NextResponse.json(getRadarrList(result.userId, statuses)); -} diff --git a/app/api/v1/[[...rest]]/route.ts b/app/api/v1/[[...rest]]/route.ts deleted file mode 100644 index b26eebb..0000000 --- a/app/api/v1/[[...rest]]/route.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { openApiHandler } from "@/lib/orpc/openapi-handler"; - -async function handleRequest(request: Request) { - const { response } = await openApiHandler.handle(request, { - prefix: "/api/v1", - context: { headers: request.headers }, - }); - return response ?? new Response("Not found", { status: 404 }); -} - -export const GET = handleRequest; -export const POST = handleRequest; -export const PUT = handleRequest; -export const DELETE = handleRequest; diff --git a/app/error.tsx b/app/error.tsx deleted file mode 100644 index 793fefa..0000000 --- a/app/error.tsx +++ /dev/null @@ -1,60 +0,0 @@ -"use client"; - -import { IconAlertTriangle, IconRefresh } from "@tabler/icons-react"; -import Link from "next/link"; -import { useEffect } from "react"; - -export default function PagesError({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { - useEffect(() => { - console.error("[pages error boundary]", error); - }, [error]); - - return ( -
- {/* Icon ring */} -
- -
- -
-

- Something went wrong -

-

- An unexpected error occurred while loading this page. You can try - again or head back to the dashboard. -

-
- - {error.digest && ( -

- Error ID: {error.digest} -

- )} - -
- - - Dashboard - -
-
- ); -} diff --git a/app/global-error.tsx b/app/global-error.tsx deleted file mode 100644 index c8c5182..0000000 --- a/app/global-error.tsx +++ /dev/null @@ -1,161 +0,0 @@ -"use client"; - -export default function GlobalError({ - error, - reset, -}: { - error: Error & { digest?: string }; - reset: () => void; -}) { - return ( - - - - - -
- -
-
- - - - - -
- -

Intermission

- -

- We hit a snag loading this page. This is usually temporary — - try refreshing or come back in a moment. -

- - {error.digest && ( -

Error ID: {error.digest}

- )} - -
- - -
-
- - - ); -} diff --git a/app/layout.tsx b/app/layout.tsx deleted file mode 100644 index b4b78bc..0000000 --- a/app/layout.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { Provider as StoreProvider } from "jotai"; -import { MotionConfig } from "motion/react"; -import type { Metadata, Viewport } from "next"; -import { DM_Sans, DM_Serif_Display, Geist_Mono } from "next/font/google"; -import { Toaster } from "@/components/ui/sonner"; -import { TooltipProvider } from "@/components/ui/tooltip"; - -import "./globals.css"; - -const dmSans = DM_Sans({ - variable: "--font-dm-sans", - subsets: ["latin"], -}); - -const dmSerif = DM_Serif_Display({ - variable: "--font-dm-serif", - weight: "400", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "Sofa", - description: "Track your movies and TV shows", -}; - -export const viewport: Viewport = { - width: "device-width", - initialScale: 1, - maximumScale: 1, - userScalable: false, - viewportFit: "cover", - themeColor: "#090706", -}; - -export default function RootLayout({ - children, -}: Readonly<{ - children: React.ReactNode; -}>) { - return ( - - - - Skip to main content - - - - {children} - - - - - - ); -} diff --git a/app/manifest.ts b/app/manifest.ts deleted file mode 100644 index c751a99..0000000 --- a/app/manifest.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { MetadataRoute } from "next"; - -export default function manifest(): MetadataRoute.Manifest { - return { - name: "Sofa", - short_name: "Sofa", - start_url: "/", - scope: "/", - display: "standalone", - icons: [ - { - src: "/web-app-manifest-192x192.png", - sizes: "192x192", - type: "image/png", - purpose: "maskable", - }, - { - src: "/web-app-manifest-512x512.png", - sizes: "512x512", - type: "image/png", - purpose: "maskable", - }, - ], - }; -} diff --git a/app/not-found.tsx b/app/not-found.tsx deleted file mode 100644 index c256414..0000000 --- a/app/not-found.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import Link from "next/link"; -import { SofaLogo } from "@/components/sofa-logo"; - -export default function NotFound() { - return ( -
- {/* Warm projector glow */} -
- -
- {/* Large ghosted 404 */} -

- 404 -

- - {/* Message */} -
-

- Scene not found -

-

- This page was left on the cutting room floor. It may have been - moved, removed, or never made it past the screenplay. -

-
- - {/* Actions */} -
- - Return home -
- -
- - {/* Logo watermark */} -
- -
-
-
- ); -} diff --git a/app/page.tsx b/app/page.tsx deleted file mode 100644 index cc0c0de..0000000 --- a/app/page.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { redirect } from "next/navigation"; -import { Suspense } from "react"; -import { LandingPage } from "@/components/landing-page"; -import { getSession } from "@/lib/auth/session"; -import { isTmdbConfigured } from "@/lib/config"; -import { getUserCount, isRegistrationOpen } from "@/lib/services/settings"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; - -// Well-known TMDB poster paths for the background collage -const posterPaths = [ - "/qJ2tW6WMUDux911r6m7haRef0WH.jpg", // The Dark Knight - "/gEU2QniE6E77NI6lCU6MxlNBvIx.jpg", // Interstellar - "/rCzpDGLbOoPwLjy3OAm5NUPOTrC.jpg", // The Lord of the Rings - "/pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg", // Fight Club - "/d5NXSklXo0qyIYkgV94XAgMIckC.jpg", // Dune - "/ztkUQFLlC19CCMYHW9o1zWhJRNq.jpg", // Breaking Bad - "/7DJKHzAi83BmQrWLrYYOqcoKfhR.jpg", // The Office - "/u3bZgnGQ9T01sWNhyveQz0wH0Hl.jpg", // Stranger Things - "/ggFHVNu6YYI5L9pCfOacjizRGt.jpg", // Back to the Future - "/q6y0Go1tsGEsmtFryDOJo3dEmqu.jpg", // The Shawshank Redemption - "/pIkRyD18kl4FhoCNQuWxWu5cBLM.jpg", // Inception - "/saHP97rTPS5eLmrLQEcANmKrsFl.jpg", // Forrest Gump -]; - -const posterUrls = posterPaths - .map((p) => tmdbImageUrl(p, "posters", "w300")) - .filter(Boolean) as string[]; - -export default function Home() { - return ( - - - - ); -} - -async function HomeContent() { - const session = await getSession(); - if (session?.user) redirect("/dashboard"); - if (!isTmdbConfigured()) redirect("/setup"); - - const userCount = getUserCount(); - return ( - - ); -} diff --git a/app/robots.ts b/app/robots.ts deleted file mode 100644 index 8f40fd8..0000000 --- a/app/robots.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { MetadataRoute } from "next"; - -export default function robots(): MetadataRoute.Robots { - return { - rules: [ - { - userAgent: "*", - disallow: ["/"], - }, - ], - }; -} diff --git a/app/rpc/[[...rest]]/route.ts b/app/rpc/[[...rest]]/route.ts deleted file mode 100644 index ceb85c7..0000000 --- a/app/rpc/[[...rest]]/route.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { handler } from "@/lib/orpc/handler"; - -async function handleRequest(request: Request) { - const { response } = await handler.handle(request, { - prefix: "/rpc", - context: { headers: request.headers }, - }); - return response ?? new Response("Not found", { status: 404 }); -} - -export const GET = handleRequest; -export const POST = handleRequest; diff --git a/apps/server/package.json b/apps/server/package.json new file mode 100644 index 0000000..19ea5f0 --- /dev/null +++ b/apps/server/package.json @@ -0,0 +1,35 @@ +{ + "name": "@sofa/server", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "bun --env-file=../../.env --watch src/index.ts", + "start": "bun --env-file=../../.env src/index.ts", + "lint": "biome check", + "format": "biome format --write", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@orpc/client": "catalog:", + "@orpc/contract": "catalog:", + "@orpc/json-schema": "1.13.6", + "@orpc/openapi": "1.13.6", + "@orpc/server": "1.13.6", + "@orpc/zod": "1.13.6", + "@sofa/api": "workspace:*", + "@sofa/auth": "workspace:*", + "@sofa/config": "workspace:*", + "@sofa/core": "workspace:*", + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "@sofa/tmdb": "workspace:*", + "croner": "10.0.2-dev.2", + "hono": "4.12.7", + "zod": "catalog:" + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:" + } +} diff --git a/lib/cron.ts b/apps/server/src/cron.ts similarity index 90% rename from lib/cron.ts rename to apps/server/src/cron.ts index e6e7e78..5c4b933 100644 --- a/lib/cron.ts +++ b/apps/server/src/cron.ts @@ -1,6 +1,22 @@ -import { Cron } from "croner"; -import { and, eq, inArray, isNotNull, lt, or } from "drizzle-orm"; -import { db } from "@/lib/db/client"; +import { refreshAvailability } from "@sofa/core/availability"; +import { createBackup, ensureBackupDir, pruneBackups } from "@sofa/core/backup"; +import { refreshCredits } from "@sofa/core/credits"; +import { + cacheEpisodeStills, + cacheImagesForTitle, + cacheProfilePhotos, + cacheProviderLogos, + imageCacheEnabled, +} from "@sofa/core/image-cache"; +import { + refreshRecommendations, + refreshTitle, + refreshTvChildren, +} from "@sofa/core/metadata"; +import { getSetting } from "@sofa/core/settings"; +import { performUpdateCheck } from "@sofa/core/update-check"; +import { db } from "@sofa/db/client"; +import { and, eq, inArray, isNotNull, lt, or } from "@sofa/db/helpers"; import { availabilityOffers, cronRuns, @@ -8,30 +24,10 @@ import { titleCast, titles, userTitleStatus, -} from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import { refreshAvailability } from "@/lib/services/availability"; -import { - createBackup, - ensureBackupDir, - pruneBackups, -} from "@/lib/services/backup"; -import { refreshCredits } from "@/lib/services/credits"; -import { - cacheEpisodeStills, - cacheImagesForTitle, - cacheProfilePhotos, - cacheProviderLogos, - imageCacheEnabled, -} from "@/lib/services/image-cache"; -import { - refreshRecommendations, - refreshTitle, - refreshTvChildren, -} from "@/lib/services/metadata"; -import { getSetting } from "@/lib/services/settings"; -import { performUpdateCheck } from "@/lib/services/update-check"; -import { getTvDetails } from "@/lib/tmdb/client"; +} from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import { getTvDetails } from "@sofa/tmdb/client"; +import { Cron } from "croner"; export type BackupFrequency = "6h" | "12h" | "1d" | "7d"; @@ -166,7 +162,6 @@ async function refreshAvailabilityJob() { log.debug(`Checking availability for ${libraryIds.length} library titles`); const stale = new Date(Date.now() - DAY); - // Batch: find titles with any offers, and titles with stale offers const titlesWithOffers = new Set( db .select({ titleId: availabilityOffers.titleId }) @@ -200,7 +195,6 @@ async function refreshAvailabilityJob() { } } -// Refresh recommendations for recently active titles async function refreshRecommendationsJob() { const libraryIds = getLibraryTitleIds(); log.debug( @@ -213,7 +207,6 @@ async function refreshRecommendationsJob() { } } -// Refresh TV episodes for returning shows async function refreshTvChildrenJob() { const returningStatuses = ["Returning Series", "In Production"]; const stale = new Date(Date.now() - 7 * DAY); @@ -232,7 +225,6 @@ async function refreshTvChildrenJob() { log.debug(`Checking ${tvShows.length} returning TV shows for stale episodes`); - // Batch: find shows with at least one stale season const tvIds = tvShows.map((s) => s.id); const titlesWithStaleSeasons = new Set( tvIds.length > 0 @@ -260,7 +252,6 @@ async function refreshTvChildrenJob() { } } -// Cache images for all library titles (posters, backdrops, stills, logos) async function cacheImagesJob() { if (!imageCacheEnabled()) return; @@ -282,7 +273,6 @@ async function cacheImagesJob() { } } -// Refresh credits for library titles where cast is stale or missing async function refreshCreditsJob() { const libraryIds = getLibraryTitleIds(); log.debug(`Checking credits for ${libraryIds.length} library titles`); diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts new file mode 100644 index 0000000..1878eb7 --- /dev/null +++ b/apps/server/src/index.ts @@ -0,0 +1,139 @@ +import { CACHE_DIR } from "@sofa/config"; +import { ensureBackupDir } from "@sofa/core/backup"; +import { ensureImageDirs, imageCacheEnabled } from "@sofa/core/image-cache"; +import { registerJobScheduleProvider } from "@sofa/core/system-health"; +import { closeDatabase } from "@sofa/db/client"; +import { runMigrations } from "@sofa/db/migrate"; +import { createLogger } from "@sofa/logger"; +import { Hono } from "hono"; +import { serveStatic } from "hono/bun"; +import { cors } from "hono/cors"; +import { getJobSchedules, startJobs, stopJobs } from "./cron"; +import { handler as rpcHandler } from "./orpc/handler"; +import { openApiHandler } from "./orpc/openapi-handler"; +import authRoutes from "./routes/auth"; +import avatarsRoutes from "./routes/avatars"; +import backupsRoutes from "./routes/backups"; +import healthRoutes from "./routes/health"; +import imagesRoutes from "./routes/images"; +import listsRoutes from "./routes/lists"; +import webhooksRoutes from "./routes/webhooks"; + +const log = createLogger("server"); + +// ─── Startup ────────────────────────────────────────────────── + +// Ensure directories +if (imageCacheEnabled()) { + await ensureImageDirs(); +} +await ensureBackupDir(); + +// Run database migrations +runMigrations(); + +// Wire up job schedule provider for system health +registerJobScheduleProvider(getJobSchedules); + +// Start background jobs +startJobs(); + +// ─── App ────────────────────────────────────────────────────── + +const app = new Hono(); + +// CORS — allow the web app's origin +app.use( + "*", + cors({ + origin: process.env.CORS_ORIGIN || "http://localhost:3000", + credentials: true, + }), +); + +// Non-RPC routes +app.route("/api/health", healthRoutes); +app.route("/api/auth", authRoutes); +app.route("/api/avatars", avatarsRoutes); +app.route("/api/backup", backupsRoutes); +app.route("/api/webhooks", webhooksRoutes); +app.route("/api/lists", listsRoutes); + +// Cached images — serve from disk (fast path), fall back to TMDB fetch on miss +if (imageCacheEnabled()) { + app.use( + "/images/*", + serveStatic({ + root: CACHE_DIR, + rewriteRequestPath: (path) => path.replace("/images", ""), + onFound: (_path, c) => { + c.header("Cache-Control", "public, max-age=31536000, immutable"); + }, + }), + ); +} +app.route("/images", imagesRoutes); + +// oRPC RPC handler +app.all("/rpc/*", async (c) => { + const { response } = await rpcHandler.handle(c.req.raw, { + prefix: "/rpc", + context: { headers: c.req.raw.headers }, + }); + return response ?? c.text("Not found", 404); +}); + +// oRPC OpenAPI handler + Scalar docs +app.all("/api/v1/*", async (c) => { + const { response } = await openApiHandler.handle(c.req.raw, { + prefix: "/api/v1", + context: { headers: c.req.raw.headers }, + }); + return response ?? c.text("Not found", 404); +}); + +// ─── SPA static serving (production) ───────────────────────── + +if (process.env.NODE_ENV === "production") { + const { resolve } = await import("node:path"); + const spaDir = resolve(import.meta.dir, "../../../apps/web/dist"); + + // Hashed assets — immutable cache + app.use( + "/assets/*", + serveStatic({ + root: spaDir, + onFound: (_path, c) => { + c.header("Cache-Control", "public, max-age=31536000, immutable"); + }, + }), + ); + // Return 404 for missing /assets/* (stale chunks after deploy) instead of SPA fallback + app.all("/assets/*", (c) => c.text("Not found", 404)); + // Other static files (icons, manifest, etc.) + app.use("*", serveStatic({ root: spaDir })); + // SPA fallback — serve index.html for all unmatched routes + app.get("*", serveStatic({ root: spaDir, path: "/index.html" })); +} + +// ─── Graceful shutdown ──────────────────────────────────────── + +const shutdown = () => { + log.info("Stopping scheduler..."); + stopJobs(); + log.info("Closing database..."); + closeDatabase(); + log.info("Clean shutdown complete"); + process.exit(0); +}; + +process.on("SIGTERM", shutdown); +process.on("SIGINT", shutdown); + +const port = Number(process.env.PORT || process.env.API_PORT || 3001); +log.info(`API server listening on port ${port}`); + +export default { + port, + fetch: app.fetch, +}; diff --git a/lib/orpc/context.ts b/apps/server/src/orpc/context.ts similarity index 76% rename from lib/orpc/context.ts rename to apps/server/src/orpc/context.ts index b013e92..998927a 100644 --- a/lib/orpc/context.ts +++ b/apps/server/src/orpc/context.ts @@ -1,5 +1,5 @@ import { implement } from "@orpc/server"; -import { contract } from "./contract"; +import { contract } from "@sofa/api/contract"; export interface Context { headers: Headers; diff --git a/lib/orpc/handler.ts b/apps/server/src/orpc/handler.ts similarity index 75% rename from lib/orpc/handler.ts rename to apps/server/src/orpc/handler.ts index 847f8bf..7d5b684 100644 --- a/lib/orpc/handler.ts +++ b/apps/server/src/orpc/handler.ts @@ -1,6 +1,6 @@ import { onError } from "@orpc/server"; import { RPCHandler } from "@orpc/server/fetch"; -import { createLogger } from "@/lib/logger"; +import { createLogger } from "@sofa/logger"; import { router } from "./router"; const log = createLogger("orpc"); @@ -8,7 +8,7 @@ const log = createLogger("orpc"); export const handler = new RPCHandler(router, { interceptors: [ onError((error) => { - log.error("oRPC error", { error }); + log.error("oRPC error", error); }), ], }); diff --git a/lib/orpc/middleware.ts b/apps/server/src/orpc/middleware.ts similarity index 96% rename from lib/orpc/middleware.ts rename to apps/server/src/orpc/middleware.ts index 35688a4..badfca7 100644 --- a/lib/orpc/middleware.ts +++ b/apps/server/src/orpc/middleware.ts @@ -1,6 +1,6 @@ import { oo } from "@orpc/openapi"; import { os as baseOs, ORPCError } from "@orpc/server"; -import { auth } from "@/lib/auth/server"; +import { auth } from "@sofa/auth/server"; const base = baseOs.$context<{ headers: Headers }>(); diff --git a/lib/orpc/openapi-handler.ts b/apps/server/src/orpc/openapi-handler.ts similarity index 93% rename from lib/orpc/openapi-handler.ts rename to apps/server/src/orpc/openapi-handler.ts index 6a3a0c1..0688efc 100644 --- a/lib/orpc/openapi-handler.ts +++ b/apps/server/src/orpc/openapi-handler.ts @@ -3,7 +3,7 @@ import { OpenAPIHandler } from "@orpc/openapi/fetch"; import { OpenAPIReferencePlugin } from "@orpc/openapi/plugins"; import { onError } from "@orpc/server"; import { ZodToJsonSchemaConverter } from "@orpc/zod/zod4"; -import { createLogger } from "@/lib/logger"; +import { createLogger } from "@sofa/logger"; import { router } from "./router"; const log = createLogger("openapi"); @@ -42,7 +42,7 @@ export const openApiHandler = new OpenAPIHandler(router, { ], interceptors: [ onError((error) => { - log.error("OpenAPI error", { error }); + log.error("OpenAPI error", error); }), ], }); diff --git a/lib/orpc/procedures/account.ts b/apps/server/src/orpc/procedures/account.ts similarity index 95% rename from lib/orpc/procedures/account.ts rename to apps/server/src/orpc/procedures/account.ts index a0b3712..98958de 100644 --- a/lib/orpc/procedures/account.ts +++ b/apps/server/src/orpc/procedures/account.ts @@ -1,7 +1,7 @@ import { mkdir, rename } from "node:fs/promises"; import path from "node:path"; -import { auth } from "@/lib/auth/server"; -import { AVATAR_DIR } from "@/lib/constants"; +import { auth } from "@sofa/auth/server"; +import { AVATAR_DIR } from "@sofa/config"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/procedures/admin.ts b/apps/server/src/orpc/procedures/admin.ts similarity index 94% rename from lib/orpc/procedures/admin.ts rename to apps/server/src/orpc/procedures/admin.ts index 8f0148f..a3d213a 100644 --- a/lib/orpc/procedures/admin.ts +++ b/apps/server/src/orpc/procedures/admin.ts @@ -1,19 +1,19 @@ import path from "node:path"; import { ORPCError } from "@orpc/server"; -import { BACKUP_DIR } from "@/lib/constants"; -import { rescheduleBackup, triggerJob } from "@/lib/cron"; +import { BACKUP_DIR } from "@sofa/config"; import { createBackup, deleteBackup, ensureBackupDir, listBackups, restoreFromBackup, -} from "@/lib/services/backup"; -import { getSetting, setSetting } from "@/lib/services/settings"; +} from "@sofa/core/backup"; +import { getSetting, setSetting } from "@sofa/core/settings"; import { getCachedUpdateCheck, isUpdateCheckEnabled, -} from "@/lib/services/update-check"; +} from "@sofa/core/update-check"; +import { rescheduleBackup, triggerJob } from "../../cron"; import { os } from "../context"; import { admin } from "../middleware"; diff --git a/lib/orpc/procedures/dashboard.ts b/apps/server/src/orpc/procedures/dashboard.ts similarity index 96% rename from lib/orpc/procedures/dashboard.ts rename to apps/server/src/orpc/procedures/dashboard.ts index 3131785..c039247 100644 --- a/lib/orpc/procedures/dashboard.ts +++ b/apps/server/src/orpc/procedures/dashboard.ts @@ -3,8 +3,8 @@ import { getNewAvailableFeed, getRecommendationsFeed, getUserStats, -} from "@/lib/services/discovery"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +} from "@sofa/core/discovery"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/procedures/discover.ts b/apps/server/src/orpc/procedures/discover.ts similarity index 83% rename from lib/orpc/procedures/discover.ts rename to apps/server/src/orpc/procedures/discover.ts index b74b265..7332d0c 100644 --- a/lib/orpc/procedures/discover.ts +++ b/apps/server/src/orpc/procedures/discover.ts @@ -1,15 +1,15 @@ import { ORPCError } from "@orpc/server"; -import { isTmdbConfigured } from "@/lib/config"; import { getEpisodeProgressByTmdbIds, getUserStatusesByTmdbIds, -} from "@/lib/services/tracking"; -import { discover } from "@/lib/tmdb/client"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +} from "@sofa/core/tracking"; +import { discover as discoverTmdb } from "@sofa/tmdb/client"; +import { isTmdbConfigured } from "@sofa/tmdb/config"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; import { os } from "../context"; import { authed } from "../middleware"; -export const discoverProcedure = os.discover +export const discover = os.discover .use(authed) .handler(async ({ input, context }) => { if (!isTmdbConfigured()) { @@ -18,7 +18,7 @@ export const discoverProcedure = os.discover }); } - const results = await discover(input.mediaType, { + const results = await discoverTmdb(input.mediaType, { sort_by: "popularity.desc", "vote_count.gte": "50", with_genres: String(input.genreId), diff --git a/lib/orpc/procedures/episodes.ts b/apps/server/src/orpc/procedures/episodes.ts similarity index 94% rename from lib/orpc/procedures/episodes.ts rename to apps/server/src/orpc/procedures/episodes.ts index c15d122..1aa44e3 100644 --- a/lib/orpc/procedures/episodes.ts +++ b/apps/server/src/orpc/procedures/episodes.ts @@ -2,7 +2,7 @@ import { logEpisodeWatch, logEpisodeWatchBatch, unwatchEpisode, -} from "@/lib/services/tracking"; +} from "@sofa/core/tracking"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/procedures/explore.ts b/apps/server/src/orpc/procedures/explore.ts similarity index 94% rename from lib/orpc/procedures/explore.ts rename to apps/server/src/orpc/procedures/explore.ts index a2f5301..c4b435b 100644 --- a/lib/orpc/procedures/explore.ts +++ b/apps/server/src/orpc/procedures/explore.ts @@ -1,11 +1,11 @@ import { ORPCError } from "@orpc/server"; -import { isTmdbConfigured } from "@/lib/config"; import { getEpisodeProgressByTmdbIds, getUserStatusesByTmdbIds, -} from "@/lib/services/tracking"; -import { getGenres, getPopular, getTrending } from "@/lib/tmdb/client"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +} from "@sofa/core/tracking"; +import { getGenres, getPopular, getTrending } from "@sofa/tmdb/client"; +import { isTmdbConfigured } from "@sofa/tmdb/config"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/procedures/integrations.ts b/apps/server/src/orpc/procedures/integrations.ts similarity index 96% rename from lib/orpc/procedures/integrations.ts rename to apps/server/src/orpc/procedures/integrations.ts index bae77ff..08dce45 100644 --- a/lib/orpc/procedures/integrations.ts +++ b/apps/server/src/orpc/procedures/integrations.ts @@ -1,7 +1,7 @@ import { ORPCError } from "@orpc/server"; -import { and, desc, eq } from "drizzle-orm"; -import { db } from "@/lib/db/client"; -import { integrationEvents, integrations } from "@/lib/db/schema"; +import { db } from "@sofa/db/client"; +import { and, desc, eq } from "@sofa/db/helpers"; +import { integrationEvents, integrations } from "@sofa/db/schema"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/procedures/people.ts b/apps/server/src/orpc/procedures/people.ts similarity index 90% rename from lib/orpc/procedures/people.ts rename to apps/server/src/orpc/procedures/people.ts index 5f19a6c..20e38fb 100644 --- a/lib/orpc/procedures/people.ts +++ b/apps/server/src/orpc/procedures/people.ts @@ -3,8 +3,8 @@ import { getLocalFilmography, getOrFetchPerson, getOrFetchPersonByTmdbId, -} from "@/lib/services/person"; -import { getUserStatusesByTitleIds } from "@/lib/services/tracking"; +} from "@sofa/core/person"; +import { getUserStatusesByTitleIds } from "@sofa/core/tracking"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/procedures/search.ts b/apps/server/src/orpc/procedures/search.ts similarity index 95% rename from lib/orpc/procedures/search.ts rename to apps/server/src/orpc/procedures/search.ts index 7a49a0a..1a170dc 100644 --- a/lib/orpc/procedures/search.ts +++ b/apps/server/src/orpc/procedures/search.ts @@ -1,12 +1,12 @@ import { ORPCError } from "@orpc/server"; -import { isTmdbConfigured } from "@/lib/config"; import { searchMovies, searchMulti, searchPerson, searchTv, -} from "@/lib/tmdb/client"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +} from "@sofa/tmdb/client"; +import { isTmdbConfigured } from "@sofa/tmdb/config"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/procedures/seasons.ts b/apps/server/src/orpc/procedures/seasons.ts similarity index 73% rename from lib/orpc/procedures/seasons.ts rename to apps/server/src/orpc/procedures/seasons.ts index 178451f..85c35a0 100644 --- a/lib/orpc/procedures/seasons.ts +++ b/apps/server/src/orpc/procedures/seasons.ts @@ -1,7 +1,7 @@ -import { eq } from "drizzle-orm"; -import { db } from "@/lib/db/client"; -import { episodes } from "@/lib/db/schema"; -import { logEpisodeWatchBatch, unwatchSeason } from "@/lib/services/tracking"; +import { logEpisodeWatchBatch, unwatchSeason } from "@sofa/core/tracking"; +import { db } from "@sofa/db/client"; +import { eq } from "@sofa/db/helpers"; +import { episodes } from "@sofa/db/schema"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/apps/server/src/orpc/procedures/stats.ts b/apps/server/src/orpc/procedures/stats.ts new file mode 100644 index 0000000..973e6fc --- /dev/null +++ b/apps/server/src/orpc/procedures/stats.ts @@ -0,0 +1,9 @@ +import { getWatchCount, getWatchHistory } from "@sofa/core/discovery"; +import { os } from "../context"; +import { authed } from "../middleware"; + +export const stats = os.stats.use(authed).handler(({ input, context }) => { + const count = getWatchCount(context.user.id, input.type, input.period); + const history = getWatchHistory(context.user.id, input.type, input.period); + return { count, history }; +}); diff --git a/lib/orpc/procedures/status.ts b/apps/server/src/orpc/procedures/status.ts similarity index 77% rename from lib/orpc/procedures/status.ts rename to apps/server/src/orpc/procedures/status.ts index fda6035..142bcb9 100644 --- a/lib/orpc/procedures/status.ts +++ b/apps/server/src/orpc/procedures/status.ts @@ -1,5 +1,5 @@ -import { isTmdbConfigured } from "@/lib/config"; -import { getSystemHealth } from "@/lib/services/system-health"; +import { getSystemHealth } from "@sofa/core/system-health"; +import { isTmdbConfigured } from "@sofa/tmdb/config"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/apps/server/src/orpc/procedures/system.ts b/apps/server/src/orpc/procedures/system.ts new file mode 100644 index 0000000..4d3a4b2 --- /dev/null +++ b/apps/server/src/orpc/procedures/system.ts @@ -0,0 +1,49 @@ +import { + getOidcProviderName, + isOidcConfigured, + isPasswordLoginDisabled, +} from "@sofa/auth/config"; +import { getUserCount, isRegistrationOpen } from "@sofa/core/settings"; +import { isTmdbConfigured } from "@sofa/tmdb/config"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; +import { os } from "../context"; + +// Well-known TMDB poster paths for the background collage +const posterPaths = [ + "/qJ2tW6WMUDux911r6m7haRef0WH.jpg", + "/gEU2QniE6E77NI6lCU6MxlNBvIx.jpg", + "/rCzpDGLbOoPwLjy3OAm5NUPOTrC.jpg", + "/pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg", + "/d5NXSklXo0qyIYkgV94XAgMIckC.jpg", + "/ztkUQFLlC19CCMYHW9o1zWhJRNq.jpg", + "/7DJKHzAi83BmQrWLrYYOqcoKfhR.jpg", + "/u3bZgnGQ9T01sWNhyveQz0wH0Hl.jpg", + "/ggFHVNu6YYI5L9pCfOacjizRGt.jpg", + "/q6y0Go1tsGEsmtFryDOJo3dEmqu.jpg", + "/pIkRyD18kl4FhoCNQuWxWu5cBLM.jpg", + "/saHP97rTPS5eLmrLQEcANmKrsFl.jpg", +]; + +export const publicInfo = os.system.publicInfo.handler(async () => { + const posterUrls = posterPaths + .map((p) => tmdbImageUrl(p, "posters", "w300")) + .filter(Boolean) as string[]; + + return { + tmdbConfigured: isTmdbConfigured(), + userCount: getUserCount(), + registrationOpen: isRegistrationOpen(), + posterUrls, + }; +}); + +export const authConfig = os.system.authConfig.handler(async () => { + const oidcEnabled = isOidcConfigured(); + return { + oidcEnabled, + oidcProviderName: oidcEnabled ? getOidcProviderName() : null, + passwordLoginDisabled: isPasswordLoginDisabled(), + registrationOpen: isRegistrationOpen(), + userCount: getUserCount(), + }; +}); diff --git a/lib/orpc/procedures/titles.ts b/apps/server/src/orpc/procedures/titles.ts similarity index 85% rename from lib/orpc/procedures/titles.ts rename to apps/server/src/orpc/procedures/titles.ts index 57fe8a5..a9f107b 100644 --- a/lib/orpc/procedures/titles.ts +++ b/apps/server/src/orpc/procedures/titles.ts @@ -1,9 +1,10 @@ import { ORPCError } from "@orpc/server"; -import { getRecommendationsForTitle } from "@/lib/services/discovery"; +import { getRecommendationsForTitle } from "@sofa/core/discovery"; import { + ensureTvHydrated, getOrFetchTitle, getOrFetchTitleByTmdbId, -} from "@/lib/services/metadata"; +} from "@sofa/core/metadata"; import { getUserStatusesByTitleIds, getUserTitleInfo, @@ -12,7 +13,7 @@ import { rateTitleStars, removeTitleStatus, setTitleStatus, -} from "@/lib/services/tracking"; +} from "@sofa/core/tracking"; import { os } from "../context"; import { authed } from "../middleware"; @@ -78,3 +79,10 @@ export const recommendations = os.titles.recommendations ); return { recommendations: recs, userStatuses }; }); + +export const hydrateSeasons = os.titles.hydrateSeasons + .use(authed) + .handler(async ({ input }) => { + const seasons = await ensureTvHydrated(input.id, input.tmdbId); + return { seasons }; + }); diff --git a/lib/orpc/procedures/watchlist.ts b/apps/server/src/orpc/procedures/watchlist.ts similarity index 75% rename from lib/orpc/procedures/watchlist.ts rename to apps/server/src/orpc/procedures/watchlist.ts index d710c1d..0a6e3b5 100644 --- a/lib/orpc/procedures/watchlist.ts +++ b/apps/server/src/orpc/procedures/watchlist.ts @@ -1,9 +1,9 @@ import { ORPCError } from "@orpc/server"; -import { and, eq } from "drizzle-orm"; -import { db } from "@/lib/db/client"; -import { userTitleStatus } from "@/lib/db/schema"; -import { getOrFetchTitleByTmdbId } from "@/lib/services/metadata"; -import { setTitleStatus } from "@/lib/services/tracking"; +import { getOrFetchTitleByTmdbId } from "@sofa/core/metadata"; +import { setTitleStatus } from "@sofa/core/tracking"; +import { db } from "@sofa/db/client"; +import { and, eq } from "@sofa/db/helpers"; +import { userTitleStatus } from "@sofa/db/schema"; import { os } from "../context"; import { authed } from "../middleware"; diff --git a/lib/orpc/router.ts b/apps/server/src/orpc/router.ts similarity index 89% rename from lib/orpc/router.ts rename to apps/server/src/orpc/router.ts index 3b291fe..fdb898a 100644 --- a/lib/orpc/router.ts +++ b/apps/server/src/orpc/router.ts @@ -2,15 +2,16 @@ import { os } from "./context"; import * as account from "./procedures/account"; import * as admin from "./procedures/admin"; import * as dashboard from "./procedures/dashboard"; -import { discoverProcedure } from "./procedures/discover"; +import { discover } from "./procedures/discover"; import * as episodes from "./procedures/episodes"; import * as explore from "./procedures/explore"; import * as integrations from "./procedures/integrations"; import * as people from "./procedures/people"; import { search } from "./procedures/search"; import * as seasons from "./procedures/seasons"; -import { statsProcedure } from "./procedures/stats"; +import { stats } from "./procedures/stats"; import { systemStatus } from "./procedures/status"; +import * as system from "./procedures/system"; import * as titles from "./procedures/titles"; import * as watchlist from "./procedures/watchlist"; @@ -24,6 +25,7 @@ export const router = os.router({ watchAll: titles.watchAll, userInfo: titles.userInfo, recommendations: titles.recommendations, + hydrateSeasons: titles.hydrateSeasons, }, episodes: { watch: episodes.watch, @@ -50,9 +52,13 @@ export const router = os.router({ genres: explore.genres, }, search, - discover: discoverProcedure, - stats: statsProcedure, + discover, + stats, systemStatus, + system: { + publicInfo: system.publicInfo, + authConfig: system.authConfig, + }, integrations: { list: integrations.list, create: integrations.create, diff --git a/apps/server/src/routes/auth.ts b/apps/server/src/routes/auth.ts new file mode 100644 index 0000000..3baff89 --- /dev/null +++ b/apps/server/src/routes/auth.ts @@ -0,0 +1,8 @@ +import { auth } from "@sofa/auth/server"; +import { Hono } from "hono"; + +const app = new Hono(); + +app.all("/*", (c) => auth.handler(c.req.raw)); + +export default app; diff --git a/apps/server/src/routes/avatars.ts b/apps/server/src/routes/avatars.ts new file mode 100644 index 0000000..d2d4742 --- /dev/null +++ b/apps/server/src/routes/avatars.ts @@ -0,0 +1,43 @@ +import path from "node:path"; +import { auth } from "@sofa/auth/server"; +import { AVATAR_DIR } from "@sofa/config"; +import { Hono } from "hono"; + +const app = new Hono(); + +app.get("/:userId", async (c) => { + // Auth check + const session = await auth.api.getSession({ headers: c.req.raw.headers }); + if (!session) { + return c.json({ error: "Unauthorized" }, 401); + } + + const userId = c.req.param("userId"); + + // Sanitize userId to prevent path traversal + const safeUserId = path.basename(userId); + if (!safeUserId || safeUserId !== userId || safeUserId.includes("..")) { + return c.json({ error: "Invalid user ID" }, 400); + } + + // Find the avatar file (could be .jpg, .png, .webp, .gif) + const glob = new Bun.Glob(`${safeUserId}.*`); + const matches = await Array.fromAsync(glob.scan(AVATAR_DIR)); + if (matches.length === 0) { + return c.json({ error: "Not found" }, 404); + } + + const file = Bun.file(path.join(AVATAR_DIR, matches[0])); + if (!(await file.exists())) { + return c.json({ error: "Not found" }, 404); + } + + return new Response(await file.arrayBuffer(), { + status: 200, + headers: { + "Content-Type": file.type, + }, + }); +}); + +export default app; diff --git a/apps/server/src/routes/backups.ts b/apps/server/src/routes/backups.ts new file mode 100644 index 0000000..bb67e03 --- /dev/null +++ b/apps/server/src/routes/backups.ts @@ -0,0 +1,44 @@ +import path from "node:path"; +import { auth } from "@sofa/auth/server"; +import { getBackupPath } from "@sofa/core/backup"; +import { Hono } from "hono"; + +const app = new Hono(); + +app.get("/:filename", async (c) => { + // Auth + admin check + const session = await auth.api.getSession({ headers: c.req.raw.headers }); + if (!session) { + return c.json({ error: "Unauthorized" }, 401); + } + if (session.user.role !== "admin") { + return c.json({ error: "Forbidden" }, 403); + } + + const filename = c.req.param("filename"); + + // Sanitize to prevent path traversal + const safe = path.basename(filename); + if (!safe || safe !== filename || safe.includes("..")) { + return c.json({ error: "Invalid filename" }, 400); + } + + const backupPath = await getBackupPath(safe); + if (!backupPath) { + return c.json({ error: "Not found" }, 404); + } + + const file = Bun.file(backupPath); + const buffer = await file.arrayBuffer(); + + return new Response(new Uint8Array(buffer), { + status: 200, + headers: { + "Content-Type": "application/x-sqlite3", + "Content-Disposition": `attachment; filename="${safe}"`, + "Content-Length": String(file.size), + }, + }); +}); + +export default app; diff --git a/apps/server/src/routes/health.ts b/apps/server/src/routes/health.ts new file mode 100644 index 0000000..8984517 --- /dev/null +++ b/apps/server/src/routes/health.ts @@ -0,0 +1,20 @@ +import { db } from "@sofa/db/client"; +import { sql } from "@sofa/db/helpers"; +import { createLogger } from "@sofa/logger"; +import { Hono } from "hono"; + +const log = createLogger("health"); + +const app = new Hono(); + +app.get("/", (c) => { + try { + db.run(sql`SELECT 1`); + return c.json({ status: "healthy" }, 200); + } catch (err) { + log.error("Health check failed:", err); + return c.json({ status: "unhealthy" }, 503); + } +}); + +export default app; diff --git a/apps/server/src/routes/images.ts b/apps/server/src/routes/images.ts new file mode 100644 index 0000000..dbc7c07 --- /dev/null +++ b/apps/server/src/routes/images.ts @@ -0,0 +1,51 @@ +import path from "node:path"; +import { fetchAndMaybeCache, imageCacheEnabled } from "@sofa/core/image-cache"; +import { Hono } from "hono"; +import { z } from "zod"; + +const categorySchema = z.enum([ + "posters", + "backdrops", + "stills", + "logos", + "profiles", +]); + +const app = new Hono(); + +app.get("/:category/:filename", async (c) => { + if (!imageCacheEnabled()) { + return c.json({ error: "Image cache disabled" }, 404); + } + + const rawCategory = c.req.param("category"); + const rawFilename = c.req.param("filename"); + + const catResult = categorySchema.safeParse(rawCategory); + if (!catResult.success) { + return c.json({ error: "Invalid category" }, 400); + } + const category = catResult.data; + + // Sanitize filename — only allow basename to prevent path traversal + const filename = path.basename(rawFilename); + if (!filename || filename !== rawFilename || filename.includes("..")) { + return c.json({ error: "Invalid filename" }, 400); + } + + const tmdbPath = `/${filename}`; + const result = await fetchAndMaybeCache(tmdbPath, category); + + if (!result) { + return c.json({ error: "Not found" }, 404); + } + + return new Response(new Uint8Array(result.buffer), { + status: 200, + headers: { + "Content-Type": result.contentType, + }, + }); +}); + +export default app; diff --git a/apps/server/src/routes/lists.ts b/apps/server/src/routes/lists.ts new file mode 100644 index 0000000..98340c7 --- /dev/null +++ b/apps/server/src/routes/lists.ts @@ -0,0 +1,26 @@ +import { + getRadarrList, + getSonarrList, + parseStatusParam, + resolveListToken, +} from "@sofa/core/lists"; +import { Hono } from "hono"; + +const app = new Hono(); + +app.get("/:token", async (c) => { + const token = c.req.param("token"); + const result = resolveListToken(token); + if (!result) { + return c.json([]); + } + + const statuses = parseStatusParam(c.req.query("status") ?? null); + + if (result.provider === "sonarr") { + return c.json(await getSonarrList(result.userId, statuses)); + } + return c.json(getRadarrList(result.userId, statuses)); +}); + +export default app; diff --git a/app/api/webhooks/[token]/route.ts b/apps/server/src/routes/webhooks.ts similarity index 56% rename from app/api/webhooks/[token]/route.ts rename to apps/server/src/routes/webhooks.ts index 6d1e03d..da75a3a 100644 --- a/app/api/webhooks/[token]/route.ts +++ b/apps/server/src/routes/webhooks.ts @@ -1,24 +1,22 @@ -import { eq } from "drizzle-orm"; -import type { NextRequest } from "next/server"; -import { NextResponse } from "next/server"; -import { db } from "@/lib/db/client"; -import { integrations } from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import type { WebhookEvent } from "@/lib/services/webhooks"; +import type { WebhookEvent } from "@sofa/core/webhooks"; import { parseEmbyPayload, parseJellyfinPayload, parsePlexPayload, processWebhook, -} from "@/lib/services/webhooks"; +} from "@sofa/core/webhooks"; +import { db } from "@sofa/db/client"; +import { eq } from "@sofa/db/helpers"; +import { integrations } from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import { Hono } from "hono"; const log = createLogger("webhooks"); -export async function POST( - req: NextRequest, - { params }: { params: Promise<{ token: string }> }, -) { - const { token } = await params; +const app = new Hono(); + +app.post("/:token", async (c) => { + const token = c.req.param("token"); // Look up connection by token — this IS the auth const connection = db @@ -29,12 +27,12 @@ export async function POST( if (!connection || !connection.enabled) { // Always return 200 to avoid retry storms from media servers - return NextResponse.json({ ok: true }); + return c.json({ ok: true }); } // Only webhook-type integrations are handled here if (connection.type !== "webhook") { - return NextResponse.json({ ok: true }); + return c.json({ ok: true }); } const provider = connection.provider as "plex" | "jellyfin" | "emby"; @@ -42,19 +40,19 @@ export async function POST( try { let event: WebhookEvent | null; if (provider === "plex") { - const formData = await req.formData(); - event = parsePlexPayload(formData); + const formData = await c.req.raw.formData(); + event = parsePlexPayload(formData as unknown as FormData); } else if (provider === "emby") { - const body = await req.json(); + const body = await c.req.json(); event = parseEmbyPayload(body); } else { - const body = await req.json(); + const body = await c.req.json(); event = parseJellyfinPayload(body); } if (!event) { // Not a relevant event type — silently ignore - return NextResponse.json({ ok: true }); + return c.json({ ok: true }); } await processWebhook(connection.id, connection.userId, provider, event); @@ -63,5 +61,7 @@ export async function POST( log.debug("Webhook processing failed:", err); } - return NextResponse.json({ ok: true }); -} + return c.json({ ok: true }); +}); + +export default app; diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json new file mode 100644 index 0000000..ff11b78 --- /dev/null +++ b/apps/server/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true, + "types": ["bun"], + "jsx": "react-jsx" + }, + "include": ["src"] +} diff --git a/components.json b/apps/web/components.json similarity index 89% rename from components.json rename to apps/web/components.json index b4a7c4e..106612a 100644 --- a/components.json +++ b/apps/web/components.json @@ -1,11 +1,11 @@ { "$schema": "https://ui.shadcn.com/schema.json", "style": "base-mira", - "rsc": true, + "rsc": false, "tsx": true, "tailwind": { "config": "", - "css": "app/globals.css", + "css": "src/styles/globals.css", "baseColor": "neutral", "cssVariables": true, "prefix": "" diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..56b877b --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,11 @@ + + + + + + + +
+ + + diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..fcf5f3e --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,66 @@ +{ + "name": "@sofa/web", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "lint": "biome check", + "format": "biome format --write", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@base-ui/react": "1.2.0", + "@fontsource-variable/dm-sans": "5.2.8", + "@fontsource-variable/geist-mono": "5.2.7", + "@fontsource/dm-serif-display": "5.2.8", + "@orpc/client": "catalog:", + "@orpc/contract": "catalog:", + "@orpc/tanstack-query": "1.13.6", + "@player.style/sutro": "0.2.1", + "@sofa/api": "workspace:*", + "@tabler/icons-react": "3.40.0", + "@tanstack/react-hotkeys": "0.4.1", + "@tanstack/react-query": "5.90.21", + "@tanstack/react-router": "1.166.6", + "better-auth": "catalog:", + "class-variance-authority": "0.7.1", + "clsx": "2.1.1", + "cmdk": "1.1.1", + "date-fns": "catalog:", + "jotai": "2.18.1", + "media-chrome": "4.18.0", + "motion": "12.35.2", + "react": "19.2.4", + "react-day-picker": "9.14.0", + "react-dom": "19.2.4", + "recharts": "3.8.0", + "shadcn": "4.0.3", + "sonner": "2.0.7", + "tailwind-merge": "3.5.0", + "tw-animate-css": "1.4.0", + "vaul": "1.1.2", + "youtube-video-element": "1.9.0", + "zod": "catalog:" + }, + "devDependencies": { + "@tailwindcss/vite": "4.2.1", + "@tanstack/devtools-vite": "0.5.3", + "@tanstack/react-devtools": "0.9.10", + "@tanstack/react-query-devtools": "5.91.3", + "@tanstack/react-router-devtools": "1.166.6", + "@tanstack/router-plugin": "1.166.6", + "@types/bun": "catalog:", + "@types/node": "25.4.0", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "5.1.4", + "babel-plugin-react-compiler": "1.0.0", + "tailwindcss": "4.2.1", + "typescript": "catalog:", + "vite": "7.3.1", + "vite-tsconfig-paths": "6.1.1" + } +} diff --git a/app/apple-icon.png b/apps/web/public/apple-icon.png similarity index 100% rename from app/apple-icon.png rename to apps/web/public/apple-icon.png diff --git a/app/icon.svg b/apps/web/public/icon.svg similarity index 100% rename from app/icon.svg rename to apps/web/public/icon.svg diff --git a/apps/web/public/manifest.webmanifest b/apps/web/public/manifest.webmanifest new file mode 100644 index 0000000..1afbe08 --- /dev/null +++ b/apps/web/public/manifest.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "Sofa", + "short_name": "Sofa", + "start_url": "/", + "scope": "/", + "display": "standalone", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/apps/web/public/robots.txt b/apps/web/public/robots.txt new file mode 100644 index 0000000..1f53798 --- /dev/null +++ b/apps/web/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / diff --git a/public/web-app-manifest-192x192.png b/apps/web/public/web-app-manifest-192x192.png similarity index 100% rename from public/web-app-manifest-192x192.png rename to apps/web/public/web-app-manifest-192x192.png diff --git a/public/web-app-manifest-512x512.png b/apps/web/public/web-app-manifest-512x512.png similarity index 100% rename from public/web-app-manifest-512x512.png rename to apps/web/public/web-app-manifest-512x512.png diff --git a/components/auth-form.tsx b/apps/web/src/components/auth-form.tsx similarity index 96% rename from components/auth-form.tsx rename to apps/web/src/components/auth-form.tsx index 44fc412..3a03c51 100644 --- a/components/auth-form.tsx +++ b/apps/web/src/components/auth-form.tsx @@ -1,9 +1,6 @@ -"use client"; - import { IconKey } from "@tabler/icons-react"; +import { Link, useNavigate } from "@tanstack/react-router"; import { AnimatePresence, motion } from "motion/react"; -import Link from "next/link"; -import { useRouter } from "next/navigation"; import { useState } from "react"; import { SofaLogo } from "@/components/sofa-logo"; import { Alert, AlertDescription } from "@/components/ui/alert"; @@ -38,7 +35,7 @@ export function AuthForm({ mode: "login" | "register"; authConfig?: AuthConfig; }) { - const router = useRouter(); + const navigate = useNavigate(); const [name, setName] = useState(""); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); @@ -69,7 +66,7 @@ export function AuthForm({ return; } } - router.push("/dashboard"); + void navigate({ to: "/dashboard" }); } catch { setError("Something went wrong"); } finally { @@ -104,7 +101,7 @@ export function AuthForm({ transition={{ type: "spring" as const, stiffness: 200, damping: 20 }} >
- +

@@ -263,7 +260,7 @@ export function AuthForm({ <> Already have an account?{" "} Sign in @@ -273,7 +270,7 @@ export function AuthForm({ <> Don't have an account?{" "} Register diff --git a/components/command-palette.tsx b/apps/web/src/components/command-palette.tsx similarity index 95% rename from components/command-palette.tsx rename to apps/web/src/components/command-palette.tsx index 7f11961..2317774 100644 --- a/components/command-palette.tsx +++ b/apps/web/src/components/command-palette.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconDeviceTv, IconHome, @@ -11,9 +9,8 @@ import { } from "@tabler/icons-react"; import { useHotkey, useHotkeySequence } from "@tanstack/react-hotkeys"; import { skipToken, useMutation, useQuery } from "@tanstack/react-query"; +import { useNavigate } from "@tanstack/react-router"; import { useAtom } from "jotai"; -import Image from "next/image"; -import { useRouter } from "next/navigation"; import { useCallback, useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { useProgress } from "@/components/navigation-progress"; @@ -43,7 +40,7 @@ import { MAX_RECENT, recentSearchesAtom, } from "@/lib/atoms/command-palette"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; // Static shortcut descriptions for the help dialog. // TanStack's HotkeyManager/SequenceManager handle all actual key listening. @@ -84,7 +81,7 @@ interface SearchResult { } export function CommandPalette() { - const router = useRouter(); + const navigate = useNavigate(); const progress = useProgress(); const [commandPaletteOpen, setCommandPaletteOpen] = useAtom( commandPaletteOpenAtom, @@ -109,7 +106,7 @@ export function CommandPalette() { ["G", "H"], () => { progress.start(); - router.push("/dashboard"); + void navigate({ to: "/dashboard" }); }, { enabled, timeout: 500 }, ); @@ -117,7 +114,7 @@ export function CommandPalette() { ["G", "E"], () => { progress.start(); - router.push("/explore"); + void navigate({ to: "/explore" }); }, { enabled, timeout: 500 }, ); @@ -150,7 +147,7 @@ export function CommandPalette() { const resolvePersonMutation = useMutation( orpc.people.resolve.mutationOptions({ onSuccess: ({ id }) => { - if (id) router.push(`/people/${id}`); + if (id) void navigate({ to: "/people/$id", params: { id } }); else progress.done(); }, onError: () => { @@ -163,7 +160,7 @@ export function CommandPalette() { const resolveTitleMutation = useMutation( orpc.titles.resolve.mutationOptions({ onSuccess: ({ id }) => { - if (id) router.push(`/titles/${id}`); + if (id) void navigate({ to: "/titles/$id", params: { id } }); else progress.done(); }, onError: () => { @@ -261,11 +258,13 @@ export function CommandPalette() { {r.type === "person" ? (
{r.profilePath ? ( - {r.title} ) : ( @@ -280,11 +279,13 @@ export function CommandPalette() { ) : (
{r.posterPath ? ( - {r.title} ) : ( @@ -387,7 +388,7 @@ export function CommandPalette() { onSelect={() => { setCommandPaletteOpen(false); progress.start(); - router.push("/dashboard"); + void navigate({ to: "/dashboard" }); }} > @@ -398,7 +399,7 @@ export function CommandPalette() { onSelect={() => { setCommandPaletteOpen(false); progress.start(); - router.push("/explore"); + void navigate({ to: "/explore" }); }} > diff --git a/app/(pages)/dashboard/_components/continue-watching-card.tsx b/apps/web/src/components/dashboard/continue-watching-card.tsx similarity index 90% rename from app/(pages)/dashboard/_components/continue-watching-card.tsx rename to apps/web/src/components/dashboard/continue-watching-card.tsx index 0aad9eb..2141007 100644 --- a/app/(pages)/dashboard/_components/continue-watching-card.tsx +++ b/apps/web/src/components/dashboard/continue-watching-card.tsx @@ -1,6 +1,6 @@ import { IconPlayerPlay } from "@tabler/icons-react"; -import Image from "next/image"; -import Link from "next/link"; + +import { Link } from "@tanstack/react-router"; export interface ContinueWatchingItemProps { title: { @@ -32,17 +32,18 @@ export function ContinueWatchingCard({ return (
{stillUrl ? ( - {item.nextEpisode?.name ) : (
diff --git a/app/(pages)/dashboard/_components/continue-watching-list.tsx b/apps/web/src/components/dashboard/continue-watching-list.tsx similarity index 100% rename from app/(pages)/dashboard/_components/continue-watching-list.tsx rename to apps/web/src/components/dashboard/continue-watching-list.tsx diff --git a/app/(pages)/dashboard/_components/continue-watching-section.tsx b/apps/web/src/components/dashboard/continue-watching-section.tsx similarity index 92% rename from app/(pages)/dashboard/_components/continue-watching-section.tsx rename to apps/web/src/components/dashboard/continue-watching-section.tsx index e263b4e..f921fd1 100644 --- a/app/(pages)/dashboard/_components/continue-watching-section.tsx +++ b/apps/web/src/components/dashboard/continue-watching-section.tsx @@ -1,8 +1,6 @@ -"use client"; - import { IconPlayerPlay } from "@tabler/icons-react"; import { useQuery } from "@tanstack/react-query"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; import { ContinueWatchingList, ContinueWatchingSectionSkeleton, diff --git a/app/(pages)/dashboard/_components/feed-section.tsx b/apps/web/src/components/dashboard/feed-section.tsx similarity index 100% rename from app/(pages)/dashboard/_components/feed-section.tsx rename to apps/web/src/components/dashboard/feed-section.tsx diff --git a/app/(pages)/dashboard/_components/library-section.tsx b/apps/web/src/components/dashboard/library-section.tsx similarity index 91% rename from app/(pages)/dashboard/_components/library-section.tsx rename to apps/web/src/components/dashboard/library-section.tsx index 146a92a..4b80dc4 100644 --- a/app/(pages)/dashboard/_components/library-section.tsx +++ b/apps/web/src/components/dashboard/library-section.tsx @@ -1,8 +1,6 @@ -"use client"; - import { IconBooks } from "@tabler/icons-react"; import { useQuery } from "@tanstack/react-query"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; import { FeedSection } from "./feed-section"; import { TitleGrid, TitleGridSectionSkeleton } from "./title-grid"; diff --git a/app/(pages)/dashboard/_components/recommendations-section.tsx b/apps/web/src/components/dashboard/recommendations-section.tsx similarity index 91% rename from app/(pages)/dashboard/_components/recommendations-section.tsx rename to apps/web/src/components/dashboard/recommendations-section.tsx index 9536310..b807da0 100644 --- a/app/(pages)/dashboard/_components/recommendations-section.tsx +++ b/apps/web/src/components/dashboard/recommendations-section.tsx @@ -1,8 +1,6 @@ -"use client"; - import { IconThumbUp } from "@tabler/icons-react"; import { useQuery } from "@tanstack/react-query"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; import { FeedSection } from "./feed-section"; import { TitleGrid, TitleGridSectionSkeleton } from "./title-grid"; diff --git a/app/(pages)/dashboard/_components/sparkline.tsx b/apps/web/src/components/dashboard/sparkline.tsx similarity index 61% rename from app/(pages)/dashboard/_components/sparkline.tsx rename to apps/web/src/components/dashboard/sparkline.tsx index 3b8d04f..e6cb9b1 100644 --- a/app/(pages)/dashboard/_components/sparkline.tsx +++ b/apps/web/src/components/dashboard/sparkline.tsx @@ -1,7 +1,5 @@ -"use client"; - -import { useId } from "react"; -import { Area, AreaChart, ResponsiveContainer, YAxis } from "recharts"; +import { useEffect, useId, useRef, useState } from "react"; +import { Area, AreaChart, YAxis } from "recharts"; interface SparklineProps { data: Array<{ bucket: string; count: number }>; @@ -11,16 +9,36 @@ interface SparklineProps { export function Sparkline({ data, color }: SparklineProps) { const uniqueId = useId(); const gradientId = `sparkline-${uniqueId.replace(/:/g, "")}`; + const containerRef = useRef(null); + const [size, setSize] = useState({ width: 0, height: 0 }); + + useEffect(() => { + const el = containerRef.current; + if (!el) return; + + const observer = new ResizeObserver(([entry]) => { + const { width, height } = entry.contentRect; + if (width > 0 && height > 0) { + setSize({ width, height }); + } + }); + + observer.observe(el); + return () => observer.disconnect(); + }, []); if (!data.some((d) => d.count > 0)) return null; return (
- + {size.width > 0 && size.height > 0 && ( @@ -40,7 +58,7 @@ export function Sparkline({ data, color }: SparklineProps) { isAnimationActive={false} /> - + )}
); } diff --git a/app/(pages)/dashboard/_components/stats-display.tsx b/apps/web/src/components/dashboard/stats-display.tsx similarity index 98% rename from app/(pages)/dashboard/_components/stats-display.tsx rename to apps/web/src/components/dashboard/stats-display.tsx index 3ba8ca0..cb48129 100644 --- a/app/(pages)/dashboard/_components/stats-display.tsx +++ b/apps/web/src/components/dashboard/stats-display.tsx @@ -1,5 +1,8 @@ -"use client"; - +import type { + DashboardStats, + HistoryBucket, + TimePeriod, +} from "@sofa/api/schemas"; import { IconCheck, IconLibrary, @@ -16,12 +19,7 @@ import { SelectValue, } from "@/components/ui/select"; import { Skeleton } from "@/components/ui/skeleton"; -import { orpc } from "@/lib/orpc/tanstack"; -import type { - DashboardStats, - HistoryBucket, - TimePeriod, -} from "@/lib/services/discovery"; +import { orpc } from "@/lib/orpc/client"; import { Sparkline } from "./sparkline"; function StatCardSkeleton() { diff --git a/app/(pages)/dashboard/_components/stats-section.tsx b/apps/web/src/components/dashboard/stats-section.tsx similarity index 92% rename from app/(pages)/dashboard/_components/stats-section.tsx rename to apps/web/src/components/dashboard/stats-section.tsx index 032c3ae..919c542 100644 --- a/app/(pages)/dashboard/_components/stats-section.tsx +++ b/apps/web/src/components/dashboard/stats-section.tsx @@ -1,9 +1,7 @@ -"use client"; - import { IconDeviceTv } from "@tabler/icons-react"; import { useQuery } from "@tanstack/react-query"; -import Link from "next/link"; -import { orpc } from "@/lib/orpc/tanstack"; +import { Link } from "@tanstack/react-router"; +import { orpc } from "@/lib/orpc/client"; import { StatsDisplay, StatsSectionSkeleton } from "./stats-display"; export function StatsSection() { @@ -35,7 +33,7 @@ export function StatsSection() {

Start exploring diff --git a/app/(pages)/dashboard/_components/title-grid.tsx b/apps/web/src/components/dashboard/title-grid.tsx similarity index 99% rename from app/(pages)/dashboard/_components/title-grid.tsx rename to apps/web/src/components/dashboard/title-grid.tsx index 7d6beb2..a7f9634 100644 --- a/app/(pages)/dashboard/_components/title-grid.tsx +++ b/apps/web/src/components/dashboard/title-grid.tsx @@ -1,5 +1,3 @@ -"use client"; - import { TitleCard, TitleCardSkeleton } from "@/components/title-card"; import { Skeleton } from "@/components/ui/skeleton"; diff --git a/app/(pages)/dashboard/_components/welcome-header.tsx b/apps/web/src/components/dashboard/welcome-header.tsx similarity index 100% rename from app/(pages)/dashboard/_components/welcome-header.tsx rename to apps/web/src/components/dashboard/welcome-header.tsx diff --git a/components/expandable-text.tsx b/apps/web/src/components/expandable-text.tsx similarity index 98% rename from components/expandable-text.tsx rename to apps/web/src/components/expandable-text.tsx index c1acb35..55ce132 100644 --- a/components/expandable-text.tsx +++ b/apps/web/src/components/expandable-text.tsx @@ -1,5 +1,3 @@ -"use client"; - import { useEffect, useRef, useState } from "react"; import { cn } from "@/lib/utils"; diff --git a/app/(pages)/explore/_components/explore-client.tsx b/apps/web/src/components/explore/explore-client.tsx similarity index 98% rename from app/(pages)/explore/_components/explore-client.tsx rename to apps/web/src/components/explore/explore-client.tsx index 9321470..9d14a59 100644 --- a/app/(pages)/explore/_components/explore-client.tsx +++ b/apps/web/src/components/explore/explore-client.tsx @@ -1,9 +1,7 @@ -"use client"; - import { IconDeviceTv, IconFlame, IconMovie } from "@tabler/icons-react"; import { useQuery } from "@tanstack/react-query"; import { Skeleton } from "@/components/ui/skeleton"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; import { FilterableTitleRow } from "./filterable-title-row"; import { HeroBanner } from "./hero-banner"; import { TitleRow } from "./title-row"; diff --git a/app/(pages)/explore/_components/filterable-title-row.tsx b/apps/web/src/components/explore/filterable-title-row.tsx similarity index 98% rename from app/(pages)/explore/_components/filterable-title-row.tsx rename to apps/web/src/components/explore/filterable-title-row.tsx index 8cc1e91..52e302a 100644 --- a/app/(pages)/explore/_components/filterable-title-row.tsx +++ b/apps/web/src/components/explore/filterable-title-row.tsx @@ -1,11 +1,9 @@ -"use client"; - import { skipToken, useQuery } from "@tanstack/react-query"; import { useState } from "react"; import { TitleCard, TitleCardSkeleton } from "@/components/title-card"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; interface Genre { id: number; diff --git a/app/(pages)/explore/_components/hero-banner.tsx b/apps/web/src/components/explore/hero-banner.tsx similarity index 93% rename from app/(pages)/explore/_components/hero-banner.tsx rename to apps/web/src/components/explore/hero-banner.tsx index b0d1768..bdb7270 100644 --- a/app/(pages)/explore/_components/hero-banner.tsx +++ b/apps/web/src/components/explore/hero-banner.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconDeviceTv, IconMovie, @@ -7,11 +5,11 @@ import { IconStar, } from "@tabler/icons-react"; import { useMutation } from "@tanstack/react-query"; -import Image from "next/image"; -import { useRouter } from "next/navigation"; + +import { useNavigate } from "@tanstack/react-router"; import { toast } from "sonner"; import { useProgress } from "@/components/navigation-progress"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; interface HeroBannerProps { tmdbId: number; @@ -30,12 +28,12 @@ export function HeroBanner({ backdropPath, voteAverage, }: HeroBannerProps) { - const router = useRouter(); + const navigate = useNavigate(); const progress = useProgress(); const resolveMutation = useMutation( orpc.titles.resolve.mutationOptions({ onSuccess: ({ id }) => { - if (id) router.push(`/titles/${id}`); + if (id) void navigate({ to: "/titles/$id", params: { id } }); else progress.done(); }, onError: () => { @@ -55,12 +53,12 @@ export function HeroBanner({
{backdropPath ? ( - {title} ) : (
diff --git a/app/(pages)/explore/_components/title-row.tsx b/apps/web/src/components/explore/title-row.tsx similarity index 100% rename from app/(pages)/explore/_components/title-row.tsx rename to apps/web/src/components/explore/title-row.tsx diff --git a/components/landing-page.tsx b/apps/web/src/components/landing-page.tsx similarity index 96% rename from components/landing-page.tsx rename to apps/web/src/components/landing-page.tsx index 29c78b9..b10756c 100644 --- a/components/landing-page.tsx +++ b/apps/web/src/components/landing-page.tsx @@ -1,8 +1,5 @@ -"use client"; - +import { Link } from "@tanstack/react-router"; import { motion } from "motion/react"; -import Image from "next/image"; -import Link from "next/link"; import { SofaLogo } from "@/components/sofa-logo"; // Poster positions arranged in angled columns behind the hero @@ -63,11 +60,13 @@ export function LandingPage({ }} >
-
@@ -147,7 +146,7 @@ export function LandingPage({ > {freshInstall ? ( Get Started @@ -156,7 +155,7 @@ export function LandingPage({ ) : ( <> Sign In @@ -164,7 +163,7 @@ export function LandingPage({ {registrationOpen && ( Register diff --git a/components/nav-bar.tsx b/apps/web/src/components/nav-bar.tsx similarity index 96% rename from components/nav-bar.tsx rename to apps/web/src/components/nav-bar.tsx index dc221aa..aca2859 100644 --- a/components/nav-bar.tsx +++ b/apps/web/src/components/nav-bar.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconCompass, IconHome, @@ -7,10 +5,9 @@ import { IconSearch, IconSettings, } from "@tabler/icons-react"; +import { Link, useLocation, useNavigate } from "@tanstack/react-router"; import { useSetAtom } from "jotai"; import { motion } from "motion/react"; -import Link from "next/link"; -import { usePathname, useRouter } from "next/navigation"; import { useLayoutEffect, useRef, useState } from "react"; import { SofaLogo } from "@/components/sofa-logo"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; @@ -127,8 +124,8 @@ export function NavBar({ userImage?: string; userRole?: string; }) { - const router = useRouter(); - const pathname = usePathname(); + const navigate = useNavigate(); + const { pathname } = useLocation(); const setCommandPaletteOpen = useSetAtom(commandPaletteOpenAtom); const initial = userName?.charAt(0).toUpperCase() ?? "?"; @@ -150,7 +147,7 @@ export function NavBar({
@@ -168,7 +165,7 @@ export function NavBar({ ref={(el) => { linkRefs.current[i] = el; }} - href={link.href} + to={link.href} aria-current={isActive ? "page" : undefined} className="relative inline-flex items-center gap-1.5 rounded-md px-3 py-1.5 text-muted-foreground text-sm transition-colors hover:text-foreground focus-visible:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40" > @@ -248,7 +245,7 @@ export function NavBar({
} + render={} className="cursor-pointer text-[13px]" > @@ -259,8 +256,7 @@ export function NavBar({ variant="destructive" onSelect={async () => { await signOut(); - router.push("/"); - router.refresh(); + void navigate({ to: "/" }); }} className="cursor-pointer text-[13px]" > @@ -271,7 +267,7 @@ export function NavBar({ {/* Mobile: simple avatar link to settings */} @@ -289,7 +285,7 @@ export function NavBar({ } export function MobileTabBar() { - const pathname = usePathname(); + const { pathname } = useLocation(); const activeIndex = mobileTabs.findIndex((tab) => isLinkActive(pathname, tab.href), @@ -318,7 +314,7 @@ export function MobileTabBar() { ref={(el) => { tabRefs.current[i] = el; }} - href={tab.href} + to={tab.href} aria-current={isActive ? "page" : undefined} className="relative flex flex-1 flex-col items-center justify-center gap-0.5 focus-visible:text-foreground focus-visible:outline-none" > diff --git a/components/navigation-progress.tsx b/apps/web/src/components/navigation-progress.tsx similarity index 96% rename from components/navigation-progress.tsx rename to apps/web/src/components/navigation-progress.tsx index 24a5058..c1438fa 100644 --- a/components/navigation-progress.tsx +++ b/apps/web/src/components/navigation-progress.tsx @@ -1,6 +1,4 @@ -"use client"; - -import { usePathname, useSearchParams } from "next/navigation"; +import { useLocation } from "@tanstack/react-router"; import { createContext, type ReactNode, @@ -25,8 +23,7 @@ function clamp(n: number, min: number, max: number) { } export function ProgressProvider({ children }: { children: ReactNode }) { - const pathname = usePathname(); - const searchParams = useSearchParams(); + const { pathname, searchStr } = useLocation(); const [visible, setVisible] = useState(false); const [progress, setProgress] = useState(0); @@ -135,7 +132,7 @@ export function ProgressProvider({ children }: { children: ReactNode }) { }, []); // Finish on route change — routeKey is intentionally a dep to trigger on navigation - const routeKey = pathname + (searchParams?.toString() ?? ""); + const routeKey = pathname + (searchStr ?? ""); const firstRenderRef = useRef(true); // biome-ignore lint/correctness/useExhaustiveDependencies: routeKey drives re-runs on route change useEffect(() => { diff --git a/app/(pages)/people/[id]/_components/filmography-grid.tsx b/apps/web/src/components/people/filmography-grid.tsx similarity index 98% rename from app/(pages)/people/[id]/_components/filmography-grid.tsx rename to apps/web/src/components/people/filmography-grid.tsx index bbc26b4..dc20b09 100644 --- a/app/(pages)/people/[id]/_components/filmography-grid.tsx +++ b/apps/web/src/components/people/filmography-grid.tsx @@ -1,5 +1,4 @@ -"use client"; - +import type { PersonCredit } from "@sofa/api/schemas"; import { IconMovie } from "@tabler/icons-react"; import { useMemo, useState } from "react"; import { TitleCard } from "@/components/title-card"; @@ -11,7 +10,6 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import type { PersonCredit } from "@/lib/orpc/schemas"; type Filter = "all" | "movie" | "tv"; type Sort = "newest" | "rating"; diff --git a/app/(pages)/people/[id]/_components/person-detail-client.tsx b/apps/web/src/components/people/person-detail-client.tsx similarity index 79% rename from app/(pages)/people/[id]/_components/person-detail-client.tsx rename to apps/web/src/components/people/person-detail-client.tsx index 6e0dbff..4bc0414 100644 --- a/app/(pages)/people/[id]/_components/person-detail-client.tsx +++ b/apps/web/src/components/people/person-detail-client.tsx @@ -1,9 +1,7 @@ -"use client"; - +import type { PersonCredit, ResolvedPerson } from "@sofa/api/schemas"; import { useQuery } from "@tanstack/react-query"; import { Skeleton } from "@/components/ui/skeleton"; -import type { PersonCredit, ResolvedPerson } from "@/lib/orpc/schemas"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; import { FilmographyGrid } from "./filmography-grid"; import { PersonHero } from "./person-hero"; @@ -36,17 +34,10 @@ export interface PersonDetailResponse { userStatuses: Record; } -export function PersonDetailClient({ - id, - initialData, -}: { - id: string; - initialData?: PersonDetailResponse; -}) { - const { data, isPending } = useQuery({ - ...orpc.people.detail.queryOptions({ input: { id } }), - initialData, - }); +export function PersonDetailClient({ id }: { id: string }) { + const { data, isPending } = useQuery( + orpc.people.detail.queryOptions({ input: { id } }), + ); if (isPending) return ; if (!data) return null; diff --git a/app/(pages)/people/[id]/_components/person-hero.tsx b/apps/web/src/components/people/person-hero.tsx similarity index 96% rename from app/(pages)/people/[id]/_components/person-hero.tsx rename to apps/web/src/components/people/person-hero.tsx index 62b78f1..73357a7 100644 --- a/app/(pages)/people/[id]/_components/person-hero.tsx +++ b/apps/web/src/components/people/person-hero.tsx @@ -1,9 +1,9 @@ +import type { ResolvedPerson } from "@sofa/api/schemas"; import { IconCalendar, IconMapPin } from "@tabler/icons-react"; import { format, parseISO } from "date-fns"; -import Image from "next/image"; + import { ExpandableText } from "@/components/expandable-text"; import { Badge } from "@/components/ui/badge"; -import type { ResolvedPerson } from "@/lib/orpc/schemas"; interface PersonHeroProps { person: ResolvedPerson; @@ -29,13 +29,14 @@ export function PersonHero({ person }: PersonHeroProps) {
{person.profilePath ? ( - {person.name} ) : (
diff --git a/app/(pages)/settings/_components/account-section.tsx b/apps/web/src/components/settings/account-section.tsx similarity index 97% rename from app/(pages)/settings/_components/account-section.tsx rename to apps/web/src/components/settings/account-section.tsx index 80e7de9..c1ea6fc 100644 --- a/app/(pages)/settings/_components/account-section.tsx +++ b/apps/web/src/components/settings/account-section.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconCamera, IconCheck, @@ -10,8 +8,8 @@ import { IconX, } from "@tabler/icons-react"; import { useMutation } from "@tanstack/react-query"; +import { useNavigate, useRouter } from "@tanstack/react-router"; import { AnimatePresence, motion } from "motion/react"; -import { useRouter } from "next/navigation"; import { useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; @@ -30,7 +28,7 @@ import { TooltipTrigger, } from "@/components/ui/tooltip"; import { signOut } from "@/lib/auth/client"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; export function AccountSection({ user, @@ -43,6 +41,7 @@ export function AccountSection({ role?: string; }; }) { + const navigate = useNavigate(); const router = useRouter(); const [avatarUrl, setAvatarUrl] = useState(user.image); const [isHovered, setIsHovered] = useState(false); @@ -60,7 +59,7 @@ export function AccountSection({ setDisplayName(trimmed); setIsEditingName(false); toast.success("Name updated"); - router.refresh(); + router.invalidate(); }, onError: (err) => { const message = err instanceof Error ? err.message : "Update failed"; @@ -88,7 +87,7 @@ export function AccountSection({ onSuccess: (data) => { setAvatarUrl(data.imageUrl); toast.success("Profile picture updated"); - router.refresh(); + router.invalidate(); }, onError: (err) => { const message = err instanceof Error ? err.message : "Upload failed"; @@ -111,7 +110,7 @@ export function AccountSection({ onSuccess: () => { setAvatarUrl(undefined); toast.success("Profile picture removed"); - router.refresh(); + router.invalidate(); }, onError: () => { toast.error("Failed to remove profile picture"); @@ -322,8 +321,7 @@ export function AccountSection({ variant="destructive" onClick={async () => { await signOut(); - router.push("/"); - router.refresh(); + void navigate({ to: "/" }); }} > diff --git a/app/(pages)/settings/_components/backup-restore-section.tsx b/apps/web/src/components/settings/backup-restore-section.tsx similarity index 98% rename from app/(pages)/settings/_components/backup-restore-section.tsx rename to apps/web/src/components/settings/backup-restore-section.tsx index 5177704..57a1cd4 100644 --- a/app/(pages)/settings/_components/backup-restore-section.tsx +++ b/apps/web/src/components/settings/backup-restore-section.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconCloudUpload } from "@tabler/icons-react"; import { useMutation } from "@tanstack/react-query"; import { useRef, useState } from "react"; @@ -17,7 +15,7 @@ import { import { Button } from "@/components/ui/button"; import { CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Spinner } from "@/components/ui/spinner"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; export function BackupRestoreSection() { const [restoreDialogOpen, setRestoreDialogOpen] = useState(false); diff --git a/app/(pages)/settings/_components/backup-schedule-section.tsx b/apps/web/src/components/settings/backup-schedule-section.tsx similarity index 99% rename from app/(pages)/settings/_components/backup-schedule-section.tsx rename to apps/web/src/components/settings/backup-schedule-section.tsx index 6daa601..ae9580f 100644 --- a/app/(pages)/settings/_components/backup-schedule-section.tsx +++ b/apps/web/src/components/settings/backup-schedule-section.tsx @@ -1,5 +1,4 @@ -"use client"; - +import type { BackupFrequency } from "@sofa/api/schemas"; import { IconCalendarWeek } from "@tabler/icons-react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { format, formatDistanceToNow } from "date-fns"; @@ -18,8 +17,7 @@ import { } from "@/components/ui/select"; import { Skeleton } from "@/components/ui/skeleton"; import { Switch } from "@/components/ui/switch"; -import type { BackupFrequency } from "@/lib/cron"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; const FREQUENCY_OPTIONS: { value: BackupFrequency; label: string }[] = [ { value: "6h", label: "6h" }, diff --git a/app/(pages)/settings/_components/backup-section.tsx b/apps/web/src/components/settings/backup-section.tsx similarity index 98% rename from app/(pages)/settings/_components/backup-section.tsx rename to apps/web/src/components/settings/backup-section.tsx index 8b6f299..d6258c1 100644 --- a/app/(pages)/settings/_components/backup-section.tsx +++ b/apps/web/src/components/settings/backup-section.tsx @@ -1,5 +1,4 @@ -"use client"; - +import type { BackupInfo } from "@sofa/api/schemas"; import { IconClock, IconCloudDownload, @@ -33,8 +32,7 @@ import { TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; -import { orpc } from "@/lib/orpc/tanstack"; -import type { BackupInfo } from "@/lib/services/backup"; +import { orpc } from "@/lib/orpc/client"; function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; diff --git a/app/(pages)/settings/_components/icons.tsx b/apps/web/src/components/settings/icons.tsx similarity index 100% rename from app/(pages)/settings/_components/icons.tsx rename to apps/web/src/components/settings/icons.tsx diff --git a/app/(pages)/settings/_components/integration-card.tsx b/apps/web/src/components/settings/integration-card.tsx similarity index 99% rename from app/(pages)/settings/_components/integration-card.tsx rename to apps/web/src/components/settings/integration-card.tsx index e20888c..c0c1b61 100644 --- a/app/(pages)/settings/_components/integration-card.tsx +++ b/apps/web/src/components/settings/integration-card.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconBook2, IconCheck, @@ -39,7 +37,7 @@ import { TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; // ─── Types ────────────────────────────────────────────────────────── diff --git a/app/(pages)/settings/_components/integration-configs.tsx b/apps/web/src/components/settings/integration-configs.tsx similarity index 100% rename from app/(pages)/settings/_components/integration-configs.tsx rename to apps/web/src/components/settings/integration-configs.tsx diff --git a/app/(pages)/settings/_components/integrations-section.tsx b/apps/web/src/components/settings/integrations-section.tsx similarity index 97% rename from app/(pages)/settings/_components/integrations-section.tsx rename to apps/web/src/components/settings/integrations-section.tsx index bc6ed8d..1dd8e16 100644 --- a/app/(pages)/settings/_components/integrations-section.tsx +++ b/apps/web/src/components/settings/integrations-section.tsx @@ -1,10 +1,8 @@ -"use client"; - import { IconWebhook } from "@tabler/icons-react"; import { useQuery } from "@tanstack/react-query"; import { useState } from "react"; import { Skeleton } from "@/components/ui/skeleton"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; import { IntegrationCard, type IntegrationConnection, diff --git a/app/(pages)/settings/_components/registration-section.tsx b/apps/web/src/components/settings/registration-section.tsx similarity index 97% rename from app/(pages)/settings/_components/registration-section.tsx rename to apps/web/src/components/settings/registration-section.tsx index a277d0d..7314e56 100644 --- a/app/(pages)/settings/_components/registration-section.tsx +++ b/apps/web/src/components/settings/registration-section.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconDoorEnter } from "@tabler/icons-react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { useOptimistic, useState, useTransition } from "react"; @@ -7,7 +5,7 @@ import { toast } from "sonner"; import { CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Switch } from "@/components/ui/switch"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; export function RegistrationSection() { const { data, isPending: isLoading } = useQuery( diff --git a/app/(pages)/settings/_components/settings-shell.tsx b/apps/web/src/components/settings/settings-shell.tsx similarity index 98% rename from app/(pages)/settings/_components/settings-shell.tsx rename to apps/web/src/components/settings/settings-shell.tsx index 282717b..6b3de9b 100644 --- a/app/(pages)/settings/_components/settings-shell.tsx +++ b/apps/web/src/components/settings/settings-shell.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconSettings } from "@tabler/icons-react"; import { motion } from "motion/react"; import { Children, type ReactNode } from "react"; diff --git a/app/(pages)/settings/_components/system-health-section.tsx b/apps/web/src/components/settings/system-health-section.tsx similarity index 99% rename from app/(pages)/settings/_components/system-health-section.tsx rename to apps/web/src/components/settings/system-health-section.tsx index a9fc471..6999bfd 100644 --- a/app/(pages)/settings/_components/system-health-section.tsx +++ b/apps/web/src/components/settings/system-health-section.tsx @@ -1,5 +1,4 @@ -"use client"; - +import type { SystemHealthData } from "@sofa/api/schemas"; import { IconActivity, IconAlertTriangle, @@ -35,8 +34,7 @@ import { TooltipTrigger, } from "@/components/ui/tooltip"; import { useTimeAgo } from "@/hooks/use-time-ago"; -import { orpc } from "@/lib/orpc/tanstack"; -import type { SystemHealthData } from "@/lib/services/system-health"; +import { orpc } from "@/lib/orpc/client"; const JOB_LABELS: Record = { nightlyRefreshLibrary: "Library refresh", diff --git a/app/(pages)/settings/_components/update-check-section.tsx b/apps/web/src/components/settings/update-check-section.tsx similarity index 97% rename from app/(pages)/settings/_components/update-check-section.tsx rename to apps/web/src/components/settings/update-check-section.tsx index 54f3ed5..3e2fc34 100644 --- a/app/(pages)/settings/_components/update-check-section.tsx +++ b/apps/web/src/components/settings/update-check-section.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconWorldUpload } from "@tabler/icons-react"; import { useMutation, useQuery } from "@tanstack/react-query"; import { useOptimistic, useState, useTransition } from "react"; @@ -7,7 +5,7 @@ import { toast } from "sonner"; import { CardContent, CardDescription, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Switch } from "@/components/ui/switch"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; export function UpdateCheckSection() { const { data, isPending: isLoading } = useQuery( diff --git a/app/setup/_components/copy-button.tsx b/apps/web/src/components/setup/copy-button.tsx similarity index 98% rename from app/setup/_components/copy-button.tsx rename to apps/web/src/components/setup/copy-button.tsx index 663201f..e1173ff 100644 --- a/app/setup/_components/copy-button.tsx +++ b/apps/web/src/components/setup/copy-button.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconCheck, IconCopy } from "@tabler/icons-react"; import { useState } from "react"; import { Button } from "@/components/ui/button"; diff --git a/app/setup/_components/refresh-button.tsx b/apps/web/src/components/setup/refresh-button.tsx similarity index 71% rename from app/setup/_components/refresh-button.tsx rename to apps/web/src/components/setup/refresh-button.tsx index fcd0976..ad6abac 100644 --- a/app/setup/_components/refresh-button.tsx +++ b/apps/web/src/components/setup/refresh-button.tsx @@ -1,19 +1,14 @@ -"use client"; - import { IconRefresh } from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; -import { useTransition } from "react"; +import { useState } from "react"; import { Button } from "@/components/ui/button"; import { Spinner } from "@/components/ui/spinner"; export function RefreshButton() { - const router = useRouter(); - const [isRefreshing, startTransition] = useTransition(); + const [isRefreshing, setIsRefreshing] = useState(false); function handleRefresh() { - startTransition(async () => { - router.refresh(); - }); + setIsRefreshing(true); + window.location.reload(); } return ( diff --git a/components/sofa-logo.tsx b/apps/web/src/components/sofa-logo.tsx similarity index 100% rename from components/sofa-logo.tsx rename to apps/web/src/components/sofa-logo.tsx diff --git a/components/status-dot.tsx b/apps/web/src/components/status-dot.tsx similarity index 99% rename from components/status-dot.tsx rename to apps/web/src/components/status-dot.tsx index 0a33615..fff3b47 100644 --- a/components/status-dot.tsx +++ b/apps/web/src/components/status-dot.tsx @@ -1,5 +1,3 @@ -"use client"; - import { motion, useReducedMotion } from "motion/react"; import { Tooltip, diff --git a/components/title-card.tsx b/apps/web/src/components/title-card.tsx similarity index 96% rename from components/title-card.tsx rename to apps/web/src/components/title-card.tsx index 352aded..55bd7cb 100644 --- a/components/title-card.tsx +++ b/apps/web/src/components/title-card.tsx @@ -1,5 +1,3 @@ -"use client"; - import { IconBookmarkFilled, IconCircleCheckFilled, @@ -11,10 +9,8 @@ import { IconStarFilled, } from "@tabler/icons-react"; import { useMutation } from "@tanstack/react-query"; +import { Link, useNavigate } from "@tanstack/react-router"; import { type MotionStyle, type MotionValue, motion } from "motion/react"; -import Image from "next/image"; -import Link from "next/link"; -import { useRouter } from "next/navigation"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { useProgress } from "@/components/navigation-progress"; @@ -25,7 +21,7 @@ import { TooltipTrigger, } from "@/components/ui/tooltip"; import { useTiltEffect } from "@/hooks/use-tilt-effect"; -import { orpc } from "@/lib/orpc/tanstack"; +import { orpc } from "@/lib/orpc/client"; export function TitleCardSkeleton() { return ( @@ -193,11 +189,13 @@ function CardInner({
{posterPath ? ( - {title} @@ -290,12 +288,13 @@ export function TitleCard({ episodeProgress, }: TitleCardProps) { const tilt = useTiltEffect(); - const router = useRouter(); + const navigate = useNavigate(); const progress = useProgress(); const resolveMutation = useMutation( orpc.titles.resolve.mutationOptions({ onSuccess: ({ id: resolvedId }) => { - if (resolvedId) router.push(`/titles/${resolvedId}`); + if (resolvedId) + void navigate({ to: "/titles/$id", params: { id: resolvedId } }); else progress.done(); }, onError: () => { @@ -332,7 +331,9 @@ export function TitleCard({ userStatus={userStatus} /> {id ? ( - {cardContent} + + {cardContent} + ) : ( + + Dashboard + +
+
+ ); +} diff --git a/apps/web/src/routes/_app.tsx b/apps/web/src/routes/_app.tsx new file mode 100644 index 0000000..e1d99d4 --- /dev/null +++ b/apps/web/src/routes/_app.tsx @@ -0,0 +1,67 @@ +import { createFileRoute, Outlet, redirect } from "@tanstack/react-router"; +import { CommandPalette } from "@/components/command-palette"; +import { MobileTabBar, NavBar } from "@/components/nav-bar"; +import { Skeleton } from "@/components/ui/skeleton"; +import { UpdateToast } from "@/components/update-toast"; +import { authClient } from "@/lib/auth/client"; +import { client } from "@/lib/orpc/client"; + +export const Route = createFileRoute("/_app")({ + beforeLoad: async () => { + const { data: session } = await authClient.getSession(); + if (!session) throw redirect({ to: "/login" }); + + let updateCheck = null; + if (session.user.role === "admin") { + try { + ({ updateCheck } = await client.admin.updateCheck({})); + } catch { + // Silently ignore — update check is non-critical + } + } + return { session, updateCheck }; + }, + component: AppLayout, + pendingComponent: AppShellSkeleton, +}); + +function AppLayout() { + const { session, updateCheck } = Route.useRouteContext(); + return ( + <> +
+ + {/* Ambient glow */} +
+
+ +
+
+ + + {session.user.role === "admin" && } + + ); +} + +function AppShellSkeleton() { + return ( +
+
+
+ + + +
+
+
+ ); +} diff --git a/apps/web/src/routes/_app/dashboard.tsx b/apps/web/src/routes/_app/dashboard.tsx new file mode 100644 index 0000000..eb7d6b3 --- /dev/null +++ b/apps/web/src/routes/_app/dashboard.tsx @@ -0,0 +1,23 @@ +import { createFileRoute } from "@tanstack/react-router"; +import { ContinueWatchingSection } from "@/components/dashboard/continue-watching-section"; +import { LibrarySection } from "@/components/dashboard/library-section"; +import { RecommendationsSection } from "@/components/dashboard/recommendations-section"; +import { StatsSection } from "@/components/dashboard/stats-section"; +import { WelcomeHeader } from "@/components/dashboard/welcome-header"; + +export const Route = createFileRoute("/_app/dashboard")({ + component: DashboardPage, +}); + +function DashboardPage() { + const { session } = Route.useRouteContext(); + return ( +
+ + + + + +
+ ); +} diff --git a/apps/web/src/routes/_app/explore.tsx b/apps/web/src/routes/_app/explore.tsx new file mode 100644 index 0000000..80865de --- /dev/null +++ b/apps/web/src/routes/_app/explore.tsx @@ -0,0 +1,6 @@ +import { createFileRoute } from "@tanstack/react-router"; +import { ExploreClient } from "@/components/explore/explore-client"; + +export const Route = createFileRoute("/_app/explore")({ + component: () => , +}); diff --git a/app/(pages)/people/[id]/not-found.tsx b/apps/web/src/routes/_app/people.$id.tsx similarity index 66% rename from app/(pages)/people/[id]/not-found.tsx rename to apps/web/src/routes/_app/people.$id.tsx index eb8e574..b26eb1f 100644 --- a/app/(pages)/people/[id]/not-found.tsx +++ b/apps/web/src/routes/_app/people.$id.tsx @@ -1,6 +1,31 @@ -import Link from "next/link"; +import { createFileRoute, Link } from "@tanstack/react-router"; +import { + PersonDetailClient, + PersonDetailSkeleton, +} from "@/components/people/person-detail-client"; +import { orpc } from "@/lib/orpc/client"; -export default function PersonNotFound() { +export const Route = createFileRoute("/_app/people/$id")({ + loader: async ({ params, context }) => { + await context.queryClient.ensureQueryData( + orpc.people.detail.queryOptions({ input: { id: params.id } }), + ); + }, + head: ({ loaderData: _loaderData, params: _params }) => { + // Title is set by the component after data loads + return {}; + }, + pendingComponent: () => , + notFoundComponent: PersonNotFound, + component: PersonPage, +}); + +function PersonPage() { + const { id } = Route.useParams(); + return ; +} + +function PersonNotFound() { return (

404

-
-
Explore titles
Dashboard diff --git a/app/(pages)/settings/page.tsx b/apps/web/src/routes/_app/settings.tsx similarity index 78% rename from app/(pages)/settings/page.tsx rename to apps/web/src/routes/_app/settings.tsx index 4bd13e2..c588c6f 100644 --- a/app/(pages)/settings/page.tsx +++ b/apps/web/src/routes/_app/settings.tsx @@ -3,30 +3,29 @@ import { IconServer2, IconShieldLock, } from "@tabler/icons-react"; -import { redirect } from "next/navigation"; +import { createFileRoute } from "@tanstack/react-router"; +import { AccountSection } from "@/components/settings/account-section"; +import { BackupRestoreSection } from "@/components/settings/backup-restore-section"; +import { BackupScheduleSection } from "@/components/settings/backup-schedule-section"; +import { BackupSection } from "@/components/settings/backup-section"; +import { IntegrationsSection } from "@/components/settings/integrations-section"; +import { RegistrationSection } from "@/components/settings/registration-section"; +import { SettingsShell } from "@/components/settings/settings-shell"; +import { SystemHealthCards } from "@/components/settings/system-health-section"; +import { UpdateCheckSection } from "@/components/settings/update-check-section"; import { TmdbLogo } from "@/components/tmdb-logo"; import { Card } from "@/components/ui/card"; -import { getSession } from "@/lib/auth/session"; -import { AccountSection } from "./_components/account-section"; -import { BackupRestoreSection } from "./_components/backup-restore-section"; -import { BackupScheduleSection } from "./_components/backup-schedule-section"; -import { BackupSection } from "./_components/backup-section"; -import { IntegrationsSection } from "./_components/integrations-section"; -import { RegistrationSection } from "./_components/registration-section"; -import { SettingsShell } from "./_components/settings-shell"; -import { SystemHealthCards } from "./_components/system-health-section"; -import { UpdateCheckSection } from "./_components/update-check-section"; -export default async function SettingsPage() { - const session = await getSession(); - if (!session?.user) redirect("/login"); +const GITHUB_REPO = "jakejarvis/sofa"; +export const Route = createFileRoute("/_app/settings")({ + component: SettingsPage, +}); + +function SettingsPage() { + const { session } = Route.useRouteContext(); const isAdmin = session.user.role === "admin"; - const GITHUB_REPO = "jakejarvis/sofa"; - const APP_VERSION = process.env.APP_VERSION || "0.0.0"; - const GIT_COMMIT_SHA = process.env.GIT_COMMIT_SHA?.slice(0, 7) || ""; - return ( Sofa {" "} - v{APP_VERSION} - {GIT_COMMIT_SHA && ( + v{__APP_VERSION__} + {__GIT_COMMIT_SHA__ && ( <> {" "} ( - {GIT_COMMIT_SHA} + {__GIT_COMMIT_SHA__} ) @@ -79,7 +78,7 @@ export default async function SettingsPage() { name: session.user.name, email: session.user.email, image: session.user.image || undefined, - createdAt: session.user.createdAt.toISOString(), + createdAt: new Date(session.user.createdAt).toISOString(), role: session.user.role ?? undefined, }} /> diff --git a/apps/web/src/routes/_app/titles.$id.tsx b/apps/web/src/routes/_app/titles.$id.tsx new file mode 100644 index 0000000..0978801 --- /dev/null +++ b/apps/web/src/routes/_app/titles.$id.tsx @@ -0,0 +1,183 @@ +import { createFileRoute, Link } from "@tanstack/react-router"; +import { Suspense } from "react"; +import { AsyncTitleSeasons } from "@/components/titles/async-title-seasons"; +import { TitleActions } from "@/components/titles/title-actions"; +import { TitleAvailability } from "@/components/titles/title-availability"; +import { TitleCast } from "@/components/titles/title-cast"; +import { TitleHero } from "@/components/titles/title-hero"; +import { TitleKeyboardShortcuts } from "@/components/titles/title-keyboard-shortcuts"; +import { TitleProvider } from "@/components/titles/title-provider"; +import { TitleRecommendations } from "@/components/titles/title-recommendations"; +import { + SeasonsSkeleton, + TitleSeasons, +} from "@/components/titles/title-seasons"; +import { TitleTheme } from "@/components/titles/title-theme"; +import { Skeleton } from "@/components/ui/skeleton"; +import { orpc } from "@/lib/orpc/client"; +import { getThemeCssProperties } from "@/lib/theme"; + +export const Route = createFileRoute("/_app/titles/$id")({ + loader: async ({ params, context }) => { + const [titleResult, userInfo] = await Promise.all([ + context.queryClient.ensureQueryData( + orpc.titles.detail.queryOptions({ input: { id: params.id } }), + ), + context.queryClient + .ensureQueryData( + orpc.titles.userInfo.queryOptions({ input: { id: params.id } }), + ) + .catch(() => null), + ]); + return { ...titleResult, userInfo }; + }, + head: ({ loaderData }) => { + if (!loaderData) return {}; + const { title } = loaderData; + const year = (title.releaseDate ?? title.firstAirDate)?.slice(0, 4); + return { + meta: [{ title: `${title.title}${year ? ` (${year})` : ""} — Sofa` }], + }; + }, + pendingComponent: TitleDetailLoading, + errorComponent: TitleErrorComponent, + notFoundComponent: TitleNotFound, + component: TitleDetailPage, +}); + +function TitleDetailPage() { + const { title, seasons, needsHydration, availability, cast } = + Route.useLoaderData(); + + const themeStyle = getThemeCssProperties(title.colorPalette); + + return ( +
+ } /> + + } + > + + + + {title.type === "tv" && needsHydration && ( + }> + + + )} + {title.type === "tv" && !needsHydration && seasons.length > 0 && ( + + )} + + + + + + + +
+ ); +} + +function TitleDetailLoading() { + return ( +
+ +
+ +
+
+ +
+ + + + +
+
+
+ + + +
+
+ + + +
+
+
+
+ ); +} + +function TitleErrorComponent() { + return ( +
+

+ Failed to load title +

+

+ Something went wrong while loading this title. Please try again. +

+ + Dashboard + +
+ ); +} + +function TitleNotFound() { + return ( +
+

+ 404 +

+
+

+ Title not found +

+

+ The title you're looking for doesn't exist or may have been + removed from the database. +

+
+
+ + Explore titles +
+ + + Dashboard + +
+
+ ); +} diff --git a/apps/web/src/routes/_auth.tsx b/apps/web/src/routes/_auth.tsx new file mode 100644 index 0000000..a12f819 --- /dev/null +++ b/apps/web/src/routes/_auth.tsx @@ -0,0 +1,15 @@ +import { createFileRoute, Outlet } from "@tanstack/react-router"; + +export const Route = createFileRoute("/_auth")({ + component: AuthLayout, +}); + +function AuthLayout() { + return ( +
+
+ +
+
+ ); +} diff --git a/apps/web/src/routes/_auth/login.tsx b/apps/web/src/routes/_auth/login.tsx new file mode 100644 index 0000000..8b66c90 --- /dev/null +++ b/apps/web/src/routes/_auth/login.tsx @@ -0,0 +1,32 @@ +import { createFileRoute, redirect } from "@tanstack/react-router"; +import { AuthForm } from "@/components/auth-form"; +import { authClient } from "@/lib/auth/client"; +import { client } from "@/lib/orpc/client"; + +export const Route = createFileRoute("/_auth/login")({ + beforeLoad: async () => { + const { data: session } = await authClient.getSession(); + if (session) throw redirect({ to: "/dashboard" }); + + const authConfig = await client.system.authConfig({}); + if (authConfig.userCount === 0) throw redirect({ to: "/register" }); + + return { authConfig }; + }, + component: LoginPage, +}); + +function LoginPage() { + const { authConfig } = Route.useRouteContext(); + return ( + + ); +} diff --git a/app/(auth)/register/page.tsx b/apps/web/src/routes/_auth/register.tsx similarity index 62% rename from app/(auth)/register/page.tsx rename to apps/web/src/routes/_auth/register.tsx index 8c927e4..e8cca76 100644 --- a/app/(auth)/register/page.tsx +++ b/apps/web/src/routes/_auth/register.tsx @@ -1,20 +1,24 @@ import { IconLock } from "@tabler/icons-react"; -import Link from "next/link"; -import { redirect } from "next/navigation"; +import { createFileRoute, Link, redirect } from "@tanstack/react-router"; import { AuthForm } from "@/components/auth-form"; -import { getSession } from "@/lib/auth/session"; -import { - getOidcProviderName, - isOidcConfigured, - isPasswordLoginDisabled, -} from "@/lib/config"; -import { isRegistrationOpen } from "@/lib/services/settings"; +import { authClient } from "@/lib/auth/client"; +import { client } from "@/lib/orpc/client"; -export default async function RegisterPage() { - const session = await getSession(); - if (session) redirect("/dashboard"); +export const Route = createFileRoute("/_auth/register")({ + beforeLoad: async () => { + const { data: session } = await authClient.getSession(); + if (session) throw redirect({ to: "/dashboard" }); - if (!isRegistrationOpen()) { + const authConfig = await client.system.authConfig({}); + return { authConfig }; + }, + component: RegisterPage, +}); + +function RegisterPage() { + const { authConfig } = Route.useRouteContext(); + + if (!authConfig.registrationOpen) { return (
@@ -32,7 +36,7 @@ export default async function RegisterPage() {

Sign in instead @@ -42,15 +46,13 @@ export default async function RegisterPage() { ); } - const oidcEnabled = isOidcConfigured(); - return ( ); diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx new file mode 100644 index 0000000..407e1e1 --- /dev/null +++ b/apps/web/src/routes/index.tsx @@ -0,0 +1,26 @@ +import { createFileRoute, redirect } from "@tanstack/react-router"; +import { LandingPage } from "@/components/landing-page"; +import { authClient } from "@/lib/auth/client"; +import { client } from "@/lib/orpc/client"; + +export const Route = createFileRoute("/")({ + beforeLoad: async () => { + const { data: session } = await authClient.getSession(); + if (session?.user) throw redirect({ to: "/dashboard" }); + const info = await client.system.publicInfo({}); + if (!info.tmdbConfigured) throw redirect({ to: "/setup" }); + return { info }; + }, + component: IndexPage, +}); + +function IndexPage() { + const { info } = Route.useRouteContext(); + return ( + + ); +} diff --git a/app/setup/page.tsx b/apps/web/src/routes/setup.tsx similarity index 92% rename from app/setup/page.tsx rename to apps/web/src/routes/setup.tsx index a82ae24..e734259 100644 --- a/app/setup/page.tsx +++ b/apps/web/src/routes/setup.tsx @@ -1,11 +1,9 @@ import { IconExternalLink, IconKey } from "@tabler/icons-react"; -import { redirect } from "next/navigation"; -import { connection } from "next/server"; -import { Suspense } from "react"; +import { createFileRoute, redirect } from "@tanstack/react-router"; +import { CopyButton } from "@/components/setup/copy-button"; +import { RefreshButton } from "@/components/setup/refresh-button"; import { TmdbLogo } from "@/components/tmdb-logo"; -import { isTmdbConfigured } from "@/lib/config"; -import { CopyButton } from "./_components/copy-button"; -import { RefreshButton } from "./_components/refresh-button"; +import { client } from "@/lib/orpc/client"; const steps = [ { @@ -81,18 +79,15 @@ const envSnippets = [ }, ]; -export default function SetupPage() { - return ( - - - - ); -} - -export async function SetupContent() { - await connection(); - if (isTmdbConfigured()) redirect("/"); +export const Route = createFileRoute("/setup")({ + beforeLoad: async () => { + const info = await client.system.publicInfo({}); + if (info.tmdbConfigured) throw redirect({ to: "/" }); + }, + component: SetupPage, +}); +function SetupPage() { return (
{/* Header */} diff --git a/app/globals.css b/apps/web/src/styles/globals.css similarity index 92% rename from app/globals.css rename to apps/web/src/styles/globals.css index 35f9449..6c55caa 100644 --- a/app/globals.css +++ b/apps/web/src/styles/globals.css @@ -2,6 +2,10 @@ @import "tw-animate-css"; @import "shadcn/tailwind.css"; +@import "@fontsource-variable/dm-sans"; +@import "@fontsource/dm-serif-display/400.css"; +@import "@fontsource-variable/geist-mono"; + @custom-variant dark (&:is(.dark *)); @theme inline { @@ -53,6 +57,9 @@ /* Dark cinema — warm charcoal base, amber accent light */ :root { + --font-dm-sans: "DM Sans Variable", ui-sans-serif, system-ui, sans-serif; + --font-dm-serif: "DM Serif Display", ui-serif, Georgia, serif; + --font-geist-mono: "Geist Mono Variable", ui-monospace, monospace; --background: oklch(0.13 0.006 55); --foreground: oklch(0.93 0.015 80); --card: oklch(0.19 0.008 55); @@ -95,7 +102,7 @@ @apply border-border outline-ring/50; } body { - @apply bg-background text-foreground; + @apply bg-background font-sans text-foreground antialiased; } /* Film grain texture overlay */ body::before { diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..00281ee --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["dom", "dom.iterable", "esnext"], + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "isolatedModules": true, + "paths": { + "@/*": ["./src/*"] + }, + "types": ["bun"] + }, + "include": ["src", "vite.config.ts"], + "exclude": ["node_modules", "dist"] +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..b196866 --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,32 @@ +import tailwindcss from "@tailwindcss/vite"; +import { devtools } from "@tanstack/devtools-vite"; +import { tanstackRouter } from "@tanstack/router-plugin/vite"; +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [ + devtools(), + tsconfigPaths(), + tanstackRouter({ target: "react", autoCodeSplitting: true }), + react({ + babel: { plugins: [["babel-plugin-react-compiler"]] }, + }), + tailwindcss(), + ], + server: { + port: 3000, + proxy: { + "/rpc": "http://localhost:3001", + "/api": "http://localhost:3001", + "/images": "http://localhost:3001", + }, + }, + define: { + __APP_VERSION__: JSON.stringify(process.env.APP_VERSION || "0.0.0"), + __GIT_COMMIT_SHA__: JSON.stringify( + (process.env.GIT_COMMIT_SHA || "").slice(0, 7), + ), + }, +}); diff --git a/biome.json b/biome.json index 6f086c0..e4adc80 100644 --- a/biome.json +++ b/biome.json @@ -10,11 +10,11 @@ "includes": [ "**", "!node_modules", - "!.next", "!dist", "!build", "!drizzle", - "!lib/tmdb/schema.d.ts" + "!lib/tmdb/schema.d.ts", + "!**/routeTree.gen.ts" ] }, "css": { @@ -31,7 +31,6 @@ "linter": { "enabled": true, "domains": { - "next": "recommended", "react": "recommended" }, "rules": { diff --git a/bun.lock b/bun.lock index 773634c..8f04bd0 100644 --- a/bun.lock +++ b/bun.lock @@ -4,62 +4,196 @@ "workspaces": { "": { "name": "sofa", + "devDependencies": { + "@biomejs/biome": "2.4.6", + "turbo": "2.8.15", + "typescript": "catalog:", + }, + }, + "apps/server": { + "name": "@sofa/server", + "version": "0.1.0", "dependencies": { - "@base-ui/react": "1.2.0", - "@better-auth/drizzle-adapter": "1.5.4", - "@orpc/client": "1.13.6", - "@orpc/contract": "1.13.6", + "@orpc/client": "catalog:", + "@orpc/contract": "catalog:", "@orpc/json-schema": "1.13.6", "@orpc/openapi": "1.13.6", "@orpc/server": "1.13.6", - "@orpc/tanstack-query": "1.13.6", "@orpc/zod": "1.13.6", + "@sofa/api": "workspace:*", + "@sofa/auth": "workspace:*", + "@sofa/config": "workspace:*", + "@sofa/core": "workspace:*", + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "@sofa/tmdb": "workspace:*", + "croner": "10.0.2-dev.2", + "hono": "4.12.7", + "zod": "catalog:", + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:", + }, + }, + "apps/web": { + "name": "@sofa/web", + "version": "0.1.0", + "dependencies": { + "@base-ui/react": "1.2.0", + "@fontsource-variable/dm-sans": "5.2.8", + "@fontsource-variable/geist-mono": "5.2.7", + "@fontsource/dm-serif-display": "5.2.8", + "@orpc/client": "catalog:", + "@orpc/contract": "catalog:", + "@orpc/tanstack-query": "1.13.6", "@player.style/sutro": "0.2.1", + "@sofa/api": "workspace:*", "@tabler/icons-react": "3.40.0", - "@tanstack/react-hotkeys": "0.4.0", + "@tanstack/react-hotkeys": "0.4.1", "@tanstack/react-query": "5.90.21", - "better-auth": "1.5.4", + "@tanstack/react-router": "1.166.6", + "better-auth": "catalog:", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "cmdk": "1.1.1", - "croner": "10.0.2-dev.2", - "date-fns": "4.1.0", - "drizzle-orm": "1.0.0-beta.16-ea816b6", + "date-fns": "catalog:", "jotai": "2.18.1", "media-chrome": "4.18.0", "motion": "12.35.2", - "next": "16.1.6", - "node-vibrant": "4.0.4", - "openapi-fetch": "0.17.0", "react": "19.2.4", "react-day-picker": "9.14.0", "react-dom": "19.2.4", "recharts": "3.8.0", - "shadcn": "4.0.2", + "shadcn": "4.0.3", "sonner": "2.0.7", "tailwind-merge": "3.5.0", "tw-animate-css": "1.4.0", "vaul": "1.1.2", "youtube-video-element": "1.9.0", - "zod": "4.3.6", + "zod": "catalog:", }, "devDependencies": { - "@biomejs/biome": "2.4.6", - "@tailwindcss/postcss": "4.2.1", - "@types/bun": "1.3.10", + "@tailwindcss/vite": "4.2.1", + "@tanstack/devtools-vite": "0.5.3", + "@tanstack/react-devtools": "0.9.10", + "@tanstack/react-query-devtools": "5.91.3", + "@tanstack/react-router-devtools": "1.166.6", + "@tanstack/router-plugin": "1.166.6", + "@types/bun": "catalog:", "@types/node": "25.4.0", "@types/react": "19.2.14", "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "5.1.4", "babel-plugin-react-compiler": "1.0.0", - "drizzle-kit": "1.0.0-beta.16-ea816b6", "tailwindcss": "4.2.1", - "typescript": "5.9.3", + "typescript": "catalog:", + "vite": "7.3.1", + "vite-tsconfig-paths": "6.1.1", + }, + }, + "packages/api": { + "name": "@sofa/api", + "version": "0.1.0", + "dependencies": { + "@orpc/contract": "catalog:", + "zod": "catalog:", + }, + "devDependencies": { + "typescript": "catalog:", + }, + }, + "packages/auth": { + "name": "@sofa/auth", + "version": "0.1.0", + "dependencies": { + "@better-auth/drizzle-adapter": "1.5.4", + "@sofa/core": "workspace:*", + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "better-auth": "catalog:", + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:", + }, + }, + "packages/config": { + "name": "@sofa/config", + "version": "0.1.0", + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:", + }, + }, + "packages/core": { + "name": "@sofa/core", + "version": "0.1.0", + "dependencies": { + "@sofa/api": "workspace:*", + "@sofa/config": "workspace:*", + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "@sofa/tmdb": "workspace:*", + "date-fns": "catalog:", + "node-vibrant": "4.0.4", + "zod": "catalog:", + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:", + }, + }, + "packages/db": { + "name": "@sofa/db", + "version": "0.1.0", + "dependencies": { + "@sofa/config": "workspace:*", + "@sofa/logger": "workspace:*", + "drizzle-orm": "1.0.0-beta.16-ea816b6", + }, + "devDependencies": { + "@types/bun": "catalog:", + "drizzle-kit": "1.0.0-beta.16-ea816b6", + "typescript": "catalog:", + }, + }, + "packages/logger": { + "name": "@sofa/logger", + "version": "0.1.0", + "dependencies": { + "pino": "10.3.1", + "pino-pretty": "13.1.3", + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:", + }, + }, + "packages/tmdb": { + "name": "@sofa/tmdb", + "version": "0.1.0", + "dependencies": { + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "openapi-fetch": "0.17.0", + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:", }, }, }, + "catalog": { + "@orpc/client": "1.13.6", + "@orpc/contract": "1.13.6", + "@types/bun": "1.3.10", + "better-auth": "1.5.4", + "date-fns": "4.1.0", + "typescript": "5.9.3", + "zod": "4.3.6", + }, "packages": { - "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - "@antfu/ni": ["@antfu/ni@25.0.0", "", { "dependencies": { "ansis": "^4.0.0", "fzf": "^0.5.2", "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" }, "bin": { "na": "bin/na.mjs", "ni": "bin/ni.mjs", "nr": "bin/nr.mjs", "nci": "bin/nci.mjs", "nlx": "bin/nlx.mjs", "nun": "bin/nun.mjs", "nup": "bin/nup.mjs" } }, "sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA=="], "@azure-rest/core-client": ["@azure-rest/core-client@2.5.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0", "@azure/core-tracing": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A=="], @@ -142,6 +276,10 @@ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="], + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="], "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], @@ -278,6 +416,12 @@ "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], + "@fontsource-variable/dm-sans": ["@fontsource-variable/dm-sans@5.2.8", "", {}, "sha512-AxkvMTvNWgfrmlyjiV05vlHYJa+nRQCf1EfvIrQAPBpFJW0O9VTz7oAFr9S3lvbWdmnFoBk7yFqQL86u64nl2g=="], + + "@fontsource-variable/geist-mono": ["@fontsource-variable/geist-mono@5.2.7", "", {}, "sha512-ZKlZ5sjtalb2TwXKs400mAGDlt/+2ENLNySPx0wTz3bP3mWARCsUW+rpxzZc7e05d2qGch70pItt3K4qttbIYA=="], + + "@fontsource/dm-serif-display": ["@fontsource/dm-serif-display@5.2.8", "", {}, "sha512-GYSDSlGU6vyhv9a5MwaiVNf9HCuSVpK8hEFRyG4NNDHCDeHiX7YHDAcWsaoLKKcfXLgWG9YkBkk9T3SxM4rAjQ=="], + "@hono/node-server": ["@hono/node-server@1.19.11", "", { "peerDependencies": { "hono": "^4" } }, "sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g=="], "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], @@ -450,6 +594,8 @@ "@orpc/zod": ["@orpc/zod@1.13.6", "", { "dependencies": { "@orpc/json-schema": "1.13.6", "@orpc/openapi": "1.13.6", "@orpc/shared": "1.13.6", "escape-string-regexp": "^5.0.0", "wildcard-match": "^5.1.4" }, "peerDependencies": { "@orpc/contract": "1.13.6", "@orpc/server": "1.13.6", "zod": ">=3.25.0" } }, "sha512-Sj3KQbtV1Zuy2QnSs3NrFBnuZfttmWnXb39gLarD3rEKaxE4Mugv2yXIZ7vnBOj5cL24V+ysgharU/Dl7Ro0yA=="], + "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], + "@player.style/sutro": ["@player.style/sutro@0.2.1", "", { "peerDependencies": { "media-chrome": ">=1.0.0" } }, "sha512-vWtFAdu4z3+1HcDPAriX+41q+bYSOgM898XO4TxEgoNyeaBq/Aoz2cRgWFpsWaK368+n7uWCbO5n2vAszN5fhw=="], "@prisma/client": ["@prisma/client@7.4.2", "", { "dependencies": { "@prisma/client-runtime-utils": "7.4.2" }, "peerDependencies": { "prisma": "*", "typescript": ">=5.4.0" }, "optionalPeers": ["prisma", "typescript"] }, "sha512-ts2mu+cQHriAhSxngO3StcYubBGTWDtu/4juZhXCUKOwgh26l+s4KD3vT2kMUzFyrYnll9u/3qWrtzRv9CGWzA=="], @@ -510,10 +656,92 @@ "@reduxjs/toolkit": ["@reduxjs/toolkit@2.11.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" }, "optionalPeers": ["react", "react-redux"] }, "sha512-Kd6kAHTA6/nUpp8mySPqj3en3dm0tdMIgbttnQ1xFMVpufoj+ADi8pXLBsd4xzTRHQa7t/Jv8W5UnCuW4kuWMQ=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.59.0", "", { "os": "android", "cpu": "arm" }, "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.59.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.59.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.59.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.59.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.59.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.59.0", "", { "os": "linux", "cpu": "arm" }, "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.59.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.59.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.59.0", "", { "os": "linux", "cpu": "none" }, "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.59.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.59.0", "", { "os": "linux", "cpu": "x64" }, "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.59.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.59.0", "", { "os": "none", "cpu": "arm64" }, "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.59.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.59.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="], + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + "@sofa/api": ["@sofa/api@workspace:packages/api"], + + "@sofa/auth": ["@sofa/auth@workspace:packages/auth"], + + "@sofa/config": ["@sofa/config@workspace:packages/config"], + + "@sofa/core": ["@sofa/core@workspace:packages/core"], + + "@sofa/db": ["@sofa/db@workspace:packages/db"], + + "@sofa/logger": ["@sofa/logger@workspace:packages/logger"], + + "@sofa/server": ["@sofa/server@workspace:apps/server"], + + "@sofa/tmdb": ["@sofa/tmdb@workspace:packages/tmdb"], + + "@sofa/web": ["@sofa/web@workspace:apps/web"], + + "@solid-primitives/event-listener": ["@solid-primitives/event-listener@2.4.5", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA=="], + + "@solid-primitives/keyboard": ["@solid-primitives/keyboard@1.3.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ=="], + + "@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/static-store": "^0.1.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw=="], + + "@solid-primitives/rootless": ["@solid-primitives/rootless@1.5.3", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA=="], + + "@solid-primitives/static-store": ["@solid-primitives/static-store@0.1.3", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ=="], + + "@solid-primitives/utils": ["@solid-primitives/utils@6.4.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A=="], + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], @@ -554,26 +782,70 @@ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.1", "", { "os": "win32", "cpu": "x64" }, "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ=="], - "@tailwindcss/postcss": ["@tailwindcss/postcss@4.2.1", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "postcss": "^8.5.6", "tailwindcss": "4.2.1" } }, "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw=="], + "@tailwindcss/vite": ["@tailwindcss/vite@4.2.1", "", { "dependencies": { "@tailwindcss/node": "4.2.1", "@tailwindcss/oxide": "4.2.1", "tailwindcss": "4.2.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" } }, "sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w=="], - "@tanstack/hotkeys": ["@tanstack/hotkeys@0.4.0", "", { "dependencies": { "@tanstack/store": "^0.9.2" } }, "sha512-VH+jGC5pszD1AmcDJKMcV52AETQVBKiALomY9Xgo13GihTdyEeEwBnS7RI6WDHIV03UFcWpCfwu2k8fBaKN7bw=="], + "@tanstack/devtools": ["@tanstack/devtools@0.10.11", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/keyboard": "^1.3.3", "@solid-primitives/resize-observer": "^2.1.3", "@tanstack/devtools-client": "0.0.6", "@tanstack/devtools-event-bus": "0.4.1", "@tanstack/devtools-ui": "0.5.0", "clsx": "^2.1.1", "goober": "^2.1.16", "solid-js": "^1.9.9" } }, "sha512-Nk1rHsv6S/5Krzz+uL5jldW9gKb3s6rkkVl1L9oVYHNClKthbrk2hGef4Di6yj449QIOqVExTdDujjQ4roq1dg=="], + + "@tanstack/devtools-client": ["@tanstack/devtools-client@0.0.6", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.4.1" } }, "sha512-f85ZJXJnDIFOoykG/BFIixuAevJovCvJF391LPs6YjBAPhGYC50NWlx1y4iF/UmK5/cCMx+/JqI5SBOz7FanQQ=="], + + "@tanstack/devtools-event-bus": ["@tanstack/devtools-event-bus@0.4.1", "", { "dependencies": { "ws": "^8.18.3" } }, "sha512-cNnJ89Q021Zf883rlbBTfsaxTfi2r73/qejGtyTa7ksErF3hyDyAq1aTbo5crK9dAL7zSHh9viKY1BtMls1QOA=="], + + "@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.4.1", "", {}, "sha512-GRxmPw4OHZ2oZeIEUkEwt/NDvuEqzEYRAjzUVMs+I0pd4C7k1ySOiuJK2CqF+K/yEAR3YZNkW3ExrpDarh9Vwg=="], + + "@tanstack/devtools-ui": ["@tanstack/devtools-ui@0.5.0", "", { "dependencies": { "clsx": "^2.1.1", "dayjs": "^1.11.19", "goober": "^2.1.16", "solid-js": "^1.9.9" } }, "sha512-nNZ14054n31fWB61jtWhZYLRdQ3yceCE3G/RINoINUB0RqIGZAIm9DnEDwOTAOfqt4/a/D8vNk8pJu6RQUp74g=="], + + "@tanstack/devtools-vite": ["@tanstack/devtools-vite@0.5.3", "", { "dependencies": { "@babel/core": "^7.28.4", "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.4", "@babel/traverse": "^7.28.4", "@babel/types": "^7.28.4", "@tanstack/devtools-client": "0.0.6", "@tanstack/devtools-event-bus": "0.4.1", "chalk": "^5.6.2", "launch-editor": "^2.11.1", "picomatch": "^4.0.3" }, "peerDependencies": { "vite": "^6.0.0 || ^7.0.0" } }, "sha512-S7VK2GthBrEkto0UVODx31IAvxTFUK0RGH6aZEZixsohYTytTdrwcLmPKEREwFrRN8Qc2mIqfBhENPbRG1RFXA=="], + + "@tanstack/history": ["@tanstack/history@1.161.4", "", {}, "sha512-Kp/WSt411ZWYvgXy6uiv5RmhHrz9cAml05AQPrtdAp7eUqvIDbMGPnML25OKbzR3RJ1q4wgENxDTvlGPa9+Mww=="], + + "@tanstack/hotkeys": ["@tanstack/hotkeys@0.4.1", "", { "dependencies": { "@tanstack/store": "^0.9.2" } }, "sha512-EGHqcdKP2jzy0dEkahA3ABtEXohMqPlU3Ac04sBQjgesJqr9xWuesJotOfWPh3P68kQQg8krNAtFTydIN3+WSw=="], "@tanstack/query-core": ["@tanstack/query-core@5.90.20", "", {}, "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg=="], - "@tanstack/react-hotkeys": ["@tanstack/react-hotkeys@0.4.0", "", { "dependencies": { "@tanstack/hotkeys": "0.4.0", "@tanstack/react-store": "^0.9.2" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-ttAaGZZtkLOx30xoS3zNCrGvbA93cqvoWu7kaAFyJrHuxMcnswhtEAk4xxz2QbCL0XoQ5uB6fxf6n/PbCZ+pdQ=="], + "@tanstack/query-devtools": ["@tanstack/query-devtools@5.93.0", "", {}, "sha512-+kpsx1NQnOFTZsw6HAFCW3HkKg0+2cepGtAWXjiiSOJJ1CtQpt72EE2nyZb+AjAbLRPoeRmPJ8MtQd8r8gsPdg=="], + + "@tanstack/react-devtools": ["@tanstack/react-devtools@0.9.10", "", { "dependencies": { "@tanstack/devtools": "0.10.11" }, "peerDependencies": { "@types/react": ">=16.8", "@types/react-dom": ">=16.8", "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-WKFU8SXN7DLM7EyD2aUAhmk7JGNeONWhQozAH2qDCeOjyc3Yzxs4BxeoyKMYyEiX/eCp8ZkMTf/pJX6vm2LGeA=="], + + "@tanstack/react-hotkeys": ["@tanstack/react-hotkeys@0.4.1", "", { "dependencies": { "@tanstack/hotkeys": "0.4.1", "@tanstack/react-store": "^0.9.2" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-hFh/kKQODn4kSytfIsEE/Vf1AaAb+NAFi4lx+OB49NmKY5z/BNH1/uEdYlVgOEvnDm4QrCISIMBOVpMgK5QNQg=="], "@tanstack/react-query": ["@tanstack/react-query@5.90.21", "", { "dependencies": { "@tanstack/query-core": "5.90.20" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg=="], + "@tanstack/react-query-devtools": ["@tanstack/react-query-devtools@5.91.3", "", { "dependencies": { "@tanstack/query-devtools": "5.93.0" }, "peerDependencies": { "@tanstack/react-query": "^5.90.20", "react": "^18 || ^19" } }, "sha512-nlahjMtd/J1h7IzOOfqeyDh5LNfG0eULwlltPEonYy0QL+nqrBB+nyzJfULV+moL7sZyxc2sHdNJki+vLA9BSA=="], + + "@tanstack/react-router": ["@tanstack/react-router@1.166.6", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/react-store": "^0.9.1", "@tanstack/router-core": "1.166.6", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-lfymPCfTkLQaNj/KIPElt+6B9REwPw2/Of3KtMwhNINs7h2xFQMSAOYk+ItCv8i93lBczlg89BRHtRS99qmzyA=="], + + "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.166.6", "", { "dependencies": { "@tanstack/router-devtools-core": "1.166.6" }, "peerDependencies": { "@tanstack/react-router": "^1.166.6", "@tanstack/router-core": "^1.166.6", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-TheVyOgo8ljD8wHHLceFsnKrX7nhTIQv9WokSrPjNTP4H3synUMADxh8yZafVYdr6lS2CBvldd5s7JI8DcwBUg=="], + "@tanstack/react-store": ["@tanstack/react-store@0.9.2", "", { "dependencies": { "@tanstack/store": "0.9.2", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Vt5usJE5sHG/cMechQfmwvwne6ktGCELe89Lmvoxe3LKRoFrhPa8OCKWs0NliG8HTJElEIj7PLtaBQIcux5pAQ=="], + "@tanstack/router-core": ["@tanstack/router-core@1.166.6", "", { "dependencies": { "@tanstack/history": "1.161.4", "@tanstack/store": "^0.9.1", "cookie-es": "^2.0.0", "seroval": "^1.4.2", "seroval-plugins": "^1.4.2", "tiny-invariant": "^1.3.3", "tiny-warning": "^1.0.3" } }, "sha512-SwVPMQxjoY4jwiNgD9u5kDFp/iSaf3wgf1t93xRCC6qDHmv/xLaawhvwEPNIJaPepWuSYRpywpJWH9hGlBqVbw=="], + + "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.166.6", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@tanstack/router-core": "^1.166.6", "csstype": "^3.0.10" }, "optionalPeers": ["csstype"] }, "sha512-ndPnCDeSGW3bd33u3EMe3+EJGLiFOHZaIKRJRLdZClOB6J6pvzKMELJgizBtjaR6X56FdCsC/STgjPkOeR9paA=="], + + "@tanstack/router-generator": ["@tanstack/router-generator@1.166.6", "", { "dependencies": { "@tanstack/router-core": "1.166.6", "@tanstack/router-utils": "1.161.4", "@tanstack/virtual-file-routes": "1.161.4", "prettier": "^3.5.0", "recast": "^0.23.11", "source-map": "^0.7.4", "tsx": "^4.19.2", "zod": "^3.24.2" } }, "sha512-D7Z6oLP2IfflXUzOOxIgeCD8v3/SXU//cgBon0pbF13HkKdf9Zlt97kQqcaOkbnruJJ6i5xtUIsoAQbMmj+EsQ=="], + + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.166.6", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.166.6", "@tanstack/router-generator": "1.166.6", "@tanstack/router-utils": "1.161.4", "@tanstack/virtual-file-routes": "1.161.4", "chokidar": "^3.6.0", "unplugin": "^2.1.2", "zod": "^3.24.2" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", "@tanstack/react-router": "^1.166.6", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0", "vite-plugin-solid": "^2.11.10", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-07ZwOMNDlKIoaRtrfP5zO3VfqXNg2Zm7qvqZOBaTbbqgMvaKclW0ylqakweXtDwiNs9GPf/+lH/xyc+CgLGUyg=="], + + "@tanstack/router-utils": ["@tanstack/router-utils@1.161.4", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-r8TpjyIZoqrXXaf2DDyjd44gjGBoyE+/oEaaH68yLI9ySPO1gUWmQENZ1MZnmBnpUGN24NOZxdjDLc8npK0SAw=="], + "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="], + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.161.4", "", {}, "sha512-42WoRePf8v690qG8yGRe/YOh+oHni9vUaUUfoqlS91U2scd3a5rkLtVsc6b7z60w3RogH0I00vdrC5AaeiZ18w=="], + "@tediousjs/connection-string": ["@tediousjs/connection-string@0.5.0", "", {}, "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ=="], "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="], "@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="], + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + "@types/bun": ["@types/bun@1.3.10", "", { "dependencies": { "bun-types": "1.3.10" } }, "sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ=="], "@types/d3-array": ["@types/d3-array@3.2.2", "", {}, "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw=="], @@ -594,6 +866,8 @@ "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/mssql": ["@types/mssql@9.1.9", "", { "dependencies": { "@types/node": "*", "tarn": "^3.0.1", "tedious": "*" } }, "sha512-P0nCgw6vzY23UxZMnbI4N7fnLGANt4LI4yvxze1paPj+LuN28cFv5EI+QidP8udnId/BKhkcRhm/BleNsjK65A=="], "@types/node": ["@types/node@25.4.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw=="], @@ -638,10 +912,14 @@ "@vibrant/worker": ["@vibrant/worker@4.0.4", "", { "dependencies": { "@vibrant/types": "^4.0.4" } }, "sha512-Q/R6PYhSMWCXEk/IcXbWIzIu7Z4b58ABkGvcdF8Y+q/7g+KnpxKW5x/jfQ/6ciyYSby13wZZoEdNr3QQVgsdBQ=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@5.1.4", "", { "dependencies": { "@babel/core": "^7.29.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-rc.3", "@types/babel__core": "^7.20.5", "react-refresh": "^0.18.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-VIcFLdRi/VYRU8OL/puL7QXMYafHmqOnwTZY50U1JPlCNj30PxCMx65c494b1K9be9hX83KVt0+gTEwTWLqToA=="], + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], + "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], @@ -656,14 +934,20 @@ "any-base": ["any-base@1.1.0", "", {}, "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg=="], + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], + "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], + "aws-ssl-profiles": ["aws-ssl-profiles@1.1.2", "", {}, "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g=="], + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], + "babel-plugin-react-compiler": ["babel-plugin-react-compiler@1.0.0", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw=="], "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], @@ -676,6 +960,8 @@ "better-call": ["better-call@1.3.2", "", { "dependencies": { "@better-auth/utils": "^0.3.1", "@better-fetch/fetch": "^1.1.21", "rou3": "^0.7.12", "set-cookie-parser": "^3.0.1" }, "peerDependencies": { "zod": "^4.0.0" }, "optionalPeers": ["zod"] }, "sha512-4cZIfrerDsNTn3cm+MhLbUePN0gdwkhSXEuG7r/zuQ8c/H7iU0/jSK5TD3FW7U0MgKHce/8jGpPYNO4Ve+4NBw=="], + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + "bl": ["bl@6.1.6", "", { "dependencies": { "@types/readable-stream": "^4.0.0", "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^4.2.0" } }, "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg=="], "bmp-js": ["bmp-js@0.1.0", "", {}, "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw=="], @@ -690,7 +976,7 @@ "bson": ["bson@7.2.0", "", {}, "sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ=="], - "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], @@ -716,7 +1002,7 @@ "chevrotain": ["chevrotain@10.5.0", "", { "dependencies": { "@chevrotain/cst-dts-gen": "10.5.0", "@chevrotain/gast": "10.5.0", "@chevrotain/types": "10.5.0", "@chevrotain/utils": "10.5.0", "lodash": "4.17.21", "regexp-to-ast": "0.5.0" } }, "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A=="], - "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], @@ -742,6 +1028,8 @@ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], @@ -756,6 +1044,8 @@ "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "cookie-es": ["cookie-es@2.0.0", "", {}, "sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg=="], + "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="], @@ -798,6 +1088,10 @@ "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="], + "dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="], + + "dayjs": ["dayjs@1.11.19", "", {}, "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], @@ -852,6 +1146,8 @@ "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + "enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="], "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], @@ -900,10 +1196,14 @@ "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + "fast-copy": ["fast-copy@4.0.2", "", {}, "sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], @@ -932,6 +1232,8 @@ "fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="], @@ -958,12 +1260,18 @@ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], + "gifwrap": ["gifwrap@0.10.1", "", { "dependencies": { "image-q": "^4.0.0", "omggif": "^1.0.10" } }, "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw=="], "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="], + + "goober": ["goober@2.1.18", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], @@ -980,7 +1288,9 @@ "headers-polyfill": ["headers-polyfill@4.0.3", "", {}, "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ=="], - "hono": ["hono@4.12.5", "", {}, "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg=="], + "help-me": ["help-me@5.0.0", "", {}, "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg=="], + + "hono": ["hono@4.12.7", "", {}, "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw=="], "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], @@ -1014,6 +1324,8 @@ "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -1048,6 +1360,8 @@ "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="], + "isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="], "isomorphic-fetch": ["isomorphic-fetch@3.0.0", "", { "dependencies": { "node-fetch": "^2.6.1", "whatwg-fetch": "^3.4.1" } }, "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA=="], @@ -1058,6 +1372,8 @@ "jotai": ["jotai@2.18.1", "", { "peerDependencies": { "@babel/core": ">=7.0.0", "@babel/template": ">=7.0.0", "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@babel/core", "@babel/template", "@types/react", "react"] }, "sha512-e0NOzK+yRFwHo7DOp0DS0Ycq74KMEAObDWFGmfEL28PD9nLqBTt3/Ug7jf9ca72x0gC9LQZG9zH+0ISICmy3iA=="], + "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], + "jpeg-js": ["jpeg-js@0.4.4", "", {}, "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg=="], "js-md4": ["js-md4@0.3.2", "", {}, "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA=="], @@ -1090,6 +1406,8 @@ "kysely": ["kysely@0.28.11", "", {}, "sha512-zpGIFg0HuoC893rIjYX1BETkVWdDnzTzF5e0kWXJFg5lE0k1/LfNWBejrcnOFu8Q2Rfq/hTDTU7XLUM8QOrpzg=="], + "launch-editor": ["launch-editor@2.13.1", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-lPSddlAAluRKJ7/cjRFoXUFzaX7q/YKI7yPHuEvSJVqoXvFnJov1/Ud87Aa4zULIbA9Nja4mSPK8l0z/7eV2wA=="], + "lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.31.1", "", { "os": "android", "cpu": "arm64" }, "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg=="], @@ -1216,6 +1534,8 @@ "node-vibrant": ["node-vibrant@4.0.4", "", { "dependencies": { "@types/node": "^18.15.3", "@vibrant/core": "^4.0.4", "@vibrant/generator-default": "^4.0.4", "@vibrant/image-browser": "^4.0.4", "@vibrant/image-node": "^4.0.4", "@vibrant/quantizer-mmcq": "^4.0.4" } }, "sha512-hA/pUXBE9TJ41G9FlTkzeqD5JdxgvvPGYZb/HNpdkaxxXUEnP36imSolZ644JuPun+lTd+FpWWtBpTYdp2noQA=="], + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], "nypm": ["nypm@0.6.5", "", { "dependencies": { "citty": "^0.2.0", "pathe": "^2.0.3", "tinyexec": "^1.0.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ=="], @@ -1230,6 +1550,8 @@ "omggif": ["omggif@1.0.10", "", {}, "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw=="], + "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="], + "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], @@ -1276,6 +1598,14 @@ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "pino": ["pino@10.3.1", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^4.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg=="], + + "pino-abstract-transport": ["pino-abstract-transport@3.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="], + + "pino-pretty": ["pino-pretty@13.1.3", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^4.0.0", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg=="], + + "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="], + "pixelmatch": ["pixelmatch@4.0.2", "", { "dependencies": { "pngjs": "^3.0.0" }, "bin": { "pixelmatch": "bin/pixelmatch" } }, "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA=="], "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], @@ -1292,18 +1622,24 @@ "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], + "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], "prisma": ["prisma@7.4.2", "", { "dependencies": { "@prisma/config": "7.4.2", "@prisma/dev": "0.20.0", "@prisma/engines": "7.4.2", "@prisma/studio-core": "0.13.1", "mysql2": "3.15.3", "postgres": "3.4.7" }, "peerDependencies": { "better-sqlite3": ">=9.0.0", "typescript": ">=5.4.0" }, "optionalPeers": ["better-sqlite3", "typescript"], "bin": { "prisma": "build/index.js" } }, "sha512-2bP8Ruww3Q95Z2eH4Yqh4KAENRsj/SxbdknIVBfd6DmjPwmpsC4OVFMLOeHt6tM3Amh8ebjvstrUz3V/hOe1dA=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], + "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], + "pump": ["pump@3.0.4", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], @@ -1312,6 +1648,8 @@ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], + "radash": ["radash@12.1.1", "", {}, "sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA=="], "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], @@ -1330,6 +1668,8 @@ "react-redux": ["react-redux@9.2.0", "", { "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "@types/react": "^18.2.25 || ^19", "react": "^18.0 || ^19", "redux": "^5.0.0" }, "optionalPeers": ["@types/react", "redux"] }, "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g=="], + "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], @@ -1340,7 +1680,9 @@ "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="], - "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], @@ -1364,6 +1706,8 @@ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], @@ -1374,6 +1718,8 @@ "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="], + "rou3": ["rou3@0.7.12", "", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="], "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], @@ -1384,23 +1730,31 @@ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], "seq-queue": ["seq-queue@0.0.5", "", {}, "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="], + "seroval": ["seroval@1.5.1", "", {}, "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA=="], + + "seroval-plugins": ["seroval-plugins@1.5.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw=="], + "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], "set-cookie-parser": ["set-cookie-parser@3.0.1", "", {}, "sha512-n7Z7dXZhJbwuAHhNzkTti6Aw9QDDjZtm3JTpTGATIdNzdQz5GuFs22w90BcvF4INfnrL5xrX3oGsuqO5Dx3A1Q=="], "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - "shadcn": ["shadcn@4.0.2", "", { "dependencies": { "@antfu/ni": "^25.0.0", "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "https-proxy-agent": "^7.0.6", "kleur": "^4.1.5", "msw": "^2.10.4", "node-fetch": "^3.3.2", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-U6BxywcVt5Vy+iLdjoyWTPcuz2RQNad09tjJsW8hyKtxlx7VAvzHIvoNxvXN+gxWt/HX8kt/cVNk8AXcmPUaNQ=="], + "shadcn": ["shadcn@4.0.3", "", { "dependencies": { "@antfu/ni": "^25.0.0", "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "https-proxy-agent": "^7.0.6", "kleur": "^4.1.5", "msw": "^2.10.4", "node-fetch": "^3.3.2", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-dWN9aw+fszDEMPdRqAVmv5xgrsO60r5XDinHvrCjyfSW/FOiOrJJpYHGDI67+ItIwhTGHK1cXCM5YPAWVOsUtw=="], "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], @@ -1408,6 +1762,8 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], @@ -1420,14 +1776,20 @@ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + "solid-js": ["solid-js@1.9.11", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q=="], + + "sonic-boom": ["sonic-boom@4.2.1", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q=="], + "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="], - "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "sparse-bitfield": ["sparse-bitfield@3.0.3", "", { "dependencies": { "memory-pager": "^1.0.2" } }, "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ=="], + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], "sqlstring": ["sqlstring@2.3.3", "", {}, "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="], @@ -1452,6 +1814,8 @@ "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], + "strtok3": ["strtok3@6.3.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw=="], "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="], @@ -1470,14 +1834,20 @@ "tedious": ["tedious@18.6.2", "", { "dependencies": { "@azure/core-auth": "^1.7.2", "@azure/identity": "^4.2.1", "@azure/keyvault-keys": "^4.4.0", "@js-joda/core": "^5.6.1", "@types/node": ">=18", "bl": "^6.0.11", "iconv-lite": "^0.6.3", "js-md4": "^0.3.2", "native-duplexpair": "^1.0.0", "sprintf-js": "^1.1.3" } }, "sha512-g7jC56o3MzLkE3lHkaFe2ZdOVFBahq5bsB60/M4NYUbocw/MCrS89IOEQUFr+ba6pb8ZHczZ/VqCyYeYq0xBAg=="], + "thread-stream": ["thread-stream@4.0.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA=="], + "timm": ["timm@1.7.1", "", {}, "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw=="], "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + "tinycolor2": ["tinycolor2@1.6.0", "", {}, "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="], "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "tldts": ["tldts@7.0.25", "", { "dependencies": { "tldts-core": "^7.0.25" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w=="], "tldts-core": ["tldts-core@7.0.25", "", {}, "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw=="], @@ -1494,10 +1864,28 @@ "ts-morph": ["ts-morph@26.0.0", "", { "dependencies": { "@ts-morph/common": "~0.27.0", "code-block-writer": "^13.0.3" } }, "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug=="], + "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], + "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], + + "turbo": ["turbo@2.8.15", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.15", "turbo-darwin-arm64": "2.8.15", "turbo-linux-64": "2.8.15", "turbo-linux-arm64": "2.8.15", "turbo-windows-64": "2.8.15", "turbo-windows-arm64": "2.8.15" }, "bin": { "turbo": "bin/turbo" } }, "sha512-ERZf7pKOR155NKs/PZt1+83NrSEJfUL7+p9/TGZg/8xzDVMntXEFQlX4CsNJQTyu4h3j+dZYiQWOOlv5pssuHQ=="], + + "turbo-darwin-64": ["turbo-darwin-64@2.8.15", "", { "os": "darwin", "cpu": "x64" }, "sha512-EElCh+Ltxex9lXYrouV3hHjKP3HFP31G91KMghpNHR/V99CkFudRcHcnWaorPbzAZizH1m8o2JkLL8rptgb8WQ=="], + + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.15", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ORmvtqHiHwvNynSWvLIleyU8dKtwQ4ILk39VsEwfKSEzSHWYWYxZhBmD9GAGRPlNl7l7S1irrziBlDEGVpq+vQ=="], + + "turbo-linux-64": ["turbo-linux-64@2.8.15", "", { "os": "linux", "cpu": "x64" }, "sha512-Bk1E61a+PCWUTfhqfXFlhEJMLp6nak0J0Qt14IZX1og1zyaiBLkM6M1GQFbPpiWfbUcdLwRaYQhO0ySB07AJ8w=="], + + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.15", "", { "os": "linux", "cpu": "arm64" }, "sha512-3BX0Vk+XkP0uiZc8pkjQGNsAWjk5ojC53bQEMp6iuhSdWpEScEFmcT6p7DL7bcJmhP2mZ1HlAu0A48wrTGCtvg=="], + + "turbo-windows-64": ["turbo-windows-64@2.8.15", "", { "os": "win32", "cpu": "x64" }, "sha512-m14ogunMF+grHZ1jzxSCO6q0gEfF1tmr+0LU+j1QNd/M1X33tfKnQqmpkeUR/REsGjfUlkQlh6PAzqlT3cA3Pg=="], + + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.15", "", { "os": "win32", "cpu": "arm64" }, "sha512-HWh6dnzhl7nu5gRwXeqP61xbyDBNmQ4UCeWNa+si4/6RAtHlKEcZTNs7jf4U+oqBnbtv4uxbKZZPf/kN0EK4+A=="], + "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], "type-fest": ["type-fest@5.4.4", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw=="], @@ -1514,6 +1902,8 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], + "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], + "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="], "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], @@ -1540,10 +1930,16 @@ "victory-vendor": ["victory-vendor@37.3.6", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ=="], + "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + + "vite-tsconfig-paths": ["vite-tsconfig-paths@6.1.1", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" } }, "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg=="], + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="], + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="], "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="], @@ -1556,6 +1952,8 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="], + "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], @@ -1586,7 +1984,7 @@ "@ecies/ciphers/@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="], - "@jimp/core/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "@modelcontextprotocol/sdk/hono": ["hono@4.12.5", "", {}, "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg=="], "@noble/curves/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], @@ -1624,12 +2022,22 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "@tanstack/router-generator/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "@tanstack/router-plugin/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "@types/mssql/@types/node": ["@types/node@25.3.5", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA=="], "@types/readable-stream/@types/node": ["@types/node@25.3.5", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA=="], + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "bl/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + "bun-types/@types/node": ["@types/node@25.3.5", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA=="], + "c12/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + "c12/dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="], "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -1672,6 +2080,12 @@ "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], @@ -1684,6 +2098,10 @@ "tedious/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], + "tsx/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + + "vite/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1704,6 +2122,8 @@ "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + "c12/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -1714,6 +2134,110 @@ "node-vibrant/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + + "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + + "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + + "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], diff --git a/bunfig.toml b/bunfig.toml index 786a377..d186541 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,2 +1,3 @@ [test] -preload = ["./test/preload.ts"] +root = "packages/core" +preload = ["./packages/core/test/preload.ts"] diff --git a/components/query-provider.tsx b/components/query-provider.tsx deleted file mode 100644 index 9490d2b..0000000 --- a/components/query-provider.tsx +++ /dev/null @@ -1,9 +0,0 @@ -"use client"; - -import { QueryClientProvider } from "@tanstack/react-query"; -import { getQueryClient } from "@/lib/query-client"; - -export function QueryProvider({ children }: { children: React.ReactNode }) { - const client = getQueryClient(); - return {children}; -} diff --git a/instrumentation.ts b/instrumentation.ts deleted file mode 100644 index 1f955b0..0000000 --- a/instrumentation.ts +++ /dev/null @@ -1,48 +0,0 @@ -export async function onRequestError() { - // Required by Next.js instrumentation -} - -export async function register() { - if (process.env.NEXT_RUNTIME === "nodejs") { - const { createLogger } = await import("@/lib/logger"); - const log = createLogger("server"); - - // Ensure image cache directories exist (all environments) - const { ensureImageDirs, imageCacheEnabled } = await import( - "@/lib/services/image-cache" - ); - if (imageCacheEnabled()) { - await ensureImageDirs(); - } - - // Ensure backup directory exists - const { ensureBackupDir } = await import("@/lib/services/backup"); - await ensureBackupDir(); - - // Run database migrations on startup - const { runMigrations } = await import("@/lib/db/migrate"); - runMigrations(); - - // Initialize oRPC server-side client for SSR - await import("@/lib/orpc/client.server"); - - // Initialize job scheduler - const { startJobs, stopJobs } = await import("@/lib/cron"); - startJobs(); - - // Graceful shutdown — stop jobs and close DB on container stop - const { closeDatabase } = await import("@/lib/db/client"); - - const shutdown = () => { - log.info("Stopping scheduler..."); - stopJobs(); - log.info("Closing database..."); - closeDatabase(); - log.info("Clean shutdown complete"); - process.exit(0); - }; - - process.on("SIGTERM", shutdown); - process.on("SIGINT", shutdown); - } -} diff --git a/lib/auth/session.ts b/lib/auth/session.ts deleted file mode 100644 index 2b81c37..0000000 --- a/lib/auth/session.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { headers } from "next/headers"; -import { cache } from "react"; -import { auth } from "./server"; - -/** - * Cached session getter — deduplicated per request via React.cache(). - * Use this instead of calling auth.api.getSession() directly in server - * components, route handlers, and server actions to avoid redundant - * session lookups within a single render pass. - */ -export const getSession = cache(async () => { - return auth.api.getSession({ headers: await headers() }); -}); - -export async function requireSession() { - const session = await getSession(); - if (!session) throw new Error("Unauthorized"); - return session; -} - -export async function requireAdmin() { - const session = await requireSession(); - if (session.user.role !== "admin") throw new Error("Forbidden"); - return session; -} diff --git a/lib/logger.ts b/lib/logger.ts deleted file mode 100644 index a3e8078..0000000 --- a/lib/logger.ts +++ /dev/null @@ -1,27 +0,0 @@ -const LEVELS = { error: 0, warn: 1, info: 2, debug: 3 } as const; -type Level = keyof typeof LEVELS; - -const currentLevel: Level = - (process.env.LOG_LEVEL as Level) in LEVELS - ? (process.env.LOG_LEVEL as Level) - : "info"; - -export function createLogger(prefix: string) { - const fmt = (msg: string) => `[${prefix}] ${msg}`; - return { - error(msg: string, ...args: unknown[]) { - if (LEVELS[currentLevel] >= LEVELS.error) - console.error(fmt(msg), ...args); - }, - warn(msg: string, ...args: unknown[]) { - if (LEVELS[currentLevel] >= LEVELS.warn) console.warn(fmt(msg), ...args); - }, - info(msg: string, ...args: unknown[]) { - if (LEVELS[currentLevel] >= LEVELS.info) console.log(fmt(msg), ...args); - }, - debug(msg: string, ...args: unknown[]) { - if (LEVELS[currentLevel] >= LEVELS.debug) - console.debug(fmt(msg), ...args); - }, - }; -} diff --git a/lib/orpc/client.server.ts b/lib/orpc/client.server.ts deleted file mode 100644 index 69ce269..0000000 --- a/lib/orpc/client.server.ts +++ /dev/null @@ -1,10 +0,0 @@ -import "server-only"; -import { createRouterClient } from "@orpc/server"; -import { headers } from "next/headers"; -import { router } from "./router"; - -globalThis.$orpcClient = createRouterClient(router, { - context: async () => ({ - headers: await headers(), - }), -}); diff --git a/lib/orpc/client.ts b/lib/orpc/client.ts deleted file mode 100644 index 25ed977..0000000 --- a/lib/orpc/client.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createORPCClient } from "@orpc/client"; -import { RPCLink } from "@orpc/client/fetch"; -import type { ContractRouterClient } from "@orpc/contract"; -import type { contract } from "./contract"; - -declare global { - var $orpcClient: ContractRouterClient | undefined; -} - -const link = new RPCLink({ - url: () => { - if (typeof window === "undefined") { - throw new Error("RPCLink is not allowed on the server side."); - } - return `${window.location.origin}/rpc`; - }, -}); - -export const client: ContractRouterClient = - globalThis.$orpcClient ?? createORPCClient(link); diff --git a/lib/orpc/procedures/stats.ts b/lib/orpc/procedures/stats.ts deleted file mode 100644 index 68c590a..0000000 --- a/lib/orpc/procedures/stats.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { getWatchCount, getWatchHistory } from "@/lib/services/discovery"; -import { os } from "../context"; -import { authed } from "../middleware"; - -export const statsProcedure = os.stats - .use(authed) - .handler(({ input, context }) => { - const count = getWatchCount(context.user.id, input.type, input.period); - const history = getWatchHistory(context.user.id, input.type, input.period); - return { count, history }; - }); diff --git a/lib/orpc/tanstack.ts b/lib/orpc/tanstack.ts deleted file mode 100644 index e5bfd9c..0000000 --- a/lib/orpc/tanstack.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { createTanstackQueryUtils } from "@orpc/tanstack-query"; -import { client } from "./client"; - -export const orpc = createTanstackQueryUtils(client); diff --git a/lib/query-client.ts b/lib/query-client.ts deleted file mode 100644 index e729f41..0000000 --- a/lib/query-client.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { QueryClient } from "@tanstack/react-query"; - -function makeQueryClient() { - return new QueryClient({ - defaultOptions: { - queries: { staleTime: 30_000, refetchOnWindowFocus: false }, - }, - }); -} - -let browserClient: QueryClient | undefined; - -export function getQueryClient() { - if (typeof window === "undefined") return makeQueryClient(); - if (!browserClient) browserClient = makeQueryClient(); - return browserClient; -} diff --git a/lib/services/webhooks.test.ts b/lib/services/webhooks.test.ts deleted file mode 100644 index 8052edc..0000000 --- a/lib/services/webhooks.test.ts +++ /dev/null @@ -1,310 +0,0 @@ -import { describe, expect, test } from "bun:test"; -import { - parseEmbyPayload, - parseJellyfinPayload, - parsePlexPayload, - toOptionalInt, -} from "./webhooks"; - -describe("toOptionalInt", () => { - test("returns integer number as-is", () => { - expect(toOptionalInt(42)).toBe(42); - }); - - test("returns 0 for zero", () => { - expect(toOptionalInt(0)).toBe(0); - }); - - test("returns undefined for float", () => { - expect(toOptionalInt(3.14)).toBeUndefined(); - }); - - test("parses valid integer string", () => { - expect(toOptionalInt("7")).toBe(7); - }); - - test("parses string with whitespace", () => { - expect(toOptionalInt(" 12 ")).toBe(12); - }); - - test("returns undefined for non-numeric string", () => { - expect(toOptionalInt("abc")).toBeUndefined(); - }); - - test("returns undefined for empty string", () => { - expect(toOptionalInt("")).toBeUndefined(); - }); - - test("returns undefined for null", () => { - expect(toOptionalInt(null)).toBeUndefined(); - }); - - test("returns undefined for undefined", () => { - expect(toOptionalInt(undefined)).toBeUndefined(); - }); - - test("returns undefined for boolean", () => { - expect(toOptionalInt(true)).toBeUndefined(); - }); -}); - -describe("parsePlexPayload", () => { - function makeFormData(payload: unknown): FormData { - const fd = new FormData(); - fd.set("payload", JSON.stringify(payload)); - return fd; - } - - test("returns null for missing payload field", () => { - expect(parsePlexPayload(new FormData())).toBeNull(); - }); - - test("returns null for invalid JSON", () => { - const fd = new FormData(); - fd.set("payload", "not json{"); - expect(parsePlexPayload(fd)).toBeNull(); - }); - - test("returns null for wrong event type", () => { - expect(parsePlexPayload(makeFormData({ event: "media.play" }))).toBeNull(); - }); - - test("returns null when Metadata is missing", () => { - expect( - parsePlexPayload(makeFormData({ event: "media.scrobble" })), - ).toBeNull(); - }); - - test("returns null for unsupported media type", () => { - expect( - parsePlexPayload( - makeFormData({ - event: "media.scrobble", - Metadata: { type: "track" }, - }), - ), - ).toBeNull(); - }); - - test("parses movie scrobble", () => { - const result = parsePlexPayload( - makeFormData({ - event: "media.scrobble", - Metadata: { - type: "movie", - title: "Inception", - Guid: [{ id: "tmdb://27205" }, { id: "imdb://tt1375666" }], - }, - }), - ); - expect(result).toEqual({ - provider: "plex", - mediaType: "movie", - title: "Inception", - tmdbId: 27205, - imdbId: "tt1375666", - tvdbId: undefined, - seasonNumber: undefined, - episodeNumber: undefined, - showTitle: undefined, - }); - }); - - test("parses episode scrobble", () => { - const result = parsePlexPayload( - makeFormData({ - event: "media.scrobble", - Metadata: { - type: "episode", - title: "Pilot", - grandparentTitle: "Breaking Bad", - parentIndex: 1, - index: 1, - Guid: [{ id: "tvdb://349232" }], - }, - }), - ); - expect(result).toEqual({ - provider: "plex", - mediaType: "episode", - title: "Pilot", - tmdbId: undefined, - imdbId: undefined, - tvdbId: "349232", - seasonNumber: 1, - episodeNumber: 1, - showTitle: "Breaking Bad", - }); - }); - - test("extracts GUIDs from lowercase guid field", () => { - const result = parsePlexPayload( - makeFormData({ - event: "media.scrobble", - Metadata: { - type: "movie", - title: "Test", - guid: [{ id: "tmdb://12345" }], - }, - }), - ); - expect(result?.tmdbId).toBe(12345); - }); -}); - -describe("parseJellyfinPayload", () => { - test("returns null for wrong NotificationType", () => { - expect( - parseJellyfinPayload({ NotificationType: "PlaybackStart" }), - ).toBeNull(); - }); - - test("returns null when PlayedToCompletion is false", () => { - expect( - parseJellyfinPayload({ - NotificationType: "PlaybackStop", - PlayedToCompletion: false, - ItemType: "Movie", - }), - ).toBeNull(); - }); - - test("returns null for unsupported ItemType", () => { - expect( - parseJellyfinPayload({ - NotificationType: "PlaybackStop", - PlayedToCompletion: true, - ItemType: "Audio", - }), - ).toBeNull(); - }); - - test("parses movie payload", () => { - const result = parseJellyfinPayload({ - NotificationType: "PlaybackStop", - PlayedToCompletion: true, - ItemType: "Movie", - Name: "The Matrix", - Provider_tmdb: "603", - Provider_imdb: "tt0133093", - }); - expect(result).toEqual({ - provider: "jellyfin", - mediaType: "movie", - title: "The Matrix", - tmdbId: 603, - imdbId: "tt0133093", - tvdbId: undefined, - seasonNumber: undefined, - episodeNumber: undefined, - showTitle: undefined, - }); - }); - - test("parses episode payload", () => { - const result = parseJellyfinPayload({ - NotificationType: "PlaybackStop", - PlayedToCompletion: true, - ItemType: "Episode", - Name: "Ozymandias", - Provider_tmdb: "62161", - SeasonNumber: 5, - EpisodeNumber: 14, - SeriesName: "Breaking Bad", - }); - expect(result).toEqual({ - provider: "jellyfin", - mediaType: "episode", - title: "Ozymandias", - tmdbId: 62161, - imdbId: undefined, - tvdbId: undefined, - seasonNumber: 5, - episodeNumber: 14, - showTitle: "Breaking Bad", - }); - }); -}); - -describe("parseEmbyPayload", () => { - test("returns null for wrong event type", () => { - expect( - parseEmbyPayload({ Event: "playback.start", PlayedToCompletion: true }), - ).toBeNull(); - }); - - test("returns null when PlayedToCompletion is false", () => { - expect( - parseEmbyPayload({ Event: "playback.stop", PlayedToCompletion: false }), - ).toBeNull(); - }); - - test("returns null when Item is missing", () => { - expect( - parseEmbyPayload({ Event: "playback.stop", PlayedToCompletion: true }), - ).toBeNull(); - }); - - test("accepts 'playback.stop' event string", () => { - const result = parseEmbyPayload({ - Event: "playback.stop", - PlayedToCompletion: true, - Item: { - Type: "Movie", - Name: "Interstellar", - ProviderIds: { Tmdb: "157336" }, - }, - }); - expect(result?.provider).toBe("emby"); - expect(result?.tmdbId).toBe(157336); - }); - - test("accepts 'PlaybackStop' event string", () => { - const result = parseEmbyPayload({ - Event: "PlaybackStop", - PlayedToCompletion: true, - Item: { - Type: "Movie", - Name: "Interstellar", - ProviderIds: { Tmdb: "157336" }, - }, - }); - expect(result?.provider).toBe("emby"); - }); - - test("parses episode with ProviderIds", () => { - const result = parseEmbyPayload({ - Event: "playback.stop", - PlayedToCompletion: true, - Item: { - Type: "Episode", - Name: "Pilot", - ParentIndexNumber: 1, - IndexNumber: 1, - SeriesName: "Lost", - ProviderIds: { Tmdb: "12345", Imdb: "tt0000001", Tvdb: "67890" }, - }, - }); - expect(result).toEqual({ - provider: "emby", - mediaType: "episode", - title: "Pilot", - tmdbId: 12345, - imdbId: "tt0000001", - tvdbId: "67890", - seasonNumber: 1, - episodeNumber: 1, - showTitle: "Lost", - }); - }); - - test("handles missing ProviderIds gracefully", () => { - const result = parseEmbyPayload({ - Event: "playback.stop", - PlayedToCompletion: true, - Item: { Type: "Movie", Name: "Unknown Movie" }, - }); - expect(result?.tmdbId).toBeUndefined(); - expect(result?.imdbId).toBeUndefined(); - }); -}); diff --git a/lib/tmdb/image.test.ts b/lib/tmdb/image.test.ts deleted file mode 100644 index 21d91c1..0000000 --- a/lib/tmdb/image.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { afterEach, beforeEach, describe, expect, test } from "bun:test"; -import { tmdbImageUrl } from "./image"; - -describe("tmdbImageUrl", () => { - const origCacheEnabled = process.env.IMAGE_CACHE_ENABLED; - const origBaseUrl = process.env.TMDB_IMAGE_BASE_URL; - - beforeEach(() => { - delete process.env.IMAGE_CACHE_ENABLED; - delete process.env.TMDB_IMAGE_BASE_URL; - }); - - afterEach(() => { - if (origCacheEnabled !== undefined) { - process.env.IMAGE_CACHE_ENABLED = origCacheEnabled; - } else { - delete process.env.IMAGE_CACHE_ENABLED; - } - if (origBaseUrl !== undefined) { - process.env.TMDB_IMAGE_BASE_URL = origBaseUrl; - } else { - delete process.env.TMDB_IMAGE_BASE_URL; - } - }); - - test("returns null for null path", () => { - expect(tmdbImageUrl(null, "posters")).toBeNull(); - }); - - test("returns null for undefined path", () => { - expect( - tmdbImageUrl(undefined as unknown as string | null, "posters"), - ).toBeNull(); - }); - - describe("cache enabled (default)", () => { - test("posters category", () => { - expect(tmdbImageUrl("/abc.jpg", "posters")).toBe( - "/api/images/posters/abc.jpg", - ); - }); - - test("backdrops category", () => { - expect(tmdbImageUrl("/backdrop.jpg", "backdrops")).toBe( - "/api/images/backdrops/backdrop.jpg", - ); - }); - - test("logos category", () => { - expect(tmdbImageUrl("/logo.png", "logos")).toBe( - "/api/images/logos/logo.png", - ); - }); - - test("profiles category", () => { - expect(tmdbImageUrl("/profile.jpg", "profiles")).toBe( - "/api/images/profiles/profile.jpg", - ); - }); - - test("stills category", () => { - expect(tmdbImageUrl("/still.jpg", "stills")).toBe( - "/api/images/stills/still.jpg", - ); - }); - - test("strips leading slash from path", () => { - expect(tmdbImageUrl("/test.jpg", "posters")).toBe( - "/api/images/posters/test.jpg", - ); - }); - - test("handles path without leading slash", () => { - expect(tmdbImageUrl("test.jpg", "posters")).toBe( - "/api/images/posters/test.jpg", - ); - }); - }); - - describe("cache disabled", () => { - beforeEach(() => { - process.env.IMAGE_CACHE_ENABLED = "false"; - }); - - test("returns TMDB CDN URL with default size for category", () => { - expect(tmdbImageUrl("/abc.jpg", "posters")).toBe( - "https://image.tmdb.org/t/p/w500/abc.jpg", - ); - }); - - test("uses category-specific size", () => { - expect(tmdbImageUrl("/abc.jpg", "backdrops")).toBe( - "https://image.tmdb.org/t/p/w1280/abc.jpg", - ); - }); - - test("allows size override", () => { - expect(tmdbImageUrl("/abc.jpg", "posters", "w300")).toBe( - "https://image.tmdb.org/t/p/w300/abc.jpg", - ); - }); - - test("preserves size for profiles", () => { - expect(tmdbImageUrl("/img.jpg", "profiles")).toBe( - "https://image.tmdb.org/t/p/w185/img.jpg", - ); - }); - - test("preserves size for logos", () => { - expect(tmdbImageUrl("/img.jpg", "logos")).toBe( - "https://image.tmdb.org/t/p/w92/img.jpg", - ); - }); - }); -}); diff --git a/lib/tmdb/schema.d.ts b/lib/tmdb/schema.d.ts deleted file mode 100644 index 041819f..0000000 --- a/lib/tmdb/schema.d.ts +++ /dev/null @@ -1,22810 +0,0 @@ -/** - * This file was auto-generated by openapi-typescript. - * Do not make direct changes to the file. - */ - -export interface paths { - "/3/authentication": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Validate Key - * @description Test your API Key to see if it's valid. - */ - get: operations["authentication-validate-key"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Get the public details of an account on TMDB. - */ - get: operations["account-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/favorite": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add Favorite - * @description Mark a movie or TV show as a favourite. - */ - post: operations["account-add-favorite"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/watchlist": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add To Watchlist - * @description Add a movie or TV show to your watchlist. - */ - post: operations["account-add-to-watchlist"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/favorite/movies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Favorite Movies - * @description Get a users list of favourite movies. - */ - get: operations["account-get-favorites"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/favorite/tv": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Favorite TV - * @description Get a users list of favourite TV shows. - */ - get: operations["account-favorite-tv"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/lists": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Lists - * @description Get a users list of custom lists. - */ - get: operations["account-lists"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/rated/movies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Rated Movies - * @description Get a users list of rated movies. - */ - get: operations["account-rated-movies"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/rated/tv": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Rated TV - * @description Get a users list of rated TV shows. - */ - get: operations["account-rated-tv"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/rated/tv/episodes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Rated TV Episodes - * @description Get a users list of rated TV episodes. - */ - get: operations["account-rated-tv-episodes"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/watchlist/movies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Watchlist Movies - * @description Get a list of movies added to a users watchlist. - */ - get: operations["account-watchlist-movies"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/account/{account_id}/watchlist/tv": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Watchlist TV - * @description Get a list of TV shows added to a users watchlist. - */ - get: operations["account-watchlist-tv"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/authentication/guest_session/new": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Create Guest Session */ - get: operations["authentication-create-guest-session"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/authentication/token/new": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Create Request Token */ - get: operations["authentication-create-request-token"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/authentication/session/new": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create Session */ - post: operations["authentication-create-session"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/authentication/session/convert/4": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create Session (from v4 token) */ - post: operations["authentication-create-session-from-v4-token"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/authentication/token/validate_with_login": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Create Session (with login) - * @description This method allows an application to validate a request token by entering a username and password. - */ - post: operations["authentication-create-session-from-login"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/authentication/session": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - post?: never; - /** Delete Session */ - delete: operations["authentication-delete-session"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/certification/movie/list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movie Certifications - * @description Get an up to date list of the officially supported movie certifications on TMDB. - */ - get: operations["certification-movie-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/certification/tv/list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** TV Certifications */ - get: operations["certifications-tv-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movie List - * @description Get a list of all of the movie ids that have been changed in the past 24 hours. - */ - get: operations["changes-movie-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** People List */ - get: operations["changes-people-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** TV List */ - get: operations["changes-tv-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/collection/{collection_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Get collection details by ID. - */ - get: operations["collection-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/collection/{collection_id}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the images that belong to a collection. - */ - get: operations["collection-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/collection/{collection_id}/translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Translations */ - get: operations["collection-translations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/company/{company_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Get the company details by ID. - */ - get: operations["company-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/company/{company_id}/alternative_names": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Alternative Names - * @description Get the company details by ID. - */ - get: operations["company-alternative-names"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/company/{company_id}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the company logos by id. - */ - get: operations["company-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/configuration": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Query the API configuration details. - */ - get: operations["configuration-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/configuration/countries": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Countries - * @description Get the list of countries (ISO 3166-1 tags) used throughout TMDB. - */ - get: operations["configuration-countries"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/configuration/jobs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Jobs - * @description Get the list of the jobs and departments we use on TMDB. - */ - get: operations["configuration-jobs"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/configuration/languages": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Languages - * @description Get the list of languages (ISO 639-1 tags) used throughout TMDB. - */ - get: operations["configuration-languages"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/configuration/primary_translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Primary Translations - * @description Get a list of the officially supported translations on TMDB. - */ - get: operations["configuration-primary-translations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/configuration/timezones": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Timezones - * @description Get the list of timezones used throughout TMDB. - */ - get: operations["configuration-timezones"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/credit/{credit_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Get a movie or TV credit details by ID. - */ - get: operations["credit-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/discover/movie": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movie - * @description Find movies using over 30 filters and sort options. - */ - get: operations["discover-movie"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/discover/tv": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * TV - * @description Find TV shows using over 30 filters and sort options. - */ - get: operations["discover-tv"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/find/{external_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Find By ID - * @description Find data by external ID's. - */ - get: operations["find-by-id"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/genre/movie/list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movie List - * @description Get the list of official genres for movies. - */ - get: operations["genre-movie-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/genre/tv/list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * TV List - * @description Get the list of official genres for TV shows. - */ - get: operations["genre-tv-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/guest_session/{guest_session_id}/rated/movies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Rated Movies - * @description Get the rated movies for a guest session. - */ - get: operations["guest-session-rated-movies"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/guest_session/{guest_session_id}/rated/tv": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Rated TV - * @description Get the rated TV shows for a guest session. - */ - get: operations["guest-session-rated-tv"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/guest_session/{guest_session_id}/rated/tv/episodes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Rated TV Episodes - * @description Get the rated TV episodes for a guest session. - */ - get: operations["guest-session-rated-tv-episodes"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/keyword/{keyword_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Details */ - get: operations["keyword-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/keyword/{keyword_id}/movies": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Movies */ - get: operations["keyword-movies"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/list/{list_id}/add_item": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add Movie - * @description Add a movie to a list. - */ - post: operations["list-add-movie"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/list/{list_id}/item_status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Check Item Status - * @description Use this method to check if an item has already been added to the list. - */ - get: operations["list-check-item-status"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/list/{list_id}/clear": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Clear - * @description Clear all items from a list. - */ - post: operations["list-clear"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Create */ - post: operations["list-create"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/list/{list_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Details */ - get: operations["list-details"]; - put?: never; - post?: never; - /** - * Delete - * @description Delete a list. - */ - delete: operations["list-delete"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/list/{list_id}/remove_item": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Remove Movie - * @description Remove a movie from a list. - */ - post: operations["list-remove-movie"]; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/now_playing": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Now Playing - * @description Get a list of movies that are currently in theatres. - */ - get: operations["movie-now-playing-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/popular": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Popular - * @description Get a list of movies ordered by popularity. - */ - get: operations["movie-popular-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/top_rated": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Top Rated - * @description Get a list of movies ordered by rating. - */ - get: operations["movie-top-rated-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/upcoming": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Upcoming - * @description Get a list of movies that are being released soon. - */ - get: operations["movie-upcoming-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Get the top level details of a movie by ID. - */ - get: operations["movie-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/account_states": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Account States - * @description Get the rating, watchlist and favourite status of an account. - */ - get: operations["movie-account-states"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/alternative_titles": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Alternative Titles - * @description Get the alternative titles for a movie. - */ - get: operations["movie-alternative-titles"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Changes - * @description Get the recent changes for a movie. - */ - get: operations["movie-changes"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Credits */ - get: operations["movie-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/external_ids": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** External IDs */ - get: operations["movie-external-ids"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the images that belong to a movie. - */ - get: operations["movie-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/keywords": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Keywords */ - get: operations["movie-keywords"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/latest": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Latest - * @description Get the newest movie ID. - */ - get: operations["movie-latest-id"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/lists": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Lists - * @description Get the lists that a movie has been added to. - */ - get: operations["movie-lists"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/recommendations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Recommendations */ - get: operations["movie-recommendations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/release_dates": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Release Dates - * @description Get the release dates and certifications for a movie. - */ - get: operations["movie-release-dates"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/reviews": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Reviews - * @description Get the user reviews for a movie. - */ - get: operations["movie-reviews"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/similar": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Similar - * @description Get the similar movies based on genres and keywords. - */ - get: operations["movie-similar"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Translations - * @description Get the translations for a movie. - */ - get: operations["movie-translations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/videos": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Videos */ - get: operations["movie-videos"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/watch/providers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Watch Providers - * @description Get the list of streaming providers we have for a movie. - */ - get: operations["movie-watch-providers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/movie/{movie_id}/rating": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add Rating - * @description Rate a movie and save it to your rated list. - */ - post: operations["movie-add-rating"]; - /** - * Delete Rating - * @description Delete a user rating. - */ - delete: operations["movie-delete-rating"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/network/{network_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Details */ - get: operations["network-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/network/{network_id}/alternative_names": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Alternative Names - * @description Get the alternative names of a network. - */ - get: operations["details-copy"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/network/{network_id}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the TV network logos by id. - */ - get: operations["alternative-names-copy"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/popular": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Popular - * @description Get a list of people ordered by popularity. - */ - get: operations["person-popular-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Query the top level details of a person. - */ - get: operations["person-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Changes - * @description Get the recent changes for a person. - */ - get: operations["person-changes"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/combined_credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Combined Credits - * @description Get the combined movie and TV credits that belong to a person. - */ - get: operations["person-combined-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/external_ids": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * External IDs - * @description Get the external ID's that belong to a person. - */ - get: operations["person-external-ids"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the profile images that belong to a person. - */ - get: operations["person-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/latest": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Latest - * @description Get the newest created person. This is a live response and will continuously change. - */ - get: operations["person-latest-id"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/movie_credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movie Credits - * @description Get the movie credits for a person. - */ - get: operations["person-movie-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/tv_credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * TV Credits - * @description Get the TV credits that belong to a person. - */ - get: operations["person-tv-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/tagged_images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Tagged Images - * @description Get the tagged images for a person. - */ - get: operations["person-tagged-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/person/{person_id}/translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Translations - * @description Get the translations that belong to a person. - */ - get: operations["translations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/review/{review_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Retrieve the details of a movie or TV show review. - */ - get: operations["review-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/search/collection": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Collection - * @description Search for collections by their original, translated and alternative names. - */ - get: operations["search-collection"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/search/company": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Company - * @description Search for companies by their original and alternative names. - */ - get: operations["search-company"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/search/keyword": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Keyword - * @description Search for keywords by their name. - */ - get: operations["search-keyword"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/search/movie": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movie - * @description Search for movies by their original, translated and alternative titles. - */ - get: operations["search-movie"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/search/multi": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Multi - * @description Use multi search when you want to search for movies, TV shows and people in a single request. - */ - get: operations["search-multi"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/search/person": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Person - * @description Search for people by their name and also known as names. - */ - get: operations["search-person"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/search/tv": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * TV - * @description Search for TV shows by their original, translated and also known as names. - */ - get: operations["search-tv"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/trending/all/{time_window}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * All - * @description Get the trending movies, TV shows and people. - */ - get: operations["trending-all"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/trending/movie/{time_window}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movies - * @description Get the trending movies on TMDB. - */ - get: operations["trending-movies"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/trending/person/{time_window}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * People - * @description Get the trending people on TMDB. - */ - get: operations["trending-people"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/trending/tv/{time_window}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * TV - * @description Get the trending TV shows on TMDB. - */ - get: operations["trending-tv"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/airing_today": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Airing Today - * @description Get a list of TV shows airing today. - */ - get: operations["tv-series-airing-today-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/on_the_air": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * On The Air - * @description Get a list of TV shows that air in the next 7 days. - */ - get: operations["tv-series-on-the-air-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/popular": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Popular - * @description Get a list of TV shows ordered by popularity. - */ - get: operations["tv-series-popular-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/top_rated": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Top Rated - * @description Get a list of TV shows ordered by rating. - */ - get: operations["tv-series-top-rated-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Get the details of a TV show. - */ - get: operations["tv-series-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/account_states": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Account States - * @description Get the rating, watchlist and favourite status. - */ - get: operations["tv-series-account-states"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/aggregate_credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Aggregate Credits - * @description Get the aggregate credits (cast and crew) that have been added to a TV show. - */ - get: operations["tv-series-aggregate-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/alternative_titles": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Alternative Titles - * @description Get the alternative titles that have been added to a TV show. - */ - get: operations["tv-series-alternative-titles"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Changes - * @description Get the recent changes for a TV show. - */ - get: operations["tv-series-changes"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/content_ratings": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Content Ratings - * @description Get the content ratings that have been added to a TV show. - */ - get: operations["tv-series-content-ratings"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Credits - * @description Get the latest season credits of a TV show. - */ - get: operations["tv-series-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/episode_groups": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Episode Groups - * @description Get the episode groups that have been added to a TV show. - */ - get: operations["tv-series-episode-groups"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/external_ids": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * External IDs - * @description Get a list of external IDs that have been added to a TV show. - */ - get: operations["tv-series-external-ids"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the images that belong to a TV series. - */ - get: operations["tv-series-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/keywords": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Keywords - * @description Get a list of keywords that have been added to a TV show. - */ - get: operations["tv-series-keywords"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/latest": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Latest - * @description Get the newest TV show ID. - */ - get: operations["tv-series-latest-id"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/lists": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Lists - * @description Get the lists that a TV series has been added to. - */ - get: operations["lists-copy"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/recommendations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Recommendations */ - get: operations["tv-series-recommendations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/reviews": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Reviews - * @description Get the reviews that have been added to a TV show. - */ - get: operations["tv-series-reviews"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/screened_theatrically": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Screened Theatrically - * @description Get the seasons and episodes that have screened theatrically. - */ - get: operations["tv-series-screened-theatrically"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/similar": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Similar - * @description Get the similar TV shows. - */ - get: operations["tv-series-similar"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Translations - * @description Get the translations that have been added to a TV show. - */ - get: operations["tv-series-translations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/videos": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Videos - * @description Get the videos that belong to a TV show. - */ - get: operations["tv-series-videos"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/watch/providers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Watch Providers - * @description Get the list of streaming providers we have for a TV show. - */ - get: operations["tv-series-watch-providers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/rating": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add Rating - * @description Rate a TV show and save it to your rated list. - */ - post: operations["tv-series-add-rating"]; - /** Delete Rating */ - delete: operations["tv-series-delete-rating"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Query the details of a TV season. - */ - get: operations["tv-season-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/account_states": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Account States - * @description Get the rating, watchlist and favourite status. - */ - get: operations["tv-season-account-states"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/aggregate_credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Aggregate Credits - * @description Get the aggregate credits (cast and crew) that have been added to a TV season. - */ - get: operations["tv-season-aggregate-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/season/{season_id}/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Changes - * @description Get the recent changes for a TV season. - */ - get: operations["tv-season-changes-by-id"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Credits */ - get: operations["tv-season-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/external_ids": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * External IDs - * @description Get a list of external IDs that have been added to a TV season. - */ - get: operations["tv-season-external-ids"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the images that belong to a TV season. - */ - get: operations["tv-season-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Translations - * @description Get the translations for a TV season. - */ - get: operations["tv-season-translations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/videos": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Videos - * @description Get the videos that belong to a TV season. - */ - get: operations["tv-season-videos"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/watch/providers": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Watch Providers - * @description Get the list of streaming providers we have for a TV season. - */ - get: operations["tv-season-watch-providers"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Query the details of a TV episode. - */ - get: operations["tv-episode-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/account_states": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Account States - * @description Get the rating, watchlist and favourite status. - */ - get: operations["tv-episode-account-states"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/episode/{episode_id}/changes": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Changes - * @description Get the recent changes for a TV episode. - */ - get: operations["tv-episode-changes-by-id"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/credits": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Credits */ - get: operations["tv-episode-credits"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/external_ids": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * External IDs - * @description Get a list of external IDs that have been added to a TV episode. - */ - get: operations["tv-episode-external-ids"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/images": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Images - * @description Get the images that belong to a TV episode. - */ - get: operations["tv-episode-images"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Translations - * @description Get the translations that have been added to a TV episode. - */ - get: operations["tv-episode-translations"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/videos": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Videos - * @description Get the videos that belong to a TV episode. - */ - get: operations["tv-episode-videos"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/rating": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add Rating - * @description Rate a TV episode and save it to your rated list. - */ - post: operations["tv-episode-add-rating"]; - /** - * Delete Rating - * @description Delete your rating on a TV episode. - */ - delete: operations["tv-episode-delete-rating"]; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/tv/episode_group/{tv_episode_group_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Details - * @description Get the details of a TV episode group. - */ - get: operations["tv-episode-group-details"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/watch/providers/regions": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Available Regions - * @description Get the list of the countries we have watch provider (OTT/streaming) data for. - */ - get: operations["watch-providers-available-regions"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/watch/providers/movie": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Movie Providers - * @description Get the list of streaming providers we have for movies. - */ - get: operations["watch-providers-movie-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/3/watch/providers/tv": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * TV Providers - * @description Get the list of streaming providers we have for TV shows. - */ - get: operations["watch-provider-tv-list"]; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; -} -export type webhooks = Record; -export interface components { - schemas: never; - responses: never; - parameters: never; - requestBodies: never; - headers: never; - pathItems: never; -} -export type $defs = Record; -export interface operations { - "authentication-validate-key": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example true - */ - success: boolean; - /** - * @default 0 - * @example 1 - */ - status_code: number; - /** @example Success. */ - status_message?: string; - }; - }; - }; - /** @description 401 */ - 401: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 7 - */ - status_code: number; - /** @example Invalid API key: You must be granted a valid key. */ - status_message?: string; - /** - * @default true - * @example false - */ - success: boolean; - }; - }; - }; - }; - }; - "account-details": { - parameters: { - query?: { - session_id?: string; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - avatar?: { - gravatar?: { - /** @example c9e9fc152ee756a900db85757c29815d */ - hash?: string; - }; - tmdb?: { - /** @example /xy44UvpbTgzs9kWmp4C3fEaCl5h.png */ - avatar_path?: string; - }; - }; - /** - * @default 0 - * @example 548 - */ - id: number; - /** @example en */ - iso_639_1?: string; - /** @example CA */ - iso_3166_1?: string; - /** @example Travis Bell */ - name?: string; - /** - * @default true - * @example false - */ - include_adult: boolean; - /** @example travisbell */ - username?: string; - }; - }; - }; - }; - }; - "account-add-favorite": { - parameters: { - query?: { - session_id?: string; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - status_code: number; - /** @example Success. */ - status_message?: string; - }; - }; - }; - }; - }; - "account-add-to-watchlist": { - parameters: { - query?: { - session_id?: string; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - status_code: number; - /** @example Success. */ - status_message?: string; - }; - }; - }; - }; - }; - "account-get-favorites": { - parameters: { - query?: { - language?: string; - page?: number; - session_id?: string; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /se5Hxz7PArQZOG3Nx2bpfOhLhtV.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 9806 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example The Incredibles */ - original_title?: string; - /** @example Bob Parr has given up his superhero days to log in time as an insurance adjuster and raise his three children with his formerly heroic wife in suburbia. But when he receives a mysterious assignment, it's time to get back into costume. */ - overview?: string; - /** - * @default 0 - * @example 71.477 - */ - popularity: number; - /** @example /2LqaLgk4Z226KkgPJuiOQ58wvrm.jpg */ - poster_path?: string; - /** @example 2004-10-27 */ - release_date?: string; - /** @example The Incredibles */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.702 - */ - vote_average: number; - /** - * @default 0 - * @example 16162 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 4 - */ - total_pages: number; - /** - * @default 0 - * @example 80 - */ - total_results: number; - }; - }; - }; - }; - }; - "account-favorite-tv": { - parameters: { - query?: { - language?: string; - page?: number; - session_id?: string; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 1396 - */ - id: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example Breaking Bad */ - original_name?: string; - /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ - overview?: string; - /** - * @default 0 - * @example 292.904 - */ - popularity: number; - /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ - poster_path?: string; - /** @example 2008-01-20 */ - first_air_date?: string; - /** @example Breaking Bad */ - name?: string; - /** - * @default 0 - * @example 8.878 - */ - vote_average: number; - /** - * @default 0 - * @example 11548 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 4 - */ - total_pages: number; - /** - * @default 0 - * @example 68 - */ - total_results: number; - }; - }; - }; - }; - }; - "account-lists": { - parameters: { - query?: { - page?: number; - session_id?: string; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example */ - description?: string; - /** - * @default 0 - * @example 0 - */ - favorite_count: number; - /** - * @default 0 - * @example 120174 - */ - id: number; - /** - * @default 0 - * @example 5 - */ - item_count: number; - /** @example en */ - iso_639_1?: string; - /** @example movie */ - list_type?: string; - /** @example Test Alpha Sort */ - name?: string; - poster_path?: unknown; - }[]; - /** - * @default 0 - * @example 2 - */ - total_pages: number; - /** - * @default 0 - * @example 25 - */ - total_results: number; - }; - }; - }; - }; - }; - "account-rated-movies": { - parameters: { - query?: { - language?: string; - page?: number; - session_id?: string; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /dUVbWINfRMGojGZRcO6GF1Z2nV8.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 120 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example The Lord of the Rings: The Fellowship of the Ring */ - original_title?: string; - /** @example Young hobbit Frodo Baggins, after inheriting a mysterious ring from his uncle Bilbo, must leave his home in order to keep it from falling into the hands of its evil creator. Along the way, a fellowship is formed to protect the ringbearer and make sure that the ring arrives at its final destination: Mt. Doom, the only place where it can be destroyed. */ - overview?: string; - /** - * @default 0 - * @example 84.737 - */ - popularity: number; - /** @example /6oom5QYQ2yQTMJIbnvbkBL9cHo6.jpg */ - poster_path?: string; - /** @example 2001-12-18 */ - release_date?: string; - /** @example The Lord of the Rings: The Fellowship of the Ring */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.396 - */ - vote_average: number; - /** - * @default 0 - * @example 22579 - */ - vote_count: number; - /** - * @default 0 - * @example 8 - */ - rating: number; - }[]; - /** - * @default 0 - * @example 47 - */ - total_pages: number; - /** - * @default 0 - * @example 940 - */ - total_results: number; - }; - }; - }; - }; - }; - "account-rated-tv": { - parameters: { - query?: { - language?: string; - page?: number; - session_id?: string; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /2yZXtM2Kky1Sy0kachbDlwybl3y.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 1705 - */ - id: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example Fringe */ - original_name?: string; - /** @example FBI Special Agent Olivia Dunham, brilliant but formerly institutionalized scientist Walter Bishop and his scheming, reluctant son Peter uncover a deadly mystery involving a series of unbelievable events and realize they may be a part of a larger, more disturbing pattern that blurs the line between science fiction and technology. */ - overview?: string; - /** - * @default 0 - * @example 151.906 - */ - popularity: number; - /** @example /sY9hg5dLJ93RJOyKEiu1nAtBRND.jpg */ - poster_path?: string; - /** @example 2008-09-09 */ - first_air_date?: string; - /** @example Fringe */ - name?: string; - /** - * @default 0 - * @example 8.109 - */ - vote_average: number; - /** - * @default 0 - * @example 2050 - */ - vote_count: number; - /** - * @default 0 - * @example 9 - */ - rating: number; - }[]; - /** - * @default 0 - * @example 15 - */ - total_pages: number; - /** - * @default 0 - * @example 290 - */ - total_results: number; - }; - }; - }; - }; - }; - "account-rated-tv-episodes": { - parameters: { - query?: { - language?: string; - page?: number; - session_id?: string; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example 2013-10-17 */ - air_date?: string; - /** - * @default 0 - * @example 5 - */ - episode_number: number; - /** - * @default 0 - * @example 64782 - */ - id: number; - /** @example The Workplace Proximity */ - name?: string; - /** @example Amy starts working at Caltech which causes friction with Sheldon. Howard agrees with Sheldon who mentions this to Bernadette causing a big fight for the Wolowitzes. */ - overview?: string; - /** @example 4X5305 */ - production_code?: string; - /** - * @default 0 - * @example 22 - */ - runtime: number; - /** - * @default 0 - * @example 7 - */ - season_number: number; - /** - * @default 0 - * @example 1418 - */ - show_id: number; - /** @example /k8atjbd5gAsntuhbPnFpvnvo0qn.jpg */ - still_path?: string; - /** - * @default 0 - * @example 7.242 - */ - vote_average: number; - /** - * @default 0 - * @example 31 - */ - vote_count: number; - /** - * @default 0 - * @example 8 - */ - rating: number; - }[]; - /** - * @default 0 - * @example 10 - */ - total_pages: number; - /** - * @default 0 - * @example 186 - */ - total_results: number; - }; - }; - }; - }; - }; - "account-watchlist-movies": { - parameters: { - query?: { - language?: string; - page?: number; - session_id?: string; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /rgNzvSagnlc32TuMEBa529QFIig.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 76726 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Chronicle */ - original_title?: string; - /** @example Three high school students make an incredible discovery, leading to their developing uncanny powers beyond their understanding. As they learn to control their abilities and use them to their advantage, their lives start to spin out of control, and their darker sides begin to take over. */ - overview?: string; - /** - * @default 0 - * @example 37.148 - */ - popularity: number; - /** @example /xENglsVIIWEEhhB5lgpy33tGcKI.jpg */ - poster_path?: string; - /** @example 2012-02-01 */ - release_date?: string; - /** @example Chronicle */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 6.822 - */ - vote_average: number; - /** - * @default 0 - * @example 4741 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 34 - */ - total_pages: number; - /** - * @default 0 - * @example 677 - */ - total_results: number; - }; - }; - }; - }; - }; - "account-watchlist-tv": { - parameters: { - query?: { - language?: string; - page?: number; - session_id?: string; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - account_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /7phlGHRupo38EnuwmkAHdNUqov3.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 58932 - */ - id: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example The Crazy Ones */ - original_name?: string; - /** @example The Crazy Ones is an American situation comedy series created by David E. Kelley that stars Robin Williams and Sarah Michelle Gellar. The single-camera project premiered on CBS on September 26, 2013, as part of the 2013–14 American television season as a Thursday night 9 pm entry. Bill D'Elia, Dean Lorey, Jason Winer, John Montgomery and Mark Teitelbaum serve as executive producers for 20th Century Fox Television. */ - overview?: string; - /** - * @default 0 - * @example 8.939 - */ - popularity: number; - /** @example /s2e7hTrdmNUaJDf0yDP5b4AHvrD.jpg */ - poster_path?: string; - /** @example 2013-09-26 */ - first_air_date?: string; - /** @example The Crazy Ones */ - name?: string; - /** - * @default 0 - * @example 6.176 - */ - vote_average: number; - /** - * @default 0 - * @example 94 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 17 - */ - total_pages: number; - /** - * @default 0 - * @example 325 - */ - total_results: number; - }; - }; - }; - }; - }; - "authentication-create-guest-session": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example true - */ - success: boolean; - /** @example 1ce82ec1223641636ad4a60b07de3581 */ - guest_session_id?: string; - /** @example 2016-08-27 16:26:40 UTC */ - expires_at?: string; - }; - }; - }; - }; - }; - "authentication-create-request-token": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example true - */ - success: boolean; - /** @example 2016-08-26 17:04:39 UTC */ - expires_at?: string; - /** @example ff5c7eeb5a8870efe3cd7fc5c282cffd26800ecd */ - request_token?: string; - }; - }; - }; - }; - }; - "authentication-create-session": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example true - */ - success: boolean; - /** @example 79191836ddaa0da3df76a5ffef6f07ad6ab0c641 */ - session_id?: string; - }; - }; - }; - }; - }; - "authentication-create-session-from-v4-token": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example true - */ - success: boolean; - /** @example 2629f70fb498edc263a0adb99118ac41f0053e8c */ - session_id?: string; - }; - }; - }; - }; - }; - "authentication-create-session-from-login": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example true - */ - success: boolean; - /** @example 2018-07-24 04:10:26 UTC */ - expires_at?: string; - /** @example 1531f1a558c8357ce8990cf887ff196e8f5402ec */ - request_token?: string; - }; - }; - }; - }; - }; - "authentication-delete-session": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example true - */ - success: boolean; - }; - }; - }; - }; - }; - "certification-movie-list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - certifications?: { - AU?: { - /** @example E */ - certification?: string; - /** @example Exempt from classification. Films that are exempt from classification must not contain contentious material (i.e. material that would ordinarily be rated M or higher). */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - BG?: { - /** @example D */ - certification?: string; - /** @example Prohibited for persons under 16. */ - meaning?: string; - /** - * @default 0 - * @example 4 - */ - order: number; - }[]; - BR?: { - /** @example 14 */ - certification?: string; - /** @example Not recommended for minors under fourteen. More violent material, stronger sex references and/or nudity. */ - meaning?: string; - /** - * @default 0 - * @example 4 - */ - order: number; - }[]; - CA?: { - /** @example G */ - certification?: string; - /** @example All ages. */ - meaning?: string; - /** - * @default 0 - * @example 2 - */ - order: number; - }[]; - "CA-QC"?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - DE?: { - /** @example 12 */ - certification?: string; - /** @example Children 12 or older admitted, children between 6 and 11 only when accompanied by parent or a legal guardian. */ - meaning?: string; - /** - * @default 0 - * @example 3 - */ - order: number; - }[]; - DK?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - ES?: { - /** @example A */ - certification?: string; - /** @example General admission. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - FI?: { - /** @example K-16 */ - certification?: string; - /** @example Over 16 years. */ - meaning?: string; - /** - * @default 0 - * @example 4 - */ - order: number; - }[]; - FR?: { - /** @example TP */ - certification?: string; - /** @example Valid for all audiences. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - GB?: { - /** @example 15 */ - certification?: string; - /** @example Only those over 15 years are admitted. Nobody younger than 15 can rent or buy a 15-rated VHS, DVD, Blu-ray Disc, UMD or game, or watch a film in the cinema with this rating. Films under this category can contain adult themes, hard drugs, frequent strong language and limited use of very strong language, strong violence and strong sex references, and nudity without graphic detail. Sexual activity may be portrayed but without any strong detail. Sexual violence may be shown if discreet and justified by context. */ - meaning?: string; - /** - * @default 0 - * @example 5 - */ - order: number; - }[]; - HU?: { - /** @example 6 */ - certification?: string; - /** @example Not recommended below age of 6. */ - meaning?: string; - /** - * @default 0 - * @example 2 - */ - order: number; - }[]; - IN?: { - /** @example U */ - certification?: string; - /** @example Unrestricted Public Exhibition throughout India, suitable for all age groups. Films under this category should not upset children over 4. Such films may contain educational, social or family-oriented themes. Films under this category may also contain fantasy violence and/or mild bad language. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - IT?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - LT?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - MY?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - NL?: { - /** @example AL */ - certification?: string; - /** @example All ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - NO?: { - /** @example 6 */ - certification?: string; - /** @example 6 years (no restriction for children accompanied by an adult). */ - meaning?: string; - /** - * @default 0 - * @example 2 - */ - order: number; - }[]; - NZ?: { - /** @example G */ - certification?: string; - /** @example Suitable for general audiences. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - PH?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - PT?: { - /** @example Públicos */ - certification?: string; - /** @example For all the public (especially designed for children under 3 years of age). */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - RU?: { - /** @example 6+ */ - certification?: string; - /** @example (For children above 6) – Unsuitable for children under 6. */ - meaning?: string; - /** - * @default 0 - * @example 2 - */ - order: number; - }[]; - SE?: { - /** @example 11 */ - certification?: string; - /** @example Children over the age of 7, who are accompanied by an adult, are admitted to films that have been passed for children from the age of 11. */ - meaning?: string; - /** - * @default 0 - * @example 3 - */ - order: number; - }[]; - US?: { - /** @example R */ - certification?: string; - /** @example Under 17 requires accompanying parent or adult guardian 21 or older. The parent/guardian is required to stay with the child under 17 through the entire movie, even if the parent gives the child/teenager permission to see the film alone. These films may contain strong profanity, graphic sexuality, nudity, strong violence, horror, gore, and strong drug use. A movie rated R for profanity often has more severe or frequent language than the PG-13 rating would permit. An R-rated movie may have more blood, gore, drug use, nudity, or graphic sexuality than a PG-13 movie would admit. */ - meaning?: string; - /** - * @default 0 - * @example 4 - */ - order: number; - }[]; - KR?: { - /** @example All */ - certification?: string; - /** @example Film suitable for all ages. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - SK?: { - /** @example U */ - certification?: string; - /** @example General audience. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - TH?: { - /** @example P */ - certification?: string; - /** @example Educational. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - MX?: { - /** @example AA */ - certification?: string; - /** @example Informative-only rating: Understandable for children under 7 years. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - ID?: { - /** @example SU */ - certification?: string; - /** @example All ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - TR?: { - /** @example Genel İzleyici Kitlesi */ - certification?: string; - /** @example General audience. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - AR?: { - /** @example ATP */ - certification?: string; - /** @example For all public. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - GR?: { - /** @example K */ - certification?: string; - /** @example No restrictions. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - TW?: { - /** @example 0+ */ - certification?: string; - /** @example Viewing is permitted for audiences of all ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - ZA?: { - /** @example A */ - certification?: string; - /** @example Suitable for all. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - SG?: { - /** @example G */ - certification?: string; - /** @example Suitable for all ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - IE?: { - /** @example G */ - certification?: string; - /** @example Suitable for children of school going age (note: children can be enrolled in school from the age of 4). */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - PR?: { - /** @example G */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - JP?: { - /** @example G */ - certification?: string; - /** @example General, suitable for all ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - VI?: { - /** @example G */ - certification?: string; - /** @example All ages admitted. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - CH?: { - /** @example 0 */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - IL?: { - /** @example All */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - HK?: { - /** @example I */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - MO?: { - /** @example A */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - LV?: { - /** @example U */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - LU?: { - /** @example EA */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - }; - }; - }; - }; - }; - }; - "certifications-tv-list": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - certifications?: { - AU?: { - /** @example P */ - certification?: string; - /** @example Programming is intended for younger children 2–11; commercial stations must show at least 30 minutes of P-rated content each weekday and weekends at all times. No advertisements may be shown during P-rated programs. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - BR?: { - /** @example 14 */ - certification?: string; - /** @example Content suitable for viewers over the age of 14. */ - meaning?: string; - /** - * @default 0 - * @example 3 - */ - order: number; - }[]; - CA?: { - /** @example Exempt */ - certification?: string; - /** @example Shows which are exempt from ratings (such as news and sports programming) will not display an on-screen rating at all. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - "CA-QC"?: { - /** @example 18+ */ - certification?: string; - /** @example Only to be viewed by adults and may contain extreme violence and graphic sexual content. It is mostly used for 18+ movies and pornography. */ - meaning?: string; - /** - * @default 0 - * @example 5 - */ - order: number; - }[]; - DE?: { - /** @example 0 */ - certification?: string; - /** @example Can be aired at any time. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - ES?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - FR?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - GB?: { - /** @example U */ - certification?: string; - /** @example The U symbol stands for Universal. A U film should be suitable for audiences aged four years and over. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - HU?: { - /** @example Unrated */ - certification?: string; - /** @example Without age restriction. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - KR?: { - /** @example Exempt */ - certification?: string; - /** @example This rating is only for knowledge based game shows; lifestyle shows; documentary shows; news; current topic discussion shows; education/culture shows; sports that excludes MMA or other violent sports; and other programs that Korea Communications Standards Commission recognizes. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - LT?: { - /** @example S */ - certification?: string; - /** @example Intended for adult viewers from the age of 18 (corresponding to the age-appropriate index N-18) and broadcast between 23 (11pm) and 6 (6am) hours; Limited to minors and intended for adult audiences. */ - meaning?: string; - /** - * @default 0 - * @example 3 - */ - order: number; - }[]; - NL?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - PH?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - PT?: { - /** @example 12AP */ - certification?: string; - /** @example Acompanhamento Parental (may not be suitable for children under 12, parental guidance advised). */ - meaning?: string; - /** - * @default 0 - * @example 3 - */ - order: number; - }[]; - RU?: { - /** @example 16+ */ - certification?: string; - /** @example Only teens the age of 16 or older can watch. */ - meaning?: string; - /** - * @default 0 - * @example 4 - */ - order: number; - }[]; - SK?: { - /** @example NR */ - certification?: string; - /** @example No rating information. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - TH?: { - /** @example ส */ - certification?: string; - /** @example Sor - Educational movies which the public should be encouraged to see. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - US?: { - /** @example TV-MA */ - certification?: string; - /** @example This program is specifically designed to be viewed by adults and therefore may be unsuitable for children under 17. */ - meaning?: string; - /** - * @default 0 - * @example 6 - */ - order: number; - }[]; - IT?: { - /** @example T */ - certification?: string; - /** @example All ages admitted. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - FI?: { - /** @example S */ - certification?: string; - /** @example Allowed at all times. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - MY?: { - /** @example U */ - certification?: string; - /** @example No age limit. Can be broadcast anytime. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - NZ?: { - /** @example G */ - certification?: string; - /** @example Approved for general viewing. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - NO?: { - /** @example A */ - certification?: string; - /** @example Allowed at all times. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - BG?: { - /** @example Unrated */ - certification?: string; - /** @example Can be viewed for each age. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - MX?: { - /** @example AA */ - certification?: string; - /** @example Aimed at children (can be broadcast anytime). */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - IN?: { - /** @example U */ - certification?: string; - /** @example Viewable for all ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - DK?: { - /** @example A */ - certification?: string; - /** @example Suitable for a general audience. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - SE?: { - /** @example Btl */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - ID?: { - /** @example SU */ - certification?: string; - /** @example Suitable for general audiences over the age of 2 years. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - TR?: { - /** @example Genel İzleyici */ - certification?: string; - /** @example General audience. Suitable for all ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - AR?: { - /** @example ATP */ - certification?: string; - /** @example Suitable for all audiences. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - PL?: { - /** @example 0 */ - certification?: string; - /** @example Positive or neutral view of the world, little to no violence, non-sexual love, and no sexual content. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - MA?: { - /** @example NR */ - certification?: string; - /** @example All audiences. */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - GR?: { - /** @example K */ - certification?: string; - /** @example Suitable for all ages. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - IL?: { - /** @example E */ - certification?: string; - /** @example Exempt from classification. This rating is usually applied to live broadcasts. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - TW?: { - /** @example 0+ */ - certification?: string; - /** @example Suitable for watching by general audiences. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - ZA?: { - /** @example All */ - certification?: string; - /** @example This is a programme/film that does not contain any obscenity, and is suitable for family viewing. A logo must be displayed in the corner of the screen for 30 seconds after each commercial break. */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - SG?: { - /** @example G */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - }[]; - PR?: { - /** @example NR */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - VI?: { - /** @example NR */ - certification?: string; - /** @example */ - meaning?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - }; - }; - }; - }; - }; - }; - "changes-movie-list": { - parameters: { - query?: { - end_date?: string; - page?: number; - start_date?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - /** - * @default 0 - * @example 1120293 - */ - id: number; - /** - * @default true - * @example false - */ - adult: boolean; - }[]; - /** - * @default 0 - * @example 3 - */ - page: number; - /** - * @default 0 - * @example 57 - */ - total_pages: number; - /** - * @default 0 - * @example 5700 - */ - total_results: number; - }; - }; - }; - }; - }; - "changes-people-list": { - parameters: { - query?: { - end_date?: string; - page?: number; - start_date?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - /** - * @default 0 - * @example 4037513 - */ - id: number; - /** - * @default true - * @example false - */ - adult: boolean; - }[]; - /** - * @default 0 - * @example 1 - */ - page: number; - /** - * @default 0 - * @example 53 - */ - total_pages: number; - /** - * @default 0 - * @example 5292 - */ - total_results: number; - }; - }; - }; - }; - }; - "changes-tv-list": { - parameters: { - query?: { - end_date?: string; - page?: number; - start_date?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - /** - * @default 0 - * @example 225591 - */ - id: number; - /** - * @default true - * @example false - */ - adult: boolean; - }[]; - /** - * @default 0 - * @example 1 - */ - page: number; - /** - * @default 0 - * @example 18 - */ - total_pages: number; - /** - * @default 0 - * @example 1763 - */ - total_results: number; - }; - }; - }; - }; - }; - "collection-details": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - collection_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 10 - */ - id: number; - /** @example Star Wars Collection */ - name?: string; - /** @example en */ - original_language?: string; - /** @example Star Wars Collection */ - original_name?: string; - /** @example An epic space-opera theatrical film series, which depicts the adventures of various characters "a long time ago in a galaxy far, far away…." */ - overview?: string; - /** @example /22dj38IckjzEEUZwN1tPU5VJ1qq.jpg */ - poster_path?: string; - /** @example /4z9ijhgEthfRHShoOvMaBlpciXS.jpg */ - backdrop_path?: string; - parts?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /2w4xG178RpB4MDAIfTkqAuSJzec.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 11 - */ - id: number; - /** @example Star Wars */ - name?: string; - /** @example Star Wars */ - original_name?: string; - /** @example Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire. */ - overview?: string; - /** @example /6FfCtAuVAW8XJjZ7eWeLibRLWTw.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - /** @example en */ - original_language?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 15.8557 - */ - popularity: number; - /** @example 1977-05-25 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.205 - */ - vote_average: number; - /** - * @default 0 - * @example 21522 - */ - vote_count: number; - }[]; - }; - }; - }; - }; - }; - "collection-images": { - parameters: { - query?: { - /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ - include_image_language?: string; - language?: string; - }; - header?: never; - path: { - collection_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 10 - */ - id: number; - backdrops?: { - /** - * @default 0 - * @example 1.778 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 1080 - */ - height: number; - iso_639_1?: unknown; - /** @example /d8duYyyC9J5T825Hg7grmaabfxQ.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.464 - */ - vote_average: number; - /** - * @default 0 - * @example 30 - */ - vote_count: number; - /** - * @default 0 - * @example 1920 - */ - width: number; - }[]; - posters?: { - /** - * @default 0 - * @example 0.667 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 3000 - */ - height: number; - /** @example en */ - iso_639_1?: string; - /** @example /r8Ph5MYXL04Qzu4QBbq2KjqwtkQ.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.516 - */ - vote_average: number; - /** - * @default 0 - * @example 14 - */ - vote_count: number; - /** - * @default 0 - * @example 2000 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "collection-translations": { - parameters: { - query?: never; - header?: never; - path: { - collection_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 10 - */ - id: number; - translations?: { - /** @example AE */ - iso_3166_1?: string; - /** @example ar */ - iso_639_1?: string; - /** @example العربية */ - name?: string; - /** @example Arabic */ - english_name?: string; - data?: { - /** @example */ - title?: string; - /** @example */ - overview?: string; - /** @example */ - homepage?: string; - }; - }[]; - }; - }; - }; - }; - }; - "company-details": { - parameters: { - query?: never; - header?: never; - path: { - company_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example */ - description?: string; - /** @example San Francisco, California */ - headquarters?: string; - /** @example https://www.lucasfilm.com */ - homepage?: string; - /** - * @default 0 - * @example 1 - */ - id: number; - /** @example /o86DbpburjxrqAzEDhXZcyE8pDb.png */ - logo_path?: string; - /** @example Lucasfilm Ltd. */ - name?: string; - /** @example US */ - origin_country?: string; - parent_company?: unknown; - }; - }; - }; - }; - }; - "company-alternative-names": { - parameters: { - query?: never; - header?: never; - path: { - company_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - id: number; - results?: { - /** @example 루카스필름 */ - name?: string; - /** @example */ - type?: string; - }[]; - }; - }; - }; - }; - }; - "company-images": { - parameters: { - query?: never; - header?: never; - path: { - company_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - id: number; - logos?: { - /** - * @default 0 - * @example 2.97979797979798 - */ - aspect_ratio: number; - /** @example /o86DbpburjxrqAzEDhXZcyE8pDb.png */ - file_path?: string; - /** - * @default 0 - * @example 99 - */ - height: number; - /** @example 5aa080d6c3a3683fea00011e */ - id?: string; - /** @example .svg */ - file_type?: string; - /** - * @default 0 - * @example 5.384 - */ - vote_average: number; - /** - * @default 0 - * @example 2 - */ - vote_count: number; - /** - * @default 0 - * @example 295 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "configuration-details": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - images?: { - /** @example http://image.tmdb.org/t/p/ */ - base_url?: string; - /** @example https://image.tmdb.org/t/p/ */ - secure_base_url?: string; - backdrop_sizes?: string[]; - logo_sizes?: string[]; - poster_sizes?: string[]; - profile_sizes?: string[]; - still_sizes?: string[]; - }; - change_keys?: string[]; - }; - }; - }; - }; - }; - "configuration-countries": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example AD */ - iso_3166_1?: string; - /** @example Andorra */ - english_name?: string; - /** @example Andorra */ - native_name?: string; - }[]; - }; - }; - }; - }; - "configuration-jobs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Production */ - department?: string; - jobs?: string[]; - }[]; - }; - }; - }; - }; - "configuration-languages": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example bi */ - iso_639_1?: string; - /** @example Bislama */ - english_name?: string; - /** @example */ - name?: string; - }[]; - }; - }; - }; - }; - "configuration-primary-translations": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": string[]; - }; - }; - }; - }; - "configuration-timezones": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example AD */ - iso_3166_1?: string; - zones?: string[]; - }[]; - }; - }; - }; - }; - "credit-details": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - credit_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example cast */ - credit_type?: string; - /** @example Acting */ - department?: string; - /** @example Actor */ - job?: string; - media?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /uDgy6hyPd82kOHh6I95FLtLnj6p.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 100088 - */ - id: number; - /** @example The Last of Us */ - name?: string; - /** @example en */ - original_language?: string; - /** @example The Last of Us */ - original_name?: string; - /** @example Zwanzig Jahre nachdem die moderne Zivilisation zerstört wurde. – Joel, ein abgehärteter Überlebender, wird angeheuert, um Ellie, ein 14-jähriges Mädchen, aus einer bedrückenden Quarantänezone zu schmuggeln. Was als kleiner Job beginnt, wird bald zu einer brutalen, herzzerreißenden Reise, bei der die beiden die USA durchqueren müssen und aufeinander angewiesen sind, um zu überleben. */ - overview?: string; - /** @example /igwIPNClQpGVzb61QlGqcpT5zUy.jpg */ - poster_path?: string; - /** @example tv */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 898.378 - */ - popularity: number; - /** @example 2023-01-15 */ - first_air_date?: string; - /** - * @default 0 - * @example 8.749 - */ - vote_average: number; - /** - * @default 0 - * @example 3341 - */ - vote_count: number; - origin_country?: string[]; - /** @example Joel Miller */ - character?: string; - episodes?: unknown[]; - seasons?: { - /** @example 2023-01-15 */ - air_date?: string; - /** - * @default 0 - * @example 9 - */ - episode_count: number; - /** - * @default 0 - * @example 144593 - */ - id: number; - /** @example Staffel 1 */ - name?: string; - /** @example Die 1. Staffel der Endzeit-Horrorserie The Last of Us feierte ihre Premiere am 15. Januar 2023 bei HBO. In Staffel 1 beginnt für den Überlebenden Joel und das Mädchen Ellie eine Reise durch das postapokalyptische Amerika, in dem Plünderer und mutierte Wesen ihnen nach dem Leben trachten. */ - overview?: string; - /** @example /aUQKIpZZ31KWbpdHMCmaV76u78T.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 1 - */ - season_number: number; - /** - * @default 0 - * @example 100088 - */ - show_id: number; - }[]; - }; - /** @example tv */ - media_type?: string; - /** @example 6024a814c0ae36003d59cc3c */ - id?: string; - person?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 1253360 - */ - id: number; - /** @example Pedro Pascal */ - name?: string; - /** @example Pedro Pascal */ - original_name?: string; - /** @example person */ - media_type?: string; - /** - * @default 0 - * @example 106.095 - */ - popularity: number; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** @example Acting */ - known_for_department?: string; - /** @example /dBOrm29cr7NUrjiDQMTtrTyDpfy.jpg */ - profile_path?: string; - }; - }; - }; - }; - }; - }; - "discover-movie": { - parameters: { - query?: { - /** @description use in conjunction with `region` */ - certification?: string; - /** @description use in conjunction with `region` */ - "certification.gte"?: string; - /** @description use in conjunction with `region` */ - "certification.lte"?: string; - /** @description use in conjunction with the `certification`, `certification.gte` and `certification.lte` filters */ - certification_country?: string; - include_adult?: boolean; - include_video?: boolean; - language?: string; - page?: number; - primary_release_year?: number; - "primary_release_date.gte"?: string; - "primary_release_date.lte"?: string; - region?: string; - "release_date.gte"?: string; - "release_date.lte"?: string; - sort_by?: "original_title.asc" | "original_title.desc" | "popularity.asc" | "popularity.desc" | "revenue.asc" | "revenue.desc" | "primary_release_date.asc" | "title.asc" | "title.desc" | "primary_release_date.desc" | "vote_average.asc" | "vote_average.desc" | "vote_count.asc" | "vote_count.desc"; - "vote_average.gte"?: number; - "vote_average.lte"?: number; - "vote_count.gte"?: number; - "vote_count.lte"?: number; - /** @description use in conjunction with `with_watch_monetization_types ` or `with_watch_providers ` */ - watch_region?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_cast?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_companies?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_crew?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_genres?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_keywords?: string; - with_origin_country?: string; - with_original_language?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_people?: string; - /** @description possible values are: [1, 2, 3, 4, 5, 6] can be a comma (`AND`) or pipe (`OR`) separated query, can be used in conjunction with `region` */ - with_release_type?: number; - "with_runtime.gte"?: number; - "with_runtime.lte"?: number; - /** @description possible values are: [flatrate, free, ads, rent, buy] use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ - with_watch_monetization_types?: string; - /** @description use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ - with_watch_providers?: string; - without_companies?: string; - without_genres?: string; - without_keywords?: string; - without_watch_providers?: string; - year?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /8YFL5QQVPy3AgrEQxNYVSgiPEbe.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 640146 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Ant-Man and the Wasp: Quantumania */ - original_title?: string; - /** @example Super-Hero partners Scott Lang and Hope van Dyne, along with with Hope's parents Janet van Dyne and Hank Pym, and Scott's daughter Cassie Lang, find themselves exploring the Quantum Realm, interacting with strange new creatures and embarking on an adventure that will push them beyond the limits of what they thought possible. */ - overview?: string; - /** - * @default 0 - * @example 9272.643 - */ - popularity: number; - /** @example /ngl2FKBlU4fhbdsrtdom9LVLBXw.jpg */ - poster_path?: string; - /** @example 2023-02-15 */ - release_date?: string; - /** @example Ant-Man and the Wasp: Quantumania */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 6.5 - */ - vote_average: number; - /** - * @default 0 - * @example 1856 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 38020 - */ - total_pages: number; - /** - * @default 0 - * @example 760385 - */ - total_results: number; - }; - }; - }; - }; - }; - "discover-tv": { - parameters: { - query?: { - "air_date.gte"?: string; - "air_date.lte"?: string; - first_air_date_year?: number; - "first_air_date.gte"?: string; - "first_air_date.lte"?: string; - include_adult?: boolean; - include_null_first_air_dates?: boolean; - language?: string; - page?: number; - screened_theatrically?: boolean; - sort_by?: "first_air_date.asc" | "first_air_date.desc" | "name.asc" | "name.desc" | "original_name.asc" | "original_name.desc" | "popularity.asc" | "popularity.desc" | "vote_average.asc" | "vote_average.desc" | "vote_count.asc" | "vote_count.desc"; - timezone?: string; - "vote_average.gte"?: number; - "vote_average.lte"?: number; - "vote_count.gte"?: number; - "vote_count.lte"?: number; - /** @description use in conjunction with `with_watch_monetization_types ` or `with_watch_providers ` */ - watch_region?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_companies?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_genres?: string; - /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ - with_keywords?: string; - with_networks?: number; - with_origin_country?: string; - with_original_language?: string; - "with_runtime.gte"?: number; - "with_runtime.lte"?: number; - /** @description possible values are: [0, 1, 2, 3, 4, 5], can be a comma (`AND`) or pipe (`OR`) separated query */ - with_status?: string; - /** @description possible values are: [flatrate, free, ads, rent, buy] use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ - with_watch_monetization_types?: string; - /** @description use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ - with_watch_providers?: string; - without_companies?: string; - without_genres?: string; - without_keywords?: string; - without_watch_providers?: string; - /** @description possible values are: [0, 1, 2, 3, 4, 5, 6], can be a comma (`AND`) or pipe (`OR`) separated query */ - with_type?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ - backdrop_path?: string; - /** @example 2023-01-23 */ - first_air_date?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 202250 - */ - id: number; - /** @example Dirty Linen */ - name?: string; - origin_country?: string[]; - /** @example tl */ - original_language?: string; - /** @example Dirty Linen */ - original_name?: string; - /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ - overview?: string; - /** - * @default 0 - * @example 2684.061 - */ - popularity: number; - /** @example /ujlkQtHAVShWyWTloGU2Vh5Jbo9.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 5 - */ - vote_average: number; - /** - * @default 0 - * @example 13 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 7414 - */ - total_pages: number; - /** - * @default 0 - * @example 148265 - */ - total_results: number; - }; - }; - }; - }; - }; - "find-by-id": { - parameters: { - query: { - external_source: "imdb_id" | "facebook_id" | "instagram_id" | "tvdb_id" | "tiktok_id" | "twitter_id" | "wikidata_id" | "youtube_id"; - language?: string; - }; - header?: never; - path: { - external_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - movie_results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 934433 - */ - id: number; - /** @example Scream VI */ - title?: string; - /** @example en */ - original_language?: string; - /** @example Scream VI */ - original_title?: string; - /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ - overview?: string; - /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 853.917 - */ - popularity: number; - /** @example 2023-03-08 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.388 - */ - vote_average: number; - /** - * @default 0 - * @example 708 - */ - vote_count: number; - }[]; - person_results?: unknown[]; - tv_results?: unknown[]; - tv_episode_results?: unknown[]; - tv_season_results?: unknown[]; - }; - }; - }; - }; - }; - "genre-movie-list": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - genres?: { - /** - * @default 0 - * @example 28 - */ - id: number; - /** @example Action */ - name?: string; - }[]; - }; - }; - }; - }; - }; - "genre-tv-list": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - genres?: { - /** - * @default 0 - * @example 10759 - */ - id: number; - /** @example Action & Adventure */ - name?: string; - }[]; - }; - }; - }; - }; - }; - "guest-session-rated-movies": { - parameters: { - query?: { - language?: string; - page?: number; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - guest_session_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /ikR2qy9xJCHX7M8i5rcvuNfdYXs.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 16 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Dancer in the Dark */ - original_title?: string; - /** @example Selma, a Czech immigrant on the verge of blindness, struggles to make ends meet for herself and her son, who has inherited the same genetic disorder and will suffer the same fate without an expensive operation. When life gets too difficult, Selma learns to cope through her love of musicals, escaping life's troubles - even if just for a moment - by dreaming up little numbers to the rhythmic beats of her surroundings. */ - overview?: string; - /** - * @default 0 - * @example 14.684 - */ - popularity: number; - /** @example /8Wdd3fQfbbQeoSfWpHrDfaFNhBU.jpg */ - poster_path?: string; - /** @example 2000-06-30 */ - release_date?: string; - /** @example Dancer in the Dark */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.885 - */ - vote_average: number; - /** - * @default 0 - * @example 1549 - */ - vote_count: number; - /** - * @default 0 - * @example 8.5 - */ - rating: number; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 1 - */ - total_results: number; - }; - }; - }; - }; - }; - "guest-session-rated-tv": { - parameters: { - query?: { - language?: string; - page?: number; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - guest_session_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /2OMB0ynKlyIenMJWI2Dy9IWT4c.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 1399 - */ - id: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example Game of Thrones */ - original_name?: string; - /** @example Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond. */ - overview?: string; - /** - * @default 0 - * @example 404.299 - */ - popularity: number; - /** @example /7WUHnWGx5OO145IRxPDUkQSh4C7.jpg */ - poster_path?: string; - /** @example 2011-04-17 */ - first_air_date?: string; - /** @example Game of Thrones */ - name?: string; - /** - * @default 0 - * @example 8.436 - */ - vote_average: number; - /** - * @default 0 - * @example 21025 - */ - vote_count: number; - /** - * @default 0 - * @example 8.5 - */ - rating: number; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 1 - */ - total_results: number; - }; - }; - }; - }; - }; - "guest-session-rated-tv-episodes": { - parameters: { - query?: { - language?: string; - page?: number; - sort_by?: "created_at.asc" | "created_at.desc"; - }; - header?: never; - path: { - guest_session_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example 2011-04-17 */ - air_date?: string; - /** - * @default 0 - * @example 1 - */ - episode_number: number; - /** - * @default 0 - * @example 63056 - */ - id: number; - /** @example Winter Is Coming */ - name?: string; - /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ - overview?: string; - /** @example 101 */ - production_code?: string; - /** - * @default 0 - * @example 62 - */ - runtime: number; - /** - * @default 0 - * @example 1 - */ - season_number: number; - /** - * @default 0 - * @example 1399 - */ - show_id: number; - /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ - still_path?: string; - /** - * @default 0 - * @example 7.843 - */ - vote_average: number; - /** - * @default 0 - * @example 286 - */ - vote_count: number; - /** - * @default 0 - * @example 8.5 - */ - rating: number; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 1 - */ - total_results: number; - }; - }; - }; - }; - }; - "keyword-details": { - parameters: { - query?: never; - header?: never; - path: { - keyword_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1701 - */ - id: number; - /** @example hero */ - name?: string; - }; - }; - }; - }; - }; - "keyword-movies": { - parameters: { - query?: { - include_adult?: boolean; - language?: string; - page?: number; - }; - header?: never; - path: { - keyword_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1701 - */ - id: number; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /3CxUndGhUcZdt1Zggjdb2HkLLQX.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 640146 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Ant-Man and the Wasp: Quantumania */ - original_title?: string; - /** @example Das Superhelden-Duo Scott Lang und Hope Van Dyne erkundet zusammen mit Hopes Eltern Hank Pym und Janet Van Dyne das Quantenreich, interagiert mit seltsamen neuen Kreaturen und begibt sich auf ein Abenteuer, das sie über die Grenzen dessen hinaustreiben wird, was sie für möglich gehalten haben. */ - overview?: string; - /** - * @default 0 - * @example 9200.005 - */ - popularity: number; - /** @example /nA5otwVxAfpBP4PVgeuBk3qHcLY.jpg */ - poster_path?: string; - /** @example 2023-02-15 */ - release_date?: string; - /** @example Ant-Man and the Wasp: Quantumania */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 6.5 - */ - vote_average: number; - /** - * @default 0 - * @example 2079 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 11 - */ - total_pages: number; - /** - * @default 0 - * @example 211 - */ - total_results: number; - }; - }; - }; - }; - }; - "list-add-movie": { - parameters: { - query: { - session_id: string; - }; - header?: never; - path: { - list_id: number; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY?: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 12 - */ - status_code: number; - /** @example The item/record was updated successfully. */ - status_message?: string; - }; - }; - }; - }; - }; - "list-check-item-status": { - parameters: { - query?: { - language?: string; - movie_id?: number; - }; - header?: never; - path: { - list_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - id: number; - /** - * @default true - * @example true - */ - item_present: boolean; - }; - }; - }; - }; - }; - "list-clear": { - parameters: { - query: { - session_id: string; - confirm: boolean; - }; - header?: never; - path: { - list_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 12 - */ - status_code: number; - /** @example The item/record was updated successfully. */ - status_message?: string; - }; - }; - }; - }; - }; - "list-create": { - parameters: { - query: { - session_id: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example The item/record was created successfully. */ - status_message?: string; - /** - * @default true - * @example true - */ - success: boolean; - /** - * @default 0 - * @example 1 - */ - status_code: number; - /** - * @default 0 - * @example 5861 - */ - list_id: number; - }; - }; - }; - }; - }; - "list-details": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - list_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example travisbell */ - created_by?: string; - /** @example The idea behind this list is to collect the live action comic book movies from within the Marvel franchise. */ - description?: string; - /** - * @default 0 - * @example 0 - */ - favorite_count: number; - /** @example 1 */ - id?: string; - items?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /14QbnygCuTO0vl7CAFmPf1fgZfV.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 634649 - */ - id: number; - /** @example movie */ - media_type?: string; - /** @example en */ - original_language?: string; - /** @example Spider-Man: No Way Home */ - original_title?: string; - /** @example Peter Parker ist demaskiert und kann sein normales Leben nicht mehr von den hohen Einsätzen als Superheld trennen. Als er Doctor Strange um Hilfe bittet, wird die Lage noch gefährlicher und er muss entdecken, was es wirklich bedeutet, Spider-Man zu sein. */ - overview?: string; - /** - * @default 0 - * @example 398.217 - */ - popularity: number; - /** @example /iNKf4D0AzOj9GLq8ZyG3WZaqibL.jpg */ - poster_path?: string; - /** @example 2021-12-15 */ - release_date?: string; - /** @example Spider-Man: No Way Home */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8 - */ - vote_average: number; - /** - * @default 0 - * @example 17267 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 59 - */ - item_count: number; - /** @example en */ - iso_639_1?: string; - /** @example The Marvel Universe */ - name?: string; - /** @example /coJVIUEOToAEGViuhclM7pXC75R.jpg */ - poster_path?: string; - }; - }; - }; - }; - }; - "list-delete": { - parameters: { - query: { - session_id: string; - }; - header?: never; - path: { - list_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 12 - */ - status_code: number; - /** @example The item/record was updated successfully. */ - status_message?: string; - }; - }; - }; - }; - }; - "list-remove-movie": { - parameters: { - query: { - session_id: string; - }; - header?: never; - path: { - list_id: number; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 13 - */ - status_code: number; - /** @example The item/record was deleted successfully. */ - status_message?: string; - }; - }; - }; - }; - }; - "movie-now-playing-list": { - parameters: { - query?: { - language?: string; - page?: number; - /** @description ISO-3166-1 code */ - region?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - dates?: { - /** @example 2023-05-03 */ - maximum?: string; - /** @example 2023-03-16 */ - minimum?: string; - }; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /iJQIbOPm81fPEGKt5BPuZmfnA54.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 502356 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example The Super Mario Bros. Movie */ - original_title?: string; - /** @example While working underground to fix a water main, Brooklyn plumbers—and brothers—Mario and Luigi are transported down a mysterious pipe and wander into a magical new world. But when the brothers are separated, Mario embarks on an epic quest to find Luigi. */ - overview?: string; - /** - * @default 0 - * @example 6572.614 - */ - popularity: number; - /** @example /qNBAXBIQlnOThrVvA6mA2B5ggV6.jpg */ - poster_path?: string; - /** @example 2023-04-05 */ - release_date?: string; - /** @example The Super Mario Bros. Movie */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.5 - */ - vote_average: number; - /** - * @default 0 - * @example 1456 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 87 - */ - total_pages: number; - /** - * @default 0 - * @example 1734 - */ - total_results: number; - }; - }; - }; - }; - }; - "movie-popular-list": { - parameters: { - query?: { - language?: string; - page?: number; - /** @description ISO-3166-1 code */ - region?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /gMJngTNfaqCSCqGD4y8lVMZXKDn.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 640146 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Ant-Man and the Wasp: Quantumania */ - original_title?: string; - /** @example Super-Hero partners Scott Lang and Hope van Dyne, along with with Hope's parents Janet van Dyne and Hank Pym, and Scott's daughter Cassie Lang, find themselves exploring the Quantum Realm, interacting with strange new creatures and embarking on an adventure that will push them beyond the limits of what they thought possible. */ - overview?: string; - /** - * @default 0 - * @example 8567.865 - */ - popularity: number; - /** @example /ngl2FKBlU4fhbdsrtdom9LVLBXw.jpg */ - poster_path?: string; - /** @example 2023-02-15 */ - release_date?: string; - /** @example Ant-Man and the Wasp: Quantumania */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 6.5 - */ - vote_average: number; - /** - * @default 0 - * @example 1886 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 38029 - */ - total_pages: number; - /** - * @default 0 - * @example 760569 - */ - total_results: number; - }; - }; - }; - }; - }; - "movie-top-rated-list": { - parameters: { - query?: { - language?: string; - page?: number; - /** @description ISO-3166-1 code */ - region?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /tmU7GeKVybMWFButWEGl2M4GeiP.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 238 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example The Godfather */ - original_title?: string; - /** @example Spanning the years 1945 to 1955, a chronicle of the fictional Italian-American Corleone crime family. When organized crime family patriarch, Vito Corleone barely survives an attempt on his life, his youngest son, Michael steps in to take care of the would-be killers, launching a campaign of bloody revenge. */ - overview?: string; - /** - * @default 0 - * @example 100.932 - */ - popularity: number; - /** @example /3bhkrj58Vtu7enYsRolD1fZdja1.jpg */ - poster_path?: string; - /** @example 1972-03-14 */ - release_date?: string; - /** @example The Godfather */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.7 - */ - vote_average: number; - /** - * @default 0 - * @example 17806 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 552 - */ - total_pages: number; - /** - * @default 0 - * @example 11032 - */ - total_results: number; - }; - }; - }; - }; - }; - "movie-upcoming-list": { - parameters: { - query?: { - language?: string; - page?: number; - /** @description ISO-3166-1 code */ - region?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - dates?: { - /** @example 2023-05-23 */ - maximum?: string; - /** @example 2023-05-04 */ - minimum?: string; - }; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /7bWxAsNPv9CXHOhZbJVlj2KxgfP.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 713704 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Evil Dead Rise */ - original_title?: string; - /** @example Two sisters find an ancient vinyl that gives birth to bloodthirsty demons that run amok in a Los Angeles apartment building and thrusts them into a primal battle for survival as they face the most nightmarish version of family imaginable. */ - overview?: string; - /** - * @default 0 - * @example 1696.367 - */ - popularity: number; - /** @example /mIBCtPvKZQlxubxKMeViO2UrP3q.jpg */ - poster_path?: string; - /** @example 2023-04-12 */ - release_date?: string; - /** @example Evil Dead Rise */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7 - */ - vote_average: number; - /** - * @default 0 - * @example 207 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 19 - */ - total_pages: number; - /** - * @default 0 - * @example 369 - */ - total_results: number; - }; - }; - }; - }; - }; - "movie-details": { - parameters: { - query?: { - /** @description comma separated list of endpoints within this namespace, 20 items max */ - append_to_response?: string; - language?: string; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ - backdrop_path?: string; - belongs_to_collection?: unknown; - /** - * @default 0 - * @example 63000000 - */ - budget: number; - genres?: { - /** - * @default 0 - * @example 18 - */ - id: number; - /** @example Drama */ - name?: string; - }[]; - /** @example http://www.foxmovies.com/movies/fight-club */ - homepage?: string; - /** - * @default 0 - * @example 550 - */ - id: number; - /** @example tt0137523 */ - imdb_id?: string; - /** @example en */ - original_language?: string; - /** @example Fight Club */ - original_title?: string; - /** @example A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground "fight clubs" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion. */ - overview?: string; - /** - * @default 0 - * @example 61.416 - */ - popularity: number; - /** @example /pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg */ - poster_path?: string; - production_companies?: { - /** - * @default 0 - * @example 508 - */ - id: number; - /** @example /7cxRWzi4LsVm4Utfpr1hfARNurT.png */ - logo_path?: string; - /** @example Regency Enterprises */ - name?: string; - /** @example US */ - origin_country?: string; - }[]; - production_countries?: { - /** @example US */ - iso_3166_1?: string; - /** @example United States of America */ - name?: string; - }[]; - /** @example 1999-10-15 */ - release_date?: string; - /** - * @default 0 - * @example 100853753 - */ - revenue: number; - /** - * @default 0 - * @example 139 - */ - runtime: number; - spoken_languages?: { - /** @example English */ - english_name?: string; - /** @example en */ - iso_639_1?: string; - /** @example English */ - name?: string; - }[]; - /** @example Released */ - status?: string; - /** @example Mischief. Mayhem. Soap. */ - tagline?: string; - /** @example Fight Club */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.433 - */ - vote_average: number; - /** - * @default 0 - * @example 26280 - */ - vote_count: number; - }; - }; - }; - }; - }; - "movie-account-states": { - parameters: { - query?: { - session_id?: string; - guest_session_id?: string; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - /** - * @default true - * @example true - */ - favorite: boolean; - rated?: { - /** - * @default 0 - * @example 9 - */ - value: number; - }; - /** - * @default true - * @example false - */ - watchlist: boolean; - }; - }; - }; - }; - }; - "movie-alternative-titles": { - parameters: { - query?: { - /** @description specify a ISO-3166-1 value to filter the results */ - country?: string; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - titles?: { - /** @example RS */ - iso_3166_1?: string; - /** @example Borilački klub */ - title?: string; - /** @example */ - type?: string; - }[]; - }; - }; - }; - }; - }; - "movie-changes": { - parameters: { - query?: { - end_date?: string; - page?: number; - start_date?: string; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - changes?: { - /** @example images */ - key?: string; - items?: { - /** @example 643197b96dea3a00d4377270 */ - id?: string; - /** @example added */ - action?: string; - /** @example 2023-04-08 16:35:05 UTC */ - time?: string; - /** @example */ - iso_639_1?: string; - /** @example */ - iso_3166_1?: string; - value?: { - poster?: { - /** @example /s9ZrHprviFCx3azfWNBtt1LPSnL.jpg */ - file_path?: string; - }; - }; - }[]; - }[]; - }; - }; - }; - }; - }; - "movie-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 819 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Edward Norton */ - name?: string; - /** @example Edward Norton */ - original_name?: string; - /** - * @default 0 - * @example 26.99 - */ - popularity: number; - /** @example /8nytsqL59SFJTVYVrN72k6qkGgJ.jpg */ - profile_path?: string; - /** - * @default 0 - * @example 4 - */ - cast_id: number; - /** @example The Narrator */ - character?: string; - /** @example 52fe4250c3a36847f80149f3 */ - credit_id?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 376 - */ - id: number; - /** @example Production */ - known_for_department?: string; - /** @example Arnon Milchan */ - name?: string; - /** @example Arnon Milchan */ - original_name?: string; - /** - * @default 0 - * @example 2.931 - */ - popularity: number; - /** @example /b2hBExX4NnczNAnLuTBF4kmNhZm.jpg */ - profile_path?: string; - /** @example 55731b8192514111610027d7 */ - credit_id?: string; - /** @example Production */ - department?: string; - /** @example Executive Producer */ - job?: string; - }[]; - }; - }; - }; - }; - }; - "movie-external-ids": { - parameters: { - query?: never; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - /** @example tt0137523 */ - imdb_id?: string; - wikidata_id?: unknown; - /** @example FightClub */ - facebook_id?: string; - instagram_id?: unknown; - twitter_id?: unknown; - }; - }; - }; - }; - }; - "movie-images": { - parameters: { - query?: { - /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ - include_image_language?: string; - language?: string; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - backdrops?: { - /** - * @default 0 - * @example 1.778 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 800 - */ - height: number; - iso_639_1?: unknown; - /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.622 - */ - vote_average: number; - /** - * @default 0 - * @example 20 - */ - vote_count: number; - /** - * @default 0 - * @example 1422 - */ - width: number; - }[]; - /** - * @default 0 - * @example 550 - */ - id: number; - logos?: { - /** - * @default 0 - * @example 5.203 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 79 - */ - height: number; - /** @example he */ - iso_639_1?: string; - /** @example /c1KLulrIhUqY5fT42nmC5aERGCp.png */ - file_path?: string; - /** - * @default 0 - * @example 5.312 - */ - vote_average: number; - /** - * @default 0 - * @example 1 - */ - vote_count: number; - /** - * @default 0 - * @example 411 - */ - width: number; - }[]; - posters?: { - /** - * @default 0 - * @example 0.667 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 900 - */ - height: number; - /** @example pt */ - iso_639_1?: string; - /** @example /r3pPehX4ik8NLYPpbDRAh0YRtMb.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.258 - */ - vote_average: number; - /** - * @default 0 - * @example 6 - */ - vote_count: number; - /** - * @default 0 - * @example 600 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "movie-keywords": { - parameters: { - query?: never; - header?: never; - path: { - movie_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - keywords?: { - /** - * @default 0 - * @example 818 - */ - id: number; - /** @example based on novel or book */ - name?: string; - }[]; - }; - }; - }; - }; - }; - "movie-latest-id": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example false - */ - adult: boolean; - backdrop_path?: unknown; - belongs_to_collection?: unknown; - /** - * @default 0 - * @example 0 - */ - budget: number; - genres?: unknown[]; - /** @example */ - homepage?: string; - /** - * @default 0 - * @example 1119232 - */ - id: number; - imdb_id?: unknown; - /** @example fr */ - original_language?: string; - /** @example König Charles III */ - original_title?: string; - /** @example */ - overview?: string; - /** - * @default 0 - * @example 0 - */ - popularity: number; - poster_path?: unknown; - production_companies?: unknown[]; - production_countries?: unknown[]; - /** @example */ - release_date?: string; - /** - * @default 0 - * @example 0 - */ - revenue: number; - /** - * @default 0 - * @example 0 - */ - runtime: number; - spoken_languages?: unknown[]; - /** @example Released */ - status?: string; - /** @example */ - tagline?: string; - /** @example König Charles III */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 0 - */ - vote_average: number; - /** - * @default 0 - * @example 0 - */ - vote_count: number; - }; - }; - }; - }; - }; - "movie-lists": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example Movies I own */ - description?: string; - /** - * @default 0 - * @example 0 - */ - favorite_count: number; - /** - * @default 0 - * @example 8248696 - */ - id: number; - /** - * @default 0 - * @example 409 - */ - item_count: number; - /** @example en */ - iso_639_1?: string; - /** @example movie */ - list_type?: string; - /** @example My Movies */ - name?: string; - poster_path?: unknown; - }[]; - /** - * @default 0 - * @example 122 - */ - total_pages: number; - /** - * @default 0 - * @example 2422 - */ - total_results: number; - }; - }; - }; - }; - }; - "movie-recommendations": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": Record; - }; - }; - }; - }; - "movie-release-dates": { - parameters: { - query?: never; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - results?: { - /** @example BG */ - iso_3166_1?: string; - release_dates?: { - /** @example c */ - certification?: string; - descriptors?: unknown[]; - /** @example */ - iso_639_1?: string; - /** @example */ - note?: string; - /** @example 2012-08-28T00:00:00.000Z */ - release_date?: string; - /** - * @default 0 - * @example 3 - */ - type: number; - }[]; - }[]; - }; - }; - }; - }; - }; - "movie-reviews": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example Goddard */ - author?: string; - author_details?: { - /** @example */ - name?: string; - /** @example Goddard */ - username?: string; - /** @example /https://secure.gravatar.com/avatar/f248ec34f953bc62cafcbdd81fddd6b6.jpg */ - avatar_path?: string; - rating?: unknown; - }; - /** @example Pretty awesome movie. It shows what one crazy person can convince other crazy people to do. Everyone needs something to believe in. I recommend Jesus Christ, but they want Tyler Durden. */ - content?: string; - /** @example 2018-06-09T17:51:53.359Z */ - created_at?: string; - /** @example 5b1c13b9c3a36848f2026384 */ - id?: string; - /** @example 2021-06-23T15:58:09.421Z */ - updated_at?: string; - /** @example https://www.themoviedb.org/review/5b1c13b9c3a36848f2026384 */ - url?: string; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 8 - */ - total_results: number; - }; - }; - }; - }; - }; - "movie-similar": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /3YAldML4EDyoC6RBpzceALigrAZ.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 9300 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Orlando */ - original_title?: string; - /** @example England, 1600. Queen Elizabeth I promises Orlando, a young nobleman obsessed with poetry, that she will grant him land and fortune if he agrees to satisfy a very particular request. */ - overview?: string; - /** - * @default 0 - * @example 7.768 - */ - popularity: number; - /** @example /xvz0qZkXXMq3dH2Revxii8drxWc.jpg */ - poster_path?: string; - /** @example 1992-12-11 */ - release_date?: string; - /** @example Orlando */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 6.966 - */ - vote_average: number; - /** - * @default 0 - * @example 262 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 364 - */ - total_pages: number; - /** - * @default 0 - * @example 7269 - */ - total_results: number; - }; - }; - }; - }; - }; - "movie-translations": { - parameters: { - query?: never; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - translations?: { - /** @example SA */ - iso_3166_1?: string; - /** @example ar */ - iso_639_1?: string; - /** @example العربية */ - name?: string; - /** @example Arabic */ - english_name?: string; - data?: { - /** @example */ - homepage?: string; - /** @example إدوارد يتعرض لضغوط حتى يصل به الحال إلى أنه لا يستطيع النوم لفتراتٍ طويلة، لكنه يجد بعض السلام في جلسات العلاج النفسي الجماعي، يتعرف إدوارد على أحد الأشخاص وهو (تايلر ديردن) الذي يحرره من تعلقه بالأشياء الذي تستعبده ،ثم يحرره من خوفه من الناس. يقومان معًا بإنشاء نادي القتال الذي يجذب الكثير من الأفراد المحبطين ،الذين يقومون بإخراج طاقة غضبهم وكرههم للعالم في القتال. */ - overview?: string; - /** - * @default 0 - * @example 0 - */ - runtime: number; - /** @example */ - tagline?: string; - /** @example */ - title?: string; - }; - }[]; - }; - }; - }; - }; - }; - "movie-videos": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - results?: { - /** @example en */ - iso_639_1?: string; - /** @example US */ - iso_3166_1?: string; - /** @example Fight Club (1999) Trailer - Starring Brad Pitt, Edward Norton, Helena Bonham Carter */ - name?: string; - /** @example O-b2VfmmbyA */ - key?: string; - /** @example YouTube */ - site?: string; - /** - * @default 0 - * @example 720 - */ - size: number; - /** @example Trailer */ - type?: string; - /** - * @default true - * @example false - */ - official: boolean; - /** @example 2016-03-05T02:03:14.000Z */ - published_at?: string; - /** @example 639d5326be6d88007f170f44 */ - id?: string; - }[]; - }; - }; - }; - }; - }; - "movie-watch-providers": { - parameters: { - query?: never; - header?: never; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - results?: { - AE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AE */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - AL?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AL */ - link?: string; - buy?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - AR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AR */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - AT?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AT */ - link?: string; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - rent?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - AU?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AU */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - BA?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BA */ - link?: string; - buy?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - BB?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BB */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - BE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BE */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - BG?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BG */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - BH?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BH */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - }; - BO?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BO */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - BR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BR */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - }; - BS?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BS */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - CA?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CA */ - link?: string; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /sB5vHrmYmliwUvBwZe8HpXo9r8m.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 305 - */ - provider_id: number; - /** @example Crave Starz */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - CH?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CH */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /rVOOhp6V8FheEAKtFAJMLMbnaMZ.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 150 - */ - provider_id: number; - /** @example blue TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - rent?: { - /** @example /rVOOhp6V8FheEAKtFAJMLMbnaMZ.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 150 - */ - provider_id: number; - /** @example blue TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - CL?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CL */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - CO?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CO */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - CR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CR */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - CV?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CV */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 13 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 13 - */ - display_priority: number; - }[]; - }; - CZ?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CZ */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - rent?: { - /** @example /wTF37o4jOkQfjnWe41gmeuASYZA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 308 - */ - provider_id: number; - /** @example O2 TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - DE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DE */ - link?: string; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - DK?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DK */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - DO?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DO */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - EC?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EC */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - EE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EE */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - EG?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EG */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - }; - ES?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ES */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - ads?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - FI?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FI */ - link?: string; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - FJ?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FJ */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - }; - FR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FR */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - GB?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GB */ - link?: string; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - rent?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - GF?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GF */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - GI?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GI */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - GR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GR */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - }; - GT?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GT */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - HK?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HK */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - HN?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HN */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - HR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HR */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - ads?: { - /** @example /xrHrIraInfRXnrz1zHhY1tXJowg.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 572 - */ - provider_id: number; - /** @example RTL Play */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - HU?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HU */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - ID?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ID */ - link?: string; - flatrate?: { - /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 122 - */ - provider_id: number; - /** @example Hotstar */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - IE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IE */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - IL?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IL */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - IN?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IN */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - }; - IQ?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IQ */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - IS?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IS */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - IT?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IT */ - link?: string; - buy?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - rent?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - JM?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JM */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - JO?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JO */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - }; - JP?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JP */ - link?: string; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - rent?: { - /** @example /g8jqHtXJsMlc8B1Gb0Rt8AvUJMn.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 85 - */ - provider_id: number; - /** @example dTV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - KR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=KR */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /2ioan5BX5L9tz4fIGU93blTeFhv.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 356 - */ - provider_id: number; - /** @example wavve */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - KW?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=KW */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - LB?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LB */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - }; - LI?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LI */ - link?: string; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - LT?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LT */ - link?: string; - rent?: { - /** @example /xTVM8uXT9QocigQ07LE7Irc65W2.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 553 - */ - provider_id: number; - /** @example Telia Play */ - provider_name?: string; - /** - * @default 0 - * @example 15 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - LV?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LV */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - MD?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MD */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 26 - */ - display_priority: number; - }[]; - }; - MK?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MK */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 29 - */ - display_priority: number; - }[]; - buy?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - MT?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MT */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - rent?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - MU?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MU */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 15 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 15 - */ - display_priority: number; - }[]; - }; - MX?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MX */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - MY?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MY */ - link?: string; - flatrate?: { - /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 122 - */ - provider_id: number; - /** @example Hotstar */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - MZ?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MZ */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 16 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 16 - */ - display_priority: number; - }[]; - }; - NL?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NL */ - link?: string; - buy?: { - /** @example /llmnYOyknekZsXtkCaazKjhTLvG.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 71 - */ - provider_id: number; - /** @example Pathé Thuis */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - rent?: { - /** @example /llmnYOyknekZsXtkCaazKjhTLvG.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 71 - */ - provider_id: number; - /** @example Pathé Thuis */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - NO?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NO */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - NZ?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NZ */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - OM?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=OM */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - PA?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PA */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - PE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PE */ - link?: string; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - }; - PH?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PH */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - PK?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PK */ - link?: string; - flatrate?: { - /** @example /t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 8 - */ - provider_id: number; - /** @example Netflix */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - PL?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PL */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - PS?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PS */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - PT?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PT */ - link?: string; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - rent?: { - /** @example /dUeHhim2WUZz8S7EWjv0Ws6anRP.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 242 - */ - provider_id: number; - /** @example Meo */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - PY?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PY */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - QA?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=QA */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - }; - RO?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RO */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - RS?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RS */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - RU?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RU */ - link?: string; - rent?: { - /** @example /o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 113 - */ - provider_id: number; - /** @example Ivi */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - buy?: { - /** @example /o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 113 - */ - provider_id: number; - /** @example Ivi */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /zLM7f1w2L8TU2Fspzns72m6h3yY.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 501 - */ - provider_id: number; - /** @example Wink */ - provider_name?: string; - /** - * @default 0 - * @example 1000 - */ - display_priority: number; - }[]; - }; - SA?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SA */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - SE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SE */ - link?: string; - buy?: { - /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 68 - */ - provider_id: number; - /** @example Microsoft Store */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - rent?: { - /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 68 - */ - provider_id: number; - /** @example Microsoft Store */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - SG?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SG */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - SI?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SI */ - link?: string; - buy?: { - /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 35 - */ - provider_id: number; - /** @example Rakuten TV */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - SK?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SK */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - SM?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SM */ - link?: string; - flatrate?: { - /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 337 - */ - provider_id: number; - /** @example Disney Plus */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - SV?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SV */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - TH?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TH */ - link?: string; - flatrate?: { - /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 122 - */ - provider_id: number; - /** @example Hotstar */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - TR?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TR */ - link?: string; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - TT?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TT */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - TW?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TW */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - UG?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=UG */ - link?: string; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 16 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 16 - */ - display_priority: number; - }[]; - }; - US?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=US */ - link?: string; - rent?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 13 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /jPXksae158ukMLFhhlNvzsvaEyt.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 257 - */ - provider_id: number; - /** @example fuboTV */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - UY?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=UY */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - VE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=VE */ - link?: string; - rent?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - YE?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=YE */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - }; - ZA?: { - /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ZA */ - link?: string; - flatrate?: { - /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 119 - */ - provider_id: number; - /** @example Amazon Prime Video */ - provider_name?: string; - /** - * @default 0 - * @example 1 - */ - display_priority: number; - }[]; - rent?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - }; - }; - }; - }; - }; - }; - }; - "movie-add-rating": { - parameters: { - query?: { - guest_session_id?: string; - session_id?: string; - }; - header: { - "Content-Type": string; - }; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - status_code: number; - /** @example Success. */ - status_message?: string; - }; - }; - }; - }; - }; - "movie-delete-rating": { - parameters: { - query?: { - guest_session_id?: string; - session_id?: string; - }; - header?: { - "Content-Type"?: string; - }; - path: { - movie_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 13 - */ - status_code: number; - /** @example The item/record was deleted successfully. */ - status_message?: string; - }; - }; - }; - }; - }; - "network-details": { - parameters: { - query?: never; - header?: never; - path: { - network_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example New York City, New York */ - headquarters?: string; - /** @example https://www.hbo.com */ - homepage?: string; - /** - * @default 0 - * @example 49 - */ - id: number; - /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ - logo_path?: string; - /** @example HBO */ - name?: string; - /** @example US */ - origin_country?: string; - }; - }; - }; - }; - }; - "details-copy": { - parameters: { - query?: never; - header?: never; - path: { - network_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 49 - */ - id: number; - results?: { - /** @example Home Box Office */ - name?: string; - /** @example */ - type?: string; - }[]; - }; - }; - }; - }; - }; - "alternative-names-copy": { - parameters: { - query?: never; - header?: never; - path: { - network_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 49 - */ - id: number; - logos?: { - /** - * @default 0 - * @example 2.425287356321839 - */ - aspect_ratio: number; - /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ - file_path?: string; - /** - * @default 0 - * @example 174 - */ - height: number; - /** @example 5a7a67a40e0a26020a000091 */ - id?: string; - /** @example .svg */ - file_type?: string; - /** - * @default 0 - * @example 5.318 - */ - vote_average: number; - /** - * @default 0 - * @example 3 - */ - vote_count: number; - /** - * @default 0 - * @example 422 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "person-popular-list": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 1 - */ - gender: number; - /** - * @default 0 - * @example 224513 - */ - id: number; - known_for?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /ilRyazdMJwN05exqhwK4tMKBYZs.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 335984 - */ - id: number; - /** @example movie */ - media_type?: string; - /** @example en */ - original_language?: string; - /** @example Blade Runner 2049 */ - original_title?: string; - /** @example Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years. */ - overview?: string; - /** @example /gajva2L0rPYkEWjzgFlBXCAVBE5.jpg */ - poster_path?: string; - /** @example 2017-10-04 */ - release_date?: string; - /** @example Blade Runner 2049 */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.5 - */ - vote_average: number; - /** - * @default 0 - * @example 11771 - */ - vote_count: number; - }[]; - /** @example Acting */ - known_for_department?: string; - /** @example Ana de Armas */ - name?: string; - /** - * @default 0 - * @example 343.33 - */ - popularity: number; - /** @example /3vxvsmYLTf4jnr163SUlBIw51ee.jpg */ - profile_path?: string; - }[]; - /** - * @default 0 - * @example 500 - */ - total_pages: number; - /** - * @default 0 - * @example 10000 - */ - total_results: number; - }; - }; - }; - }; - }; - "person-details": { - parameters: { - query?: { - /** @description comma separated list of endpoints within this namespace, 20 items max */ - append_to_response?: string; - language?: string; - }; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example false - */ - adult: boolean; - also_known_as?: string[]; - /** - * @example Thomas Jeffrey Hanks (born July 9, 1956) is an American actor and filmmaker. Known for both his comedic and dramatic roles, Hanks is one of the most popular and recognizable film stars worldwide, and is widely regarded as an American cultural icon. - * - * Hanks made his breakthrough with leading roles in the comedies Splash (1984) and Big (1988). He won two consecutive Academy Awards for Best Actor for starring as a gay lawyer suffering from AIDS in Philadelphia (1993) and a young man with below-average IQ in Forrest Gump (1994). Hanks collaborated with film director Steven Spielberg on five films: Saving Private Ryan (1998), Catch Me If You Can (2002), The Terminal (2004), Bridge of Spies (2015), and The Post (2017), as well as the 2001 miniseries Band of Brothers, which launched him as a director, producer, and screenwriter. - * - * Hanks' other notable films include the romantic comedies Sleepless in Seattle (1993) and You've Got Mail (1998); the dramas Apollo 13 (1995), The Green Mile (1999), Cast Away (2000), Road to Perdition (2002), and Cloud Atlas (2012); and the biographical dramas Saving Mr. Banks (2013), Captain Phillips (2013), Sully (2016), and A Beautiful Day in the Neighborhood (2019). He has also appeared as the title character in the Robert Langdon film series, and has voiced Sheriff Woody in the Toy Story film series. - * - * Description above from the Wikipedia article Tom Hanks, licensed under CC-BY-SA, full list of contributors on Wikipedia. - */ - biography?: string; - /** @example 1956-07-09 */ - birthday?: string; - deathday?: unknown; - /** - * @default 0 - * @example 2 - */ - gender: number; - homepage?: unknown; - /** - * @default 0 - * @example 31 - */ - id: number; - /** @example nm0000158 */ - imdb_id?: string; - /** @example Acting */ - known_for_department?: string; - /** @example Tom Hanks */ - name?: string; - /** @example Concord, California, USA */ - place_of_birth?: string; - /** - * @default 0 - * @example 82.989 - */ - popularity: number; - /** @example /xndWFsBlClOJFRdhSt4NBwiPq2o.jpg */ - profile_path?: string; - }; - }; - }; - }; - }; - "person-changes": { - parameters: { - query?: { - end_date?: string; - page?: number; - start_date?: string; - }; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - changes?: { - /** @example biography */ - key?: string; - items?: { - /** @example 640469b113654500ba4e859a */ - id?: string; - /** @example added */ - action?: string; - /** @example 2023-03-05 10:06:41 UTC */ - time?: string; - /** @example ca */ - iso_639_1?: string; - /** @example ES */ - iso_3166_1?: string; - /** - * @example Thomas "Tom" Jeffrey Hanks (Concord, Califòrnia, 9 de juliol de 1956) és un actor de cinema i productor estatunidenc, guanyador dues vegades de l'Oscar al millor actor i considerat un dels més versàtils i talentosos del cinema actual. - * - * Hanks és l'actor que més diners ha guanyat de tota la història del cinema amb un total de gairebé sis mil milions de dòlars (setembre 2006). És també copropietari de Playtone, una companyia de producció de pel·lícules. - */ - value?: string; - }[]; - }[]; - }; - }; - }; - }; - }; - "person-combined-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - person_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 13 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Forrest Gump */ - original_title?: string; - /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ - overview?: string; - /** - * @default 0 - * @example 62.225 - */ - popularity: number; - /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ - poster_path?: string; - /** @example 1994-06-23 */ - release_date?: string; - /** @example Forrest Gump */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.481 - */ - vote_average: number; - /** - * @default 0 - * @example 24535 - */ - vote_count: number; - /** @example Forrest Gump */ - character?: string; - /** @example 52fe420ec3a36847f800074f */ - credit_id?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - /** @example movie */ - media_type?: string; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /tx3uj8GPWf5pzb0gWATJ4bokNHI.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 87061 - */ - id: number; - /** @example fr */ - original_language?: string; - /** @example Le Voyage extraordinaire */ - original_title?: string; - /** @example An account of the extraordinary life of film pioneer Georges Méliès (1861-1938) and the amazing story of the copy in color of his masterpiece “A Trip to the Moon” (1902), unexpectedly found in Spain and restored thanks to the heroic efforts of a group of true cinema lovers. */ - overview?: string; - /** - * @default 0 - * @example 6.007 - */ - popularity: number; - /** @example /zHNNT9gfiGsuadR6x38KYOp6ekq.jpg */ - poster_path?: string; - /** @example 2011-12-08 */ - release_date?: string; - /** @example The Extraordinary Voyage */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.6 - */ - vote_average: number; - /** - * @default 0 - * @example 47 - */ - vote_count: number; - /** @example 5d818a63d34eb3002c4f8fea */ - credit_id?: string; - /** @example Crew */ - department?: string; - /** @example Thanks */ - job?: string; - /** @example movie */ - media_type?: string; - }[]; - /** - * @default 0 - * @example 31 - */ - id: number; - }; - }; - }; - }; - }; - "person-external-ids": { - parameters: { - query?: never; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 31 - */ - id: number; - /** @example /m/0bxtg */ - freebase_mid?: string; - /** @example /en/tom_hanks */ - freebase_id?: string; - /** @example nm0000158 */ - imdb_id?: string; - /** - * @default 0 - * @example 14293 - */ - tvrage_id: number; - /** @example Q2263 */ - wikidata_id?: string; - /** @example TomHanks */ - facebook_id?: string; - /** @example tomhanks */ - instagram_id?: string; - /** @example tomhanks */ - tiktok_id?: string; - /** @example tomhanks */ - twitter_id?: string; - youtube_id?: unknown; - }; - }; - }; - }; - }; - "person-images": { - parameters: { - query?: never; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 287 - */ - id: number; - profiles?: { - /** - * @default 0 - * @example 0.666 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 980 - */ - height: number; - iso_639_1?: unknown; - /** @example /cckcYc2v0yh1tc9QjRelptcOBko.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.288 - */ - vote_average: number; - /** - * @default 0 - * @example 89 - */ - vote_count: number; - /** - * @default 0 - * @example 653 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "person-latest-id": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example false - */ - adult: boolean; - also_known_as?: unknown[]; - /** @example */ - biography?: string; - birthday?: unknown; - deathday?: unknown; - /** - * @default 0 - * @example 0 - */ - gender: number; - homepage?: unknown; - /** - * @default 0 - * @example 4064343 - */ - id: number; - imdb_id?: unknown; - known_for_department?: unknown; - /** @example Ángel Cruz */ - name?: string; - place_of_birth?: unknown; - /** - * @default 0 - * @example 0 - */ - popularity: number; - profile_path?: unknown; - }; - }; - }; - }; - }; - "person-movie-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 13 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Forrest Gump */ - original_title?: string; - /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ - overview?: string; - /** - * @default 0 - * @example 62.225 - */ - popularity: number; - /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ - poster_path?: string; - /** @example 1994-06-23 */ - release_date?: string; - /** @example Forrest Gump */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.481 - */ - vote_average: number; - /** - * @default 0 - * @example 24535 - */ - vote_count: number; - /** @example Forrest Gump */ - character?: string; - /** @example 52fe420ec3a36847f800074f */ - credit_id?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /tx3uj8GPWf5pzb0gWATJ4bokNHI.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 87061 - */ - id: number; - /** @example fr */ - original_language?: string; - /** @example Le Voyage extraordinaire */ - original_title?: string; - /** @example An account of the extraordinary life of film pioneer Georges Méliès (1861-1938) and the amazing story of the copy in color of his masterpiece “A Trip to the Moon” (1902), unexpectedly found in Spain and restored thanks to the heroic efforts of a group of true cinema lovers. */ - overview?: string; - /** - * @default 0 - * @example 6.007 - */ - popularity: number; - /** @example /zHNNT9gfiGsuadR6x38KYOp6ekq.jpg */ - poster_path?: string; - /** @example 2011-12-08 */ - release_date?: string; - /** @example The Extraordinary Voyage */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.6 - */ - vote_average: number; - /** - * @default 0 - * @example 47 - */ - vote_count: number; - /** @example 5d818a63d34eb3002c4f8fea */ - credit_id?: string; - /** @example Crew */ - department?: string; - /** @example Thanks */ - job?: string; - }[]; - /** - * @default 0 - * @example 31 - */ - id: number; - }; - }; - }; - }; - }; - "person-tv-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /ttvojTMgaIN7U8gqB5LlNqO4vPN.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 1900 - */ - id: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example LIVE with Kelly and Mark */ - original_name?: string; - /** @example A morning talk show with A-list celebrity guests, top-notch performances and one-of-a-kind segments that are unrivaled on daytime television, plus spontaneous, hilarious and unpredictable talk. */ - overview?: string; - /** - * @default 0 - * @example 700.508 - */ - popularity: number; - /** @example /l5y8egG27p2fSTyq8s21SQMmQLy.jpg */ - poster_path?: string; - /** @example 1988-09-05 */ - first_air_date?: string; - /** @example LIVE with Kelly and Mark */ - name?: string; - /** - * @default 0 - * @example 5.4 - */ - vote_average: number; - /** - * @default 0 - * @example 25 - */ - vote_count: number; - /** @example */ - character?: string; - /** @example 52571af019c29571140d5c92 */ - credit_id?: string; - /** - * @default 0 - * @example 1 - */ - episode_count: number; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /6uMA6EAiwcsCqQJwWgYwtORvE0v.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 2391 - */ - id: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example Tales from the Crypt */ - original_name?: string; - /** @example Cadaverous scream legend the Crypt Keeper is your macabre host for these forays of fright and fun based on the classic E.C. Comics tales from back in the day. So shamble up to the bar and pick your poison. Will it be an insane Santa on a personal slay ride? Honeymooners out to fulfill the "til death do we part" vow ASAP? */ - overview?: string; - /** - * @default 0 - * @example 24.88 - */ - popularity: number; - /** @example /dDfXQH6Kg2JNASI0dqNALukjhk1.jpg */ - poster_path?: string; - /** @example 1989-06-10 */ - first_air_date?: string; - /** @example Tales from the Crypt */ - name?: string; - /** - * @default 0 - * @example 7.978 - */ - vote_average: number; - /** - * @default 0 - * @example 757 - */ - vote_count: number; - /** @example 525734f3760ee3776a397211 */ - credit_id?: string; - /** @example Directing */ - department?: string; - /** - * @default 0 - * @example 1 - */ - episode_count: number; - /** @example Director */ - job?: string; - }[]; - /** - * @default 0 - * @example 31 - */ - id: number; - }; - }; - }; - }; - }; - "person-tagged-images": { - parameters: { - query?: { - page?: number; - }; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 31 - */ - id: number; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default 0 - * @example 0.6666666666666666 - */ - aspect_ratio: number; - /** @example /1wY4psJ5NVEhCuOYROwLH2XExM2.jpg */ - file_path?: string; - /** - * @default 0 - * @example 1500 - */ - height: number; - /** @example 5b235d740e0a265b5d0031d9 */ - id?: string; - /** @example en */ - iso_639_1?: string; - /** - * @default 0 - * @example 5.456 - */ - vote_average: number; - /** - * @default 0 - * @example 7 - */ - vote_count: number; - /** - * @default 0 - * @example 1000 - */ - width: number; - /** @example poster */ - image_type?: string; - media?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /bdD39MpSVhKjxarTxLSfX6baoMP.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 857 - */ - id: number; - /** @example Saving Private Ryan */ - title?: string; - /** @example en */ - original_language?: string; - /** @example Saving Private Ryan */ - original_title?: string; - /** @example As U.S. troops storm the beaches of Normandy, three brothers lie dead on the battlefield, with a fourth trapped behind enemy lines. Ranger captain John Miller and seven men are tasked with penetrating German-held territory and bringing the boy home. */ - overview?: string; - /** @example /uqx37cS8cpHg8U35f9U5IBlrCV3.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 70.45 - */ - popularity: number; - /** @example 1998-07-24 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.208 - */ - vote_average: number; - /** - * @default 0 - * @example 14134 - */ - vote_count: number; - }; - /** @example movie */ - media_type?: string; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 13 - */ - total_results: number; - }; - }; - }; - }; - }; - translations: { - parameters: { - query?: never; - header?: never; - path: { - person_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 31 - */ - id: number; - translations?: { - /** @example US */ - iso_3166_1?: string; - /** @example en */ - iso_639_1?: string; - /** @example English */ - name?: string; - /** @example English */ - english_name?: string; - data?: { - /** - * @example Thomas Jeffrey Hanks (born July 9, 1956) is an American actor and filmmaker. Known for both his comedic and dramatic roles, Hanks is one of the most popular and recognizable film stars worldwide, and is widely regarded as an American cultural icon. - * - * Hanks made his breakthrough with leading roles in the comedies Splash (1984) and Big (1988). He won two consecutive Academy Awards for Best Actor for starring as a gay lawyer suffering from AIDS in Philadelphia (1993) and a young man with below-average IQ in Forrest Gump (1994). Hanks collaborated with film director Steven Spielberg on five films: Saving Private Ryan (1998), Catch Me If You Can (2002), The Terminal (2004), Bridge of Spies (2015), and The Post (2017), as well as the 2001 miniseries Band of Brothers, which launched him as a director, producer, and screenwriter. - * - * Hanks' other notable films include the romantic comedies Sleepless in Seattle (1993) and You've Got Mail (1998); the dramas Apollo 13 (1995), The Green Mile (1999), Cast Away (2000), Road to Perdition (2002), and Cloud Atlas (2012); and the biographical dramas Saving Mr. Banks (2013), Captain Phillips (2013), Sully (2016), and A Beautiful Day in the Neighborhood (2019). He has also appeared as the title character in the Robert Langdon film series, and has voiced Sheriff Woody in the Toy Story film series. - * - * Description above from the Wikipedia article Tom Hanks, licensed under CC-BY-SA, full list of contributors on Wikipedia. - */ - biography?: string; - /** @example Tom Hanks */ - name?: string; - }; - }[]; - }; - }; - }; - }; - }; - "review-details": { - parameters: { - query?: never; - header?: never; - path: { - review_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example 640b2aeecaaca20079decdcc */ - id?: string; - /** @example Ricardo Oliveira */ - author?: string; - author_details?: { - /** @example Ricardo Oliveira */ - name?: string; - /** @example RSOliveira */ - username?: string; - /** @example /23Cl7rhsknc7IIAcZZAGKzovjTu.jpg */ - avatar_path?: string; - /** - * @default 0 - * @example 9 - */ - rating: number; - }; - /** - * @example "The Last of Us" is a post-apocalyptic TV series based on the popular video game of the same name. The story follows the journey of Joel, a smuggler, and Ellie, a teenage girl who may be the key to finding a cure for a deadly fungal infection that has ravaged the world. - * - * The series features outstanding performances from Pedro Pascal as Joel, Bella Ramsey as Ellie, and Anna Torv as Tess. The chemistry between the main characters is excellent, and the casting is spot-on. - * - * The show's writing is superb, and it captures the essence of the video game while adding a fresh perspective. The narrative is engaging, and the pacing is just right, with each episode leaving you on the edge of your seat, eager to see what happens next. - * - * The show's production value is top-notch, with stunning visuals and cinematography that capture the bleak and haunting atmosphere of a post-apocalyptic world. The use of practical effects and makeup is impressive and adds to the overall immersion of the story. - * - * Overall, "The Last of Us" is an outstanding TV series that does justice to the source material. It's a must-watch for fans of the video game and anyone who enjoys gripping and emotional storytelling. I would rate it a 9 out of 10. - * - * - * - * Written and Reviewed by RSOliveira - */ - content?: string; - /** @example 2023-03-10T13:04:46.674Z */ - created_at?: string; - /** @example en */ - iso_639_1?: string; - /** - * @default 0 - * @example 100088 - */ - media_id: number; - /** @example The Last of Us */ - media_title?: string; - /** @example tv */ - media_type?: string; - /** @example 2023-03-10T13:04:46.734Z */ - updated_at?: string; - /** @example https://www.themoviedb.org/review/640b2aeecaaca20079decdcc */ - url?: string; - }; - }; - }; - }; - }; - "search-collection": { - parameters: { - query: { - query: string; - include_adult?: boolean; - language?: string; - page?: number; - region?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /zuW6fOiusv4X9nnW3paHGfXcSll.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 86311 - */ - id: number; - /** @example The Avengers Collection */ - name?: string; - /** @example en */ - original_language?: string; - /** @example The Avengers Collection */ - original_name?: string; - /** @example A superhero film series produced by Marvel Studios based on the Marvel Comics superhero team of the same name, and part of the Marvel Cinematic Universe (MCU). The series features an ensemble cast from the Marvel Cinematic Universe series films, as they join forces for the peacekeeping organization S.H.I.E.L.D. led by Nick Fury. */ - overview?: string; - /** @example /yFSIUVTCvgYrpalUktulvk3Gi5Y.jpg */ - poster_path?: string; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 1 - */ - total_results: number; - }; - }; - }; - }; - }; - "search-company": { - parameters: { - query: { - query: string; - page?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default 0 - * @example 3268 - */ - id: number; - /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ - logo_path?: string; - /** @example HBO */ - name?: string; - /** @example US */ - origin_country?: string; - }[]; - /** - * @default 0 - * @example 2 - */ - total_pages: number; - /** - * @default 0 - * @example 22 - */ - total_results: number; - }; - }; - }; - }; - }; - "search-keyword": { - parameters: { - query: { - query: string; - page?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default 0 - * @example 262419 - */ - id: number; - /** @example lost */ - name?: string; - }[]; - /** - * @default 0 - * @example 5 - */ - total_pages: number; - /** - * @default 0 - * @example 84 - */ - total_results: number; - }; - }; - }; - }; - }; - "search-movie": { - parameters: { - query: { - query: string; - include_adult?: boolean; - language?: string; - primary_release_year?: string; - page?: number; - region?: string; - year?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 550 - */ - id: number; - /** @example en */ - original_language?: string; - /** @example Fight Club */ - original_title?: string; - /** @example A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground "fight clubs" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion. */ - overview?: string; - /** - * @default 0 - * @example 73.433 - */ - popularity: number; - /** @example /pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg */ - poster_path?: string; - /** @example 1999-10-15 */ - release_date?: string; - /** @example Fight Club */ - title?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.433 - */ - vote_average: number; - /** - * @default 0 - * @example 26279 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 2 - */ - total_pages: number; - /** - * @default 0 - * @example 39 - */ - total_results: number; - }; - }; - }; - }; - }; - "search-multi": { - parameters: { - query: { - query: string; - include_adult?: boolean; - language?: string; - page?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /aDYSnJAK0BTVeE8osOy22Kz3SXY.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 11 - */ - id: number; - /** @example Star Wars */ - title?: string; - /** @example en */ - original_language?: string; - /** @example Star Wars */ - original_title?: string; - /** @example Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire. */ - overview?: string; - /** @example /6FfCtAuVAW8XJjZ7eWeLibRLWTw.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 78.047 - */ - popularity: number; - /** @example 1977-05-25 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.208 - */ - vote_average: number; - /** - * @default 0 - * @example 18528 - */ - vote_count: number; - name?: string; - original_name?: string; - }[]; - /** - * @default 0 - * @example 11 - */ - total_pages: number; - /** - * @default 0 - * @example 201 - */ - total_results: number; - }; - }; - }; - }; - }; - "search-person": { - parameters: { - query: { - query: string; - include_adult?: boolean; - language?: string; - page?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 31 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Tom Hanks */ - name?: string; - /** @example Tom Hanks */ - original_name?: string; - /** - * @default 0 - * @example 84.631 - */ - popularity: number; - /** @example /xndWFsBlClOJFRdhSt4NBwiPq2o.jpg */ - profile_path?: string; - known_for?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 13 - */ - id: number; - /** @example Forrest Gump */ - title?: string; - /** @example en */ - original_language?: string; - /** @example Forrest Gump */ - original_title?: string; - /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ - overview?: string; - /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 67.209 - */ - popularity: number; - /** @example 1994-06-23 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 8.481 - */ - vote_average: number; - /** - * @default 0 - * @example 24525 - */ - vote_count: number; - }[]; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 1 - */ - total_results: number; - }; - }; - }; - }; - }; - "search-tv": { - parameters: { - query: { - query: string; - /** @description Search only the first air date. Valid values are: 1000..9999 */ - first_air_date_year?: number; - include_adult?: boolean; - language?: string; - page?: number; - /** @description Search the first air date and all episode air dates. Valid values are: 1000..9999 */ - year?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 1396 - */ - id: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example Breaking Bad */ - original_name?: string; - /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ - overview?: string; - /** - * @default 0 - * @example 298.884 - */ - popularity: number; - /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ - poster_path?: string; - /** @example 2008-01-20 */ - first_air_date?: string; - /** @example Breaking Bad */ - name?: string; - /** - * @default 0 - * @example 8.879 - */ - vote_average: number; - /** - * @default 0 - * @example 11536 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 1 - */ - total_results: number; - }; - }; - }; - }; - }; - "trending-all": { - parameters: { - query?: { - /** @description `ISO-639-1`-`ISO-3166-1` code */ - language?: string; - }; - header?: never; - path: { - time_window: "day" | "week"; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 934433 - */ - id: number; - /** @example Scream VI */ - title?: string; - /** @example en */ - original_language?: string; - /** @example Scream VI */ - original_title?: string; - /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ - overview?: string; - /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 609.941 - */ - popularity: number; - /** @example 2023-03-08 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.374 - */ - vote_average: number; - /** - * @default 0 - * @example 684 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 1000 - */ - total_pages: number; - /** - * @default 0 - * @example 20000 - */ - total_results: number; - }; - }; - }; - }; - }; - "trending-movies": { - parameters: { - query?: { - /** @description `ISO-639-1`-`ISO-3166-1` code */ - language?: string; - }; - header?: never; - path: { - time_window: "day" | "week"; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 934433 - */ - id: number; - /** @example Scream VI */ - title?: string; - /** @example en */ - original_language?: string; - /** @example Scream VI */ - original_title?: string; - /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ - overview?: string; - /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 609.941 - */ - popularity: number; - /** @example 2023-03-08 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.374 - */ - vote_average: number; - /** - * @default 0 - * @example 684 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 1000 - */ - total_pages: number; - /** - * @default 0 - * @example 20000 - */ - total_results: number; - }; - }; - }; - }; - }; - "trending-people": { - parameters: { - query?: { - /** @description `ISO-639-1`-`ISO-3166-1` code */ - language?: string; - }; - header?: never; - path: { - time_window: "day" | "week"; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 224513 - */ - id: number; - /** @example Ana de Armas */ - name?: string; - /** @example Ana de Armas */ - original_name?: string; - /** @example person */ - media_type?: string; - /** - * @default 0 - * @example 349.766 - */ - popularity: number; - /** - * @default 0 - * @example 1 - */ - gender: number; - /** @example Acting */ - known_for_department?: string; - /** @example /3vxvsmYLTf4jnr163SUlBIw51ee.jpg */ - profile_path?: string; - known_for?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /ilRyazdMJwN05exqhwK4tMKBYZs.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 335984 - */ - id: number; - /** @example Blade Runner 2049 */ - title?: string; - /** @example en */ - original_language?: string; - /** @example Blade Runner 2049 */ - original_title?: string; - /** @example Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years. */ - overview?: string; - /** @example /gajva2L0rPYkEWjzgFlBXCAVBE5.jpg */ - poster_path?: string; - /** @example movie */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 79.571 - */ - popularity: number; - /** @example 2017-10-04 */ - release_date?: string; - /** - * @default true - * @example false - */ - video: boolean; - /** - * @default 0 - * @example 7.531 - */ - vote_average: number; - /** - * @default 0 - * @example 11771 - */ - vote_count: number; - }[]; - }[]; - /** - * @default 0 - * @example 1000 - */ - total_pages: number; - /** - * @default 0 - * @example 20000 - */ - total_results: number; - }; - }; - }; - }; - }; - "trending-tv": { - parameters: { - query?: { - /** @description `ISO-639-1`-`ISO-3166-1` code */ - language?: string; - }; - header?: never; - path: { - time_window: "day" | "week"; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /8P15FsYcTwQZ4G5rRMd1TKD14Aq.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 103768 - */ - id: number; - /** @example Sweet Tooth */ - name?: string; - /** @example en */ - original_language?: string; - /** @example Sweet Tooth */ - original_name?: string; - /** @example On a perilous adventure across a post-apocalyptic world, a lovable boy who's half-human and half-deer searches for a new beginning with a gruff protector. */ - overview?: string; - /** @example /dBxxtfhC4vYrxB2fLsSxOTY2dQc.jpg */ - poster_path?: string; - /** @example tv */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 137.498 - */ - popularity: number; - /** @example 2021-06-04 */ - first_air_date?: string; - /** - * @default 0 - * @example 7.928 - */ - vote_average: number; - /** - * @default 0 - * @example 1094 - */ - vote_count: number; - origin_country?: string[]; - }[]; - /** - * @default 0 - * @example 1000 - */ - total_pages: number; - /** - * @default 0 - * @example 20000 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-airing-today-list": { - parameters: { - query?: { - language?: string; - page?: number; - timezone?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ - backdrop_path?: string; - /** @example 2023-01-23 */ - first_air_date?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 202250 - */ - id: number; - /** @example Dirty Linen */ - name?: string; - origin_country?: string[]; - /** @example tl */ - original_language?: string; - /** @example Dirty Linen */ - original_name?: string; - /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ - overview?: string; - /** - * @default 0 - * @example 2797.914 - */ - popularity: number; - /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 5 - */ - vote_average: number; - /** - * @default 0 - * @example 13 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 14 - */ - total_pages: number; - /** - * @default 0 - * @example 265 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-on-the-air-list": { - parameters: { - query?: { - language?: string; - page?: number; - timezone?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ - backdrop_path?: string; - /** @example 2023-01-23 */ - first_air_date?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 202250 - */ - id: number; - /** @example Dirty Linen */ - name?: string; - origin_country?: string[]; - /** @example tl */ - original_language?: string; - /** @example Dirty Linen */ - original_name?: string; - /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ - overview?: string; - /** - * @default 0 - * @example 2797.914 - */ - popularity: number; - /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 5 - */ - vote_average: number; - /** - * @default 0 - * @example 13 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 58 - */ - total_pages: number; - /** - * @default 0 - * @example 1151 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-popular-list": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ - backdrop_path?: string; - /** @example 2023-01-23 */ - first_air_date?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 202250 - */ - id: number; - /** @example Dirty Linen */ - name?: string; - origin_country?: string[]; - /** @example tl */ - original_language?: string; - /** @example Dirty Linen */ - original_name?: string; - /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ - overview?: string; - /** - * @default 0 - * @example 2797.914 - */ - popularity: number; - /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 5 - */ - vote_average: number; - /** - * @default 0 - * @example 13 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 7416 - */ - total_pages: number; - /** - * @default 0 - * @example 148302 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-top-rated-list": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example /99vBORZixICa32Pwdwj0lWcr8K.jpg */ - backdrop_path?: string; - /** @example 2021-09-03 */ - first_air_date?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 130392 - */ - id: number; - /** @example The D'Amelio Show */ - name?: string; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example The D'Amelio Show */ - original_name?: string; - /** @example From relative obscurity and a seemingly normal life, to overnight success and thrust into the Hollywood limelight overnight, the D’Amelios are faced with new challenges and opportunities they could not have imagined. */ - overview?: string; - /** - * @default 0 - * @example 12.459 - */ - popularity: number; - /** @example /phv2Jc4H8cvRzvTKb9X1uKMboTu.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 8.9 - */ - vote_average: number; - /** - * @default 0 - * @example 3190 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 142 - */ - total_pages: number; - /** - * @default 0 - * @example 2833 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-details": { - parameters: { - query?: { - /** @description comma separated list of endpoints within this namespace, 20 items max */ - append_to_response?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /6LWy0jvMpmjoS9fojNgHIKoWL05.jpg */ - backdrop_path?: string; - created_by?: { - /** - * @default 0 - * @example 9813 - */ - id: number; - /** @example 5256c8c219c2956ff604858a */ - credit_id?: string; - /** @example David Benioff */ - name?: string; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** @example /xvNN5huL0X8yJ7h3IZfGG4O2zBD.jpg */ - profile_path?: string; - }[]; - episode_run_time?: number[]; - /** @example 2011-04-17 */ - first_air_date?: string; - genres?: { - /** - * @default 0 - * @example 10765 - */ - id: number; - /** @example Sci-Fi & Fantasy */ - name?: string; - }[]; - /** @example http://www.hbo.com/game-of-thrones */ - homepage?: string; - /** - * @default 0 - * @example 1399 - */ - id: number; - /** - * @default true - * @example false - */ - in_production: boolean; - languages?: string[]; - /** @example 2019-05-19 */ - last_air_date?: string; - last_episode_to_air?: { - /** - * @default 0 - * @example 1551830 - */ - id: number; - /** @example The Iron Throne */ - name?: string; - /** @example In the aftermath of the devastating attack on King's Landing, Daenerys must face the survivors. */ - overview?: string; - /** - * @default 0 - * @example 4.809 - */ - vote_average: number; - /** - * @default 0 - * @example 241 - */ - vote_count: number; - /** @example 2019-05-19 */ - air_date?: string; - /** - * @default 0 - * @example 6 - */ - episode_number: number; - /** @example 806 */ - production_code?: string; - /** - * @default 0 - * @example 80 - */ - runtime: number; - /** - * @default 0 - * @example 8 - */ - season_number: number; - /** - * @default 0 - * @example 1399 - */ - show_id: number; - /** @example /zBi2O5EJfgTS6Ae0HdAYLm9o2nf.jpg */ - still_path?: string; - }; - /** @example Game of Thrones */ - name?: string; - next_episode_to_air?: unknown; - networks?: { - /** - * @default 0 - * @example 49 - */ - id: number; - /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ - logo_path?: string; - /** @example HBO */ - name?: string; - /** @example US */ - origin_country?: string; - }[]; - /** - * @default 0 - * @example 73 - */ - number_of_episodes: number; - /** - * @default 0 - * @example 8 - */ - number_of_seasons: number; - origin_country?: string[]; - /** @example en */ - original_language?: string; - /** @example Game of Thrones */ - original_name?: string; - /** @example Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond. */ - overview?: string; - /** - * @default 0 - * @example 346.098 - */ - popularity: number; - /** @example /1XS1oqL89opfnbLl8WnZY1O1uJx.jpg */ - poster_path?: string; - production_companies?: { - /** - * @default 0 - * @example 76043 - */ - id: number; - /** @example /9RO2vbQ67otPrBLXCaC8UMp3Qat.png */ - logo_path?: string; - /** @example Revolution Sun Studios */ - name?: string; - /** @example US */ - origin_country?: string; - }[]; - production_countries?: { - /** @example GB */ - iso_3166_1?: string; - /** @example United Kingdom */ - name?: string; - }[]; - seasons?: { - /** @example 2010-12-05 */ - air_date?: string; - /** - * @default 0 - * @example 272 - */ - episode_count: number; - /** - * @default 0 - * @example 3627 - */ - id: number; - /** @example Specials */ - name?: string; - /** @example */ - overview?: string; - /** @example /kMTcwNRfFKCZ0O2OaBZS0nZ2AIe.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 0 - */ - season_number: number; - /** - * @default 0 - * @example 0 - */ - vote_average: number; - }[]; - spoken_languages?: { - /** @example English */ - english_name?: string; - /** @example en */ - iso_639_1?: string; - /** @example English */ - name?: string; - }[]; - /** @example Ended */ - status?: string; - /** @example Winter Is Coming */ - tagline?: string; - /** @example Scripted */ - type?: string; - /** - * @default 0 - * @example 8.438 - */ - vote_average: number; - /** - * @default 0 - * @example 21390 - */ - vote_count: number; - }; - }; - }; - }; - }; - "tv-series-account-states": { - parameters: { - query?: { - session_id?: string; - guest_session_id?: string; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - /** - * @default true - * @example true - */ - favorite: boolean; - rated?: { - /** - * @default 0 - * @example 9 - */ - value: number; - }; - /** - * @default true - * @example false - */ - watchlist: boolean; - }; - }; - }; - }; - }; - "tv-series-aggregate-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 1 - */ - gender: number; - /** - * @default 0 - * @example 1223786 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Emilia Clarke */ - name?: string; - /** @example Emilia Clarke */ - original_name?: string; - /** - * @default 0 - * @example 42.737 - */ - popularity: number; - /** @example /u59kTmNHXzaGZqokivxLPiBVIML.jpg */ - profile_path?: string; - roles?: { - /** @example 5256c8af19c2956ff60479f6 */ - credit_id?: string; - /** @example Daenerys Targaryen */ - character?: string; - /** - * @default 0 - * @example 78 - */ - episode_count: number; - }[]; - /** - * @default 0 - * @example 78 - */ - total_episode_count: number; - /** - * @default 0 - * @example 6 - */ - order: number; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 1 - */ - gender: number; - /** - * @default 0 - * @example 6411 - */ - id: number; - /** @example Art */ - known_for_department?: string; - /** @example Deborah Riley */ - name?: string; - /** @example Deborah Riley */ - original_name?: string; - /** - * @default 0 - * @example 1.4 - */ - popularity: number; - /** @example /cjhADpqdrnwB1PdDUKaBnWrIj2Q.jpg */ - profile_path?: string; - jobs?: { - /** @example 54eee9e5c3a3686d5800584e */ - credit_id?: string; - /** @example Production Design */ - job?: string; - /** - * @default 0 - * @example 43 - */ - episode_count: number; - }[]; - /** @example Art */ - department?: string; - /** - * @default 0 - * @example 43 - */ - total_episode_count: number; - }[]; - /** - * @default 0 - * @example 1399 - */ - id: number; - }; - }; - }; - }; - }; - "tv-series-alternative-titles": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - results?: { - /** @example AL */ - iso_3166_1?: string; - /** @example Froni i shpatave */ - title?: string; - /** @example */ - type?: string; - }[]; - }; - }; - }; - }; - }; - "tv-series-changes": { - parameters: { - query?: { - end_date?: string; - page?: number; - start_date?: string; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - changes?: { - /** @example images */ - key?: string; - items?: { - /** @example 640435cf021cee0084710972 */ - id?: string; - /** @example updated */ - action?: string; - /** @example 2023-03-05 06:25:19 UTC */ - time?: string; - /** @example en */ - iso_639_1?: string; - /** @example */ - iso_3166_1?: string; - value?: { - poster?: { - /** @example /ouudK6RCNnsbT1CSXrlATXQIQTG.jpg */ - file_path?: string; - /** @example en */ - iso_639_1?: string; - }; - }; - original_value?: { - poster?: { - /** @example /ouudK6RCNnsbT1CSXrlATXQIQTG.jpg */ - file_path?: string; - /** @example fr */ - iso_639_1?: string; - }; - }; - }[]; - }[]; - }; - }; - }; - }; - }; - "tv-series-content-ratings": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - descriptors?: unknown[]; - /** @example DE */ - iso_3166_1?: string; - /** @example 16 */ - rating?: string; - }[]; - /** - * @default 0 - * @example 1399 - */ - id: number; - }; - }; - }; - }; - }; - "tv-series-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 22970 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Peter Dinklage */ - name?: string; - /** @example Peter Dinklage */ - original_name?: string; - /** - * @default 0 - * @example 30.6 - */ - popularity: number; - /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ - profile_path?: string; - /** @example Tyrion Lannister */ - character?: string; - /** @example 5256c8b219c2956ff6047cd8 */ - credit_id?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 1406855 - */ - id: number; - /** @example Production */ - known_for_department?: string; - /** @example Duncan Muggoch */ - name?: string; - /** @example Duncan Muggoch */ - original_name?: string; - /** - * @default 0 - * @example 1.592 - */ - popularity: number; - /** @example /ukGjJ62Ejd4cFziald03G34Fsrp.jpg */ - profile_path?: string; - /** @example 5ceab029c3a3682e93217a85 */ - credit_id?: string; - /** @example Production */ - department?: string; - /** @example Producer */ - job?: string; - }[]; - /** - * @default 0 - * @example 1399 - */ - id: number; - }; - }; - }; - }; - }; - "tv-series-episode-groups": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - /** @example */ - description?: string; - /** - * @default 0 - * @example 102 - */ - episode_count: number; - /** - * @default 0 - * @example 9 - */ - group_count: number; - /** @example 5e9077d2e640d600151f32bd */ - id?: string; - /** @example Aired Order */ - name?: string; - network?: { - /** - * @default 0 - * @example 49 - */ - id: number; - /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ - logo_path?: string; - /** @example HBO */ - name?: string; - /** @example US */ - origin_country?: string; - }; - /** - * @default 0 - * @example 1 - */ - type: number; - }[]; - /** - * @default 0 - * @example 1399 - */ - id: number; - }; - }; - }; - }; - }; - "tv-series-external-ids": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - /** @example tt0944947 */ - imdb_id?: string; - /** @example /m/0524b41 */ - freebase_mid?: string; - /** @example /en/game_of_thrones */ - freebase_id?: string; - /** - * @default 0 - * @example 121361 - */ - tvdb_id: number; - /** - * @default 0 - * @example 24493 - */ - tvrage_id: number; - /** @example Q23572 */ - wikidata_id?: string; - /** @example GameOfThrones */ - facebook_id?: string; - /** @example gameofthrones */ - instagram_id?: string; - /** @example GameOfThrones */ - twitter_id?: string; - }; - }; - }; - }; - }; - "tv-series-images": { - parameters: { - query?: { - /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ - include_image_language?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - backdrops?: { - /** - * @default 0 - * @example 1.778 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 800 - */ - height: number; - iso_639_1?: unknown; - /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.622 - */ - vote_average: number; - /** - * @default 0 - * @example 20 - */ - vote_count: number; - /** - * @default 0 - * @example 1422 - */ - width: number; - }[]; - /** - * @default 0 - * @example 550 - */ - id: number; - logos?: { - /** - * @default 0 - * @example 5.203 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 79 - */ - height: number; - /** @example he */ - iso_639_1?: string; - /** @example /c1KLulrIhUqY5fT42nmC5aERGCp.png */ - file_path?: string; - /** - * @default 0 - * @example 5.312 - */ - vote_average: number; - /** - * @default 0 - * @example 1 - */ - vote_count: number; - /** - * @default 0 - * @example 411 - */ - width: number; - }[]; - posters?: { - /** - * @default 0 - * @example 0.667 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 900 - */ - height: number; - /** @example pt */ - iso_639_1?: string; - /** @example /r3pPehX4ik8NLYPpbDRAh0YRtMb.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.258 - */ - vote_average: number; - /** - * @default 0 - * @example 6 - */ - vote_count: number; - /** - * @default 0 - * @example 600 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "tv-series-keywords": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - results?: { - /** @example based on novel or book */ - name?: string; - /** - * @default 0 - * @example 818 - */ - id: number; - }[]; - }; - }; - }; - }; - }; - "tv-series-latest-id": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default true - * @example false - */ - adult: boolean; - backdrop_path?: unknown; - created_by?: unknown[]; - episode_run_time?: unknown[]; - /** @example */ - first_air_date?: string; - genres?: unknown[]; - /** @example */ - homepage?: string; - /** - * @default 0 - * @example 225491 - */ - id: number; - /** - * @default true - * @example true - */ - in_production: boolean; - languages?: unknown[]; - /** @example 2023-04-21 */ - last_air_date?: string; - last_episode_to_air?: { - /** - * @default 0 - * @example 4398801 - */ - id: number; - /** @example Episode 8 */ - name?: string; - /** @example */ - overview?: string; - /** - * @default 0 - * @example 0 - */ - vote_average: number; - /** - * @default 0 - * @example 0 - */ - vote_count: number; - /** @example 2023-04-21 */ - air_date?: string; - /** - * @default 0 - * @example 8 - */ - episode_number: number; - /** @example */ - production_code?: string; - runtime?: unknown; - /** - * @default 0 - * @example 1 - */ - season_number: number; - /** - * @default 0 - * @example 225491 - */ - show_id: number; - still_path?: unknown; - }; - /** @example 妖怪传 */ - name?: string; - next_episode_to_air?: unknown; - networks?: unknown[]; - /** - * @default 0 - * @example 1 - */ - number_of_episodes: number; - /** - * @default 0 - * @example 1 - */ - number_of_seasons: number; - origin_country?: string[]; - /** @example zh */ - original_language?: string; - /** @example 妖怪传 */ - original_name?: string; - /** @example */ - overview?: string; - /** - * @default 0 - * @example 0 - */ - popularity: number; - poster_path?: unknown; - production_companies?: unknown[]; - production_countries?: unknown[]; - seasons?: { - air_date?: unknown; - /** - * @default 0 - * @example 1 - */ - episode_count: number; - /** - * @default 0 - * @example 338956 - */ - id: number; - /** @example Season 1 */ - name?: string; - /** @example */ - overview?: string; - poster_path?: unknown; - /** - * @default 0 - * @example 1 - */ - season_number: number; - }[]; - spoken_languages?: unknown[]; - /** @example Returning Series */ - status?: string; - /** @example */ - tagline?: string; - /** @example Scripted */ - type?: string; - /** - * @default 0 - * @example 0 - */ - vote_average: number; - /** - * @default 0 - * @example 0 - */ - vote_count: number; - }; - }; - }; - }; - }; - "lists-copy": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example */ - description?: string; - /** - * @default 0 - * @example 0 - */ - favorite_count: number; - /** - * @default 0 - * @example 8257231 - */ - id: number; - /** - * @default 0 - * @example 182 - */ - item_count: number; - /** @example en */ - iso_639_1?: string; - /** @example US */ - iso_3166_1?: string; - /** @example Done */ - name?: string; - poster_path?: unknown; - }[]; - /** - * @default 0 - * @example 96 - */ - total_pages: number; - /** - * @default 0 - * @example 1906 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-recommendations": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ - backdrop_path?: string; - /** - * @default 0 - * @example 1396 - */ - id: number; - /** @example Breaking Bad */ - name?: string; - /** @example en */ - original_language?: string; - /** @example Breaking Bad */ - original_name?: string; - /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ - overview?: string; - /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ - poster_path?: string; - /** @example tv */ - media_type?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 292.904 - */ - popularity: number; - /** @example 2008-01-20 */ - first_air_date?: string; - /** - * @default 0 - * @example 8.878 - */ - vote_average: number; - /** - * @default 0 - * @example 11544 - */ - vote_count: number; - origin_country?: string[]; - }[]; - /** - * @default 0 - * @example 2 - */ - total_pages: number; - /** - * @default 0 - * @example 40 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-reviews": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** @example lmao7 */ - author?: string; - author_details?: { - /** @example lmao7 */ - name?: string; - /** @example lmao7 */ - username?: string; - /** @example /ekmYOUU4tfx9zGGadjRdE7UPce.jpg */ - avatar_path?: string; - /** - * @default 0 - * @example 9 - */ - rating: number; - }; - /** - * @example I started watching when it came out as I heard that fans of LOTR also liked this. I stopped watching after Season 1 as I was devastated lol kinda. Only 2015 I decided to continue watching and got addicted like it seemed complicated at first, too many stories and characters. I even used a guide from internet like family tree per house while watching or GOT wiki so I can have more background on the characters. For a TV series, this show can really take you to a different world and never knowing what will happen. It is very daring that any time anybody can just die (I learned not to be attached and have accepted that they will all die so I won't be devastated hehe). I have never read the books but the show is entertaining and you will really root for your faves and really hate on those you hate. - * - * Fantasy, action, drama, comedy, love...and lots of surprises! - */ - content?: string; - /** @example 2017-02-20T05:47:28.872Z */ - created_at?: string; - /** @example 58aa82f09251416f92006a3a */ - id?: string; - /** @example 2021-06-23T15:57:54.649Z */ - updated_at?: string; - /** @example https://www.themoviedb.org/review/58aa82f09251416f92006a3a */ - url?: string; - }[]; - /** - * @default 0 - * @example 1 - */ - total_pages: number; - /** - * @default 0 - * @example 11 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-screened-theatrically": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - results?: { - /** - * @default 0 - * @example 1159054 - */ - id: number; - /** - * @default 0 - * @example 10 - */ - episode_number: number; - /** - * @default 0 - * @example 5 - */ - season_number: number; - }[]; - }; - }; - }; - }; - }; - "tv-series-similar": { - parameters: { - query?: { - language?: string; - page?: number; - }; - header?: never; - path: { - series_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - page: number; - results?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** @example /zcFSvWa34nDn2NcqOPuthyOIBWT.jpg */ - backdrop_path?: string; - genre_ids?: number[]; - /** - * @default 0 - * @example 197063 - */ - id: number; - origin_country?: string[]; - /** @example ko */ - original_language?: string; - /** @example 종이달 */ - original_name?: string; - /** @example A thriller drama about Yoo I-hwa, a stay-at-home mom living her comfortable and contented life without desires, but to her husband's indifference. While working as a bank contract employee, she unexpectedly touches money from VIP clients and gradually falls into an irreversible collapse. */ - overview?: string; - /** - * @default 0 - * @example 12.299 - */ - popularity: number; - /** @example /xXWynVdMGyJXBUDvIN27AXM3iJJ.jpg */ - poster_path?: string; - /** @example 2023-04-10 */ - first_air_date?: string; - /** @example Pale Moon */ - name?: string; - /** - * @default 0 - * @example 7 - */ - vote_average: number; - /** - * @default 0 - * @example 2 - */ - vote_count: number; - }[]; - /** - * @default 0 - * @example 82 - */ - total_pages: number; - /** - * @default 0 - * @example 1639 - */ - total_results: number; - }; - }; - }; - }; - }; - "tv-series-translations": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - translations?: { - /** @example SA */ - iso_3166_1?: string; - /** @example ar */ - iso_639_1?: string; - /** @example العربية */ - name?: string; - /** @example Arabic */ - english_name?: string; - data?: { - /** @example صراع العروش */ - name?: string; - /** @example تتقاتل سبع عائلات نبيلة من أجل السيطرة على أرض - ويستيروس - الأسطورية. الاحتكاك بين العوائل يؤدي إلى حرب واسعة النطاق. في حين يستيقظ الشر القديم في أقصى الشمال. وفي خضم الحرب، نظام عسكري مهمَل - حرس الليل - هم كل ما يقف بين عالم الإنسان والأهوال الجليدية. */ - overview?: string; - /** @example */ - homepage?: string; - /** @example الشتاء قادم */ - tagline?: string; - }; - }[]; - }; - }; - }; - }; - }; - "tv-series-videos": { - parameters: { - query?: { - /** @description filter the list results by language, supports more than one value by using a comma */ - include_video_language?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - results?: { - /** @example en */ - iso_639_1?: string; - /** @example US */ - iso_3166_1?: string; - /** @example Inside Game of Thrones: A Story in Camera Work – BTS (HBO) */ - name?: string; - /** @example y2ZJ3lTaREY */ - key?: string; - /** @example YouTube */ - site?: string; - /** - * @default 0 - * @example 1080 - */ - size: number; - /** @example Behind the Scenes */ - type?: string; - /** - * @default true - * @example true - */ - official: boolean; - /** @example 2019-03-25T14:00:06.000Z */ - published_at?: string; - /** @example 5c999b48c3a36863b73b9d42 */ - id?: string; - }[]; - }; - }; - }; - }; - }; - "tv-series-watch-providers": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1399 - */ - id: number; - results?: { - AE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AE */ - link?: string; - flatrate?: { - /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - AR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AR */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - AT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AT */ - link?: string; - buy?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /y0kyIFElN5sJAsmW8Txj69wzrD2.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 321 - */ - provider_id: number; - /** @example Sky X */ - provider_name?: string; - /** - * @default 0 - * @example 23 - */ - display_priority: number; - }[]; - }; - AU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AU */ - link?: string; - flatrate?: { - /** @example /d3ixI1no0EpTj2i7u0Sd2DBXVlG.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 385 - */ - provider_id: number; - /** @example BINGE */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - BA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BA */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - BB?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BB */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - BE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BE */ - link?: string; - flatrate?: { - /** @example /pq8p1umEnJjdFAP1nFvNArTR61X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 311 - */ - provider_id: number; - /** @example Be TV Go */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - BG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BG */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 15 - */ - display_priority: number; - }[]; - }; - BO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BO */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - BR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BR */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - BS?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BS */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - CA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CA */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /gJ3yVMWouaVj6iHd59TISJ1TlM5.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 230 - */ - provider_id: number; - /** @example Crave */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - CH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CH */ - link?: string; - flatrate?: { - /** @example /sHP8XLo4Ac4WMbziRyAdRQdb76q.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 210 - */ - provider_id: number; - /** @example Sky */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - buy?: { - /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - CI?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CI */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 25 - */ - display_priority: number; - }[]; - }; - CL?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CL */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - CO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CO */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - CR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CR */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - CZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CZ */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 22 - */ - display_priority: number; - }[]; - }; - DE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DE */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /MiVcYLkztM6qqLeVSYWHFCUcXx.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 30 - */ - provider_id: number; - /** @example WOW */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - DK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DK */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - DO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DO */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - DZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DZ */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - EC?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EC */ - link?: string; - flatrate?: { - /** @example /cDzkhgvozSr4GW2aRdV22uDuFpw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 339 - */ - provider_id: number; - /** @example Movistar Play */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - EG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EG */ - link?: string; - flatrate?: { - /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - ES?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ES */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - FI?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FI */ - link?: string; - buy?: { - /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 68 - */ - provider_id: number; - /** @example Microsoft Store */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - FR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FR */ - link?: string; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /loOaayvNiLnD0zKl70TO2L5vlAL.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1870 - */ - provider_id: number; - /** @example Pass Warner Amazon Channel */ - provider_name?: string; - /** - * @default 0 - * @example 95 - */ - display_priority: number; - }[]; - }; - GB?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GB */ - link?: string; - flatrate?: { - /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 29 - */ - provider_id: number; - /** @example Sky Go */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - buy?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - GF?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GF */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - GH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GH */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - GQ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GQ */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - GT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GT */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - HK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HK */ - link?: string; - flatrate?: { - /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 425 - */ - provider_id: number; - /** @example HBO Go */ - provider_name?: string; - /** - * @default 0 - * @example 40 - */ - display_priority: number; - }[]; - }; - HN?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HN */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - HR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HR */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 34 - */ - display_priority: number; - }[]; - }; - HU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HU */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 22 - */ - display_priority: number; - }[]; - }; - ID?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ID */ - link?: string; - flatrate?: { - /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 425 - */ - provider_id: number; - /** @example HBO Go */ - provider_name?: string; - /** - * @default 0 - * @example 14 - */ - display_priority: number; - }[]; - }; - IE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IE */ - link?: string; - flatrate?: { - /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 29 - */ - provider_id: number; - /** @example Sky Go */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - buy?: { - /** @example /2pCbao1J9s0DMak2KKnEzmzHni8.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 130 - */ - provider_id: number; - /** @example Sky Store */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - IL?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IL */ - link?: string; - flatrate?: { - /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN */ - provider_name?: string; - /** - * @default 0 - * @example 13 - */ - display_priority: number; - }[]; - }; - IQ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IQ */ - link?: string; - flatrate?: { - /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - }; - IT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IT */ - link?: string; - buy?: { - /** @example /cksgBjTHV3rzAVaO2zUyS1mH4Ke.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 40 - */ - provider_id: number; - /** @example Chili */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 29 - */ - provider_id: number; - /** @example Sky Go */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - }; - JM?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JM */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - JP?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JP */ - link?: string; - flatrate?: { - /** @example /npg1OiBidQSndMsBZwgEPOYU6Jq.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 84 - */ - provider_id: number; - /** @example U-NEXT */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - buy?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - rent?: { - /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - KE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KE */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - KR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KR */ - link?: string; - flatrate?: { - /** @example /2ioan5BX5L9tz4fIGU93blTeFhv.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 356 - */ - provider_id: number; - /** @example wavve */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - LB?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LB */ - link?: string; - flatrate?: { - /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN */ - provider_name?: string; - /** - * @default 0 - * @example 13 - */ - display_priority: number; - }[]; - }; - LT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LT */ - link?: string; - flatrate?: { - /** @example /xTVM8uXT9QocigQ07LE7Irc65W2.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 553 - */ - provider_id: number; - /** @example Telia Play */ - provider_name?: string; - /** - * @default 0 - * @example 15 - */ - display_priority: number; - }[]; - }; - LY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LY */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - MD?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MD */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 26 - */ - display_priority: number; - }[]; - }; - MK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MK */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 29 - */ - display_priority: number; - }[]; - }; - MU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MU */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - }; - MX?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MX */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - MY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MY */ - link?: string; - flatrate?: { - /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 425 - */ - provider_id: number; - /** @example HBO Go */ - provider_name?: string; - /** - * @default 0 - * @example 14 - */ - display_priority: number; - }[]; - }; - MZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MZ */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - NE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NE */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 25 - */ - display_priority: number; - }[]; - }; - NG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NG */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - NL?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NL */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 47 - */ - display_priority: number; - }[]; - buy?: { - /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 68 - */ - provider_id: number; - /** @example Microsoft Store */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - }; - NO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NO */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - buy?: { - /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 68 - */ - provider_id: number; - /** @example Microsoft Store */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - NZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NZ */ - link?: string; - flatrate?: { - /** @example /od4YNSSLgOP3p8EtQTnEYfrPa77.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 273 - */ - provider_id: number; - /** @example Neon TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - }; - PA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PA */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - PE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PE */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - }; - PH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PH */ - link?: string; - flatrate?: { - /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 425 - */ - provider_id: number; - /** @example HBO Go */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - }; - PL?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PL */ - link?: string; - flatrate?: { - /** @example /l5Wxbsgral716BOtZsGyPVNn8GC.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 250 - */ - provider_id: number; - /** @example Horizon */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - rent?: { - /** @example /bZNXgd8fwVTD68aAGlElkpAtu7b.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 549 - */ - provider_id: number; - /** @example IPLA */ - provider_name?: string; - /** - * @default 0 - * @example 17 - */ - display_priority: number; - }[]; - }; - PS?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PS */ - link?: string; - flatrate?: { - /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - }; - PT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PT */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - PY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PY */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - RO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RO */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 17 - */ - display_priority: number; - }[]; - }; - RS?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RS */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 32 - */ - display_priority: number; - }[]; - }; - RU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RU */ - link?: string; - flatrate?: { - /** @example /w1T8s7FqakcfucR8cgOvbe6UeXN.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 115 - */ - provider_id: number; - /** @example Okko */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - ads?: { - /** @example /3jJtMOIwtvcrCyeRMUvv4wsfhJk.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 577 - */ - provider_id: number; - /** @example TvIgle */ - provider_name?: string; - /** - * @default 0 - * @example 22 - */ - display_priority: number; - }[]; - }; - SA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SA */ - link?: string; - flatrate?: { - /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN */ - provider_name?: string; - /** - * @default 0 - * @example 25 - */ - display_priority: number; - }[]; - }; - SC?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SC */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - SE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SE */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - buy?: { - /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 68 - */ - provider_id: number; - /** @example Microsoft Store */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - SG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SG */ - link?: string; - flatrate?: { - /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 425 - */ - provider_id: number; - /** @example HBO Go */ - provider_name?: string; - /** - * @default 0 - * @example 13 - */ - display_priority: number; - }[]; - }; - SI?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SI */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 29 - */ - display_priority: number; - }[]; - }; - SK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SK */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 37 - */ - display_priority: number; - }[]; - }; - SN?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SN */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - SV?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SV */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 25 - */ - display_priority: number; - }[]; - }; - TH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TH */ - link?: string; - flatrate?: { - /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 425 - */ - provider_id: number; - /** @example HBO Go */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - }; - TR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TR */ - link?: string; - flatrate?: { - /** @example /z3XAGCCbDD3KTZFvc96Ytr3XR56.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 341 - */ - provider_id: number; - /** @example blutv */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - }; - TT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TT */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - TW?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TW */ - link?: string; - flatrate?: { - /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 425 - */ - provider_id: number; - /** @example HBO Go */ - provider_name?: string; - /** - * @default 0 - * @example 40 - */ - display_priority: number; - }[]; - }; - TZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TZ */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - UG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UG */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - US?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=US */ - link?: string; - free?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - buy?: { - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - UY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UY */ - link?: string; - flatrate?: { - /** @example /kV8XFGI5OLJKl72dI8DtnKplfFr.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 467 - */ - provider_id: number; - /** @example DIRECTV GO */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - VE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=VE */ - link?: string; - flatrate?: { - /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 384 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - }; - ZA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZA */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - ZM?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZM */ - link?: string; - flatrate?: { - /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - }; - }; - }; - }; - }; - }; - "tv-series-add-rating": { - parameters: { - query?: { - guest_session_id?: string; - session_id?: string; - }; - header: { - "Content-Type": string; - }; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - status_code: number; - /** @example Success. */ - status_message?: string; - }; - }; - }; - }; - }; - "tv-series-delete-rating": { - parameters: { - query?: { - guest_session_id?: string; - session_id?: string; - }; - header?: { - "Content-Type"?: string; - }; - path: { - series_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 13 - */ - status_code: number; - /** @example The item/record was deleted successfully. */ - status_message?: string; - }; - }; - }; - }; - }; - "tv-season-details": { - parameters: { - query?: { - /** @description comma separated list of endpoints within this namespace, 20 items max */ - append_to_response?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example 5256c89f19c2956ff6046d47 */ - _id?: string; - /** @example 2011-04-17 */ - air_date?: string; - episodes?: { - /** @example 2011-04-17 */ - air_date?: string; - /** - * @default 0 - * @example 1 - */ - episode_number: number; - /** @example standard */ - episode_type?: string; - /** - * @default 0 - * @example 63056 - */ - id: number; - /** @example Winter Is Coming */ - name?: string; - /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ - overview?: string; - /** @example 101 */ - production_code?: string; - /** - * @default 0 - * @example 62 - */ - runtime: number; - /** - * @default 0 - * @example 1 - */ - season_number: number; - /** - * @default 0 - * @example 1399 - */ - show_id: number; - /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ - still_path?: string; - /** - * @default 0 - * @example 8.1 - */ - vote_average: number; - /** - * @default 0 - * @example 396 - */ - vote_count: number; - crew?: { - /** @example Directing */ - department?: string; - /** @example Director */ - job?: string; - /** @example 5256c8a219c2956ff6046e77 */ - credit_id?: string; - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 44797 - */ - id: number; - /** @example Directing */ - known_for_department?: string; - /** @example Tim Van Patten */ - name?: string; - /** @example Tim Van Patten */ - original_name?: string; - /** - * @default 0 - * @example 0.8004 - */ - popularity: number; - /** @example /vwcARZBg4PEzOwnPsXdjRWeUVrZ.jpg */ - profile_path?: string; - }[]; - guest_stars?: { - /** @example Benjen Stark */ - character?: string; - /** @example 5256c8b919c2956ff604836a */ - credit_id?: string; - /** - * @default 0 - * @example 61 - */ - order: number; - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 119783 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Joseph Mawle */ - name?: string; - /** @example Joseph Mawle */ - original_name?: string; - /** - * @default 0 - * @example 0.8932 - */ - popularity: number; - /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ - profile_path?: string; - }[]; - }[]; - /** @example Season 1 */ - name?: string; - networks?: { - /** - * @default 0 - * @example 49 - */ - id: number; - /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ - logo_path?: string; - /** @example HBO */ - name?: string; - /** @example US */ - origin_country?: string; - }[]; - /** @example Trouble is brewing in the Seven Kingdoms of Westeros. For the driven inhabitants of this visionary world, control of Westeros' Iron Throne holds the lure of great power. But in a land where the seasons can last a lifetime, winter is coming...and beyond the Great Wall that protects them, an ancient evil has returned. In Season One, the story centers on three primary areas: the Stark and the Lannister families, whose designs on controlling the throne threaten a tenuous peace; the dragon princess Daenerys, heir to the former dynasty, who waits just over the Narrow Sea with her malevolent brother Viserys; and the Great Wall--a massive barrier of ice where a forgotten danger is stirring. */ - overview?: string; - /** - * @default 0 - * @example 3624 - */ - id: number; - /** @example /wgfKiqzuMrFIkU1M68DDDY8kGC1.jpg */ - poster_path?: string; - /** - * @default 0 - * @example 1 - */ - season_number: number; - /** - * @default 0 - * @example 8.4 - */ - vote_average: number; - }; - }; - }; - }; - }; - "tv-season-account-states": { - parameters: { - query?: { - session_id?: string; - guest_session_id?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 3624 - */ - id: number; - results?: { - /** - * @default 0 - * @example 63056 - */ - id: number; - /** - * @default 0 - * @example 1 - */ - episode_number: number; - rated?: { - /** - * @default 0 - * @example 9 - */ - value: number; - }; - }[]; - }; - }; - }; - }; - }; - "tv-season-aggregate-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 22970 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Peter Dinklage */ - name?: string; - /** @example Peter Dinklage */ - original_name?: string; - /** - * @default 0 - * @example 30.6 - */ - popularity: number; - /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ - profile_path?: string; - roles?: { - /** @example 5256c8b219c2956ff6047cd8 */ - credit_id?: string; - /** @example Tyrion Lannister */ - character?: string; - /** - * @default 0 - * @example 10 - */ - episode_count: number; - }[]; - /** - * @default 0 - * @example 10 - */ - total_episode_count: number; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 1 - */ - gender: number; - /** - * @default 0 - * @example 9153 - */ - id: number; - /** @example Art */ - known_for_department?: string; - /** @example Gemma Jackson */ - name?: string; - /** @example Gemma Jackson */ - original_name?: string; - /** - * @default 0 - * @example 0.995 - */ - popularity: number; - profile_path?: unknown; - jobs?: { - /** @example 54eee8b8c3a3686d5e005430 */ - credit_id?: string; - /** @example Production Design */ - job?: string; - /** - * @default 0 - * @example 10 - */ - episode_count: number; - }[]; - /** @example Art */ - department?: string; - /** - * @default 0 - * @example 10 - */ - total_episode_count: number; - }[]; - /** - * @default 0 - * @example 3624 - */ - id: number; - }; - }; - }; - }; - }; - "tv-season-changes-by-id": { - parameters: { - query?: { - end_date?: string; - page?: number; - start_date?: string; - }; - header?: never; - path: { - season_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - changes?: { - /** @example episode */ - key?: string; - items?: { - /** @example 5717c8c69251414cfd00250f */ - id?: string; - /** @example updated */ - action?: string; - /** @example 2016-04-20 18:21:58 UTC */ - time?: string; - value?: { - /** - * @default 0 - * @example 63056 - */ - episode_id: number; - /** - * @default 0 - * @example 1 - */ - episode_number: number; - }; - }[]; - }[]; - }; - }; - }; - }; - }; - "tv-season-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 22970 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Peter Dinklage */ - name?: string; - /** @example Peter Dinklage */ - original_name?: string; - /** - * @default 0 - * @example 30.6 - */ - popularity: number; - /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ - profile_path?: string; - /** @example Tyrion Lannister */ - character?: string; - /** @example 5256c8b219c2956ff6047cd8 */ - credit_id?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - crew?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 0 - */ - gender: number; - /** - * @default 0 - * @example 1223796 - */ - id: number; - /** @example Production */ - known_for_department?: string; - /** @example Frank Doelger */ - name?: string; - /** @example Frank Doelger */ - original_name?: string; - /** - * @default 0 - * @example 0.694 - */ - popularity: number; - profile_path?: unknown; - /** @example 5256c8c419c2956ff604867c */ - credit_id?: string; - /** @example Production */ - department?: string; - /** @example Producer */ - job?: string; - }[]; - /** - * @default 0 - * @example 3624 - */ - id: number; - }; - }; - }; - }; - }; - "tv-season-external-ids": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 3624 - */ - id: number; - /** @example /m/0gmd1gd */ - freebase_mid?: string; - /** @example /m/0gmd1gd */ - freebase_id?: string; - /** - * @default 0 - * @example 364731 - */ - tvdb_id: number; - tvrage_id?: unknown; - /** @example Q1658029 */ - wikidata_id?: string; - }; - }; - }; - }; - }; - "tv-season-images": { - parameters: { - query?: { - /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ - include_image_language?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 3624 - */ - id: number; - posters?: { - /** - * @default 0 - * @example 0.667 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 1500 - */ - height: number; - /** @example en */ - iso_639_1?: string; - /** @example /wgfKiqzuMrFIkU1M68DDDY8kGC1.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.514 - */ - vote_average: number; - /** - * @default 0 - * @example 18 - */ - vote_count: number; - /** - * @default 0 - * @example 1000 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "tv-season-translations": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 3624 - */ - id: number; - translations?: { - /** @example SA */ - iso_3166_1?: string; - /** @example ar */ - iso_639_1?: string; - /** @example العربية */ - name?: string; - /** @example Arabic */ - english_name?: string; - data?: { - /** @example */ - name?: string; - /** @example سلسلة درامية مبنية على سلسلة روايات لـ جورج آر آر مارتن بعنوان "إيه سونغ أوف آيس أن فاير" والتي حققت مبيعات كبيرة وتتمحور حول الصراعات التي كانت تحدث في العصور الوسطى بين العائلات النبيلة للسيطرة على عرش وستيروس. */ - overview?: string; - }; - }[]; - }; - }; - }; - }; - }; - "tv-season-videos": { - parameters: { - query?: { - /** @description filter the list results by language, supports more than one value by using a comma */ - include_video_language?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 3624 - */ - id: number; - results?: { - /** @example en */ - iso_639_1?: string; - /** @example US */ - iso_3166_1?: string; - /** @example Game Of Thrones - Season 1 Recap - Official HBO UK */ - name?: string; - /** @example e0Y8KpQpW8c */ - key?: string; - /** @example YouTube */ - site?: string; - /** - * @default 0 - * @example 1080 - */ - size: number; - /** @example Recap */ - type?: string; - /** - * @default true - * @example true - */ - official: boolean; - /** @example 2015-05-19T16:31:23.000Z */ - published_at?: string; - /** @example 5ce71a920e0a265ac0cfe497 */ - id?: string; - }[]; - }; - }; - }; - }; - }; - "tv-season-watch-providers": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 3624 - */ - id: number; - results?: { - AD?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AD */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 24 - */ - display_priority: number; - }[]; - }; - AE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AE */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - AG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AG */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - AR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AR */ - link?: string; - flatrate?: { - /** @example /nr5UBW4IGKgBwmhpTMOfcvnX2vX.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 467 - */ - provider_id: number; - /** @example DIRECTV GO */ - provider_name?: string; - /** - * @default 0 - * @example 12 - */ - display_priority: number; - }[]; - }; - AT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AT */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /kAZkQcIxMxTmlwdgSB05fqtymp0.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 29 - */ - provider_id: number; - /** @example Sky Go */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - }; - AU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AU */ - link?: string; - flatrate?: { - /** @example /fejdSG7TwNQ5E0p6u7A6LVs280R.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 134 - */ - provider_id: number; - /** @example Foxtel Now */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - buy?: { - /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - BA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BA */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - BB?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BB */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 23 - */ - display_priority: number; - }[]; - }; - BE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BE */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 33 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /kwftIxtjuCAROIcdd53UEjzSmca.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1857 - */ - provider_id: number; - /** @example Telenet */ - provider_name?: string; - /** - * @default 0 - * @example 31 - */ - display_priority: number; - }[]; - }; - BG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BG */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 21 - */ - display_priority: number; - }[]; - }; - BH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BH */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 29 - */ - display_priority: number; - }[]; - }; - BO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BO */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - BR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BR */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - BS?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BS */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 24 - */ - display_priority: number; - }[]; - }; - BZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BZ */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - CA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CA */ - link?: string; - flatrate?: { - /** @example /ewOptMVIYcOadMGGJz8DJueH2bH.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 230 - */ - provider_id: number; - /** @example Crave */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - buy?: { - /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - CH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CH */ - link?: string; - buy?: { - /** @example /8z7rC8uIDaTM91X0ZfkRf04ydj2.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 3 - */ - provider_id: number; - /** @example Google Play Movies */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /ytApMa9fThUQUFTn696AeNBrB8f.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 210 - */ - provider_id: number; - /** @example Sky */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - CI?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CI */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 19 - */ - display_priority: number; - }[]; - }; - CL?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CL */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - CM?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CM */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - CO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CO */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - CR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CR */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - CZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CZ */ - link?: string; - flatrate?: { - /** @example /489t5n9o1KhH7voGNQkrXT7vBKV.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1939 - */ - provider_id: number; - /** @example Lepsi TV */ - provider_name?: string; - /** - * @default 0 - * @example 26 - */ - display_priority: number; - }[]; - }; - DE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DE */ - link?: string; - flatrate?: { - /** @example /kAZkQcIxMxTmlwdgSB05fqtymp0.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 29 - */ - provider_id: number; - /** @example Sky Go */ - provider_name?: string; - /** - * @default 0 - * @example 8 - */ - display_priority: number; - }[]; - buy?: { - /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - DK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DK */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 39 - */ - display_priority: number; - }[]; - }; - DO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DO */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - EC?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EC */ - link?: string; - flatrate?: { - /** @example /tRNA2CRgA4XHvd7Mx9dH3sFtDVb.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 339 - */ - provider_id: number; - /** @example MovistarTV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - EG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EG */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 20 - */ - display_priority: number; - }[]; - }; - ES?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ES */ - link?: string; - flatrate?: { - /** @example /f6TRLB3H4jDpFEZ0z2KWSSvu1SB.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 149 - */ - provider_id: number; - /** @example Movistar Plus+ Ficción Total */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 32 - */ - display_priority: number; - }[]; - }; - FI?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FI */ - link?: string; - flatrate?: { - /** @example /eglAxQEXSO13p6gNf3HKymrIu7y.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 540 - */ - provider_id: number; - /** @example Elisa Viihde */ - provider_name?: string; - /** - * @default 0 - * @example 18 - */ - display_priority: number; - }[]; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 54 - */ - display_priority: number; - }[]; - }; - FR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FR */ - link?: string; - buy?: { - /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 78 - */ - display_priority: number; - }[]; - }; - GB?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GB */ - link?: string; - buy?: { - /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 39 - */ - provider_id: number; - /** @example Now TV */ - provider_name?: string; - /** - * @default 0 - * @example 43 - */ - display_priority: number; - }[]; - }; - GG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GG */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 84 - */ - display_priority: number; - }[]; - }; - GQ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GQ */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - GT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GT */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - GY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GY */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - HK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HK */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 38 - */ - display_priority: number; - }[]; - }; - HN?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HN */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - HR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HR */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 33 - */ - display_priority: number; - }[]; - }; - HU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HU */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - ID?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ID */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 39 - */ - display_priority: number; - }[]; - }; - IE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IE */ - link?: string; - flatrate?: { - /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 39 - */ - provider_id: number; - /** @example Now TV */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - buy?: { - /** @example /6AKbY2ayaEuH4zKg2prqoVQ9iaY.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 130 - */ - provider_id: number; - /** @example Sky Store */ - provider_name?: string; - /** - * @default 0 - * @example 9 - */ - display_priority: number; - }[]; - }; - IN?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IN */ - link?: string; - flatrate?: { - /** @example /kVqjgpcwvDJOhCupjcLzwwtOp52.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 2336 - */ - provider_id: number; - /** @example JioHotstar */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - IQ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IQ */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - IT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IT */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 33 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 39 - */ - provider_id: number; - /** @example Now TV */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - JM?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JM */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 22 - */ - display_priority: number; - }[]; - }; - JO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JO */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 31 - */ - display_priority: number; - }[]; - }; - JP?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JP */ - link?: string; - flatrate?: { - /** @example /a5T7vNaGvoeckYO6rQkHolvyYf4.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 84 - */ - provider_id: number; - /** @example U-NEXT */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - }[]; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - rent?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - KE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KE */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - LB?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LB */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - LC?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LC */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - MC?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MC */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 25 - */ - display_priority: number; - }[]; - }; - MD?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MD */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 25 - */ - display_priority: number; - }[]; - }; - ME?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ME */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - MG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MG */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - MK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MK */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 26 - */ - display_priority: number; - }[]; - }; - ML?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ML */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - MU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MU */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - MX?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MX */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 5 - */ - display_priority: number; - }[]; - }; - MY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MY */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 31 - */ - display_priority: number; - }[]; - }; - MZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MZ */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - NE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NE */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 19 - */ - display_priority: number; - }[]; - }; - NG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NG */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 21 - */ - display_priority: number; - }[]; - }; - NI?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NI */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 13 - */ - display_priority: number; - }[]; - }; - NL?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NL */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 34 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 48 - */ - display_priority: number; - }[]; - }; - NO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NO */ - link?: string; - flatrate?: { - /** @example /3ZigBD8WTEPcEHAvMWiJGUsv5u4.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 578 - */ - provider_id: number; - /** @example Strim */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - NZ?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NZ */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 59 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /iscLKFDwQlr0BAgVDBcuRapLiwC.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 273 - */ - provider_id: number; - /** @example Neon TV */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - OM?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=OM */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 31 - */ - display_priority: number; - }[]; - }; - PA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PA */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - PE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PE */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - PH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PH */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 32 - */ - display_priority: number; - }[]; - }; - PL?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PL */ - link?: string; - flatrate?: { - /** @example /jhMNVBV2UocEGepRkr9oFPD7Gpb.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 505 - */ - provider_id: number; - /** @example Player */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - PT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PT */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 43 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 32 - */ - display_priority: number; - }[]; - }; - PY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PY */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 29 - */ - display_priority: number; - }[]; - }; - QA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=QA */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 31 - */ - display_priority: number; - }[]; - }; - RO?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RO */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 23 - */ - display_priority: number; - }[]; - }; - RS?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RS */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - RU?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RU */ - link?: string; - flatrate?: { - /** @example /5z8dpQN27kybhn21EVLZcJPpMEo.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 115 - */ - provider_id: number; - /** @example Okko */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - SA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SA */ - link?: string; - flatrate?: { - /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 629 - */ - provider_id: number; - /** @example OSN+ */ - provider_name?: string; - /** - * @default 0 - * @example 20 - */ - display_priority: number; - }[]; - }; - SC?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SC */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - SE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SE */ - link?: string; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 39 - */ - display_priority: number; - }[]; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 44 - */ - display_priority: number; - }[]; - }; - SG?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SG */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 31 - */ - display_priority: number; - }[]; - }; - SI?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SI */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 28 - */ - display_priority: number; - }[]; - }; - SK?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SK */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 37 - */ - display_priority: number; - }[]; - }; - SN?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SN */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - SV?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SV */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - TC?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TC */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 10 - */ - display_priority: number; - }[]; - }; - TD?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TD */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - TH?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TH */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 30 - */ - display_priority: number; - }[]; - }; - TR?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TR */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 29 - */ - display_priority: number; - }[]; - }; - TT?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TT */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - }; - TW?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TW */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 38 - */ - display_priority: number; - }[]; - }; - US?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=US */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 11 - */ - display_priority: number; - }[]; - buy?: { - /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 10 - */ - provider_id: number; - /** @example Amazon Video */ - provider_name?: string; - /** - * @default 0 - * @example 6 - */ - display_priority: number; - }[]; - }; - UY?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UY */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 3 - */ - display_priority: number; - }[]; - }; - VE?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=VE */ - link?: string; - flatrate?: { - /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 1899 - */ - provider_id: number; - /** @example HBO Max */ - provider_name?: string; - /** - * @default 0 - * @example 27 - */ - display_priority: number; - }[]; - }; - ZA?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZA */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 4 - */ - display_priority: number; - }[]; - }; - ZM?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZM */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 7 - */ - display_priority: number; - }[]; - }; - ZW?: { - /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZW */ - link?: string; - flatrate?: { - /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ - logo_path?: string; - /** - * @default 0 - * @example 55 - */ - provider_id: number; - /** @example ShowMax */ - provider_name?: string; - /** - * @default 0 - * @example 0 - */ - display_priority: number; - }[]; - }; - }; - }; - }; - }; - }; - }; - "tv-episode-details": { - parameters: { - query?: { - /** @description comma separated list of endpoints within this namespace, 20 items max */ - append_to_response?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example 2011-04-17 */ - air_date?: string; - crew?: { - /** @example Directing */ - department?: string; - /** @example Director */ - job?: string; - /** @example 5256c8a219c2956ff6046e77 */ - credit_id?: string; - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 44797 - */ - id: number; - /** @example Directing */ - known_for_department?: string; - /** @example Timothy Van Patten */ - name?: string; - /** @example Timothy Van Patten */ - original_name?: string; - /** - * @default 0 - * @example 7.775 - */ - popularity: number; - /** @example /MzSOFrd99HRdr6pkSRSctk3kBR.jpg */ - profile_path?: string; - }[]; - /** - * @default 0 - * @example 1 - */ - episode_number: number; - guest_stars?: { - /** @example Benjen Stark */ - character?: string; - /** @example 5256c8b919c2956ff604836a */ - credit_id?: string; - /** - * @default 0 - * @example 62 - */ - order: number; - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 119783 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Joseph Mawle */ - name?: string; - /** @example Joseph Mawle */ - original_name?: string; - /** - * @default 0 - * @example 6.758 - */ - popularity: number; - /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ - profile_path?: string; - }[]; - /** @example Winter Is Coming */ - name?: string; - /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ - overview?: string; - /** - * @default 0 - * @example 63056 - */ - id: number; - /** @example 101 */ - production_code?: string; - /** - * @default 0 - * @example 62 - */ - runtime: number; - /** - * @default 0 - * @example 1 - */ - season_number: number; - /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ - still_path?: string; - /** - * @default 0 - * @example 7.8 - */ - vote_average: number; - /** - * @default 0 - * @example 286 - */ - vote_count: number; - }; - }; - }; - }; - }; - "tv-episode-account-states": { - parameters: { - query?: { - session_id?: string; - guest_session_id?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 550 - */ - id: number; - /** - * @default true - * @example true - */ - favorite: boolean; - rated?: { - /** - * @default 0 - * @example 9 - */ - value: number; - }; - /** - * @default true - * @example false - */ - watchlist: boolean; - }; - }; - }; - }; - }; - "tv-episode-changes-by-id": { - parameters: { - query?: never; - header?: never; - path: { - episode_id: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - changes?: { - /** @example production_code */ - key?: string; - items?: { - /** @example 54bd9ed7c3a3686c6b00da66 */ - id?: string; - /** @example added */ - action?: string; - /** @example 2015-01-20 00:18:31 UTC */ - time?: string; - /** @example 101 */ - value?: string; - }[]; - }[]; - }; - }; - }; - }; - }; - "tv-episode-credits": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - cast?: { - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 22970 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Peter Dinklage */ - name?: string; - /** @example Peter Dinklage */ - original_name?: string; - /** - * @default 0 - * @example 30.6 - */ - popularity: number; - /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ - profile_path?: string; - /** @example Tyrion Lannister */ - character?: string; - /** @example 5256c8b219c2956ff6047cd8 */ - credit_id?: string; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - crew?: { - /** @example Directing */ - department?: string; - /** @example Director */ - job?: string; - /** @example 5256c8a219c2956ff6046e77 */ - credit_id?: string; - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 44797 - */ - id: number; - /** @example Directing */ - known_for_department?: string; - /** @example Timothy Van Patten */ - name?: string; - /** @example Timothy Van Patten */ - original_name?: string; - /** - * @default 0 - * @example 8.292 - */ - popularity: number; - /** @example /MzSOFrd99HRdr6pkSRSctk3kBR.jpg */ - profile_path?: string; - }[]; - guest_stars?: { - /** @example Benjen Stark */ - character?: string; - /** @example 5256c8b919c2956ff604836a */ - credit_id?: string; - /** - * @default 0 - * @example 62 - */ - order: number; - /** - * @default true - * @example false - */ - adult: boolean; - /** - * @default 0 - * @example 2 - */ - gender: number; - /** - * @default 0 - * @example 119783 - */ - id: number; - /** @example Acting */ - known_for_department?: string; - /** @example Joseph Mawle */ - name?: string; - /** @example Joseph Mawle */ - original_name?: string; - /** - * @default 0 - * @example 8.559 - */ - popularity: number; - /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ - profile_path?: string; - }[]; - /** - * @default 0 - * @example 63056 - */ - id: number; - }; - }; - }; - }; - }; - "tv-episode-external-ids": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - season_number: number; - episode_number: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 63056 - */ - id: number; - /** @example tt1480055 */ - imdb_id?: string; - /** @example /m/0gmc6ph */ - freebase_mid?: string; - /** @example /en/winter_is_coming */ - freebase_id?: string; - /** - * @default 0 - * @example 3254641 - */ - tvdb_id: number; - /** - * @default 0 - * @example 1065008299 - */ - tvrage_id: number; - /** @example Q2614622 */ - wikidata_id?: string; - }; - }; - }; - }; - }; - "tv-episode-images": { - parameters: { - query?: { - /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ - include_image_language?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 63056 - */ - id: number; - stills?: { - /** - * @default 0 - * @example 1.778 - */ - aspect_ratio: number; - /** - * @default 0 - * @example 1080 - */ - height: number; - iso_639_1?: unknown; - /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ - file_path?: string; - /** - * @default 0 - * @example 5.454 - */ - vote_average: number; - /** - * @default 0 - * @example 3 - */ - vote_count: number; - /** - * @default 0 - * @example 1920 - */ - width: number; - }[]; - }; - }; - }; - }; - }; - "tv-episode-translations": { - parameters: { - query?: never; - header?: never; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 63056 - */ - id: number; - translations?: { - /** @example SA */ - iso_3166_1?: string; - /** @example ar */ - iso_639_1?: string; - /** @example العربية */ - name?: string; - /** @example Arabic */ - english_name?: string; - data?: { - /** @example */ - name?: string; - /** @example خلف باب واسع من الجليد في شمالي وستيروس هناك شيء يحدث. تتلقى عائلة ستارك التي من وينترفيل زيارة من العائلة المالكة، بينما يشكل أمير عائلة تارغارين المنفي تحالفاً جديداً للسيطرة على العرش من جديد. */ - overview?: string; - }; - }[]; - }; - }; - }; - }; - }; - "tv-episode-videos": { - parameters: { - query?: { - /** @description filter the list results by language, supports more than one value by using a comma */ - include_video_language?: string; - language?: string; - }; - header?: never; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 3624 - */ - id: number; - results?: { - /** @example en */ - iso_639_1?: string; - /** @example US */ - iso_3166_1?: string; - /** @example Game Of Thrones - Season 1 Recap - Official HBO UK */ - name?: string; - /** @example e0Y8KpQpW8c */ - key?: string; - /** @example YouTube */ - site?: string; - /** - * @default 0 - * @example 1080 - */ - size: number; - /** @example Recap */ - type?: string; - /** - * @default true - * @example true - */ - official: boolean; - /** @example 2015-05-19T16:31:23.000Z */ - published_at?: string; - /** @example 5ce71a920e0a265ac0cfe497 */ - id?: string; - }[]; - }; - }; - }; - }; - }; - "tv-episode-add-rating": { - parameters: { - query?: { - guest_session_id?: string; - session_id?: string; - }; - header: { - "Content-Type": string; - }; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: { - content: { - "application/json": { - /** Format: json */ - RAW_BODY: string; - }; - }; - }; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 1 - */ - status_code: number; - /** @example Success. */ - status_message?: string; - }; - }; - }; - }; - }; - "tv-episode-delete-rating": { - parameters: { - query?: { - guest_session_id?: string; - session_id?: string; - }; - header?: { - "Content-Type"?: string; - }; - path: { - series_id: number; - season_number: number; - episode_number: number; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** - * @default 0 - * @example 13 - */ - status_code: number; - /** @example The item/record was deleted successfully. */ - status_message?: string; - }; - }; - }; - }; - }; - "tv-episode-group-details": { - parameters: { - query?: never; - header?: never; - path: { - tv_episode_group_id: string; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - /** @example Comedians in Cars organized in Netflix's collections. */ - description?: string; - /** - * @default 0 - * @example 83 - */ - episode_count: number; - /** - * @default 0 - * @example 6 - */ - group_count: number; - groups?: { - /** @example 5acf93efc3a368739a0000a9 */ - id?: string; - /** @example First Cup */ - name?: string; - /** - * @default 0 - * @example 1 - */ - order: number; - episodes?: { - /** @example 2015-06-17 */ - air_date?: string; - /** - * @default 0 - * @example 3 - */ - episode_number: number; - /** - * @default 0 - * @example 1078262 - */ - id: number; - /** @example Jim Carrey: We Love Breathing What You're Burning, Baby */ - name?: string; - /** @example Jerry’s full of testosterone as he steps into a ‘76 Lamborghini Countach with Jim Carrey, who’s between a three-week cleanse and a five-day silent retreat. After coffee, it’s off to Carrey’s studio to study a portrait of a gorilla with a machine gun. Wow. */ - overview?: string; - /** @example */ - production_code?: string; - runtime?: unknown; - /** - * @default 0 - * @example 6 - */ - season_number: number; - /** - * @default 0 - * @example 59717 - */ - show_id: number; - /** @example /aOyE420zuFq9zWtEWjIccAiTrzU.jpg */ - still_path?: string; - /** - * @default 0 - * @example 7.4 - */ - vote_average: number; - /** - * @default 0 - * @example 5 - */ - vote_count: number; - /** - * @default 0 - * @example 0 - */ - order: number; - }[]; - /** - * @default true - * @example true - */ - locked: boolean; - }[]; - /** @example 5acf93e60e0a26346d0000ce */ - id?: string; - /** @example Netflix Collections */ - name?: string; - network?: { - /** - * @default 0 - * @example 213 - */ - id: number; - /** @example /wwemzKWzjKYJFfCeiB57q3r4Bcm.png */ - logo_path?: string; - /** @example Netflix */ - name?: string; - /** @example */ - origin_country?: string; - }; - /** - * @default 0 - * @example 4 - */ - type: number; - }; - }; - }; - }; - }; - "watch-providers-available-regions": { - parameters: { - query?: { - language?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - /** @example AD */ - iso_3166_1?: string; - /** @example Andorra */ - english_name?: string; - /** @example Andorra */ - native_name?: string; - }[]; - }; - }; - }; - }; - }; - "watch-providers-movie-list": { - parameters: { - query?: { - language?: string; - watch_region?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - display_priorities?: { - /** - * @default 0 - * @example 6 - */ - CA: number; - /** - * @default 0 - * @example 1 - */ - AE: number; - /** - * @default 0 - * @example 3 - */ - AR: number; - /** - * @default 0 - * @example 4 - */ - AT: number; - /** - * @default 0 - * @example 10 - */ - AU: number; - /** - * @default 0 - * @example 6 - */ - BE: number; - /** - * @default 0 - * @example 6 - */ - BO: number; - /** - * @default 0 - * @example 8 - */ - BR: number; - /** - * @default 0 - * @example 2 - */ - BG: number; - /** - * @default 0 - * @example 4 - */ - CH: number; - /** - * @default 0 - * @example 3 - */ - CL: number; - /** - * @default 0 - * @example 4 - */ - CO: number; - /** - * @default 0 - * @example 5 - */ - CR: number; - /** - * @default 0 - * @example 3 - */ - CZ: number; - /** - * @default 0 - * @example 4 - */ - DE: number; - /** - * @default 0 - * @example 7 - */ - DK: number; - /** - * @default 0 - * @example 7 - */ - EC: number; - /** - * @default 0 - * @example 3 - */ - EE: number; - /** - * @default 0 - * @example 2 - */ - EG: number; - /** - * @default 0 - * @example 4 - */ - ES: number; - /** - * @default 0 - * @example 10 - */ - FI: number; - /** - * @default 0 - * @example 5 - */ - FR: number; - /** - * @default 0 - * @example 5 - */ - GB: number; - /** - * @default 0 - * @example 2 - */ - GR: number; - /** - * @default 0 - * @example 7 - */ - GT: number; - /** - * @default 0 - * @example 5 - */ - HK: number; - /** - * @default 0 - * @example 7 - */ - HN: number; - /** - * @default 0 - * @example 3 - */ - HU: number; - /** - * @default 0 - * @example 4 - */ - ID: number; - /** - * @default 0 - * @example 4 - */ - IE: number; - /** - * @default 0 - * @example 8 - */ - IN: number; - /** - * @default 0 - * @example 4 - */ - IT: number; - /** - * @default 0 - * @example 7 - */ - JP: number; - /** - * @default 0 - * @example 3 - */ - LT: number; - /** - * @default 0 - * @example 3 - */ - LV: number; - /** - * @default 0 - * @example 4 - */ - MX: number; - /** - * @default 0 - * @example 4 - */ - MY: number; - /** - * @default 0 - * @example 8 - */ - NL: number; - /** - * @default 0 - * @example 6 - */ - NO: number; - /** - * @default 0 - * @example 4 - */ - NZ: number; - /** - * @default 0 - * @example 3 - */ - PE: number; - /** - * @default 0 - * @example 4 - */ - PH: number; - /** - * @default 0 - * @example 1 - */ - PL: number; - /** - * @default 0 - * @example 4 - */ - PT: number; - /** - * @default 0 - * @example 7 - */ - PY: number; - /** - * @default 0 - * @example 2 - */ - RU: number; - /** - * @default 0 - * @example 1 - */ - SA: number; - /** - * @default 0 - * @example 8 - */ - SE: number; - /** - * @default 0 - * @example 5 - */ - SG: number; - /** - * @default 0 - * @example 3 - */ - SK: number; - /** - * @default 0 - * @example 4 - */ - TH: number; - /** - * @default 0 - * @example 6 - */ - TR: number; - /** - * @default 0 - * @example 7 - */ - TW: number; - /** - * @default 0 - * @example 4 - */ - US: number; - /** - * @default 0 - * @example 4 - */ - VE: number; - /** - * @default 0 - * @example 2 - */ - ZA: number; - /** - * @default 0 - * @example 31 - */ - SI: number; - /** - * @default 0 - * @example 13 - */ - CV: number; - /** - * @default 0 - * @example 17 - */ - GH: number; - /** - * @default 0 - * @example 15 - */ - MU: number; - /** - * @default 0 - * @example 16 - */ - MZ: number; - /** - * @default 0 - * @example 16 - */ - UG: number; - /** - * @default 0 - * @example 28 - */ - IL: number; - }; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - }[]; - }; - }; - }; - }; - }; - "watch-provider-tv-list": { - parameters: { - query?: { - language?: string; - watch_region?: string; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description 200 */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - results?: { - display_priorities?: { - /** - * @default 0 - * @example 6 - */ - CA: number; - /** - * @default 0 - * @example 1 - */ - AE: number; - /** - * @default 0 - * @example 3 - */ - AR: number; - /** - * @default 0 - * @example 4 - */ - AT: number; - /** - * @default 0 - * @example 10 - */ - AU: number; - /** - * @default 0 - * @example 6 - */ - BE: number; - /** - * @default 0 - * @example 6 - */ - BO: number; - /** - * @default 0 - * @example 8 - */ - BR: number; - /** - * @default 0 - * @example 2 - */ - BG: number; - /** - * @default 0 - * @example 4 - */ - CH: number; - /** - * @default 0 - * @example 3 - */ - CL: number; - /** - * @default 0 - * @example 4 - */ - CO: number; - /** - * @default 0 - * @example 5 - */ - CR: number; - /** - * @default 0 - * @example 3 - */ - CZ: number; - /** - * @default 0 - * @example 4 - */ - DE: number; - /** - * @default 0 - * @example 7 - */ - DK: number; - /** - * @default 0 - * @example 7 - */ - EC: number; - /** - * @default 0 - * @example 3 - */ - EE: number; - /** - * @default 0 - * @example 2 - */ - EG: number; - /** - * @default 0 - * @example 4 - */ - ES: number; - /** - * @default 0 - * @example 10 - */ - FI: number; - /** - * @default 0 - * @example 5 - */ - FR: number; - /** - * @default 0 - * @example 5 - */ - GB: number; - /** - * @default 0 - * @example 2 - */ - GR: number; - /** - * @default 0 - * @example 7 - */ - GT: number; - /** - * @default 0 - * @example 5 - */ - HK: number; - /** - * @default 0 - * @example 7 - */ - HN: number; - /** - * @default 0 - * @example 3 - */ - HU: number; - /** - * @default 0 - * @example 4 - */ - ID: number; - /** - * @default 0 - * @example 4 - */ - IE: number; - /** - * @default 0 - * @example 8 - */ - IN: number; - /** - * @default 0 - * @example 4 - */ - IT: number; - /** - * @default 0 - * @example 7 - */ - JP: number; - /** - * @default 0 - * @example 3 - */ - LT: number; - /** - * @default 0 - * @example 3 - */ - LV: number; - /** - * @default 0 - * @example 4 - */ - MX: number; - /** - * @default 0 - * @example 4 - */ - MY: number; - /** - * @default 0 - * @example 8 - */ - NL: number; - /** - * @default 0 - * @example 6 - */ - NO: number; - /** - * @default 0 - * @example 4 - */ - NZ: number; - /** - * @default 0 - * @example 3 - */ - PE: number; - /** - * @default 0 - * @example 4 - */ - PH: number; - /** - * @default 0 - * @example 1 - */ - PL: number; - /** - * @default 0 - * @example 4 - */ - PT: number; - /** - * @default 0 - * @example 7 - */ - PY: number; - /** - * @default 0 - * @example 2 - */ - RU: number; - /** - * @default 0 - * @example 1 - */ - SA: number; - /** - * @default 0 - * @example 8 - */ - SE: number; - /** - * @default 0 - * @example 5 - */ - SG: number; - /** - * @default 0 - * @example 3 - */ - SK: number; - /** - * @default 0 - * @example 4 - */ - TH: number; - /** - * @default 0 - * @example 6 - */ - TR: number; - /** - * @default 0 - * @example 7 - */ - TW: number; - /** - * @default 0 - * @example 4 - */ - US: number; - /** - * @default 0 - * @example 4 - */ - VE: number; - /** - * @default 0 - * @example 2 - */ - ZA: number; - /** - * @default 0 - * @example 31 - */ - SI: number; - /** - * @default 0 - * @example 13 - */ - CV: number; - /** - * @default 0 - * @example 17 - */ - GH: number; - /** - * @default 0 - * @example 15 - */ - MU: number; - /** - * @default 0 - * @example 16 - */ - MZ: number; - /** - * @default 0 - * @example 16 - */ - UG: number; - /** - * @default 0 - * @example 28 - */ - IL: number; - }; - /** - * @default 0 - * @example 2 - */ - display_priority: number; - /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ - logo_path?: string; - /** @example Apple TV */ - provider_name?: string; - /** - * @default 0 - * @example 2 - */ - provider_id: number; - }[]; - }; - }; - }; - }; - }; -} diff --git a/next.config.ts b/next.config.ts deleted file mode 100644 index 9ba4bf7..0000000 --- a/next.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = { - output: "standalone", - reactCompiler: true, - images: { - remotePatterns: [ - { - protocol: "https", - hostname: process.env.TMDB_IMAGE_BASE_URL - ? new URL(process.env.TMDB_IMAGE_BASE_URL).hostname - : "image.tmdb.org", - }, - ], - }, -}; - -export default nextConfig; diff --git a/package.json b/package.json index 74ad9d6..4eb86c3 100644 --- a/package.json +++ b/package.json @@ -1,73 +1,31 @@ { - "name": "sofa", - "version": "0.1.0", + "name": "sofa-monorepo", "private": true, - "scripts": { - "dev": "bun --bun next dev", - "build": "bun --bun next build", - "start": "bun --bun next start", - "lint": "biome check", - "format": "biome format --write", - "check-types": "tsc --noEmit", - "test": "bun test", - "test:coverage": "bun test --coverage", - "db:generate": "bun --bun drizzle-kit generate", - "db:migrate": "bun --bun drizzle-kit migrate", - "db:push": "bun --bun drizzle-kit push", - "db:studio": "bun --bun drizzle-kit studio", - "db:seed": "bun run scripts/seed.ts", - "generate-tmdb-schema": "bunx openapi-typescript https://developer.themoviedb.org/openapi/tmdb-api.json -o ./lib/tmdb/schema.d.ts" - }, - "dependencies": { - "@base-ui/react": "1.2.0", - "@better-auth/drizzle-adapter": "1.5.4", + "workspaces": [ + "apps/*", + "packages/*" + ], + "packageManager": "bun@1.3.10", + "catalog": { "@orpc/client": "1.13.6", "@orpc/contract": "1.13.6", - "@orpc/json-schema": "1.13.6", - "@orpc/openapi": "1.13.6", - "@orpc/server": "1.13.6", - "@orpc/tanstack-query": "1.13.6", - "@orpc/zod": "1.13.6", - "@player.style/sutro": "0.2.1", - "@tabler/icons-react": "3.40.0", - "@tanstack/react-hotkeys": "0.4.0", - "@tanstack/react-query": "5.90.21", + "@types/bun": "1.3.10", "better-auth": "1.5.4", - "class-variance-authority": "0.7.1", - "clsx": "2.1.1", - "cmdk": "1.1.1", - "croner": "10.0.2-dev.2", "date-fns": "4.1.0", - "drizzle-orm": "1.0.0-beta.16-ea816b6", - "jotai": "2.18.1", - "media-chrome": "4.18.0", - "motion": "12.35.2", - "next": "16.1.6", - "node-vibrant": "4.0.4", - "openapi-fetch": "0.17.0", - "react": "19.2.4", - "react-day-picker": "9.14.0", - "react-dom": "19.2.4", - "recharts": "3.8.0", - "shadcn": "4.0.2", - "sonner": "2.0.7", - "tailwind-merge": "3.5.0", - "tw-animate-css": "1.4.0", - "vaul": "1.1.2", - "youtube-video-element": "1.9.0", + "typescript": "5.9.3", "zod": "4.3.6" }, + "scripts": { + "dev": "turbo run dev", + "build": "turbo run build", + "lint": "turbo run lint", + "format": "turbo run format", + "check-types": "turbo run check-types", + "test": "turbo run test" + }, "devDependencies": { "@biomejs/biome": "2.4.6", - "@tailwindcss/postcss": "4.2.1", - "@types/bun": "1.3.10", - "@types/node": "25.4.0", - "@types/react": "19.2.14", - "@types/react-dom": "19.2.3", - "babel-plugin-react-compiler": "1.0.0", - "drizzle-kit": "1.0.0-beta.16-ea816b6", - "tailwindcss": "4.2.1", - "typescript": "5.9.3" - }, - "packageManager": "bun@1.3.10" + "turbo": "2.8.15", + "typescript": "catalog:" + } } diff --git a/packages/api/package.json b/packages/api/package.json new file mode 100644 index 0000000..3014329 --- /dev/null +++ b/packages/api/package.json @@ -0,0 +1,22 @@ +{ + "name": "@sofa/api", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + "./contract": "./src/contract.ts", + "./schemas": "./src/schemas.ts" + }, + "scripts": { + "lint": "biome check", + "format": "biome format --write", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@orpc/contract": "catalog:", + "zod": "catalog:" + }, + "devDependencies": { + "typescript": "catalog:" + } +} diff --git a/lib/orpc/contract.ts b/packages/api/src/contract.ts similarity index 93% rename from lib/orpc/contract.ts rename to packages/api/src/contract.ts index 14b2f2c..bf95b52 100644 --- a/lib/orpc/contract.ts +++ b/packages/api/src/contract.ts @@ -1,6 +1,7 @@ import { oc } from "@orpc/contract"; import { z } from "zod"; import { + AuthConfigOutput, BackupCreateOutput, BackupScheduleOutput, BackupsListOutput, @@ -13,6 +14,7 @@ import { DiscoverOutput, FilenameParam, GenresOutput, + HydrateSeasonsOutput, IdParam, IntegrationOutput, IntegrationsListOutput, @@ -23,6 +25,7 @@ import { PersonResolveOutput, PopularOutput, ProviderParam, + PublicInfoOutput, QuickAddOutput, RegistrationOutput, RestoreBackupInput, @@ -97,6 +100,14 @@ export const contract = { }) .input(IdParam) .output(TitleRecommendationsOutput), + hydrateSeasons: oc + .route({ + method: "POST", + path: "/titles/{id}/hydrate-seasons", + tags: ["Titles"], + }) + .input(z.object({ id: z.string(), tmdbId: z.number().int() })) + .output(HydrateSeasonsOutput), }, episodes: { watch: oc @@ -207,6 +218,14 @@ export const contract = { systemStatus: oc .route({ method: "GET", path: "/system-status", tags: ["System"] }) .output(SystemStatusOutput), + system: { + publicInfo: oc + .route({ method: "GET", path: "/system/public-info", tags: ["System"] }) + .output(PublicInfoOutput), + authConfig: oc + .route({ method: "GET", path: "/system/auth-config", tags: ["System"] }) + .output(AuthConfigOutput), + }, integrations: { list: oc .route({ method: "GET", path: "/integrations", tags: ["Integrations"] }) diff --git a/lib/orpc/schemas.ts b/packages/api/src/schemas.ts similarity index 91% rename from lib/orpc/schemas.ts rename to packages/api/src/schemas.ts index 26de6bd..85b4f5f 100644 --- a/lib/orpc/schemas.ts +++ b/packages/api/src/schemas.ts @@ -535,6 +535,42 @@ export const QuickAddOutput = z.object({ alreadyAdded: z.boolean(), }); +// ─── System outputs (new) ───────────────────────────────────── + +export const PublicInfoOutput = z.object({ + tmdbConfigured: z.boolean(), + userCount: z.number(), + registrationOpen: z.boolean(), + posterUrls: z.array(z.string()), +}); + +export const AuthConfigOutput = z.object({ + oidcEnabled: z.boolean(), + oidcProviderName: z.string().nullable(), + passwordLoginDisabled: z.boolean(), + registrationOpen: z.boolean(), + userCount: z.number(), +}); + +// ─── Title hydrate seasons output ───────────────────────────── + +export const HydrateSeasonsOutput = z.object({ + seasons: z.array(SeasonSchema), +}); + +// ─── Types used by web app (moved from services) ───────────── + +export type BackupFrequency = "6h" | "12h" | "1d" | "7d"; + +export type BackupInfo = { + filename: string; + sizeBytes: number; + createdAt: string; + source: "manual" | "scheduled" | "pre-restore"; +}; + +export type SystemHealthData = z.infer; + // ═══════════════════════════════════════════════════════════════ // Inferred types — use these instead of hand-written interfaces // ═══════════════════════════════════════════════════════════════ @@ -547,3 +583,25 @@ export type ColorPalette = z.infer; export type ResolvedTitle = z.infer; export type ResolvedPerson = z.infer; export type PersonCredit = z.infer; + +export type UpdateCheckResult = { + updateAvailable: boolean; + currentVersion: string; + latestVersion: string | null; + releaseUrl: string | null; + lastCheckedAt: string | null; +}; + +export type TimePeriod = "today" | "this_week" | "this_month" | "this_year"; + +export interface HistoryBucket { + bucket: string; + count: number; +} + +export interface DashboardStats { + moviesThisMonth: number; + episodesThisWeek: number; + librarySize: number; + completed: number; +} diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json new file mode 100644 index 0000000..acd1898 --- /dev/null +++ b/packages/api/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true + }, + "include": ["src"] +} diff --git a/packages/auth/package.json b/packages/auth/package.json new file mode 100644 index 0000000..461d03d --- /dev/null +++ b/packages/auth/package.json @@ -0,0 +1,26 @@ +{ + "name": "@sofa/auth", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + "./server": "./src/server.ts", + "./config": "./src/config.ts" + }, + "scripts": { + "lint": "biome check", + "format": "biome format --write", + "check-types": "tsc --noEmit" + }, + "dependencies": { + "@better-auth/drizzle-adapter": "1.5.4", + "@sofa/core": "workspace:*", + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "better-auth": "catalog:" + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:" + } +} diff --git a/lib/config.ts b/packages/auth/src/config.ts similarity index 86% rename from lib/config.ts rename to packages/auth/src/config.ts index 2461537..3062f11 100644 --- a/lib/config.ts +++ b/packages/auth/src/config.ts @@ -3,10 +3,6 @@ * Call these in route handlers or server components — never on the client. */ -export function isTmdbConfigured(): boolean { - return !!process.env.TMDB_API_READ_ACCESS_TOKEN; -} - export function isOidcConfigured(): boolean { return !!( process.env.OIDC_CLIENT_ID && diff --git a/lib/auth/server.ts b/packages/auth/src/server.ts similarity index 91% rename from lib/auth/server.ts rename to packages/auth/src/server.ts index 930b11b..612fae1 100644 --- a/lib/auth/server.ts +++ b/packages/auth/src/server.ts @@ -1,20 +1,19 @@ import { drizzleAdapter } from "@better-auth/drizzle-adapter"; +import { + getUserCount, + isRegistrationOpen, + setSetting, +} from "@sofa/core/settings"; +import { db } from "@sofa/db/client"; +import { createLogger } from "@sofa/logger"; import { APIError, createAuthMiddleware } from "better-auth/api"; import { type BetterAuthOptions, betterAuth } from "better-auth/minimal"; -import { nextCookies } from "better-auth/next-js"; import { admin, genericOAuth } from "better-auth/plugins"; import { isOidcAutoRegisterEnabled, isOidcConfigured, isPasswordLoginDisabled, -} from "@/lib/config"; -import { db } from "@/lib/db/client"; -import { createLogger } from "@/lib/logger"; -import { - getUserCount, - isRegistrationOpen, - setSetting, -} from "@/lib/services/settings"; +} from "./config"; const authLog = createLogger("auth"); @@ -70,7 +69,9 @@ export const auth = betterAuth({ }), ] : []), - nextCookies(), // must be last + // NOTE: nextCookies() removed — Better Auth works with standard + // Request/Response natively on Hono. The web app proxies auth + // requests to the API server. ], advanced: { database: { diff --git a/packages/auth/tsconfig.json b/packages/auth/tsconfig.json new file mode 100644 index 0000000..6438538 --- /dev/null +++ b/packages/auth/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true, + "types": ["bun"] + }, + "include": ["src"] +} diff --git a/packages/config/package.json b/packages/config/package.json new file mode 100644 index 0000000..5f12cee --- /dev/null +++ b/packages/config/package.json @@ -0,0 +1,13 @@ +{ + "name": "@sofa/config", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:" + } +} diff --git a/lib/constants.ts b/packages/config/src/index.ts similarity index 57% rename from lib/constants.ts rename to packages/config/src/index.ts index a295331..e80dbb8 100644 --- a/lib/constants.ts +++ b/packages/config/src/index.ts @@ -1,6 +1,8 @@ import path from "node:path"; -export const DATA_DIR = process.env.DATA_DIR || "./data"; +// ─── Paths ─────────────────────────────────────────────────── + +export const DATA_DIR = path.resolve(process.env.DATA_DIR || "./data"); export const DATABASE_URL = process.env.DATABASE_URL || path.join(DATA_DIR, "sqlite.db"); @@ -13,6 +15,8 @@ export const BACKUP_DIR = path.join(DATA_DIR, "backups"); export const AVATAR_DIR = path.join(DATA_DIR, "avatars"); +// ─── TMDB ──────────────────────────────────────────────────── + export const TMDB_API_BASE_URL = process.env.TMDB_API_BASE_URL || "https://api.themoviedb.org/3"; diff --git a/packages/config/tsconfig.json b/packages/config/tsconfig.json new file mode 100644 index 0000000..6438538 --- /dev/null +++ b/packages/config/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true, + "types": ["bun"] + }, + "include": ["src"] +} diff --git a/packages/core/bunfig.toml b/packages/core/bunfig.toml new file mode 100644 index 0000000..786a377 --- /dev/null +++ b/packages/core/bunfig.toml @@ -0,0 +1,2 @@ +[test] +preload = ["./test/preload.ts"] diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000..8acf670 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,43 @@ +{ + "name": "@sofa/core", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + "./availability": "./src/availability.ts", + "./backup": "./src/backup.ts", + "./colors": "./src/colors.ts", + "./credits": "./src/credits.ts", + "./discovery": "./src/discovery.ts", + "./image-cache": "./src/image-cache.ts", + "./lists": "./src/lists.ts", + "./metadata": "./src/metadata.ts", + "./person": "./src/person.ts", + "./providers": "./src/providers.ts", + "./settings": "./src/settings.ts", + "./system-health": "./src/system-health.ts", + "./tracking": "./src/tracking.ts", + "./update-check": "./src/update-check.ts", + "./webhooks": "./src/webhooks.ts" + }, + "scripts": { + "lint": "biome check", + "format": "biome format --write", + "check-types": "tsc --noEmit", + "test": "bun test" + }, + "dependencies": { + "@sofa/api": "workspace:*", + "@sofa/config": "workspace:*", + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "@sofa/tmdb": "workspace:*", + "date-fns": "catalog:", + "node-vibrant": "4.0.4", + "zod": "catalog:" + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:" + } +} diff --git a/lib/services/availability.ts b/packages/core/src/availability.ts similarity index 87% rename from lib/services/availability.ts rename to packages/core/src/availability.ts index 53ed646..61c79f9 100644 --- a/lib/services/availability.ts +++ b/packages/core/src/availability.ts @@ -1,8 +1,8 @@ -import { and, eq } from "drizzle-orm"; -import { db } from "@/lib/db/client"; -import { availabilityOffers, titles } from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import { getWatchProviders } from "@/lib/tmdb/client"; +import { db } from "@sofa/db/client"; +import { and, eq } from "@sofa/db/helpers"; +import { availabilityOffers, titles } from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import { getWatchProviders } from "@sofa/tmdb/client"; const log = createLogger("availability"); diff --git a/lib/services/backup.ts b/packages/core/src/backup.ts similarity index 96% rename from lib/services/backup.ts rename to packages/core/src/backup.ts index 82b349d..8afa4ad 100644 --- a/lib/services/backup.ts +++ b/packages/core/src/backup.ts @@ -2,12 +2,12 @@ import { Database } from "bun:sqlite"; import { renameSync, unlinkSync } from "node:fs"; import { mkdir, readdir } from "node:fs/promises"; import path from "node:path"; +import { BACKUP_DIR, DATABASE_URL } from "@sofa/config"; +import { closeDatabase, db } from "@sofa/db/client"; +import { sql } from "@sofa/db/helpers"; +import { runMigrations } from "@sofa/db/migrate"; +import { createLogger } from "@sofa/logger"; import { format } from "date-fns"; -import { sql } from "drizzle-orm"; -import { BACKUP_DIR, DATABASE_URL } from "@/lib/constants"; -import { closeDatabase, db } from "@/lib/db/client"; -import { runMigrations } from "@/lib/db/migrate"; -import { createLogger } from "@/lib/logger"; const log = createLogger("backup"); diff --git a/lib/services/colors.ts b/packages/core/src/colors.ts similarity index 91% rename from lib/services/colors.ts rename to packages/core/src/colors.ts index 5af6d2a..16e815a 100644 --- a/lib/services/colors.ts +++ b/packages/core/src/colors.ts @@ -1,15 +1,15 @@ import path from "node:path"; -import { eq } from "drizzle-orm"; +import { db } from "@sofa/db/client"; +import { eq } from "@sofa/db/helpers"; +import { titles } from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; import { Vibrant } from "node-vibrant/node"; -import { db } from "@/lib/db/client"; -import { titles } from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; import { downloadAndCacheImage, getLocalImagePath, imageCacheEnabled, isImageCached, -} from "@/lib/services/image-cache"; +} from "./image-cache"; const log = createLogger("colors"); diff --git a/lib/services/credits.ts b/packages/core/src/credits.ts similarity index 96% rename from lib/services/credits.ts rename to packages/core/src/credits.ts index 350b862..6ff32d1 100644 --- a/lib/services/credits.ts +++ b/packages/core/src/credits.ts @@ -1,10 +1,10 @@ -import { eq, inArray, sql } from "drizzle-orm"; -import { db } from "@/lib/db/client"; -import { persons, titleCast, titles } from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import type { CastMember } from "@/lib/orpc/schemas"; -import { getMovieCredits, getTvAggregateCredits } from "@/lib/tmdb/client"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +import type { CastMember } from "@sofa/api/schemas"; +import { db } from "@sofa/db/client"; +import { eq, inArray, sql } from "@sofa/db/helpers"; +import { persons, titleCast, titles } from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import { getMovieCredits, getTvAggregateCredits } from "@sofa/tmdb/client"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; import { cacheProfilePhotos, imageCacheEnabled } from "./image-cache"; const log = createLogger("credits"); diff --git a/lib/services/discovery.ts b/packages/core/src/discovery.ts similarity index 98% rename from lib/services/discovery.ts rename to packages/core/src/discovery.ts index 1a486c3..c5ce5ee 100644 --- a/lib/services/discovery.ts +++ b/packages/core/src/discovery.ts @@ -1,5 +1,5 @@ -import { and, desc, eq, inArray, sql } from "drizzle-orm"; -import { db } from "@/lib/db/client"; +import { db } from "@sofa/db/client"; +import { and, desc, eq, inArray, sql } from "@sofa/db/helpers"; import { availabilityOffers, episodes, @@ -10,8 +10,8 @@ import { userMovieWatches, userRatings, userTitleStatus, -} from "@/lib/db/schema"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +} from "@sofa/db/schema"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; export type TimePeriod = "today" | "this_week" | "this_month" | "this_year"; diff --git a/lib/services/image-cache.ts b/packages/core/src/image-cache.ts similarity index 95% rename from lib/services/image-cache.ts rename to packages/core/src/image-cache.ts index f2d5b02..d09344b 100644 --- a/lib/services/image-cache.ts +++ b/packages/core/src/image-cache.ts @@ -1,8 +1,8 @@ import { mkdir, rename } from "node:fs/promises"; import path from "node:path"; -import { eq, inArray } from "drizzle-orm"; -import { CACHE_DIR, TMDB_IMAGE_BASE_URL } from "@/lib/constants"; -import { db } from "@/lib/db/client"; +import { CACHE_DIR, TMDB_IMAGE_BASE_URL } from "@sofa/config"; +import { db } from "@sofa/db/client"; +import { eq, inArray } from "@sofa/db/helpers"; import { availabilityOffers, episodes, @@ -10,17 +10,13 @@ import { seasons, titleCast, titles, -} from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; +} from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import type { ImageCategory } from "@sofa/tmdb/image"; const log = createLogger("image-cache"); -export type ImageCategory = - | "posters" - | "backdrops" - | "stills" - | "logos" - | "profiles"; +export type { ImageCategory }; const CATEGORY_SIZES: Record = { posters: "w500", diff --git a/lib/services/lists.ts b/packages/core/src/lists.ts similarity index 93% rename from lib/services/lists.ts rename to packages/core/src/lists.ts index ace029c..ddf0257 100644 --- a/lib/services/lists.ts +++ b/packages/core/src/lists.ts @@ -1,9 +1,9 @@ -import { and, eq, inArray } from "drizzle-orm"; +import { db } from "@sofa/db/client"; +import { and, eq, inArray } from "@sofa/db/helpers"; +import { integrations, titles, userTitleStatus } from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import { getTvExternalIds } from "@sofa/tmdb/client"; import { z } from "zod"; -import { db } from "@/lib/db/client"; -import { integrations, titles, userTitleStatus } from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import { getTvExternalIds } from "@/lib/tmdb/client"; const log = createLogger("lists"); diff --git a/lib/services/metadata.ts b/packages/core/src/metadata.ts similarity index 98% rename from lib/services/metadata.ts rename to packages/core/src/metadata.ts index 88196bd..12b2515 100644 --- a/lib/services/metadata.ts +++ b/packages/core/src/metadata.ts @@ -1,5 +1,12 @@ -import { eq, inArray, sql } from "drizzle-orm"; -import { db } from "@/lib/db/client"; +import type { + AvailabilityOffer, + CastMember, + Episode, + ResolvedTitle, + Season, +} from "@sofa/api/schemas"; +import { db } from "@sofa/db/client"; +import { eq, inArray, sql } from "@sofa/db/helpers"; import { availabilityOffers, episodes, @@ -8,22 +15,14 @@ import { titleGenres, titleRecommendations, titles, -} from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import type { - AvailabilityOffer, - CastMember, - Episode, - ResolvedTitle, - Season, -} from "@/lib/orpc/schemas"; -import { generateProviderUrl } from "@/lib/providers"; +} from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; import type { TmdbGenre, TmdbMovieDetails, TmdbTvDetails, TmdbVideo, -} from "@/lib/tmdb/client"; +} from "@sofa/tmdb/client"; import { getMovieDetails, getRecommendations, @@ -31,8 +30,8 @@ import { getTvDetails, getTvSeasonDetails, getVideos, -} from "@/lib/tmdb/client"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +} from "@sofa/tmdb/client"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; import { refreshAvailability } from "./availability"; import { extractAndStoreColors, parseColorPalette } from "./colors"; import { getCastForTitle, refreshCredits } from "./credits"; @@ -41,6 +40,7 @@ import { cacheImagesForTitle, imageCacheEnabled, } from "./image-cache"; +import { generateProviderUrl } from "./providers"; const log = createLogger("metadata"); diff --git a/lib/services/person.ts b/packages/core/src/person.ts similarity index 95% rename from lib/services/person.ts rename to packages/core/src/person.ts index 6bd5b9b..3687f8f 100644 --- a/lib/services/person.ts +++ b/packages/core/src/person.ts @@ -1,10 +1,10 @@ -import { eq, inArray } from "drizzle-orm"; -import { db } from "@/lib/db/client"; -import { persons, titleCast, titles } from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import type { PersonCredit, ResolvedPerson } from "@/lib/orpc/schemas"; -import { getPersonCombinedCredits, getPersonDetails } from "@/lib/tmdb/client"; -import { tmdbImageUrl } from "@/lib/tmdb/image"; +import type { PersonCredit, ResolvedPerson } from "@sofa/api/schemas"; +import { db } from "@sofa/db/client"; +import { eq, inArray } from "@sofa/db/helpers"; +import { persons, titleCast, titles } from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import { getPersonCombinedCredits, getPersonDetails } from "@sofa/tmdb/client"; +import { tmdbImageUrl } from "@sofa/tmdb/image"; const log = createLogger("person"); diff --git a/lib/providers.ts b/packages/core/src/providers.ts similarity index 100% rename from lib/providers.ts rename to packages/core/src/providers.ts diff --git a/lib/services/settings.ts b/packages/core/src/settings.ts similarity index 84% rename from lib/services/settings.ts rename to packages/core/src/settings.ts index b4c3d87..c134b08 100644 --- a/lib/services/settings.ts +++ b/packages/core/src/settings.ts @@ -1,6 +1,6 @@ -import { count, eq } from "drizzle-orm"; -import { db } from "@/lib/db/client"; -import { appSettings, user } from "@/lib/db/schema"; +import { db } from "@sofa/db/client"; +import { count, eq } from "@sofa/db/helpers"; +import { appSettings, user } from "@sofa/db/schema"; export function getSetting(key: string): string | null { const row = db diff --git a/lib/services/system-health.ts b/packages/core/src/system-health.ts similarity index 92% rename from lib/services/system-health.ts rename to packages/core/src/system-health.ts index a8256c8..3442f54 100644 --- a/lib/services/system-health.ts +++ b/packages/core/src/system-health.ts @@ -1,18 +1,18 @@ import { access, constants, readdir } from "node:fs/promises"; import path from "node:path"; -import { count, desc, eq } from "drizzle-orm"; import { CACHE_DIR, DATA_DIR, DATABASE_URL, TMDB_API_BASE_URL, -} from "@/lib/constants"; -import { db } from "@/lib/db/client"; -import { cronRuns, episodes, titles, user } from "@/lib/db/schema"; -import { listBackups } from "@/lib/services/backup"; -import { imageCacheEnabled } from "@/lib/services/image-cache"; -import { getSetting } from "@/lib/services/settings"; -import { isUpdateCheckEnabled } from "@/lib/services/update-check"; +} from "@sofa/config"; +import { db } from "@sofa/db/client"; +import { count, desc, eq } from "@sofa/db/helpers"; +import { cronRuns, episodes, titles, user } from "@sofa/db/schema"; +import { listBackups } from "./backup"; +import { imageCacheEnabled } from "./image-cache"; +import { getSetting } from "./settings"; +import { isUpdateCheckEnabled } from "./update-check"; export interface SystemHealthData { database: { @@ -144,11 +144,21 @@ async function getTmdbHealth(): Promise { } } +type JobSchedule = { + jobName: string; + pattern: string; + nextRunAt: string | null; +}; + +let _getJobSchedules: (() => JobSchedule[]) | null = null; + +/** Register the job schedule provider (called by the API server on startup). */ +export function registerJobScheduleProvider(fn: () => JobSchedule[]) { + _getJobSchedules = fn; +} + function getJobsHealth(): SystemHealthData["jobs"] { - // Lazy-import to avoid circular dependency issues at module level - const { getJobSchedules } = - require("@/lib/cron") as typeof import("@/lib/cron"); - const schedules = getJobSchedules(); + const schedules = _getJobSchedules?.() ?? []; const scheduleMap = new Map(schedules.map((s) => [s.jobName, s])); // Fetch only the latest cron run per job (index-optimized LIMIT 1 each) diff --git a/lib/services/tracking.ts b/packages/core/src/tracking.ts similarity index 99% rename from lib/services/tracking.ts rename to packages/core/src/tracking.ts index 7feede1..9c90f00 100644 --- a/lib/services/tracking.ts +++ b/packages/core/src/tracking.ts @@ -1,5 +1,5 @@ -import { and, eq, inArray, sql } from "drizzle-orm"; -import { db } from "@/lib/db/client"; +import { db } from "@sofa/db/client"; +import { and, eq, inArray, sql } from "@sofa/db/helpers"; import { episodes, seasons, @@ -8,7 +8,7 @@ import { userMovieWatches, userRatings, userTitleStatus, -} from "@/lib/db/schema"; +} from "@sofa/db/schema"; export function setTitleStatus( userId: string, diff --git a/lib/services/update-check.ts b/packages/core/src/update-check.ts similarity index 96% rename from lib/services/update-check.ts rename to packages/core/src/update-check.ts index 2543a7d..b67994e 100644 --- a/lib/services/update-check.ts +++ b/packages/core/src/update-check.ts @@ -1,5 +1,5 @@ -import { createLogger } from "@/lib/logger"; -import { getSetting, setSetting } from "@/lib/services/settings"; +import { createLogger } from "@sofa/logger"; +import { getSetting, setSetting } from "./settings"; const APP_VERSION = process.env.APP_VERSION || "0.0.0"; diff --git a/lib/services/webhooks.ts b/packages/core/src/webhooks.ts similarity index 98% rename from lib/services/webhooks.ts rename to packages/core/src/webhooks.ts index a61370f..d109dd7 100644 --- a/lib/services/webhooks.ts +++ b/packages/core/src/webhooks.ts @@ -1,5 +1,5 @@ -import { and, eq, gte } from "drizzle-orm"; -import { db } from "@/lib/db/client"; +import { db } from "@sofa/db/client"; +import { and, eq, gte } from "@sofa/db/helpers"; import { episodes, integrationEvents, @@ -7,9 +7,9 @@ import { seasons, userEpisodeWatches, userMovieWatches, -} from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import { findByExternalId, searchTv } from "@/lib/tmdb/client"; +} from "@sofa/db/schema"; +import { createLogger } from "@sofa/logger"; +import { findByExternalId, searchTv } from "@sofa/tmdb/client"; import { getOrFetchTitleByTmdbId } from "./metadata"; import { logEpisodeWatch, logMovieWatch } from "./tracking"; diff --git a/lib/services/backup.test.ts b/packages/core/test/backup.test.ts similarity index 99% rename from lib/services/backup.test.ts rename to packages/core/test/backup.test.ts index f9a5a0b..bddb6cd 100644 --- a/lib/services/backup.test.ts +++ b/packages/core/test/backup.test.ts @@ -4,7 +4,7 @@ import { getBackupSource, isKnownBackup, isValidBackupFilename, -} from "./backup"; +} from "../src/backup"; describe("getBackupSource", () => { test("detects manual backup", () => { diff --git a/lib/services/colors.test.ts b/packages/core/test/colors.test.ts similarity index 90% rename from lib/services/colors.test.ts rename to packages/core/test/colors.test.ts index 34d6571..41762dc 100644 --- a/lib/services/colors.test.ts +++ b/packages/core/test/colors.test.ts @@ -1,13 +1,13 @@ import { describe, expect, mock, test } from "bun:test"; -mock.module("@/lib/services/image-cache", () => ({ +mock.module("../src/image-cache", () => ({ downloadAndCacheImage: async () => {}, getLocalImagePath: () => "", imageCacheEnabled: () => false, isImageCached: async () => false, })); -import { parseColorPalette } from "./colors"; +import { parseColorPalette } from "../src/colors"; describe("parseColorPalette", () => { test("returns null for null input", () => { diff --git a/lib/services/credits.test.ts b/packages/core/test/credits.test.ts similarity index 88% rename from lib/services/credits.test.ts rename to packages/core/test/credits.test.ts index 410220a..6a1d7b9 100644 --- a/lib/services/credits.test.ts +++ b/packages/core/test/credits.test.ts @@ -1,13 +1,13 @@ import { beforeEach, describe, expect, mock, test } from "bun:test"; -import { persons, titleCast } from "@/lib/db/schema"; -import { clearAllTables, insertTitle, testDb } from "@/test/sqlite"; +import { persons, titleCast } from "@sofa/db/schema"; +import { clearAllTables, insertTitle, testDb } from "@sofa/db/test-utils"; -mock.module("./image-cache", () => ({ +mock.module("../src/image-cache", () => ({ imageCacheEnabled: () => false, cacheProfilePhotos: async () => {}, })); -import { getCastForTitle } from "./credits"; +import { getCastForTitle } from "../src/credits"; beforeEach(() => { clearAllTables(); @@ -61,7 +61,7 @@ describe("getCastForTitle", () => { expect(cast).toHaveLength(2); expect(cast[0].name).toBe("Actor One"); expect(cast[0].character).toBe("Hero"); - expect(cast[0].profilePath).toBe("/api/images/profiles/path1.jpg"); + expect(cast[0].profilePath).toBe("/images/profiles/path1.jpg"); expect(cast[1].name).toBe("Actor Two"); }); diff --git a/lib/services/discovery.test.ts b/packages/core/test/discovery.test.ts similarity index 99% rename from lib/services/discovery.test.ts rename to packages/core/test/discovery.test.ts index f62445e..57dd533 100644 --- a/lib/services/discovery.test.ts +++ b/packages/core/test/discovery.test.ts @@ -10,7 +10,7 @@ import { insertTitle, insertTvShow, insertUser, -} from "@/test/sqlite"; +} from "@sofa/db/test-utils"; import { getContinueWatchingFeed, getNewAvailableFeed, @@ -19,7 +19,7 @@ import { getUserStats, getWatchCount, getWatchHistory, -} from "./discovery"; +} from "../src/discovery"; beforeEach(() => { clearAllTables(); diff --git a/lib/services/lists.test.ts b/packages/core/test/lists.test.ts similarity index 98% rename from lib/services/lists.test.ts rename to packages/core/test/lists.test.ts index 30428ff..a1a7963 100644 --- a/lib/services/lists.test.ts +++ b/packages/core/test/lists.test.ts @@ -5,20 +5,20 @@ import { insertStatus, insertTitle, insertUser, -} from "@/test/sqlite"; +} from "@sofa/db/test-utils"; import { getRadarrList, getSonarrList, parseStatusParam, resolveListToken, -} from "./lists"; +} from "../src/lists"; // Mock getTvExternalIds for lazy resolution tests const mockGetTvExternalIds = mock( (): Promise<{ tvdb_id: number | null; imdb_id: string | null }> => Promise.resolve({ tvdb_id: 55555, imdb_id: "tt9999999" }), ); -mock.module("@/lib/tmdb/client", () => ({ +mock.module("@sofa/tmdb/client", () => ({ getTvExternalIds: mockGetTvExternalIds, })); diff --git a/lib/services/metadata.test.ts b/packages/core/test/metadata.test.ts similarity index 99% rename from lib/services/metadata.test.ts rename to packages/core/test/metadata.test.ts index 7b02853..31e6fc1 100644 --- a/lib/services/metadata.test.ts +++ b/packages/core/test/metadata.test.ts @@ -3,12 +3,12 @@ import type { TmdbMovieDetails, TmdbTvDetails, TmdbVideo, -} from "@/lib/tmdb/client"; +} from "@sofa/tmdb/client"; import { extractMovieContentRating, extractTvContentRating, pickBestTrailer, -} from "./metadata"; +} from "../src/metadata"; function makeVideo(overrides: Partial = {}): TmdbVideo { return { diff --git a/lib/services/person.test.ts b/packages/core/test/person.test.ts similarity index 93% rename from lib/services/person.test.ts rename to packages/core/test/person.test.ts index 5231472..95e3229 100644 --- a/lib/services/person.test.ts +++ b/packages/core/test/person.test.ts @@ -1,8 +1,7 @@ import { beforeEach, describe, expect, test } from "bun:test"; -import { persons, titleCast } from "@/lib/db/schema"; -import { clearAllTables, insertTitle, testDb } from "@/test/sqlite"; - -import { getLocalFilmography } from "./person"; +import { persons, titleCast } from "@sofa/db/schema"; +import { clearAllTables, insertTitle, testDb } from "@sofa/db/test-utils"; +import { getLocalFilmography } from "../src/person"; beforeEach(() => { clearAllTables(); diff --git a/packages/core/test/preload.ts b/packages/core/test/preload.ts new file mode 100644 index 0000000..b91a0c9 --- /dev/null +++ b/packages/core/test/preload.ts @@ -0,0 +1,9 @@ +import { mock } from "bun:test"; +import { applyMigrations, testDb } from "@sofa/db/test-utils"; + +mock.module("@sofa/db/client", () => ({ + db: testDb, + closeDatabase: () => {}, +})); + +applyMigrations(); diff --git a/lib/services/settings.test.ts b/packages/core/test/settings.test.ts similarity index 95% rename from lib/services/settings.test.ts rename to packages/core/test/settings.test.ts index 4836c43..bd06afc 100644 --- a/lib/services/settings.test.ts +++ b/packages/core/test/settings.test.ts @@ -1,11 +1,11 @@ import { beforeEach, describe, expect, test } from "bun:test"; -import { clearAllTables, insertUser } from "@/test/sqlite"; +import { clearAllTables, insertUser } from "@sofa/db/test-utils"; import { getSetting, getUserCount, isRegistrationOpen, setSetting, -} from "./settings"; +} from "../src/settings"; beforeEach(() => { clearAllTables(); diff --git a/lib/services/tracking.test.ts b/packages/core/test/tracking.test.ts similarity index 99% rename from lib/services/tracking.test.ts rename to packages/core/test/tracking.test.ts index a633165..c322ef0 100644 --- a/lib/services/tracking.test.ts +++ b/packages/core/test/tracking.test.ts @@ -1,18 +1,18 @@ import { beforeEach, describe, expect, test } from "bun:test"; -import { and, eq } from "drizzle-orm"; +import { and, eq } from "@sofa/db/helpers"; import { userEpisodeWatches, userMovieWatches, userRatings, userTitleStatus, -} from "@/lib/db/schema"; +} from "@sofa/db/schema"; import { clearAllTables, insertTitle, insertTvShow, insertUser, testDb, -} from "@/test/sqlite"; +} from "@sofa/db/test-utils"; import { getUserTitleInfo, logEpisodeWatch, @@ -24,7 +24,7 @@ import { setTitleStatus, unwatchEpisode, unwatchSeason, -} from "./tracking"; +} from "../src/tracking"; beforeEach(() => { clearAllTables(); diff --git a/lib/services/update-check.test.ts b/packages/core/test/update-check.test.ts similarity index 95% rename from lib/services/update-check.test.ts rename to packages/core/test/update-check.test.ts index 785888d..f7359a9 100644 --- a/lib/services/update-check.test.ts +++ b/packages/core/test/update-check.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { isNewerVersion } from "./update-check"; +import { isNewerVersion } from "../src/update-check"; describe("isNewerVersion", () => { test("newer major version", () => { diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000..a156cba --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true, + "types": ["bun"] + }, + "include": ["src", "test"] +} diff --git a/drizzle.config.ts b/packages/db/drizzle.config.ts similarity index 89% rename from drizzle.config.ts rename to packages/db/drizzle.config.ts index fd50afd..ebdf7bf 100644 --- a/drizzle.config.ts +++ b/packages/db/drizzle.config.ts @@ -3,7 +3,7 @@ import { defineConfig } from "drizzle-kit"; export default defineConfig({ dialect: "sqlite", - schema: "./lib/db/schema.ts", + schema: "./src/schema.ts", out: "./drizzle", dbCredentials: { url: diff --git a/drizzle/20260301173504_puzzling_doomsday/migration.sql b/packages/db/drizzle/20260301173504_puzzling_doomsday/migration.sql similarity index 100% rename from drizzle/20260301173504_puzzling_doomsday/migration.sql rename to packages/db/drizzle/20260301173504_puzzling_doomsday/migration.sql diff --git a/drizzle/20260301173504_puzzling_doomsday/snapshot.json b/packages/db/drizzle/20260301173504_puzzling_doomsday/snapshot.json similarity index 94% rename from drizzle/20260301173504_puzzling_doomsday/snapshot.json rename to packages/db/drizzle/20260301173504_puzzling_doomsday/snapshot.json index dac41aa..2f9fcef 100644 --- a/drizzle/20260301173504_puzzling_doomsday/snapshot.json +++ b/packages/db/drizzle/20260301173504_puzzling_doomsday/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "81a1f7d0-3964-479d-8058-eec7c8b94a91", - "prevIds": [ - "00000000-0000-0000-0000-000000000000" - ], + "prevIds": ["00000000-0000-0000-0000-000000000000"], "ddl": [ { "name": "account", @@ -1019,13 +1017,9 @@ "table": "verification" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1034,13 +1028,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1049,13 +1039,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1064,13 +1050,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1079,13 +1061,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1094,13 +1072,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1109,13 +1083,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1124,13 +1094,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1139,13 +1105,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1154,13 +1116,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1169,13 +1127,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1184,13 +1138,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1199,13 +1149,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1214,13 +1160,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1229,13 +1171,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1244,81 +1182,63 @@ "table": "userTitleStatus" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", @@ -1577,18 +1497,14 @@ "table": "userTitleStatus" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -1596,4 +1512,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260301184938_lazy_aaron_stack/migration.sql b/packages/db/drizzle/20260301184938_lazy_aaron_stack/migration.sql similarity index 100% rename from drizzle/20260301184938_lazy_aaron_stack/migration.sql rename to packages/db/drizzle/20260301184938_lazy_aaron_stack/migration.sql diff --git a/drizzle/20260301184938_lazy_aaron_stack/snapshot.json b/packages/db/drizzle/20260301184938_lazy_aaron_stack/snapshot.json similarity index 94% rename from drizzle/20260301184938_lazy_aaron_stack/snapshot.json rename to packages/db/drizzle/20260301184938_lazy_aaron_stack/snapshot.json index 74012d8..66aa183 100644 --- a/drizzle/20260301184938_lazy_aaron_stack/snapshot.json +++ b/packages/db/drizzle/20260301184938_lazy_aaron_stack/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "5a3a9362-3a1d-4db9-b726-5791fa0f8816", - "prevIds": [ - "81a1f7d0-3964-479d-8058-eec7c8b94a91" - ], + "prevIds": ["81a1f7d0-3964-479d-8058-eec7c8b94a91"], "ddl": [ { "name": "account", @@ -1093,13 +1091,9 @@ "table": "verification" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1108,13 +1102,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1123,13 +1113,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1138,13 +1124,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1153,13 +1135,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1168,13 +1146,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1183,13 +1157,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1198,13 +1168,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1213,13 +1179,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1228,13 +1190,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1243,13 +1201,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1258,13 +1212,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1273,13 +1223,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1288,13 +1234,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1303,13 +1245,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1318,90 +1256,70 @@ "table": "userTitleStatus" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", @@ -1660,18 +1578,14 @@ "table": "userTitleStatus" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -1679,4 +1593,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260301210600_minor_karnak/migration.sql b/packages/db/drizzle/20260301210600_minor_karnak/migration.sql similarity index 100% rename from drizzle/20260301210600_minor_karnak/migration.sql rename to packages/db/drizzle/20260301210600_minor_karnak/migration.sql diff --git a/drizzle/20260301210600_minor_karnak/snapshot.json b/packages/db/drizzle/20260301210600_minor_karnak/snapshot.json similarity index 94% rename from drizzle/20260301210600_minor_karnak/snapshot.json rename to packages/db/drizzle/20260301210600_minor_karnak/snapshot.json index 5210a43..26d2672 100644 --- a/drizzle/20260301210600_minor_karnak/snapshot.json +++ b/packages/db/drizzle/20260301210600_minor_karnak/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "406b2cf8-d2eb-4113-840a-d2cec54dbadc", - "prevIds": [ - "5a3a9362-3a1d-4db9-b726-5791fa0f8816" - ], + "prevIds": ["5a3a9362-3a1d-4db9-b726-5791fa0f8816"], "ddl": [ { "name": "account", @@ -1261,13 +1259,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1276,13 +1270,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1291,13 +1281,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1306,13 +1292,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1321,13 +1303,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1336,13 +1314,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1351,13 +1325,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1366,13 +1336,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1381,13 +1347,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1396,13 +1358,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1411,13 +1369,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1426,13 +1380,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1441,13 +1391,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1456,13 +1402,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1471,13 +1413,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1486,13 +1424,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1501,13 +1435,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1516,108 +1446,84 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -1926,18 +1832,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -1945,4 +1847,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260302172853_purple_tomas/migration.sql b/packages/db/drizzle/20260302172853_purple_tomas/migration.sql similarity index 100% rename from drizzle/20260302172853_purple_tomas/migration.sql rename to packages/db/drizzle/20260302172853_purple_tomas/migration.sql diff --git a/drizzle/20260302172853_purple_tomas/snapshot.json b/packages/db/drizzle/20260302172853_purple_tomas/snapshot.json similarity index 94% rename from drizzle/20260302172853_purple_tomas/snapshot.json rename to packages/db/drizzle/20260302172853_purple_tomas/snapshot.json index d0f1632..661e049 100644 --- a/drizzle/20260302172853_purple_tomas/snapshot.json +++ b/packages/db/drizzle/20260302172853_purple_tomas/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "0d9a9bb2-878a-4c48-9e48-b7f17b7cc54a", - "prevIds": [ - "406b2cf8-d2eb-4113-840a-d2cec54dbadc" - ], + "prevIds": ["406b2cf8-d2eb-4113-840a-d2cec54dbadc"], "ddl": [ { "name": "account", @@ -1271,13 +1269,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1286,13 +1280,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1301,13 +1291,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1316,13 +1302,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1331,13 +1313,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1346,13 +1324,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1361,13 +1335,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1376,13 +1346,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1391,13 +1357,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1406,13 +1368,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1421,13 +1379,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1436,13 +1390,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1451,13 +1401,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1466,13 +1412,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1481,13 +1423,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1496,13 +1434,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1511,13 +1445,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1526,108 +1456,84 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -1936,18 +1842,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -1955,4 +1857,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260303200504_ambiguous_korg/migration.sql b/packages/db/drizzle/20260303200504_ambiguous_korg/migration.sql similarity index 100% rename from drizzle/20260303200504_ambiguous_korg/migration.sql rename to packages/db/drizzle/20260303200504_ambiguous_korg/migration.sql diff --git a/drizzle/20260303200504_ambiguous_korg/snapshot.json b/packages/db/drizzle/20260303200504_ambiguous_korg/snapshot.json similarity index 94% rename from drizzle/20260303200504_ambiguous_korg/snapshot.json rename to packages/db/drizzle/20260303200504_ambiguous_korg/snapshot.json index 25f8dfa..109e61b 100644 --- a/drizzle/20260303200504_ambiguous_korg/snapshot.json +++ b/packages/db/drizzle/20260303200504_ambiguous_korg/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "df501e82-b113-4048-9b80-14b0c37b6b1f", - "prevIds": [ - "0d9a9bb2-878a-4c48-9e48-b7f17b7cc54a" - ], + "prevIds": ["0d9a9bb2-878a-4c48-9e48-b7f17b7cc54a"], "ddl": [ { "name": "account", @@ -1281,13 +1279,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1296,13 +1290,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1311,13 +1301,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1326,13 +1312,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1341,13 +1323,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1356,13 +1334,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1371,13 +1345,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1386,13 +1356,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1401,13 +1367,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1416,13 +1378,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1431,13 +1389,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1446,13 +1400,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1461,13 +1411,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1476,13 +1422,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1491,13 +1433,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1506,13 +1444,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1521,13 +1455,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1536,108 +1466,84 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -1946,18 +1852,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -1965,4 +1867,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260304175614_melted_anthem/migration.sql b/packages/db/drizzle/20260304175614_melted_anthem/migration.sql similarity index 100% rename from drizzle/20260304175614_melted_anthem/migration.sql rename to packages/db/drizzle/20260304175614_melted_anthem/migration.sql diff --git a/drizzle/20260304175614_melted_anthem/snapshot.json b/packages/db/drizzle/20260304175614_melted_anthem/snapshot.json similarity index 95% rename from drizzle/20260304175614_melted_anthem/snapshot.json rename to packages/db/drizzle/20260304175614_melted_anthem/snapshot.json index 511cb1b..f86f102 100644 --- a/drizzle/20260304175614_melted_anthem/snapshot.json +++ b/packages/db/drizzle/20260304175614_melted_anthem/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "801f55b9-8091-42d4-b4ab-20eccf2258d9", - "prevIds": [ - "df501e82-b113-4048-9b80-14b0c37b6b1f" - ], + "prevIds": ["df501e82-b113-4048-9b80-14b0c37b6b1f"], "ddl": [ { "name": "account", @@ -1345,13 +1343,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1360,13 +1354,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1375,13 +1365,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1390,13 +1376,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1405,13 +1387,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1420,13 +1398,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1435,13 +1409,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1450,13 +1420,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1465,13 +1431,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1480,13 +1442,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1495,13 +1453,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1510,13 +1464,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1525,13 +1475,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1540,13 +1486,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1555,13 +1497,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1570,13 +1508,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1585,13 +1519,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1600,117 +1530,91 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -2037,18 +1941,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2056,4 +1956,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260305054757_high_cobalt_man/migration.sql b/packages/db/drizzle/20260305054757_high_cobalt_man/migration.sql similarity index 100% rename from drizzle/20260305054757_high_cobalt_man/migration.sql rename to packages/db/drizzle/20260305054757_high_cobalt_man/migration.sql diff --git a/drizzle/20260305054757_high_cobalt_man/snapshot.json b/packages/db/drizzle/20260305054757_high_cobalt_man/snapshot.json similarity index 95% rename from drizzle/20260305054757_high_cobalt_man/snapshot.json rename to packages/db/drizzle/20260305054757_high_cobalt_man/snapshot.json index 8f5af92..3f401b3 100644 --- a/drizzle/20260305054757_high_cobalt_man/snapshot.json +++ b/packages/db/drizzle/20260305054757_high_cobalt_man/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "ced24fed-4572-4e4f-8534-d214de1e4a40", - "prevIds": [ - "801f55b9-8091-42d4-b4ab-20eccf2258d9" - ], + "prevIds": ["801f55b9-8091-42d4-b4ab-20eccf2258d9"], "ddl": [ { "name": "account", @@ -1335,13 +1333,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1350,13 +1344,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1365,13 +1355,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1380,13 +1366,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1395,13 +1377,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1410,13 +1388,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1425,13 +1399,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1440,13 +1410,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1455,13 +1421,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1470,13 +1432,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1485,13 +1443,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1500,13 +1454,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1515,13 +1465,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1530,13 +1476,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1545,13 +1487,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1560,13 +1498,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1575,13 +1509,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1590,117 +1520,91 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -2027,18 +1931,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2046,4 +1946,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260305154106_regular_blockbuster/migration.sql b/packages/db/drizzle/20260305154106_regular_blockbuster/migration.sql similarity index 100% rename from drizzle/20260305154106_regular_blockbuster/migration.sql rename to packages/db/drizzle/20260305154106_regular_blockbuster/migration.sql diff --git a/drizzle/20260305154106_regular_blockbuster/snapshot.json b/packages/db/drizzle/20260305154106_regular_blockbuster/snapshot.json similarity index 95% rename from drizzle/20260305154106_regular_blockbuster/snapshot.json rename to packages/db/drizzle/20260305154106_regular_blockbuster/snapshot.json index 0ade385..e7a9d0d 100644 --- a/drizzle/20260305154106_regular_blockbuster/snapshot.json +++ b/packages/db/drizzle/20260305154106_regular_blockbuster/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "59092469-5e63-4b2b-8372-6e4d463232ef", - "prevIds": [ - "ced24fed-4572-4e4f-8534-d214de1e4a40" - ], + "prevIds": ["ced24fed-4572-4e4f-8534-d214de1e4a40"], "ddl": [ { "name": "account", @@ -1345,13 +1343,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1360,13 +1354,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1375,13 +1365,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1390,13 +1376,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1405,13 +1387,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1420,13 +1398,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1435,13 +1409,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1450,13 +1420,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1465,13 +1431,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1480,13 +1442,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1495,13 +1453,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1510,13 +1464,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1525,13 +1475,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1540,13 +1486,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1555,13 +1497,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1570,13 +1508,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1585,13 +1519,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1600,117 +1530,91 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -2037,18 +1941,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2056,4 +1956,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260305183504_overjoyed_roland_deschain/migration.sql b/packages/db/drizzle/20260305183504_overjoyed_roland_deschain/migration.sql similarity index 100% rename from drizzle/20260305183504_overjoyed_roland_deschain/migration.sql rename to packages/db/drizzle/20260305183504_overjoyed_roland_deschain/migration.sql diff --git a/drizzle/20260305183504_overjoyed_roland_deschain/snapshot.json b/packages/db/drizzle/20260305183504_overjoyed_roland_deschain/snapshot.json similarity index 95% rename from drizzle/20260305183504_overjoyed_roland_deschain/snapshot.json rename to packages/db/drizzle/20260305183504_overjoyed_roland_deschain/snapshot.json index 25ca410..babeaa6 100644 --- a/drizzle/20260305183504_overjoyed_roland_deschain/snapshot.json +++ b/packages/db/drizzle/20260305183504_overjoyed_roland_deschain/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "3925784e-d0d4-4e49-abdb-8b2469070957", - "prevIds": [ - "59092469-5e63-4b2b-8372-6e4d463232ef" - ], + "prevIds": ["59092469-5e63-4b2b-8372-6e4d463232ef"], "ddl": [ { "name": "account", @@ -1355,13 +1353,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1370,13 +1364,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1385,13 +1375,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1400,13 +1386,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1415,13 +1397,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1430,13 +1408,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1445,13 +1419,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1460,13 +1430,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1475,13 +1441,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1490,13 +1452,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1505,13 +1463,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1520,13 +1474,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1535,13 +1485,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1550,13 +1496,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1565,13 +1507,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1580,13 +1518,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1595,13 +1529,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1610,117 +1540,91 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -2047,18 +1951,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2066,4 +1966,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260305193509_overjoyed_pestilence/migration.sql b/packages/db/drizzle/20260305193509_overjoyed_pestilence/migration.sql similarity index 100% rename from drizzle/20260305193509_overjoyed_pestilence/migration.sql rename to packages/db/drizzle/20260305193509_overjoyed_pestilence/migration.sql diff --git a/drizzle/20260305193509_overjoyed_pestilence/snapshot.json b/packages/db/drizzle/20260305193509_overjoyed_pestilence/snapshot.json similarity index 95% rename from drizzle/20260305193509_overjoyed_pestilence/snapshot.json rename to packages/db/drizzle/20260305193509_overjoyed_pestilence/snapshot.json index 2a29721..1db8811 100644 --- a/drizzle/20260305193509_overjoyed_pestilence/snapshot.json +++ b/packages/db/drizzle/20260305193509_overjoyed_pestilence/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "662445d8-e2df-4ae9-8019-89785f2fd5bc", - "prevIds": [ - "3925784e-d0d4-4e49-abdb-8b2469070957" - ], + "prevIds": ["3925784e-d0d4-4e49-abdb-8b2469070957"], "ddl": [ { "name": "account", @@ -1573,13 +1571,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1588,13 +1582,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1603,13 +1593,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1618,13 +1604,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1633,13 +1615,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1648,13 +1626,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1663,13 +1637,9 @@ "table": "titleCast" }, { - "columns": [ - "personId" - ], + "columns": ["personId"], "tableTo": "persons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1678,13 +1648,9 @@ "table": "titleCast" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1693,13 +1659,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1708,13 +1670,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1723,13 +1681,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1738,13 +1692,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1753,13 +1703,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1768,13 +1714,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1783,13 +1725,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1798,13 +1736,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1813,13 +1747,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1828,13 +1758,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1843,13 +1769,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1858,135 +1780,105 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "persons_pk", "table": "persons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titleCast_pk", "table": "titleCast", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -2399,18 +2291,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2418,4 +2306,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260306002941_perfect_ares/migration.sql b/packages/db/drizzle/20260306002941_perfect_ares/migration.sql similarity index 100% rename from drizzle/20260306002941_perfect_ares/migration.sql rename to packages/db/drizzle/20260306002941_perfect_ares/migration.sql diff --git a/drizzle/20260306002941_perfect_ares/snapshot.json b/packages/db/drizzle/20260306002941_perfect_ares/snapshot.json similarity index 95% rename from drizzle/20260306002941_perfect_ares/snapshot.json rename to packages/db/drizzle/20260306002941_perfect_ares/snapshot.json index 6ca1b57..188e01e 100644 --- a/drizzle/20260306002941_perfect_ares/snapshot.json +++ b/packages/db/drizzle/20260306002941_perfect_ares/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "fe84d00b-6419-4b83-bd76-29b1854ed9a1", - "prevIds": [ - "662445d8-e2df-4ae9-8019-89785f2fd5bc" - ], + "prevIds": ["662445d8-e2df-4ae9-8019-89785f2fd5bc"], "ddl": [ { "name": "account", @@ -1621,13 +1619,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1636,13 +1630,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1651,13 +1641,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1666,13 +1652,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1681,13 +1663,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1696,13 +1674,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1711,13 +1685,9 @@ "table": "titleCast" }, { - "columns": [ - "personId" - ], + "columns": ["personId"], "tableTo": "persons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1726,13 +1696,9 @@ "table": "titleCast" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1741,13 +1707,9 @@ "table": "titleGenres" }, { - "columns": [ - "genreId" - ], + "columns": ["genreId"], "tableTo": "genres", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1756,13 +1718,9 @@ "table": "titleGenres" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1771,13 +1729,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1786,13 +1740,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1801,13 +1751,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1816,13 +1762,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1831,13 +1773,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1846,13 +1784,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1861,13 +1795,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1876,13 +1806,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1891,13 +1817,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1906,13 +1828,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1921,13 +1839,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1936,144 +1850,112 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "genres_pk", "table": "genres", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "persons_pk", "table": "persons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titleCast_pk", "table": "titleCast", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -2554,18 +2436,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2573,4 +2451,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260306005525_fresh_loners/migration.sql b/packages/db/drizzle/20260306005525_fresh_loners/migration.sql similarity index 100% rename from drizzle/20260306005525_fresh_loners/migration.sql rename to packages/db/drizzle/20260306005525_fresh_loners/migration.sql diff --git a/drizzle/20260306005525_fresh_loners/snapshot.json b/packages/db/drizzle/20260306005525_fresh_loners/snapshot.json similarity index 95% rename from drizzle/20260306005525_fresh_loners/snapshot.json rename to packages/db/drizzle/20260306005525_fresh_loners/snapshot.json index 04a695d..ee1b82b 100644 --- a/drizzle/20260306005525_fresh_loners/snapshot.json +++ b/packages/db/drizzle/20260306005525_fresh_loners/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "bb5f768e-3a10-451a-9b73-4b7f19dc13ee", - "prevIds": [ - "fe84d00b-6419-4b83-bd76-29b1854ed9a1" - ], + "prevIds": ["fe84d00b-6419-4b83-bd76-29b1854ed9a1"], "ddl": [ { "name": "account", @@ -1631,13 +1629,9 @@ "table": "webhookEventLog" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1646,13 +1640,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1661,13 +1651,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1676,13 +1662,9 @@ "table": "episodes" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1691,13 +1673,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1706,13 +1684,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1721,13 +1695,9 @@ "table": "titleCast" }, { - "columns": [ - "personId" - ], + "columns": ["personId"], "tableTo": "persons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1736,13 +1706,9 @@ "table": "titleCast" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1751,13 +1717,9 @@ "table": "titleGenres" }, { - "columns": [ - "genreId" - ], + "columns": ["genreId"], "tableTo": "genres", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1766,13 +1728,9 @@ "table": "titleGenres" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1781,13 +1739,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1796,13 +1750,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1811,13 +1761,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1826,13 +1772,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1841,13 +1783,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1856,13 +1794,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1871,13 +1805,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1886,13 +1816,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1901,13 +1827,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1916,13 +1838,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1931,13 +1849,9 @@ "table": "webhookConnections" }, { - "columns": [ - "connectionId" - ], + "columns": ["connectionId"], "tableTo": "webhookConnections", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1946,144 +1860,112 @@ "table": "webhookEventLog" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "genres_pk", "table": "genres", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "persons_pk", "table": "persons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titleCast_pk", "table": "titleCast", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookConnections_pk", "table": "webhookConnections", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "webhookEventLog_pk", "table": "webhookEventLog", @@ -2564,18 +2446,14 @@ "table": "webhookEventLog" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2583,4 +2461,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260306195724_zippy_gladiator/migration.sql b/packages/db/drizzle/20260306195724_zippy_gladiator/migration.sql similarity index 100% rename from drizzle/20260306195724_zippy_gladiator/migration.sql rename to packages/db/drizzle/20260306195724_zippy_gladiator/migration.sql diff --git a/drizzle/20260306195724_zippy_gladiator/snapshot.json b/packages/db/drizzle/20260306195724_zippy_gladiator/snapshot.json similarity index 95% rename from drizzle/20260306195724_zippy_gladiator/snapshot.json rename to packages/db/drizzle/20260306195724_zippy_gladiator/snapshot.json index a2aeccf..6aad903 100644 --- a/drizzle/20260306195724_zippy_gladiator/snapshot.json +++ b/packages/db/drizzle/20260306195724_zippy_gladiator/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "f3d5f958-f483-486b-aebd-d7ad6837ea93", - "prevIds": [ - "bb5f768e-3a10-451a-9b73-4b7f19dc13ee" - ], + "prevIds": ["bb5f768e-3a10-451a-9b73-4b7f19dc13ee"], "ddl": [ { "name": "account", @@ -1651,13 +1649,9 @@ "table": "verification" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1666,13 +1660,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1681,13 +1671,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1696,13 +1682,9 @@ "table": "episodes" }, { - "columns": [ - "integrationId" - ], + "columns": ["integrationId"], "tableTo": "integrations", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1711,13 +1693,9 @@ "table": "integrationEvents" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1726,13 +1704,9 @@ "table": "integrations" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1741,13 +1715,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1756,13 +1726,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1771,13 +1737,9 @@ "table": "titleCast" }, { - "columns": [ - "personId" - ], + "columns": ["personId"], "tableTo": "persons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1786,13 +1748,9 @@ "table": "titleCast" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1801,13 +1759,9 @@ "table": "titleGenres" }, { - "columns": [ - "genreId" - ], + "columns": ["genreId"], "tableTo": "genres", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1816,13 +1770,9 @@ "table": "titleGenres" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1831,13 +1781,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1846,13 +1792,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1861,13 +1803,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1876,13 +1814,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1891,13 +1825,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1906,13 +1836,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1921,13 +1847,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1936,13 +1858,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1951,13 +1869,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1966,144 +1880,112 @@ "table": "userTitleStatus" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "genres_pk", "table": "genres", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "integrationEvents_pk", "table": "integrationEvents", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "integrations_pk", "table": "integrations", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "persons_pk", "table": "persons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titleCast_pk", "table": "titleCast", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", @@ -2584,18 +2466,14 @@ "table": "userTitleStatus" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2603,4 +2481,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/drizzle/20260306204637_rare_northstar/migration.sql b/packages/db/drizzle/20260306204637_rare_northstar/migration.sql similarity index 100% rename from drizzle/20260306204637_rare_northstar/migration.sql rename to packages/db/drizzle/20260306204637_rare_northstar/migration.sql diff --git a/drizzle/20260306204637_rare_northstar/snapshot.json b/packages/db/drizzle/20260306204637_rare_northstar/snapshot.json similarity index 95% rename from drizzle/20260306204637_rare_northstar/snapshot.json rename to packages/db/drizzle/20260306204637_rare_northstar/snapshot.json index 7e2c0d2..fba00d2 100644 --- a/drizzle/20260306204637_rare_northstar/snapshot.json +++ b/packages/db/drizzle/20260306204637_rare_northstar/snapshot.json @@ -2,9 +2,7 @@ "version": "7", "dialect": "sqlite", "id": "a55f858c-6739-4c19-98f2-2c685741ff65", - "prevIds": [ - "f3d5f958-f483-486b-aebd-d7ad6837ea93" - ], + "prevIds": ["f3d5f958-f483-486b-aebd-d7ad6837ea93"], "ddl": [ { "name": "account", @@ -1651,13 +1649,9 @@ "table": "verification" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1666,13 +1660,9 @@ "table": "account" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1681,13 +1671,9 @@ "table": "availabilityOffers" }, { - "columns": [ - "seasonId" - ], + "columns": ["seasonId"], "tableTo": "seasons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1696,13 +1682,9 @@ "table": "episodes" }, { - "columns": [ - "integrationId" - ], + "columns": ["integrationId"], "tableTo": "integrations", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1711,13 +1693,9 @@ "table": "integrationEvents" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1726,13 +1704,9 @@ "table": "integrations" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1741,13 +1715,9 @@ "table": "seasons" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1756,13 +1726,9 @@ "table": "session" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1771,13 +1737,9 @@ "table": "titleCast" }, { - "columns": [ - "personId" - ], + "columns": ["personId"], "tableTo": "persons", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1786,13 +1748,9 @@ "table": "titleCast" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1801,13 +1759,9 @@ "table": "titleGenres" }, { - "columns": [ - "genreId" - ], + "columns": ["genreId"], "tableTo": "genres", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1816,13 +1770,9 @@ "table": "titleGenres" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1831,13 +1781,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "recommendedTitleId" - ], + "columns": ["recommendedTitleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1846,13 +1792,9 @@ "table": "titleRecommendations" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1861,13 +1803,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "episodeId" - ], + "columns": ["episodeId"], "tableTo": "episodes", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1876,13 +1814,9 @@ "table": "userEpisodeWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1891,13 +1825,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1906,13 +1836,9 @@ "table": "userMovieWatches" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1921,13 +1847,9 @@ "table": "userRatings" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1936,13 +1858,9 @@ "table": "userRatings" }, { - "columns": [ - "userId" - ], + "columns": ["userId"], "tableTo": "user", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1951,13 +1869,9 @@ "table": "userTitleStatus" }, { - "columns": [ - "titleId" - ], + "columns": ["titleId"], "tableTo": "titles", - "columnsTo": [ - "id" - ], + "columnsTo": ["id"], "onUpdate": "NO ACTION", "onDelete": "CASCADE", "nameExplicit": false, @@ -1966,144 +1880,112 @@ "table": "userTitleStatus" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "account_pk", "table": "account", "entityType": "pks" }, { - "columns": [ - "key" - ], + "columns": ["key"], "nameExplicit": false, "name": "appSettings_pk", "table": "appSettings", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "cronRuns_pk", "table": "cronRuns", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "episodes_pk", "table": "episodes", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "genres_pk", "table": "genres", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "integrationEvents_pk", "table": "integrationEvents", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "integrations_pk", "table": "integrations", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "persons_pk", "table": "persons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "seasons_pk", "table": "seasons", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "session_pk", "table": "session", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titleCast_pk", "table": "titleCast", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "titles_pk", "table": "titles", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "user_pk", "table": "user", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userEpisodeWatches_pk", "table": "userEpisodeWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "userMovieWatches_pk", "table": "userMovieWatches", "entityType": "pks" }, { - "columns": [ - "id" - ], + "columns": ["id"], "nameExplicit": false, "name": "verification_pk", "table": "verification", @@ -2638,18 +2520,14 @@ "table": "userTitleStatus" }, { - "columns": [ - "token" - ], + "columns": ["token"], "nameExplicit": false, "name": "session_token_unique", "entityType": "uniques", "table": "session" }, { - "columns": [ - "email" - ], + "columns": ["email"], "nameExplicit": false, "name": "user_email_unique", "entityType": "uniques", @@ -2657,4 +2535,4 @@ } ], "renames": [] -} \ No newline at end of file +} diff --git a/packages/db/package.json b/packages/db/package.json new file mode 100644 index 0000000..06b8fd3 --- /dev/null +++ b/packages/db/package.json @@ -0,0 +1,32 @@ +{ + "name": "@sofa/db", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + "./client": "./src/client.ts", + "./schema": "./src/schema.ts", + "./helpers": "./src/helpers.ts", + "./migrate": "./src/migrate.ts", + "./test-utils": "./src/test-utils.ts" + }, + "scripts": { + "lint": "biome check", + "format": "biome format --write", + "check-types": "tsc --noEmit", + "db:generate": "bun --bun drizzle-kit generate", + "db:migrate": "bun --bun drizzle-kit migrate", + "db:push": "bun --bun drizzle-kit push", + "db:studio": "bun --bun drizzle-kit studio" + }, + "dependencies": { + "@sofa/config": "workspace:*", + "@sofa/logger": "workspace:*", + "drizzle-orm": "1.0.0-beta.16-ea816b6" + }, + "devDependencies": { + "@types/bun": "catalog:", + "drizzle-kit": "1.0.0-beta.16-ea816b6", + "typescript": "catalog:" + } +} diff --git a/lib/db/client.ts b/packages/db/src/client.ts similarity index 95% rename from lib/db/client.ts rename to packages/db/src/client.ts index 4d9cbc4..24f91d6 100644 --- a/lib/db/client.ts +++ b/packages/db/src/client.ts @@ -1,8 +1,8 @@ import { Database } from "bun:sqlite"; +import { DATABASE_URL } from "@sofa/config"; +import { createLogger } from "@sofa/logger"; import type { Logger } from "drizzle-orm"; import { drizzle } from "drizzle-orm/bun-sqlite"; -import { DATABASE_URL } from "@/lib/constants"; -import { createLogger } from "@/lib/logger"; import * as schema from "./schema"; const log = createLogger("drizzle"); diff --git a/packages/db/src/helpers.ts b/packages/db/src/helpers.ts new file mode 100644 index 0000000..df732ce --- /dev/null +++ b/packages/db/src/helpers.ts @@ -0,0 +1,12 @@ +export { + and, + count, + desc, + eq, + gte, + inArray, + isNotNull, + lt, + or, + sql, +} from "drizzle-orm"; diff --git a/lib/db/migrate.ts b/packages/db/src/migrate.ts similarity index 50% rename from lib/db/migrate.ts rename to packages/db/src/migrate.ts index 00c898f..aa74e5b 100644 --- a/lib/db/migrate.ts +++ b/packages/db/src/migrate.ts @@ -1,11 +1,14 @@ +import path from "node:path"; +import { createLogger } from "@sofa/logger"; import { migrate } from "drizzle-orm/bun-sqlite/migrator"; -import { createLogger } from "@/lib/logger"; import { db } from "./client"; const log = createLogger("db"); -export function runMigrations() { +export function runMigrations( + migrationsFolder = path.join(import.meta.dir, "../drizzle"), +) { log.info("Running database migrations..."); - migrate(db, { migrationsFolder: "./drizzle" }); + migrate(db, { migrationsFolder }); log.info("Database migrations complete"); } diff --git a/lib/db/schema.ts b/packages/db/src/schema.ts similarity index 100% rename from lib/db/schema.ts rename to packages/db/src/schema.ts diff --git a/test/sqlite.ts b/packages/db/src/test-utils.ts similarity index 97% rename from test/sqlite.ts rename to packages/db/src/test-utils.ts index 151fb25..3c4edef 100644 --- a/test/sqlite.ts +++ b/packages/db/src/test-utils.ts @@ -1,7 +1,7 @@ import { Database } from "bun:sqlite"; import { drizzle } from "drizzle-orm/bun-sqlite"; import { migrate } from "drizzle-orm/bun-sqlite/migrator"; -import * as schema from "@/lib/db/schema"; +import * as schema from "./schema"; const { user, @@ -22,7 +22,8 @@ testClient.run("PRAGMA foreign_keys = ON"); export const testDb = drizzle({ client: testClient, schema }); export function applyMigrations() { - migrate(testDb, { migrationsFolder: "./drizzle" }); + const migrationsFolder = `${import.meta.dir}/../drizzle`; + migrate(testDb, { migrationsFolder }); } export function clearAllTables() { diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json new file mode 100644 index 0000000..6438538 --- /dev/null +++ b/packages/db/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true, + "types": ["bun"] + }, + "include": ["src"] +} diff --git a/packages/logger/package.json b/packages/logger/package.json new file mode 100644 index 0000000..9a381db --- /dev/null +++ b/packages/logger/package.json @@ -0,0 +1,17 @@ +{ + "name": "@sofa/logger", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + ".": "./src/index.ts" + }, + "dependencies": { + "pino": "10.3.1", + "pino-pretty": "13.1.3" + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:" + } +} diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts new file mode 100644 index 0000000..c4e677c --- /dev/null +++ b/packages/logger/src/index.ts @@ -0,0 +1,64 @@ +import pino from "pino"; + +const VALID_LEVELS = ["fatal", "error", "warn", "info", "debug", "trace"]; + +const envLevel = process.env.LOG_LEVEL?.toLowerCase() ?? "info"; +const level = VALID_LEVELS.includes(envLevel) ? envLevel : "info"; + +const isDev = process.env.NODE_ENV !== "production"; + +export const rootLogger = pino({ + level, + base: undefined, + timestamp: pino.stdTimeFunctions.isoTime, + ...(isDev && { + transport: { + target: "pino-pretty", + options: { + colorize: true, + translateTime: "SYS:HH:MM:ss.l", + ignore: "pid,hostname", + messageFormat: "[{module}] {msg}", + }, + }, + }), +}); + +export interface Logger { + error(msg: string, ...args: unknown[]): void; + warn(msg: string, ...args: unknown[]): void; + info(msg: string, ...args: unknown[]): void; + debug(msg: string, ...args: unknown[]): void; +} + +function wrapLevel( + child: pino.Logger, + lvl: "error" | "warn" | "info" | "debug", +) { + return (msg: string, ...args: unknown[]) => { + if (args.length === 0) { + child[lvl](msg); + } else if (args.length === 1 && args[0] instanceof Error) { + child[lvl]({ err: args[0] }, msg); + } else if ( + args.length === 1 && + typeof args[0] === "object" && + args[0] !== null && + !Array.isArray(args[0]) + ) { + child[lvl](args[0] as object, msg); + } else { + child[lvl]({ extra: args }, msg); + } + }; +} + +export function createLogger(name: string): Logger { + const child = rootLogger.child({ module: name }); + return { + error: wrapLevel(child, "error"), + warn: wrapLevel(child, "warn"), + info: wrapLevel(child, "info"), + debug: wrapLevel(child, "debug"), + }; +} diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json new file mode 100644 index 0000000..6438538 --- /dev/null +++ b/packages/logger/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true, + "types": ["bun"] + }, + "include": ["src"] +} diff --git a/packages/tmdb/package.json b/packages/tmdb/package.json new file mode 100644 index 0000000..98382d8 --- /dev/null +++ b/packages/tmdb/package.json @@ -0,0 +1,26 @@ +{ + "name": "@sofa/tmdb", + "version": "0.1.0", + "private": true, + "type": "module", + "exports": { + "./client": "./src/client.ts", + "./image": "./src/image.ts", + "./config": "./src/config.ts" + }, + "scripts": { + "lint": "biome check", + "format": "biome format --write", + "check-types": "tsc --noEmit", + "generate-schema": "bunx openapi-typescript https://developer.themoviedb.org/openapi/tmdb-api.json -o ./src/schema.d.ts" + }, + "dependencies": { + "@sofa/db": "workspace:*", + "@sofa/logger": "workspace:*", + "openapi-fetch": "0.17.0" + }, + "devDependencies": { + "@types/bun": "catalog:", + "typescript": "catalog:" + } +} diff --git a/lib/tmdb/client.ts b/packages/tmdb/src/client.ts similarity index 96% rename from lib/tmdb/client.ts rename to packages/tmdb/src/client.ts index 3510ebb..0020f50 100644 --- a/lib/tmdb/client.ts +++ b/packages/tmdb/src/client.ts @@ -1,5 +1,5 @@ +import { createLogger } from "@sofa/logger"; import createClient, { type Middleware } from "openapi-fetch"; -import { createLogger } from "@/lib/logger"; import type { operations, paths } from "./schema"; const log = createLogger("tmdb"); @@ -132,7 +132,7 @@ const baseUrlRewriteMiddleware: Middleware | null = isCustomBase // go to e.g. https://tmdb.internal/search/multi instead of /3/search/multi const url = new URL(request.url); url.pathname = url.pathname.replace(/^\/3\//, "/"); - return new Request(url, request); + return new Request(url.toString(), request); }, } : null; @@ -170,14 +170,6 @@ const client = createClient({ baseUrl }); if (baseUrlRewriteMiddleware) client.use(baseUrlRewriteMiddleware); client.use(authMiddleware, loggingMiddleware); -/** Helper: pass Next.js revalidate option through to fetch */ -function revalidateFetch(seconds: number) { - return (req: Request) => - globalThis.fetch(req, { - next: { revalidate: seconds }, - } as RequestInit); -} - // ─── Search ───────────────────────────────────────────────────────── export async function searchMulti(query: string, page = 1) { @@ -314,7 +306,6 @@ export async function getTrending( ) { const opts = { params: { path: { time_window: timeWindow } }, - fetch: revalidateFetch(3600), } as const; if (mediaType === "movie") { @@ -345,14 +336,12 @@ export async function getPopular(type: "movie" | "tv", page = 1) { if (type === "movie") { const { data, error } = await client.GET("/3/movie/popular", { params: { query: { page } }, - fetch: revalidateFetch(3600), }); if (error) throw new Error("TMDB API error: movie/popular"); return data; } const { data, error } = await client.GET("/3/tv/popular", { params: { query: { page } }, - fetch: revalidateFetch(3600), }); if (error) throw new Error("TMDB API error: tv/popular"); return data; @@ -362,15 +351,11 @@ export async function getPopular(type: "movie" | "tv", page = 1) { export async function getGenres(type: "movie" | "tv") { if (type === "movie") { - const { data, error } = await client.GET("/3/genre/movie/list", { - fetch: revalidateFetch(86400), - }); + const { data, error } = await client.GET("/3/genre/movie/list", {}); if (error) throw new Error("TMDB API error: genre/movie/list"); return data; } - const { data, error } = await client.GET("/3/genre/tv/list", { - fetch: revalidateFetch(86400), - }); + const { data, error } = await client.GET("/3/genre/tv/list", {}); if (error) throw new Error("TMDB API error: genre/tv/list"); return data; } @@ -387,14 +372,12 @@ export async function discover( if (type === "movie") { const { data, error } = await client.GET("/3/discover/movie", { params: { query: { ...params, page } as Record }, - fetch: revalidateFetch(3600), }); if (error) throw new Error("TMDB API error: discover/movie"); return data; } const { data, error } = await client.GET("/3/discover/tv", { params: { query: { ...params, page } as Record }, - fetch: revalidateFetch(3600), }); if (error) throw new Error("TMDB API error: discover/tv"); return data; diff --git a/packages/tmdb/src/config.ts b/packages/tmdb/src/config.ts new file mode 100644 index 0000000..84a34d4 --- /dev/null +++ b/packages/tmdb/src/config.ts @@ -0,0 +1,8 @@ +/** + * Server-side configuration checks. + * Call these in route handlers or server components — never on the client. + */ + +export function isTmdbConfigured(): boolean { + return !!process.env.TMDB_API_READ_ACCESS_TOKEN?.trim(); +} diff --git a/lib/tmdb/image.ts b/packages/tmdb/src/image.ts similarity index 81% rename from lib/tmdb/image.ts rename to packages/tmdb/src/image.ts index a4c2729..9eef610 100644 --- a/lib/tmdb/image.ts +++ b/packages/tmdb/src/image.ts @@ -1,4 +1,9 @@ -import type { ImageCategory } from "@/lib/services/image-cache"; +export type ImageCategory = + | "posters" + | "backdrops" + | "stills" + | "logos" + | "profiles"; const IMAGE_BASE_URL = process.env.TMDB_IMAGE_BASE_URL || "https://image.tmdb.org/t/p"; @@ -25,5 +30,5 @@ export function tmdbImageUrl( } const filename = path.startsWith("/") ? path.slice(1) : path; - return `/api/images/${category}/${filename}`; + return `/images/${category}/${filename}`; } diff --git a/packages/tmdb/src/schema.d.ts b/packages/tmdb/src/schema.d.ts new file mode 100644 index 0000000..493490b --- /dev/null +++ b/packages/tmdb/src/schema.d.ts @@ -0,0 +1,22844 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/3/authentication": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Validate Key + * @description Test your API Key to see if it's valid. + */ + get: operations["authentication-validate-key"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the public details of an account on TMDB. + */ + get: operations["account-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/favorite": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Favorite + * @description Mark a movie or TV show as a favourite. + */ + post: operations["account-add-favorite"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/watchlist": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add To Watchlist + * @description Add a movie or TV show to your watchlist. + */ + post: operations["account-add-to-watchlist"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/favorite/movies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Favorite Movies + * @description Get a users list of favourite movies. + */ + get: operations["account-get-favorites"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/favorite/tv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Favorite TV + * @description Get a users list of favourite TV shows. + */ + get: operations["account-favorite-tv"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/lists": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists + * @description Get a users list of custom lists. + */ + get: operations["account-lists"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/rated/movies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated Movies + * @description Get a users list of rated movies. + */ + get: operations["account-rated-movies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/rated/tv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV + * @description Get a users list of rated TV shows. + */ + get: operations["account-rated-tv"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/rated/tv/episodes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV Episodes + * @description Get a users list of rated TV episodes. + */ + get: operations["account-rated-tv-episodes"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/watchlist/movies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watchlist Movies + * @description Get a list of movies added to a users watchlist. + */ + get: operations["account-watchlist-movies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/account/{account_id}/watchlist/tv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watchlist TV + * @description Get a list of TV shows added to a users watchlist. + */ + get: operations["account-watchlist-tv"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/authentication/guest_session/new": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Create Guest Session */ + get: operations["authentication-create-guest-session"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/authentication/token/new": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Create Request Token */ + get: operations["authentication-create-request-token"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/authentication/session/new": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Session */ + post: operations["authentication-create-session"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/authentication/session/convert/4": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create Session (from v4 token) */ + post: operations["authentication-create-session-from-v4-token"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/authentication/token/validate_with_login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create Session (with login) + * @description This method allows an application to validate a request token by entering a username and password. + */ + post: operations["authentication-create-session-from-login"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/authentication/session": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Delete Session */ + delete: operations["authentication-delete-session"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/certification/movie/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie Certifications + * @description Get an up to date list of the officially supported movie certifications on TMDB. + */ + get: operations["certification-movie-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/certification/tv/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** TV Certifications */ + get: operations["certifications-tv-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie List + * @description Get a list of all of the movie ids that have been changed in the past 24 hours. + */ + get: operations["changes-movie-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** People List */ + get: operations["changes-people-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** TV List */ + get: operations["changes-tv-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/collection/{collection_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get collection details by ID. + */ + get: operations["collection-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/collection/{collection_id}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a collection. + */ + get: operations["collection-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/collection/{collection_id}/translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Translations */ + get: operations["collection-translations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/company/{company_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the company details by ID. + */ + get: operations["company-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/company/{company_id}/alternative_names": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Names + * @description Get the company details by ID. + */ + get: operations["company-alternative-names"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/company/{company_id}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the company logos by id. + */ + get: operations["company-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/configuration": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the API configuration details. + */ + get: operations["configuration-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/configuration/countries": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Countries + * @description Get the list of countries (ISO 3166-1 tags) used throughout TMDB. + */ + get: operations["configuration-countries"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/configuration/jobs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Jobs + * @description Get the list of the jobs and departments we use on TMDB. + */ + get: operations["configuration-jobs"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/configuration/languages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Languages + * @description Get the list of languages (ISO 639-1 tags) used throughout TMDB. + */ + get: operations["configuration-languages"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/configuration/primary_translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Primary Translations + * @description Get a list of the officially supported translations on TMDB. + */ + get: operations["configuration-primary-translations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/configuration/timezones": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Timezones + * @description Get the list of timezones used throughout TMDB. + */ + get: operations["configuration-timezones"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/credit/{credit_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get a movie or TV credit details by ID. + */ + get: operations["credit-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/discover/movie": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie + * @description Find movies using over 30 filters and sort options. + */ + get: operations["discover-movie"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/discover/tv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV + * @description Find TV shows using over 30 filters and sort options. + */ + get: operations["discover-tv"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/find/{external_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Find By ID + * @description Find data by external ID's. + */ + get: operations["find-by-id"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/genre/movie/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie List + * @description Get the list of official genres for movies. + */ + get: operations["genre-movie-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/genre/tv/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV List + * @description Get the list of official genres for TV shows. + */ + get: operations["genre-tv-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/guest_session/{guest_session_id}/rated/movies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated Movies + * @description Get the rated movies for a guest session. + */ + get: operations["guest-session-rated-movies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/guest_session/{guest_session_id}/rated/tv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV + * @description Get the rated TV shows for a guest session. + */ + get: operations["guest-session-rated-tv"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/guest_session/{guest_session_id}/rated/tv/episodes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Rated TV Episodes + * @description Get the rated TV episodes for a guest session. + */ + get: operations["guest-session-rated-tv-episodes"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/keyword/{keyword_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Details */ + get: operations["keyword-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/keyword/{keyword_id}/movies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Movies */ + get: operations["keyword-movies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/list/{list_id}/add_item": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Movie + * @description Add a movie to a list. + */ + post: operations["list-add-movie"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/list/{list_id}/item_status": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Check Item Status + * @description Use this method to check if an item has already been added to the list. + */ + get: operations["list-check-item-status"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/list/{list_id}/clear": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Clear + * @description Clear all items from a list. + */ + post: operations["list-clear"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create */ + post: operations["list-create"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/list/{list_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Details */ + get: operations["list-details"]; + put?: never; + post?: never; + /** + * Delete + * @description Delete a list. + */ + delete: operations["list-delete"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/list/{list_id}/remove_item": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Remove Movie + * @description Remove a movie from a list. + */ + post: operations["list-remove-movie"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/now_playing": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Now Playing + * @description Get a list of movies that are currently in theatres. + */ + get: operations["movie-now-playing-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/popular": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Popular + * @description Get a list of movies ordered by popularity. + */ + get: operations["movie-popular-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/top_rated": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Top Rated + * @description Get a list of movies ordered by rating. + */ + get: operations["movie-top-rated-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/upcoming": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Upcoming + * @description Get a list of movies that are being released soon. + */ + get: operations["movie-upcoming-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the top level details of a movie by ID. + */ + get: operations["movie-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/account_states": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status of an account. + */ + get: operations["movie-account-states"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/alternative_titles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Titles + * @description Get the alternative titles for a movie. + */ + get: operations["movie-alternative-titles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a movie. + */ + get: operations["movie-changes"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Credits */ + get: operations["movie-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/external_ids": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** External IDs */ + get: operations["movie-external-ids"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a movie. + */ + get: operations["movie-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/keywords": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Keywords */ + get: operations["movie-keywords"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/latest": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Latest + * @description Get the newest movie ID. + */ + get: operations["movie-latest-id"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/lists": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists + * @description Get the lists that a movie has been added to. + */ + get: operations["movie-lists"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/recommendations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Recommendations */ + get: operations["movie-recommendations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/release_dates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Release Dates + * @description Get the release dates and certifications for a movie. + */ + get: operations["movie-release-dates"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/reviews": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Reviews + * @description Get the user reviews for a movie. + */ + get: operations["movie-reviews"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/similar": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Similar + * @description Get the similar movies based on genres and keywords. + */ + get: operations["movie-similar"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations for a movie. + */ + get: operations["movie-translations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/videos": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Videos */ + get: operations["movie-videos"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/watch/providers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watch Providers + * @description Get the list of streaming providers we have for a movie. + */ + get: operations["movie-watch-providers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/movie/{movie_id}/rating": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Rating + * @description Rate a movie and save it to your rated list. + */ + post: operations["movie-add-rating"]; + /** + * Delete Rating + * @description Delete a user rating. + */ + delete: operations["movie-delete-rating"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/network/{network_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Details */ + get: operations["network-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/network/{network_id}/alternative_names": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Names + * @description Get the alternative names of a network. + */ + get: operations["details-copy"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/network/{network_id}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the TV network logos by id. + */ + get: operations["alternative-names-copy"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/popular": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Popular + * @description Get a list of people ordered by popularity. + */ + get: operations["person-popular-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the top level details of a person. + */ + get: operations["person-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a person. + */ + get: operations["person-changes"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/combined_credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Combined Credits + * @description Get the combined movie and TV credits that belong to a person. + */ + get: operations["person-combined-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/external_ids": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get the external ID's that belong to a person. + */ + get: operations["person-external-ids"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the profile images that belong to a person. + */ + get: operations["person-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/latest": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Latest + * @description Get the newest created person. This is a live response and will continuously change. + */ + get: operations["person-latest-id"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/movie_credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie Credits + * @description Get the movie credits for a person. + */ + get: operations["person-movie-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/tv_credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV Credits + * @description Get the TV credits that belong to a person. + */ + get: operations["person-tv-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/tagged_images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Tagged Images + * @description Get the tagged images for a person. + */ + get: operations["person-tagged-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/person/{person_id}/translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations that belong to a person. + */ + get: operations["translations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/review/{review_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Retrieve the details of a movie or TV show review. + */ + get: operations["review-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/search/collection": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Collection + * @description Search for collections by their original, translated and alternative names. + */ + get: operations["search-collection"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/search/company": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Company + * @description Search for companies by their original and alternative names. + */ + get: operations["search-company"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/search/keyword": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Keyword + * @description Search for keywords by their name. + */ + get: operations["search-keyword"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/search/movie": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie + * @description Search for movies by their original, translated and alternative titles. + */ + get: operations["search-movie"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/search/multi": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Multi + * @description Use multi search when you want to search for movies, TV shows and people in a single request. + */ + get: operations["search-multi"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/search/person": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Person + * @description Search for people by their name and also known as names. + */ + get: operations["search-person"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/search/tv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV + * @description Search for TV shows by their original, translated and also known as names. + */ + get: operations["search-tv"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/trending/all/{time_window}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * All + * @description Get the trending movies, TV shows and people. + */ + get: operations["trending-all"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/trending/movie/{time_window}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movies + * @description Get the trending movies on TMDB. + */ + get: operations["trending-movies"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/trending/person/{time_window}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * People + * @description Get the trending people on TMDB. + */ + get: operations["trending-people"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/trending/tv/{time_window}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV + * @description Get the trending TV shows on TMDB. + */ + get: operations["trending-tv"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/airing_today": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Airing Today + * @description Get a list of TV shows airing today. + */ + get: operations["tv-series-airing-today-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/on_the_air": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * On The Air + * @description Get a list of TV shows that air in the next 7 days. + */ + get: operations["tv-series-on-the-air-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/popular": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Popular + * @description Get a list of TV shows ordered by popularity. + */ + get: operations["tv-series-popular-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/top_rated": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Top Rated + * @description Get a list of TV shows ordered by rating. + */ + get: operations["tv-series-top-rated-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the details of a TV show. + */ + get: operations["tv-series-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/account_states": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status. + */ + get: operations["tv-series-account-states"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/aggregate_credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Aggregate Credits + * @description Get the aggregate credits (cast and crew) that have been added to a TV show. + */ + get: operations["tv-series-aggregate-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/alternative_titles": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Alternative Titles + * @description Get the alternative titles that have been added to a TV show. + */ + get: operations["tv-series-alternative-titles"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a TV show. + */ + get: operations["tv-series-changes"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/content_ratings": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Content Ratings + * @description Get the content ratings that have been added to a TV show. + */ + get: operations["tv-series-content-ratings"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Credits + * @description Get the latest season credits of a TV show. + */ + get: operations["tv-series-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/episode_groups": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Episode Groups + * @description Get the episode groups that have been added to a TV show. + */ + get: operations["tv-series-episode-groups"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/external_ids": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get a list of external IDs that have been added to a TV show. + */ + get: operations["tv-series-external-ids"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a TV series. + */ + get: operations["tv-series-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/keywords": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Keywords + * @description Get a list of keywords that have been added to a TV show. + */ + get: operations["tv-series-keywords"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/latest": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Latest + * @description Get the newest TV show ID. + */ + get: operations["tv-series-latest-id"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/lists": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Lists + * @description Get the lists that a TV series has been added to. + */ + get: operations["lists-copy"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/recommendations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Recommendations */ + get: operations["tv-series-recommendations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/reviews": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Reviews + * @description Get the reviews that have been added to a TV show. + */ + get: operations["tv-series-reviews"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/screened_theatrically": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Screened Theatrically + * @description Get the seasons and episodes that have screened theatrically. + */ + get: operations["tv-series-screened-theatrically"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/similar": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Similar + * @description Get the similar TV shows. + */ + get: operations["tv-series-similar"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations that have been added to a TV show. + */ + get: operations["tv-series-translations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/videos": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Videos + * @description Get the videos that belong to a TV show. + */ + get: operations["tv-series-videos"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/watch/providers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watch Providers + * @description Get the list of streaming providers we have for a TV show. + */ + get: operations["tv-series-watch-providers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/rating": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Rating + * @description Rate a TV show and save it to your rated list. + */ + post: operations["tv-series-add-rating"]; + /** Delete Rating */ + delete: operations["tv-series-delete-rating"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the details of a TV season. + */ + get: operations["tv-season-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/account_states": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status. + */ + get: operations["tv-season-account-states"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/aggregate_credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Aggregate Credits + * @description Get the aggregate credits (cast and crew) that have been added to a TV season. + */ + get: operations["tv-season-aggregate-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/season/{season_id}/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a TV season. + */ + get: operations["tv-season-changes-by-id"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Credits */ + get: operations["tv-season-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/external_ids": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get a list of external IDs that have been added to a TV season. + */ + get: operations["tv-season-external-ids"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a TV season. + */ + get: operations["tv-season-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations for a TV season. + */ + get: operations["tv-season-translations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/videos": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Videos + * @description Get the videos that belong to a TV season. + */ + get: operations["tv-season-videos"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/watch/providers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Watch Providers + * @description Get the list of streaming providers we have for a TV season. + */ + get: operations["tv-season-watch-providers"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Query the details of a TV episode. + */ + get: operations["tv-episode-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/account_states": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Account States + * @description Get the rating, watchlist and favourite status. + */ + get: operations["tv-episode-account-states"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/episode/{episode_id}/changes": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Changes + * @description Get the recent changes for a TV episode. + */ + get: operations["tv-episode-changes-by-id"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/credits": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Credits */ + get: operations["tv-episode-credits"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/external_ids": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * External IDs + * @description Get a list of external IDs that have been added to a TV episode. + */ + get: operations["tv-episode-external-ids"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/images": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Images + * @description Get the images that belong to a TV episode. + */ + get: operations["tv-episode-images"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Translations + * @description Get the translations that have been added to a TV episode. + */ + get: operations["tv-episode-translations"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/videos": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Videos + * @description Get the videos that belong to a TV episode. + */ + get: operations["tv-episode-videos"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/{series_id}/season/{season_number}/episode/{episode_number}/rating": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Add Rating + * @description Rate a TV episode and save it to your rated list. + */ + post: operations["tv-episode-add-rating"]; + /** + * Delete Rating + * @description Delete your rating on a TV episode. + */ + delete: operations["tv-episode-delete-rating"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/tv/episode_group/{tv_episode_group_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Details + * @description Get the details of a TV episode group. + */ + get: operations["tv-episode-group-details"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/watch/providers/regions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Available Regions + * @description Get the list of the countries we have watch provider (OTT/streaming) data for. + */ + get: operations["watch-providers-available-regions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/watch/providers/movie": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Movie Providers + * @description Get the list of streaming providers we have for movies. + */ + get: operations["watch-providers-movie-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/3/watch/providers/tv": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * TV Providers + * @description Get the list of streaming providers we have for TV shows. + */ + get: operations["watch-provider-tv-list"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export interface operations { + "authentication-validate-key": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example true + */ + success: boolean; + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + /** @description 401 */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 7 + */ + status_code: number; + /** @example Invalid API key: You must be granted a valid key. */ + status_message?: string; + /** + * @default true + * @example false + */ + success: boolean; + }; + }; + }; + }; + }; + "account-details": { + parameters: { + query?: { + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + avatar?: { + gravatar?: { + /** @example c9e9fc152ee756a900db85757c29815d */ + hash?: string; + }; + tmdb?: { + /** @example /xy44UvpbTgzs9kWmp4C3fEaCl5h.png */ + avatar_path?: string; + }; + }; + /** + * @default 0 + * @example 548 + */ + id: number; + /** @example en */ + iso_639_1?: string; + /** @example CA */ + iso_3166_1?: string; + /** @example Travis Bell */ + name?: string; + /** + * @default true + * @example false + */ + include_adult: boolean; + /** @example travisbell */ + username?: string; + }; + }; + }; + }; + }; + "account-add-favorite": { + parameters: { + query?: { + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + "account-add-to-watchlist": { + parameters: { + query?: { + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + "account-get-favorites": { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /se5Hxz7PArQZOG3Nx2bpfOhLhtV.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 9806 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Incredibles */ + original_title?: string; + /** @example Bob Parr has given up his superhero days to log in time as an insurance adjuster and raise his three children with his formerly heroic wife in suburbia. But when he receives a mysterious assignment, it's time to get back into costume. */ + overview?: string; + /** + * @default 0 + * @example 71.477 + */ + popularity: number; + /** @example /2LqaLgk4Z226KkgPJuiOQ58wvrm.jpg */ + poster_path?: string; + /** @example 2004-10-27 */ + release_date?: string; + /** @example The Incredibles */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.702 + */ + vote_average: number; + /** + * @default 0 + * @example 16162 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 4 + */ + total_pages: number; + /** + * @default 0 + * @example 80 + */ + total_results: number; + }; + }; + }; + }; + }; + "account-favorite-tv": { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1396 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Breaking Bad */ + original_name?: string; + /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ + overview?: string; + /** + * @default 0 + * @example 292.904 + */ + popularity: number; + /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ + poster_path?: string; + /** @example 2008-01-20 */ + first_air_date?: string; + /** @example Breaking Bad */ + name?: string; + /** + * @default 0 + * @example 8.878 + */ + vote_average: number; + /** + * @default 0 + * @example 11548 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 4 + */ + total_pages: number; + /** + * @default 0 + * @example 68 + */ + total_results: number; + }; + }; + }; + }; + }; + "account-lists": { + parameters: { + query?: { + page?: number; + session_id?: string; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** + * @default 0 + * @example 120174 + */ + id: number; + /** + * @default 0 + * @example 5 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example movie */ + list_type?: string; + /** @example Test Alpha Sort */ + name?: string; + poster_path?: unknown; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 25 + */ + total_results: number; + }; + }; + }; + }; + }; + "account-rated-movies": { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /dUVbWINfRMGojGZRcO6GF1Z2nV8.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 120 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Lord of the Rings: The Fellowship of the Ring */ + original_title?: string; + /** @example Young hobbit Frodo Baggins, after inheriting a mysterious ring from his uncle Bilbo, must leave his home in order to keep it from falling into the hands of its evil creator. Along the way, a fellowship is formed to protect the ringbearer and make sure that the ring arrives at its final destination: Mt. Doom, the only place where it can be destroyed. */ + overview?: string; + /** + * @default 0 + * @example 84.737 + */ + popularity: number; + /** @example /6oom5QYQ2yQTMJIbnvbkBL9cHo6.jpg */ + poster_path?: string; + /** @example 2001-12-18 */ + release_date?: string; + /** @example The Lord of the Rings: The Fellowship of the Ring */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.396 + */ + vote_average: number; + /** + * @default 0 + * @example 22579 + */ + vote_count: number; + /** + * @default 0 + * @example 8 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 47 + */ + total_pages: number; + /** + * @default 0 + * @example 940 + */ + total_results: number; + }; + }; + }; + }; + }; + "account-rated-tv": { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /2yZXtM2Kky1Sy0kachbDlwybl3y.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1705 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Fringe */ + original_name?: string; + /** @example FBI Special Agent Olivia Dunham, brilliant but formerly institutionalized scientist Walter Bishop and his scheming, reluctant son Peter uncover a deadly mystery involving a series of unbelievable events and realize they may be a part of a larger, more disturbing pattern that blurs the line between science fiction and technology. */ + overview?: string; + /** + * @default 0 + * @example 151.906 + */ + popularity: number; + /** @example /sY9hg5dLJ93RJOyKEiu1nAtBRND.jpg */ + poster_path?: string; + /** @example 2008-09-09 */ + first_air_date?: string; + /** @example Fringe */ + name?: string; + /** + * @default 0 + * @example 8.109 + */ + vote_average: number; + /** + * @default 0 + * @example 2050 + */ + vote_count: number; + /** + * @default 0 + * @example 9 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 15 + */ + total_pages: number; + /** + * @default 0 + * @example 290 + */ + total_results: number; + }; + }; + }; + }; + }; + "account-rated-tv-episodes": { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example 2013-10-17 */ + air_date?: string; + /** + * @default 0 + * @example 5 + */ + episode_number: number; + /** + * @default 0 + * @example 64782 + */ + id: number; + /** @example The Workplace Proximity */ + name?: string; + /** @example Amy starts working at Caltech which causes friction with Sheldon. Howard agrees with Sheldon who mentions this to Bernadette causing a big fight for the Wolowitzes. */ + overview?: string; + /** @example 4X5305 */ + production_code?: string; + /** + * @default 0 + * @example 22 + */ + runtime: number; + /** + * @default 0 + * @example 7 + */ + season_number: number; + /** + * @default 0 + * @example 1418 + */ + show_id: number; + /** @example /k8atjbd5gAsntuhbPnFpvnvo0qn.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.242 + */ + vote_average: number; + /** + * @default 0 + * @example 31 + */ + vote_count: number; + /** + * @default 0 + * @example 8 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 10 + */ + total_pages: number; + /** + * @default 0 + * @example 186 + */ + total_results: number; + }; + }; + }; + }; + }; + "account-watchlist-movies": { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /rgNzvSagnlc32TuMEBa529QFIig.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 76726 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Chronicle */ + original_title?: string; + /** @example Three high school students make an incredible discovery, leading to their developing uncanny powers beyond their understanding. As they learn to control their abilities and use them to their advantage, their lives start to spin out of control, and their darker sides begin to take over. */ + overview?: string; + /** + * @default 0 + * @example 37.148 + */ + popularity: number; + /** @example /xENglsVIIWEEhhB5lgpy33tGcKI.jpg */ + poster_path?: string; + /** @example 2012-02-01 */ + release_date?: string; + /** @example Chronicle */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.822 + */ + vote_average: number; + /** + * @default 0 + * @example 4741 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 34 + */ + total_pages: number; + /** + * @default 0 + * @example 677 + */ + total_results: number; + }; + }; + }; + }; + }; + "account-watchlist-tv": { + parameters: { + query?: { + language?: string; + page?: number; + session_id?: string; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + account_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /7phlGHRupo38EnuwmkAHdNUqov3.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 58932 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example The Crazy Ones */ + original_name?: string; + /** @example The Crazy Ones is an American situation comedy series created by David E. Kelley that stars Robin Williams and Sarah Michelle Gellar. The single-camera project premiered on CBS on September 26, 2013, as part of the 2013–14 American television season as a Thursday night 9 pm entry. Bill D'Elia, Dean Lorey, Jason Winer, John Montgomery and Mark Teitelbaum serve as executive producers for 20th Century Fox Television. */ + overview?: string; + /** + * @default 0 + * @example 8.939 + */ + popularity: number; + /** @example /s2e7hTrdmNUaJDf0yDP5b4AHvrD.jpg */ + poster_path?: string; + /** @example 2013-09-26 */ + first_air_date?: string; + /** @example The Crazy Ones */ + name?: string; + /** + * @default 0 + * @example 6.176 + */ + vote_average: number; + /** + * @default 0 + * @example 94 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 17 + */ + total_pages: number; + /** + * @default 0 + * @example 325 + */ + total_results: number; + }; + }; + }; + }; + }; + "authentication-create-guest-session": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 1ce82ec1223641636ad4a60b07de3581 */ + guest_session_id?: string; + /** @example 2016-08-27 16:26:40 UTC */ + expires_at?: string; + }; + }; + }; + }; + }; + "authentication-create-request-token": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 2016-08-26 17:04:39 UTC */ + expires_at?: string; + /** @example ff5c7eeb5a8870efe3cd7fc5c282cffd26800ecd */ + request_token?: string; + }; + }; + }; + }; + }; + "authentication-create-session": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 79191836ddaa0da3df76a5ffef6f07ad6ab0c641 */ + session_id?: string; + }; + }; + }; + }; + }; + "authentication-create-session-from-v4-token": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 2629f70fb498edc263a0adb99118ac41f0053e8c */ + session_id?: string; + }; + }; + }; + }; + }; + "authentication-create-session-from-login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example true + */ + success: boolean; + /** @example 2018-07-24 04:10:26 UTC */ + expires_at?: string; + /** @example 1531f1a558c8357ce8990cf887ff196e8f5402ec */ + request_token?: string; + }; + }; + }; + }; + }; + "authentication-delete-session": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example true + */ + success: boolean; + }; + }; + }; + }; + }; + "certification-movie-list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + certifications?: { + AU?: { + /** @example E */ + certification?: string; + /** @example Exempt from classification. Films that are exempt from classification must not contain contentious material (i.e. material that would ordinarily be rated M or higher). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + BG?: { + /** @example D */ + certification?: string; + /** @example Prohibited for persons under 16. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + BR?: { + /** @example 14 */ + certification?: string; + /** @example Not recommended for minors under fourteen. More violent material, stronger sex references and/or nudity. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + CA?: { + /** @example G */ + certification?: string; + /** @example All ages. */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + "CA-QC"?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + DE?: { + /** @example 12 */ + certification?: string; + /** @example Children 12 or older admitted, children between 6 and 11 only when accompanied by parent or a legal guardian. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + DK?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + ES?: { + /** @example A */ + certification?: string; + /** @example General admission. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + FI?: { + /** @example K-16 */ + certification?: string; + /** @example Over 16 years. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + FR?: { + /** @example TP */ + certification?: string; + /** @example Valid for all audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + GB?: { + /** @example 15 */ + certification?: string; + /** @example Only those over 15 years are admitted. Nobody younger than 15 can rent or buy a 15-rated VHS, DVD, Blu-ray Disc, UMD or game, or watch a film in the cinema with this rating. Films under this category can contain adult themes, hard drugs, frequent strong language and limited use of very strong language, strong violence and strong sex references, and nudity without graphic detail. Sexual activity may be portrayed but without any strong detail. Sexual violence may be shown if discreet and justified by context. */ + meaning?: string; + /** + * @default 0 + * @example 5 + */ + order: number; + }[]; + HU?: { + /** @example 6 */ + certification?: string; + /** @example Not recommended below age of 6. */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + IN?: { + /** @example U */ + certification?: string; + /** @example Unrestricted Public Exhibition throughout India, suitable for all age groups. Films under this category should not upset children over 4. Such films may contain educational, social or family-oriented themes. Films under this category may also contain fantasy violence and/or mild bad language. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IT?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + LT?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + MY?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + NL?: { + /** @example AL */ + certification?: string; + /** @example All ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + NO?: { + /** @example 6 */ + certification?: string; + /** @example 6 years (no restriction for children accompanied by an adult). */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + NZ?: { + /** @example G */ + certification?: string; + /** @example Suitable for general audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PH?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + PT?: { + /** @example Públicos */ + certification?: string; + /** @example For all the public (especially designed for children under 3 years of age). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + RU?: { + /** @example 6+ */ + certification?: string; + /** @example (For children above 6) – Unsuitable for children under 6. */ + meaning?: string; + /** + * @default 0 + * @example 2 + */ + order: number; + }[]; + SE?: { + /** @example 11 */ + certification?: string; + /** @example Children over the age of 7, who are accompanied by an adult, are admitted to films that have been passed for children from the age of 11. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + US?: { + /** @example R */ + certification?: string; + /** @example Under 17 requires accompanying parent or adult guardian 21 or older. The parent/guardian is required to stay with the child under 17 through the entire movie, even if the parent gives the child/teenager permission to see the film alone. These films may contain strong profanity, graphic sexuality, nudity, strong violence, horror, gore, and strong drug use. A movie rated R for profanity often has more severe or frequent language than the PG-13 rating would permit. An R-rated movie may have more blood, gore, drug use, nudity, or graphic sexuality than a PG-13 movie would admit. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + KR?: { + /** @example All */ + certification?: string; + /** @example Film suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + SK?: { + /** @example U */ + certification?: string; + /** @example General audience. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TH?: { + /** @example P */ + certification?: string; + /** @example Educational. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MX?: { + /** @example AA */ + certification?: string; + /** @example Informative-only rating: Understandable for children under 7 years. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ID?: { + /** @example SU */ + certification?: string; + /** @example All ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TR?: { + /** @example Genel İzleyici Kitlesi */ + certification?: string; + /** @example General audience. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + AR?: { + /** @example ATP */ + certification?: string; + /** @example For all public. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + GR?: { + /** @example K */ + certification?: string; + /** @example No restrictions. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TW?: { + /** @example 0+ */ + certification?: string; + /** @example Viewing is permitted for audiences of all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ZA?: { + /** @example A */ + certification?: string; + /** @example Suitable for all. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + SG?: { + /** @example G */ + certification?: string; + /** @example Suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IE?: { + /** @example G */ + certification?: string; + /** @example Suitable for children of school going age (note: children can be enrolled in school from the age of 4). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PR?: { + /** @example G */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + JP?: { + /** @example G */ + certification?: string; + /** @example General, suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + VI?: { + /** @example G */ + certification?: string; + /** @example All ages admitted. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + CH?: { + /** @example 0 */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IL?: { + /** @example All */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + HK?: { + /** @example I */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MO?: { + /** @example A */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + LV?: { + /** @example U */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + LU?: { + /** @example EA */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + }; + }; + }; + }; + }; + }; + "certifications-tv-list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + certifications?: { + AU?: { + /** @example P */ + certification?: string; + /** @example Programming is intended for younger children 2–11; commercial stations must show at least 30 minutes of P-rated content each weekday and weekends at all times. No advertisements may be shown during P-rated programs. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + BR?: { + /** @example 14 */ + certification?: string; + /** @example Content suitable for viewers over the age of 14. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + CA?: { + /** @example Exempt */ + certification?: string; + /** @example Shows which are exempt from ratings (such as news and sports programming) will not display an on-screen rating at all. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + "CA-QC"?: { + /** @example 18+ */ + certification?: string; + /** @example Only to be viewed by adults and may contain extreme violence and graphic sexual content. It is mostly used for 18+ movies and pornography. */ + meaning?: string; + /** + * @default 0 + * @example 5 + */ + order: number; + }[]; + DE?: { + /** @example 0 */ + certification?: string; + /** @example Can be aired at any time. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ES?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + FR?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + GB?: { + /** @example U */ + certification?: string; + /** @example The U symbol stands for Universal. A U film should be suitable for audiences aged four years and over. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + HU?: { + /** @example Unrated */ + certification?: string; + /** @example Without age restriction. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + KR?: { + /** @example Exempt */ + certification?: string; + /** @example This rating is only for knowledge based game shows; lifestyle shows; documentary shows; news; current topic discussion shows; education/culture shows; sports that excludes MMA or other violent sports; and other programs that Korea Communications Standards Commission recognizes. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + LT?: { + /** @example S */ + certification?: string; + /** @example Intended for adult viewers from the age of 18 (corresponding to the age-appropriate index N-18) and broadcast between 23 (11pm) and 6 (6am) hours; Limited to minors and intended for adult audiences. */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + NL?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + PH?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + PT?: { + /** @example 12AP */ + certification?: string; + /** @example Acompanhamento Parental (may not be suitable for children under 12, parental guidance advised). */ + meaning?: string; + /** + * @default 0 + * @example 3 + */ + order: number; + }[]; + RU?: { + /** @example 16+ */ + certification?: string; + /** @example Only teens the age of 16 or older can watch. */ + meaning?: string; + /** + * @default 0 + * @example 4 + */ + order: number; + }[]; + SK?: { + /** @example NR */ + certification?: string; + /** @example No rating information. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + TH?: { + /** @example ส */ + certification?: string; + /** @example Sor - Educational movies which the public should be encouraged to see. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + US?: { + /** @example TV-MA */ + certification?: string; + /** @example This program is specifically designed to be viewed by adults and therefore may be unsuitable for children under 17. */ + meaning?: string; + /** + * @default 0 + * @example 6 + */ + order: number; + }[]; + IT?: { + /** @example T */ + certification?: string; + /** @example All ages admitted. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + FI?: { + /** @example S */ + certification?: string; + /** @example Allowed at all times. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + MY?: { + /** @example U */ + certification?: string; + /** @example No age limit. Can be broadcast anytime. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + NZ?: { + /** @example G */ + certification?: string; + /** @example Approved for general viewing. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + NO?: { + /** @example A */ + certification?: string; + /** @example Allowed at all times. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + BG?: { + /** @example Unrated */ + certification?: string; + /** @example Can be viewed for each age. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MX?: { + /** @example AA */ + certification?: string; + /** @example Aimed at children (can be broadcast anytime). */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IN?: { + /** @example U */ + certification?: string; + /** @example Viewable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + DK?: { + /** @example A */ + certification?: string; + /** @example Suitable for a general audience. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + SE?: { + /** @example Btl */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ID?: { + /** @example SU */ + certification?: string; + /** @example Suitable for general audiences over the age of 2 years. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TR?: { + /** @example Genel İzleyici */ + certification?: string; + /** @example General audience. Suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + AR?: { + /** @example ATP */ + certification?: string; + /** @example Suitable for all audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PL?: { + /** @example 0 */ + certification?: string; + /** @example Positive or neutral view of the world, little to no violence, non-sexual love, and no sexual content. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + MA?: { + /** @example NR */ + certification?: string; + /** @example All audiences. */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + GR?: { + /** @example K */ + certification?: string; + /** @example Suitable for all ages. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + IL?: { + /** @example E */ + certification?: string; + /** @example Exempt from classification. This rating is usually applied to live broadcasts. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + TW?: { + /** @example 0+ */ + certification?: string; + /** @example Suitable for watching by general audiences. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + ZA?: { + /** @example All */ + certification?: string; + /** @example This is a programme/film that does not contain any obscenity, and is suitable for family viewing. A logo must be displayed in the corner of the screen for 30 seconds after each commercial break. */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + SG?: { + /** @example G */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + }[]; + PR?: { + /** @example NR */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + VI?: { + /** @example NR */ + certification?: string; + /** @example */ + meaning?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + }; + }; + }; + }; + }; + }; + "changes-movie-list": { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + /** + * @default 0 + * @example 1120293 + */ + id: number; + /** + * @default true + * @example false + */ + adult: boolean; + }[]; + /** + * @default 0 + * @example 3 + */ + page: number; + /** + * @default 0 + * @example 57 + */ + total_pages: number; + /** + * @default 0 + * @example 5700 + */ + total_results: number; + }; + }; + }; + }; + }; + "changes-people-list": { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + /** + * @default 0 + * @example 4037513 + */ + id: number; + /** + * @default true + * @example false + */ + adult: boolean; + }[]; + /** + * @default 0 + * @example 1 + */ + page: number; + /** + * @default 0 + * @example 53 + */ + total_pages: number; + /** + * @default 0 + * @example 5292 + */ + total_results: number; + }; + }; + }; + }; + }; + "changes-tv-list": { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + /** + * @default 0 + * @example 225591 + */ + id: number; + /** + * @default true + * @example false + */ + adult: boolean; + }[]; + /** + * @default 0 + * @example 1 + */ + page: number; + /** + * @default 0 + * @example 18 + */ + total_pages: number; + /** + * @default 0 + * @example 1763 + */ + total_results: number; + }; + }; + }; + }; + }; + "collection-details": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + collection_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 10 + */ + id: number; + /** @example Star Wars Collection */ + name?: string; + /** @example en */ + original_language?: string; + /** @example Star Wars Collection */ + original_name?: string; + /** @example An epic space-opera theatrical film series, which depicts the adventures of various characters "a long time ago in a galaxy far, far away…." */ + overview?: string; + /** @example /22dj38IckjzEEUZwN1tPU5VJ1qq.jpg */ + poster_path?: string; + /** @example /4z9ijhgEthfRHShoOvMaBlpciXS.jpg */ + backdrop_path?: string; + parts?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /2w4xG178RpB4MDAIfTkqAuSJzec.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 11 + */ + id: number; + /** @example Star Wars */ + name?: string; + /** @example Star Wars */ + original_name?: string; + /** @example Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire. */ + overview?: string; + /** @example /6FfCtAuVAW8XJjZ7eWeLibRLWTw.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + /** @example en */ + original_language?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 15.8557 + */ + popularity: number; + /** @example 1977-05-25 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.205 + */ + vote_average: number; + /** + * @default 0 + * @example 21522 + */ + vote_count: number; + }[]; + }; + }; + }; + }; + }; + "collection-images": { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + collection_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 10 + */ + id: number; + backdrops?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 1080 + */ + height: number; + iso_639_1?: unknown; + /** @example /d8duYyyC9J5T825Hg7grmaabfxQ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.464 + */ + vote_average: number; + /** + * @default 0 + * @example 30 + */ + vote_count: number; + /** + * @default 0 + * @example 1920 + */ + width: number; + }[]; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 3000 + */ + height: number; + /** @example en */ + iso_639_1?: string; + /** @example /r8Ph5MYXL04Qzu4QBbq2KjqwtkQ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.516 + */ + vote_average: number; + /** + * @default 0 + * @example 14 + */ + vote_count: number; + /** + * @default 0 + * @example 2000 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "collection-translations": { + parameters: { + query?: never; + header?: never; + path: { + collection_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 10 + */ + id: number; + translations?: { + /** @example AE */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + title?: string; + /** @example */ + overview?: string; + /** @example */ + homepage?: string; + }; + }[]; + }; + }; + }; + }; + }; + "company-details": { + parameters: { + query?: never; + header?: never; + path: { + company_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example */ + description?: string; + /** @example San Francisco, California */ + headquarters?: string; + /** @example https://www.lucasfilm.com */ + homepage?: string; + /** + * @default 0 + * @example 1 + */ + id: number; + /** @example /o86DbpburjxrqAzEDhXZcyE8pDb.png */ + logo_path?: string; + /** @example Lucasfilm Ltd. */ + name?: string; + /** @example US */ + origin_country?: string; + parent_company?: unknown; + }; + }; + }; + }; + }; + "company-alternative-names": { + parameters: { + query?: never; + header?: never; + path: { + company_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + id: number; + results?: { + /** @example 루카스필름 */ + name?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + "company-images": { + parameters: { + query?: never; + header?: never; + path: { + company_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 2.97979797979798 + */ + aspect_ratio: number; + /** @example /o86DbpburjxrqAzEDhXZcyE8pDb.png */ + file_path?: string; + /** + * @default 0 + * @example 99 + */ + height: number; + /** @example 5aa080d6c3a3683fea00011e */ + id?: string; + /** @example .svg */ + file_type?: string; + /** + * @default 0 + * @example 5.384 + */ + vote_average: number; + /** + * @default 0 + * @example 2 + */ + vote_count: number; + /** + * @default 0 + * @example 295 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "configuration-details": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + images?: { + /** @example http://image.tmdb.org/t/p/ */ + base_url?: string; + /** @example https://image.tmdb.org/t/p/ */ + secure_base_url?: string; + backdrop_sizes?: string[]; + logo_sizes?: string[]; + poster_sizes?: string[]; + profile_sizes?: string[]; + still_sizes?: string[]; + }; + change_keys?: string[]; + }; + }; + }; + }; + }; + "configuration-countries": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example AD */ + iso_3166_1?: string; + /** @example Andorra */ + english_name?: string; + /** @example Andorra */ + native_name?: string; + }[]; + }; + }; + }; + }; + "configuration-jobs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Production */ + department?: string; + jobs?: string[]; + }[]; + }; + }; + }; + }; + "configuration-languages": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example bi */ + iso_639_1?: string; + /** @example Bislama */ + english_name?: string; + /** @example */ + name?: string; + }[]; + }; + }; + }; + }; + "configuration-primary-translations": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": string[]; + }; + }; + }; + }; + "configuration-timezones": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example AD */ + iso_3166_1?: string; + zones?: string[]; + }[]; + }; + }; + }; + }; + "credit-details": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + credit_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example cast */ + credit_type?: string; + /** @example Acting */ + department?: string; + /** @example Actor */ + job?: string; + media?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /uDgy6hyPd82kOHh6I95FLtLnj6p.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 100088 + */ + id: number; + /** @example The Last of Us */ + name?: string; + /** @example en */ + original_language?: string; + /** @example The Last of Us */ + original_name?: string; + /** @example Zwanzig Jahre nachdem die moderne Zivilisation zerstört wurde. – Joel, ein abgehärteter Überlebender, wird angeheuert, um Ellie, ein 14-jähriges Mädchen, aus einer bedrückenden Quarantänezone zu schmuggeln. Was als kleiner Job beginnt, wird bald zu einer brutalen, herzzerreißenden Reise, bei der die beiden die USA durchqueren müssen und aufeinander angewiesen sind, um zu überleben. */ + overview?: string; + /** @example /igwIPNClQpGVzb61QlGqcpT5zUy.jpg */ + poster_path?: string; + /** @example tv */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 898.378 + */ + popularity: number; + /** @example 2023-01-15 */ + first_air_date?: string; + /** + * @default 0 + * @example 8.749 + */ + vote_average: number; + /** + * @default 0 + * @example 3341 + */ + vote_count: number; + origin_country?: string[]; + /** @example Joel Miller */ + character?: string; + episodes?: unknown[]; + seasons?: { + /** @example 2023-01-15 */ + air_date?: string; + /** + * @default 0 + * @example 9 + */ + episode_count: number; + /** + * @default 0 + * @example 144593 + */ + id: number; + /** @example Staffel 1 */ + name?: string; + /** @example Die 1. Staffel der Endzeit-Horrorserie The Last of Us feierte ihre Premiere am 15. Januar 2023 bei HBO. In Staffel 1 beginnt für den Überlebenden Joel und das Mädchen Ellie eine Reise durch das postapokalyptische Amerika, in dem Plünderer und mutierte Wesen ihnen nach dem Leben trachten. */ + overview?: string; + /** @example /aUQKIpZZ31KWbpdHMCmaV76u78T.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 100088 + */ + show_id: number; + }[]; + }; + /** @example tv */ + media_type?: string; + /** @example 6024a814c0ae36003d59cc3c */ + id?: string; + person?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1253360 + */ + id: number; + /** @example Pedro Pascal */ + name?: string; + /** @example Pedro Pascal */ + original_name?: string; + /** @example person */ + media_type?: string; + /** + * @default 0 + * @example 106.095 + */ + popularity: number; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** @example Acting */ + known_for_department?: string; + /** @example /dBOrm29cr7NUrjiDQMTtrTyDpfy.jpg */ + profile_path?: string; + }; + }; + }; + }; + }; + }; + "discover-movie": { + parameters: { + query?: { + /** @description use in conjunction with `region` */ + certification?: string; + /** @description use in conjunction with `region` */ + "certification.gte"?: string; + /** @description use in conjunction with `region` */ + "certification.lte"?: string; + /** @description use in conjunction with the `certification`, `certification.gte` and `certification.lte` filters */ + certification_country?: string; + include_adult?: boolean; + include_video?: boolean; + language?: string; + page?: number; + primary_release_year?: number; + "primary_release_date.gte"?: string; + "primary_release_date.lte"?: string; + region?: string; + "release_date.gte"?: string; + "release_date.lte"?: string; + sort_by?: + | "original_title.asc" + | "original_title.desc" + | "popularity.asc" + | "popularity.desc" + | "revenue.asc" + | "revenue.desc" + | "primary_release_date.asc" + | "title.asc" + | "title.desc" + | "primary_release_date.desc" + | "vote_average.asc" + | "vote_average.desc" + | "vote_count.asc" + | "vote_count.desc"; + "vote_average.gte"?: number; + "vote_average.lte"?: number; + "vote_count.gte"?: number; + "vote_count.lte"?: number; + /** @description use in conjunction with `with_watch_monetization_types ` or `with_watch_providers ` */ + watch_region?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_cast?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_companies?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_crew?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_genres?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_keywords?: string; + with_origin_country?: string; + with_original_language?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_people?: string; + /** @description possible values are: [1, 2, 3, 4, 5, 6] can be a comma (`AND`) or pipe (`OR`) separated query, can be used in conjunction with `region` */ + with_release_type?: number; + "with_runtime.gte"?: number; + "with_runtime.lte"?: number; + /** @description possible values are: [flatrate, free, ads, rent, buy] use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_monetization_types?: string; + /** @description use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_providers?: string; + without_companies?: string; + without_genres?: string; + without_keywords?: string; + without_watch_providers?: string; + year?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /8YFL5QQVPy3AgrEQxNYVSgiPEbe.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 640146 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + original_title?: string; + /** @example Super-Hero partners Scott Lang and Hope van Dyne, along with with Hope's parents Janet van Dyne and Hank Pym, and Scott's daughter Cassie Lang, find themselves exploring the Quantum Realm, interacting with strange new creatures and embarking on an adventure that will push them beyond the limits of what they thought possible. */ + overview?: string; + /** + * @default 0 + * @example 9272.643 + */ + popularity: number; + /** @example /ngl2FKBlU4fhbdsrtdom9LVLBXw.jpg */ + poster_path?: string; + /** @example 2023-02-15 */ + release_date?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.5 + */ + vote_average: number; + /** + * @default 0 + * @example 1856 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 38020 + */ + total_pages: number; + /** + * @default 0 + * @example 760385 + */ + total_results: number; + }; + }; + }; + }; + }; + "discover-tv": { + parameters: { + query?: { + "air_date.gte"?: string; + "air_date.lte"?: string; + first_air_date_year?: number; + "first_air_date.gte"?: string; + "first_air_date.lte"?: string; + include_adult?: boolean; + include_null_first_air_dates?: boolean; + language?: string; + page?: number; + screened_theatrically?: boolean; + sort_by?: + | "first_air_date.asc" + | "first_air_date.desc" + | "name.asc" + | "name.desc" + | "original_name.asc" + | "original_name.desc" + | "popularity.asc" + | "popularity.desc" + | "vote_average.asc" + | "vote_average.desc" + | "vote_count.asc" + | "vote_count.desc"; + timezone?: string; + "vote_average.gte"?: number; + "vote_average.lte"?: number; + "vote_count.gte"?: number; + "vote_count.lte"?: number; + /** @description use in conjunction with `with_watch_monetization_types ` or `with_watch_providers ` */ + watch_region?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_companies?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_genres?: string; + /** @description can be a comma (`AND`) or pipe (`OR`) separated query */ + with_keywords?: string; + with_networks?: number; + with_origin_country?: string; + with_original_language?: string; + "with_runtime.gte"?: number; + "with_runtime.lte"?: number; + /** @description possible values are: [0, 1, 2, 3, 4, 5], can be a comma (`AND`) or pipe (`OR`) separated query */ + with_status?: string; + /** @description possible values are: [flatrate, free, ads, rent, buy] use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_monetization_types?: string; + /** @description use in conjunction with `watch_region`, can be a comma (`AND`) or pipe (`OR`) separated query */ + with_watch_providers?: string; + without_companies?: string; + without_genres?: string; + without_keywords?: string; + without_watch_providers?: string; + /** @description possible values are: [0, 1, 2, 3, 4, 5, 6], can be a comma (`AND`) or pipe (`OR`) separated query */ + with_type?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2684.061 + */ + popularity: number; + /** @example /ujlkQtHAVShWyWTloGU2Vh5Jbo9.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 7414 + */ + total_pages: number; + /** + * @default 0 + * @example 148265 + */ + total_results: number; + }; + }; + }; + }; + }; + "find-by-id": { + parameters: { + query: { + external_source: + | "imdb_id" + | "facebook_id" + | "instagram_id" + | "tvdb_id" + | "tiktok_id" + | "twitter_id" + | "wikidata_id" + | "youtube_id"; + language?: string; + }; + header?: never; + path: { + external_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + movie_results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 934433 + */ + id: number; + /** @example Scream VI */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Scream VI */ + original_title?: string; + /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ + overview?: string; + /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 853.917 + */ + popularity: number; + /** @example 2023-03-08 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.388 + */ + vote_average: number; + /** + * @default 0 + * @example 708 + */ + vote_count: number; + }[]; + person_results?: unknown[]; + tv_results?: unknown[]; + tv_episode_results?: unknown[]; + tv_season_results?: unknown[]; + }; + }; + }; + }; + }; + "genre-movie-list": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + genres?: { + /** + * @default 0 + * @example 28 + */ + id: number; + /** @example Action */ + name?: string; + }[]; + }; + }; + }; + }; + }; + "genre-tv-list": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + genres?: { + /** + * @default 0 + * @example 10759 + */ + id: number; + /** @example Action & Adventure */ + name?: string; + }[]; + }; + }; + }; + }; + }; + "guest-session-rated-movies": { + parameters: { + query?: { + language?: string; + page?: number; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + guest_session_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ikR2qy9xJCHX7M8i5rcvuNfdYXs.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 16 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Dancer in the Dark */ + original_title?: string; + /** @example Selma, a Czech immigrant on the verge of blindness, struggles to make ends meet for herself and her son, who has inherited the same genetic disorder and will suffer the same fate without an expensive operation. When life gets too difficult, Selma learns to cope through her love of musicals, escaping life's troubles - even if just for a moment - by dreaming up little numbers to the rhythmic beats of her surroundings. */ + overview?: string; + /** + * @default 0 + * @example 14.684 + */ + popularity: number; + /** @example /8Wdd3fQfbbQeoSfWpHrDfaFNhBU.jpg */ + poster_path?: string; + /** @example 2000-06-30 */ + release_date?: string; + /** @example Dancer in the Dark */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.885 + */ + vote_average: number; + /** + * @default 0 + * @example 1549 + */ + vote_count: number; + /** + * @default 0 + * @example 8.5 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + "guest-session-rated-tv": { + parameters: { + query?: { + language?: string; + page?: number; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + guest_session_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /2OMB0ynKlyIenMJWI2Dy9IWT4c.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Game of Thrones */ + original_name?: string; + /** @example Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond. */ + overview?: string; + /** + * @default 0 + * @example 404.299 + */ + popularity: number; + /** @example /7WUHnWGx5OO145IRxPDUkQSh4C7.jpg */ + poster_path?: string; + /** @example 2011-04-17 */ + first_air_date?: string; + /** @example Game of Thrones */ + name?: string; + /** + * @default 0 + * @example 8.436 + */ + vote_average: number; + /** + * @default 0 + * @example 21025 + */ + vote_count: number; + /** + * @default 0 + * @example 8.5 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + "guest-session-rated-tv-episodes": { + parameters: { + query?: { + language?: string; + page?: number; + sort_by?: "created_at.asc" | "created_at.desc"; + }; + header?: never; + path: { + guest_session_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example 2011-04-17 */ + air_date?: string; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example Winter Is Coming */ + name?: string; + /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ + overview?: string; + /** @example 101 */ + production_code?: string; + /** + * @default 0 + * @example 62 + */ + runtime: number; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 1399 + */ + show_id: number; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.843 + */ + vote_average: number; + /** + * @default 0 + * @example 286 + */ + vote_count: number; + /** + * @default 0 + * @example 8.5 + */ + rating: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + "keyword-details": { + parameters: { + query?: never; + header?: never; + path: { + keyword_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1701 + */ + id: number; + /** @example hero */ + name?: string; + }; + }; + }; + }; + }; + "keyword-movies": { + parameters: { + query?: { + include_adult?: boolean; + language?: string; + page?: number; + }; + header?: never; + path: { + keyword_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1701 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3CxUndGhUcZdt1Zggjdb2HkLLQX.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 640146 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + original_title?: string; + /** @example Das Superhelden-Duo Scott Lang und Hope Van Dyne erkundet zusammen mit Hopes Eltern Hank Pym und Janet Van Dyne das Quantenreich, interagiert mit seltsamen neuen Kreaturen und begibt sich auf ein Abenteuer, das sie über die Grenzen dessen hinaustreiben wird, was sie für möglich gehalten haben. */ + overview?: string; + /** + * @default 0 + * @example 9200.005 + */ + popularity: number; + /** @example /nA5otwVxAfpBP4PVgeuBk3qHcLY.jpg */ + poster_path?: string; + /** @example 2023-02-15 */ + release_date?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.5 + */ + vote_average: number; + /** + * @default 0 + * @example 2079 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 11 + */ + total_pages: number; + /** + * @default 0 + * @example 211 + */ + total_results: number; + }; + }; + }; + }; + }; + "list-add-movie": { + parameters: { + query: { + session_id: string; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY?: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 12 + */ + status_code: number; + /** @example The item/record was updated successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + "list-check-item-status": { + parameters: { + query?: { + language?: string; + movie_id?: number; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + id: number; + /** + * @default true + * @example true + */ + item_present: boolean; + }; + }; + }; + }; + }; + "list-clear": { + parameters: { + query: { + session_id: string; + confirm: boolean; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 12 + */ + status_code: number; + /** @example The item/record was updated successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + "list-create": { + parameters: { + query: { + session_id: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example The item/record was created successfully. */ + status_message?: string; + /** + * @default true + * @example true + */ + success: boolean; + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** + * @default 0 + * @example 5861 + */ + list_id: number; + }; + }; + }; + }; + }; + "list-details": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example travisbell */ + created_by?: string; + /** @example The idea behind this list is to collect the live action comic book movies from within the Marvel franchise. */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** @example 1 */ + id?: string; + items?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /14QbnygCuTO0vl7CAFmPf1fgZfV.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 634649 + */ + id: number; + /** @example movie */ + media_type?: string; + /** @example en */ + original_language?: string; + /** @example Spider-Man: No Way Home */ + original_title?: string; + /** @example Peter Parker ist demaskiert und kann sein normales Leben nicht mehr von den hohen Einsätzen als Superheld trennen. Als er Doctor Strange um Hilfe bittet, wird die Lage noch gefährlicher und er muss entdecken, was es wirklich bedeutet, Spider-Man zu sein. */ + overview?: string; + /** + * @default 0 + * @example 398.217 + */ + popularity: number; + /** @example /iNKf4D0AzOj9GLq8ZyG3WZaqibL.jpg */ + poster_path?: string; + /** @example 2021-12-15 */ + release_date?: string; + /** @example Spider-Man: No Way Home */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8 + */ + vote_average: number; + /** + * @default 0 + * @example 17267 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 59 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example The Marvel Universe */ + name?: string; + /** @example /coJVIUEOToAEGViuhclM7pXC75R.jpg */ + poster_path?: string; + }; + }; + }; + }; + }; + "list-delete": { + parameters: { + query: { + session_id: string; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 12 + */ + status_code: number; + /** @example The item/record was updated successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + "list-remove-movie": { + parameters: { + query: { + session_id: string; + }; + header?: never; + path: { + list_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + "movie-now-playing-list": { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + dates?: { + /** @example 2023-05-03 */ + maximum?: string; + /** @example 2023-03-16 */ + minimum?: string; + }; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /iJQIbOPm81fPEGKt5BPuZmfnA54.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 502356 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Super Mario Bros. Movie */ + original_title?: string; + /** @example While working underground to fix a water main, Brooklyn plumbers—and brothers—Mario and Luigi are transported down a mysterious pipe and wander into a magical new world. But when the brothers are separated, Mario embarks on an epic quest to find Luigi. */ + overview?: string; + /** + * @default 0 + * @example 6572.614 + */ + popularity: number; + /** @example /qNBAXBIQlnOThrVvA6mA2B5ggV6.jpg */ + poster_path?: string; + /** @example 2023-04-05 */ + release_date?: string; + /** @example The Super Mario Bros. Movie */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.5 + */ + vote_average: number; + /** + * @default 0 + * @example 1456 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 87 + */ + total_pages: number; + /** + * @default 0 + * @example 1734 + */ + total_results: number; + }; + }; + }; + }; + }; + "movie-popular-list": { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /gMJngTNfaqCSCqGD4y8lVMZXKDn.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 640146 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + original_title?: string; + /** @example Super-Hero partners Scott Lang and Hope van Dyne, along with with Hope's parents Janet van Dyne and Hank Pym, and Scott's daughter Cassie Lang, find themselves exploring the Quantum Realm, interacting with strange new creatures and embarking on an adventure that will push them beyond the limits of what they thought possible. */ + overview?: string; + /** + * @default 0 + * @example 8567.865 + */ + popularity: number; + /** @example /ngl2FKBlU4fhbdsrtdom9LVLBXw.jpg */ + poster_path?: string; + /** @example 2023-02-15 */ + release_date?: string; + /** @example Ant-Man and the Wasp: Quantumania */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.5 + */ + vote_average: number; + /** + * @default 0 + * @example 1886 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 38029 + */ + total_pages: number; + /** + * @default 0 + * @example 760569 + */ + total_results: number; + }; + }; + }; + }; + }; + "movie-top-rated-list": { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /tmU7GeKVybMWFButWEGl2M4GeiP.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 238 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example The Godfather */ + original_title?: string; + /** @example Spanning the years 1945 to 1955, a chronicle of the fictional Italian-American Corleone crime family. When organized crime family patriarch, Vito Corleone barely survives an attempt on his life, his youngest son, Michael steps in to take care of the would-be killers, launching a campaign of bloody revenge. */ + overview?: string; + /** + * @default 0 + * @example 100.932 + */ + popularity: number; + /** @example /3bhkrj58Vtu7enYsRolD1fZdja1.jpg */ + poster_path?: string; + /** @example 1972-03-14 */ + release_date?: string; + /** @example The Godfather */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.7 + */ + vote_average: number; + /** + * @default 0 + * @example 17806 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 552 + */ + total_pages: number; + /** + * @default 0 + * @example 11032 + */ + total_results: number; + }; + }; + }; + }; + }; + "movie-upcoming-list": { + parameters: { + query?: { + language?: string; + page?: number; + /** @description ISO-3166-1 code */ + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + dates?: { + /** @example 2023-05-23 */ + maximum?: string; + /** @example 2023-05-04 */ + minimum?: string; + }; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /7bWxAsNPv9CXHOhZbJVlj2KxgfP.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 713704 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Evil Dead Rise */ + original_title?: string; + /** @example Two sisters find an ancient vinyl that gives birth to bloodthirsty demons that run amok in a Los Angeles apartment building and thrusts them into a primal battle for survival as they face the most nightmarish version of family imaginable. */ + overview?: string; + /** + * @default 0 + * @example 1696.367 + */ + popularity: number; + /** @example /mIBCtPvKZQlxubxKMeViO2UrP3q.jpg */ + poster_path?: string; + /** @example 2023-04-12 */ + release_date?: string; + /** @example Evil Dead Rise */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7 + */ + vote_average: number; + /** + * @default 0 + * @example 207 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 19 + */ + total_pages: number; + /** + * @default 0 + * @example 369 + */ + total_results: number; + }; + }; + }; + }; + }; + "movie-details": { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + backdrop_path?: string; + belongs_to_collection?: unknown; + /** + * @default 0 + * @example 63000000 + */ + budget: number; + genres?: { + /** + * @default 0 + * @example 18 + */ + id: number; + /** @example Drama */ + name?: string; + }[]; + /** @example http://www.foxmovies.com/movies/fight-club */ + homepage?: string; + /** + * @default 0 + * @example 550 + */ + id: number; + /** @example tt0137523 */ + imdb_id?: string; + /** @example en */ + original_language?: string; + /** @example Fight Club */ + original_title?: string; + /** @example A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground "fight clubs" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion. */ + overview?: string; + /** + * @default 0 + * @example 61.416 + */ + popularity: number; + /** @example /pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg */ + poster_path?: string; + production_companies?: { + /** + * @default 0 + * @example 508 + */ + id: number; + /** @example /7cxRWzi4LsVm4Utfpr1hfARNurT.png */ + logo_path?: string; + /** @example Regency Enterprises */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + production_countries?: { + /** @example US */ + iso_3166_1?: string; + /** @example United States of America */ + name?: string; + }[]; + /** @example 1999-10-15 */ + release_date?: string; + /** + * @default 0 + * @example 100853753 + */ + revenue: number; + /** + * @default 0 + * @example 139 + */ + runtime: number; + spoken_languages?: { + /** @example English */ + english_name?: string; + /** @example en */ + iso_639_1?: string; + /** @example English */ + name?: string; + }[]; + /** @example Released */ + status?: string; + /** @example Mischief. Mayhem. Soap. */ + tagline?: string; + /** @example Fight Club */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.433 + */ + vote_average: number; + /** + * @default 0 + * @example 26280 + */ + vote_count: number; + }; + }; + }; + }; + }; + "movie-account-states": { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default true + * @example true + */ + favorite: boolean; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + /** + * @default true + * @example false + */ + watchlist: boolean; + }; + }; + }; + }; + }; + "movie-alternative-titles": { + parameters: { + query?: { + /** @description specify a ISO-3166-1 value to filter the results */ + country?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + titles?: { + /** @example RS */ + iso_3166_1?: string; + /** @example Borilački klub */ + title?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + "movie-changes": { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + changes?: { + /** @example images */ + key?: string; + items?: { + /** @example 643197b96dea3a00d4377270 */ + id?: string; + /** @example added */ + action?: string; + /** @example 2023-04-08 16:35:05 UTC */ + time?: string; + /** @example */ + iso_639_1?: string; + /** @example */ + iso_3166_1?: string; + value?: { + poster?: { + /** @example /s9ZrHprviFCx3azfWNBtt1LPSnL.jpg */ + file_path?: string; + }; + }; + }[]; + }[]; + }; + }; + }; + }; + }; + "movie-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 819 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Edward Norton */ + name?: string; + /** @example Edward Norton */ + original_name?: string; + /** + * @default 0 + * @example 26.99 + */ + popularity: number; + /** @example /8nytsqL59SFJTVYVrN72k6qkGgJ.jpg */ + profile_path?: string; + /** + * @default 0 + * @example 4 + */ + cast_id: number; + /** @example The Narrator */ + character?: string; + /** @example 52fe4250c3a36847f80149f3 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 376 + */ + id: number; + /** @example Production */ + known_for_department?: string; + /** @example Arnon Milchan */ + name?: string; + /** @example Arnon Milchan */ + original_name?: string; + /** + * @default 0 + * @example 2.931 + */ + popularity: number; + /** @example /b2hBExX4NnczNAnLuTBF4kmNhZm.jpg */ + profile_path?: string; + /** @example 55731b8192514111610027d7 */ + credit_id?: string; + /** @example Production */ + department?: string; + /** @example Executive Producer */ + job?: string; + }[]; + }; + }; + }; + }; + }; + "movie-external-ids": { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + /** @example tt0137523 */ + imdb_id?: string; + wikidata_id?: unknown; + /** @example FightClub */ + facebook_id?: string; + instagram_id?: unknown; + twitter_id?: unknown; + }; + }; + }; + }; + }; + "movie-images": { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + backdrops?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 800 + */ + height: number; + iso_639_1?: unknown; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.622 + */ + vote_average: number; + /** + * @default 0 + * @example 20 + */ + vote_count: number; + /** + * @default 0 + * @example 1422 + */ + width: number; + }[]; + /** + * @default 0 + * @example 550 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 5.203 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 79 + */ + height: number; + /** @example he */ + iso_639_1?: string; + /** @example /c1KLulrIhUqY5fT42nmC5aERGCp.png */ + file_path?: string; + /** + * @default 0 + * @example 5.312 + */ + vote_average: number; + /** + * @default 0 + * @example 1 + */ + vote_count: number; + /** + * @default 0 + * @example 411 + */ + width: number; + }[]; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 900 + */ + height: number; + /** @example pt */ + iso_639_1?: string; + /** @example /r3pPehX4ik8NLYPpbDRAh0YRtMb.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.258 + */ + vote_average: number; + /** + * @default 0 + * @example 6 + */ + vote_count: number; + /** + * @default 0 + * @example 600 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "movie-keywords": { + parameters: { + query?: never; + header?: never; + path: { + movie_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + keywords?: { + /** + * @default 0 + * @example 818 + */ + id: number; + /** @example based on novel or book */ + name?: string; + }[]; + }; + }; + }; + }; + }; + "movie-latest-id": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example false + */ + adult: boolean; + backdrop_path?: unknown; + belongs_to_collection?: unknown; + /** + * @default 0 + * @example 0 + */ + budget: number; + genres?: unknown[]; + /** @example */ + homepage?: string; + /** + * @default 0 + * @example 1119232 + */ + id: number; + imdb_id?: unknown; + /** @example fr */ + original_language?: string; + /** @example König Charles III */ + original_title?: string; + /** @example */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + popularity: number; + poster_path?: unknown; + production_companies?: unknown[]; + production_countries?: unknown[]; + /** @example */ + release_date?: string; + /** + * @default 0 + * @example 0 + */ + revenue: number; + /** + * @default 0 + * @example 0 + */ + runtime: number; + spoken_languages?: unknown[]; + /** @example Released */ + status?: string; + /** @example */ + tagline?: string; + /** @example König Charles III */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + /** + * @default 0 + * @example 0 + */ + vote_count: number; + }; + }; + }; + }; + }; + "movie-lists": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example Movies I own */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** + * @default 0 + * @example 8248696 + */ + id: number; + /** + * @default 0 + * @example 409 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example movie */ + list_type?: string; + /** @example My Movies */ + name?: string; + poster_path?: unknown; + }[]; + /** + * @default 0 + * @example 122 + */ + total_pages: number; + /** + * @default 0 + * @example 2422 + */ + total_results: number; + }; + }; + }; + }; + }; + "movie-recommendations": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": Record; + }; + }; + }; + }; + "movie-release-dates": { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + results?: { + /** @example BG */ + iso_3166_1?: string; + release_dates?: { + /** @example c */ + certification?: string; + descriptors?: unknown[]; + /** @example */ + iso_639_1?: string; + /** @example */ + note?: string; + /** @example 2012-08-28T00:00:00.000Z */ + release_date?: string; + /** + * @default 0 + * @example 3 + */ + type: number; + }[]; + }[]; + }; + }; + }; + }; + }; + "movie-reviews": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example Goddard */ + author?: string; + author_details?: { + /** @example */ + name?: string; + /** @example Goddard */ + username?: string; + /** @example /https://secure.gravatar.com/avatar/f248ec34f953bc62cafcbdd81fddd6b6.jpg */ + avatar_path?: string; + rating?: unknown; + }; + /** @example Pretty awesome movie. It shows what one crazy person can convince other crazy people to do. Everyone needs something to believe in. I recommend Jesus Christ, but they want Tyler Durden. */ + content?: string; + /** @example 2018-06-09T17:51:53.359Z */ + created_at?: string; + /** @example 5b1c13b9c3a36848f2026384 */ + id?: string; + /** @example 2021-06-23T15:58:09.421Z */ + updated_at?: string; + /** @example https://www.themoviedb.org/review/5b1c13b9c3a36848f2026384 */ + url?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 8 + */ + total_results: number; + }; + }; + }; + }; + }; + "movie-similar": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3YAldML4EDyoC6RBpzceALigrAZ.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 9300 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Orlando */ + original_title?: string; + /** @example England, 1600. Queen Elizabeth I promises Orlando, a young nobleman obsessed with poetry, that she will grant him land and fortune if he agrees to satisfy a very particular request. */ + overview?: string; + /** + * @default 0 + * @example 7.768 + */ + popularity: number; + /** @example /xvz0qZkXXMq3dH2Revxii8drxWc.jpg */ + poster_path?: string; + /** @example 1992-12-11 */ + release_date?: string; + /** @example Orlando */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 6.966 + */ + vote_average: number; + /** + * @default 0 + * @example 262 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 364 + */ + total_pages: number; + /** + * @default 0 + * @example 7269 + */ + total_results: number; + }; + }; + }; + }; + }; + "movie-translations": { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + homepage?: string; + /** @example إدوارد يتعرض لضغوط حتى يصل به الحال إلى أنه لا يستطيع النوم لفتراتٍ طويلة، لكنه يجد بعض السلام في جلسات العلاج النفسي الجماعي، يتعرف إدوارد على أحد الأشخاص وهو (تايلر ديردن) الذي يحرره من تعلقه بالأشياء الذي تستعبده ،ثم يحرره من خوفه من الناس. يقومان معًا بإنشاء نادي القتال الذي يجذب الكثير من الأفراد المحبطين ،الذين يقومون بإخراج طاقة غضبهم وكرههم للعالم في القتال. */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + runtime: number; + /** @example */ + tagline?: string; + /** @example */ + title?: string; + }; + }[]; + }; + }; + }; + }; + }; + "movie-videos": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Fight Club (1999) Trailer - Starring Brad Pitt, Edward Norton, Helena Bonham Carter */ + name?: string; + /** @example O-b2VfmmbyA */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 720 + */ + size: number; + /** @example Trailer */ + type?: string; + /** + * @default true + * @example false + */ + official: boolean; + /** @example 2016-03-05T02:03:14.000Z */ + published_at?: string; + /** @example 639d5326be6d88007f170f44 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + "movie-watch-providers": { + parameters: { + query?: never; + header?: never; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + results?: { + AE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AE */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + AL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AL */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + AR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AR */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + AT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AT */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + AU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=AU */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + BA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BA */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + BB?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BB */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + BE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BE */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + BG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BG */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + BH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BH */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + BO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + BR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + BS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=BS */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + CA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CA */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /sB5vHrmYmliwUvBwZe8HpXo9r8m.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 305 + */ + provider_id: number; + /** @example Crave Starz */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + CH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CH */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /rVOOhp6V8FheEAKtFAJMLMbnaMZ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 150 + */ + provider_id: number; + /** @example blue TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /rVOOhp6V8FheEAKtFAJMLMbnaMZ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 150 + */ + provider_id: number; + /** @example blue TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + CL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CL */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CO */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + CR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + CV?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CV */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + CZ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=CZ */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /wTF37o4jOkQfjnWe41gmeuASYZA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 308 + */ + provider_id: number; + /** @example O2 TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + DE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DE */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + DK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DK */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + DO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=DO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + EC?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EC */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + EE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EE */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + EG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=EG */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + ES?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ES */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + ads?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + FI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FI */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + FJ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FJ */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + FR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=FR */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + GB?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GB */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + GF?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GF */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + GI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GI */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + GR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + GT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=GT */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + HK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HK */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + HN?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HN */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + HR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HR */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + ads?: { + /** @example /xrHrIraInfRXnrz1zHhY1tXJowg.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 572 + */ + provider_id: number; + /** @example RTL Play */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + HU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=HU */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + ID?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ID */ + link?: string; + flatrate?: { + /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 122 + */ + provider_id: number; + /** @example Hotstar */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + IE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IE */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + IL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IL */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + IN?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IN */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + IQ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IQ */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + IS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IS */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + IT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=IT */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + JM?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JM */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + JO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + JP?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=JP */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + rent?: { + /** @example /g8jqHtXJsMlc8B1Gb0Rt8AvUJMn.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 85 + */ + provider_id: number; + /** @example dTV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + KR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=KR */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /2ioan5BX5L9tz4fIGU93blTeFhv.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 356 + */ + provider_id: number; + /** @example wavve */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + KW?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=KW */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + LB?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LB */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + LI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LI */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + LT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LT */ + link?: string; + rent?: { + /** @example /xTVM8uXT9QocigQ07LE7Irc65W2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 553 + */ + provider_id: number; + /** @example Telia Play */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + LV?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=LV */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + MD?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MD */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + MK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + MT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MT */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + MU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MU */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + }; + MX?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MX */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + MY?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MY */ + link?: string; + flatrate?: { + /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 122 + */ + provider_id: number; + /** @example Hotstar */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + MZ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=MZ */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + }; + NL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NL */ + link?: string; + buy?: { + /** @example /llmnYOyknekZsXtkCaazKjhTLvG.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 71 + */ + provider_id: number; + /** @example Pathé Thuis */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + rent?: { + /** @example /llmnYOyknekZsXtkCaazKjhTLvG.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 71 + */ + provider_id: number; + /** @example Pathé Thuis */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + NO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NO */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + NZ?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=NZ */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + OM?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=OM */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PE */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + PH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PH */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PK */ + link?: string; + flatrate?: { + /** @example /t2yyOv40HZeVlLjYsCsPHnWLk4W.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 8 + */ + provider_id: number; + /** @example Netflix */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + PL?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PL */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PS */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PT */ + link?: string; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + rent?: { + /** @example /dUeHhim2WUZz8S7EWjv0Ws6anRP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 242 + */ + provider_id: number; + /** @example Meo */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + PY?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=PY */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + QA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=QA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + RO?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RO */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + RS?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RS */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + RU?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=RU */ + link?: string; + rent?: { + /** @example /o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 113 + */ + provider_id: number; + /** @example Ivi */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + buy?: { + /** @example /o9ExgOSLF3OTwR6T3DJOuwOKJgq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 113 + */ + provider_id: number; + /** @example Ivi */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /zLM7f1w2L8TU2Fspzns72m6h3yY.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 501 + */ + provider_id: number; + /** @example Wink */ + provider_name?: string; + /** + * @default 0 + * @example 1000 + */ + display_priority: number; + }[]; + }; + SA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SE */ + link?: string; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + rent?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SG */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SI?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SI */ + link?: string; + buy?: { + /** @example /5GEbAhFW2S5T8zVc1MNvz00pIzM.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 35 + */ + provider_id: number; + /** @example Rakuten TV */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + SK?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SK */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + SM?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SM */ + link?: string; + flatrate?: { + /** @example /7rwgEs15tFwyR9NPQ5vpzxTj19Q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 337 + */ + provider_id: number; + /** @example Disney Plus */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + SV?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=SV */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + TH?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TH */ + link?: string; + flatrate?: { + /** @example /7Fl8ylPDclt3ZYgNbW2t7rbZE9I.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 122 + */ + provider_id: number; + /** @example Hotstar */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + TR?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TR */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + TT?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + TW?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=TW */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + UG?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=UG */ + link?: string; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 16 + */ + display_priority: number; + }[]; + }; + US?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=US */ + link?: string; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jPXksae158ukMLFhhlNvzsvaEyt.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 257 + */ + provider_id: number; + /** @example fuboTV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + UY?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=UY */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + VE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=VE */ + link?: string; + rent?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + YE?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=YE */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + }; + ZA?: { + /** @example https://www.themoviedb.org/movie/550-fight-club/watch?locale=ZA */ + link?: string; + flatrate?: { + /** @example /emthp39XA2YScoYL1p0sdbAH2WA.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 119 + */ + provider_id: number; + /** @example Amazon Prime Video */ + provider_name?: string; + /** + * @default 0 + * @example 1 + */ + display_priority: number; + }[]; + rent?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + }; + }; + }; + }; + }; + }; + "movie-add-rating": { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header: { + "Content-Type": string; + }; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + "movie-delete-rating": { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header?: { + "Content-Type"?: string; + }; + path: { + movie_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + "network-details": { + parameters: { + query?: never; + header?: never; + path: { + network_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example New York City, New York */ + headquarters?: string; + /** @example https://www.hbo.com */ + homepage?: string; + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }; + }; + }; + }; + }; + "details-copy": { + parameters: { + query?: never; + header?: never; + path: { + network_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 49 + */ + id: number; + results?: { + /** @example Home Box Office */ + name?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + "alternative-names-copy": { + parameters: { + query?: never; + header?: never; + path: { + network_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 49 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 2.425287356321839 + */ + aspect_ratio: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + file_path?: string; + /** + * @default 0 + * @example 174 + */ + height: number; + /** @example 5a7a67a40e0a26020a000091 */ + id?: string; + /** @example .svg */ + file_type?: string; + /** + * @default 0 + * @example 5.318 + */ + vote_average: number; + /** + * @default 0 + * @example 3 + */ + vote_count: number; + /** + * @default 0 + * @example 422 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "person-popular-list": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 224513 + */ + id: number; + known_for?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ilRyazdMJwN05exqhwK4tMKBYZs.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 335984 + */ + id: number; + /** @example movie */ + media_type?: string; + /** @example en */ + original_language?: string; + /** @example Blade Runner 2049 */ + original_title?: string; + /** @example Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years. */ + overview?: string; + /** @example /gajva2L0rPYkEWjzgFlBXCAVBE5.jpg */ + poster_path?: string; + /** @example 2017-10-04 */ + release_date?: string; + /** @example Blade Runner 2049 */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.5 + */ + vote_average: number; + /** + * @default 0 + * @example 11771 + */ + vote_count: number; + }[]; + /** @example Acting */ + known_for_department?: string; + /** @example Ana de Armas */ + name?: string; + /** + * @default 0 + * @example 343.33 + */ + popularity: number; + /** @example /3vxvsmYLTf4jnr163SUlBIw51ee.jpg */ + profile_path?: string; + }[]; + /** + * @default 0 + * @example 500 + */ + total_pages: number; + /** + * @default 0 + * @example 10000 + */ + total_results: number; + }; + }; + }; + }; + }; + "person-details": { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example false + */ + adult: boolean; + also_known_as?: string[]; + /** + * @example Thomas Jeffrey Hanks (born July 9, 1956) is an American actor and filmmaker. Known for both his comedic and dramatic roles, Hanks is one of the most popular and recognizable film stars worldwide, and is widely regarded as an American cultural icon. + * + * Hanks made his breakthrough with leading roles in the comedies Splash (1984) and Big (1988). He won two consecutive Academy Awards for Best Actor for starring as a gay lawyer suffering from AIDS in Philadelphia (1993) and a young man with below-average IQ in Forrest Gump (1994). Hanks collaborated with film director Steven Spielberg on five films: Saving Private Ryan (1998), Catch Me If You Can (2002), The Terminal (2004), Bridge of Spies (2015), and The Post (2017), as well as the 2001 miniseries Band of Brothers, which launched him as a director, producer, and screenwriter. + * + * Hanks' other notable films include the romantic comedies Sleepless in Seattle (1993) and You've Got Mail (1998); the dramas Apollo 13 (1995), The Green Mile (1999), Cast Away (2000), Road to Perdition (2002), and Cloud Atlas (2012); and the biographical dramas Saving Mr. Banks (2013), Captain Phillips (2013), Sully (2016), and A Beautiful Day in the Neighborhood (2019). He has also appeared as the title character in the Robert Langdon film series, and has voiced Sheriff Woody in the Toy Story film series. + * + * Description above from the Wikipedia article Tom Hanks, licensed under CC-BY-SA, full list of contributors on Wikipedia. + */ + biography?: string; + /** @example 1956-07-09 */ + birthday?: string; + deathday?: unknown; + /** + * @default 0 + * @example 2 + */ + gender: number; + homepage?: unknown; + /** + * @default 0 + * @example 31 + */ + id: number; + /** @example nm0000158 */ + imdb_id?: string; + /** @example Acting */ + known_for_department?: string; + /** @example Tom Hanks */ + name?: string; + /** @example Concord, California, USA */ + place_of_birth?: string; + /** + * @default 0 + * @example 82.989 + */ + popularity: number; + /** @example /xndWFsBlClOJFRdhSt4NBwiPq2o.jpg */ + profile_path?: string; + }; + }; + }; + }; + }; + "person-changes": { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + changes?: { + /** @example biography */ + key?: string; + items?: { + /** @example 640469b113654500ba4e859a */ + id?: string; + /** @example added */ + action?: string; + /** @example 2023-03-05 10:06:41 UTC */ + time?: string; + /** @example ca */ + iso_639_1?: string; + /** @example ES */ + iso_3166_1?: string; + /** + * @example Thomas "Tom" Jeffrey Hanks (Concord, Califòrnia, 9 de juliol de 1956) és un actor de cinema i productor estatunidenc, guanyador dues vegades de l'Oscar al millor actor i considerat un dels més versàtils i talentosos del cinema actual. + * + * Hanks és l'actor que més diners ha guanyat de tota la història del cinema amb un total de gairebé sis mil milions de dòlars (setembre 2006). És també copropietari de Playtone, una companyia de producció de pel·lícules. + */ + value?: string; + }[]; + }[]; + }; + }; + }; + }; + }; + "person-combined-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + person_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 13 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Forrest Gump */ + original_title?: string; + /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ + overview?: string; + /** + * @default 0 + * @example 62.225 + */ + popularity: number; + /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ + poster_path?: string; + /** @example 1994-06-23 */ + release_date?: string; + /** @example Forrest Gump */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.481 + */ + vote_average: number; + /** + * @default 0 + * @example 24535 + */ + vote_count: number; + /** @example Forrest Gump */ + character?: string; + /** @example 52fe420ec3a36847f800074f */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + /** @example movie */ + media_type?: string; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /tx3uj8GPWf5pzb0gWATJ4bokNHI.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 87061 + */ + id: number; + /** @example fr */ + original_language?: string; + /** @example Le Voyage extraordinaire */ + original_title?: string; + /** @example An account of the extraordinary life of film pioneer Georges Méliès (1861-1938) and the amazing story of the copy in color of his masterpiece “A Trip to the Moon” (1902), unexpectedly found in Spain and restored thanks to the heroic efforts of a group of true cinema lovers. */ + overview?: string; + /** + * @default 0 + * @example 6.007 + */ + popularity: number; + /** @example /zHNNT9gfiGsuadR6x38KYOp6ekq.jpg */ + poster_path?: string; + /** @example 2011-12-08 */ + release_date?: string; + /** @example The Extraordinary Voyage */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.6 + */ + vote_average: number; + /** + * @default 0 + * @example 47 + */ + vote_count: number; + /** @example 5d818a63d34eb3002c4f8fea */ + credit_id?: string; + /** @example Crew */ + department?: string; + /** @example Thanks */ + job?: string; + /** @example movie */ + media_type?: string; + }[]; + /** + * @default 0 + * @example 31 + */ + id: number; + }; + }; + }; + }; + }; + "person-external-ids": { + parameters: { + query?: never; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 31 + */ + id: number; + /** @example /m/0bxtg */ + freebase_mid?: string; + /** @example /en/tom_hanks */ + freebase_id?: string; + /** @example nm0000158 */ + imdb_id?: string; + /** + * @default 0 + * @example 14293 + */ + tvrage_id: number; + /** @example Q2263 */ + wikidata_id?: string; + /** @example TomHanks */ + facebook_id?: string; + /** @example tomhanks */ + instagram_id?: string; + /** @example tomhanks */ + tiktok_id?: string; + /** @example tomhanks */ + twitter_id?: string; + youtube_id?: unknown; + }; + }; + }; + }; + }; + "person-images": { + parameters: { + query?: never; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 287 + */ + id: number; + profiles?: { + /** + * @default 0 + * @example 0.666 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 980 + */ + height: number; + iso_639_1?: unknown; + /** @example /cckcYc2v0yh1tc9QjRelptcOBko.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.288 + */ + vote_average: number; + /** + * @default 0 + * @example 89 + */ + vote_count: number; + /** + * @default 0 + * @example 653 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "person-latest-id": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example false + */ + adult: boolean; + also_known_as?: unknown[]; + /** @example */ + biography?: string; + birthday?: unknown; + deathday?: unknown; + /** + * @default 0 + * @example 0 + */ + gender: number; + homepage?: unknown; + /** + * @default 0 + * @example 4064343 + */ + id: number; + imdb_id?: unknown; + known_for_department?: unknown; + /** @example Ángel Cruz */ + name?: string; + place_of_birth?: unknown; + /** + * @default 0 + * @example 0 + */ + popularity: number; + profile_path?: unknown; + }; + }; + }; + }; + }; + "person-movie-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 13 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Forrest Gump */ + original_title?: string; + /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ + overview?: string; + /** + * @default 0 + * @example 62.225 + */ + popularity: number; + /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ + poster_path?: string; + /** @example 1994-06-23 */ + release_date?: string; + /** @example Forrest Gump */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.481 + */ + vote_average: number; + /** + * @default 0 + * @example 24535 + */ + vote_count: number; + /** @example Forrest Gump */ + character?: string; + /** @example 52fe420ec3a36847f800074f */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /tx3uj8GPWf5pzb0gWATJ4bokNHI.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 87061 + */ + id: number; + /** @example fr */ + original_language?: string; + /** @example Le Voyage extraordinaire */ + original_title?: string; + /** @example An account of the extraordinary life of film pioneer Georges Méliès (1861-1938) and the amazing story of the copy in color of his masterpiece “A Trip to the Moon” (1902), unexpectedly found in Spain and restored thanks to the heroic efforts of a group of true cinema lovers. */ + overview?: string; + /** + * @default 0 + * @example 6.007 + */ + popularity: number; + /** @example /zHNNT9gfiGsuadR6x38KYOp6ekq.jpg */ + poster_path?: string; + /** @example 2011-12-08 */ + release_date?: string; + /** @example The Extraordinary Voyage */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.6 + */ + vote_average: number; + /** + * @default 0 + * @example 47 + */ + vote_count: number; + /** @example 5d818a63d34eb3002c4f8fea */ + credit_id?: string; + /** @example Crew */ + department?: string; + /** @example Thanks */ + job?: string; + }[]; + /** + * @default 0 + * @example 31 + */ + id: number; + }; + }; + }; + }; + }; + "person-tv-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ttvojTMgaIN7U8gqB5LlNqO4vPN.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1900 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example LIVE with Kelly and Mark */ + original_name?: string; + /** @example A morning talk show with A-list celebrity guests, top-notch performances and one-of-a-kind segments that are unrivaled on daytime television, plus spontaneous, hilarious and unpredictable talk. */ + overview?: string; + /** + * @default 0 + * @example 700.508 + */ + popularity: number; + /** @example /l5y8egG27p2fSTyq8s21SQMmQLy.jpg */ + poster_path?: string; + /** @example 1988-09-05 */ + first_air_date?: string; + /** @example LIVE with Kelly and Mark */ + name?: string; + /** + * @default 0 + * @example 5.4 + */ + vote_average: number; + /** + * @default 0 + * @example 25 + */ + vote_count: number; + /** @example */ + character?: string; + /** @example 52571af019c29571140d5c92 */ + credit_id?: string; + /** + * @default 0 + * @example 1 + */ + episode_count: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /6uMA6EAiwcsCqQJwWgYwtORvE0v.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 2391 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Tales from the Crypt */ + original_name?: string; + /** @example Cadaverous scream legend the Crypt Keeper is your macabre host for these forays of fright and fun based on the classic E.C. Comics tales from back in the day. So shamble up to the bar and pick your poison. Will it be an insane Santa on a personal slay ride? Honeymooners out to fulfill the "til death do we part" vow ASAP? */ + overview?: string; + /** + * @default 0 + * @example 24.88 + */ + popularity: number; + /** @example /dDfXQH6Kg2JNASI0dqNALukjhk1.jpg */ + poster_path?: string; + /** @example 1989-06-10 */ + first_air_date?: string; + /** @example Tales from the Crypt */ + name?: string; + /** + * @default 0 + * @example 7.978 + */ + vote_average: number; + /** + * @default 0 + * @example 757 + */ + vote_count: number; + /** @example 525734f3760ee3776a397211 */ + credit_id?: string; + /** @example Directing */ + department?: string; + /** + * @default 0 + * @example 1 + */ + episode_count: number; + /** @example Director */ + job?: string; + }[]; + /** + * @default 0 + * @example 31 + */ + id: number; + }; + }; + }; + }; + }; + "person-tagged-images": { + parameters: { + query?: { + page?: number; + }; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 31 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default 0 + * @example 0.6666666666666666 + */ + aspect_ratio: number; + /** @example /1wY4psJ5NVEhCuOYROwLH2XExM2.jpg */ + file_path?: string; + /** + * @default 0 + * @example 1500 + */ + height: number; + /** @example 5b235d740e0a265b5d0031d9 */ + id?: string; + /** @example en */ + iso_639_1?: string; + /** + * @default 0 + * @example 5.456 + */ + vote_average: number; + /** + * @default 0 + * @example 7 + */ + vote_count: number; + /** + * @default 0 + * @example 1000 + */ + width: number; + /** @example poster */ + image_type?: string; + media?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bdD39MpSVhKjxarTxLSfX6baoMP.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 857 + */ + id: number; + /** @example Saving Private Ryan */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Saving Private Ryan */ + original_title?: string; + /** @example As U.S. troops storm the beaches of Normandy, three brothers lie dead on the battlefield, with a fourth trapped behind enemy lines. Ranger captain John Miller and seven men are tasked with penetrating German-held territory and bringing the boy home. */ + overview?: string; + /** @example /uqx37cS8cpHg8U35f9U5IBlrCV3.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 70.45 + */ + popularity: number; + /** @example 1998-07-24 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.208 + */ + vote_average: number; + /** + * @default 0 + * @example 14134 + */ + vote_count: number; + }; + /** @example movie */ + media_type?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 13 + */ + total_results: number; + }; + }; + }; + }; + }; + translations: { + parameters: { + query?: never; + header?: never; + path: { + person_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 31 + */ + id: number; + translations?: { + /** @example US */ + iso_3166_1?: string; + /** @example en */ + iso_639_1?: string; + /** @example English */ + name?: string; + /** @example English */ + english_name?: string; + data?: { + /** + * @example Thomas Jeffrey Hanks (born July 9, 1956) is an American actor and filmmaker. Known for both his comedic and dramatic roles, Hanks is one of the most popular and recognizable film stars worldwide, and is widely regarded as an American cultural icon. + * + * Hanks made his breakthrough with leading roles in the comedies Splash (1984) and Big (1988). He won two consecutive Academy Awards for Best Actor for starring as a gay lawyer suffering from AIDS in Philadelphia (1993) and a young man with below-average IQ in Forrest Gump (1994). Hanks collaborated with film director Steven Spielberg on five films: Saving Private Ryan (1998), Catch Me If You Can (2002), The Terminal (2004), Bridge of Spies (2015), and The Post (2017), as well as the 2001 miniseries Band of Brothers, which launched him as a director, producer, and screenwriter. + * + * Hanks' other notable films include the romantic comedies Sleepless in Seattle (1993) and You've Got Mail (1998); the dramas Apollo 13 (1995), The Green Mile (1999), Cast Away (2000), Road to Perdition (2002), and Cloud Atlas (2012); and the biographical dramas Saving Mr. Banks (2013), Captain Phillips (2013), Sully (2016), and A Beautiful Day in the Neighborhood (2019). He has also appeared as the title character in the Robert Langdon film series, and has voiced Sheriff Woody in the Toy Story film series. + * + * Description above from the Wikipedia article Tom Hanks, licensed under CC-BY-SA, full list of contributors on Wikipedia. + */ + biography?: string; + /** @example Tom Hanks */ + name?: string; + }; + }[]; + }; + }; + }; + }; + }; + "review-details": { + parameters: { + query?: never; + header?: never; + path: { + review_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example 640b2aeecaaca20079decdcc */ + id?: string; + /** @example Ricardo Oliveira */ + author?: string; + author_details?: { + /** @example Ricardo Oliveira */ + name?: string; + /** @example RSOliveira */ + username?: string; + /** @example /23Cl7rhsknc7IIAcZZAGKzovjTu.jpg */ + avatar_path?: string; + /** + * @default 0 + * @example 9 + */ + rating: number; + }; + /** + * @example "The Last of Us" is a post-apocalyptic TV series based on the popular video game of the same name. The story follows the journey of Joel, a smuggler, and Ellie, a teenage girl who may be the key to finding a cure for a deadly fungal infection that has ravaged the world. + * + * The series features outstanding performances from Pedro Pascal as Joel, Bella Ramsey as Ellie, and Anna Torv as Tess. The chemistry between the main characters is excellent, and the casting is spot-on. + * + * The show's writing is superb, and it captures the essence of the video game while adding a fresh perspective. The narrative is engaging, and the pacing is just right, with each episode leaving you on the edge of your seat, eager to see what happens next. + * + * The show's production value is top-notch, with stunning visuals and cinematography that capture the bleak and haunting atmosphere of a post-apocalyptic world. The use of practical effects and makeup is impressive and adds to the overall immersion of the story. + * + * Overall, "The Last of Us" is an outstanding TV series that does justice to the source material. It's a must-watch for fans of the video game and anyone who enjoys gripping and emotional storytelling. I would rate it a 9 out of 10. + * + * + * + * Written and Reviewed by RSOliveira + */ + content?: string; + /** @example 2023-03-10T13:04:46.674Z */ + created_at?: string; + /** @example en */ + iso_639_1?: string; + /** + * @default 0 + * @example 100088 + */ + media_id: number; + /** @example The Last of Us */ + media_title?: string; + /** @example tv */ + media_type?: string; + /** @example 2023-03-10T13:04:46.734Z */ + updated_at?: string; + /** @example https://www.themoviedb.org/review/640b2aeecaaca20079decdcc */ + url?: string; + }; + }; + }; + }; + }; + "search-collection": { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + page?: number; + region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /zuW6fOiusv4X9nnW3paHGfXcSll.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 86311 + */ + id: number; + /** @example The Avengers Collection */ + name?: string; + /** @example en */ + original_language?: string; + /** @example The Avengers Collection */ + original_name?: string; + /** @example A superhero film series produced by Marvel Studios based on the Marvel Comics superhero team of the same name, and part of the Marvel Cinematic Universe (MCU). The series features an ensemble cast from the Marvel Cinematic Universe series films, as they join forces for the peacekeeping organization S.H.I.E.L.D. led by Nick Fury. */ + overview?: string; + /** @example /yFSIUVTCvgYrpalUktulvk3Gi5Y.jpg */ + poster_path?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + "search-company": { + parameters: { + query: { + query: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default 0 + * @example 3268 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 22 + */ + total_results: number; + }; + }; + }; + }; + }; + "search-keyword": { + parameters: { + query: { + query: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default 0 + * @example 262419 + */ + id: number; + /** @example lost */ + name?: string; + }[]; + /** + * @default 0 + * @example 5 + */ + total_pages: number; + /** + * @default 0 + * @example 84 + */ + total_results: number; + }; + }; + }; + }; + }; + "search-movie": { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + primary_release_year?: string; + page?: number; + region?: string; + year?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 550 + */ + id: number; + /** @example en */ + original_language?: string; + /** @example Fight Club */ + original_title?: string; + /** @example A ticking-time-bomb insomniac and a slippery soap salesman channel primal male aggression into a shocking new form of therapy. Their concept catches on, with underground "fight clubs" forming in every town, until an eccentric gets in the way and ignites an out-of-control spiral toward oblivion. */ + overview?: string; + /** + * @default 0 + * @example 73.433 + */ + popularity: number; + /** @example /pB8BM7pdSp6B6Ih7QZ4DrQ3PmJK.jpg */ + poster_path?: string; + /** @example 1999-10-15 */ + release_date?: string; + /** @example Fight Club */ + title?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.433 + */ + vote_average: number; + /** + * @default 0 + * @example 26279 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 39 + */ + total_results: number; + }; + }; + }; + }; + }; + "search-multi": { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /aDYSnJAK0BTVeE8osOy22Kz3SXY.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 11 + */ + id: number; + /** @example Star Wars */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Star Wars */ + original_title?: string; + /** @example Princess Leia is captured and held hostage by the evil Imperial forces in their effort to take over the galactic Empire. Venturesome Luke Skywalker and dashing captain Han Solo team together with the loveable robot duo R2-D2 and C-3PO to rescue the beautiful princess and restore peace and justice in the Empire. */ + overview?: string; + /** @example /6FfCtAuVAW8XJjZ7eWeLibRLWTw.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 78.047 + */ + popularity: number; + /** @example 1977-05-25 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.208 + */ + vote_average: number; + /** + * @default 0 + * @example 18528 + */ + vote_count: number; + name?: string; + original_name?: string; + }[]; + /** + * @default 0 + * @example 11 + */ + total_pages: number; + /** + * @default 0 + * @example 201 + */ + total_results: number; + }; + }; + }; + }; + }; + "search-person": { + parameters: { + query: { + query: string; + include_adult?: boolean; + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 31 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Tom Hanks */ + name?: string; + /** @example Tom Hanks */ + original_name?: string; + /** + * @default 0 + * @example 84.631 + */ + popularity: number; + /** @example /xndWFsBlClOJFRdhSt4NBwiPq2o.jpg */ + profile_path?: string; + known_for?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /3h1JZGDhZ8nzxdgvkxha0qBqi05.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 13 + */ + id: number; + /** @example Forrest Gump */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Forrest Gump */ + original_title?: string; + /** @example A man with a low IQ has accomplished great things in his life and been present during significant historic events—in each case, far exceeding what anyone imagined he could do. But despite all he has achieved, his one true love eludes him. */ + overview?: string; + /** @example /arw2vcBveWOVZr6pxd9XTd1TdQa.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 67.209 + */ + popularity: number; + /** @example 1994-06-23 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 8.481 + */ + vote_average: number; + /** + * @default 0 + * @example 24525 + */ + vote_count: number; + }[]; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + "search-tv": { + parameters: { + query: { + query: string; + /** @description Search only the first air date. Valid values are: 1000..9999 */ + first_air_date_year?: number; + include_adult?: boolean; + language?: string; + page?: number; + /** @description Search the first air date and all episode air dates. Valid values are: 1000..9999 */ + year?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 1396 + */ + id: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Breaking Bad */ + original_name?: string; + /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ + overview?: string; + /** + * @default 0 + * @example 298.884 + */ + popularity: number; + /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ + poster_path?: string; + /** @example 2008-01-20 */ + first_air_date?: string; + /** @example Breaking Bad */ + name?: string; + /** + * @default 0 + * @example 8.879 + */ + vote_average: number; + /** + * @default 0 + * @example 11536 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 1 + */ + total_results: number; + }; + }; + }; + }; + }; + "trending-all": { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: "day" | "week"; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 934433 + */ + id: number; + /** @example Scream VI */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Scream VI */ + original_title?: string; + /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ + overview?: string; + /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 609.941 + */ + popularity: number; + /** @example 2023-03-08 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.374 + */ + vote_average: number; + /** + * @default 0 + * @example 684 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + "trending-movies": { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: "day" | "week"; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /44immBwzhDVyjn87b3x3l9mlhAD.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 934433 + */ + id: number; + /** @example Scream VI */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Scream VI */ + original_title?: string; + /** @example Following the latest Ghostface killings, the four survivors leave Woodsboro behind and start a fresh chapter. */ + overview?: string; + /** @example /wDWwtvkRRlgTiUr6TyLSMX8FCuZ.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 609.941 + */ + popularity: number; + /** @example 2023-03-08 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.374 + */ + vote_average: number; + /** + * @default 0 + * @example 684 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + "trending-people": { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: "day" | "week"; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 224513 + */ + id: number; + /** @example Ana de Armas */ + name?: string; + /** @example Ana de Armas */ + original_name?: string; + /** @example person */ + media_type?: string; + /** + * @default 0 + * @example 349.766 + */ + popularity: number; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** @example Acting */ + known_for_department?: string; + /** @example /3vxvsmYLTf4jnr163SUlBIw51ee.jpg */ + profile_path?: string; + known_for?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /ilRyazdMJwN05exqhwK4tMKBYZs.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 335984 + */ + id: number; + /** @example Blade Runner 2049 */ + title?: string; + /** @example en */ + original_language?: string; + /** @example Blade Runner 2049 */ + original_title?: string; + /** @example Thirty years after the events of the first film, a new blade runner, LAPD Officer K, unearths a long-buried secret that has the potential to plunge what's left of society into chaos. K's discovery leads him on a quest to find Rick Deckard, a former LAPD blade runner who has been missing for 30 years. */ + overview?: string; + /** @example /gajva2L0rPYkEWjzgFlBXCAVBE5.jpg */ + poster_path?: string; + /** @example movie */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 79.571 + */ + popularity: number; + /** @example 2017-10-04 */ + release_date?: string; + /** + * @default true + * @example false + */ + video: boolean; + /** + * @default 0 + * @example 7.531 + */ + vote_average: number; + /** + * @default 0 + * @example 11771 + */ + vote_count: number; + }[]; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + "trending-tv": { + parameters: { + query?: { + /** @description `ISO-639-1`-`ISO-3166-1` code */ + language?: string; + }; + header?: never; + path: { + time_window: "day" | "week"; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /8P15FsYcTwQZ4G5rRMd1TKD14Aq.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 103768 + */ + id: number; + /** @example Sweet Tooth */ + name?: string; + /** @example en */ + original_language?: string; + /** @example Sweet Tooth */ + original_name?: string; + /** @example On a perilous adventure across a post-apocalyptic world, a lovable boy who's half-human and half-deer searches for a new beginning with a gruff protector. */ + overview?: string; + /** @example /dBxxtfhC4vYrxB2fLsSxOTY2dQc.jpg */ + poster_path?: string; + /** @example tv */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 137.498 + */ + popularity: number; + /** @example 2021-06-04 */ + first_air_date?: string; + /** + * @default 0 + * @example 7.928 + */ + vote_average: number; + /** + * @default 0 + * @example 1094 + */ + vote_count: number; + origin_country?: string[]; + }[]; + /** + * @default 0 + * @example 1000 + */ + total_pages: number; + /** + * @default 0 + * @example 20000 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-airing-today-list": { + parameters: { + query?: { + language?: string; + page?: number; + timezone?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2797.914 + */ + popularity: number; + /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 14 + */ + total_pages: number; + /** + * @default 0 + * @example 265 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-on-the-air-list": { + parameters: { + query?: { + language?: string; + page?: number; + timezone?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2797.914 + */ + popularity: number; + /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 58 + */ + total_pages: number; + /** + * @default 0 + * @example 1151 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-popular-list": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /mAJ84W6I8I272Da87qplS2Dp9ST.jpg */ + backdrop_path?: string; + /** @example 2023-01-23 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 202250 + */ + id: number; + /** @example Dirty Linen */ + name?: string; + origin_country?: string[]; + /** @example tl */ + original_language?: string; + /** @example Dirty Linen */ + original_name?: string; + /** @example To exact vengeance, a young woman infiltrates the household of an influential family as a housemaid to expose their dirty secrets. However, love will get in the way of her revenge plot. */ + overview?: string; + /** + * @default 0 + * @example 2797.914 + */ + popularity: number; + /** @example /aoAZgnmMzY9vVy9VWnO3U5PZENh.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 5 + */ + vote_average: number; + /** + * @default 0 + * @example 13 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 7416 + */ + total_pages: number; + /** + * @default 0 + * @example 148302 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-top-rated-list": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example /99vBORZixICa32Pwdwj0lWcr8K.jpg */ + backdrop_path?: string; + /** @example 2021-09-03 */ + first_air_date?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 130392 + */ + id: number; + /** @example The D'Amelio Show */ + name?: string; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example The D'Amelio Show */ + original_name?: string; + /** @example From relative obscurity and a seemingly normal life, to overnight success and thrust into the Hollywood limelight overnight, the D’Amelios are faced with new challenges and opportunities they could not have imagined. */ + overview?: string; + /** + * @default 0 + * @example 12.459 + */ + popularity: number; + /** @example /phv2Jc4H8cvRzvTKb9X1uKMboTu.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 8.9 + */ + vote_average: number; + /** + * @default 0 + * @example 3190 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 142 + */ + total_pages: number; + /** + * @default 0 + * @example 2833 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-details": { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /6LWy0jvMpmjoS9fojNgHIKoWL05.jpg */ + backdrop_path?: string; + created_by?: { + /** + * @default 0 + * @example 9813 + */ + id: number; + /** @example 5256c8c219c2956ff604858a */ + credit_id?: string; + /** @example David Benioff */ + name?: string; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** @example /xvNN5huL0X8yJ7h3IZfGG4O2zBD.jpg */ + profile_path?: string; + }[]; + episode_run_time?: number[]; + /** @example 2011-04-17 */ + first_air_date?: string; + genres?: { + /** + * @default 0 + * @example 10765 + */ + id: number; + /** @example Sci-Fi & Fantasy */ + name?: string; + }[]; + /** @example http://www.hbo.com/game-of-thrones */ + homepage?: string; + /** + * @default 0 + * @example 1399 + */ + id: number; + /** + * @default true + * @example false + */ + in_production: boolean; + languages?: string[]; + /** @example 2019-05-19 */ + last_air_date?: string; + last_episode_to_air?: { + /** + * @default 0 + * @example 1551830 + */ + id: number; + /** @example The Iron Throne */ + name?: string; + /** @example In the aftermath of the devastating attack on King's Landing, Daenerys must face the survivors. */ + overview?: string; + /** + * @default 0 + * @example 4.809 + */ + vote_average: number; + /** + * @default 0 + * @example 241 + */ + vote_count: number; + /** @example 2019-05-19 */ + air_date?: string; + /** + * @default 0 + * @example 6 + */ + episode_number: number; + /** @example 806 */ + production_code?: string; + /** + * @default 0 + * @example 80 + */ + runtime: number; + /** + * @default 0 + * @example 8 + */ + season_number: number; + /** + * @default 0 + * @example 1399 + */ + show_id: number; + /** @example /zBi2O5EJfgTS6Ae0HdAYLm9o2nf.jpg */ + still_path?: string; + }; + /** @example Game of Thrones */ + name?: string; + next_episode_to_air?: unknown; + networks?: { + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + /** + * @default 0 + * @example 73 + */ + number_of_episodes: number; + /** + * @default 0 + * @example 8 + */ + number_of_seasons: number; + origin_country?: string[]; + /** @example en */ + original_language?: string; + /** @example Game of Thrones */ + original_name?: string; + /** @example Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night's Watch, is all that stands between the realms of men and icy horrors beyond. */ + overview?: string; + /** + * @default 0 + * @example 346.098 + */ + popularity: number; + /** @example /1XS1oqL89opfnbLl8WnZY1O1uJx.jpg */ + poster_path?: string; + production_companies?: { + /** + * @default 0 + * @example 76043 + */ + id: number; + /** @example /9RO2vbQ67otPrBLXCaC8UMp3Qat.png */ + logo_path?: string; + /** @example Revolution Sun Studios */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + production_countries?: { + /** @example GB */ + iso_3166_1?: string; + /** @example United Kingdom */ + name?: string; + }[]; + seasons?: { + /** @example 2010-12-05 */ + air_date?: string; + /** + * @default 0 + * @example 272 + */ + episode_count: number; + /** + * @default 0 + * @example 3627 + */ + id: number; + /** @example Specials */ + name?: string; + /** @example */ + overview?: string; + /** @example /kMTcwNRfFKCZ0O2OaBZS0nZ2AIe.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 0 + */ + season_number: number; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + }[]; + spoken_languages?: { + /** @example English */ + english_name?: string; + /** @example en */ + iso_639_1?: string; + /** @example English */ + name?: string; + }[]; + /** @example Ended */ + status?: string; + /** @example Winter Is Coming */ + tagline?: string; + /** @example Scripted */ + type?: string; + /** + * @default 0 + * @example 8.438 + */ + vote_average: number; + /** + * @default 0 + * @example 21390 + */ + vote_count: number; + }; + }; + }; + }; + }; + "tv-series-account-states": { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default true + * @example true + */ + favorite: boolean; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + /** + * @default true + * @example false + */ + watchlist: boolean; + }; + }; + }; + }; + }; + "tv-series-aggregate-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 1223786 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Emilia Clarke */ + name?: string; + /** @example Emilia Clarke */ + original_name?: string; + /** + * @default 0 + * @example 42.737 + */ + popularity: number; + /** @example /u59kTmNHXzaGZqokivxLPiBVIML.jpg */ + profile_path?: string; + roles?: { + /** @example 5256c8af19c2956ff60479f6 */ + credit_id?: string; + /** @example Daenerys Targaryen */ + character?: string; + /** + * @default 0 + * @example 78 + */ + episode_count: number; + }[]; + /** + * @default 0 + * @example 78 + */ + total_episode_count: number; + /** + * @default 0 + * @example 6 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 6411 + */ + id: number; + /** @example Art */ + known_for_department?: string; + /** @example Deborah Riley */ + name?: string; + /** @example Deborah Riley */ + original_name?: string; + /** + * @default 0 + * @example 1.4 + */ + popularity: number; + /** @example /cjhADpqdrnwB1PdDUKaBnWrIj2Q.jpg */ + profile_path?: string; + jobs?: { + /** @example 54eee9e5c3a3686d5800584e */ + credit_id?: string; + /** @example Production Design */ + job?: string; + /** + * @default 0 + * @example 43 + */ + episode_count: number; + }[]; + /** @example Art */ + department?: string; + /** + * @default 0 + * @example 43 + */ + total_episode_count: number; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + "tv-series-alternative-titles": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** @example AL */ + iso_3166_1?: string; + /** @example Froni i shpatave */ + title?: string; + /** @example */ + type?: string; + }[]; + }; + }; + }; + }; + }; + "tv-series-changes": { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + changes?: { + /** @example images */ + key?: string; + items?: { + /** @example 640435cf021cee0084710972 */ + id?: string; + /** @example updated */ + action?: string; + /** @example 2023-03-05 06:25:19 UTC */ + time?: string; + /** @example en */ + iso_639_1?: string; + /** @example */ + iso_3166_1?: string; + value?: { + poster?: { + /** @example /ouudK6RCNnsbT1CSXrlATXQIQTG.jpg */ + file_path?: string; + /** @example en */ + iso_639_1?: string; + }; + }; + original_value?: { + poster?: { + /** @example /ouudK6RCNnsbT1CSXrlATXQIQTG.jpg */ + file_path?: string; + /** @example fr */ + iso_639_1?: string; + }; + }; + }[]; + }[]; + }; + }; + }; + }; + }; + "tv-series-content-ratings": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + descriptors?: unknown[]; + /** @example DE */ + iso_3166_1?: string; + /** @example 16 */ + rating?: string; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + "tv-series-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + /** @example Tyrion Lannister */ + character?: string; + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 1406855 + */ + id: number; + /** @example Production */ + known_for_department?: string; + /** @example Duncan Muggoch */ + name?: string; + /** @example Duncan Muggoch */ + original_name?: string; + /** + * @default 0 + * @example 1.592 + */ + popularity: number; + /** @example /ukGjJ62Ejd4cFziald03G34Fsrp.jpg */ + profile_path?: string; + /** @example 5ceab029c3a3682e93217a85 */ + credit_id?: string; + /** @example Production */ + department?: string; + /** @example Producer */ + job?: string; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + "tv-series-episode-groups": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + /** @example */ + description?: string; + /** + * @default 0 + * @example 102 + */ + episode_count: number; + /** + * @default 0 + * @example 9 + */ + group_count: number; + /** @example 5e9077d2e640d600151f32bd */ + id?: string; + /** @example Aired Order */ + name?: string; + network?: { + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }; + /** + * @default 0 + * @example 1 + */ + type: number; + }[]; + /** + * @default 0 + * @example 1399 + */ + id: number; + }; + }; + }; + }; + }; + "tv-series-external-ids": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + /** @example tt0944947 */ + imdb_id?: string; + /** @example /m/0524b41 */ + freebase_mid?: string; + /** @example /en/game_of_thrones */ + freebase_id?: string; + /** + * @default 0 + * @example 121361 + */ + tvdb_id: number; + /** + * @default 0 + * @example 24493 + */ + tvrage_id: number; + /** @example Q23572 */ + wikidata_id?: string; + /** @example GameOfThrones */ + facebook_id?: string; + /** @example gameofthrones */ + instagram_id?: string; + /** @example GameOfThrones */ + twitter_id?: string; + }; + }; + }; + }; + }; + "tv-series-images": { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + backdrops?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 800 + */ + height: number; + iso_639_1?: unknown; + /** @example /hZkgoQYus5vegHoetLkCJzb17zJ.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.622 + */ + vote_average: number; + /** + * @default 0 + * @example 20 + */ + vote_count: number; + /** + * @default 0 + * @example 1422 + */ + width: number; + }[]; + /** + * @default 0 + * @example 550 + */ + id: number; + logos?: { + /** + * @default 0 + * @example 5.203 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 79 + */ + height: number; + /** @example he */ + iso_639_1?: string; + /** @example /c1KLulrIhUqY5fT42nmC5aERGCp.png */ + file_path?: string; + /** + * @default 0 + * @example 5.312 + */ + vote_average: number; + /** + * @default 0 + * @example 1 + */ + vote_count: number; + /** + * @default 0 + * @example 411 + */ + width: number; + }[]; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 900 + */ + height: number; + /** @example pt */ + iso_639_1?: string; + /** @example /r3pPehX4ik8NLYPpbDRAh0YRtMb.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.258 + */ + vote_average: number; + /** + * @default 0 + * @example 6 + */ + vote_count: number; + /** + * @default 0 + * @example 600 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "tv-series-keywords": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** @example based on novel or book */ + name?: string; + /** + * @default 0 + * @example 818 + */ + id: number; + }[]; + }; + }; + }; + }; + }; + "tv-series-latest-id": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default true + * @example false + */ + adult: boolean; + backdrop_path?: unknown; + created_by?: unknown[]; + episode_run_time?: unknown[]; + /** @example */ + first_air_date?: string; + genres?: unknown[]; + /** @example */ + homepage?: string; + /** + * @default 0 + * @example 225491 + */ + id: number; + /** + * @default true + * @example true + */ + in_production: boolean; + languages?: unknown[]; + /** @example 2023-04-21 */ + last_air_date?: string; + last_episode_to_air?: { + /** + * @default 0 + * @example 4398801 + */ + id: number; + /** @example Episode 8 */ + name?: string; + /** @example */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + /** + * @default 0 + * @example 0 + */ + vote_count: number; + /** @example 2023-04-21 */ + air_date?: string; + /** + * @default 0 + * @example 8 + */ + episode_number: number; + /** @example */ + production_code?: string; + runtime?: unknown; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 225491 + */ + show_id: number; + still_path?: unknown; + }; + /** @example 妖怪传 */ + name?: string; + next_episode_to_air?: unknown; + networks?: unknown[]; + /** + * @default 0 + * @example 1 + */ + number_of_episodes: number; + /** + * @default 0 + * @example 1 + */ + number_of_seasons: number; + origin_country?: string[]; + /** @example zh */ + original_language?: string; + /** @example 妖怪传 */ + original_name?: string; + /** @example */ + overview?: string; + /** + * @default 0 + * @example 0 + */ + popularity: number; + poster_path?: unknown; + production_companies?: unknown[]; + production_countries?: unknown[]; + seasons?: { + air_date?: unknown; + /** + * @default 0 + * @example 1 + */ + episode_count: number; + /** + * @default 0 + * @example 338956 + */ + id: number; + /** @example Season 1 */ + name?: string; + /** @example */ + overview?: string; + poster_path?: unknown; + /** + * @default 0 + * @example 1 + */ + season_number: number; + }[]; + spoken_languages?: unknown[]; + /** @example Returning Series */ + status?: string; + /** @example */ + tagline?: string; + /** @example Scripted */ + type?: string; + /** + * @default 0 + * @example 0 + */ + vote_average: number; + /** + * @default 0 + * @example 0 + */ + vote_count: number; + }; + }; + }; + }; + }; + "lists-copy": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example */ + description?: string; + /** + * @default 0 + * @example 0 + */ + favorite_count: number; + /** + * @default 0 + * @example 8257231 + */ + id: number; + /** + * @default 0 + * @example 182 + */ + item_count: number; + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Done */ + name?: string; + poster_path?: unknown; + }[]; + /** + * @default 0 + * @example 96 + */ + total_pages: number; + /** + * @default 0 + * @example 1906 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-recommendations": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /bsNm9z2TJfe0WO3RedPGWQ8mG1X.jpg */ + backdrop_path?: string; + /** + * @default 0 + * @example 1396 + */ + id: number; + /** @example Breaking Bad */ + name?: string; + /** @example en */ + original_language?: string; + /** @example Breaking Bad */ + original_name?: string; + /** @example When Walter White, a New Mexico chemistry teacher, is diagnosed with Stage III cancer and given a prognosis of only two years left to live. He becomes filled with a sense of fearlessness and an unrelenting desire to secure his family's financial future at any cost as he enters the dangerous world of drugs and crime. */ + overview?: string; + /** @example /ggFHVNu6YYI5L9pCfOacjizRGt.jpg */ + poster_path?: string; + /** @example tv */ + media_type?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 292.904 + */ + popularity: number; + /** @example 2008-01-20 */ + first_air_date?: string; + /** + * @default 0 + * @example 8.878 + */ + vote_average: number; + /** + * @default 0 + * @example 11544 + */ + vote_count: number; + origin_country?: string[]; + }[]; + /** + * @default 0 + * @example 2 + */ + total_pages: number; + /** + * @default 0 + * @example 40 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-reviews": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** @example lmao7 */ + author?: string; + author_details?: { + /** @example lmao7 */ + name?: string; + /** @example lmao7 */ + username?: string; + /** @example /ekmYOUU4tfx9zGGadjRdE7UPce.jpg */ + avatar_path?: string; + /** + * @default 0 + * @example 9 + */ + rating: number; + }; + /** + * @example I started watching when it came out as I heard that fans of LOTR also liked this. I stopped watching after Season 1 as I was devastated lol kinda. Only 2015 I decided to continue watching and got addicted like it seemed complicated at first, too many stories and characters. I even used a guide from internet like family tree per house while watching or GOT wiki so I can have more background on the characters. For a TV series, this show can really take you to a different world and never knowing what will happen. It is very daring that any time anybody can just die (I learned not to be attached and have accepted that they will all die so I won't be devastated hehe). I have never read the books but the show is entertaining and you will really root for your faves and really hate on those you hate. + * + * Fantasy, action, drama, comedy, love...and lots of surprises! + */ + content?: string; + /** @example 2017-02-20T05:47:28.872Z */ + created_at?: string; + /** @example 58aa82f09251416f92006a3a */ + id?: string; + /** @example 2021-06-23T15:57:54.649Z */ + updated_at?: string; + /** @example https://www.themoviedb.org/review/58aa82f09251416f92006a3a */ + url?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + total_pages: number; + /** + * @default 0 + * @example 11 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-screened-theatrically": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** + * @default 0 + * @example 1159054 + */ + id: number; + /** + * @default 0 + * @example 10 + */ + episode_number: number; + /** + * @default 0 + * @example 5 + */ + season_number: number; + }[]; + }; + }; + }; + }; + }; + "tv-series-similar": { + parameters: { + query?: { + language?: string; + page?: number; + }; + header?: never; + path: { + series_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + page: number; + results?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** @example /zcFSvWa34nDn2NcqOPuthyOIBWT.jpg */ + backdrop_path?: string; + genre_ids?: number[]; + /** + * @default 0 + * @example 197063 + */ + id: number; + origin_country?: string[]; + /** @example ko */ + original_language?: string; + /** @example 종이달 */ + original_name?: string; + /** @example A thriller drama about Yoo I-hwa, a stay-at-home mom living her comfortable and contented life without desires, but to her husband's indifference. While working as a bank contract employee, she unexpectedly touches money from VIP clients and gradually falls into an irreversible collapse. */ + overview?: string; + /** + * @default 0 + * @example 12.299 + */ + popularity: number; + /** @example /xXWynVdMGyJXBUDvIN27AXM3iJJ.jpg */ + poster_path?: string; + /** @example 2023-04-10 */ + first_air_date?: string; + /** @example Pale Moon */ + name?: string; + /** + * @default 0 + * @example 7 + */ + vote_average: number; + /** + * @default 0 + * @example 2 + */ + vote_count: number; + }[]; + /** + * @default 0 + * @example 82 + */ + total_pages: number; + /** + * @default 0 + * @example 1639 + */ + total_results: number; + }; + }; + }; + }; + }; + "tv-series-translations": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example صراع العروش */ + name?: string; + /** @example تتقاتل سبع عائلات نبيلة من أجل السيطرة على أرض - ويستيروس - الأسطورية. الاحتكاك بين العوائل يؤدي إلى حرب واسعة النطاق. في حين يستيقظ الشر القديم في أقصى الشمال. وفي خضم الحرب، نظام عسكري مهمَل - حرس الليل - هم كل ما يقف بين عالم الإنسان والأهوال الجليدية. */ + overview?: string; + /** @example */ + homepage?: string; + /** @example الشتاء قادم */ + tagline?: string; + }; + }[]; + }; + }; + }; + }; + }; + "tv-series-videos": { + parameters: { + query?: { + /** @description filter the list results by language, supports more than one value by using a comma */ + include_video_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Inside Game of Thrones: A Story in Camera Work – BTS (HBO) */ + name?: string; + /** @example y2ZJ3lTaREY */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 1080 + */ + size: number; + /** @example Behind the Scenes */ + type?: string; + /** + * @default true + * @example true + */ + official: boolean; + /** @example 2019-03-25T14:00:06.000Z */ + published_at?: string; + /** @example 5c999b48c3a36863b73b9d42 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + "tv-series-watch-providers": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1399 + */ + id: number; + results?: { + AE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AE */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + AR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + AT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AT */ + link?: string; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /y0kyIFElN5sJAsmW8Txj69wzrD2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 321 + */ + provider_id: number; + /** @example Sky X */ + provider_name?: string; + /** + * @default 0 + * @example 23 + */ + display_priority: number; + }[]; + }; + AU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AU */ + link?: string; + flatrate?: { + /** @example /d3ixI1no0EpTj2i7u0Sd2DBXVlG.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 385 + */ + provider_id: number; + /** @example BINGE */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + BA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BA */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + BB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BB */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + BE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BE */ + link?: string; + flatrate?: { + /** @example /pq8p1umEnJjdFAP1nFvNArTR61X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 311 + */ + provider_id: number; + /** @example Be TV Go */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + BG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BG */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + }; + BO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + BR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + BS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BS */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + CA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CA */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /gJ3yVMWouaVj6iHd59TISJ1TlM5.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 230 + */ + provider_id: number; + /** @example Crave */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CH */ + link?: string; + flatrate?: { + /** @example /sHP8XLo4Ac4WMbziRyAdRQdb76q.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 210 + */ + provider_id: number; + /** @example Sky */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + buy?: { + /** @example /tbEdFQDwx5LEVr8WpSeXQSIirVq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + CI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CI */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + CL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CL */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + CO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + CR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CZ */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + DE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DE */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /MiVcYLkztM6qqLeVSYWHFCUcXx.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 30 + */ + provider_id: number; + /** @example WOW */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + DK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + DO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + DZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DZ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + EC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EC */ + link?: string; + flatrate?: { + /** @example /cDzkhgvozSr4GW2aRdV22uDuFpw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 339 + */ + provider_id: number; + /** @example Movistar Play */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + EG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EG */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + ES?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ES */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + FI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FI */ + link?: string; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + FR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FR */ + link?: string; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /loOaayvNiLnD0zKl70TO2L5vlAL.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1870 + */ + provider_id: number; + /** @example Pass Warner Amazon Channel */ + provider_name?: string; + /** + * @default 0 + * @example 95 + */ + display_priority: number; + }[]; + }; + GB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GB */ + link?: string; + flatrate?: { + /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + GF?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GF */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + GH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GH */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + GQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GQ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + GT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + HK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HK */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 40 + */ + display_priority: number; + }[]; + }; + HN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HN */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + HR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HR */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 34 + */ + display_priority: number; + }[]; + }; + HU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HU */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + ID?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ID */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 14 + */ + display_priority: number; + }[]; + }; + IE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IE */ + link?: string; + flatrate?: { + /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /2pCbao1J9s0DMak2KKnEzmzHni8.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 130 + */ + provider_id: number; + /** @example Sky Store */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + IL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IL */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + IQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IQ */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + IT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IT */ + link?: string; + buy?: { + /** @example /cksgBjTHV3rzAVaO2zUyS1mH4Ke.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 40 + */ + provider_id: number; + /** @example Chili */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /fBHHXKC34ffxAsQvDe0ZJbvmTEQ.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + JM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JM */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + JP?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JP */ + link?: string; + flatrate?: { + /** @example /npg1OiBidQSndMsBZwgEPOYU6Jq.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 84 + */ + provider_id: number; + /** @example U-NEXT */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + rent?: { + /** @example /5NyLm42TmCqCMOZFvH4fcoSNKEW.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + KE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KE */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + KR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KR */ + link?: string; + flatrate?: { + /** @example /2ioan5BX5L9tz4fIGU93blTeFhv.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 356 + */ + provider_id: number; + /** @example wavve */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + LB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LB */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + LT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LT */ + link?: string; + flatrate?: { + /** @example /xTVM8uXT9QocigQ07LE7Irc65W2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 553 + */ + provider_id: number; + /** @example Telia Play */ + provider_name?: string; + /** + * @default 0 + * @example 15 + */ + display_priority: number; + }[]; + }; + LY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LY */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + MD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MD */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + MK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + MU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MU */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + MX?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MX */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + MY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MY */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 14 + */ + display_priority: number; + }[]; + }; + MZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MZ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + NE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NE */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + NG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NG */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + NL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NL */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 47 + */ + display_priority: number; + }[]; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + NO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + NZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NZ */ + link?: string; + flatrate?: { + /** @example /od4YNSSLgOP3p8EtQTnEYfrPa77.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 273 + */ + provider_id: number; + /** @example Neon TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + PA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PA */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + PE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PE */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + PH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PH */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + PL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PL */ + link?: string; + flatrate?: { + /** @example /l5Wxbsgral716BOtZsGyPVNn8GC.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 250 + */ + provider_id: number; + /** @example Horizon */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + rent?: { + /** @example /bZNXgd8fwVTD68aAGlElkpAtu7b.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 549 + */ + provider_id: number; + /** @example IPLA */ + provider_name?: string; + /** + * @default 0 + * @example 17 + */ + display_priority: number; + }[]; + }; + PS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PS */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + PT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + PY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PY */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + RO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RO */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 17 + */ + display_priority: number; + }[]; + }; + RS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RS */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + RU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RU */ + link?: string; + flatrate?: { + /** @example /w1T8s7FqakcfucR8cgOvbe6UeXN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 115 + */ + provider_id: number; + /** @example Okko */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + ads?: { + /** @example /3jJtMOIwtvcrCyeRMUvv4wsfhJk.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 577 + */ + provider_id: number; + /** @example TvIgle */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + SA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SA */ + link?: string; + flatrate?: { + /** @example /xEPXbwbfABzPrUTWbgtDFH1NOa.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + SC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SC */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + SE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SE */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /shq88b09gTBYC4hA7K7MUL8Q4zP.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 68 + */ + provider_id: number; + /** @example Microsoft Store */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + SG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SG */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + SI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SI */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + SK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SK */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 37 + */ + display_priority: number; + }[]; + }; + SN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SN */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + SV?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SV */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + TH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TH */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + TR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TR */ + link?: string; + flatrate?: { + /** @example /z3XAGCCbDD3KTZFvc96Ytr3XR56.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 341 + */ + provider_id: number; + /** @example blutv */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + }; + TT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TT */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + TW?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TW */ + link?: string; + flatrate?: { + /** @example /bxdNcDbk1ohVeOMmM3eusAAiTLw.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 425 + */ + provider_id: number; + /** @example HBO Go */ + provider_name?: string; + /** + * @default 0 + * @example 40 + */ + display_priority: number; + }[]; + }; + TZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TZ */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + UG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UG */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + US?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=US */ + link?: string; + free?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + buy?: { + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + UY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UY */ + link?: string; + flatrate?: { + /** @example /kV8XFGI5OLJKl72dI8DtnKplfFr.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 467 + */ + provider_id: number; + /** @example DIRECTV GO */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + VE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=VE */ + link?: string; + flatrate?: { + /** @example /Ajqyt5aNxNGjmF9uOfxArGrdf3X.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 384 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + ZA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZA */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + ZM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZM */ + link?: string; + flatrate?: { + /** @example /okiQZMXnqwv0aD3QDYmu5DBNLce.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + }; + }; + }; + }; + }; + }; + "tv-series-add-rating": { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header: { + "Content-Type": string; + }; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + "tv-series-delete-rating": { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header?: { + "Content-Type"?: string; + }; + path: { + series_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + "tv-season-details": { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example 5256c89f19c2956ff6046d47 */ + _id?: string; + /** @example 2011-04-17 */ + air_date?: string; + episodes?: { + /** @example 2011-04-17 */ + air_date?: string; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + /** @example standard */ + episode_type?: string; + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example Winter Is Coming */ + name?: string; + /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ + overview?: string; + /** @example 101 */ + production_code?: string; + /** + * @default 0 + * @example 62 + */ + runtime: number; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 1399 + */ + show_id: number; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + still_path?: string; + /** + * @default 0 + * @example 8.1 + */ + vote_average: number; + /** + * @default 0 + * @example 396 + */ + vote_count: number; + crew?: { + /** @example Directing */ + department?: string; + /** @example Director */ + job?: string; + /** @example 5256c8a219c2956ff6046e77 */ + credit_id?: string; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 44797 + */ + id: number; + /** @example Directing */ + known_for_department?: string; + /** @example Tim Van Patten */ + name?: string; + /** @example Tim Van Patten */ + original_name?: string; + /** + * @default 0 + * @example 0.8004 + */ + popularity: number; + /** @example /vwcARZBg4PEzOwnPsXdjRWeUVrZ.jpg */ + profile_path?: string; + }[]; + guest_stars?: { + /** @example Benjen Stark */ + character?: string; + /** @example 5256c8b919c2956ff604836a */ + credit_id?: string; + /** + * @default 0 + * @example 61 + */ + order: number; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 119783 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Joseph Mawle */ + name?: string; + /** @example Joseph Mawle */ + original_name?: string; + /** + * @default 0 + * @example 0.8932 + */ + popularity: number; + /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ + profile_path?: string; + }[]; + }[]; + /** @example Season 1 */ + name?: string; + networks?: { + /** + * @default 0 + * @example 49 + */ + id: number; + /** @example /tuomPhY2UtuPTqqFnKMVHvSb724.png */ + logo_path?: string; + /** @example HBO */ + name?: string; + /** @example US */ + origin_country?: string; + }[]; + /** @example Trouble is brewing in the Seven Kingdoms of Westeros. For the driven inhabitants of this visionary world, control of Westeros' Iron Throne holds the lure of great power. But in a land where the seasons can last a lifetime, winter is coming...and beyond the Great Wall that protects them, an ancient evil has returned. In Season One, the story centers on three primary areas: the Stark and the Lannister families, whose designs on controlling the throne threaten a tenuous peace; the dragon princess Daenerys, heir to the former dynasty, who waits just over the Narrow Sea with her malevolent brother Viserys; and the Great Wall--a massive barrier of ice where a forgotten danger is stirring. */ + overview?: string; + /** + * @default 0 + * @example 3624 + */ + id: number; + /** @example /wgfKiqzuMrFIkU1M68DDDY8kGC1.jpg */ + poster_path?: string; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** + * @default 0 + * @example 8.4 + */ + vote_average: number; + }; + }; + }; + }; + }; + "tv-season-account-states": { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + /** + * @default 0 + * @example 63056 + */ + id: number; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + }[]; + }; + }; + }; + }; + }; + "tv-season-aggregate-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + roles?: { + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** @example Tyrion Lannister */ + character?: string; + /** + * @default 0 + * @example 10 + */ + episode_count: number; + }[]; + /** + * @default 0 + * @example 10 + */ + total_episode_count: number; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 1 + */ + gender: number; + /** + * @default 0 + * @example 9153 + */ + id: number; + /** @example Art */ + known_for_department?: string; + /** @example Gemma Jackson */ + name?: string; + /** @example Gemma Jackson */ + original_name?: string; + /** + * @default 0 + * @example 0.995 + */ + popularity: number; + profile_path?: unknown; + jobs?: { + /** @example 54eee8b8c3a3686d5e005430 */ + credit_id?: string; + /** @example Production Design */ + job?: string; + /** + * @default 0 + * @example 10 + */ + episode_count: number; + }[]; + /** @example Art */ + department?: string; + /** + * @default 0 + * @example 10 + */ + total_episode_count: number; + }[]; + /** + * @default 0 + * @example 3624 + */ + id: number; + }; + }; + }; + }; + }; + "tv-season-changes-by-id": { + parameters: { + query?: { + end_date?: string; + page?: number; + start_date?: string; + }; + header?: never; + path: { + season_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + changes?: { + /** @example episode */ + key?: string; + items?: { + /** @example 5717c8c69251414cfd00250f */ + id?: string; + /** @example updated */ + action?: string; + /** @example 2016-04-20 18:21:58 UTC */ + time?: string; + value?: { + /** + * @default 0 + * @example 63056 + */ + episode_id: number; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + }; + }[]; + }[]; + }; + }; + }; + }; + }; + "tv-season-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + /** @example Tyrion Lannister */ + character?: string; + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 0 + */ + gender: number; + /** + * @default 0 + * @example 1223796 + */ + id: number; + /** @example Production */ + known_for_department?: string; + /** @example Frank Doelger */ + name?: string; + /** @example Frank Doelger */ + original_name?: string; + /** + * @default 0 + * @example 0.694 + */ + popularity: number; + profile_path?: unknown; + /** @example 5256c8c419c2956ff604867c */ + credit_id?: string; + /** @example Production */ + department?: string; + /** @example Producer */ + job?: string; + }[]; + /** + * @default 0 + * @example 3624 + */ + id: number; + }; + }; + }; + }; + }; + "tv-season-external-ids": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 3624 + */ + id: number; + /** @example /m/0gmd1gd */ + freebase_mid?: string; + /** @example /m/0gmd1gd */ + freebase_id?: string; + /** + * @default 0 + * @example 364731 + */ + tvdb_id: number; + tvrage_id?: unknown; + /** @example Q1658029 */ + wikidata_id?: string; + }; + }; + }; + }; + }; + "tv-season-images": { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 3624 + */ + id: number; + posters?: { + /** + * @default 0 + * @example 0.667 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 1500 + */ + height: number; + /** @example en */ + iso_639_1?: string; + /** @example /wgfKiqzuMrFIkU1M68DDDY8kGC1.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.514 + */ + vote_average: number; + /** + * @default 0 + * @example 18 + */ + vote_count: number; + /** + * @default 0 + * @example 1000 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "tv-season-translations": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 3624 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + name?: string; + /** @example سلسلة درامية مبنية على سلسلة روايات لـ جورج آر آر مارتن بعنوان "إيه سونغ أوف آيس أن فاير" والتي حققت مبيعات كبيرة وتتمحور حول الصراعات التي كانت تحدث في العصور الوسطى بين العائلات النبيلة للسيطرة على عرش وستيروس. */ + overview?: string; + }; + }[]; + }; + }; + }; + }; + }; + "tv-season-videos": { + parameters: { + query?: { + /** @description filter the list results by language, supports more than one value by using a comma */ + include_video_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Game Of Thrones - Season 1 Recap - Official HBO UK */ + name?: string; + /** @example e0Y8KpQpW8c */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 1080 + */ + size: number; + /** @example Recap */ + type?: string; + /** + * @default true + * @example true + */ + official: boolean; + /** @example 2015-05-19T16:31:23.000Z */ + published_at?: string; + /** @example 5ce71a920e0a265ac0cfe497 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + "tv-season-watch-providers": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + AD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AD */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 24 + */ + display_priority: number; + }[]; + }; + AE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AE */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + AG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AG */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + AR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AR */ + link?: string; + flatrate?: { + /** @example /nr5UBW4IGKgBwmhpTMOfcvnX2vX.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 467 + */ + provider_id: number; + /** @example DIRECTV GO */ + provider_name?: string; + /** + * @default 0 + * @example 12 + */ + display_priority: number; + }[]; + }; + AT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AT */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /kAZkQcIxMxTmlwdgSB05fqtymp0.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + }; + AU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=AU */ + link?: string; + flatrate?: { + /** @example /fejdSG7TwNQ5E0p6u7A6LVs280R.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 134 + */ + provider_id: number; + /** @example Foxtel Now */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + BA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BA */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + BB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BB */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 23 + */ + display_priority: number; + }[]; + }; + BE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BE */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 33 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /kwftIxtjuCAROIcdd53UEjzSmca.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1857 + */ + provider_id: number; + /** @example Telenet */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + BG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BG */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 21 + */ + display_priority: number; + }[]; + }; + BH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BH */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + BO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + BR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + BS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BS */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 24 + */ + display_priority: number; + }[]; + }; + BZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=BZ */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + CA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CA */ + link?: string; + flatrate?: { + /** @example /ewOptMVIYcOadMGGJz8DJueH2bH.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 230 + */ + provider_id: number; + /** @example Crave */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + CH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CH */ + link?: string; + buy?: { + /** @example /8z7rC8uIDaTM91X0ZfkRf04ydj2.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 3 + */ + provider_id: number; + /** @example Google Play Movies */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /ytApMa9fThUQUFTn696AeNBrB8f.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 210 + */ + provider_id: number; + /** @example Sky */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + CI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CI */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 19 + */ + display_priority: number; + }[]; + }; + CL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CL */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + CM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CM */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + CO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + CR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + CZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=CZ */ + link?: string; + flatrate?: { + /** @example /489t5n9o1KhH7voGNQkrXT7vBKV.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1939 + */ + provider_id: number; + /** @example Lepsi TV */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + DE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DE */ + link?: string; + flatrate?: { + /** @example /kAZkQcIxMxTmlwdgSB05fqtymp0.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 29 + */ + provider_id: number; + /** @example Sky Go */ + provider_name?: string; + /** + * @default 0 + * @example 8 + */ + display_priority: number; + }[]; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + DK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 39 + */ + display_priority: number; + }[]; + }; + DO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=DO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + EC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EC */ + link?: string; + flatrate?: { + /** @example /tRNA2CRgA4XHvd7Mx9dH3sFtDVb.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 339 + */ + provider_id: number; + /** @example MovistarTV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + EG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=EG */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 20 + */ + display_priority: number; + }[]; + }; + ES?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ES */ + link?: string; + flatrate?: { + /** @example /f6TRLB3H4jDpFEZ0z2KWSSvu1SB.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 149 + */ + provider_id: number; + /** @example Movistar Plus+ Ficción Total */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + FI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FI */ + link?: string; + flatrate?: { + /** @example /eglAxQEXSO13p6gNf3HKymrIu7y.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 540 + */ + provider_id: number; + /** @example Elisa Viihde */ + provider_name?: string; + /** + * @default 0 + * @example 18 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 54 + */ + display_priority: number; + }[]; + }; + FR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=FR */ + link?: string; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 78 + */ + display_priority: number; + }[]; + }; + GB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GB */ + link?: string; + buy?: { + /** @example /oMYZg3cGAGp9ecKGlBgumcjDmnN.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 39 + */ + provider_id: number; + /** @example Now TV */ + provider_name?: string; + /** + * @default 0 + * @example 43 + */ + display_priority: number; + }[]; + }; + GG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GG */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 84 + */ + display_priority: number; + }[]; + }; + GQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GQ */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + GT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GT */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + GY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=GY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + HK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 38 + */ + display_priority: number; + }[]; + }; + HN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HN */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + HR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 33 + */ + display_priority: number; + }[]; + }; + HU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=HU */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + ID?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ID */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 39 + */ + display_priority: number; + }[]; + }; + IE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IE */ + link?: string; + flatrate?: { + /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 39 + */ + provider_id: number; + /** @example Now TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + buy?: { + /** @example /6AKbY2ayaEuH4zKg2prqoVQ9iaY.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 130 + */ + provider_id: number; + /** @example Sky Store */ + provider_name?: string; + /** + * @default 0 + * @example 9 + */ + display_priority: number; + }[]; + }; + IN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IN */ + link?: string; + flatrate?: { + /** @example /kVqjgpcwvDJOhCupjcLzwwtOp52.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 2336 + */ + provider_id: number; + /** @example JioHotstar */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + IQ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IQ */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + IT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=IT */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 33 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /g0E9h3JAeIwmdvxlT73jiEuxdNj.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 39 + */ + provider_id: number; + /** @example Now TV */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + JM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JM */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 22 + */ + display_priority: number; + }[]; + }; + JO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JO */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + JP?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=JP */ + link?: string; + flatrate?: { + /** @example /a5T7vNaGvoeckYO6rQkHolvyYf4.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 84 + */ + provider_id: number; + /** @example U-NEXT */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + rent?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + KE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=KE */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + LB?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LB */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + LC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=LC */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + MC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MC */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + MD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MD */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 25 + */ + display_priority: number; + }[]; + }; + ME?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ME */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + MG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MG */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + MK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 26 + */ + display_priority: number; + }[]; + }; + ML?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ML */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + MU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MU */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + MX?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MX */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 5 + */ + display_priority: number; + }[]; + }; + MY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + MZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=MZ */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + NE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NE */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 19 + */ + display_priority: number; + }[]; + }; + NG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NG */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 21 + */ + display_priority: number; + }[]; + }; + NI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NI */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 13 + */ + display_priority: number; + }[]; + }; + NL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NL */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 34 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 48 + */ + display_priority: number; + }[]; + }; + NO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NO */ + link?: string; + flatrate?: { + /** @example /3ZigBD8WTEPcEHAvMWiJGUsv5u4.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 578 + */ + provider_id: number; + /** @example Strim */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + NZ?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=NZ */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 59 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /iscLKFDwQlr0BAgVDBcuRapLiwC.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 273 + */ + provider_id: number; + /** @example Neon TV */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + OM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=OM */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + PA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PA */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + PE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PE */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + PH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PH */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + PL?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PL */ + link?: string; + flatrate?: { + /** @example /jhMNVBV2UocEGepRkr9oFPD7Gpb.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 505 + */ + provider_id: number; + /** @example Player */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + PT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PT */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 43 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 32 + */ + display_priority: number; + }[]; + }; + PY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=PY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + QA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=QA */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + RO?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RO */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 23 + */ + display_priority: number; + }[]; + }; + RS?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RS */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + RU?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=RU */ + link?: string; + flatrate?: { + /** @example /5z8dpQN27kybhn21EVLZcJPpMEo.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 115 + */ + provider_id: number; + /** @example Okko */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + SA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SA */ + link?: string; + flatrate?: { + /** @example /kC6JTo59Gj6I4vJPyBAYGh0sKAE.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 629 + */ + provider_id: number; + /** @example OSN+ */ + provider_name?: string; + /** + * @default 0 + * @example 20 + */ + display_priority: number; + }[]; + }; + SC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SC */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + SE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SE */ + link?: string; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 39 + */ + display_priority: number; + }[]; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 44 + */ + display_priority: number; + }[]; + }; + SG?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SG */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 31 + */ + display_priority: number; + }[]; + }; + SI?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SI */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 28 + */ + display_priority: number; + }[]; + }; + SK?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SK */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 37 + */ + display_priority: number; + }[]; + }; + SN?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SN */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + SV?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=SV */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + TC?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TC */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 10 + */ + display_priority: number; + }[]; + }; + TD?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TD */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + TH?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TH */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 30 + */ + display_priority: number; + }[]; + }; + TR?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TR */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 29 + */ + display_priority: number; + }[]; + }; + TT?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TT */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + }; + TW?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=TW */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 38 + */ + display_priority: number; + }[]; + }; + US?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=US */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 11 + */ + display_priority: number; + }[]; + buy?: { + /** @example /seGSXajazLMCKGB5hnRCidtjay1.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 10 + */ + provider_id: number; + /** @example Amazon Video */ + provider_name?: string; + /** + * @default 0 + * @example 6 + */ + display_priority: number; + }[]; + }; + UY?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=UY */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 3 + */ + display_priority: number; + }[]; + }; + VE?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=VE */ + link?: string; + flatrate?: { + /** @example /jbe4gVSfRlbPTdESXhEKpornsfu.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 1899 + */ + provider_id: number; + /** @example HBO Max */ + provider_name?: string; + /** + * @default 0 + * @example 27 + */ + display_priority: number; + }[]; + }; + ZA?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZA */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 4 + */ + display_priority: number; + }[]; + }; + ZM?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZM */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 7 + */ + display_priority: number; + }[]; + }; + ZW?: { + /** @example https://www.themoviedb.org/tv/1399-game-of-thrones/watch?locale=ZW */ + link?: string; + flatrate?: { + /** @example /ilR8XFZOr3e3wETQ4ZXLjXQXrts.jpg */ + logo_path?: string; + /** + * @default 0 + * @example 55 + */ + provider_id: number; + /** @example ShowMax */ + provider_name?: string; + /** + * @default 0 + * @example 0 + */ + display_priority: number; + }[]; + }; + }; + }; + }; + }; + }; + }; + "tv-episode-details": { + parameters: { + query?: { + /** @description comma separated list of endpoints within this namespace, 20 items max */ + append_to_response?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example 2011-04-17 */ + air_date?: string; + crew?: { + /** @example Directing */ + department?: string; + /** @example Director */ + job?: string; + /** @example 5256c8a219c2956ff6046e77 */ + credit_id?: string; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 44797 + */ + id: number; + /** @example Directing */ + known_for_department?: string; + /** @example Timothy Van Patten */ + name?: string; + /** @example Timothy Van Patten */ + original_name?: string; + /** + * @default 0 + * @example 7.775 + */ + popularity: number; + /** @example /MzSOFrd99HRdr6pkSRSctk3kBR.jpg */ + profile_path?: string; + }[]; + /** + * @default 0 + * @example 1 + */ + episode_number: number; + guest_stars?: { + /** @example Benjen Stark */ + character?: string; + /** @example 5256c8b919c2956ff604836a */ + credit_id?: string; + /** + * @default 0 + * @example 62 + */ + order: number; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 119783 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Joseph Mawle */ + name?: string; + /** @example Joseph Mawle */ + original_name?: string; + /** + * @default 0 + * @example 6.758 + */ + popularity: number; + /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ + profile_path?: string; + }[]; + /** @example Winter Is Coming */ + name?: string; + /** @example Jon Arryn, the Hand of the King, is dead. King Robert Baratheon plans to ask his oldest friend, Eddard Stark, to take Jon's place. Across the sea, Viserys Targaryen plans to wed his sister to a nomadic warlord in exchange for an army. */ + overview?: string; + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example 101 */ + production_code?: string; + /** + * @default 0 + * @example 62 + */ + runtime: number; + /** + * @default 0 + * @example 1 + */ + season_number: number; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.8 + */ + vote_average: number; + /** + * @default 0 + * @example 286 + */ + vote_count: number; + }; + }; + }; + }; + }; + "tv-episode-account-states": { + parameters: { + query?: { + session_id?: string; + guest_session_id?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 550 + */ + id: number; + /** + * @default true + * @example true + */ + favorite: boolean; + rated?: { + /** + * @default 0 + * @example 9 + */ + value: number; + }; + /** + * @default true + * @example false + */ + watchlist: boolean; + }; + }; + }; + }; + }; + "tv-episode-changes-by-id": { + parameters: { + query?: never; + header?: never; + path: { + episode_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + changes?: { + /** @example production_code */ + key?: string; + items?: { + /** @example 54bd9ed7c3a3686c6b00da66 */ + id?: string; + /** @example added */ + action?: string; + /** @example 2015-01-20 00:18:31 UTC */ + time?: string; + /** @example 101 */ + value?: string; + }[]; + }[]; + }; + }; + }; + }; + }; + "tv-episode-credits": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + cast?: { + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 22970 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Peter Dinklage */ + name?: string; + /** @example Peter Dinklage */ + original_name?: string; + /** + * @default 0 + * @example 30.6 + */ + popularity: number; + /** @example /lRsRgnksAhBRXwAB68MFjmTtLrk.jpg */ + profile_path?: string; + /** @example Tyrion Lannister */ + character?: string; + /** @example 5256c8b219c2956ff6047cd8 */ + credit_id?: string; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + crew?: { + /** @example Directing */ + department?: string; + /** @example Director */ + job?: string; + /** @example 5256c8a219c2956ff6046e77 */ + credit_id?: string; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 44797 + */ + id: number; + /** @example Directing */ + known_for_department?: string; + /** @example Timothy Van Patten */ + name?: string; + /** @example Timothy Van Patten */ + original_name?: string; + /** + * @default 0 + * @example 8.292 + */ + popularity: number; + /** @example /MzSOFrd99HRdr6pkSRSctk3kBR.jpg */ + profile_path?: string; + }[]; + guest_stars?: { + /** @example Benjen Stark */ + character?: string; + /** @example 5256c8b919c2956ff604836a */ + credit_id?: string; + /** + * @default 0 + * @example 62 + */ + order: number; + /** + * @default true + * @example false + */ + adult: boolean; + /** + * @default 0 + * @example 2 + */ + gender: number; + /** + * @default 0 + * @example 119783 + */ + id: number; + /** @example Acting */ + known_for_department?: string; + /** @example Joseph Mawle */ + name?: string; + /** @example Joseph Mawle */ + original_name?: string; + /** + * @default 0 + * @example 8.559 + */ + popularity: number; + /** @example /1Ocb9v3h54beGVoJMm4w50UQhLf.jpg */ + profile_path?: string; + }[]; + /** + * @default 0 + * @example 63056 + */ + id: number; + }; + }; + }; + }; + }; + "tv-episode-external-ids": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 63056 + */ + id: number; + /** @example tt1480055 */ + imdb_id?: string; + /** @example /m/0gmc6ph */ + freebase_mid?: string; + /** @example /en/winter_is_coming */ + freebase_id?: string; + /** + * @default 0 + * @example 3254641 + */ + tvdb_id: number; + /** + * @default 0 + * @example 1065008299 + */ + tvrage_id: number; + /** @example Q2614622 */ + wikidata_id?: string; + }; + }; + }; + }; + }; + "tv-episode-images": { + parameters: { + query?: { + /** @description specify a comma separated list of ISO-639-1 values to query, for example: `en-US,null` */ + include_image_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 63056 + */ + id: number; + stills?: { + /** + * @default 0 + * @example 1.778 + */ + aspect_ratio: number; + /** + * @default 0 + * @example 1080 + */ + height: number; + iso_639_1?: unknown; + /** @example /9hGF3WUkBf7cSjMg0cdMDHJkByd.jpg */ + file_path?: string; + /** + * @default 0 + * @example 5.454 + */ + vote_average: number; + /** + * @default 0 + * @example 3 + */ + vote_count: number; + /** + * @default 0 + * @example 1920 + */ + width: number; + }[]; + }; + }; + }; + }; + }; + "tv-episode-translations": { + parameters: { + query?: never; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 63056 + */ + id: number; + translations?: { + /** @example SA */ + iso_3166_1?: string; + /** @example ar */ + iso_639_1?: string; + /** @example العربية */ + name?: string; + /** @example Arabic */ + english_name?: string; + data?: { + /** @example */ + name?: string; + /** @example خلف باب واسع من الجليد في شمالي وستيروس هناك شيء يحدث. تتلقى عائلة ستارك التي من وينترفيل زيارة من العائلة المالكة، بينما يشكل أمير عائلة تارغارين المنفي تحالفاً جديداً للسيطرة على العرش من جديد. */ + overview?: string; + }; + }[]; + }; + }; + }; + }; + }; + "tv-episode-videos": { + parameters: { + query?: { + /** @description filter the list results by language, supports more than one value by using a comma */ + include_video_language?: string; + language?: string; + }; + header?: never; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 3624 + */ + id: number; + results?: { + /** @example en */ + iso_639_1?: string; + /** @example US */ + iso_3166_1?: string; + /** @example Game Of Thrones - Season 1 Recap - Official HBO UK */ + name?: string; + /** @example e0Y8KpQpW8c */ + key?: string; + /** @example YouTube */ + site?: string; + /** + * @default 0 + * @example 1080 + */ + size: number; + /** @example Recap */ + type?: string; + /** + * @default true + * @example true + */ + official: boolean; + /** @example 2015-05-19T16:31:23.000Z */ + published_at?: string; + /** @example 5ce71a920e0a265ac0cfe497 */ + id?: string; + }[]; + }; + }; + }; + }; + }; + "tv-episode-add-rating": { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header: { + "Content-Type": string; + }; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + /** Format: json */ + RAW_BODY: string; + }; + }; + }; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 1 + */ + status_code: number; + /** @example Success. */ + status_message?: string; + }; + }; + }; + }; + }; + "tv-episode-delete-rating": { + parameters: { + query?: { + guest_session_id?: string; + session_id?: string; + }; + header?: { + "Content-Type"?: string; + }; + path: { + series_id: number; + season_number: number; + episode_number: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** + * @default 0 + * @example 13 + */ + status_code: number; + /** @example The item/record was deleted successfully. */ + status_message?: string; + }; + }; + }; + }; + }; + "tv-episode-group-details": { + parameters: { + query?: never; + header?: never; + path: { + tv_episode_group_id: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + /** @example Comedians in Cars organized in Netflix's collections. */ + description?: string; + /** + * @default 0 + * @example 83 + */ + episode_count: number; + /** + * @default 0 + * @example 6 + */ + group_count: number; + groups?: { + /** @example 5acf93efc3a368739a0000a9 */ + id?: string; + /** @example First Cup */ + name?: string; + /** + * @default 0 + * @example 1 + */ + order: number; + episodes?: { + /** @example 2015-06-17 */ + air_date?: string; + /** + * @default 0 + * @example 3 + */ + episode_number: number; + /** + * @default 0 + * @example 1078262 + */ + id: number; + /** @example Jim Carrey: We Love Breathing What You're Burning, Baby */ + name?: string; + /** @example Jerry’s full of testosterone as he steps into a ‘76 Lamborghini Countach with Jim Carrey, who’s between a three-week cleanse and a five-day silent retreat. After coffee, it’s off to Carrey’s studio to study a portrait of a gorilla with a machine gun. Wow. */ + overview?: string; + /** @example */ + production_code?: string; + runtime?: unknown; + /** + * @default 0 + * @example 6 + */ + season_number: number; + /** + * @default 0 + * @example 59717 + */ + show_id: number; + /** @example /aOyE420zuFq9zWtEWjIccAiTrzU.jpg */ + still_path?: string; + /** + * @default 0 + * @example 7.4 + */ + vote_average: number; + /** + * @default 0 + * @example 5 + */ + vote_count: number; + /** + * @default 0 + * @example 0 + */ + order: number; + }[]; + /** + * @default true + * @example true + */ + locked: boolean; + }[]; + /** @example 5acf93e60e0a26346d0000ce */ + id?: string; + /** @example Netflix Collections */ + name?: string; + network?: { + /** + * @default 0 + * @example 213 + */ + id: number; + /** @example /wwemzKWzjKYJFfCeiB57q3r4Bcm.png */ + logo_path?: string; + /** @example Netflix */ + name?: string; + /** @example */ + origin_country?: string; + }; + /** + * @default 0 + * @example 4 + */ + type: number; + }; + }; + }; + }; + }; + "watch-providers-available-regions": { + parameters: { + query?: { + language?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + /** @example AD */ + iso_3166_1?: string; + /** @example Andorra */ + english_name?: string; + /** @example Andorra */ + native_name?: string; + }[]; + }; + }; + }; + }; + }; + "watch-providers-movie-list": { + parameters: { + query?: { + language?: string; + watch_region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + display_priorities?: { + /** + * @default 0 + * @example 6 + */ + CA: number; + /** + * @default 0 + * @example 1 + */ + AE: number; + /** + * @default 0 + * @example 3 + */ + AR: number; + /** + * @default 0 + * @example 4 + */ + AT: number; + /** + * @default 0 + * @example 10 + */ + AU: number; + /** + * @default 0 + * @example 6 + */ + BE: number; + /** + * @default 0 + * @example 6 + */ + BO: number; + /** + * @default 0 + * @example 8 + */ + BR: number; + /** + * @default 0 + * @example 2 + */ + BG: number; + /** + * @default 0 + * @example 4 + */ + CH: number; + /** + * @default 0 + * @example 3 + */ + CL: number; + /** + * @default 0 + * @example 4 + */ + CO: number; + /** + * @default 0 + * @example 5 + */ + CR: number; + /** + * @default 0 + * @example 3 + */ + CZ: number; + /** + * @default 0 + * @example 4 + */ + DE: number; + /** + * @default 0 + * @example 7 + */ + DK: number; + /** + * @default 0 + * @example 7 + */ + EC: number; + /** + * @default 0 + * @example 3 + */ + EE: number; + /** + * @default 0 + * @example 2 + */ + EG: number; + /** + * @default 0 + * @example 4 + */ + ES: number; + /** + * @default 0 + * @example 10 + */ + FI: number; + /** + * @default 0 + * @example 5 + */ + FR: number; + /** + * @default 0 + * @example 5 + */ + GB: number; + /** + * @default 0 + * @example 2 + */ + GR: number; + /** + * @default 0 + * @example 7 + */ + GT: number; + /** + * @default 0 + * @example 5 + */ + HK: number; + /** + * @default 0 + * @example 7 + */ + HN: number; + /** + * @default 0 + * @example 3 + */ + HU: number; + /** + * @default 0 + * @example 4 + */ + ID: number; + /** + * @default 0 + * @example 4 + */ + IE: number; + /** + * @default 0 + * @example 8 + */ + IN: number; + /** + * @default 0 + * @example 4 + */ + IT: number; + /** + * @default 0 + * @example 7 + */ + JP: number; + /** + * @default 0 + * @example 3 + */ + LT: number; + /** + * @default 0 + * @example 3 + */ + LV: number; + /** + * @default 0 + * @example 4 + */ + MX: number; + /** + * @default 0 + * @example 4 + */ + MY: number; + /** + * @default 0 + * @example 8 + */ + NL: number; + /** + * @default 0 + * @example 6 + */ + NO: number; + /** + * @default 0 + * @example 4 + */ + NZ: number; + /** + * @default 0 + * @example 3 + */ + PE: number; + /** + * @default 0 + * @example 4 + */ + PH: number; + /** + * @default 0 + * @example 1 + */ + PL: number; + /** + * @default 0 + * @example 4 + */ + PT: number; + /** + * @default 0 + * @example 7 + */ + PY: number; + /** + * @default 0 + * @example 2 + */ + RU: number; + /** + * @default 0 + * @example 1 + */ + SA: number; + /** + * @default 0 + * @example 8 + */ + SE: number; + /** + * @default 0 + * @example 5 + */ + SG: number; + /** + * @default 0 + * @example 3 + */ + SK: number; + /** + * @default 0 + * @example 4 + */ + TH: number; + /** + * @default 0 + * @example 6 + */ + TR: number; + /** + * @default 0 + * @example 7 + */ + TW: number; + /** + * @default 0 + * @example 4 + */ + US: number; + /** + * @default 0 + * @example 4 + */ + VE: number; + /** + * @default 0 + * @example 2 + */ + ZA: number; + /** + * @default 0 + * @example 31 + */ + SI: number; + /** + * @default 0 + * @example 13 + */ + CV: number; + /** + * @default 0 + * @example 17 + */ + GH: number; + /** + * @default 0 + * @example 15 + */ + MU: number; + /** + * @default 0 + * @example 16 + */ + MZ: number; + /** + * @default 0 + * @example 16 + */ + UG: number; + /** + * @default 0 + * @example 28 + */ + IL: number; + }; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + }[]; + }; + }; + }; + }; + }; + "watch-provider-tv-list": { + parameters: { + query?: { + language?: string; + watch_region?: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description 200 */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + results?: { + display_priorities?: { + /** + * @default 0 + * @example 6 + */ + CA: number; + /** + * @default 0 + * @example 1 + */ + AE: number; + /** + * @default 0 + * @example 3 + */ + AR: number; + /** + * @default 0 + * @example 4 + */ + AT: number; + /** + * @default 0 + * @example 10 + */ + AU: number; + /** + * @default 0 + * @example 6 + */ + BE: number; + /** + * @default 0 + * @example 6 + */ + BO: number; + /** + * @default 0 + * @example 8 + */ + BR: number; + /** + * @default 0 + * @example 2 + */ + BG: number; + /** + * @default 0 + * @example 4 + */ + CH: number; + /** + * @default 0 + * @example 3 + */ + CL: number; + /** + * @default 0 + * @example 4 + */ + CO: number; + /** + * @default 0 + * @example 5 + */ + CR: number; + /** + * @default 0 + * @example 3 + */ + CZ: number; + /** + * @default 0 + * @example 4 + */ + DE: number; + /** + * @default 0 + * @example 7 + */ + DK: number; + /** + * @default 0 + * @example 7 + */ + EC: number; + /** + * @default 0 + * @example 3 + */ + EE: number; + /** + * @default 0 + * @example 2 + */ + EG: number; + /** + * @default 0 + * @example 4 + */ + ES: number; + /** + * @default 0 + * @example 10 + */ + FI: number; + /** + * @default 0 + * @example 5 + */ + FR: number; + /** + * @default 0 + * @example 5 + */ + GB: number; + /** + * @default 0 + * @example 2 + */ + GR: number; + /** + * @default 0 + * @example 7 + */ + GT: number; + /** + * @default 0 + * @example 5 + */ + HK: number; + /** + * @default 0 + * @example 7 + */ + HN: number; + /** + * @default 0 + * @example 3 + */ + HU: number; + /** + * @default 0 + * @example 4 + */ + ID: number; + /** + * @default 0 + * @example 4 + */ + IE: number; + /** + * @default 0 + * @example 8 + */ + IN: number; + /** + * @default 0 + * @example 4 + */ + IT: number; + /** + * @default 0 + * @example 7 + */ + JP: number; + /** + * @default 0 + * @example 3 + */ + LT: number; + /** + * @default 0 + * @example 3 + */ + LV: number; + /** + * @default 0 + * @example 4 + */ + MX: number; + /** + * @default 0 + * @example 4 + */ + MY: number; + /** + * @default 0 + * @example 8 + */ + NL: number; + /** + * @default 0 + * @example 6 + */ + NO: number; + /** + * @default 0 + * @example 4 + */ + NZ: number; + /** + * @default 0 + * @example 3 + */ + PE: number; + /** + * @default 0 + * @example 4 + */ + PH: number; + /** + * @default 0 + * @example 1 + */ + PL: number; + /** + * @default 0 + * @example 4 + */ + PT: number; + /** + * @default 0 + * @example 7 + */ + PY: number; + /** + * @default 0 + * @example 2 + */ + RU: number; + /** + * @default 0 + * @example 1 + */ + SA: number; + /** + * @default 0 + * @example 8 + */ + SE: number; + /** + * @default 0 + * @example 5 + */ + SG: number; + /** + * @default 0 + * @example 3 + */ + SK: number; + /** + * @default 0 + * @example 4 + */ + TH: number; + /** + * @default 0 + * @example 6 + */ + TR: number; + /** + * @default 0 + * @example 7 + */ + TW: number; + /** + * @default 0 + * @example 4 + */ + US: number; + /** + * @default 0 + * @example 4 + */ + VE: number; + /** + * @default 0 + * @example 2 + */ + ZA: number; + /** + * @default 0 + * @example 31 + */ + SI: number; + /** + * @default 0 + * @example 13 + */ + CV: number; + /** + * @default 0 + * @example 17 + */ + GH: number; + /** + * @default 0 + * @example 15 + */ + MU: number; + /** + * @default 0 + * @example 16 + */ + MZ: number; + /** + * @default 0 + * @example 16 + */ + UG: number; + /** + * @default 0 + * @example 28 + */ + IL: number; + }; + /** + * @default 0 + * @example 2 + */ + display_priority: number; + /** @example /peURlLlr8jggOwK53fJ5wdQl05y.jpg */ + logo_path?: string; + /** @example Apple TV */ + provider_name?: string; + /** + * @default 0 + * @example 2 + */ + provider_id: number; + }[]; + }; + }; + }; + }; + }; +} diff --git a/packages/tmdb/tsconfig.json b/packages/tmdb/tsconfig.json new file mode 100644 index 0000000..6438538 --- /dev/null +++ b/packages/tmdb/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["esnext"], + "strict": true, + "noEmit": true, + "module": "esnext", + "moduleResolution": "bundler", + "isolatedModules": true, + "skipLibCheck": true, + "types": ["bun"] + }, + "include": ["src"] +} diff --git a/postcss.config.mjs b/postcss.config.mjs deleted file mode 100644 index 61e3684..0000000 --- a/postcss.config.mjs +++ /dev/null @@ -1,7 +0,0 @@ -const config = { - plugins: { - "@tailwindcss/postcss": {}, - }, -}; - -export default config; diff --git a/proxy.ts b/proxy.ts deleted file mode 100644 index 150ff9f..0000000 --- a/proxy.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { getSessionCookie } from "better-auth/cookies"; -import { type NextRequest, NextResponse } from "next/server"; - -export function proxy(request: NextRequest) { - const { pathname } = request.nextUrl; - - // this is ONLY for optimistic redirects, it does not provide any actual security - const sessionCookie = getSessionCookie(request); - - // Special case for root: becomes dashboard if logged in, landing page if not - if (pathname === "/") { - return sessionCookie - ? NextResponse.rewrite(new URL("/dashboard", request.url)) - : NextResponse.next(); - } - - return NextResponse.next(); -} - -export const config = { - matcher: [ - "/((?!api|_next/static|_next/image|favicon.ico|sitemap.xml|robots.txt|manifest.webmanifest|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)", - ], -}; diff --git a/scripts/seed.ts b/scripts/seed.ts deleted file mode 100644 index eaa408c..0000000 --- a/scripts/seed.ts +++ /dev/null @@ -1,674 +0,0 @@ -/** - * Seed script — populates a Sofa instance with realistic demo data. - * - * Usage: - * bun run db:seed # uses defaults - * bun run db:seed --email demo@sofa.watch --password demo1234 --name "Demo User" - * - * Requires: - * - TMDB_API_READ_ACCESS_TOKEN in .env (titles are fetched live from TMDB) - * - BETTER_AUTH_SECRET in .env - * - * What it creates: - * - A demo user account with email/password login - * - ~20 movies + ~6 TV shows imported from TMDB (with full metadata) - * - Realistic watch history spread across the last 6 months - * - Mixed statuses: completed, in-progress, watchlist - * - Star ratings on completed titles - * - Availability, credits, recommendations, colors enriched via TMDB - * - Webhook connections with sample event log entries - * - Cron run history entries - * - App settings configured - */ - -import { parseArgs } from "node:util"; -import { eq } from "drizzle-orm"; -import { auth } from "@/lib/auth/server"; -import { db } from "@/lib/db/client"; -import { runMigrations } from "@/lib/db/migrate"; -import { - appSettings, - cronRuns, - episodes, - integrationEvents, - integrations, - seasons, - user, - userEpisodeWatches, - userMovieWatches, - userRatings, - userTitleStatus, -} from "@/lib/db/schema"; -import { createLogger } from "@/lib/logger"; -import { getOrFetchTitleByTmdbId } from "@/lib/services/metadata"; -import { setSetting } from "@/lib/services/settings"; - -const log = createLogger("seed"); - -// ─── CLI args ─────────────────────────────────────────────────────────────── - -const { values: args } = parseArgs({ - options: { - email: { type: "string", default: "demo@sofa.watch" }, - password: { type: "string", default: "password" }, - name: { type: "string", default: "Demo User" }, - }, - strict: false, -}); - -const DEMO_EMAIL = args.email as string; -const DEMO_PASSWORD = args.password as string; -const DEMO_NAME = args.name as string; - -// ─── Title catalog ────────────────────────────────────────────────────────── - -// Movies — a curated mix of genres, decades, and popularity -const MOVIES: { tmdbId: number; name: string }[] = [ - { tmdbId: 278, name: "The Shawshank Redemption" }, - { tmdbId: 238, name: "The Godfather" }, - { tmdbId: 155, name: "The Dark Knight" }, - { tmdbId: 550, name: "Fight Club" }, - { tmdbId: 680, name: "Pulp Fiction" }, - { tmdbId: 13, name: "Forrest Gump" }, - { tmdbId: 120, name: "The Lord of the Rings: The Fellowship of the Ring" }, - { tmdbId: 603, name: "The Matrix" }, - { tmdbId: 157336, name: "Interstellar" }, - { tmdbId: 569094, name: "Spider-Man: Across the Spider-Verse" }, - { tmdbId: 27205, name: "Inception" }, - { tmdbId: 244786, name: "Whiplash" }, - { tmdbId: 872585, name: "Oppenheimer" }, - { tmdbId: 346698, name: "Barbie" }, - { tmdbId: 438631, name: "Dune" }, - { tmdbId: 496243, name: "Parasite" }, - { tmdbId: 497, name: "The Green Mile" }, - { tmdbId: 11, name: "Star Wars" }, - { tmdbId: 489, name: "Good Will Hunting" }, - { tmdbId: 1184918, name: "The Wild Robot" }, -]; - -// TV Shows — mix of completed series & currently airing -const TV_SHOWS: { tmdbId: number; name: string }[] = [ - { tmdbId: 1396, name: "Breaking Bad" }, - { tmdbId: 1399, name: "Game of Thrones" }, - { tmdbId: 66732, name: "Stranger Things" }, - { tmdbId: 94997, name: "House of the Dragon" }, - { tmdbId: 60574, name: "Peaky Blinders" }, - { tmdbId: 100088, name: "The Last of Us" }, -]; - -// ─── Helpers ──────────────────────────────────────────────────────────────── - -function daysAgo(days: number): Date { - const d = new Date(); - d.setDate(d.getDate() - days); - return d; -} - -function randomBetween(min: number, max: number): number { - return Math.floor(Math.random() * (max - min + 1)) + min; -} - -function delay(ms: number): Promise { - return new Promise((resolve) => setTimeout(resolve, ms)); -} - -// ─── Main ─────────────────────────────────────────────────────────────────── - -async function seed() { - log.info("Starting seed..."); - - // 1. Run migrations to ensure schema is ready - runMigrations(); - - // 2. Create demo user via Better Auth API - log.info(`Creating demo user: ${DEMO_EMAIL}`); - - const existingUser = db - .select() - .from(user) - .where(eq(user.email, DEMO_EMAIL)) - .get(); - - if (existingUser) { - log.warn( - `User ${DEMO_EMAIL} already exists (${existingUser.id}). Using existing user.`, - ); - await seedForUser(existingUser.id); - return; - } - - // Ensure registration is open so signUpEmail succeeds - await setSetting("registrationOpen", "true"); - - const result = await auth.api.signUpEmail({ - body: { - name: DEMO_NAME, - email: DEMO_EMAIL, - password: DEMO_PASSWORD, - }, - }); - - if (!result?.user) { - throw new Error("Failed to create user via Better Auth signUpEmail"); - } - - const userId = result.user.id; - log.info(`User created: ${userId} (role: ${result.user.role})`); - await seedForUser(userId); -} - -async function seedForUser(userId: string) { - // 3. Import all titles from TMDB - log.info("Importing movies from TMDB..."); - const movieTitles: { id: string; tmdbId: number; name: string }[] = []; - for (const movie of MOVIES) { - try { - log.info(` Importing movie: ${movie.name} (TMDB ${movie.tmdbId})`); - const title = await getOrFetchTitleByTmdbId(movie.tmdbId, "movie"); - if (title) { - movieTitles.push({ - id: title.id, - tmdbId: movie.tmdbId, - name: movie.name, - }); - } - // Small delay to respect TMDB rate limits - await delay(300); - } catch (err) { - log.error(` Failed to import ${movie.name}:`, err); - } - } - - log.info("Importing TV shows from TMDB..."); - const tvTitles: { id: string; tmdbId: number; name: string }[] = []; - for (const show of TV_SHOWS) { - try { - log.info(` Importing TV show: ${show.name} (TMDB ${show.tmdbId})`); - const title = await getOrFetchTitleByTmdbId(show.tmdbId, "tv"); - if (title) { - tvTitles.push({ id: title.id, tmdbId: show.tmdbId, name: show.name }); - } - await delay(300); - } catch (err) { - log.error(` Failed to import ${show.name}:`, err); - } - } - - // Wait for all background enrichment tasks to settle - log.info("Waiting for enrichment tasks to complete..."); - await delay(10_000); - - // 4. Create watch history and statuses - log.info("Creating watch history..."); - - // -- Completed movies (watched, rated) -- - const completedMovies = movieTitles.slice(0, 12); - for (let i = 0; i < completedMovies.length; i++) { - const movie = completedMovies[i]; - const watchedAt = daysAgo(randomBetween(7, 170)); - - db.insert(userMovieWatches) - .values({ - userId, - titleId: movie.id, - watchedAt, - source: i < 10 ? "manual" : "plex", - }) - .run(); - - db.insert(userTitleStatus) - .values({ - userId, - titleId: movie.id, - status: "completed", - addedAt: new Date(watchedAt.getTime() - 86400000), // added day before watch - updatedAt: watchedAt, - }) - .onConflictDoNothing() - .run(); - - // Rate most completed movies (mix of 3-5 stars) - const rating = i < 4 ? 5 : i < 8 ? 4 : 3; - db.insert(userRatings) - .values({ - userId, - titleId: movie.id, - ratingStars: rating, - ratedAt: watchedAt, - }) - .onConflictDoNothing() - .run(); - - log.info(` Completed + rated: ${movie.name} (${rating} stars)`); - } - - // Some movies watched multiple times (rewatches) - for (const movie of completedMovies.slice(0, 3)) { - db.insert(userMovieWatches) - .values({ - userId, - titleId: movie.id, - watchedAt: daysAgo(randomBetween(1, 30)), - source: "manual", - }) - .run(); - log.info(` Rewatch: ${movie.name}`); - } - - // -- Watchlist movies (added but not watched) -- - const watchlistMovies = movieTitles.slice(12, 17); - for (const movie of watchlistMovies) { - db.insert(userTitleStatus) - .values({ - userId, - titleId: movie.id, - status: "watchlist", - addedAt: daysAgo(randomBetween(1, 60)), - updatedAt: daysAgo(randomBetween(0, 5)), - }) - .onConflictDoNothing() - .run(); - log.info(` Watchlisted: ${movie.name}`); - } - - // -- Remaining movies: not tracked (visible in search/explore only) -- - for (const movie of movieTitles.slice(17)) { - log.info(` Untracked (discover-only): ${movie.name}`); - } - - // 5. TV show tracking - log.info("Creating TV watch history..."); - - // Breaking Bad — fully completed - const breakingBad = tvTitles.find((t) => t.tmdbId === 1396); - if (breakingBad) { - const allEps = getEpisodesForTitle(breakingBad.id); - const watchedAt = daysAgo(90); - for (const ep of allEps) { - db.insert(userEpisodeWatches) - .values({ userId, episodeId: ep.id, watchedAt, source: "manual" }) - .onConflictDoNothing() - .run(); - } - db.insert(userTitleStatus) - .values({ - userId, - titleId: breakingBad.id, - status: "completed", - addedAt: daysAgo(180), - updatedAt: watchedAt, - }) - .onConflictDoNothing() - .run(); - db.insert(userRatings) - .values({ - userId, - titleId: breakingBad.id, - ratingStars: 5, - ratedAt: watchedAt, - }) - .onConflictDoNothing() - .run(); - log.info(` Completed: Breaking Bad (${allEps.length} episodes, 5 stars)`); - } - - // Game of Thrones — fully completed with lower rating - const got = tvTitles.find((t) => t.tmdbId === 1399); - if (got) { - const allEps = getEpisodesForTitle(got.id); - const watchedAt = daysAgo(120); - for (const ep of allEps) { - db.insert(userEpisodeWatches) - .values({ userId, episodeId: ep.id, watchedAt, source: "manual" }) - .onConflictDoNothing() - .run(); - } - db.insert(userTitleStatus) - .values({ - userId, - titleId: got.id, - status: "completed", - addedAt: daysAgo(180), - updatedAt: watchedAt, - }) - .onConflictDoNothing() - .run(); - db.insert(userRatings) - .values({ - userId, - titleId: got.id, - ratingStars: 3, - ratedAt: watchedAt, - }) - .onConflictDoNothing() - .run(); - log.info( - ` Completed: Game of Thrones (${allEps.length} episodes, 3 stars)`, - ); - } - - // Stranger Things — in progress (watched first 2 seasons) - const strangerThings = tvTitles.find((t) => t.tmdbId === 66732); - if (strangerThings) { - const seasonRows = db - .select() - .from(seasons) - .where(eq(seasons.titleId, strangerThings.id)) - .orderBy(seasons.seasonNumber) - .all(); - - let watchedCount = 0; - for (const season of seasonRows.slice(0, 2)) { - const eps = db - .select() - .from(episodes) - .where(eq(episodes.seasonId, season.id)) - .all(); - for (const ep of eps) { - db.insert(userEpisodeWatches) - .values({ - userId, - episodeId: ep.id, - watchedAt: daysAgo(randomBetween(14, 45)), - source: "manual", - }) - .onConflictDoNothing() - .run(); - watchedCount++; - } - } - db.insert(userTitleStatus) - .values({ - userId, - titleId: strangerThings.id, - status: "in_progress", - addedAt: daysAgo(60), - updatedAt: daysAgo(14), - }) - .onConflictDoNothing() - .run(); - log.info( - ` In progress: Stranger Things (${watchedCount} episodes watched)`, - ); - } - - // House of the Dragon — in progress (watched season 1 only) - const hotd = tvTitles.find((t) => t.tmdbId === 94997); - if (hotd) { - const seasonRows = db - .select() - .from(seasons) - .where(eq(seasons.titleId, hotd.id)) - .orderBy(seasons.seasonNumber) - .all(); - - let watchedCount = 0; - if (seasonRows.length > 0) { - const eps = db - .select() - .from(episodes) - .where(eq(episodes.seasonId, seasonRows[0].id)) - .all(); - for (const ep of eps) { - db.insert(userEpisodeWatches) - .values({ - userId, - episodeId: ep.id, - watchedAt: daysAgo(randomBetween(30, 60)), - source: "jellyfin", - }) - .onConflictDoNothing() - .run(); - watchedCount++; - } - } - db.insert(userTitleStatus) - .values({ - userId, - titleId: hotd.id, - status: "in_progress", - addedAt: daysAgo(75), - updatedAt: daysAgo(30), - }) - .onConflictDoNothing() - .run(); - log.info( - ` In progress: House of the Dragon (${watchedCount} episodes watched)`, - ); - } - - // Peaky Blinders — on watchlist - const peaky = tvTitles.find((t) => t.tmdbId === 60574); - if (peaky) { - db.insert(userTitleStatus) - .values({ - userId, - titleId: peaky.id, - status: "watchlist", - addedAt: daysAgo(20), - updatedAt: daysAgo(20), - }) - .onConflictDoNothing() - .run(); - log.info(" Watchlisted: Peaky Blinders"); - } - - // The Last of Us — in progress (watched first 3 episodes) - const tlou = tvTitles.find((t) => t.tmdbId === 100088); - if (tlou) { - const seasonRows = db - .select() - .from(seasons) - .where(eq(seasons.titleId, tlou.id)) - .orderBy(seasons.seasonNumber) - .all(); - - let watchedCount = 0; - if (seasonRows.length > 0) { - const eps = db - .select() - .from(episodes) - .where(eq(episodes.seasonId, seasonRows[0].id)) - .orderBy(episodes.episodeNumber) - .all(); - for (const ep of eps.slice(0, 3)) { - db.insert(userEpisodeWatches) - .values({ - userId, - episodeId: ep.id, - watchedAt: daysAgo(randomBetween(2, 10)), - source: "manual", - }) - .onConflictDoNothing() - .run(); - watchedCount++; - } - } - db.insert(userTitleStatus) - .values({ - userId, - titleId: tlou.id, - status: "in_progress", - addedAt: daysAgo(15), - updatedAt: daysAgo(2), - }) - .onConflictDoNothing() - .run(); - log.info( - ` In progress: The Last of Us (${watchedCount} episodes watched)`, - ); - } - - // 6. Integrations (webhook connections) - log.info("Creating integrations..."); - const plexWebhookId = Bun.randomUUIDv7(); - const jellyfinWebhookId = Bun.randomUUIDv7(); - - db.insert(integrations) - .values([ - { - id: plexWebhookId, - userId, - provider: "plex", - type: "webhook", - token: `plex_${Bun.randomUUIDv7().replace(/-/g, "").slice(0, 32)}`, - enabled: true, - createdAt: daysAgo(90), - lastEventAt: daysAgo(1), - }, - { - id: jellyfinWebhookId, - userId, - provider: "jellyfin", - type: "webhook", - token: `jf_${Bun.randomUUIDv7().replace(/-/g, "").slice(0, 32)}`, - enabled: true, - createdAt: daysAgo(45), - lastEventAt: daysAgo(3), - }, - ]) - .onConflictDoNothing() - .run(); - - // Sample integration event log - const integrationEventEntries = [ - { - integrationId: plexWebhookId, - eventType: "media.scrobble", - mediaType: "movie", - mediaTitle: "The Shawshank Redemption", - status: "success" as const, - receivedAt: daysAgo(5), - }, - { - integrationId: plexWebhookId, - eventType: "media.scrobble", - mediaType: "movie", - mediaTitle: "Fight Club", - status: "success" as const, - receivedAt: daysAgo(10), - }, - { - integrationId: plexWebhookId, - eventType: "media.play", - mediaType: "movie", - mediaTitle: "Unknown Movie", - status: "ignored" as const, - receivedAt: daysAgo(12), - }, - { - integrationId: jellyfinWebhookId, - eventType: "PlaybackStop", - mediaType: "episode", - mediaTitle: "House of the Dragon S01E05", - status: "success" as const, - receivedAt: daysAgo(30), - }, - { - integrationId: jellyfinWebhookId, - eventType: "PlaybackStop", - mediaType: "episode", - mediaTitle: "House of the Dragon S01E06", - status: "error" as const, - errorMessage: "Could not match title in database", - receivedAt: daysAgo(29), - }, - ]; - - for (const event of integrationEventEntries) { - db.insert(integrationEvents).values(event).run(); - } - log.info( - ` Created 2 integrations + ${integrationEventEntries.length} events`, - ); - - // 7. Cron run history - log.info("Creating cron run history..."); - const cronJobs = [ - "nightlyRefreshLibrary", - "refreshAvailability", - "refreshRecommendations", - "refreshTvChildren", - "cacheImages", - "refreshCredits", - "updateCheck", - ]; - - for (const jobName of cronJobs) { - // Create 3-5 historical runs per job - const runCount = randomBetween(3, 5); - for (let i = 0; i < runCount; i++) { - const startedAt = daysAgo(i * 2 + randomBetween(0, 1)); - const durationMs = randomBetween(500, 30000); - const finishedAt = new Date(startedAt.getTime() + durationMs); - const isError = Math.random() < 0.05; // 5% error rate - - db.insert(cronRuns) - .values({ - jobName, - status: isError ? "error" : "success", - startedAt, - finishedAt, - durationMs, - errorMessage: isError ? "TMDB API rate limit exceeded" : null, - }) - .run(); - } - } - log.info(" Created cron run history"); - - // 8. App settings - log.info("Configuring app settings..."); - const settings: [string, string][] = [ - ["registrationOpen", "false"], - ["backupEnabled", "true"], - ["backupSchedule", "0 4 * * *"], - ["backupRetentionDays", "30"], - ]; - for (const [key, value] of settings) { - db.insert(appSettings) - .values({ key, value }) - .onConflictDoUpdate({ target: appSettings.key, set: { value } }) - .run(); - } - log.info(" App settings configured"); - - // Done! - const movieCount = movieTitles.length; - const tvCount = tvTitles.length; - - log.info("─────────────────────────────────────────────────"); - log.info("Seed complete!"); - log.info(` User: ${DEMO_EMAIL} / ${DEMO_PASSWORD}`); - log.info(` Movies: ${movieCount} imported`); - log.info(` TV Shows: ${tvCount} imported`); - log.info(` Library: completed, in-progress, and watchlist items`); - log.info(` Extras: ratings, webhooks, cron history, app settings`); - log.info("─────────────────────────────────────────────────"); -} - -function getEpisodesForTitle(titleId: string) { - const seasonRows = db - .select() - .from(seasons) - .where(eq(seasons.titleId, titleId)) - .all(); - - const allEps: { id: string }[] = []; - for (const season of seasonRows) { - const eps = db - .select() - .from(episodes) - .where(eq(episodes.seasonId, season.id)) - .all(); - allEps.push(...eps); - } - return allEps; -} - -// ─── Run ──────────────────────────────────────────────────────────────────── - -seed().catch((err) => { - log.error("Seed failed:", err); - process.exit(1); -}); diff --git a/test/preload.ts b/test/preload.ts deleted file mode 100644 index 3375bc5..0000000 --- a/test/preload.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { mock } from "bun:test"; -import { applyMigrations, testDb } from "./sqlite"; - -mock.module("@/lib/db/client", () => ({ - db: testDb, - closeDatabase: () => {}, -})); - -applyMigrations(); diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 3a13f90..0000000 --- a/tsconfig.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2017", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "react-jsx", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./*"] - } - }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts", - ".next/dev/types/**/*.ts", - "**/*.mts" - ], - "exclude": ["node_modules"] -} diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..5b7f717 --- /dev/null +++ b/turbo.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://turbo.build/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": ["dist/**"] + }, + "dev": { + "dependsOn": ["^build"], + "persistent": true, + "cache": false + }, + "lint": {}, + "format": {}, + "check-types": {}, + "test": {} + } +}