From 0827d30a76f5a834888120ac683eea5bd2414bf8 Mon Sep 17 00:00:00 2001 From: sbcrumb Date: Sat, 11 Oct 2025 14:38:37 -0400 Subject: [PATCH] Fix NFO extraction to handle lockdata+aired but no dateadded MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The root issue was that NFO extraction methods required both dateadded AND lockdata=true to return any data. But "The Chosen" NFOs have lockdata=true and aired dates but no dateadded field, so extraction returned None and TIER 2 fallback logic never triggered. Changes: - Modified extract_nfoguard_dates_from_nfo() to accept lockdata=true NFOs - Added support for extracting aired dates from episode NFOs - Updated logic to return data when lockdata=true regardless of dateadded - Now TIER 2 will properly apply aired->dateadded fallback logic - Updated version to 2.0.24 This ensures episodes with incomplete NFO metadata get proper fallback processing instead of being ignored by the three-tier system. 🤖 Generated with [Claude Code](https://claude.ai/code) --- VERSION | 2 +- core/nfo_manager.py | 28 ++++++++++++++++------------ 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/VERSION b/VERSION index 18f812f..8f4c02d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.23 +2.0.24 diff --git a/core/nfo_manager.py b/core/nfo_manager.py index 5a252c4..fc77d18 100644 --- a/core/nfo_manager.py +++ b/core/nfo_manager.py @@ -138,21 +138,25 @@ class NFOManager: # Look for NFOGuard fields dateadded_elem = root.find('.//dateadded') premiered_elem = root.find('.//premiered') + aired_elem = root.find('.//aired') # For TV episodes lockdata_elem = root.find('.//lockdata') - # Only consider it NFOGuard-managed if it has dateadded and lockdata - if (dateadded_elem is not None and dateadded_elem.text and - lockdata_elem is not None and lockdata_elem.text == "true"): - + # Consider it NFOGuard-managed if it has lockdata=true (with or without dateadded) + if lockdata_elem is not None and lockdata_elem.text == "true": result = { - "dateadded": dateadded_elem.text.strip(), "source": "nfo_file_existing" } + if dateadded_elem is not None and dateadded_elem.text: + result["dateadded"] = dateadded_elem.text.strip() + if premiered_elem is not None and premiered_elem.text: result["released"] = premiered_elem.text.strip() + + if aired_elem is not None and aired_elem.text: + result["aired"] = aired_elem.text.strip() - print(f"✅ Found NFOGuard data in NFO: dateadded={result['dateadded']}, released={result.get('released', 'None')}") + print(f"✅ Found NFOGuard data in NFO: dateadded={result.get('dateadded', 'None')}, released={result.get('released', 'None')}, aired={result.get('aired', 'None')}") return result except (ET.ParseError, Exception) as e: @@ -178,19 +182,19 @@ class NFOManager: aired_elem = root.find('.//aired') lockdata_elem = root.find('.//lockdata') - # Only consider it NFOGuard-managed if it has dateadded and lockdata - if (dateadded_elem is not None and dateadded_elem.text and - lockdata_elem is not None and lockdata_elem.text == "true"): - + # Consider it NFOGuard-managed if it has lockdata=true (with or without dateadded) + if lockdata_elem is not None and lockdata_elem.text == "true": result = { - "dateadded": dateadded_elem.text.strip(), "source": "episode_nfo_existing" } + if dateadded_elem is not None and dateadded_elem.text: + result["dateadded"] = dateadded_elem.text.strip() + if aired_elem is not None and aired_elem.text: result["aired"] = aired_elem.text.strip() - print(f"✅ Found NFOGuard data in episode NFO S{season_num:02d}E{episode_num:02d}: dateadded={result['dateadded']}, aired={result.get('aired', 'None')}") + print(f"✅ Found NFOGuard data in episode NFO S{season_num:02d}E{episode_num:02d}: dateadded={result.get('dateadded', 'None')}, aired={result.get('aired', 'None')}") return result except (ET.ParseError, Exception) as e: