dev #62
+103
-75
@@ -2317,33 +2317,49 @@ def register_routes(app, dependencies: dict):
|
|||||||
for episode in episodes:
|
for episode in episodes:
|
||||||
# Build NFO path using series path
|
# Build NFO path using series path
|
||||||
series_name = os.path.basename(episode["series_path"])
|
series_name = os.path.basename(episode["series_path"])
|
||||||
nfo_path = os.path.join(
|
|
||||||
episode["series_path"],
|
|
||||||
f"Season {episode['season']:02d}",
|
|
||||||
f"S{episode['season']:02d}E{episode['episode']:02d}.nfo"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if NFO file exists and has dateadded
|
# Try multiple NFO file naming patterns that might exist
|
||||||
if os.path.exists(nfo_path):
|
season_dir = os.path.join(episode["series_path"], f"Season {episode['season']:02d}")
|
||||||
try:
|
|
||||||
tree = ET.parse(nfo_path)
|
# Handle Season 0 (Specials) naming
|
||||||
root = tree.getroot()
|
if episode['season'] == 0:
|
||||||
dateadded_elem = root.find("dateadded")
|
season_dir = os.path.join(episode["series_path"], "Specials")
|
||||||
|
|
||||||
# NFO file is missing dateadded element
|
nfo_patterns = [
|
||||||
if dateadded_elem is None or not dateadded_elem.text or not dateadded_elem.text.strip():
|
f"S{episode['season']:02d}E{episode['episode']:02d}.nfo",
|
||||||
missing_items["episodes"].append({
|
f"{series_name}-S{episode['season']:02d}E{episode['episode']:02d}*.nfo"
|
||||||
"imdb_id": episode["imdb_id"],
|
]
|
||||||
"season": episode["season"],
|
|
||||||
"episode": episode["episode"],
|
nfo_path = None
|
||||||
"series_name": series_name,
|
# Find the actual NFO file that exists
|
||||||
"series_path": episode["series_path"],
|
if os.path.exists(season_dir):
|
||||||
"dateadded": episode["dateadded"],
|
for pattern in nfo_patterns:
|
||||||
"nfo_path": nfo_path,
|
if '*' in pattern:
|
||||||
"reason": "NFO missing dateadded element"
|
# Use glob for wildcard patterns
|
||||||
})
|
import glob
|
||||||
except ET.ParseError as e:
|
matches = glob.glob(os.path.join(season_dir, pattern))
|
||||||
print(f"⚠️ Could not parse NFO file {nfo_path}: {e}")
|
if matches:
|
||||||
|
nfo_path = matches[0] # Use first match
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
# Direct file check
|
||||||
|
test_path = os.path.join(season_dir, pattern)
|
||||||
|
if os.path.exists(test_path):
|
||||||
|
nfo_path = test_path
|
||||||
|
break
|
||||||
|
|
||||||
|
# Skip if no NFO file found (already checked above)
|
||||||
|
if not nfo_path:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check if NFO file has dateadded element
|
||||||
|
try:
|
||||||
|
tree = ET.parse(nfo_path)
|
||||||
|
root = tree.getroot()
|
||||||
|
dateadded_elem = root.find("dateadded")
|
||||||
|
|
||||||
|
# NFO file is missing dateadded element
|
||||||
|
if dateadded_elem is None or not dateadded_elem.text or not dateadded_elem.text.strip():
|
||||||
missing_items["episodes"].append({
|
missing_items["episodes"].append({
|
||||||
"imdb_id": episode["imdb_id"],
|
"imdb_id": episode["imdb_id"],
|
||||||
"season": episode["season"],
|
"season": episode["season"],
|
||||||
@@ -2352,21 +2368,20 @@ def register_routes(app, dependencies: dict):
|
|||||||
"series_path": episode["series_path"],
|
"series_path": episode["series_path"],
|
||||||
"dateadded": episode["dateadded"],
|
"dateadded": episode["dateadded"],
|
||||||
"nfo_path": nfo_path,
|
"nfo_path": nfo_path,
|
||||||
"error": f"Parse error: {str(e)}"
|
"reason": "NFO missing dateadded element"
|
||||||
})
|
|
||||||
else:
|
|
||||||
# NFO file doesn't exist at all
|
|
||||||
if episode["has_video_file"]:
|
|
||||||
missing_items["episodes"].append({
|
|
||||||
"imdb_id": episode["imdb_id"],
|
|
||||||
"season": episode["season"],
|
|
||||||
"episode": episode["episode"],
|
|
||||||
"series_name": series_name,
|
|
||||||
"series_path": episode["series_path"],
|
|
||||||
"dateadded": episode["dateadded"],
|
|
||||||
"nfo_path": nfo_path,
|
|
||||||
"reason": "NFO file does not exist"
|
|
||||||
})
|
})
|
||||||
|
except ET.ParseError as e:
|
||||||
|
print(f"⚠️ Could not parse NFO file {nfo_path}: {e}")
|
||||||
|
missing_items["episodes"].append({
|
||||||
|
"imdb_id": episode["imdb_id"],
|
||||||
|
"season": episode["season"],
|
||||||
|
"episode": episode["episode"],
|
||||||
|
"series_name": series_name,
|
||||||
|
"series_path": episode["series_path"],
|
||||||
|
"dateadded": episode["dateadded"],
|
||||||
|
"nfo_path": nfo_path,
|
||||||
|
"error": f"Parse error: {str(e)}"
|
||||||
|
})
|
||||||
|
|
||||||
# Scan movies
|
# Scan movies
|
||||||
print("🎬 Scanning movies for missing dateadded elements")
|
print("🎬 Scanning movies for missing dateadded elements")
|
||||||
@@ -2387,49 +2402,62 @@ def register_routes(app, dependencies: dict):
|
|||||||
for movie in movies:
|
for movie in movies:
|
||||||
# Build NFO path using movie path
|
# Build NFO path using movie path
|
||||||
movie_title = os.path.basename(movie["path"])
|
movie_title = os.path.basename(movie["path"])
|
||||||
nfo_path = os.path.join(
|
|
||||||
movie["path"],
|
|
||||||
f"{movie_title}.nfo"
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if NFO file exists and has dateadded
|
# Try multiple NFO file naming patterns that might exist
|
||||||
if os.path.exists(nfo_path):
|
nfo_patterns = [
|
||||||
try:
|
f"{movie_title}.nfo",
|
||||||
tree = ET.parse(nfo_path)
|
"movie.nfo",
|
||||||
root = tree.getroot()
|
f"{movie_title}*.nfo"
|
||||||
dateadded_elem = root.find("dateadded")
|
]
|
||||||
|
|
||||||
# NFO file is missing dateadded element
|
nfo_path = None
|
||||||
if dateadded_elem is None or not dateadded_elem.text or not dateadded_elem.text.strip():
|
# Find the actual NFO file that exists
|
||||||
missing_items["movies"].append({
|
if os.path.exists(movie["path"]):
|
||||||
"imdb_id": movie["imdb_id"],
|
for pattern in nfo_patterns:
|
||||||
"title": movie_title,
|
if '*' in pattern:
|
||||||
"path": movie["path"],
|
# Use glob for wildcard patterns
|
||||||
"dateadded": movie["dateadded"],
|
import glob
|
||||||
"nfo_path": nfo_path,
|
matches = glob.glob(os.path.join(movie["path"], pattern))
|
||||||
"reason": "NFO missing dateadded element"
|
if matches:
|
||||||
})
|
nfo_path = matches[0] # Use first match
|
||||||
except ET.ParseError as e:
|
break
|
||||||
print(f"⚠️ Could not parse NFO file {nfo_path}: {e}")
|
else:
|
||||||
|
# Direct file check
|
||||||
|
test_path = os.path.join(movie["path"], pattern)
|
||||||
|
if os.path.exists(test_path):
|
||||||
|
nfo_path = test_path
|
||||||
|
break
|
||||||
|
|
||||||
|
# Skip if no NFO file found
|
||||||
|
if not nfo_path:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Check if NFO file has dateadded element
|
||||||
|
try:
|
||||||
|
tree = ET.parse(nfo_path)
|
||||||
|
root = tree.getroot()
|
||||||
|
dateadded_elem = root.find("dateadded")
|
||||||
|
|
||||||
|
# NFO file is missing dateadded element
|
||||||
|
if dateadded_elem is None or not dateadded_elem.text or not dateadded_elem.text.strip():
|
||||||
missing_items["movies"].append({
|
missing_items["movies"].append({
|
||||||
"imdb_id": movie["imdb_id"],
|
"imdb_id": movie["imdb_id"],
|
||||||
"title": movie_title,
|
"title": movie_title,
|
||||||
"path": movie["path"],
|
"path": movie["path"],
|
||||||
"dateadded": movie["dateadded"],
|
"dateadded": movie["dateadded"],
|
||||||
"nfo_path": nfo_path,
|
"nfo_path": nfo_path,
|
||||||
"error": f"Parse error: {str(e)}"
|
"reason": "NFO missing dateadded element"
|
||||||
})
|
|
||||||
else:
|
|
||||||
# NFO file doesn't exist at all
|
|
||||||
if movie["has_video_file"]:
|
|
||||||
missing_items["movies"].append({
|
|
||||||
"imdb_id": movie["imdb_id"],
|
|
||||||
"title": movie_title,
|
|
||||||
"path": movie["path"],
|
|
||||||
"dateadded": movie["dateadded"],
|
|
||||||
"nfo_path": nfo_path,
|
|
||||||
"reason": "NFO file does not exist"
|
|
||||||
})
|
})
|
||||||
|
except ET.ParseError as e:
|
||||||
|
print(f"⚠️ Could not parse NFO file {nfo_path}: {e}")
|
||||||
|
missing_items["movies"].append({
|
||||||
|
"imdb_id": movie["imdb_id"],
|
||||||
|
"title": movie_title,
|
||||||
|
"path": movie["path"],
|
||||||
|
"dateadded": movie["dateadded"],
|
||||||
|
"nfo_path": nfo_path,
|
||||||
|
"error": f"Parse error: {str(e)}"
|
||||||
|
})
|
||||||
|
|
||||||
total_missing = len(missing_items["episodes"]) + len(missing_items["movies"])
|
total_missing = len(missing_items["episodes"]) + len(missing_items["movies"])
|
||||||
print(f"✅ NFO repair scan complete: {total_missing} items missing dateadded elements")
|
print(f"✅ NFO repair scan complete: {total_missing} items missing dateadded elements")
|
||||||
|
|||||||
+2
-1
@@ -1570,9 +1570,10 @@ async def get_episodes_missing_nfo_dateadded(dependencies: dict):
|
|||||||
"season": episode["season"],
|
"season": episode["season"],
|
||||||
"episode": episode["episode"],
|
"episode": episode["episode"],
|
||||||
"series_name": episode["series_name"],
|
"series_name": episode["series_name"],
|
||||||
"episode_name": episode["episode_name"],
|
"series_path": episode.get("series_path"),
|
||||||
"dateadded": episode["dateadded"],
|
"dateadded": episode["dateadded"],
|
||||||
"nfo_path": episode["nfo_path"],
|
"nfo_path": episode["nfo_path"],
|
||||||
|
"reason": episode.get("reason", "NFO missing dateadded element"),
|
||||||
"media_type": "episode",
|
"media_type": "episode",
|
||||||
"nfo_exists": True,
|
"nfo_exists": True,
|
||||||
"dateadded_in_nfo": False,
|
"dateadded_in_nfo": False,
|
||||||
|
|||||||
Reference in New Issue
Block a user