feat: improve NFO file organization by moving NFOGuard elements to bottom
NFO Organization Enhancement: - Move all NFOGuard elements (dateadded, lockdata, comments) to bottom of NFO files - Remove existing NFOGuard elements and re-add at bottom for clean organization - Provides better separation between media metadata and NFOGuard management - Easier to read NFO files when Radarr/Sonarr has already populated extensive metadata Before: NFOGuard elements mixed throughout existing metadata After: All media metadata first, then NFOGuard elements grouped at bottom This addresses user feedback about NFO readability when files already contain extensive metadata from Radarr, making it easier to see both media info and NFOGuard management details in a logical order.
This commit is contained in:
+38
-1
@@ -376,6 +376,43 @@ Curl scan → Check database → Find 8:30am webhook entry → NFO shows 8:30am
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🆕 v0.7.1 NFO Organization Improvement (September 2025)
|
||||||
|
|
||||||
|
**📝 Better NFO File Organization:**
|
||||||
|
- **Problem**: NFOGuard elements mixed throughout existing Radarr metadata made files hard to read
|
||||||
|
- **Solution**: Move all NFOGuard elements (`<dateadded>`, `<lockdata>`, comments) to bottom of NFO files
|
||||||
|
- **Benefit**: Easier to read NFO files with clean separation between media metadata and NFOGuard management
|
||||||
|
|
||||||
|
**🔧 Technical Implementation:**
|
||||||
|
- **Smart Element Management**: Remove existing NFOGuard elements and re-add at bottom
|
||||||
|
- **Preserved Functionality**: All existing behavior maintained, just better organization
|
||||||
|
- **Both Media Types**: Applied to both movie and TV episode NFO files
|
||||||
|
|
||||||
|
**📋 Before/After NFO Structure:**
|
||||||
|
```xml
|
||||||
|
<!-- Before (Mixed) -->
|
||||||
|
<plot>Movie plot...</plot>
|
||||||
|
<dateadded>2025-09-14T10:02:00-04:00</dateadded> <!-- Mixed in middle -->
|
||||||
|
<title>Movie Title</title>
|
||||||
|
<lockdata>true</lockdata> <!-- Mixed in middle -->
|
||||||
|
<director>Director Name</director>
|
||||||
|
<!-- source: Movie; webhook:first_seen --> <!-- At end -->
|
||||||
|
|
||||||
|
<!-- After (Organized) -->
|
||||||
|
<plot>Movie plot...</plot>
|
||||||
|
<title>Movie Title</title>
|
||||||
|
<director>Director Name</director>
|
||||||
|
<!-- All media metadata first, then NFOGuard elements at bottom -->
|
||||||
|
<dateadded>2025-09-14T10:02:00-04:00</dateadded>
|
||||||
|
<lockdata>true</lockdata>
|
||||||
|
<!-- source: Movie; webhook:first_seen -->
|
||||||
|
<!-- managed by NFOGuard at 2025-09-14T11:30:00-04:00 -->
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
**Last Updated:** September 14, 2025
|
**Last Updated:** September 14, 2025
|
||||||
**Version:** v0.7.0
|
**Version:** v0.7.1
|
||||||
**Status:** Production Ready - Major Architecture
|
**Status:** Production Ready - Major Architecture
|
||||||
+16
-4
@@ -182,18 +182,30 @@ class NFOManager:
|
|||||||
self._ensure_child_text(root, "premiered", release_date, overwrite=False)
|
self._ensure_child_text(root, "premiered", release_date, overwrite=False)
|
||||||
self._ensure_child_text(root, "year", release_date.split("-")[0], overwrite=False)
|
self._ensure_child_text(root, "year", release_date.split("-")[0], overwrite=False)
|
||||||
|
|
||||||
|
# Add NFOGuard elements at the bottom for better organization
|
||||||
|
self._strip_existing_footer_comments(root)
|
||||||
|
|
||||||
|
# Remove existing NFOGuard elements to re-add them at bottom
|
||||||
|
for elem in root.findall(".//dateadded"):
|
||||||
|
root.remove(elem)
|
||||||
|
for elem in root.findall(".//lockdata"):
|
||||||
|
root.remove(elem)
|
||||||
|
|
||||||
|
# Add NFOGuard elements at bottom
|
||||||
if dateadded:
|
if dateadded:
|
||||||
if dateadded == "MANUAL_REVIEW_NEEDED":
|
if dateadded == "MANUAL_REVIEW_NEEDED":
|
||||||
self._ensure_child_text(root, "dateadded", "MANUAL_REVIEW_NEEDED", overwrite=True)
|
dateadded_elem = ET.SubElement(root, "dateadded")
|
||||||
|
dateadded_elem.text = "MANUAL_REVIEW_NEEDED"
|
||||||
_log("WARNING", f"Set MANUAL_REVIEW_NEEDED marker in NFO: {movie_dir}/movie.nfo")
|
_log("WARNING", f"Set MANUAL_REVIEW_NEEDED marker in NFO: {movie_dir}/movie.nfo")
|
||||||
else:
|
else:
|
||||||
self._ensure_child_text(root, "dateadded", dateadded, overwrite=True)
|
dateadded_elem = ET.SubElement(root, "dateadded")
|
||||||
|
dateadded_elem.text = dateadded
|
||||||
|
|
||||||
if lock_metadata:
|
if lock_metadata:
|
||||||
self._ensure_child_text(root, "lockdata", "true", overwrite=True)
|
lockdata_elem = ET.SubElement(root, "lockdata")
|
||||||
|
lockdata_elem.text = "true"
|
||||||
|
|
||||||
# Add footer comments with timestamp
|
# Add footer comments with timestamp
|
||||||
self._strip_existing_footer_comments(root)
|
|
||||||
local_tz = _get_local_timezone()
|
local_tz = _get_local_timezone()
|
||||||
current_time = datetime.now(local_tz).isoformat(timespec="seconds")
|
current_time = datetime.now(local_tz).isoformat(timespec="seconds")
|
||||||
root.append(ET.Comment(f" source: Movie; {source_detail} "))
|
root.append(ET.Comment(f" source: Movie; {source_detail} "))
|
||||||
|
|||||||
Reference in New Issue
Block a user