Duplicates when downloading from external library to Android phone via App #4422

Closed
opened 2026-02-05 10:21:54 +03:00 by OVERLORD · 1 comment
Owner

Originally created by @ssch1124 on GitHub (Sep 27, 2024).

The bug

When downloading media that is stored in an external library via the Android app it's shown as a seperate image and uploaded to the users upload directory. Finally, there are two copies of the same file: the original in the external library and the copy in the users directory.

Here's an example:
The picture with the train on the right is stored in an external library owned by my user. I downloaded this one. It appeared a second time (the one on the left) and got uploaded to my users upload dir.
Screenshot_2024-09-27-18-13-08-05_d8aea95ef633eb6b7eb1cae13c34b40e

The OS that Immich Server is running on

RaspberryPi OS 12

Version of Immich Server

1.116.0

Version of Immich Mobile App

1.115.0 build.159

Platform with the issue

  • Server
  • Web
  • Mobile

Your docker-compose.yml content

#
# WARNING: Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
#
name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    # extends:
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
      - /media/sebastian/smb/01-Bilder:/external/01-Bilder:ro
      - /media/sebastian/smb/02-Fotografie:/external/02-Fotografie:ro
      - /media/sebastian/smb/99-Handy-Daten/S7:/external/S7:ro
      - /media/medien/Bilder:/external/fb:ro
    env_file:
      - .env
    ports:
      - 2283:3001
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
    volumes:
      - /media/sebastian/docker/data/immich/model-cache:/cache
    env_file:
      - .env
    restart: always
    healthcheck:
      disable: false


  redis:
    container_name: immich_redis
    image: docker.io/redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always


  database:
    container_name: immich_postgres
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
      interval: 5m
      start_interval: 30s
      start_period: 5m
    command: ["postgres", "-c", "shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
    restart: always

Your .env content

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=/media/sebastian/smb/99-Immich
# The location where your database files are stored
DB_DATA_LOCATION=./postgres

# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
TZ=Europe/Berlin

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=... # removed for security reasons

# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Reproduction steps

  1. Enable Sync in Android App and configure it for syncing all Albums or at least select the "Immich" directory, so the app can recognize the downloaded pictures.
  2. Download a photo from the timeline which is stored in an external library.
  3. Reopen the app or refresh the view and trigger a sync if that's not done automatically.

You will see the image twic:. one with the cloud icon in the bottom right corner and another with the crossed cloud icon (at first) or the cloud icon with a checkmark in it (after sync).

Relevant log output

No response

Additional information

In contrast, the download works fine for photos from the users directory itself (e.g. the one with the smoke detector).

Both images (original and duplicate) show in the web interface as well and are detectet as duplicats in the Review Duplicates tool.
image

Same behaviour without the ro flag in the docker-compose.yml.

I could reproduce the issue on different devices, both with the most recent version of the mobile app from the Play Store at the time: OnePlus Nord 2, Galaxy Tab A 10.1 (2019)

Originally created by @ssch1124 on GitHub (Sep 27, 2024). ### The bug When downloading media that is stored in an _external library_ via the Android app it's shown as a seperate image and uploaded to the users upload directory. Finally, there are two copies of the same file: the original in the external library and the copy in the users directory. Here's an example: The picture with the train on the right is stored in an external library owned by my user. I downloaded this one. It appeared a second time (the one on the left) and got uploaded to my users upload dir. ![Screenshot_2024-09-27-18-13-08-05_d8aea95ef633eb6b7eb1cae13c34b40e](https://github.com/user-attachments/assets/04a4d5a7-eab7-4a5c-a221-5ad453262f98) ### The OS that Immich Server is running on RaspberryPi OS 12 ### Version of Immich Server 1.116.0 ### Version of Immich Mobile App 1.115.0 build.159 ### Platform with the issue - [X] Server - [ ] Web - [X] Mobile ### Your docker-compose.yml content ```YAML # # WARNING: Make sure to use the docker-compose.yml of the current release: # # https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml # # The compose file on main may not be compatible with the latest release. # name: immich services: immich-server: container_name: immich_server image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} # extends: # file: hwaccel.transcoding.yml # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding volumes: # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file - ${UPLOAD_LOCATION}:/usr/src/app/upload - /etc/localtime:/etc/localtime:ro - /media/sebastian/smb/01-Bilder:/external/01-Bilder:ro - /media/sebastian/smb/02-Fotografie:/external/02-Fotografie:ro - /media/sebastian/smb/99-Handy-Daten/S7:/external/S7:ro - /media/medien/Bilder:/external/fb:ro env_file: - .env ports: - 2283:3001 depends_on: - redis - database restart: always healthcheck: disable: false immich-machine-learning: container_name: immich_machine_learning # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag. # Example tag: ${IMMICH_VERSION:-release}-cuda image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration # file: hwaccel.ml.yml # service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable volumes: - /media/sebastian/docker/data/immich/model-cache:/cache env_file: - .env restart: always healthcheck: disable: false redis: container_name: immich_redis image: docker.io/redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e healthcheck: test: redis-cli ping || exit 1 restart: always database: container_name: immich_postgres image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 environment: POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_USER: ${DB_USERNAME} POSTGRES_DB: ${DB_DATABASE_NAME} POSTGRES_INITDB_ARGS: '--data-checksums' volumes: # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file - ${DB_DATA_LOCATION}:/var/lib/postgresql/data healthcheck: test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1 interval: 5m start_interval: 30s start_period: 5m command: ["postgres", "-c", "shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"] restart: always ``` ### Your .env content ```Shell # You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables # The location where your uploaded files are stored UPLOAD_LOCATION=/media/sebastian/smb/99-Immich # The location where your database files are stored DB_DATA_LOCATION=./postgres # To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List TZ=Europe/Berlin # The Immich version to use. You can pin this to a specific version like "v1.71.0" IMMICH_VERSION=release # Connection secret for postgres. You should change it to a random password # Please use only the characters `A-Za-z0-9`, without special characters or spaces DB_PASSWORD=... # removed for security reasons # The values below this line do not need to be changed ################################################################################### DB_USERNAME=postgres DB_DATABASE_NAME=immich ``` ### Reproduction steps 1. Enable Sync in Android App and configure it for syncing all Albums or at least select the "Immich" directory, so the app can recognize the downloaded pictures. 2. Download a photo from the timeline which is stored in an external library. 3. Reopen the app or refresh the view and trigger a sync if that's not done automatically. You will see the image twic:. one with the cloud icon in the bottom right corner and another with the crossed cloud icon (at first) or the cloud icon with a checkmark in it (after sync). ### Relevant log output _No response_ ### Additional information In contrast, the download works fine for photos from the users directory itself (e.g. the one with the smoke detector). Both images (original and duplicate) show in the web interface as well and are detectet as duplicats in the _Review Duplicates_ tool. ![image](https://github.com/user-attachments/assets/ab9eca0c-bd48-449a-9e9b-eea5477e0682) Same behaviour without the `ro` flag in the docker-compose.yml. I could reproduce the issue on different devices, both with the most recent version of the mobile app from the Play Store at the time: OnePlus Nord 2, Galaxy Tab A 10.1 (2019)
Author
Owner

@bo0tzz commented on GitHub (Sep 27, 2024):

This is working as expected, external libraries are not considered in the upload process.

@bo0tzz commented on GitHub (Sep 27, 2024): This is working as expected, external libraries are not considered in the upload process.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: immich-app/immich#4422