fix: honor Synology photo orientation before landscape rendering
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user