+25
-4
STATUS.md
+25
-4
STATUS.md
···
47
47
48
48
### December 2025
49
49
50
-
#### sensitive image moderation (PRs #471-485, Dec 5)
50
+
#### mobile artwork upload fix (PR #489, Dec 6)
51
+
52
+
**problem**: artwork uploads from iOS Photos library silently failed - track uploaded successfully but without artwork.
53
+
54
+
**root cause**: iOS stores photos in HEIC format. when selected, iOS converts content to JPEG but often keeps the `.heic` filename. backend validated format using only filename extension → rejected as "unsupported format".
55
+
56
+
**fix**:
57
+
- backend now prefers MIME content_type over filename extension for format detection
58
+
- added `ImageFormat.from_content_type()` method
59
+
- frontend uses `accept="image/*"` for broader iOS compatibility
60
+
61
+
#### sensitive image moderation (PRs #471-488, Dec 5-6)
51
62
52
63
**what shipped**:
53
64
- `sensitive_images` table to flag problematic images by R2 `image_id` or external URL
54
65
- `show_sensitive_artwork` user preference (default: hidden, toggle in portal → "your data")
55
-
- flagged images blurred everywhere: track lists, player, artist pages, likers tooltip
56
-
- SSR-safe filtering: link previews (og:image) exclude sensitive images
66
+
- flagged images blurred everywhere: track lists, player, artist pages, likers tooltip, search results, embeds
67
+
- Media Session API (CarPlay, lock screen, control center) respects sensitive preference
68
+
- SSR-safe filtering: link previews (og:image) exclude sensitive images on track, artist, and album pages
57
69
- likers tooltip UX: max-height with scroll, hover interaction fix, viewport-aware flip positioning
58
70
- likers tooltip z-index: elevates entire track-container when tooltip open (prevents sibling tracks bleeding through)
59
71
···
62
74
- `SensitiveImage` component wraps images and checks against flagged list
63
75
- server-side check via `+layout.server.ts` for meta tag filtering
64
76
- users can opt-in to view sensitive artwork via portal toggle
77
+
78
+
**coverage** (PR #488):
79
+
80
+
| context | approach |
81
+
|---------|----------|
82
+
| DOM images needing blur | `SensitiveImage` component |
83
+
| small avatars in lists | `SensitiveImage` with `compact` prop |
84
+
| SSR meta tags (og:image) | `checkImageSensitive()` function |
85
+
| non-DOM APIs (media session) | direct `isSensitive()` + `showSensitiveArtwork` check |
65
86
66
87
**moderation workflow**:
67
88
- admin adds row to `sensitive_images` with `image_id` (R2) or `url` (external)
···
536
557
537
558
---
538
559
539
-
this is a living document. last updated 2025-12-05.
560
+
this is a living document. last updated 2025-12-06.