Files
Aniworld/docs/task5_status.md
Lukas 94f4cc69c4 feat: Task 5 - Add NFO Management API Endpoints (85% complete)
- Create NFO API models (11 Pydantic models)
- Implement 8 REST API endpoints for NFO management
- Register NFO router in FastAPI app
- Create 18 comprehensive API tests
- Add detailed status documentation

Endpoints:
- GET /api/nfo/{id}/check - Check NFO/media status
- POST /api/nfo/{id}/create - Create NFO & media
- PUT /api/nfo/{id}/update - Update NFO
- GET /api/nfo/{id}/content - Get NFO content
- GET /api/nfo/{id}/media/status - Media status
- POST /api/nfo/{id}/media/download - Download media
- POST /api/nfo/batch/create - Batch operations
- GET /api/nfo/missing - List missing NFOs

Remaining: Refactor to use series_app dependency pattern
2026-01-15 20:06:37 +01:00

8.7 KiB

Task 5: NFO Management API Endpoints - Status Report

Summary

Task 5 creates REST API endpoints for NFO management, allowing frontend and external clients to check, create, update, and manage tvshow.nfo files and media.

Completed (85%)

1. NFO Request/Response Models (100%)

  • Created src/server/models/nfo.py (358 lines)
    • MediaFilesStatus - Status of poster/logo/fanart files
    • NFOCheckResponse - Response for NFO existence check
    • NFOCreateRequest - Request to create NFO with options
    • NFOCreateResponse - Response after NFO creation
    • NFOContentResponse - Response with NFO XML content
    • MediaDownloadRequest - Request to download specific media
    • NFOBatchCreateRequest - Batch create multiple NFOs
    • NFOBatchResult - Result for single series in batch
    • NFOBatchCreateResponse - Response after batch operation
    • NFOMissingSeries - Info about series missing NFO
    • NFOMissingResponse - Response listing series without NFOs
    • All models use Pydantic with comprehensive field descriptions

2. NFO API Router (100% created, needs refactoring)

  • Created src/server/api/nfo.py (688 lines)

    • GET /api/nfo/{serie_id}/check - Check NFO and media status
    • POST /api/nfo/{serie_id}/create - Create NFO and download media
    • PUT /api/nfo/{serie_id}/update - Update existing NFO
    • GET /api/nfo/{serie_id}/content - Get NFO XML content
    • GET /api/nfo/{serie_id}/media/status - Get media file status
    • POST /api/nfo/{serie_id}/media/download - Download media files
    • POST /api/nfo/batch/create - Batch create NFOs
    • GET /api/nfo/missing - List series without NFOs
    • All endpoints require authentication
    • Comprehensive error handling
    • Input validation via Pydantic
    • NFO service dependency injection
  • ⚠️ Needs Refactoring:

    • Currently uses anime_service.get_series_list() pattern
    • Should use series_app.list.GetList() pattern (existing codebase pattern)
    • Dependency should be series_app: SeriesApp = Depends(get_series_app)
    • All 8 endpoints need to be updated to use series_app

3. FastAPI Integration (100%)

  • Updated src/server/fastapi_app.py
    • Imported nfo_router
    • Registered router with app.include_router(nfo_router)
    • NFO endpoints now available at /api/nfo/*

4. API Tests (Created, needs updating)

  • Created tests/api/test_nfo_endpoints.py (506 lines)

    • 18 comprehensive test cases
    • Tests for all endpoints
    • Authentication tests
    • Success and error cases
    • Mocking strategy in place
  • ⚠️ Tests Currently Failing:

    • 17/18 tests failing due to dependency pattern mismatch
    • 1/18 passing (service unavailable test)
    • Tests mock anime_service but should mock series_app
    • Need to update all test fixtures and mocks

⚠️ Remaining Work (15%)

1. Refactor NFO API Endpoints (High Priority)

What needs to be done:

  • Update all 8 endpoints to use series_app dependency instead of anime_service
  • Change anime_service.get_series_list() to series_app.list.GetList()
  • Update dependency signatures in all endpoint functions
  • Verify error handling still works correctly

Example Change:

# BEFORE:
async def check_nfo(
    serie_id: str,
    _auth: dict = Depends(require_auth),
    anime_service: AnimeService = Depends(get_anime_service),
    nfo_service: NFOService = Depends(get_nfo_service)
):
    series_list = anime_service.get_series_list()

# AFTER:
async def check_nfo(
    serie_id: str,
    _auth: dict = Depends(require_auth),
    series_app: SeriesApp = Depends(get_series_app),
    nfo_service: NFOService = Depends(get_nfo_service)
):
    series_list = series_app.list.GetList()

2. Update API Tests (High Priority)

What needs to be done:

  • Update test fixtures to mock series_app instead of anime_service
  • Update dependency overrides in tests
  • Verify all 18 tests pass
  • Add any missing edge case tests

Example Change:

# BEFORE:
@pytest.fixture
def mock_anime_service():
    service = Mock()
    service.get_series_list = Mock(return_value=[serie])
    return service

# AFTER:
@pytest.fixture
def mock_series_app():
    app = Mock()
    list_mock = Mock()
    list_mock.GetList = Mock(return_value=[serie])
    app.list = list_mock
    return app

3. Documentation (Not Started)

What needs to be done:

  • Update docs/API.md with NFO endpoint documentation
  • Add endpoint examples and request/response formats
  • Document authentication requirements
  • Document error responses

📊 Test Statistics

  • Models: 11 Pydantic models created
  • Endpoints: 8 REST API endpoints implemented
  • Test Cases: 18 comprehensive tests written
  • Current Pass Rate: 1/18 (5.5%)
  • Expected Pass Rate after Refactor: 18/18 (100%)

🎯 Acceptance Criteria Status

Task 5 acceptance criteria:

  • All endpoints implemented and working (implementation complete, needs refactoring)
  • Proper authentication/authorization (all endpoints require auth)
  • Request validation with Pydantic (all models use Pydantic)
  • Comprehensive error handling (try/catch blocks in all endpoints)
  • API documentation updated (not started)
  • Integration tests pass (tests created, need updating)
  • Test coverage > 90% for endpoints (tests written, need fixing)

📝 Implementation Details

API Endpoints Summary

  1. GET /api/nfo/{serie_id}/check

    • Check if NFO and media files exist
    • Returns: NFOCheckResponse
    • Status: Implemented, needs refactoring
  2. POST /api/nfo/{serie_id}/create

    • Create NFO and download media files
    • Request: NFOCreateRequest
    • Returns: NFOCreateResponse
    • Status: Implemented, needs refactoring
  3. PUT /api/nfo/{serie_id}/update

    • Update existing NFO with fresh TMDB data
    • Query param: download_media (bool)
    • Returns: NFOCreateResponse
    • Status: Implemented, needs refactoring
  4. GET /api/nfo/{serie_id}/content

    • Get NFO XML content
    • Returns: NFOContentResponse
    • Status: Implemented, needs refactoring
  5. GET /api/nfo/{serie_id}/media/status

    • Get media files status
    • Returns: MediaFilesStatus
    • Status: Implemented, needs refactoring
  6. POST /api/nfo/{serie_id}/media/download

    • Download missing media files
    • Request: MediaDownloadRequest
    • Returns: MediaFilesStatus
    • Status: Implemented, needs refactoring
  7. POST /api/nfo/batch/create

    • Batch create NFOs for multiple series
    • Request: NFOBatchCreateRequest
    • Returns: NFOBatchCreateResponse
    • Supports concurrent processing (1-10 concurrent)
    • Status: Implemented, needs refactoring
  8. GET /api/nfo/missing

    • List all series without NFO files
    • Returns: NFOMissingResponse
    • Status: Implemented, needs refactoring

Error Handling

All endpoints handle:

  • 401 Unauthorized (no auth token)
  • 404 Not Found (series/NFO not found)
  • 409 Conflict (NFO already exists on create)
  • 503 Service Unavailable (TMDB API key not configured)
  • 500 Internal Server Error (unexpected errors)

Dependency Injection

  • require_auth - Ensures authentication
  • get_nfo_service - Provides NFOService instance
  • get_series_app - Should provide SeriesApp instance (needs updating)

🔄 Code Quality

  • Type Hints: Comprehensive type annotations throughout
  • Error Handling: Try/catch blocks in all endpoints
  • Logging: Error logging with exc_info=True
  • Validation: Pydantic models for all requests/responses
  • Code Style: Following project conventions (minor lint issues remain)

📋 Files Created/Modified

Created Files

Modified Files

Task 5 Status: 85% COMPLETE

Task 5 is 85% complete with all endpoints and models implemented. Remaining work:

  1. Refactor endpoints to use series_app dependency pattern (15 minutes)
  2. Update tests to match new dependency pattern (15 minutes)
  3. Add API documentation (30 minutes)

Estimated Time to Complete: 1 hour

🔧 Next Steps

  1. Refactor all NFO endpoints to use series_app pattern
  2. Update test fixtures and mocks
  3. Run tests and verify all pass
  4. Add API documentation
  5. Mark Task 5 complete
  6. Continue with Task 6: Add NFO UI Features