Ein Wiki privater Natur

Google Photos Takeout in Nextcloud importieren

nextcloud-logo.png

Google bietet keinen direkten Export in andere Dienste, aber der Weg über Google Takeout funktioniert gut. Das Tool google-photos-takeout-helper liest die JSON-Sidecars aus dem Takeout-Archiv, schreibt die originalen Aufnahme-Timestamps per EXIF zurück und sortiert die Dateien nach Datum.

Voraussetzungen

Schritt 1: Takeout anfordern

Unter Google-Konto, Bereich "Daten und Datenschutz", Punkt "Daten exportieren". Nur Google Fotos auswählen, Format ZIP, Dateigröße je nach Bedarf (z.B. 4 GB). Bei großen Bibliotheken liefert Google mehrere ZIPs. Die Download-Links kommen per E-Mail.

Schritt 2: Tool installieren

pipx install google-photos-takeout-helper
export PATH="$PATH:/root/.local/bin"

Bug in Version 2.3.0: Das Tool bricht mit einem KeyError: 'geoDataExif' ab, wenn ein JSON-Sidecar kein GPS-Feld vom EXIF-Typ enthält. Patch vor dem ersten Lauf einspielen:

python3 << 'EOF'
path = '/root/.local/share/pipx/venvs/google-photos-takeout-helper/lib/python3.13/site-packages/google_photos_takeout_helper/__main__.py'
with open(path) as f:
    content = f.read()

old = """        if longitude == 0 and latitude == 0:
            longitude = _str_to_float(json['geoDataExif']['longitude'])
            latitude = _str_to_float(json['geoDataExif']['latitude'])
            altitude = _str_to_float(json['geoDataExif']['altitude'])"""

new = """        if longitude == 0 and latitude == 0:
            if 'geoDataExif' in json:
                longitude = _str_to_float(json['geoDataExif']['longitude'])
                latitude = _str_to_float(json['geoDataExif']['latitude'])
                altitude = _str_to_float(json['geoDataExif']['altitude'])"""

if old in content:
    with open(path, 'w') as f:
        f.write(content.replace(old, new))
    print("Patch erfolgreich")
else:
    print("Pattern nicht gefunden")
EOF

Schritt 3: ZIPs auf den Server kopieren

scp ~/Downloads/takeout-*.zip root@server:/var/backup/fotos/

Schritt 4: Entpacken und verarbeiten

/var/tmp statt /tmp wählen, wenn letzteres knapp ist:

mkdir -p /var/tmp/takeout-raw /var/tmp/takeout-out

for z in /var/backup/fotos/*.zip; do
    unzip -q "$z" -d /var/tmp/takeout-raw
done

google-photos-takeout-helper \
    -i /var/tmp/takeout-raw \
    -o /var/tmp/takeout-out \
    --divide-to-dates

--divide-to-dates legt Unterordner nach Jahr/Monat an. Mehrere ZIPs können alle zusammen in takeout-raw landen, das Tool läuft dann einmal über den gesamten Ordner.

Am Ende gibt es eine Zusammenfassung: kopierte Dateien, Duplikate, Dateien ohne JSON-Sidecar (werden trotzdem übernommen), EXIF-Fehler (betrifft fast nur Videos, kein Problem) und Dateien ohne auflösbares Datum. Letztere erscheinen in der Galerie ohne korrekte Sortierung.

Schritt 5: In Nextcloud einspielen

Eigenen Ordner verwenden, damit keine Namenskollisionen mit bestehenden Uploads entstehen:

mkdir -p /home/cloud/BENUTZER/files/GooglePhotos

cp -r /var/tmp/takeout-out/* /home/cloud/BENUTZER/files/GooglePhotos/

chown -R www-data:www-data /home/cloud/BENUTZER/files/GooglePhotos/

sudo -u www-data php /pfad/zu/nextcloud/occ files:scan BENUTZER

memories.png

Nach dem Scan erscheinen die Fotos in der Galerie. Falls Face Recognition aktiv ist, läuft die Erkennung beim nächsten Cronjob.

Aufräumen

rm -rf /var/tmp/takeout-raw /var/tmp/takeout-out /var/backup/fotos/