diff --git a/src/trackers/ULCX.py b/src/trackers/ULCX.py index 30b797356..f9fb7dbcb 100644 --- a/src/trackers/ULCX.py +++ b/src/trackers/ULCX.py @@ -122,7 +122,7 @@ def wrap_in_spoiler(match: re.Match[str]) -> str: return {'description': desc} async def get_name(self, meta: Meta) -> dict[str, str]: - ulcx_name = meta['name'] + ulcx_name: str = meta["name"] imdb_name = meta.get('imdb_info', {}).get('title', "") imdb_year = str(meta.get('imdb_info', {}).get('year', "")) imdb_aka = meta.get('imdb_info', {}).get('aka', "") @@ -139,4 +139,65 @@ async def get_name(self, meta: Meta) -> dict[str, str]: if meta.get('category') != "TV" and imdb_year and imdb_year.strip() and year and year.strip() and imdb_year != year: ulcx_name = ulcx_name.replace(f"{year}", imdb_year, 1) + # Add the episode title for TV shows, if it is a special + if meta.get("category") == "TV": + season_int = meta.get("season_int", 0) + episode_int = meta.get("episode_int", 0) + if (season_int == 0 or episode_int == 0) and not meta.get("tv_pack", 0): + ep_title = "" + # 1. TVDB + if not ep_title: + tvdb_episode_data = meta.get("tvdb_episode_data") + if tvdb_episode_data and isinstance(tvdb_episode_data, dict): + episodes = tvdb_episode_data.get("episodes", []) + if episodes: + if episode_int == 0: + # For SxxE00, find first episode of the season + for ep_entry in episodes: + if ep_entry.get("seasonNumber") == season_int: + ep_title = ep_entry.get("name", "").strip() + if ep_title: + break + else: + # For S00E## or regular episodes + for ep_entry in episodes: + if ep_entry.get("seasonNumber") == season_int and ep_entry.get("number") == episode_int: + ep_title = ep_entry.get("name", "").strip() + if ep_title: + break + + # 2. TVMaze + if not ep_title: + tvmaze_episode_data = meta.get("tvmaze_episode_data") + if tvmaze_episode_data and isinstance(tvmaze_episode_data, dict): + ep_title = tvmaze_episode_data.get("episode_name", "").strip() + + # 3. TMDB + if not ep_title: + tmdb_episode_data = meta.get("tmdb_episode_data") + if tmdb_episode_data and isinstance(tmdb_episode_data, dict): + ep_title = tmdb_episode_data.get("name", "").strip() + + # 4. IMDB (fallback) + if not ep_title: + imdb_info: dict[str, Any] = meta.get("imdb_info", {}) + if imdb_info: + episodes = imdb_info.get("episodes", []) + if episodes and isinstance(episodes, list): + season_str = str(season_int) + episode_str = str(episode_int) + for ep_entry in episodes: + if str(ep_entry.get("season", "")) == season_str and str(ep_entry.get("episode_number", "")) == episode_str: + ep_title = str(ep_entry.get("title", "")).strip() + if ep_title: + break + + if ep_title and ep_title.lower() in ("tba", "tbd"): + ep_title = "" + + if ep_title: + episode_token = str(meta.get("episode", "")).strip() + if episode_token: + ulcx_name = ulcx_name.replace(episode_token, f"{episode_token} {ep_title}", 1) + return {'name': ulcx_name}