fix: honor Synology photo orientation before landscape rendering
Community checks / verify (push) Skipped
Verify Frame Flow / verify (push) Successful in 5m25s

This commit is contained in:
渡口浪人
2026-10-18 17:43:25 +08:00
parent 038b858eb7
commit 51d76a196e
11 changed files with 110 additions and 14 deletions
+74
View File
@@ -401,3 +401,77 @@ def test_explicit_offline_conversion_preserves_task_reference(service, settings)
and after.person_match == "all"
and after.location == "family"
)
@pytest.mark.parametrize("space", ["shared", "personal"])
@pytest.mark.parametrize("exif", [5, 6, 7, 8])
def test_api_requests_orientation_before_filtering_rotated_portraits(
service, settings, monkeypatch, space, exif
):
session(settings)
photos = service.photo_sources
requested = []
def pages(api, version, **params):
requested[:] = json.loads(params["additional"])
item = row(1)
# Model Photos' opt-in fields: stored pixels alone look landscape.
if "orientation" in requested:
item["additional"]["orientation"] = exif
return [item]
monkeypatch.setattr(photos.synology, "pages", pages)
photos.save(
"direction",
PhotoSourceInput(
name="Fixture",
kind="synology-photos",
location=".",
people_space=space,
orientation="landscape",
),
)
assert photos.catalog("direction") == []
photos.save(
"direction",
photos.get("direction").model_copy(update={"orientation": "portrait"}),
)
items = photos.catalog("direction")
assert "orientation" in requested
assert [(x["width"], x["height"]) for x in items] == [(16, 24)]
@pytest.mark.parametrize("rotation", [1, 8])
def test_fetched_photo_direction_is_checked_before_cropping(
service, settings, monkeypatch, rotation
):
session(settings)
photos = service.photo_sources
monkeypatch.setattr(photos.synology, "items", lambda *a, **k: [row(1)])
out = io.BytesIO()
exif = Image.Exif()
exif[274] = rotation
size = (16, 24) if rotation == 1 else (24, 16)
Image.new("RGB", size, "blue").save(out, "JPEG", exif=exif)
monkeypatch.setattr(photos.synology, "download", lambda *a, **k: out.getvalue())
photos.save(
"direction",
PhotoSourceInput(
name="Fixture",
kind="synology-photos",
location=".",
orientation="landscape",
),
)
with pytest.raises(FlowError, match="direction"):
photos.read("direction", "1")
# A correctly selected portrait remains readable, including EXIF-only rotation.
item = row(1)
item["additional"]["orientation"] = 8
monkeypatch.setattr(photos.synology, "items", lambda *a, **k: [item])
photos.save(
"direction",
photos.get("direction").model_copy(update={"orientation": "portrait"}),
)
assert photos.read("direction", "1")[0] == out.getvalue()