Dopo aver fatto lβupload di tutti i video compressi che avevo in giro su immich sono passato a richiedere a google tutto il mio archivio fotografico.
Ho fatto partire lβupload di qualche foto ma mi sono accorto che non tutte andavano nel posto giusto, qualcuna veniva caricata con la data in cui ho chiesto il takeout. π±
Mi sono accorto che tutti i file foto e video avevano un file .supplemental-metadata.json associato. Ad esempio:
# ls -l ./Garda2020/DSC01374.jpg*
-rw-r--r--. 1 alorenzi alorenzi 160565 Aug 18 2020 ./Garda2020/DSC01374.jpg
-rw-r--r--. 1 alorenzi alorenzi 599 Mar 25 00:02 ./Garda2020/DSC01374.jpg.supplemental-metadata.json
Inoltre qualcuno aveva il nome di quel file tagliato, ad esempio ./Photos from 2025/IMG_20250310_201005_380.webp.supplemental-meta.json . Sicuramente volevano tenere il nome di una lunghezza massima, ma non ha sicuramente facilitato il lavoro di puliza.
Che sono gli exif?
Gli exif sono metadati che la macchina fotografica (o il telefono) scrive allβinterno del file della fotografia. Ci potete trovare il modello della macchina con cui Γ© stata scattata la foto, i settaggi (tempi di esposizione, isoβ¦), la posizione GPS e lβorario.
I software di gestione delle foto utilizzano queste informazioni per mettere la foto sulla mappa o appunto metterla correttamente nella timeline.
Scriptiamoβ¦
In questo caso ho utilizzato exiftool per estrarre la data dal file originale per evitare di processare inutilmente tutte le immagini, poi ho estratto dal json il timestamp con jq e infine ho settato lβexif usando ancora exiftool .
update_metadata(){
FILENAME=$1
# Extract the date from exif
DATE=$(exiftool -d "%Y-%m-%d" -DateTimeOriginal -s3 "${FILENAME}")
# if the date is valid return
if [ -n "${DATE}" ]; then
return 0
fi
JSON_FILE=$(ls "${FILENAME}".*.json)
# Get the date from metadata json
PHOTO_TAKEN_TIME=$(jq -r '.photoTakenTime.timestamp' "${JSON_FILE}")
# Set exif
exiftool -overwrite_original -d "%s" \
-DateTimeOriginal="${PHOTO_TAKEN_TIME}" \
-FileCreateDate="${PHOTO_TAKEN_TIME}" \
-FileModifyDate="${PHOTO_TAKEN_TIME}" \
"${FILENAME}"
}
Una veloce modifica al codice e troviamo quali immagini non sono state configurate correttamente
check_date(){
FILENAME=$1
DATE=$(exiftool -d "%Y-%m-%d" -DateTimeOriginal -s3 "${FILENAME}")
# if the date is valid return
if [ -n "${DATE}" ]; then
return 0
fi
echo "No date found for ${FILENAME}"
}
Entrambe le funzioni si possono lanciare con il comando find come fatto nellβarticolo precedente.
Con check_date ho scoperto che una trentina di foto non avevano nΓ© gli exif settati e nemmeno un file json associato. Ma Γ© anche vero che erano quasi tutte foto NOMEFILE-edited.jpg o simili.
Quindi lβultimo giro di giostra Γ© stato fare uno script che prendesse due immagini e copiasse la data di scatto da una allβaltra:
lastfix(){
FILENAME="$1"
PHOTO_TAKEN_TIME=$(exiftool -d "%s" -DateTimeOriginal -s3 "$2")
echo "Writing $PHOTO_TAKEN_TIME to $FILENAME"
exiftool -overwrite_original \
-d "%s" \
-DateTimeOriginal="$PHOTO_TAKEN_TIME" \
-FileCreateDate="$PHOTO_TAKEN_TIME" \
-FileModifyDate="$PHOTO_TAKEN_TIME" \
"$FILENAME"
}
lastfix photo-edited.jpg photo.jpg
Upload
Alla fine ho caricato ben 3332 foto nuove al mio archivio unico π€©
Crawling for assets...
Hashing files | ββββββββββββββββββββββββββββββββββββββββ | 100% | ETA: 0s | 6280/6280 assets
Checking for duplicates | ββββββββββββββββββββββββββββββββββββββββ | 100% | ETA: 0s | 6280/6280 assets
Found 3832 new files and 2448 duplicates
Uploading assets | ββββββββββββββββββββββββββββββββββββββββ | 87% | ETA: NFs | 15.7 GB/15.7 GB
Successfully uploaded 3332 new assets (13.8 GB)
Skipped 500 duplicate assets (1.9 GB)