Files
sofa/lib/types/title.ts
T
jake cd4b2908d8 Add clickable watch links to streaming provider badges
Build a provider registry mapping TMDB provider IDs to search URL
templates. `generateProviderUrl()` resolves a URL for a given provider
and title name using URL-encoded search queries. `readAvailability()`
now accepts the title name and attaches `watchUrl` to each offer.

Provider badges with a resolved URL render as `<a>` links opening in a
new tab; tooltip copy switches from the provider name to "Watch on
{name}". Badges without a known URL remain non-interactive as before.
2026-03-05 20:35:59 -05:00

106 lines
2.2 KiB
TypeScript

export interface Episode {
id: string;
episodeNumber: number;
name: string | null;
overview: string | null;
stillPath: string | null;
airDate: string | null;
runtimeMinutes: number | null;
}
export interface Season {
id: string;
seasonNumber: number;
name: string | null;
episodes: Episode[];
}
export interface AvailabilityOffer {
providerId: number;
providerName: string;
logoPath: string | null;
offerType: string;
watchUrl: string | null;
}
export interface RecommendedTitle {
id: string;
tmdbId: number;
type: "movie" | "tv";
title: string;
posterPath: string | null;
releaseDate: string | null;
firstAirDate: string | null;
voteAverage: number | null;
}
export interface ColorPalette {
vibrant: string | null;
darkVibrant: string | null;
lightVibrant: string | null;
muted: string | null;
darkMuted: string | null;
lightMuted: string | null;
}
export interface CastMember {
id: string;
personId: string;
name: string;
character: string | null;
department: string;
job: string | null;
displayOrder: number;
episodeCount: number | null;
profilePath: string | null;
tmdbId: number;
}
export interface ResolvedPerson {
id: string;
tmdbId: number;
name: string;
biography: string | null;
birthday: string | null;
deathday: string | null;
placeOfBirth: string | null;
profilePath: string | null;
knownForDepartment: string | null;
imdbId: string | null;
}
export interface PersonCredit {
titleId: string;
tmdbId: number;
type: "movie" | "tv";
title: string;
posterPath: string | null;
releaseDate: string | null;
firstAirDate: string | null;
voteAverage: number | null;
character: string | null;
department: string;
job: string | null;
}
export interface ResolvedTitle {
id: string;
tmdbId: number;
type: "movie" | "tv";
title: string;
originalTitle: string | null;
overview: string | null;
releaseDate: string | null;
firstAirDate: string | null;
posterPath: string | null;
backdropPath: string | null;
popularity: number | null;
voteAverage: number | null;
voteCount: number | null;
status: string | null;
contentRating: string | null;
colorPalette: ColorPalette | null;
trailerVideoKey: string | null;
genres: string[];
}