# Bulk Update Media Items Update multiple media items at once (supports ebooks, comics, manga). **Endpoint**: `POST /api/media-items/bulk-update` **Auth**: Required **Content-Type**: `application/json` ## Request Body | Field | Type | Required | Description | |--------|------|-----------|-------------| | media_item_updates | array of objects | Yes | Array of update operations | | media_item_updates[].media_item_id | string (UUID) | Yes | Media item UUID to update | | media_item_updates[].updates | object | Yes | Fields to update | ### Update Fields | Field | Type | Required | Description | |--------|------|-----------|-------------| | title | string | No | Updated title | | author | string | No | Updated author | | genre | string | No | Updated genre | | language | string | No | Updated language (ISO 639-1 code) | | tags | array of strings | No | Updated tags (auto-normalized) | ### Example Request ```json { "media_item_updates": [ { "media_item_id": "550e8400-e29b-41d4-a716-446655440001", "updates": { "title": "Updated Title", "genre": "Science Fiction", "tags": ["science fiction", "space opera", "ACME CORP."] } }, { "media_item_id": "660e8400-e29b-41d4-a716-446655440002", "updates": { "author": "Updated Author Name", "language": "en" } } ] } ``` ## Response (200 OK) ```json { "results": [ { "media_item_id": "550e8400-e29b-41d4-a716-446655440001", "status": "success" }, { "media_item_id": "660e8400-e29b-41d4-a716-446655440002", "status": "error", "error": "Media item not found" } ], "total": 2, "updated": 1, "failed": 1 } ``` ## Response Fields | Field | Type | Description | |-------|------|-------------| | results | array | Individual result for each media item | | results[].media_item_id | string | UUID of the media item | | results[].status | string | "success" or "error" | | results[].error | string | Error message (only present if status is "error") | | total | number | Total number of media items processed | | updated | number | Number of media items successfully updated | | failed | number | Number of media items that failed to update | ## Tag and Contributor Normalization The backend automatically normalizes tags: - **Tags**: Titlecased, punctuation preserved, deduplicated - **Search fields**: Lowercase, no punctuation, stored in `tags_search` ## Error Responses | Code | Description | |------|-------------| | 400 | Invalid request data or empty media_item_updates array | | 401 | Invalid or expired token | | 403 | User does not have permission | | 404 | One or more media items not found | | 500 | Server error during update | ## Notes - **Partial success**: The operation continues even if some updates fail - **Invalid UUIDs**: Invalid UUID formats are counted as failures - **Non-existent items**: Media items that don't exist are counted as failures - **No changes**: If updates object is empty, the item still counts as success