digital logic updates
This commit is contained in:
+93
-25
@@ -95,6 +95,54 @@ class TMDBClient:
|
||||
|
||||
return None
|
||||
|
||||
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)
|
||||
if not movie:
|
||||
return None
|
||||
|
||||
tmdb_id = movie.get("id")
|
||||
if not tmdb_id:
|
||||
return None
|
||||
|
||||
release_dates = self._get(f"/movie/{tmdb_id}/release_dates")
|
||||
if not release_dates:
|
||||
return None
|
||||
|
||||
for entry in release_dates.get("results", []):
|
||||
if entry.get("iso_3166_1", "").upper() != self.primary_country:
|
||||
continue
|
||||
|
||||
for release in entry.get("release_dates", []):
|
||||
if release.get("type") == 3 and release.get("release_date"): # Theatrical release
|
||||
return _parse_date_to_iso(release["release_date"])
|
||||
|
||||
return None
|
||||
|
||||
def get_physical_release_date(self, imdb_id: str) -> Optional[str]:
|
||||
"""Get physical release date (DVD/Blu-ray) for a movie"""
|
||||
movie = self.find_by_imdb(imdb_id)
|
||||
if not movie:
|
||||
return None
|
||||
|
||||
tmdb_id = movie.get("id")
|
||||
if not tmdb_id:
|
||||
return None
|
||||
|
||||
release_dates = self._get(f"/movie/{tmdb_id}/release_dates")
|
||||
if not release_dates:
|
||||
return None
|
||||
|
||||
for entry in release_dates.get("results", []):
|
||||
if entry.get("iso_3166_1", "").upper() != self.primary_country:
|
||||
continue
|
||||
|
||||
for release in entry.get("release_dates", []):
|
||||
if release.get("type") == 5 and release.get("release_date"): # Physical release
|
||||
return _parse_date_to_iso(release["release_date"])
|
||||
|
||||
return None
|
||||
|
||||
def get_tv_season_episodes(self, tv_id: int, season_number: int) -> Dict[int, str]:
|
||||
"""Get episode air dates for a TV season"""
|
||||
result = self._get(f"/tv/{tv_id}/season/{season_number}")
|
||||
@@ -239,47 +287,67 @@ class ExternalClientManager:
|
||||
self.omdb = OMDbClient()
|
||||
self.jellyseerr = JellyseerrClient()
|
||||
|
||||
def get_digital_release_candidates(self, imdb_id: str) -> List[Tuple[str, str]]:
|
||||
"""Get digital release date candidates from all sources"""
|
||||
candidates = []
|
||||
def get_release_date_by_priority(self, imdb_id: str, priority_order: List[str]) -> Optional[Tuple[str, str]]:
|
||||
"""Get release date using configurable priority order"""
|
||||
|
||||
# Get all possible release dates
|
||||
release_options = {}
|
||||
|
||||
# TMDB digital release
|
||||
if self.tmdb.enabled:
|
||||
tmdb_date = self.tmdb.get_digital_release_date(imdb_id)
|
||||
if tmdb_date:
|
||||
candidates.append((tmdb_date, "tmdb:digital"))
|
||||
# Digital release
|
||||
digital_date = self.tmdb.get_digital_release_date(imdb_id)
|
||||
if digital_date:
|
||||
release_options["digital"] = (digital_date, "tmdb:digital")
|
||||
|
||||
# Physical release
|
||||
physical_date = self.tmdb.get_physical_release_date(imdb_id)
|
||||
if physical_date:
|
||||
release_options["physical"] = (physical_date, "tmdb:physical")
|
||||
|
||||
# Theatrical release
|
||||
theatrical_date = self.tmdb.get_theatrical_release_date(imdb_id)
|
||||
if theatrical_date:
|
||||
release_options["theatrical"] = (theatrical_date, "tmdb:theatrical")
|
||||
|
||||
# OMDb DVD/digital release
|
||||
# Add OMDb options
|
||||
if self.omdb.enabled:
|
||||
omdb_date = self.omdb.get_dvd_release_date(imdb_id)
|
||||
if omdb_date:
|
||||
candidates.append((omdb_date, "omdb:dvd"))
|
||||
if omdb_date and "physical" not in release_options:
|
||||
release_options["physical"] = (omdb_date, "omdb:dvd")
|
||||
|
||||
# Jellyseerr digital releases
|
||||
if self.jellyseerr.enabled and self.tmdb.enabled:
|
||||
# Add Jellyseerr digital releases
|
||||
if self.jellyseerr.enabled and self.tmdb.enabled and "digital" not in release_options:
|
||||
tmdb_movie = self.tmdb.find_by_imdb(imdb_id)
|
||||
if tmdb_movie:
|
||||
tmdb_id = tmdb_movie.get("id")
|
||||
if tmdb_id:
|
||||
jellyseerr_dates = self.jellyseerr.get_digital_release_dates(tmdb_id)
|
||||
for date in jellyseerr_dates:
|
||||
candidates.append((date, "jellyseerr:digital"))
|
||||
if jellyseerr_dates:
|
||||
earliest_jellyseerr = min(jellyseerr_dates)
|
||||
release_options["digital"] = (earliest_jellyseerr, "jellyseerr:digital")
|
||||
|
||||
# Return first available option according to priority
|
||||
for priority in priority_order:
|
||||
if priority in release_options:
|
||||
return release_options[priority]
|
||||
|
||||
return None
|
||||
|
||||
def get_digital_release_candidates(self, imdb_id: str) -> List[Tuple[str, str]]:
|
||||
"""Get digital release date candidates from all sources (legacy method)"""
|
||||
candidates = []
|
||||
|
||||
# Try the new priority system with digital-first fallback
|
||||
result = self.get_release_date_by_priority(imdb_id, ["digital", "physical", "theatrical"])
|
||||
if result:
|
||||
candidates.append(result)
|
||||
|
||||
return candidates
|
||||
|
||||
def get_earliest_digital_release(self, imdb_id: str) -> Optional[Tuple[str, str]]:
|
||||
"""Get the earliest digital release date"""
|
||||
"""Get the earliest digital release date (legacy method)"""
|
||||
candidates = self.get_digital_release_candidates(imdb_id)
|
||||
if not candidates:
|
||||
return None
|
||||
|
||||
try:
|
||||
return sorted(
|
||||
candidates,
|
||||
key=lambda x: datetime.fromisoformat(x[0].replace("Z", "+00:00"))
|
||||
)[0]
|
||||
except Exception:
|
||||
return candidates[0] if candidates else None
|
||||
return candidates[0] if candidates else None
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Reference in New Issue
Block a user