Como juntar o JSON do Google Takeout às fotos (data e GPS)
Passo a passo para gravar a data e o GPS dos arquivos .json do Google Takeout dentro das fotos e vídeos, com o exiftool ou com um programa de desktop.
Você tem uma pasta de fotos e, ao lado de cada uma, um arquivo .json com a data e o local reais. As fotos em si mostram a data errada. O que você quer é que a informação do .json vá para dentro da foto, para poder jogar os JSON fora e ficar com uma pasta de fotos normal.
Esse problema tem solução conhecida. Aqui está como fazer na mão, e como fazer com um clique.
O que "juntar" significa na prática
Um JPEG, HEIC ou PNG tem um bloco de metadados chamado EXIF. A câmera grava ali a data da captura, em uma tag chamada DateTimeOriginal, e as coordenadas de GPS em GPSLatitude e GPSLongitude. Os apps de foto de qualquer sistema leem essas tags.
O JSON do Takeout tem a mesma informação em outro formato. Juntar significa ler photoTakenTime e geoData do JSON e gravar nas tags EXIF. Aproveitando, você ajusta também as datas de criação e de modificação do arquivo, para o Finder e o Explorador de Arquivos ordenarem certo até nas visualizações que ignoram o EXIF.
Vídeos não têm EXIF. A data deles fica dentro do container MP4 ou MOV, em tags como CreateDate. A ideia é a mesma, só mudam os nomes das tags.
Passo 1: descompacte tudo no mesmo lugar
O Takeout divide exportações grandes em vários zips. Descompacte todos na mesma pasta, para as pastas de álbum se juntarem. Se um álbum ficou espalhado em dois zips, metade das fotos e metade dos JSON podem estar em cada um, e eles precisam terminar lado a lado. Veja Google Takeout dividido em vários arquivos zip se você tem muitas partes.
Passo 2: entenda como cada foto acha o seu JSON
O nome do JSON é o nome da foto mais um sufixo. IMG_0042.JPG combina com IMG_0042.JPG.supplemental-metadata.json nas exportações de 2024 em diante, ou com IMG_0042.JPG.json nas mais antigas.
Duas coisas quebram essa regra simples. Nomes com mais de 46 caracteres são cortados, então o sufixo sai pela metade. E fotos duplicadas recebem o contador em outro lugar: IMG_0042(1).JPG combina com IMG_0042.JPG.supplemental-metadata(1).json. Qualquer ferramenta que você usar precisa tratar os dois casos, senão pula esses arquivos em silêncio.
Passo 3: junte com o exiftool
O exiftool é gratuito e roda em qualquer sistema. Instale, abra um terminal na pasta Google Photos e rode:
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-DateTimeOriginal<PhotoTakenTimeTimestamp" \
"-CreateDate<PhotoTakenTimeTimestamp" \
"-FileCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
"-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
"-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
-ext jpg -ext jpeg -ext heic -ext png -overwrite_original .
O que isso faz: para cada imagem, procura na mesma pasta um arquivo com o mesmo nome mais .supplemental-metadata.json e copia os campos listados. O -d %s diz ao exiftool que o timestamp está em segundos desde 1970. O -overwrite_original evita que ele deixe uma cópia de backup de cada arquivo.
Rode uma segunda vez com "%d/%F.json" para os JSON no estilo antigo. Depois rode mais uma vez para os vídeos:
exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
"-CreateDate<PhotoTakenTimeTimestamp" "-ModifyDate<PhotoTakenTimeTimestamp" \
"-TrackCreateDate<PhotoTakenTimeTimestamp" "-MediaCreateDate<PhotoTakenTimeTimestamp" \
"-FileModifyDate<PhotoTakenTimeTimestamp" \
-ext mp4 -ext mov -overwrite_original .
Passo 4: trate o que o exiftool deixou passar
Conte o que sobrou:
exiftool -r -if 'not $DateTimeOriginal' -ext jpg -ext heic -ext png -filename .
A lista vai ter os nomes cortados, as duplicatas com (1) e as fotos que nunca tiveram JSON. Os cortados dá para pegar com um script curto que procura o .json cujo nome é o começo do nome esperado. As duplicatas precisam ser renomeadas antes de o padrão funcionar. É essa parte que transforma um trabalho de dez minutos em uma noite inteira, e é por isso que existem scripts da comunidade como o GooglePhotosTakeoutHelper. Eles são gratuitos e fazem a combinação por você, no terminal.
Mais uma pegadinha: as linhas de GPS acima gravam sem problema 0.0, 0.0 nas fotos cujo JSON diz "local desconhecido". Acrescente -if '$GeoDataLatitude ne 0' ou aceite um monte de fotos no meio do Atlântico.
Passo 5: o app no lugar disso tudo
O Takeout JSON Metadata Fixer faz os passos 1 a 4 em uma execução, no Windows, no Linux e no Mac.
Selecione os zips do Takeout ou a pasta descompactada. O app combina cada foto e cada vídeo com o seu JSON testando todos os estilos de nome que o Google já usou, incluindo o corte em 46 caracteres e o contador (1). Ele grava a data no EXIF das imagens e no container dos vídeos, ajusta as datas do arquivo e só grava o GPS quando as coordenadas são reais. Fotos sem JSON mantêm a própria data EXIF, ou a data do arquivo se não tiverem nenhuma.
Você pode parar por aí, com "Manter nomes" e "Manter minhas pastas", e receber a mesma pasta de volta com os metadados certos. Ou pode renomear os arquivos pela data e organizar em pastas de ano e mês na mesma passada. A simulação mostra o plano antes de gravar qualquer coisa. As primeiras 1000 fotos são grátis; sem limite, é uma compra única de US$ 19,99. Nada é enviado para lugar nenhum.
Passo 6: confira, depois apague os JSON
Abra algumas fotos de anos diferentes no seu app de fotos e confira as datas. Depois apague os arquivos .json. No Mac ou no Linux, de dentro da pasta: find . -name "*.json" -delete. No Windows, busque *.json na pasta, selecione tudo e apague. Guarde os zips originais em algum lugar por um mês, caso você note algum problema. Mais detalhes em posso apagar os arquivos JSON do Google Takeout.
Perguntas frequentes
Juntar os metadados muda a qualidade da imagem?
Não. Só o bloco de metadados é regravado. Os dados comprimidos da imagem são copiados byte a byte.
E se a foto já tem uma data EXIF diferente da do JSON?
O JSON reflete o que o Google Fotos mostrava, incluindo qualquer correção que você fez. Na maioria dos casos é essa a data que você quer. Se você nunca editou datas no Google Fotos, as duas vão bater de qualquer jeito.
Por que a hora sai algumas horas diferente?
O timestamp do JSON está em UTC. O EXIF não tem fuso horário, então as ferramentas convertem para o fuso local do computador. Coloque o computador no fuso em que as fotos foram tiradas, ou aceite a diferença. Veja fotos com a hora errada depois do Takeout.
Dá para juntar só a data e deixar o GPS de fora?
Dá. Tire as linhas de GPS do comando do exiftool. No app, o GPS é gravado quando existe; se você não quer o local no nome dos arquivos, escolha um modelo de nome sem ele.