immich-app / immich

High performance self-hosted photo and video management solution.
https://immich.app
GNU Affero General Public License v3.0
49.63k stars 2.62k forks source link

GPS data not being parse by immich from android #11280

Closed anytimesoon closed 2 months ago

anytimesoon commented 3 months ago

The bug

None of my images uploaded from my phone or my partner's phone have the location data parsed by immich. I have checked that these images have GPS data using the phone's gallery app. I have also tried rerunning the metadata job

The OS that Immich Server is running on

Ubuntu 22.04 lts

Version of Immich Server

1.108.0

Version of Immich Mobile App

1.108.0

Platform with the issue

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}
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - 2283:3001
    depends_on:
      - redis
      - database
    restart: always
    labels:
      - com.centurylinklabs.watchtower.monitor-only=true
  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:
      - model-cache:/cache
    env_file:
      - .env
    restart: always
    labels:
      - com.centurylinklabs.watchtower.monitor-only=true
  redis:
    container_name: immich_redis
    image: docker.io/redis:6.2-alpine@sha256:d6c2911ac51b289db208767581a5d154544f2b2fe4914ea5056443f62dc6e900
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always
    labels:
      - com.centurylinklabs.watchtower.enable=false
  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:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready --dbname='${DB_DATABASE_NAME}' || 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
    labels:
      - com.centurylinklabs.watchtower.enable=false
volumes:
  model-cache: null
networks: {}

Your .env content

IMMICH_VERSION=v1.108.0
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Reproduction steps

1. Take picture with android phone, making sure GPS is switched on and the camera tags the image
2. Have the app upload the file to the server

Current behaviour:
GPS data is not parsed

Expected behaviour:
GPS data should be visible in the details section of the image

Relevant log output

No response

Additional information

No response

bo0tzz commented 3 months ago

Does the app have location access permissions?

anytimesoon commented 3 months ago

It does Screenshot_20240722-104633

bo0tzz commented 3 months ago

Can you download the original file from the Immich server and check with exiftool or such whether it has the GPS data, and do the same with a copy of the file copied manually off your phone?

anytimesoon commented 3 months ago

Downloading the file from immich, it seems it does not have any GPS data.

I'm not sure I understand what your request with this

and do the same with a copy of the file copied manually off your phone?

I think you would like me to confirm that the file had GPS data before the upload to immich. If this is the case, yes the original file has GPS data.

From this, it seems like the data has been stripped from the file during the upload process

bo0tzz commented 3 months ago

Can you try turning off background upload, taking a new photo with gps data, then uploading that in the Immich app with the foreground upload mechanism?

anytimesoon commented 3 months ago

I have tried this, and still no GPS

orville87 commented 2 months ago

I have the same issue. It worked before flawlessly (even without having granted Immich app location permission), but since around two weeks, metadata isn't parsed properly from both my phone (Pixel 6 with latest CalyxOS - Android 14 and microG as well as app version 1.111.0 from github release page) as well as my wife's phone (Pixel 4 with latest GrapheneOS - Android 14 with sandboxed Google Play Services and app version 1.109.2 from F-Droid). Uploading from web interface works properly, but both devices will backup duplicates (without location tags) of the pictures to the server if I upload my pictures through the web interface and keep auto backup through mobile app activated. I tried an older device (Samsung Galaxy S8 running LineageOS - Android 11 with microG and app version 1.109.2), where it still works flawlessly. Server is running v1.110.0.

So I am a little bit confused right now what might be the underlying issue here. And yes, I am aware that since Android Q EXIF data will be stripped from media files when shared and proper permissions aren't granted to the sharing app (especially the "access all files" permission, which Immich mobile app didn't request in the first place and can't be granted manually as it doesn't ask for it).

I tried different app versions, the issue still persists.

AMstuff commented 2 months ago

For me the issue is definitely calyxos, since they recently made the location redaction feature more restrictive. So disabling the feature altogether fixed it for me. There is a global toggle at settings -> Security & privacy -> More security & privacy -> Redact location data when sharing media.

anytimesoon commented 2 months ago

Sadly, this hasn't worked for me. It's interesting to learn that others who face this issue are using Calyx. That does imply that the problem may stem from there

PaulienM commented 2 months ago

I have the same problem, I'm using calyxos too. After some research in the flutter_photo_manager lib used by immich, I found that the location isn't set in the AssetEntity (cf. https://github.com/fluttercandies/flutter_photo_manager/blob/044ee31d8569341d0feb6772315f4c6b89c9e5c9/android/src/main/kotlin/com/fluttercandies/photo_manager/core/utils/IDBUtils.kt#L226 and the comment https://github.com/fluttercandies/flutter_photo_manager/blob/044ee31d8569341d0feb6772315f4c6b89c9e5c9/lib/src/types/entity.dart#L482) According to the comments in the library, we should use latlngAsync function to get location. Maybe I missed something because the location sync seems to work on android (without calyxos), but I didn't find any usages of latlngAsync.

I tried to use my own version of flutter_photo_manager that defined latitude and longitude values directly in AssetEntity and it works, but I'm not sure that is a good solution. I'm not flutter or mobile developer, so if someone wants to help me your welcome :)

The code I'm using to define the location :

// com.fluttercandies.photo_manager.core.utils.IDBUtils#toAssetEntity
var latitude: Double? = null
var longitude: Double? = null
context.contentResolver.openInputStream(getUri(id, getMediaType(type)))?.use {
    val exifInterface = ExifInterface(it)
    val latLong: FloatArray = kotlin.FloatArray(2)
    if (exifInterface.getLatLong(latLong)) {
        latitude = latLong[0].toDouble()
        longitude = latLong[1].toDouble()
    }
}
lucasmz-dev commented 2 months ago

It'd be nice if Immich implemented the media permission so that this doesn't happen, it does manage media afterall