mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-11 19:17:41 -08:00
* feat(tmdb): clickable director/creator chips and directing credits on person pages Directors were plain merged text — no photos, no navigation — while the data was already sitting in the cached TMDB payloads (credits.crew and created_by both carry id + profile_path; they just were not typed or parsed). - tmdb-merge: enrichedDirectors (crew, job === 'Director', deduped by person id) and enrichedCreators (created_by) produce the same chip shape as the cast (TmdbEnrichedCastMember) into a new tmdb_directors field on all three merges (Xtream VOD, Xtream series, Stalker); types widened (crew id/profile_path, created_by id/profile_path). - Detail views (shared VodDetailsComponent, Xtream vod/serial routes, Stalker series view) render the Director row as clickable avatar chips when tmdb_directors is present — same markup and openActor handler as the cast strip — falling back to the plain text otherwise. Stalker re-normalization allowlist preserves the new field. - Person pages: mapPersonFilmography now merges combined_credits.crew (jobs Director/Creator) into the filmography — acting wins the per-title dedup, directing-only titles show the job in the character slot. Everything else (library matching, All-portals scope, filters, search fallback, back button) works unchanged because the person page is role-agnostic. Existing caches work as-is: crew/created_by were always part of the stored payloads. Tests: merge spec (director/creator chips + crew-row dedup ×3 merges), person spec (crew credits, Producer excluded, acting-wins dedup), stalker-vod.utils passthrough. Docs updated (CLAUDE.md + architecture). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(tmdb): address director-pages review — split oversized spec, stable track keys, translated crew roles - tmdb-merge.spec.ts grew past the 400-line lint ceiling — the Stalker merge suite moved to tmdb-merge-stalker.spec.ts (fixes the CI Lint job). - All cast/director chip loops now track by TMDB person id with an index fallback ('p<id>' / 'i<index>') instead of member.name — distinct people can share a name and creator payloads carry no dedup (greptile). - Directing-only filmography credits carry the role in a new crewJob field ('Director' | 'Creator') instead of stuffing TMDB's raw English job into character; ActorViewComponent renders it through translated labels (XTREAM.CREW_JOB_DIRECTOR/CREATOR, added to all 18 locales via the i18n patch workflow, matching each locale's existing glossary — pt "Diretor", de "Regisseur") (Codex). Tests: person spec asserts character/crewJob separation; merge suites green after the split (15 + stalker file). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
import {
|
|
TmdbEnrichedCastMember,
|
|
TmdbRecommendation,
|
|
} from './tmdb.interface';
|
|
|
|
export interface XtreamSerieDetails {
|
|
seasons: XtreamSerieSeason[];
|
|
info: XtreamSerieInfo;
|
|
episodes: Record<string, XtreamSerieEpisode[]>;
|
|
}
|
|
|
|
export interface XtreamSerieInfo {
|
|
name: string;
|
|
cover: string;
|
|
plot: string;
|
|
cast: string;
|
|
director: string;
|
|
genre: string;
|
|
releaseDate: string;
|
|
last_modified: string;
|
|
rating: string;
|
|
rating_5based: number;
|
|
backdrop_path: string[];
|
|
youtube_trailer: string;
|
|
episode_run_time: string;
|
|
category_id: string;
|
|
/** Populated by TMDB enrichment; absent in raw provider responses */
|
|
tmdb_cast?: TmdbEnrichedCastMember[];
|
|
/** Directors (movies) / creators (series) as clickable person chips */
|
|
tmdb_directors?: TmdbEnrichedCastMember[];
|
|
/** Populated by TMDB enrichment; matched against the catalog in views */
|
|
tmdb_recommendations?: TmdbRecommendation[];
|
|
/** Matched TMDB show id — enables lazy season/episode enrichment */
|
|
tmdb_id?: number;
|
|
}
|
|
|
|
export interface XtreamSerieEpisode {
|
|
id: string;
|
|
episode_num: number;
|
|
title: string;
|
|
container_extension: string;
|
|
info: XtreamSerieEpisodeInfo | []; // Can be empty array when no metadata available
|
|
custom_sid: string;
|
|
added: string;
|
|
season: number;
|
|
direct_source: string;
|
|
}
|
|
|
|
export interface XtreamSerieEpisodeInfo {
|
|
tmdb_id?: number;
|
|
releasedate?: string;
|
|
plot?: string;
|
|
duration_secs?: number;
|
|
duration?: string;
|
|
movie_image?: string;
|
|
video?: Record<string, string>; // TODO
|
|
audio?: Record<string, string>; // TODO
|
|
bitrate?: number;
|
|
rating?: number;
|
|
season?: string;
|
|
}
|
|
|
|
export interface XtreamSerieSeason {
|
|
air_date: string;
|
|
episode_count: number;
|
|
id: number;
|
|
name: string;
|
|
overview: string;
|
|
season_number: number;
|
|
cover: string;
|
|
cover_big: string;
|
|
}
|