Takeout JSON

구글 테이크아웃 사진 옆의 JSON 파일은 무엇인가요?

구글 테이크아웃 내보내기에서 사진마다 붙어 나오는 .json 파일에 무엇이 들어 있는지, 왜 생기는지, 지워도 되는지 설명합니다.

구글 포토 내보내기의 압축을 풀었더니 파일의 절반이 사진이 아닙니다. 사진마다 옆에 IMG_3391.HEIC.supplemental-metadata.json 같은 이름의 .json 파일이 하나씩 붙어 있습니다. 요청한 적도 없고, 대부분의 프로그램은 열지도 못하며, 수천 개나 됩니다.

이것은 쓰레기가 아닙니다. 구글이 사진 안에 써 주지 않은 촬영 날짜와 위치가 여기 들어 있습니다.

구글이 이 파일을 붙이는 이유

구글 포토는 사진에 대해 아는 것을 자기 데이터베이스에 저장합니다. 언제 찍었는지, 어디서 찍었는지, 어느 앨범에 있는지, 즐겨찾기를 했는지, 그리고 사용자가 손으로 고친 날짜나 위치까지입니다. 사진 파일 자체의 EXIF 블록에 그 정보가 있을 수도 있고 없을 수도 있습니다. 스크린샷과 메신저 사진에는 대개 없습니다. 구글 포토 안에서 한 수정은 절대 파일에 들어가지 않습니다.

내보내기를 하면 구글은 업로드한 그대로의 이미지 파일을 돌려줍니다. 데이터베이스 내용을 파일에 다시 써 주지는 않습니다. 대신 데이터베이스 항목을 작은 텍스트 파일로 만들어 이미지 옆에 놓습니다. 이 텍스트 파일이 사이드카이고, JSON은 그것을 적은 형식의 이름일 뿐입니다.

안에 무엇이 들어 있나

메모장이나 아무 텍스트 편집기로 열어 보십시오. 전형적인 사이드카는 조금 줄이면 이렇게 생겼습니다.

{
  "title": "IMG_3391.HEIC",
  "description": "",
  "imageViews": "12",
  "creationTime": {
    "timestamp": "1690120442",
    "formatted": "Jul 23, 2023, 2:34:02 PM UTC"
  },
  "photoTakenTime": {
    "timestamp": "1689929130",
    "formatted": "Jul 21, 2023, 9:25:30 AM UTC"
  },
  "geoData": {
    "latitude": 37.5796,
    "longitude": 126.977,
    "altitude": 35.0,
    "latitudeSpan": 0.0,
    "longitudeSpan": 0.0
  },
  "geoDataExif": {
    "latitude": 37.5796,
    "longitude": 126.977,
    "altitude": 35.0
  },
  "url": "https://photos.google.com/photo/...",
  "googlePhotosOrigin": {
    "mobileUpload": {
      "deviceType": "IOS_PHONE"
    }
  }
}

중요한 항목은 다음과 같습니다.

photoTakenTime은 구글 포토가 보여 주던 촬영 날짜입니다. timestamp는 1970년 1월 1일 UTC부터 센 초입니다. 구글 포토 안에서 날짜를 고쳤다면 그 수정값이 여기 있습니다. 써야 할 값은 이것입니다.

creationTime은 파일을 구글에 업로드한 시각입니다. 찍은 날 바로 백업한 사진이라면 두 값이 같습니다. 1985년 인화 사진을 2021년에 스캔해 올렸다면 수십 년 차이가 납니다.

geoData는 구글 포토가 알고 있던 위치이며 손으로 지정한 장소도 포함합니다. geoDataExif는 업로드 당시 파일의 EXIF에 있던 위치입니다. 위치가 없는 사진은 둘 다 0.0, 0.0인데, 이것은 대서양 한가운데의 좌표입니다. 0만 있으면 실제 장소가 아니라 "모름"으로 봐야 합니다. 테이크아웃 위치 정보 복구에서 더 다룹니다.

description은 직접 입력한 설명입니다. people은 태그한 사람 이름이 있을 때 나옵니다. favorited는 즐겨찾기한 사진이면 true입니다. title은 원래 파일 이름인데, 테이크아웃이 실제 파일 이름을 줄여 버릴 때가 있어서 쓸모가 있습니다.

앨범 파일

앨범 폴더마다 사진이 아니라 앨범 자체를 설명하는 metadata.json이 하나씩 있습니다. 앨범 제목, 때로는 날짜와 공유 앨범 여부가 들어 있습니다. 작고 무해합니다. immich-go처럼 앨범을 가져오는 도구가 이 파일을 읽습니다.

이름이 이상한 이유

예전 내보내기는 사이드카 이름이 IMG_3391.HEIC.json이었습니다. 2024년부터 IMG_3391.HEIC.supplemental-metadata.json으로 바뀌었습니다. 구글은 긴 사이드카 이름을 46자에서 잘라 버리기 때문에 픽셀 사진은 PXL_20230721_092530123.jpg.supplemental-m.json 같은 짝을 갖게 됩니다. 갤럭시 사진 20230721_092530.jpg20230721_092530.jpg.supplemental-metada.json이 됩니다. 두 사진의 이름이 같으면 번호가 사이드카의 다른 자리에 붙습니다. IMG_3391(1).HEIC의 짝은 IMG_3391.HEIC.supplemental-metadata(1).json입니다. 자세한 내용은 supplemental-metadata.json 설명에 있습니다.

지워도 되나요?

됩니다. 다만 사용한 뒤에만 그렇습니다. 사이드카를 먼저 지우면 그 안의 날짜와 위치는 사라집니다. 사진은 영원히 다운로드 날짜를 보여 주고, 테이크아웃을 다시 돌리는 것 말고는 되찾을 방법이 없습니다.

사진 전부에 이미 좋은 EXIF가 있다면 사이드카는 별로 보탬이 되지 않습니다. exiftool로 확인할 수 있습니다. exiftool -r -if 'not $DateTimeOriginal' -filename .이 EXIF 날짜가 없는 사진을 모두 출력합니다. 목록이 비어 있으면 마음껏 지우십시오.

대부분의 라이브러리에서는 목록이 비어 있지 않습니다. 안전한 순서는 이렇습니다. 사이드카 데이터를 사진에 합치고, 몇 장을 확인한 다음, .json 파일을 지웁니다. Immich, PhotoPrism 같은 일부 자가 호스팅 도구는 가져오기 중에 테이크아웃 사이드카를 직접 읽으므로, 그쪽이 목적지라면 가져오기가 끝날 때까지 남겨 두십시오.

데이터를 사진에 다시 넣기

exiftool로 할 수 있습니다. 사이드카를 읽어 EXIF 태그를 씁니다. 명령과 함정은 exiftool 안내에 있습니다. GooglePhotosTakeoutHelper 같은 무료 스크립트도 같은 원리를 감싼 것입니다.

Takeout JSON Metadata Fixer는 이 일을 윈도우, 맥, 리눅스용 데스크톱 앱으로 합니다.

앱은 각 사이드카를 읽어 photoTakenTime을 사진 EXIF에 쓰고, 파일 날짜를 같은 값으로 맞추고, 좌표가 0이 아닌 실제 값일 때 GPS를 씁니다. 두 가지 사이드카 이름 방식, 잘린 이름, (1) 번호를 모두 알고 있어서 파일 이름 패턴이 놓칠 파일을 건너뛰지 않습니다. 원하면 사진 이름을 바꾸고 폴더로 정리하며, Immich나 PhotoPrism용으로 새 .json 사이드카를 결과 옆에 써 줄 수도 있습니다. 모든 것이 내 컴퓨터에서 실행됩니다. 처음 1000장은 무료입니다.

자주 묻는 질문

사진 한 장에 JSON도 하나인가요?

보통 그렇습니다. 여러 앨범에 들어 있는 사진은 각 앨범 폴더마다 사이드카 사본이 있습니다. 사이드카가 아예 없는 사진도 몇 장 있는데, 대개 라이브 포토의 동영상 부분이나 아주 오래전에 올린 파일입니다. 그런 파일은 파일 안에 있는 날짜를 그대로 유지합니다.

구글 포토가 이 파일을 다시 읽을 수 있나요?

아니요. 폴더를 구글 포토에 다시 올리면 사이드카는 무시하고 파일 안의 EXIF만 씁니다. 구글 계정 두 개 사이에서 사진을 옮기는 사람들이 날짜를 잃는 이유가 이것입니다.

timestamp는 한국 시간인가요?

아니요. UTC 기준 시각입니다. 도구가 EXIF에 쓸 때 컴퓨터의 시간대로 현지 시각으로 변환합니다. 컴퓨터가 사진을 주로 찍은 지역의 시간대로 설정되어 있는지 확인하십시오. 한국이라면 UTC+9입니다.

JSON 파일이 용량을 많이 차지하나요?

하나에 수백 바이트에서 몇 킬로바이트입니다. 1만 개면 대략 10MB입니다. 지우는 이유는 용량이 아니라 지저분함입니다.