[BUG] Live photos imported with the Library feature display as individual photos and videos #1371

Closed
opened 2026-02-05 01:32:21 +03:00 by OVERLORD · 6 comments
Owner

Originally created by @APIUM on GitHub (Sep 25, 2023).

The bug

When imported with the new Libraries feature Live photos do not display correctly. They display as an individual photo and video, where the expected behavior is that they are combined. I've started using Immich due to the library feature, so I don't have a large backlog of other imported images, but I think from the documentation that my view of the expected behavior is correct.

The images also don't show up with the Live Photo filter that is present in the app under either:
(x) Library > Live Photos
(x) Search > Motion Photos

Live photos are stored in my library as direct uploads to my NAS from Photosync. These are stored for example as:
IMG_1313.HEIC
IMG_1313.MOV
In a flat folder structure next to the other images from that month. This is read correctly by PhotoPrism for reference.

The OS that Immich Server is running on

Host: Fedora 38, But using default docker-compose

Version of Immich Server

v1.79.1

Version of Immich Mobile App

v1.79.0 build.119

Platform with the issue

  • Server
  • Web
  • Mobile

Your docker-compose.yml content

version: "3.8"

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: [ "start.sh", "immich" ]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /mnt/photos:/mnt/photos:ro
    depends_on:
      - redis
      - database
      - typesense
    env_file:
      - stack.env
    networks:
      - immich_default
    restart: always

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    command: [ "start.sh", "microservices" ]
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /mnt/photos:/mnt/photos:ro
    env_file:
      - stack.env
    networks:
     - immich_default
    depends_on:
      - redis
      - database
      - typesense
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    volumes:
      - model-cache:/cache
    networks:
     - immich_default
    env_file:
      - stack.env
    restart: always

  immich-web:
    container_name: immich_web
    image: ghcr.io/immich-app/immich-web:${IMMICH_VERSION:-release}
    env_file:
      - stack.env
    networks:
      - immich_default
    restart: always

  typesense:
    container_name: immich_typesense
    image: typesense/typesense:0.24.1@sha256:9bcff2b829f12074426ca044b56160ca9d777a0c488303469143dd9f8259d4dd
    environment:
      - TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
      - TYPESENSE_DATA_DIR=/data
    networks:
     - immich_default
    logging:
      driver: none
    volumes:
      - tsdata:/data
    restart: always

  redis:
    container_name: immich_redis
    image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3
    networks:
     - immich_default
    restart: always

  database:
    container_name: immich_postgres
    image: postgres:14-alpine@sha256:28407a9961e76f2d285dc6991e8e48893503cc3836a4755bbc2d40bcc272a441
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      PG_DATA: /var/lib/postgresql/data
    networks:
      - immich_default
    env_file:
      - stack.env
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: always

  immich-proxy:
    container_name: immich_proxy
    image: ghcr.io/immich-app/immich-proxy:${IMMICH_VERSION:-release}
    environment:
      # Make sure these values get passed through from the env file
      - IMMICH_SERVER_URL
      - IMMICH_WEB_URL
    ports:
      - 2283:8080
    depends_on:
      - immich-server
      - immich-web
    networks:
      - traefik_net
      - immich_default
    restart: always
    labels:
      - "traefik.enable=true"
      ## HTTP Routers
      - "traefik.http.routers.immich-rtr.entrypoints=https"
      - "traefik.http.routers.immich-rtr.rule=Host(`REDACTED`)"
      - "traefik.http.routers.immich-rtr.tls=true"
      ## Middlewares
      - "traefik.http.routers.immich-rtr.middlewares=chain-no-auth@file" # No Authentication
      - "traefik.http.routers.immich-rtr.middlewares=middlewares-basic-auth@file" # Basic Authentication
      - "traefik.http.routers.immich-rtr.middlewares=chain-oauth@file" # Google OAuth 2.0
      - "traefik.http.routers.immich-rtr.middlewares=ip-whitelist-internal@file" # Only allow internal access
      ## HTTP Services
      - "traefik.http.routers.immich-rtr.service=immich-svc"
      - "traefik.http.services.immich-svc.loadbalancer.server.port=8080"
      
volumes:
  pgdata:
  model-cache:
  tsdata:
  
networks:  
  immich_default:
  traefik_net:
    external: true

Your .env content

DB_HOSTNAME=immich_postgres
DB_USERNAME=postgres
DB_PASSWORD=REDACTED
DB_DATABASE_NAME=immich
REDIS_HOSTNAME=immich_redis
UPLOAD_LOCATION=/mnt/storage/immich_uploads
TYPESENSE_API_KEY=REDACTED
PUBLIC_LOGIN_PAGE_MESSAGE=
IMMICH_WEB_URL=http://immich-web:3000
IMMICH_SERVER_URL=http://immich-server:3001
IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003

Reproduction steps

Given I am using immich v1.79.1
When using the Libraries feature to import Live Photos
Then the live photos display in Photos as an individual short video and photo

Additional information

No response

Originally created by @APIUM on GitHub (Sep 25, 2023). ### The bug When imported with the new Libraries feature Live photos do not display correctly. They display as an individual photo and video, where the expected behavior is that they are combined. I've started using Immich due to the library feature, so I don't have a large backlog of other imported images, but I think from the documentation that my view of the expected behavior is correct. The images also don't show up with the Live Photo filter that is present in the app under either: (x) Library > Live Photos (x) Search > Motion Photos Live photos are stored in my library as direct uploads to my NAS from Photosync. These are stored for example as: IMG_1313.HEIC IMG_1313.MOV In a flat folder structure next to the other images from that month. This is read correctly by PhotoPrism for reference. ### The OS that Immich Server is running on Host: Fedora 38, But using default docker-compose ### Version of Immich Server v1.79.1 ### Version of Immich Mobile App v1.79.0 build.119 ### Platform with the issue - [X] Server - [ ] Web - [ ] Mobile ### Your docker-compose.yml content ```YAML version: "3.8" services: immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} command: [ "start.sh", "immich" ] volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload - /mnt/photos:/mnt/photos:ro depends_on: - redis - database - typesense env_file: - stack.env networks: - immich_default restart: always immich-microservices: container_name: immich_microservices image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} command: [ "start.sh", "microservices" ] volumes: - ${UPLOAD_LOCATION}:/usr/src/app/upload - /mnt/photos:/mnt/photos:ro env_file: - stack.env networks: - immich_default depends_on: - redis - database - typesense restart: always immich-machine-learning: container_name: immich_machine_learning image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} volumes: - model-cache:/cache networks: - immich_default env_file: - stack.env restart: always immich-web: container_name: immich_web image: ghcr.io/immich-app/immich-web:${IMMICH_VERSION:-release} env_file: - stack.env networks: - immich_default restart: always typesense: container_name: immich_typesense image: typesense/typesense:0.24.1@sha256:9bcff2b829f12074426ca044b56160ca9d777a0c488303469143dd9f8259d4dd environment: - TYPESENSE_API_KEY=${TYPESENSE_API_KEY} - TYPESENSE_DATA_DIR=/data networks: - immich_default logging: driver: none volumes: - tsdata:/data restart: always redis: container_name: immich_redis image: redis:6.2-alpine@sha256:70a7a5b641117670beae0d80658430853896b5ef269ccf00d1827427e3263fa3 networks: - immich_default restart: always database: container_name: immich_postgres image: postgres:14-alpine@sha256:28407a9961e76f2d285dc6991e8e48893503cc3836a4755bbc2d40bcc272a441 environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USERNAME} POSTGRES_DB: ${DB_DATABASE_NAME} PG_DATA: /var/lib/postgresql/data networks: - immich_default env_file: - stack.env volumes: - pgdata:/var/lib/postgresql/data restart: always immich-proxy: container_name: immich_proxy image: ghcr.io/immich-app/immich-proxy:${IMMICH_VERSION:-release} environment: # Make sure these values get passed through from the env file - IMMICH_SERVER_URL - IMMICH_WEB_URL ports: - 2283:8080 depends_on: - immich-server - immich-web networks: - traefik_net - immich_default restart: always labels: - "traefik.enable=true" ## HTTP Routers - "traefik.http.routers.immich-rtr.entrypoints=https" - "traefik.http.routers.immich-rtr.rule=Host(`REDACTED`)" - "traefik.http.routers.immich-rtr.tls=true" ## Middlewares - "traefik.http.routers.immich-rtr.middlewares=chain-no-auth@file" # No Authentication - "traefik.http.routers.immich-rtr.middlewares=middlewares-basic-auth@file" # Basic Authentication - "traefik.http.routers.immich-rtr.middlewares=chain-oauth@file" # Google OAuth 2.0 - "traefik.http.routers.immich-rtr.middlewares=ip-whitelist-internal@file" # Only allow internal access ## HTTP Services - "traefik.http.routers.immich-rtr.service=immich-svc" - "traefik.http.services.immich-svc.loadbalancer.server.port=8080" volumes: pgdata: model-cache: tsdata: networks: immich_default: traefik_net: external: true ``` ### Your .env content ```Shell DB_HOSTNAME=immich_postgres DB_USERNAME=postgres DB_PASSWORD=REDACTED DB_DATABASE_NAME=immich REDIS_HOSTNAME=immich_redis UPLOAD_LOCATION=/mnt/storage/immich_uploads TYPESENSE_API_KEY=REDACTED PUBLIC_LOGIN_PAGE_MESSAGE= IMMICH_WEB_URL=http://immich-web:3000 IMMICH_SERVER_URL=http://immich-server:3001 IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003 ``` ### Reproduction steps ```bash Given I am using immich v1.79.1 When using the Libraries feature to import Live Photos Then the live photos display in Photos as an individual short video and photo ``` ### Additional information _No response_
OVERLORD added the 🗄️server label 2026-02-05 01:32:21 +03:00
Author
Owner

@jrasm91 commented on GitHub (Sep 25, 2023):

Thank you for reporting this. This is a regression and should be fixed soon.

@jrasm91 commented on GitHub (Sep 25, 2023): Thank you for reporting this. This is a regression and should be fixed soon.
Author
Owner

@APIUM commented on GitHub (Oct 4, 2023):

On v1.18.0 removed the library and re-added and it appears to be working well now. Thanks again for the fix @jrasm91

@APIUM commented on GitHub (Oct 4, 2023): On v1.18.0 removed the library and re-added and it appears to be working well now. Thanks again for the fix @jrasm91
Author
Owner

@Nuuki9 commented on GitHub (Oct 4, 2023):

Since the update to 1.80 I am now seeing some Live Photos showing up, though relatively few.

I picked a random example to investigate. If I check the database, I see that livePhotoVideoId is null, so its definitely not linked - ruling out a front end UI refresh type issue.

If I upload the same assets to the demo site, it links fine.

I did re-run the Library job, but am I missing something else I need to do to force previous uploads to re-evaluate?

@Nuuki9 commented on GitHub (Oct 4, 2023): Since the update to 1.80 I am now seeing _some_ Live Photos showing up, though relatively few. I picked a random example to investigate. If I check the database, I see that `livePhotoVideoId` is **null**, so its definitely not linked - ruling out a front end UI refresh type issue. If I upload the same assets to the demo site, it links fine. I did re-run the Library job, but am I missing something else I need to do to force previous uploads to re-evaluate?
Author
Owner

@jrasm91 commented on GitHub (Oct 4, 2023):

Since the update to 1.80 I am now seeing some Live Photos showing up, though relatively few.

I picked a random example to investigate. If I check the database, I see that livePhotoVideoId is null, so its definitely not linked - ruling out a front end UI refresh type issue.

If I upload the same assets to the demo site, it links fine.

I did re-run the Library job, but am I missing something else I need to do to force previous uploads to re-evaluate?

asset.livePhotoVideoId means the assets are linked, so this will obviously be empty for assets that are still showing up as individuals.

exif.livePhotoCID is populated during metadata extraction and is what actually we use to find and link two assets. This wasn't being properly originally. Re-running metadata extraction is necessary to fix that situation. This is also likely the issue, especially since it works in the demo environment.

@jrasm91 commented on GitHub (Oct 4, 2023): > Since the update to 1.80 I am now seeing _some_ Live Photos showing up, though relatively few. > > I picked a random example to investigate. If I check the database, I see that `livePhotoVideoId` is **null**, so its definitely not linked - ruling out a front end UI refresh type issue. > > If I upload the same assets to the demo site, it links fine. > > I did re-run the Library job, but am I missing something else I need to do to force previous uploads to re-evaluate? `asset.livePhotoVideoId` means the assets are linked, so this will obviously be empty for assets that are still showing up as individuals. `exif.livePhotoCID` is populated during metadata extraction and is what actually we use to find and link two assets. This wasn't being properly originally. Re-running metadata extraction is necessary to fix that situation. This is also likely the issue, especially since it works in the demo environment.
Author
Owner

@Nuuki9 commented on GitHub (Oct 4, 2023):

Since the update to 1.80 I am now seeing some Live Photos showing up, though relatively few.
I picked a random example to investigate. If I check the database, I see that livePhotoVideoId is null, so its definitely not linked - ruling out a front end UI refresh type issue.
If I upload the same assets to the demo site, it links fine.
I did re-run the Library job, but am I missing something else I need to do to force previous uploads to re-evaluate?

asset.livePhotoVideoId means the assets are linked, so this will obviously be empty for assets that are still showing up as individuals.

Sorry for the confusion - yes, I was confirming that indeed the assets definitely aren't linked, rather than it being a front end cache or some other reason.

exif.livePhotoCID is populated during metadata extraction and is what actually we use to find and link two assets. This wasn't being properly originally. Re-running metadata extraction is necessary to fix that situation. This is also likely the issue, especially since it works in the demo environment.

Great - I'll re-run the metadata extraction now and report back.

@Nuuki9 commented on GitHub (Oct 4, 2023): > > Since the update to 1.80 I am now seeing _some_ Live Photos showing up, though relatively few. > > I picked a random example to investigate. If I check the database, I see that `livePhotoVideoId` is **null**, so its definitely not linked - ruling out a front end UI refresh type issue. > > If I upload the same assets to the demo site, it links fine. > > I did re-run the Library job, but am I missing something else I need to do to force previous uploads to re-evaluate? > > `asset.livePhotoVideoId` means the assets are linked, so this will obviously be empty for assets that are still showing up as individuals. Sorry for the confusion - yes, I was confirming that indeed the assets definitely aren't linked, rather than it being a front end cache or some other reason. > `exif.livePhotoCID` is populated during metadata extraction and is what actually we use to find and link two assets. This wasn't being properly originally. Re-running metadata extraction is necessary to fix that situation. This is also likely the issue, especially since it works in the demo environment. Great - I'll re-run the metadata extraction now and report back.
Author
Owner

@Nuuki9 commented on GitHub (Oct 4, 2023):

Worked great - many thanks!

@Nuuki9 commented on GitHub (Oct 4, 2023): Worked great - many thanks!
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: immich-app/immich#1371