# Update Media Item

Update media item metadata (Admin only).

**Endpoint**: `PUT /api/media-items/{media_id}`
**Auth**: Required (Admin only)
**Content-Type**: `application/json`

## Path Parameters

| Parameter | Type | Required | Description |
|-----------|------|-----------|-------------|
| media_id | string | Yes | Media item UUID |

 ## Request Body

 | Field | Type | Required | Description |
 |--------|------|-----------|-------------|
 | title | string | No | Updated title |
 | author | string | No | Updated author |
 | description | string | No | Updated description |
 | series | string | No | Series name |
 | series_number | integer | No | Number in series |
 | tags | array of string | No | Updated tags (auto-normalized) |
 | contributors | array of string | No | Updated contributors (auto-normalized) |
 
 **Tag/Contributor Normalization:**
 - Tags are titlecased and deduplicated (case-insensitive)
 - Contributors preserve original casing and punctuation
 - Punctuation-preferred deduplication (keeps "ACME CORP." over "acme corp")
 - Search fields auto-generated for case-insensitive search

### Example Request

```json
{
  "title": "Updated Title",
  "author": "Updated Author",
  "description": "Updated description",
  "series": "Series",
  "series_number": 2
}
```

## Response (200 OK)

```json
{
  "id": "uuid",
  "title": "Updated Title",
  "author": "Updated Author",
  "description": "Updated description",
  "series": "Series",
  "series_number": 2,
  "updated_at": "2026-01-31T10:00:00Z"
}
```

## Error Responses

| Code | Description |
|------|-------------|
| 400 | Invalid input data |
| 401 | Invalid or expired token |
| 403 | User is not an admin |
| 404 | Media item not found |
