Add year support to anime folder names
- Add year property to Serie entity with name_with_year - Add year column to AnimeSeries database model - Add get_year() method to AniworldLoader provider - Extract year from folder names before fetching from API - Update SerieScanner to populate year during rescan - Update add_series endpoint to fetch and store year - Optimize: check folder name for year before API call
This commit is contained in:
@@ -693,10 +693,26 @@ async def add_series(
|
||||
detail="Could not extract series key from link",
|
||||
)
|
||||
|
||||
# Step B: Create sanitized folder name from display name
|
||||
# Step B: Fetch year from provider and create folder name with year
|
||||
name = request.name.strip()
|
||||
|
||||
# Fetch year from provider
|
||||
year = None
|
||||
if series_app and hasattr(series_app, 'loader'):
|
||||
try:
|
||||
year = series_app.loader.get_year(key)
|
||||
logger.info(f"Fetched year for {key}: {year}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Could not fetch year for {key}: {e}")
|
||||
|
||||
# Create folder name with year if available
|
||||
if year:
|
||||
folder_name_with_year = f"{name} ({year})"
|
||||
else:
|
||||
folder_name_with_year = name
|
||||
|
||||
try:
|
||||
folder = sanitize_folder_name(name)
|
||||
folder = sanitize_folder_name(folder_name_with_year)
|
||||
except ValueError as e:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
@@ -729,14 +745,16 @@ async def add_series(
|
||||
name=name,
|
||||
site="aniworld.to",
|
||||
folder=folder,
|
||||
year=year,
|
||||
)
|
||||
db_id = anime_series.id
|
||||
|
||||
logger.info(
|
||||
"Added series to database: %s (key=%s, db_id=%d)",
|
||||
"Added series to database: %s (key=%s, db_id=%d, year=%s)",
|
||||
name,
|
||||
key,
|
||||
db_id
|
||||
db_id,
|
||||
year
|
||||
)
|
||||
|
||||
# Step D: Add to SerieList (in-memory only, no folder creation)
|
||||
@@ -746,17 +764,19 @@ async def add_series(
|
||||
name=name,
|
||||
site="aniworld.to",
|
||||
folder=folder,
|
||||
episodeDict={}
|
||||
episodeDict={},
|
||||
year=year
|
||||
)
|
||||
|
||||
# Add to in-memory cache without creating folder on disk
|
||||
if hasattr(series_app.list, 'keyDict'):
|
||||
series_app.list.keyDict[key] = serie
|
||||
logger.info(
|
||||
"Added series to in-memory cache: %s (key=%s, folder=%s)",
|
||||
"Added series to in-memory cache: %s (key=%s, folder=%s, year=%s)",
|
||||
name,
|
||||
key,
|
||||
folder
|
||||
folder,
|
||||
year
|
||||
)
|
||||
|
||||
# Step E: Trigger targeted scan for missing episodes
|
||||
|
||||
@@ -73,6 +73,10 @@ class AnimeSeries(Base, TimestampMixin):
|
||||
String(1000), nullable=False,
|
||||
doc="Filesystem folder name - METADATA ONLY, not for lookups"
|
||||
)
|
||||
year: Mapped[Optional[int]] = mapped_column(
|
||||
Integer, nullable=True,
|
||||
doc="Release year of the series"
|
||||
)
|
||||
|
||||
# Relationships
|
||||
episodes: Mapped[List["Episode"]] = relationship(
|
||||
|
||||
@@ -64,6 +64,7 @@ class AnimeSeriesService:
|
||||
name: str,
|
||||
site: str,
|
||||
folder: str,
|
||||
year: int | None = None,
|
||||
) -> AnimeSeries:
|
||||
"""Create a new anime series.
|
||||
|
||||
@@ -73,6 +74,7 @@ class AnimeSeriesService:
|
||||
name: Series name
|
||||
site: Provider site URL
|
||||
folder: Local filesystem path
|
||||
year: Release year (optional)
|
||||
|
||||
Returns:
|
||||
Created AnimeSeries instance
|
||||
@@ -85,11 +87,12 @@ class AnimeSeriesService:
|
||||
name=name,
|
||||
site=site,
|
||||
folder=folder,
|
||||
year=year,
|
||||
)
|
||||
db.add(series)
|
||||
await db.flush()
|
||||
await db.refresh(series)
|
||||
logger.info(f"Created anime series: {series.name} (key={series.key})")
|
||||
logger.info(f"Created anime series: {series.name} (key={series.key}, year={year})")
|
||||
return series
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -594,6 +594,7 @@ class AnimeService:
|
||||
name=serie.name,
|
||||
site=serie.site,
|
||||
folder=serie.folder,
|
||||
year=serie.year if hasattr(serie, 'year') else None,
|
||||
)
|
||||
|
||||
# Create Episode records
|
||||
@@ -608,9 +609,10 @@ class AnimeService:
|
||||
)
|
||||
|
||||
logger.debug(
|
||||
"Created series in database: %s (key=%s)",
|
||||
"Created series in database: %s (key=%s, year=%s)",
|
||||
serie.name,
|
||||
serie.key
|
||||
serie.key,
|
||||
serie.year if hasattr(serie, 'year') else None
|
||||
)
|
||||
|
||||
async def _update_series_in_db(self, serie, existing, db) -> None:
|
||||
@@ -768,6 +770,7 @@ class AnimeService:
|
||||
name=serie.name,
|
||||
site=serie.site,
|
||||
folder=serie.folder,
|
||||
year=serie.year if hasattr(serie, 'year') else None,
|
||||
)
|
||||
|
||||
# Create Episode records for each episode in episodeDict
|
||||
@@ -782,9 +785,10 @@ class AnimeService:
|
||||
)
|
||||
|
||||
logger.info(
|
||||
"Added series to database: %s (key=%s)",
|
||||
"Added series to database: %s (key=%s, year=%s)",
|
||||
serie.name,
|
||||
serie.key
|
||||
serie.key,
|
||||
serie.year if hasattr(serie, 'year') else None
|
||||
)
|
||||
|
||||
return anime_series
|
||||
|
||||
Reference in New Issue
Block a user