digital logic updates
This commit is contained in:
+35
-25
@@ -96,7 +96,8 @@ class NFOGuardConfig:
|
||||
|
||||
# Movie processing
|
||||
self.movie_priority = os.environ.get("MOVIE_PRIORITY", "import_then_digital").lower()
|
||||
self.prefer_digital_over_file_dates = _bool_env("PREFER_DIGITAL_OVER_FILE_DATES", True)
|
||||
self.prefer_release_dates_over_file_dates = _bool_env("PREFER_RELEASE_DATES_OVER_FILE_DATES", True)
|
||||
self.release_date_priority = [p.strip() for p in os.environ.get("RELEASE_DATE_PRIORITY", "digital,physical,theatrical").split(",")]
|
||||
self.movie_poll_mode = os.environ.get("MOVIE_POLL_MODE", "always").lower()
|
||||
self.movie_update_mode = os.environ.get("MOVIE_DATE_UPDATE_MODE", "backfill_only").lower()
|
||||
|
||||
@@ -474,10 +475,10 @@ class MovieProcessor:
|
||||
# Get digital release date for comparison
|
||||
digital_date, digital_source = self._get_digital_release_date(imdb_id)
|
||||
|
||||
# If we only have file date and digital date exists, prefer digital if reasonable and enabled
|
||||
if import_date and import_source == "radarr:db.file.dateAdded" and digital_date and config.prefer_digital_over_file_dates:
|
||||
# Compare dates - prefer digital if it's not way older than theatrical
|
||||
if self._should_prefer_digital_over_file_date(digital_date, released, imdb_id):
|
||||
# If we only have file date and release date exists, prefer it if reasonable and enabled
|
||||
if import_date and import_source == "radarr:db.file.dateAdded" and digital_date and config.prefer_release_dates_over_file_dates:
|
||||
# Compare dates - prefer release date if it's reasonable
|
||||
if self._should_prefer_release_over_file_date(digital_date, digital_source, released, imdb_id):
|
||||
return digital_date, digital_source, released
|
||||
else:
|
||||
return import_date, import_source, released
|
||||
@@ -506,11 +507,11 @@ class MovieProcessor:
|
||||
return self._get_file_mtime_date(movie_path)
|
||||
|
||||
def _get_digital_release_date(self, imdb_id: str) -> Tuple[Optional[str], str]:
|
||||
"""Get digital release date from external sources"""
|
||||
digital_release = self.external_clients.get_earliest_digital_release(imdb_id)
|
||||
if digital_release:
|
||||
return digital_release[0], digital_release[1]
|
||||
return None, "digital:none"
|
||||
"""Get release date from external sources using configured priority"""
|
||||
release_result = self.external_clients.get_release_date_by_priority(imdb_id, config.release_date_priority)
|
||||
if release_result:
|
||||
return release_result[0], release_result[1]
|
||||
return None, "release:none"
|
||||
|
||||
def _get_file_mtime_date(self, movie_path: Path) -> Tuple[str, str, Optional[str]]:
|
||||
"""Get date from file modification time as last resort"""
|
||||
@@ -535,38 +536,44 @@ class MovieProcessor:
|
||||
|
||||
return "MANUAL_REVIEW_NEEDED", "manual_review_required", None
|
||||
|
||||
def _should_prefer_digital_over_file_date(self, digital_date: str, theatrical_release: Optional[str], imdb_id: str) -> bool:
|
||||
def _should_prefer_release_over_file_date(self, release_date: str, release_source: str, theatrical_release: Optional[str], imdb_id: str) -> bool:
|
||||
"""
|
||||
Decide if digital release date should be preferred over file date
|
||||
Decide if release date should be preferred over file date
|
||||
|
||||
Logic:
|
||||
- If digital date is reasonable (not decades before theatrical), prefer it
|
||||
- If digital date is way too old (like 2000 for 1983 movie), use file date
|
||||
- For theatrical dates: Always prefer over file dates (they're authoritative)
|
||||
- For physical dates: Usually prefer over file dates
|
||||
- For digital dates: Prefer if reasonable (not decades before theatrical)
|
||||
"""
|
||||
try:
|
||||
digital_dt = datetime.fromisoformat(digital_date.replace("Z", "+00:00"))
|
||||
release_dt = datetime.fromisoformat(release_date.replace("Z", "+00:00"))
|
||||
|
||||
# If we have theatrical release date, compare
|
||||
# Always prefer theatrical and physical releases over file dates
|
||||
if any(release_type in release_source for release_type in ["theatrical", "physical"]):
|
||||
_log("INFO", f"Release date {release_date} ({release_source}) for {imdb_id}, preferring over file date")
|
||||
return True
|
||||
|
||||
# If we have theatrical release date, compare digital against it
|
||||
if theatrical_release:
|
||||
theatrical_dt = datetime.fromisoformat(theatrical_release.replace("Z", "+00:00"))
|
||||
year_diff = digital_dt.year - theatrical_dt.year
|
||||
year_diff = release_dt.year - theatrical_dt.year
|
||||
|
||||
# If digital is more than 10 years before theatrical, it's probably wrong
|
||||
if year_diff < -10:
|
||||
_log("INFO", f"Digital date {digital_date} is {abs(year_diff)} years before theatrical {theatrical_release} for {imdb_id}, using file date instead")
|
||||
_log("INFO", f"Release date {release_date} is {abs(year_diff)} years before theatrical {theatrical_release} for {imdb_id}, using file date instead")
|
||||
return False
|
||||
|
||||
# If digital is within reasonable range (theatrical to +20 years), use it
|
||||
if -2 <= year_diff <= 20:
|
||||
_log("INFO", f"Digital date {digital_date} is reasonable for {imdb_id} (theatrical: {theatrical_release}), preferring over file date")
|
||||
_log("INFO", f"Release date {release_date} is reasonable for {imdb_id} (theatrical: {theatrical_release}), preferring over file date")
|
||||
return True
|
||||
|
||||
# If no theatrical date, use digital if it's not absurdly old
|
||||
if digital_dt.year >= 1990: # Reasonable minimum for digital releases
|
||||
_log("INFO", f"Digital date {digital_date} seems reasonable for {imdb_id}, preferring over file date")
|
||||
if release_dt.year >= 1990: # Reasonable minimum for digital releases
|
||||
_log("INFO", f"Release date {release_date} seems reasonable for {imdb_id}, preferring over file date")
|
||||
return True
|
||||
|
||||
_log("INFO", f"Digital date {digital_date} seems too old for {imdb_id}, using file date instead")
|
||||
_log("INFO", f"Release date {release_date} seems too old for {imdb_id}, using file date instead")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
@@ -1160,6 +1167,7 @@ async def debug_movie_priority_logic(imdb_id: str):
|
||||
result = {
|
||||
"imdb_id": imdb_id,
|
||||
"movie_priority": config.movie_priority,
|
||||
"release_date_priority": config.release_date_priority,
|
||||
"priority_explanation": "",
|
||||
"date_sources": {},
|
||||
"selected_date": None,
|
||||
@@ -1197,7 +1205,8 @@ async def debug_movie_priority_logic(imdb_id: str):
|
||||
|
||||
# Show priority logic
|
||||
if config.movie_priority == "import_then_digital":
|
||||
result["priority_explanation"] = "1st: Radarr import history, 2nd: TMDB/OMDb digital release, 3rd: file mtime. Note: If import is only file date, prefer reasonable digital dates."
|
||||
priority_list = " → ".join(config.release_date_priority)
|
||||
result["priority_explanation"] = f"1st: Radarr import history, 2nd: Release dates ({priority_list}), 3rd: file mtime. Note: If import is only file date, prefer reasonable release dates."
|
||||
|
||||
radarr_import = result["date_sources"].get("radarr_import")
|
||||
digital_release = result["date_sources"].get("digital_release")
|
||||
@@ -1205,8 +1214,9 @@ async def debug_movie_priority_logic(imdb_id: str):
|
||||
# Check for file date fallback logic
|
||||
if radarr_import and radarr_import["source"] == "radarr:db.file.dateAdded" and digital_release:
|
||||
# Test the smart logic
|
||||
would_prefer_digital = movie_processor._should_prefer_digital_over_file_date(
|
||||
digital_release["date"],
|
||||
would_prefer_digital = movie_processor._should_prefer_release_over_file_date(
|
||||
digital_release["date"],
|
||||
digital_release["source"],
|
||||
None, # We don't have theatrical date in this debug context
|
||||
imdb_id
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user