Fix NFO folder naming to include year

- Add Serie.ensure_folder_with_year() method to ensure folder names include year
- Update all NFO API endpoints to call ensure_folder_with_year() before operations
- Folder format is now 'Name (Year)' when year is available
- Add comprehensive tests for ensure_folder_with_year() method
- All 5 tests passing
This commit is contained in:
2026-01-18 12:28:38 +01:00
parent 03901a8c2d
commit 491daa2e50
4 changed files with 148 additions and 8 deletions

View File

@@ -1,4 +1,5 @@
import json
import logging
import os
import warnings
from pathlib import Path
@@ -6,6 +7,8 @@ from typing import Optional
from src.server.utils.filesystem import sanitize_folder_name
logger = logging.getLogger(__name__)
class Serie:
"""
@@ -290,6 +293,36 @@ class Serie:
# Fallback to key if name cannot be sanitized
return sanitize_folder_name(self._key)
def ensure_folder_with_year(self) -> str:
"""Ensure folder name includes year if available.
If the serie has a year and the current folder name doesn't include it,
updates the folder name to include the year in format "Name (Year)".
This method should be called before creating folders or NFO files to
ensure consistent naming across the application.
Returns:
str: The folder name (updated if needed)
Example:
>>> serie = Serie("perfect-blue", "Perfect Blue", ..., folder="Perfect Blue", year=1997)
>>> serie.ensure_folder_with_year()
'Perfect Blue (1997)'
>>> serie.folder # folder property is updated
'Perfect Blue (1997)'
"""
if self._year:
# Check if folder already has year format
year_pattern = f"({self._year})"
if year_pattern not in self._folder:
# Update folder to include year
self._folder = self.sanitized_folder
logger.info(
f"Updated folder name for '{self._key}' to include year: {self._folder}"
)
return self._folder
def to_dict(self):
"""Convert Serie object to dictionary for JSON serialization."""
return {

View File

@@ -133,7 +133,8 @@ async def check_nfo(
detail=f"Series not found: {serie_id}"
)
serie_folder = serie.folder
# Ensure folder name includes year if available
serie_folder = serie.ensure_folder_with_year()
# Check NFO
has_nfo = await nfo_service.check_nfo_exists(serie_folder)
@@ -201,7 +202,11 @@ async def create_nfo(
detail=f"Series not found: {serie_id}"
)
serie_folder = serie.folder
# Ensure folder name includes year if available
serie_folder = serie.ensure_folder_with_year()
# If year not provided in request but serie has year, use it
year = request.year or serie.year
# Check if NFO already exists
if not request.overwrite_existing:
@@ -217,7 +222,7 @@ async def create_nfo(
nfo_path = await nfo_service.create_tvshow_nfo(
serie_name=serie_name,
serie_folder=serie_folder,
year=request.year,
year=year,
download_poster=request.download_poster,
download_logo=request.download_logo,
download_fanart=request.download_fanart
@@ -290,7 +295,8 @@ async def update_nfo(
detail=f"Series not found: {serie_id}"
)
serie_folder = serie.folder
# Ensure folder name includes year if available
serie_folder = serie.ensure_folder_with_year()
# Check if NFO exists
has_nfo = await nfo_service.check_nfo_exists(serie_folder)
@@ -371,7 +377,8 @@ async def get_nfo_content(
detail=f"Series not found: {serie_id}"
)
serie_folder = serie.folder
# Ensure folder name includes year if available
serie_folder = serie.ensure_folder_with_year()
# Check if NFO exists
nfo_path = (
@@ -494,7 +501,8 @@ async def download_media(
detail=f"Series not found: {serie_id}"
)
serie_folder = serie.folder
# Ensure folder name includes year if available
serie_folder = serie.ensure_folder_with_year()
# Check if NFO exists (needed for TMDB ID)
has_nfo = await nfo_service.check_nfo_exists(serie_folder)
@@ -575,7 +583,8 @@ async def batch_create_nfo(
message="Series not found"
)
serie_folder = serie.folder
# Ensure folder name includes year if available
serie_folder = serie.ensure_folder_with_year()
# Check if NFO exists
if request.skip_existing:
@@ -664,7 +673,8 @@ async def get_missing_nfo(
if not serie_id:
continue
serie_folder = serie.folder
# Ensure folder name includes year if available
serie_folder = serie.ensure_folder_with_year()
has_nfo = await nfo_service.check_nfo_exists(serie_folder)
if not has_nfo: