From c7c783570cbe2a8ad31ad7404eb8a6aa29b19b49 Mon Sep 17 00:00:00 2001 From: SBCrumb Date: Wed, 10 Sep 2025 10:17:07 -0400 Subject: [PATCH] Add configurable TMDB release type priority system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Added TMDB_TYPE_PRIORITY environment variable for user-configurable release type preferences - Default priority: 4,5,3,2,6,1 (Digital → Physical → Theatrical → Limited → TV → Premiere) - Replaces random first-available selection with intelligent priority-based selection - Enhanced logging shows selected type and full priority order - Users can customize priority based on their preferences (e.g. theatrical first) Version bumped to 0.2.22 --- .env.template | 8 +++++++ VERSION | 2 +- clients/external_clients.py | 46 +++++++++++++++++++++++++++++-------- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/.env.template b/.env.template index 1a53a17..94972fb 100644 --- a/.env.template +++ b/.env.template @@ -98,6 +98,14 @@ ENABLE_SMART_DATE_VALIDATION=true # If digital/physical is more than this many years after theatrical, prefer theatrical instead MAX_RELEASE_DATE_GAP_YEARS=10 +# TMDB country for regional release date preferences +TMDB_COUNTRY=US + +# TMDB release type priority (comma-separated numbers) +# 1=Premiere, 2=Limited Theatrical, 3=Theatrical, 4=Digital, 5=Physical, 6=TV Premiere +# Default: 4,5,3,2,6,1 (Digital → Physical → Theatrical → Limited → TV → Premiere) +TMDB_TYPE_PRIORITY=4,5,3,2,6,1 + # When to query APIs: always, if_missing, never MOVIE_POLL_MODE=always diff --git a/VERSION b/VERSION index 599028f..109a20f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.21 +0.2.22 diff --git a/clients/external_clients.py b/clients/external_clients.py index aebf109..c273d90 100644 --- a/clients/external_clients.py +++ b/clients/external_clients.py @@ -104,25 +104,53 @@ class TMDBClient: releases = entry.get("release_dates", []) _log("INFO", f"🎬 TMDB: Release types available: {[r.get('type') for r in releases]}") + # Collect all available releases with their types and dates + available_releases = [] for release in releases: release_type = release.get("type") release_date = release.get("release_date") _log("INFO", f"📅 TMDB: Type {release_type}, Date: {release_date}") - # Accept any reasonable TMDB release type for better coverage if release_date: parsed_date = _parse_date_to_iso(release_date) - release_type_names = { - 1: "Premiere", 2: "Limited Theatrical", 3: "Theatrical", - 4: "Digital", 5: "Physical", 6: "TV Premiere" - } - type_name = release_type_names.get(release_type, f"Type {release_type}") - _log("INFO", f"✅ TMDB: Found {type_name} release date: {parsed_date}") - return parsed_date + if parsed_date: + available_releases.append((release_type, parsed_date)) + + # Apply TMDB release type priority order + tmdb_priority = self._get_tmdb_type_priority() + for preferred_type in tmdb_priority: + for release_type, parsed_date in available_releases: + if release_type == preferred_type: + release_type_names = { + 1: "Premiere", 2: "Limited Theatrical", 3: "Theatrical", + 4: "Digital", 5: "Physical", 6: "TV Premiere" + } + type_name = release_type_names.get(release_type, f"Type {release_type}") + _log("INFO", f"✅ TMDB: Selected {type_name} release date: {parsed_date} (priority: {tmdb_priority})") + return parsed_date - _log("WARNING", f"❌ TMDB: No digital release found for {imdb_id} in {self.primary_country}") + _log("WARNING", f"❌ TMDB: No release dates found for {imdb_id} in {self.primary_country}") return None + def _get_tmdb_type_priority(self) -> List[int]: + """Get TMDB release type priority order from environment""" + # Default priority: Digital first, then Physical, then Theatrical, then others + default_priority = "4,5,3,2,6,1" # digital,physical,theatrical,limited,tv,premiere + + priority_str = os.environ.get("TMDB_TYPE_PRIORITY", default_priority) + try: + # Parse comma-separated numbers + priority_list = [int(x.strip()) for x in priority_str.split(",") if x.strip().isdigit()] + if priority_list: + _log("DEBUG", f"TMDB type priority: {priority_list}") + return priority_list + else: + _log("WARNING", f"Invalid TMDB_TYPE_PRIORITY '{priority_str}', using default") + return [4, 5, 3, 2, 6, 1] + except Exception as e: + _log("WARNING", f"Error parsing TMDB_TYPE_PRIORITY: {e}, using default") + return [4, 5, 3, 2, 6, 1] + def get_theatrical_release_date(self, imdb_id: str) -> Optional[str]: """Get theatrical release date for a movie""" movie = self.find_by_imdb(imdb_id)