A photo's camera, exposure and location are stored but never served #225

Closed
opened 2026-09-15 23:30:09 +02:00 by Claude · 1 comment
Collaborator

The twelve photo fields a scan now stores are never served, so no client can see them.

Both sides

Since #209, a scan stores CameraMake, CameraModel, Software, ExposureTime, FocalLength, ImageOrientation, Aperture, ShutterSpeed, Latitude, Longitude, Altitude and IsoSpeedRating in the item's data.

Upstream's DtoService copies them onto BaseItemDto for a Photo (upstream/Emby.Server.Implementations/Dto/DtoService.cs, the if (item is Photo photo) block).

Ours maps none of them. The fields exist on the generated BaseItemDto and are always absent.

What a client sees

jellyfin-web's photo detail and the slideshow's info panel show the camera, exposure and location. Against ours they show nothing.

Verifying

The library-kinds fixture carries a tagged JPEG. A route test that files it and reads /Items/{id} can fail. So can a scenario over a photo library, if the reference ever gains one.

Found reviewing #209.

The twelve photo fields a scan now stores are never served, so no client can see them. ## Both sides Since #209, a scan stores `CameraMake`, `CameraModel`, `Software`, `ExposureTime`, `FocalLength`, `ImageOrientation`, `Aperture`, `ShutterSpeed`, `Latitude`, `Longitude`, `Altitude` and `IsoSpeedRating` in the item's data. Upstream's `DtoService` copies them onto `BaseItemDto` for a `Photo` (`upstream/Emby.Server.Implementations/Dto/DtoService.cs`, the `if (item is Photo photo)` block). Ours maps none of them. The fields exist on the generated `BaseItemDto` and are always absent. ## What a client sees jellyfin-web's photo detail and the slideshow's info panel show the camera, exposure and location. Against ours they show nothing. ## Verifying The library-kinds fixture carries a tagged JPEG. A route test that files it and reads `/Items/{id}` can fail. So can a scenario over a photo library, if the reference ever gains one. Found reviewing #209.
Author
Collaborator

Fixed, and landed on main at 76f368b8.

ItemRow carries the photo fields parsed out of the Data blob, and crates/ephyra-http/src/map/item/mod.rs fills all twelve on BaseItemDto — camera make and model, software, exposure time, focal length, orientation, aperture, shutter speed, latitude, longitude, altitude and ISO — only when the kind is Photo, which is upstream's if (item is Photo photo). Field for field, in the same order and with the same nullability as SetPhotoProperties.

Tests in crates/ephyra-http/tests/photos.rs: a photo serves all twelve, and a video filed with the same blob members serves none, so it is the kind gate under test rather than the blob.

Not ported: Album and AlbumId, which upstream takes from the photo's album. Nothing files photo albums here yet, so it is filed as #234 rather than left silent.

Fixed, and landed on `main` at `76f368b8`. `ItemRow` carries the photo fields parsed out of the `Data` blob, and `crates/ephyra-http/src/map/item/mod.rs` fills all twelve on `BaseItemDto` — camera make and model, software, exposure time, focal length, orientation, aperture, shutter speed, latitude, longitude, altitude and ISO — only when the kind is `Photo`, which is upstream's `if (item is Photo photo)`. Field for field, in the same order and with the same nullability as `SetPhotoProperties`. Tests in `crates/ephyra-http/tests/photos.rs`: a photo serves all twelve, and a video filed with the same blob members serves none, so it is the kind gate under test rather than the blob. Not ported: `Album` and `AlbumId`, which upstream takes from the photo's album. Nothing files photo albums here yet, so it is filed as #234 rather than left silent.
Sign in to join this conversation.
No description provided.