digital release date

This commit is contained in:
2025-09-09 09:18:33 -04:00
parent 149bf9acd3
commit bbbf4b63cc
3 changed files with 171 additions and 21 deletions
+86 -11
View File
@@ -96,6 +96,7 @@ 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.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()
@@ -460,16 +461,31 @@ class MovieProcessor:
# Try import history first if configured
if config.movie_priority == "import_then_digital":
import_date, import_source = None, None
if radarr_movie:
movie_id = radarr_movie.get("id")
if movie_id:
import_date, import_source = self.radarr.get_movie_import_date(movie_id)
if import_date:
return import_date, import_source, released
# Fall back to digital release
# Check if we got a real import date or just file date fallback
if import_date and import_source != "radarr:db.file.dateAdded":
return import_date, import_source, released
# Get digital release date for comparison
digital_date, digital_source = self._get_digital_release_date(imdb_id)
if digital_date:
# 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):
return digital_date, digital_source, released
else:
return import_date, import_source, released
# Use whichever we have
if import_date:
return import_date, import_source, released
elif digital_date:
return digital_date, digital_source, released
else: # digital_then_import
@@ -519,6 +535,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:
"""
Decide if digital 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
"""
try:
digital_dt = datetime.fromisoformat(digital_date.replace("Z", "+00:00"))
# If we have theatrical release date, compare
if theatrical_release:
theatrical_dt = datetime.fromisoformat(theatrical_release.replace("Z", "+00:00"))
year_diff = digital_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")
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")
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")
return True
_log("INFO", f"Digital date {digital_date} seems too old for {imdb_id}, using file date instead")
return False
except Exception as e:
_log("WARNING", f"Error comparing dates for {imdb_id}: {e}")
return False
def _parse_date_to_iso(self, date_str: str) -> Optional[str]:
"""Parse date string to ISO format"""
if not date_str:
@@ -1152,13 +1206,34 @@ 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"
if result["date_sources"].get("radarr_import"):
result["selected_date"] = result["date_sources"]["radarr_import"]["date"]
result["selected_source"] = result["date_sources"]["radarr_import"]["source"]
elif result["date_sources"].get("digital_release"):
result["selected_date"] = result["date_sources"]["digital_release"]["date"]
result["selected_source"] = result["date_sources"]["digital_release"]["source"]
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."
radarr_import = result["date_sources"].get("radarr_import")
digital_release = result["date_sources"].get("digital_release")
# 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"],
None, # We don't have theatrical date in this debug context
imdb_id
)
result["file_date_detected"] = True
result["would_prefer_digital"] = would_prefer_digital
if would_prefer_digital:
result["selected_date"] = digital_release["date"]
result["selected_source"] = digital_release["source"] + " (preferred over file date)"
else:
result["selected_date"] = radarr_import["date"]
result["selected_source"] = radarr_import["source"] + " (digital too old)"
elif radarr_import and radarr_import["source"] != "radarr:db.file.dateAdded":
result["selected_date"] = radarr_import["date"]
result["selected_source"] = radarr_import["source"]
elif digital_release:
result["selected_date"] = digital_release["date"]
result["selected_source"] = digital_release["source"]
else: # digital_then_import
result["priority_explanation"] = "1st: TMDB/OMDb digital release, 2nd: Radarr import history, 3rd: file mtime"
if result["date_sources"].get("digital_release"):