Task 3.1: Standardize series identifiers in DownloadService
- Updated DownloadService to use 'serie_id' (provider key) for identification - Changed 'serie_folder' from Optional to required in models (DownloadItem, DownloadRequest) - Removed incorrect fallback logic that used serie_id as folder name - Enhanced docstrings to clarify purpose of each identifier field: * serie_id: Provider key (e.g., 'attack-on-titan') for lookups * serie_folder: Filesystem folder name (e.g., 'Attack on Titan (2013)') for file operations - Updated logging to reference 'serie_key' for clarity - Fixed all unit tests to include required serie_folder field - All 25 download service tests passing - All 47 download model tests passing - Updated infrastructure.md with detailed documentation - Marked Task 3.1 as completed in instructions.md Benefits: - Clear separation between provider identifier and filesystem path - Prevents confusion from mixing different identifier types - Consistent with broader series identifier standardization effort - Better error messages when required fields are missing
This commit is contained in:
@@ -66,9 +66,19 @@ class DownloadItem(BaseModel):
|
||||
"""Represents a single download item in the queue."""
|
||||
|
||||
id: str = Field(..., description="Unique download item identifier")
|
||||
serie_id: str = Field(..., description="Series identifier (provider key)")
|
||||
serie_folder: Optional[str] = Field(
|
||||
None, description="Series folder name on disk"
|
||||
serie_id: str = Field(
|
||||
...,
|
||||
description=(
|
||||
"Series identifier - provider key "
|
||||
"(e.g., 'attack-on-titan')"
|
||||
)
|
||||
)
|
||||
serie_folder: str = Field(
|
||||
...,
|
||||
description=(
|
||||
"Series folder name on disk "
|
||||
"(e.g., 'Attack on Titan (2013)')"
|
||||
)
|
||||
)
|
||||
serie_name: str = Field(..., min_length=1, description="Series name")
|
||||
episode: EpisodeIdentifier = Field(
|
||||
@@ -160,9 +170,19 @@ class QueueStats(BaseModel):
|
||||
class DownloadRequest(BaseModel):
|
||||
"""Request to add episode(s) to the download queue."""
|
||||
|
||||
serie_id: str = Field(..., description="Series identifier (provider key)")
|
||||
serie_folder: Optional[str] = Field(
|
||||
None, description="Series folder name on disk"
|
||||
serie_id: str = Field(
|
||||
...,
|
||||
description=(
|
||||
"Series identifier - provider key "
|
||||
"(e.g., 'attack-on-titan')"
|
||||
)
|
||||
)
|
||||
serie_folder: str = Field(
|
||||
...,
|
||||
description=(
|
||||
"Series folder name on disk "
|
||||
"(e.g., 'Attack on Titan (2013)')"
|
||||
)
|
||||
)
|
||||
serie_name: str = Field(
|
||||
..., min_length=1, description="Series name for display"
|
||||
|
||||
@@ -239,11 +239,16 @@ class DownloadService:
|
||||
"""Add episodes to the download queue (FIFO order).
|
||||
|
||||
Args:
|
||||
serie_id: Series identifier (provider key)
|
||||
serie_folder: Series folder name on disk
|
||||
serie_name: Series display name
|
||||
serie_id: Series identifier - provider key (e.g.,
|
||||
'attack-on-titan'). This is the unique identifier used
|
||||
for lookups and identification.
|
||||
serie_folder: Series folder name on disk (e.g.,
|
||||
'Attack on Titan (2013)'). Used for filesystem operations
|
||||
only.
|
||||
serie_name: Series display name for user interface
|
||||
episodes: List of episodes to download
|
||||
priority: Queue priority level (ignored, kept for compatibility)
|
||||
priority: Queue priority level (ignored, kept for
|
||||
compatibility)
|
||||
|
||||
Returns:
|
||||
List of created download item IDs
|
||||
@@ -277,7 +282,8 @@ class DownloadService:
|
||||
logger.info(
|
||||
"Item added to queue",
|
||||
item_id=item.id,
|
||||
serie=serie_name,
|
||||
serie_key=serie_id,
|
||||
serie_name=serie_name,
|
||||
season=episode.season,
|
||||
episode=episode.episode,
|
||||
)
|
||||
@@ -792,7 +798,8 @@ class DownloadService:
|
||||
logger.info(
|
||||
"Starting download",
|
||||
item_id=item.id,
|
||||
serie=item.serie_name,
|
||||
serie_key=item.serie_id,
|
||||
serie_name=item.serie_name,
|
||||
season=item.episode.season,
|
||||
episode=item.episode.episode,
|
||||
)
|
||||
@@ -802,9 +809,15 @@ class DownloadService:
|
||||
# - download started/progress/completed/failed events
|
||||
# - All updates forwarded to ProgressService
|
||||
# - ProgressService broadcasts to WebSocket clients
|
||||
folder = item.serie_folder if item.serie_folder else item.serie_id
|
||||
# Use serie_folder for filesystem operations and serie_id (key) for identification
|
||||
if not item.serie_folder:
|
||||
raise DownloadServiceError(
|
||||
f"Missing serie_folder for download item {item.id}. "
|
||||
"serie_folder is required for filesystem operations."
|
||||
)
|
||||
|
||||
success = await self._anime_service.download(
|
||||
serie_folder=folder,
|
||||
serie_folder=item.serie_folder,
|
||||
season=item.episode.season,
|
||||
episode=item.episode.episode,
|
||||
key=item.serie_id,
|
||||
|
||||
Reference in New Issue
Block a user