Esportare Google Foto in Immich: date, file JSON e album
Come portare un'esportazione di Google Takeout in Immich con le date giuste: immich-go, perché le date si rompono caricando da web, e come preparare i file.
Hai installato Immich, hai caricato la cartella di Takeout e la timeline mostra tutto in un solo giorno. Oppure hai usato immich-go e qualche migliaio di foto è entrato comunque senza data, e il log dice che centinaia di file JSON mancano.
Immich è un buon posto dove arrivare. Il trucco è mettere le date in una forma che legge.
Come Immich decide la data di una foto
Immich legge DateTimeOriginal dall'EXIF delle immagini e la data di creazione dal contenitore dei video. Se non esiste nessuna delle due, usa la data di modifica del file. Legge anche i sidecar .xmp. Non legge i .json di Google quando carichi dall'interfaccia web, dall'app mobile o dalla CLI. Quei file sono semplicemente non supportati, e Immich registra un errore per ciascuno.
Dopo l'estrazione di Takeout, la data di modifica del file è il momento in cui hai estratto. Quindi ogni foto senza data EXIF atterra su quel giorno. Screenshot, immagini dalle chat, scansioni e tutto ciò che hai ridatato in Google Foto sono le vittime abituali. Le foto da fotocamera con l'EXIF intatto stanno bene.
Strada 1: immich-go
immich-go è uno strumento gratuito a riga di comando fatto esattamente per questo. Legge direttamente gli zip di Takeout, abbina ogni foto al suo JSON, usa photoTakenTime come data, ricrea gli album dalle cartelle degli album e carica sul tuo server. È la strada che la community di Immich consiglia, e funziona bene.
Un'esecuzione di base:
immich-go upload from-google-photos --server http://tuo-server:2283 --api-key LATUACHIAVE ~/Downloads/takeout-*.zip
Cose da sapere. Nelle versioni attuali gestisce i nomi supplemental-metadata del 2024 e i nomi troncati; se vedi "JSON missing" per molti file, aggiorna prima. Carica il file così com'è e manda la data del JSON separatamente, quindi la data finisce nel database di Immich, non dentro la foto. Se in futuro esporti da Immich o punti un altro strumento sugli stessi file, il file in sé è ancora senza data. Lancialo prima con --dry-run per vedere i conteggi.
Un conteggio di JSON mancanti nell'ordine delle centinaia, su una libreria grande, è normale. Di solito sono clip di Live Photo, copie modificate e file di vecchi caricamenti che non hanno mai avuto un JSON. immich-go per quelli ripiega sulla data del file.
Strada 2: sistemare i file, poi caricare come vuoi
L'alternativa è scrivere i dati dei JSON dentro i file prima che arrivino a Immich. Allora ogni via di caricamento funziona, le date viaggiano con i file se un giorno lasci Immich, e una libreria esterna puntata sulla cartella viene indicizzata correttamente.
Con exiftool:
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-DateTimeOriginal<PhotoTakenTimeTimestamp" \
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
-ext jpg -ext heic -ext png -overwrite_original .
I video vogliono i tag QuickTime, e i nomi troncati o con (1) richiedono passaggi in più. La guida a exiftool li copre tutti.
Takeout JSON Metadata Fixer lo fa come app desktop su Windows, Mac e Linux, in italiano, anche sulla macchina che ospita Immich.
Indicale gli zip di Takeout. Scrive data vera e GPS in ogni foto e video, allinea le date dei file e, se vuoi, ordina il risultato in cartelle per anno e mese. Due opzioni contano per Immich. Lascia le Live Photo su "Tieni la clip accanto alla foto", così Immich accoppia foto e clip al caricamento. E attiva "Scrivi sidecar .json" se pensi di usare immich-go dopo: scrive un JSON pulito per ogni file nel formato di Google, con data e coordinate vere, così immich-go non ha nulla da indovinare.
Il risultato è una normale cartella di foto datate. Caricala dall'interfaccia web, dalla CLI o con immich-go. Oppure aggiungila come libreria esterna e lascia che Immich la indicizzi sul posto. Le prime 1000 foto sono gratuite.
Album
Takeout rappresenta un album come una cartella con le copie delle sue foto più un metadata.json con il nome dell'album. immich-go li trasforma in album di Immich. Se scegli la strada dei file sistemati, o carichi anche le cartelle degli album, creando duplicati che Immich poi elimina per hash, oppure carichi le cartelle Photos from YYYY e ricostruisci gli album a mano.
Immich scarta le copie identiche byte per byte al caricamento. Una volta scritte le date nei file, due copie della stessa foto sono ancora identiche tra loro, quindi la deduplica funziona lo stesso.
Controllare il risultato
Dopo il caricamento apri la timeline e scorri fino a un anno vecchio. Apri una foto e guarda il pannello informazioni: la data deve essere quella che mostrava Google Foto. Apri la mappa. Le foto con GPS vero devono comparire. Le foto che avevano 0.0, 0.0 nel JSON non devono comparire nell'oceano; se ci sono, il tuo passaggio di unione ha scritto gli zeri, e devi toglierli con exiftool -gps:all= sui file interessati.
Se un gruppo è ancora sbagliato, Immich permette di selezionare le foto e modificare la data in blocco dall'interfaccia web.
Domande frequenti
Uso immich-go o sistemo prima i file?
Funzionano entrambi. immich-go è più veloce e ricostruisce gli album. Sistemare prima i file mette le date dentro le foto, il che conta se usi librerie esterne o se potresti spostarti ancora. Alcuni fanno entrambe le cose: sistemano i file, poi caricano con immich-go per gli album.
Perché Immich mostra un'ora spostata di qualche ora?
Il timestamp del JSON è in UTC. Quando viene scritto nell'EXIF diventa ora locale nel fuso del tuo computer, senza fuso registrato. Immich poi la mostra così com'è. Imposta il fuso del computer sul luogo delle foto prima di unire, oppure correggi in Immich dopo.
Immich dice "Unsupported file" per ogni .json. È un problema?
No. Ti sta dicendo che li ha ignorati. Elimina i JSON prima di caricare, oppure usa immich-go, che li consuma.
Devo convertire gli HEIC?
No. Immich legge gli HEIC e genera le sue anteprime. Tieni gli originali.