MCPcopy Index your code
hub / github.com/blakejoy/tmdb-ts

github.com/blakejoy/tmdb-ts @main

Chat with this repo
repository ↗ · DeepWiki ↗ · + Follow
380 symbols 420 edges 54 files 110 documented · 29%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

tmdb-ts

CI Version npm npm Downloads

TypeScript library wrapper for TMDB API v3.

Features

  • Full TypeScript support with comprehensive type definitions
  • Modern authentication using JWT access tokens (no API key in URLs)
  • Complete API coverage for TMDB v3 endpoints
  • Promise-based async/await interface
  • Zero configuration - just provide your access token
  • Isomorphic - works in Node.js (18+) and modern browsers
  • Zero dependencies - uses native fetch API

Installation

npm install --save tmdb-ts

Usage

This library uses JWT authentication tokens for requests, so there is no need to append an API key to the URL. Once you have registered for access to the API, you can use your access token as follows:

Note: Version 1.0 removed the default import. Make sure to use named imports.

import { TMDB } from 'tmdb-ts';

const tmdb = new TMDB('accessToken');

try {
  const movies = await tmdb.search.movies({ query: 'American Pie' });
  console.log(movies);
} catch (err) {
  // handle error
}

Custom Fetch

You can pass a custom fetch implementation via the options parameter. This is useful for frameworks like Next.js that patch the global fetch for caching, or for adding logging, interceptors, or using a different HTTP library.

const tmdb = new TMDB('accessToken', { fetch: customFetch });

Next.js

Next.js patches the global fetch with caching support. Since tmdb-ts uses native fetch by default, this works automatically. However, you can explicitly pass it for clarity or to customize caching:

const tmdb = new TMDB('accessToken', {
  fetch: (url, init) =>
    fetch(url, { ...init, next: { revalidate: 3600 } }),
});

undici

import { fetch as undiciFetch } from 'undici';

const tmdb = new TMDB('accessToken', { fetch: undiciFetch });

cross-fetch

import crossFetch from 'cross-fetch';

const tmdb = new TMDB('accessToken', { fetch: crossFetch });

node-fetch

import nodeFetch from 'node-fetch';

const tmdb = new TMDB('accessToken', { fetch: nodeFetch as unknown as typeof fetch });

axios

Axios has a different API shape, so it needs a small wrapper:

import axios from 'axios';
import { TMDB } from 'tmdb-ts';

const axiosFetch: typeof fetch = async (input, init) => {
  const { data, status, statusText, headers } = await axios({
    url: input.toString(),
    method: init?.method ?? 'GET',
    headers: init?.headers as Record<string, string>,
    data: init?.body,
  });

  return new Response(JSON.stringify(data), {
    status,
    statusText,
    headers: new Headers(headers as Record<string, string>),
  });
};

const tmdb = new TMDB('accessToken', { fetch: axiosFetch });

// Now all requests go through axios
const movie = await tmdb.movies.details(550);
console.log(movie.title); // "Fight Club"

const results = await tmdb.search.movies({ query: 'Inception' });
console.log(results.results[0].title); // "Inception"

got

got also needs a wrapper since it has a different API:

import got from 'got';

const gotFetch: typeof fetch = async (input, init) => {
  const response = await got(input.toString(), {
    method: init?.method as any,
    headers: init?.headers as Record<string, string>,
    body: init?.body as string,
  });

  return new Response(response.body, {
    status: response.statusCode,
    statusText: response.statusMessage,
    headers: new Headers(response.headers as Record<string, string>),
  });
};

const tmdb = new TMDB('accessToken', { fetch: gotFetch });

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for details.

License

This project is licensed under the MIT License - see the LICENSE.md file for details.

Extension points exported contracts — how you extend this code

TMDBOptions (Interface)
(no doc)
src/tmdb.ts
SeasonSelection (Interface)
(no doc)
src/types/tv-seasons.ts
TvSeasonImageSearchOptions (Interface)
(no doc)
src/endpoints/tv-seasons.ts
SeasonDetails (Interface)
(no doc)
src/types/tv-seasons.ts
TvSeasonVideoSearchOptions (Interface)
(no doc)
src/endpoints/tv-seasons.ts
MediaChange (Interface)
(no doc)
src/types/changes.ts
TvEpisodeImageSearchOptions (Interface)
(no doc)
src/endpoints/tv-episode.ts
MediaChanges (Interface)
(no doc)
src/types/changes.ts

Core symbols most depended-on inside this repo

BASE_SEASON
called by 7
src/endpoints/tv-seasons.ts
BASE_EPISODE
called by 6
src/endpoints/tv-episode.ts
get
called by 1
src/api.ts
parseOptions
called by 1
src/utils/parseOptions.ts
constructor
called by 0
src/api.ts
constructor
called by 0
src/tmdb.ts
account
called by 0
src/tmdb.ts
configuration
called by 0
src/tmdb.ts

Shape

Interface 171
Method 156
Class 48
Function 4
Enum 1

Languages

TypeScript100%

Modules by API surface

src/types/tv-shows.ts26 symbols
src/endpoints/tv-shows.ts26 symbols
src/types/index.ts25 symbols
src/tmdb.ts25 symbols
src/endpoints/movies.ts24 symbols
src/types/credits.ts16 symbols
src/endpoints/search.ts16 symbols
src/types/people.ts15 symbols
src/types/movies.ts15 symbols
src/endpoints/tv-seasons.ts14 symbols
src/endpoints/people.ts14 symbols
src/endpoints/tv-episode.ts13 symbols

For agents

$ claude mcp add tmdb-ts \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact