# 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     |
