supplemental-metadata.json no Google Takeout, explicado
Por que o Google renomeou os JSON do Takeout em 2024, por que alguns nomes saem cortados, como as duplicatas (1) se combinam e por que scripts antigos falham.
Você rodou um script que antes corrigia exportações do Takeout sem problema, e desta vez ele pulou metade das fotos. Ou olhou a pasta e viu IMG_5512.HEIC.supplemental-metadata.json ao lado de uma foto e PXL_20240311_183022711.jpg.supplemental-m.json ao lado de outra, e ficou na dúvida se o segundo está quebrado.
Nenhum dos dois está quebrado. O Google mudou o jeito de nomear os JSON, e a maioria dos tutoriais escritos antes de 2024 não sabe disso.
A renomeação de 2024
Durante anos o JSON de IMG_5512.HEIC era IMG_5512.HEIC.json. Nome da foto, depois .json. Simples, e todo script batia com isso.
Em algum momento de 2024 o Google passou para IMG_5512.HEIC.supplemental-metadata.json. Mesmo conteúdo, mesmos campos, nome mais longo. A ideia parece ser que supplemental-metadata descreve o que o arquivo é, em vez de deixar um .json solto que parece ser dado da própria foto. Exportações feitas desde então usam o nome novo. Se você tem uma exportação antiga guardada em algum HD, ela usa o nome antigo, e uma pasta misturada pode conter os dois.
Qualquer coisa que procure por <foto>.json agora não encontra nada e segue em frente. Algumas ferramentas avisam "nenhum sidecar encontrado" para cada arquivo. Outras caem em silêncio para a data do arquivo, que é a data do download, e as fotos saem erradas sem nenhum erro. Essa falha silenciosa é a origem de muitos posts de "a correção não funcionou".
O corte em 46 caracteres
A segunda mudança é mais antiga, mas a renomeação fez ela doer mais. O Google corta o nome inteiro do JSON em 46 caracteres. Com o sufixo curto antigo isso raramente importava. Com .supplemental-metadata.json acrescentado, qualquer nome de foto com mais de uns 19 caracteres perde parte do sufixo.
Uma foto de Pixel chamada PXL_20240311_183022711.jpg tem 26 caracteres. Acrescente .supplemental-metadata.json e dá 53. O Google corta em 46: PXL_20240311_183022711.jpg.supplemental-m.json. Uma foto de Samsung 20240311_183022.jpg vira 20240311_183022.jpg.supplemental-metada.json. Cada marca de celular produz um corte um pouco diferente, então não existe um único sufixo para procurar.
A regra confiável é: o nome do JSON é um prefixo de <nome da foto>.supplemental-metadata.json. Um script precisa testar isso, não comparar com um texto fixo. Nomes originais longos, como os que você mesmo digitou, podem ser cortados até no nome da foto, e é por isso que vale ler o campo title dentro do JSON.
Onde vai o (1)
O Google Fotos permite dois arquivos com o mesmo nome, e o Takeout precisa colocar os dois em uma pasta só. Ele acrescenta um contador no segundo: IMG_5512.HEIC e IMG_5512(1).HEIC.
Você esperaria que os JSON fossem IMG_5512.HEIC.supplemental-metadata.json e IMG_5512(1).HEIC.supplemental-metadata.json. Não são. O contador vai para o fim do nome do JSON, antes do .json: IMG_5512.HEIC.supplemental-metadata(1).json. No estilo antigo era IMG_5512.HEIC(1).json.
Então a ferramenta precisa pegar o nome da foto, tirar o (1), montar o nome do JSON e colocar o (1) de volta logo antes do .json. Combine isso com o corte e você chega a nomes como PXL_20240311_183022711.jpg.supplemental-(1).json. Exportações reais têm isso.
Duplicatas com contador são mais comuns do que parece. A mesma foto salva em dois álbuns, uma foto que você editou e da qual o Google guardou as duas versões, ou dois celulares que chamaram um arquivo de IMG_0001.JPG produzem todas elas.
As cópias editadas
Fotos editadas dentro do Google Fotos saem como dois arquivos: IMG_5512.HEIC e IMG_5512-edited.HEIC. Normalmente há um único JSON, ligado ao nome original. A cópia editada não tem JSON próprio, então uma ferramenta ingênua deixa ela sem data. Uma ferramenta cuidadosa tira o -edited e reaproveita o JSON do original. Mais sobre isso em duplicatas e versões editadas do Takeout (em inglês).
Combinando na mão
Se você usa o exiftool, rode duas vezes, uma para cada sufixo:
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 .
Depois liste o que ainda está sem data com exiftool -r -if 'not $DateTimeOriginal' -filename .. O que sobrar é o conjunto dos cortados e dos (1). A correção mais simples é renomear esses JSON para o nome completo esperado com um script curto antes de rodar o exiftool de novo. O GooglePhotosTakeoutHelper, uma ferramenta gratuita da comunidade, tem essa combinação embutida e é a recomendação habitual para quem se vira bem no terminal. As versões dele às vezes ficam para trás das mudanças do Google, então confira o rastreador de problemas se uma execução pular arquivos.
O aplicativo
O Takeout JSON Metadata Fixer trata todos esses casos sem configuração, no macOS, no Windows e no Linux.
Para cada foto ele tenta o nome de 2024, o nome antigo, o contador (1) deslocado e, por fim, qualquer .json na pasta cujo nome seja um prefixo do nome completo esperado. Cópias editadas pegam emprestado o JSON do original. Depois ele grava a data e o GPS no arquivo. Ele informa quantas fotos combinaram com um JSON e quantas caíram para o EXIF ou para a data do arquivo, então você vê se a combinação funcionou antes de apagar qualquer coisa. Uma simulação mostra o plano sem gravar. As primeiras 1000 fotos são grátis.
Perguntas frequentes
O conteúdo do supplemental-metadata.json é diferente do .json antigo?
Não. Os campos são os mesmos: title, photoTakenTime, creationTime, geoData, geoDataExif e assim por diante. Só o nome do arquivo mudou.
Minha foto não tem JSON nenhum. Por quê?
Clipes de Live Photo muitas vezes não têm. Alguns envios muito antigos não têm. E se o JSON está cortado ou tem o contador deslocado, sua ferramenta pode estar dizendo que ele não existe quando ele está lá. Olhe a pasta você mesmo.
Posso renomear os JSON de volta para o estilo antigo?
Pode, e isso faz scripts antigos voltarem a funcionar. Uma renomeação que tire .supplemental-metadata e mova o (1) de volta para a parte do nome da foto é suficiente. Faça em uma cópia primeiro.
O Google vai mudar o nome de novo?
Possivelmente. A abordagem segura para qualquer ferramenta é combinar por prefixo e pelo campo title, não por um sufixo exato.