Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: original-sized previews for non-web-friendly images #14446

Open
wants to merge 27 commits into
base: main
Choose a base branch
from

Conversation

eligao
Copy link
Contributor

@eligao eligao commented Dec 2, 2024

Implementation details:

  • Server: extract and keep the original-sized preview image for non-web-friendly images

  • OpenAPI: a new AssetMediaSize.FULLSIZE size is available under the viewThumbnail API

    • It returns the AssetFileType.FULLSIZE file when available
    • Or redirects to the original file when it's web-friendly
    • Or otherwise redirects back to AssetFileSize.PREVIEW
      • Happens when an image is not web-friendly and a FULLSIZE preview is not yet generated.
    • HTTP 302 is used here to make full use of caching
  • Web: photo-viewer

    • When zoomed in, the browser loads the AssetMediaSize.FULLSIZE preview via the viewThumbnail API
    • This applies to ALL images, instead of previously only loading the original file for web-friendly images.
    • The server will determine what to return or redirect, simplifying the logic on the client, and the client never knows if a fullsize preview is available anyway.
    • This file can be right-clicked and downloaded/copied for sharing.

Some future ideas:

  • Load the FULLSIZE image inthe mobile client. Unfortunately I'm not familiar with flutter yet.
  • Download the RAW as JPEG with full EXIF preserved, for easier sharing
  • Trim the RAW originals and keep the JPEG only, freeing up storage space

@eligao eligao changed the title feat/raw fullsize preview feat: original-sized previews for RAW images Dec 2, 2024
@eligao eligao force-pushed the feat/raw-fullsize-preview branch from f2b631a to 54b91b4 Compare December 2, 2024 16:35
Copy link
Contributor

@mertalev mertalev left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the PR! I mostly looked at the server code, where I think it needs some more polishing.

Re: caching, this also affects the case where the user zooms in and no extracted image exists, right? It will load the preview again.

server/src/repositories/media.repository.ts Show resolved Hide resolved
server/src/repositories/media.repository.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
@eligao eligao force-pushed the feat/raw-fullsize-preview branch 5 times, most recently from 076d59d to a7a9b4d Compare December 3, 2024 21:24
@eligao eligao force-pushed the feat/raw-fullsize-preview branch from a7a9b4d to 34592b3 Compare December 3, 2024 21:29
@eligao
Copy link
Contributor Author

eligao commented Dec 6, 2024

any more comments from maintainers to get this merged, so that I can continue with previews of other images?
@danieldietzler @alextran1502

@alextran1502
Copy link
Contributor

@eligao no rush here

@mertalev
Copy link
Contributor

mertalev commented Dec 6, 2024

I think we should wait until we're done with hot fixes for the current release.

@michelheusschen
Copy link
Contributor

michelheusschen commented Dec 7, 2024

For a DNG image with a resolution of 5376x3956 and 41.3MiB in size, the following variants are generated using the default settings:

Variant Format Resolution Size
Thumbnail webp 5280x3956 887KiB
Preview jpeg 5280x3956 1794KiB
Original jpeg 5280x3956 1794KiB

These generated variants seem larger than expected and don't match the configured settings, with the preview and original being identical. It's also strange that the resolution has slightly changed.

@eligao
Copy link
Contributor Author

eligao commented Dec 7, 2024

For a DNG image with a resolution of 5376x3956 and 41.3MiB in size, the following variants are generated using the default settings:

Variant Format Resolution Size
Thumbnail webp 5280x3956 887KiB
Preview jpeg 5280x3956 1794KiB
Original jpeg 5280x3956 1794KiB
These generated variants seem larger than expected and don't match the configured settings, with the preview and original being identical. It's also strange that the resolution has slightly increased.

nice catch, the file sizes are indeed wrong, let me fix that and add checks to tests.
as for the sizes being slightly different, it's likely due to the crop tags in exif:
image

@mertalev
Copy link
Contributor

Hi again @eligao! We've been talking about the PR and think there are a few changes it'll need for it to be merge-able.

  1. It should apply to all images that aren't web compatible (using the same list as web, ignoring that Safari can view HEIF images)
  2. It should be configurable in the image settings, similar to the thumbnail and preview sections
    • There should be an "enabled" toggle that is disabled by default
    • The target format should be configurable in the case where an embedded image is not used and a new image has to be generated
  3. Rename the "converted" enum to "fullsize"

@eligao eligao force-pushed the feat/raw-fullsize-preview branch from ebcfe9c to e22a123 Compare December 16, 2024 20:37
@eligao eligao changed the title feat: original-sized previews for RAW images [WIP] feat: original-sized previews for non-web-friendly images Dec 16, 2024
server/src/repositories/media.repository.ts Outdated Show resolved Hide resolved
server/src/repositories/media.repository.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
e2e/src/api/specs/asset.e2e-spec.ts Outdated Show resolved Hide resolved
open-api/immich-openapi-specs.json Outdated Show resolved Hide resolved
server/src/repositories/media.repository.ts Outdated Show resolved Hide resolved
server/src/repositories/media.repository.ts Outdated Show resolved Hide resolved
server/src/services/media.service.ts Outdated Show resolved Hide resolved
server/src/repositories/media.repository.ts Show resolved Hide resolved
open-api/immich-openapi-specs.json Outdated Show resolved Hide resolved
@eligao eligao changed the title [WIP] feat: original-sized previews for non-web-friendly images feat: original-sized previews for non-web-friendly images Dec 17, 2024
@eligao eligao force-pushed the feat/raw-fullsize-preview branch from 8d43411 to 4cee0c7 Compare December 17, 2024 16:45
@eligao eligao force-pushed the feat/raw-fullsize-preview branch from fddbc10 to 88e4dc8 Compare January 23, 2025 09:28
@mertalev
Copy link
Contributor

I did a bit of testing with this. The image generation itself works well, but it doesn't get displayed correctly in the client. The initial image shown is the preview and zooming in shows the thumbnail. Also, the "Display original photos" user setting should probably make it load the full-size image directly and skip the preview.

@mertalev
Copy link
Contributor

mertalev commented Feb 4, 2025

Just a heads up that I will be away for the next two weeks and won't be able to test this until I'm back. But feel free to continue working on it! I'm happy for it to be merged once the bugs are fixed and someone can confirm that it works as expected.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants