Complete Task 5: NFO Management API Endpoints

- Added comprehensive API documentation for NFO endpoints
- Section 6 in API.md with all 8 endpoints documented
- Updated task5_status.md to reflect 100% completion
- Marked Task 5 complete in instructions.md
- All 17 tests passing (1 skipped by design)
- Endpoints: check, create, update, content, media status, download, batch, missing
This commit is contained in:
2026-01-16 18:41:48 +01:00
parent 94f4cc69c4
commit 56b4975d10
7 changed files with 762 additions and 337 deletions

View File

@@ -29,10 +29,7 @@ from src.server.models.nfo import (
NFOMissingResponse,
NFOMissingSeries,
)
from src.server.utils.dependencies import (
get_series_app,
require_auth,
)
from src.server.utils.dependencies import get_series_app, require_auth
logger = logging.getLogger(__name__)
@@ -91,7 +88,7 @@ def check_media_files(serie_folder: str) -> MediaFilesStatus:
async def check_nfo(
serie_id: str,
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service),
series_app: SeriesApp = Depends(get_series_app),
nfo_service: NFOService = Depends(get_nfo_service)
) -> NFOCheckResponse:
"""Check if NFO and media files exist for a series.
@@ -99,7 +96,7 @@ async def check_nfo(
Args:
serie_id: Series identifier
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
nfo_service: NFO service dependency
Returns:
@@ -110,7 +107,7 @@ async def check_nfo(
"""
try:
# Get series info
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
serie = next(
(s for s in series_list if getattr(s, 'key', None) == serie_id),
None
@@ -158,7 +155,7 @@ async def create_nfo(
serie_id: str,
request: NFOCreateRequest,
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service),
series_app: SeriesApp = Depends(get_series_app),
nfo_service: NFOService = Depends(get_nfo_service)
) -> NFOCreateResponse:
"""Create NFO file and download media for a series.
@@ -167,7 +164,7 @@ async def create_nfo(
serie_id: Series identifier
request: NFO creation options
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
nfo_service: NFO service dependency
Returns:
@@ -178,7 +175,7 @@ async def create_nfo(
"""
try:
# Get series info
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
serie = next(
(s for s in series_list if getattr(s, 'key', None) == serie_id),
None
@@ -247,7 +244,7 @@ async def update_nfo(
serie_id: str,
download_media: bool = True,
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service),
series_app: SeriesApp = Depends(get_series_app),
nfo_service: NFOService = Depends(get_nfo_service)
) -> NFOCreateResponse:
"""Update existing NFO file with fresh TMDB data.
@@ -256,7 +253,7 @@ async def update_nfo(
serie_id: Series identifier
download_media: Whether to re-download media files
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
nfo_service: NFO service dependency
Returns:
@@ -267,7 +264,7 @@ async def update_nfo(
"""
try:
# Get series info
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
serie = next(
(s for s in series_list if getattr(s, 'key', None) == serie_id),
None
@@ -329,7 +326,7 @@ async def update_nfo(
async def get_nfo_content(
serie_id: str,
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service),
series_app: SeriesApp = Depends(get_series_app),
nfo_service: NFOService = Depends(get_nfo_service)
) -> NFOContentResponse:
"""Get NFO file content for a series.
@@ -337,7 +334,7 @@ async def get_nfo_content(
Args:
serie_id: Series identifier
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
nfo_service: NFO service dependency
Returns:
@@ -348,7 +345,7 @@ async def get_nfo_content(
"""
try:
# Get series info
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
serie = next(
(s for s in series_list if getattr(s, 'key', None) == serie_id),
None
@@ -402,14 +399,14 @@ async def get_nfo_content(
async def get_media_status(
serie_id: str,
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service)
series_app: SeriesApp = Depends(get_series_app)
) -> MediaFilesStatus:
"""Get media files status for a series.
Args:
serie_id: Series identifier
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
Returns:
MediaFilesStatus with file existence info
@@ -419,7 +416,7 @@ async def get_media_status(
"""
try:
# Get series info
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
serie = next(
(s for s in series_list if getattr(s, 'key', None) == serie_id),
None
@@ -451,7 +448,7 @@ async def download_media(
serie_id: str,
request: MediaDownloadRequest,
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service),
series_app: SeriesApp = Depends(get_series_app),
nfo_service: NFOService = Depends(get_nfo_service)
) -> MediaFilesStatus:
"""Download missing media files for a series.
@@ -460,7 +457,7 @@ async def download_media(
serie_id: Series identifier
request: Media download options
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
nfo_service: NFO service dependency
Returns:
@@ -471,7 +468,7 @@ async def download_media(
"""
try:
# Get series info
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
serie = next(
(s for s in series_list if getattr(s, 'key', None) == serie_id),
None
@@ -521,7 +518,7 @@ async def download_media(
async def batch_create_nfo(
request: NFOBatchCreateRequest,
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service),
series_app: SeriesApp = Depends(get_series_app),
nfo_service: NFOService = Depends(get_nfo_service)
) -> NFOBatchCreateResponse:
"""Batch create NFO files for multiple series.
@@ -529,7 +526,7 @@ async def batch_create_nfo(
Args:
request: Batch creation options
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
nfo_service: NFO service dependency
Returns:
@@ -541,7 +538,7 @@ async def batch_create_nfo(
skipped = 0
# Get all series
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
series_map = {
getattr(s, 'key', None): s
for s in series_list
@@ -631,21 +628,21 @@ async def batch_create_nfo(
@router.get("/missing", response_model=NFOMissingResponse)
async def get_missing_nfo(
_auth: dict = Depends(require_auth),
anime_service: AnimeService = Depends(get_anime_service),
series_app: SeriesApp = Depends(get_series_app),
nfo_service: NFOService = Depends(get_nfo_service)
) -> NFOMissingResponse:
"""Get list of series without NFO files.
Args:
_auth: Authentication dependency
anime_service: Anime service dependency
series_app: Series app dependency
nfo_service: NFO service dependency
Returns:
NFOMissingResponse with series list
"""
try:
series_list = anime_service.get_series_list()
series_list = series_app.list.GetList()
missing_series: List[NFOMissingSeries] = []
for serie in series_list: