diff --git a/deploy/Dockerfile.runtime-update b/deploy/Dockerfile.runtime-update index b5dee9d..d852625 100644 --- a/deploy/Dockerfile.runtime-update +++ b/deploy/Dockerfile.runtime-update @@ -30,4 +30,4 @@ CMD ["python", "-m", "uvicorn", "pigway_frame_flow.main:app", "--host", "0.0.0.0 ARG BUILD_COMMIT ARG BUILD_TIME ENV BUILD_COMMIT=$BUILD_COMMIT BUILD_TIME=$BUILD_TIME -LABEL org.opencontainers.image.title="PIGWay Frame Flow" org.opencontainers.image.version="0.1.18" org.opencontainers.image.revision=$BUILD_COMMIT +LABEL org.opencontainers.image.title="PIGWay Frame Flow" org.opencontainers.image.version="0.1.19" org.opencontainers.image.revision=$BUILD_COMMIT diff --git a/docs/openapi.json b/docs/openapi.json index fba81c2..2b80f35 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -2,7 +2,7 @@ "openapi": "3.1.0", "info": { "title": "PIGWay Frame Flow API", - "version": "0.1.18" + "version": "0.1.19" }, "paths": { "/api/v1/devices/{device_id}/widgets/selection": { @@ -15227,7 +15227,7 @@ "version": { "type": "string", "title": "Version", - "default": "0.1.18" + "default": "0.1.19" } }, "type": "object", @@ -17490,7 +17490,7 @@ "version": { "type": "string", "title": "Version", - "default": "0.1.18" + "default": "0.1.19" }, "api_version": { "type": "string", diff --git a/pigway_frame_flow/api/app.py b/pigway_frame_flow/api/app.py index 8135077..9462868 100644 --- a/pigway_frame_flow/api/app.py +++ b/pigway_frame_flow/api/app.py @@ -126,7 +126,7 @@ def create_app(settings=None, start_worker=True): app = FastAPI( title="PIGWay Frame Flow API", docs_url=None, - version="0.1.18", + version="0.1.19", lifespan=lifespan, responses=error_responses, ) @@ -1040,7 +1040,7 @@ def create_app(settings=None, start_worker=True): supports_upload=True, ), ], - version="0.1.18", + version="0.1.19", mock=settings.mock, write_enabled=settings.write_enabled, api_key_configured=bool(settings.api_key) diff --git a/pigway_frame_flow/models.py b/pigway_frame_flow/models.py index af1c681..60c0d72 100644 --- a/pigway_frame_flow/models.py +++ b/pigway_frame_flow/models.py @@ -366,7 +366,7 @@ class SettingsView(BaseModel): class Health(BaseModel): status: str - version: str = "0.1.18" + version: str = "0.1.19" class Readiness(BaseModel): @@ -397,7 +397,7 @@ class RestoreRequest(StrictModel): class Version(BaseModel): product: str = "PIGWay Frame Flow" - version: str = "0.1.18" + version: str = "0.1.19" api_version: str = "v1" commit: str = "development" build_time: str = "unknown" diff --git a/pigway_frame_flow/providers/photo_sources.py b/pigway_frame_flow/providers/photo_sources.py index 6447b12..6260c39 100644 --- a/pigway_frame_flow/providers/photo_sources.py +++ b/pigway_frame_flow/providers/photo_sources.py @@ -481,9 +481,7 @@ class PhotoSources: continue size = row.get("additional", {}).get("resolution", {}) width, height = size.get("width", 0), size.get("height", 0) - rotation = row.get("additional", {}).get("orientation", 1) - if rotation in (5, 6, 7, 8): - width, height = height, width + # Photos resolution is already oriented; EXIF must not swap it twice. if not self.resolution_matches(source, width, height): continue direction = orientation(width, height) diff --git a/pigway_frame_flow/web/index.html b/pigway_frame_flow/web/index.html index b133672..5085d1b 100644 --- a/pigway_frame_flow/web/index.html +++ b/pigway_frame_flow/web/index.html @@ -1,3 +1,3 @@ PIGWay Frame Flow -
PIGWay Frame Flow

+
PIGWay Frame Flow

diff --git a/pyproject.toml b/pyproject.toml index 6e174ea..5f53151 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "pigway-frame-flow" -version = "0.1.18" +version = "0.1.19" requires-python = ">=3.14,<3.15" dependencies = ["paho-mqtt==2.1.0", "python-dateutil==2.9.0.post0", "fastapi==0.142.2", "uvicorn==0.54.0", "pillow==12.3.0", "requests==2.34.2", "croniter==6.2.4", "python-multipart==0.0.32", "pyyaml==6.0.3"] [project.optional-dependencies] diff --git a/scripts/server-release.py b/scripts/server-release.py index 2770678..16d1d61 100644 --- a/scripts/server-release.py +++ b/scripts/server-release.py @@ -155,7 +155,7 @@ def release(lock): assert dst.execute("pragma quick_check").fetchone()[0] == "ok" base = "pigway-frame-flow:release-base-" + commit[:12] run("docker", "image", "tag", before["Image"], base) - image = "pigway-frame-flow:0.1.18-" + commit[:12] + image = "pigway-frame-flow:0.1.19-" + commit[:12] try: run( "docker", diff --git a/tests/test_synology_photos_api.py b/tests/test_synology_photos_api.py index 3631680..3bf4484 100644 --- a/tests/test_synology_photos_api.py +++ b/tests/test_synology_photos_api.py @@ -405,7 +405,7 @@ def test_explicit_offline_conversion_preserves_task_reference(service, settings) @pytest.mark.parametrize("space", ["shared", "personal"]) @pytest.mark.parametrize("exif", [5, 6, 7, 8]) -def test_api_requests_orientation_before_filtering_rotated_portraits( +def test_api_filters_already_oriented_resolution_without_rotating_twice( service, settings, monkeypatch, space, exif ): session(settings) @@ -415,7 +415,8 @@ def test_api_requests_orientation_before_filtering_rotated_portraits( def pages(api, version, **params): requested[:] = json.loads(params["additional"]) item = row(1) - # Model Photos' opt-in fields: stored pixels alone look landscape. + # Photos returns display dimensions even when EXIF retains a rotation. + item["additional"]["resolution"] = {"width": 16, "height": 24} if "orientation" in requested: item["additional"]["orientation"] = exif return [item] @@ -469,6 +470,7 @@ def test_fetched_photo_direction_is_checked_before_cropping( # A correctly selected portrait remains readable, including EXIF-only rotation. item = row(1) item["additional"]["orientation"] = 8 + item["additional"]["resolution"] = {"width": 16, "height": 24} monkeypatch.setattr(photos.synology, "items", lambda *a, **k: [item]) photos.save( "direction",