Takeout JSON

supplemental-metadata.json in Google Takeout, spiegato

Perché Google ha rinominato i file JSON di Takeout nel 2024, perché alcuni nomi sono tagliati, come si abbinano i duplicati (1) e perché gli script li saltano.

Hai lanciato uno script che una volta sistemava le esportazioni di Takeout senza problemi, e stavolta ha saltato metà delle foto. Oppure hai guardato nella cartella e hai visto IMG_5512.HEIC.supplemental-metadata.json accanto a una foto e PXL_20240311_183022711.jpg.supplemental-m.json accanto a un'altra, e ti sei chiesto se il secondo sia rotto.

Nessuno dei due è rotto. Google ha cambiato il modo in cui chiama i file JSON, e la maggior parte delle guide scritte prima del 2024 non lo sa.

La rinomina del 2024

Per anni il JSON di IMG_5512.HEIC si chiamava IMG_5512.HEIC.json. Nome della foto, poi .json. Semplice, e ogni script cercava proprio quello.

Nel corso del 2024 Google è passato a IMG_5512.HEIC.supplemental-metadata.json. Stesso contenuto, stessi campi, nome più lungo. L'idea sembra essere che supplemental-metadata dica cosa è il file, invece di lasciare un .json nudo che potrebbe sembrare dati della foto stessa. Le esportazioni fatte da allora usano il nome nuovo. Se hai una vecchia esportazione su un disco, usa quello vecchio, e una cartella mista può contenerli entrambi.

Qualunque cosa cerchi <foto>.json ora non trova nulla e va avanti. Alcuni strumenti segnalano "nessun sidecar trovato" per ogni file. Altri ripiegano in silenzio sulla data del file, cioè quella del download, e le foto escono sbagliate senza nessun errore. Quel fallimento silenzioso è l'origine di tanti post "la correzione non ha funzionato".

Il taglio a 46 caratteri

Il secondo cambiamento è più vecchio, ma con la rinomina fa più danni. Google tronca l'intero nome del JSON a 46 caratteri. Con il vecchio suffisso corto capitava di rado. Con .supplemental-metadata.json aggiunto, qualsiasi nome di foto oltre i 19 caratteri circa perde un pezzo del suffisso.

Una foto di un Pixel chiamata PXL_20240311_183022711.jpg è di 26 caratteri. Aggiungi .supplemental-metadata.json e arrivi a 53. Google taglia a 46: PXL_20240311_183022711.jpg.supplemental-m.json. Una foto Samsung 20240311_183022.jpg diventa 20240311_183022.jpg.supplemental-metada.json. Ogni marca produce un troncamento leggermente diverso, quindi non esiste un unico suffisso da cercare.

La regola affidabile è: il nome del JSON è un prefisso di <nome foto>.supplemental-metadata.json. Uno script deve verificare questo, non confrontare una stringa fissa. I nomi originali molto lunghi, per esempio quelli scritti da te, possono essere tagliati anche nel nome della foto stessa, ed è per questo che vale la pena leggere il campo title dentro il JSON.

Dove va il (1)

Google Foto ammette due file con lo stesso nome, e Takeout deve metterli in una sola cartella. Aggiunge un contatore al secondo: IMG_5512.HEIC e IMG_5512(1).HEIC.

Ti aspetteresti i JSON IMG_5512.HEIC.supplemental-metadata.json e IMG_5512(1).HEIC.supplemental-metadata.json. Non è così. Il contatore si sposta in fondo al nome del JSON, prima di .json: IMG_5512.HEIC.supplemental-metadata(1).json. Con lo stile vecchio era IMG_5512.HEIC(1).json.

Quindi uno strumento deve prendere il nome della foto, togliere il (1), costruire il nome del JSON e rimettere il (1) subito prima di .json. Combinalo con il troncamento e ottieni nomi come PXL_20240311_183022711.jpg.supplemental-(1).json. Le esportazioni reali li contengono.

I duplicati con contatore sono più comuni di quanto pensi. La stessa foto salvata in due album, una foto modificata di cui Google ha tenuto entrambe le versioni, o due telefoni che hanno chiamato un file IMG_0001.JPG li producono tutti.

Le copie modificate

Le foto modificate dentro Google Foto escono come due file: IMG_5512.HEIC e IMG_5512-edited.HEIC. Di solito c'è un solo JSON, legato al nome originale. La copia modificata non ha un JSON suo, quindi uno strumento ingenuo la lascia senza data. Uno strumento attento toglie -edited e riusa il JSON dell'originale.

Abbinare a mano

Se usi exiftool, lancialo due volte, una per ogni suffisso:

exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -ext heic -overwrite_original .
exiftool -r -d %s -tagsfromfile "%d/%F.json" "-DateTimeOriginal<PhotoTakenTimeTimestamp" -ext jpg -ext heic -overwrite_original .

Poi elenca quello che è rimasto senza data con exiftool -r -if 'not $DateTimeOriginal' -filename .. Quello che resta è l'insieme dei troncati e dei (1). La soluzione più semplice è rinominare quei JSON con il nome completo atteso usando un breve script, poi rilanciare exiftool. GooglePhotosTakeoutHelper, uno strumento gratuito della community, ha questo abbinamento incorporato ed è il consiglio classico se ti trovi bene nel terminale. Le sue versioni a volte restano indietro rispetto ai cambiamenti di Google, quindi se una esecuzione salta dei file controlla il suo issue tracker.

L'app

Takeout JSON Metadata Fixer gestisce tutti questi casi senza configurazione, su Windows, Mac e Linux, in italiano.

Per ogni foto prova il nome del 2024, il nome vecchio, il contatore (1) spostato e infine qualsiasi .json nella cartella il cui nome sia un prefisso del nome completo atteso. Le copie modificate prendono in prestito il JSON dell'originale. Poi scrive data e GPS nel file. Alla fine riporta quante foto hanno trovato un JSON e quante sono ricadute sull'EXIF o sulla data del file, così vedi se l'abbinamento ha funzionato prima di eliminare qualcosa. La prova a secco mostra il piano senza scrivere. Le prime 1000 foto sono gratuite.

Domande frequenti

Il contenuto di supplemental-metadata.json è diverso dal vecchio .json?

No. I campi sono gli stessi: title, photoTakenTime, creationTime, geoData, geoDataExif e così via. È cambiato solo il nome del file.

La mia foto non ha nessun JSON. Perché?

Le clip delle Live Photo spesso non ce l'hanno. Alcuni caricamenti molto vecchi non ce l'hanno. E se un JSON è troncato o ha il contatore spostato, il tuo strumento potrebbe segnalarlo come mancante quando invece c'è. Guarda nella cartella con i tuoi occhi.

Posso rinominare i JSON con il vecchio stile?

Sì, e fa funzionare di nuovo i vecchi script. Basta una rinomina che tolga .supplemental-metadata e riporti il (1) sulla parte del nome della foto. Fallo prima su una copia.

Google cambierà di nuovo il nome?

Può darsi. L'approccio sicuro per qualsiasi strumento è abbinare per prefisso e per il campo title, non per un suffisso esatto.