Downloaden Google Photos

Sinds een jaar of wat maak ik gebruik van een docker die dmv de Google API een lokale backup maakt van Google Photos, zodat ik nog een extra backup buiten Google heb. Hier gebruikte ik een docker voor, nl ghcr.io/gilesknap/gphotos-sync:latest Helaas heeft Google de stekker uit deze API getrokken waardoor dit niet meer mogelijk is. Maar hoe dan wel?

Via de discussion in de thread hierboven kwam ik uit bij https://github.com/spraot/gphotos-sync Dit is een geautomatiseerde web browser die de google photos website scraped en dus foto’s met bijbehorende info download. En het is ook een docker. 🙂 Dus deze geimplementeerd, en ik moet zeggen, dat werkt best goed. Maar.. 1 nadeel.. De foto’s worden behoorlijk willekeurig per foto in een map gezet met een onmogelijke mapnaam. Ik was meer gewend aan een structuur jaar-maand-fotos. Gelukkig was er iemand (yujhe) die een fork heeft gemaakt; en deze functie heeft toegevoegd. Maar.. Deze had weer geen schedule functie. Dus uiteindelijk deze 2 gecombineerd, zodat de bestanden op de mijn gewenste wijze worden opgeslagen.

Deze docker App is opgebouwd op een debian:bookworm-slim image waar chrome en de golang gphotos-cdp is geinstalleerd. yujhe heeft een andere versie gemaakt van de gphoto’s-cdp, deze heb ik dus geinstalleerd in het image van spraot. Verder heb ik deze Dockerfile eigenlijk ongewijzigd gelaten:

FROM golang:1.24-bookworm AS build

#ENV DEFAULT_GPHOTOS_CDP_VERSION=github.com/spraot/gphotos-cdp@4f83e4d9
ENV DEFAULT_GPHOTOS_CDP_VERSION=github.com/yujhe/gphotos-cdp@1.0.3
ENV GO111MODULE=on

ARG GPHOTOS_CDP_VERSION=$DEFAULT_GPHOTOS_CDP_VERSION
RUN go install $GPHOTOS_CDP_VERSION

FROM debian:bookworm-slim

ENV \
    LANG=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    CRON_SCHEDULE="0 0 * * *" \
    RESTART_SCHEDULE= \
    CHROME_PACKAGE=google-chrome-stable_current_amd64.deb \
    DEBIAN_FRONTEND=noninteractive \
    LOGLEVEL=INFO \
    HEALTHCHECK_HOST="https://hc-ping.com" \
    HEALTHCHECK_ID= \
    ALBUMS= \
    WORKER_COUNT=6 \
    GPHOTOS_CDP_ARGS=

RUN apt-get update && apt-get install -y \
        apt-transport-https \
        ca-certificates \
        curl \
        cron \
        exiftool \
        jq \
        wget \
        sudo \
    --no-install-recommends && \
    wget https://dl.google.com/linux/direct/$CHROME_PACKAGE && \
    apt install -y ./$CHROME_PACKAGE && \
    rm ./$CHROME_PACKAGE && \
    rm -rf /var/lib/apt/lists/*

COPY --from=build /go/bin/gphotos-cdp /usr/bin/
COPY src ./app/
RUN chmod +x /app/*.sh

USER root
ENTRYPOINT ["/app/start.sh"]
CMD [""]

Maar wel een paar aanpassingen gedaan in de src bestanden: sync.sh De CDP ARGS zijn nogal gewijzigd, dus dit aangepast. Tevens een regel toegevoegd om de cache op te schonen, deze kan erg groot worden, en onnodig ruimte gebruik houdt ik niet van. 🙂

PROFILE_DIR="${PROFILE_DIR:-/tmp/gphotos-cdp}"
DOWNLOAD_DIR="${DOWNLOAD_DIR:-/download}"
DB_DIR="${DB_DIR:-/download}"
WORKER_COUNT=${WORKER_COUNT:-6}
GPHOTOS_CDP_ARGS="-profile \"$PROFILE_DIR\" -db-file \"$DB_DIR/.gphotos.db\" -headless -json -workers $WORKER_COUNT -run /app/postdl.sh"

rm -f $PROFILE_DIR/Singleton*

if [ -n "$ALBUMS" ]; then
  for ALBUM in $(echo $ALBUMS | tr ',' ' '); do
    ALBUM_DL_DIR="$DOWNLOAD_DIR/$(basename "$ALBUM")"
    if [ "$ALBUM" = "ALL" ]; then
      eval gphotos-cdp -download-dir "$ALBUM_DL_DIR" $GPHOTOS_CDP_ARGS
    else
      eval gphotos-cdp -download-dir "$ALBUM_DL_DIR" $GPHOTOS_CDP_ARGS -album $ALBUM
    fi
  done
else
  eval gphotos-cdp -download-dir "$DOWNLOAD_DIR" $GPHOTOS_CDP_ARGS
fi
#Cleaning up Cache. (Can become very large)
rm -f -r $PROFILE_DIR/Default/Cache/Cache_Data/*
info "completed sync.sh, pid: $$"

En het bestand postdl.sh, volgende code toegevoegd, zodat de bestanden opgeslagen worden in de yyyy\mm\photo structuur.

# Move the file to the target directory based on DateTimeOriginal
# And add image id to the prefix: IMG_8251_ABCXY.JPG
SOURCE_FILE="$1"
TARGET_DIR="/download"

target_path=$(exiftool -d "%Y/%m" -p "${TARGET_DIR}/\${DateTimeOriginal}/$(basename "${SOURCE_FILE%.*}")_$(basename "$(dirname "$SOURCE_FILE")" | tail -c7).${SOURCE_FILE##*.}" "$SOURCE_FILE")
rc=$?
if [ $rc -ne 0 ]; then
  echo "$(basename "$SOURCE_FILE"): failed to get target path"
  exit 1
else
  echo "$(basename "$SOURCE_FILE"): move to $target_path based on DateTimeOriginal"
fi

mkdir -p "$(dirname "$target_path")"
mv -f "$SOURCE_FILE" "$target_path"
rmdir $(dirname "$SOURCE_FILE")

Vervolgens deze handmatig het docker image gecompileerd. (Je kunt hem ook met testsync.sh laten compileren, maar ik hou liever meer controle):

cd gphotos-sync-spraot/
docker build . --tag gphotos-sync

Daarna de volgende aangepaste docker-compose.yml aangemaakt, om de docker te starten:

services:
  gphotos-sync:
    image: gphotos-sync:latest
    #build: By myself, so using image above!
      #context: https://github.com/spraot/gphotos-sync.git
    container_name: gphotos-sync
    restart: unless-stopped
    privileged: true # chrome seems to need this to run as 1000:1000
    volumes:
      - /home/gerrit/gphotos/profile:/tmp/gphotos-cdp
      - /media/6tbdisk/users/Afbeeldingen/gphotos:/download #Here also DBfile.
    environment:
      - PUID=1001  # gerrit -  Set to the current user's uid
      - PGID=1001  # users Set to the current user's gid
      - CRON_SCHEDULE=45 6,17,23 * * * #@ 6,17 and 23:45
      - RESTART_SCHEDULE=26 1 * * 0
      - HEALTHCHECK_ID=d6e4a333-ce52-4129-9d3e-6722c3333333
      - LOGLEVEL=info
      - TZ=Europe/Amsterdam
      - WORKER_COUNT=3
      - ALBUMS= #ALL # comma separated list of album IDs to sync
      - GPHOTOS_CDP_ARGS= # additional arguments to pass to gphotos-cdp

Authenticatie

Voordat je deze docker kunt laten werken moet je eerst wel een hele belangrijke taak uitvoeren, nl het inloggen met de chrome sessie op Google Photo! Dit doe je door een andere image te starten, en hier in te loggen m.b.v. een web-vnc (grafische) sessie. De inlog gegevens worden gecaptured in het chrome-profiel, welke opgeslagen wordt in de ./profile folder, waar het chrome profiel wordt opgeslagen.

Dit doe je door het doauth.sh script te starten en de instructie’s te volgen. Start dit script met het linux-account waarmee je ook de downloads wilt doen. Mogelijk moet je eerst dit account ook rechten geven op de docker-engine. Dit doe je door deze gebruiker toe te voegen aan de ‘docker’ group, en vervolgens opnieuw in te loggen.

Als dit gelukt is verwijs je in bovenstaande docker-compose.yml naar de profile directory. Als alles goed zie zul je ongeveer dit terugzien in de logging.

INF running with user uid: 1001 and user gid: 1001 | INF running with user uid: 1001 and user gid: 1001 | dt=2025-09-08T19:36:53Z
INF scheduling cron job for: 37 * * * * | INF scheduling cron job for: 37 * * * * | dt=2025-09-08T19:36:53Z
INF starting sync.sh, pid: 59 | INF starting sync.sh, pid: 59 | dt=2025-09-08T19:37:02Z
INF syncing files at root dir https://photos.google.com | INF syncing files at root dir https://photos.google.com | dt=2025-09-08T19:37:02.027Z
INF loaded 5903 downloaded photo urls from database since 0001-01-01 00:00:00 +0000 UTC | INF loaded 5903 downloaded photo urls from database since 0001-01-01 00:00:00 +0000 UTC | dt=2025-09-08T19:37:02.035Z
INF session dir: /tmp/gphotos-cdp | INF session dir: /tmp/gphotos-cdp | dt=2025-09-08T19:37:02.035Z
INF starting Chrome browser | INF starting Chrome browser | dt=2025-09-08T19:37:02.035Z
INF Browser version: Chrome/140.0.7339.80 | INF Browser version: Chrome/140.0.7339.80 | dt=2025-09-08T19:37:02.233Z
INF starting authentication... | INF starting authentication... | dt=2025-09-08T19:37:02.233Z
INF successfully authenticated | INF successfully authenticated | dt=2025-09-08T19:37:05.038Z
INF using locale nl | INF using locale nl | dt=2025-09-08T19:37:05.041Z
INF so far: downloaded 0 (0 in queue), progress: 77.37% (4226/5462), estimated remaining: 1236 (18s) | INF so far: downloaded 0 (0 in queue), progress: 77.37% (4226/5462), estimated remaining: 1236 (18s) | dt=2025-09-08T19:38:05.645Z
INF Done | INF Done | dt=2025-09-08T19:38:43.976Z
INF in total: synced 5903 items, downloaded 0, progress: 100.00% | INF in total: synced 5903 items, downloaded 0, progress: 100.00% | dt=2025-09-08T19:38:43.976Z
INF completed sync.sh, pid: 59 | INF completed sync.sh, pid: 59 | dt=2025-09-08T19:38:44Z

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *