mirror of
https://github.com/jakejarvis/sofa.git
synced 2026-08-29 06:15:39 -04:00
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.
106 lines
2.2 KiB
TypeScript
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[];
|
|
}
|