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:
341
docs/API.md
341
docs/API.md
@@ -804,7 +804,334 @@ Source: [src/server/api/config.py](../src/server/api/config.py#L189-L247)
|
||||
|
||||
---
|
||||
|
||||
## 6. Scheduler Endpoints
|
||||
## 6. NFO Management Endpoints
|
||||
|
||||
Prefix: `/api/nfo`
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L1-L684)
|
||||
|
||||
These endpoints manage tvshow.nfo metadata files and associated media (poster, logo, fanart) for anime series. NFO files use Kodi/XBMC format and are scraped from TMDB API.
|
||||
|
||||
**Prerequisites:**
|
||||
- TMDB API key must be configured in settings
|
||||
- NFO service returns 503 if API key not configured
|
||||
|
||||
### GET /api/nfo/{serie_id}/check
|
||||
|
||||
Check if NFO file and media files exist for a series.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Path Parameters:**
|
||||
- `serie_id` (string): Series identifier
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"serie_id": "one-piece",
|
||||
"serie_folder": "One Piece (1999)",
|
||||
"has_nfo": true,
|
||||
"nfo_path": "/path/to/anime/One Piece (1999)/tvshow.nfo",
|
||||
"media_files": {
|
||||
"has_poster": true,
|
||||
"has_logo": false,
|
||||
"has_fanart": true,
|
||||
"poster_path": "/path/to/anime/One Piece (1999)/poster.jpg",
|
||||
"logo_path": null,
|
||||
"fanart_path": "/path/to/anime/One Piece (1999)/fanart.jpg"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `404 Not Found` - Series not found
|
||||
- `503 Service Unavailable` - TMDB API key not configured
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L90-L147)
|
||||
|
||||
### POST /api/nfo/{serie_id}/create
|
||||
|
||||
Create NFO file and download media for a series.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Path Parameters:**
|
||||
- `serie_id` (string): Series identifier
|
||||
|
||||
**Request Body:**
|
||||
```json
|
||||
{
|
||||
"serie_name": "One Piece",
|
||||
"year": 1999,
|
||||
"download_poster": true,
|
||||
"download_logo": true,
|
||||
"download_fanart": true,
|
||||
"overwrite_existing": false
|
||||
}
|
||||
```
|
||||
|
||||
**Fields:**
|
||||
- `serie_name` (string, optional): Series name for TMDB search (defaults to folder name)
|
||||
- `year` (integer, optional): Series year to help narrow TMDB search
|
||||
- `download_poster` (boolean, default: true): Download poster.jpg
|
||||
- `download_logo` (boolean, default: true): Download logo.png
|
||||
- `download_fanart` (boolean, default: true): Download fanart.jpg
|
||||
- `overwrite_existing` (boolean, default: false): Overwrite existing NFO
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"serie_id": "one-piece",
|
||||
"serie_folder": "One Piece (1999)",
|
||||
"nfo_path": "/path/to/anime/One Piece (1999)/tvshow.nfo",
|
||||
"media_files": {
|
||||
"has_poster": true,
|
||||
"has_logo": true,
|
||||
"has_fanart": true,
|
||||
"poster_path": "/path/to/anime/One Piece (1999)/poster.jpg",
|
||||
"logo_path": "/path/to/anime/One Piece (1999)/logo.png",
|
||||
"fanart_path": "/path/to/anime/One Piece (1999)/fanart.jpg"
|
||||
},
|
||||
"message": "NFO and media files created successfully"
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `404 Not Found` - Series not found
|
||||
- `409 Conflict` - NFO already exists (use `overwrite_existing: true`)
|
||||
- `503 Service Unavailable` - TMDB API error or key not configured
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L150-L240)
|
||||
|
||||
### PUT /api/nfo/{serie_id}/update
|
||||
|
||||
Update existing NFO file with fresh TMDB data.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Path Parameters:**
|
||||
- `serie_id` (string): Series identifier
|
||||
|
||||
**Query Parameters:**
|
||||
- `download_media` (boolean, default: true): Re-download media files
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"serie_id": "one-piece",
|
||||
"serie_folder": "One Piece (1999)",
|
||||
"nfo_path": "/path/to/anime/One Piece (1999)/tvshow.nfo",
|
||||
"media_files": {
|
||||
"has_poster": true,
|
||||
"has_logo": true,
|
||||
"has_fanart": true,
|
||||
"poster_path": "/path/to/anime/One Piece (1999)/poster.jpg",
|
||||
"logo_path": "/path/to/anime/One Piece (1999)/logo.png",
|
||||
"fanart_path": "/path/to/anime/One Piece (1999)/fanart.jpg"
|
||||
},
|
||||
"message": "NFO updated successfully"
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `404 Not Found` - Series or NFO not found (use create endpoint)
|
||||
- `503 Service Unavailable` - TMDB API error
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L243-L325)
|
||||
|
||||
### GET /api/nfo/{serie_id}/content
|
||||
|
||||
Get NFO file XML content for a series.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Path Parameters:**
|
||||
- `serie_id` (string): Series identifier
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"serie_id": "one-piece",
|
||||
"serie_folder": "One Piece (1999)",
|
||||
"content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<tvshow>...</tvshow>",
|
||||
"file_size": 2048,
|
||||
"last_modified": "2026-01-15T10:30:00"
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `404 Not Found` - Series or NFO not found
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L328-L397)
|
||||
|
||||
### GET /api/nfo/{serie_id}/media/status
|
||||
|
||||
Get media files status for a series.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Path Parameters:**
|
||||
- `serie_id` (string): Series identifier
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"has_poster": true,
|
||||
"has_logo": false,
|
||||
"has_fanart": true,
|
||||
"poster_path": "/path/to/anime/One Piece (1999)/poster.jpg",
|
||||
"logo_path": null,
|
||||
"fanart_path": "/path/to/anime/One Piece (1999)/fanart.jpg"
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `404 Not Found` - Series not found
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L400-L447)
|
||||
|
||||
### POST /api/nfo/{serie_id}/media/download
|
||||
|
||||
Download missing media files for a series.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Path Parameters:**
|
||||
- `serie_id` (string): Series identifier
|
||||
|
||||
**Request Body:**
|
||||
```json
|
||||
{
|
||||
"download_poster": true,
|
||||
"download_logo": true,
|
||||
"download_fanart": true
|
||||
}
|
||||
```
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"has_poster": true,
|
||||
"has_logo": true,
|
||||
"has_fanart": true,
|
||||
"poster_path": "/path/to/anime/One Piece (1999)/poster.jpg",
|
||||
"logo_path": "/path/to/anime/One Piece (1999)/logo.png",
|
||||
"fanart_path": "/path/to/anime/One Piece (1999)/fanart.jpg"
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `404 Not Found` - Series or NFO not found (NFO required for TMDB ID)
|
||||
- `503 Service Unavailable` - TMDB API error
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L450-L519)
|
||||
|
||||
### POST /api/nfo/batch/create
|
||||
|
||||
Batch create NFO files for multiple series.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Request Body:**
|
||||
```json
|
||||
{
|
||||
"serie_ids": ["one-piece", "naruto", "bleach"],
|
||||
"download_media": true,
|
||||
"skip_existing": true,
|
||||
"max_concurrent": 3
|
||||
}
|
||||
```
|
||||
|
||||
**Fields:**
|
||||
- `serie_ids` (array of strings): Series identifiers to process
|
||||
- `download_media` (boolean, default: true): Download media files
|
||||
- `skip_existing` (boolean, default: true): Skip series with existing NFOs
|
||||
- `max_concurrent` (integer, 1-10, default: 3): Number of concurrent operations
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"total": 3,
|
||||
"successful": 2,
|
||||
"failed": 0,
|
||||
"skipped": 1,
|
||||
"results": [
|
||||
{
|
||||
"serie_id": "one-piece",
|
||||
"serie_folder": "One Piece (1999)",
|
||||
"success": true,
|
||||
"message": "NFO created successfully",
|
||||
"nfo_path": "/path/to/anime/One Piece (1999)/tvshow.nfo"
|
||||
},
|
||||
{
|
||||
"serie_id": "naruto",
|
||||
"serie_folder": "Naruto (2002)",
|
||||
"success": false,
|
||||
"message": "Skipped - NFO already exists",
|
||||
"nfo_path": null
|
||||
},
|
||||
{
|
||||
"serie_id": "bleach",
|
||||
"serie_folder": "Bleach (2004)",
|
||||
"success": true,
|
||||
"message": "NFO created successfully",
|
||||
"nfo_path": "/path/to/anime/Bleach (2004)/tvshow.nfo"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `503 Service Unavailable` - TMDB API key not configured
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L522-L634)
|
||||
|
||||
### GET /api/nfo/missing
|
||||
|
||||
Get list of series without NFO files.
|
||||
|
||||
**Authentication:** Required
|
||||
|
||||
**Response (200 OK):**
|
||||
```json
|
||||
{
|
||||
"total_series": 150,
|
||||
"missing_nfo_count": 23,
|
||||
"series": [
|
||||
{
|
||||
"serie_id": "dragon-ball",
|
||||
"serie_folder": "Dragon Ball (1986)",
|
||||
"serie_name": "Dragon Ball",
|
||||
"has_media": false,
|
||||
"media_files": {
|
||||
"has_poster": false,
|
||||
"has_logo": false,
|
||||
"has_fanart": false,
|
||||
"poster_path": null,
|
||||
"logo_path": null,
|
||||
"fanart_path": null
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**Errors:**
|
||||
- `401 Unauthorized` - Not authenticated
|
||||
- `503 Service Unavailable` - TMDB API key not configured
|
||||
|
||||
Source: [src/server/api/nfo.py](../src/server/api/nfo.py#L637-L684)
|
||||
|
||||
---
|
||||
|
||||
## 7. Scheduler Endpoints
|
||||
|
||||
Prefix: `/api/scheduler`
|
||||
|
||||
@@ -865,7 +1192,7 @@ Source: [src/server/api/scheduler.py](../src/server/api/scheduler.py#L78-L122)
|
||||
|
||||
---
|
||||
|
||||
## 7. Health Check Endpoints
|
||||
## 8. Health Check Endpoints
|
||||
|
||||
Prefix: `/health`
|
||||
|
||||
@@ -930,7 +1257,7 @@ Source: [src/server/api/health.py](../src/server/api/health.py#L164-L200)
|
||||
|
||||
---
|
||||
|
||||
## 8. WebSocket Protocol
|
||||
## 9. WebSocket Protocol
|
||||
|
||||
Endpoint: `/ws/connect`
|
||||
|
||||
@@ -1039,7 +1366,7 @@ Source: [src/server/api/websocket.py](../src/server/api/websocket.py#L238-L260)
|
||||
|
||||
---
|
||||
|
||||
## 9. Data Models
|
||||
## 10. Data Models
|
||||
|
||||
### Download Item
|
||||
|
||||
@@ -1100,7 +1427,7 @@ Source: [src/server/models/download.py](../src/server/models/download.py#L44-L60
|
||||
|
||||
---
|
||||
|
||||
## 10. Error Handling
|
||||
## 11. Error Handling
|
||||
|
||||
### HTTP Status Codes
|
||||
|
||||
@@ -1146,7 +1473,7 @@ Source: [src/server/middleware/error_handler.py](../src/server/middleware/error_
|
||||
|
||||
---
|
||||
|
||||
## 11. Rate Limiting
|
||||
## 12. Rate Limiting
|
||||
|
||||
### Authentication Endpoints
|
||||
|
||||
@@ -1175,7 +1502,7 @@ HTTP Status: 429 Too Many Requests
|
||||
|
||||
---
|
||||
|
||||
## 12. Pagination
|
||||
## 13. Pagination
|
||||
|
||||
The anime list endpoint supports pagination.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user