Google Photos Takeout in Nextcloud importieren

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
- SSH-Zugang zum Server
pipx(Python-Paketverwaltung)- Genug temporären Speicher: mindestens dreimal die Takeout-Größe
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

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/