Takeout JSON

구글 포토에서 Immich로 옮기기, 날짜와 사이드카와 앨범

구글 테이크아웃 내보내기를 올바른 날짜로 Immich에 넣는 방법입니다. immich-go, 그냥 올리면 날짜가 깨지는 이유, 파일을 먼저 고치는 방법을 다룹니다.

Immich를 설치하고 테이크아웃 폴더를 올렸더니 타임라인의 모든 사진이 하루에 몰려 있습니다. 아니면 immich-go를 썼는데 몇천 장이 여전히 날짜 없이 들어왔고, 로그에는 JSON 파일 수백 개가 없다고 나옵니다.

Immich는 좋은 목적지입니다. 요령은 Immich가 읽는 형태로 날짜를 넣어 주는 것입니다.

Immich가 사진 날짜를 정하는 방식

Immich는 이미지에서 EXIF DateTimeOriginal을, 동영상에서 컨테이너의 생성 날짜를 읽습니다. 둘 다 없으면 파일 수정 시각을 씁니다. .xmp 사이드카도 읽습니다. 그러나 웹 화면, 모바일 앱, CLI로 올릴 때 구글의 .json 사이드카는 읽지 않습니다. 그 파일은 지원되지 않는 파일이라 Immich가 하나마다 오류를 기록합니다.

테이크아웃 압축을 풀고 나면 파일 수정 시각은 압축을 푼 순간입니다. 그래서 EXIF 날짜가 없는 사진은 전부 그날에 놓입니다. 스크린샷, 카카오톡 사진, 스캔, 구글 포토 안에서 날짜를 고친 사진이 늘 피해자입니다. EXIF가 온전한 카메라 사진은 괜찮습니다.

경로 1: immich-go

immich-go는 바로 이 용도로 만든 무료 명령줄 도구입니다. 테이크아웃 zip을 직접 읽고, 각 사진을 사이드카와 짝지어 photoTakenTime을 날짜로 쓰고, 앨범 폴더에서 앨범을 다시 만들어 서버로 올립니다. Immich 커뮤니티가 권하는 경로이고 잘 동작합니다.

기본 실행은 이렇습니다.

immich-go upload from-google-photos --server http://your-server:2283 --api-key YOURKEY ~/Downloads/takeout-*.zip

알아 둘 점이 있습니다. 최신 버전은 2024년의 supplemental-metadata 이름과 잘린 이름을 처리합니다. 많은 파일에 "JSON missing"이 나오면 먼저 업데이트하십시오. 파일은 그대로 올리고 사이드카의 날짜는 따로 보내기 때문에, 날짜는 Immich 데이터베이스에 저장되고 사진에는 쓰이지 않습니다. 나중에 Immich에서 내보내거나 다른 도구를 같은 파일에 쓰면 파일 자체에는 여전히 날짜가 없습니다. 먼저 --dry-run으로 돌려 개수를 확인하십시오.

큰 라이브러리에서 JSON 누락이 수백 개 나오는 것은 정상입니다. 대개 라이브 포토의 동영상 부분, 편집된 사본, 사이드카가 애초에 없던 오래된 업로드입니다. immich-go는 그런 파일에 파일 날짜를 씁니다.

경로 2: 파일을 먼저 고치고, 어떤 방법으로든 올리기

다른 방법은 Immich에 닿기 전에 사이드카 데이터를 파일 안에 쓰는 것입니다. 그러면 어떤 업로드 경로든 동작하고, 언젠가 Immich를 떠나더라도 날짜가 파일과 함께 가며, 폴더를 외부 라이브러리로 지정해도 제대로 색인됩니다.

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 .

동영상은 QuickTime 태그가 필요하고, 잘린 이름과 (1) 사이드카는 별도 작업이 필요합니다. exiftool 안내에서 전부 다룹니다.

Takeout JSON Metadata Fixer는 이 일을 윈도우, 맥, 리눅스용 데스크톱 앱으로 합니다. Immich를 돌리는 컴퓨터에서도 됩니다.

테이크아웃 zip을 지정하면 모든 사진과 동영상에 실제 날짜와 GPS를 쓰고, 파일 날짜를 맞추고, 원하면 결과를 연/월 폴더로 정리합니다. Immich에는 두 가지 옵션이 중요합니다. 라이브 포토는 "동영상을 사진 옆에 유지"로 두어 Immich가 올릴 때 사진과 동영상을 짝짓게 하십시오. 그리고 나중에 immich-go를 쓸 계획이면 ".json 사이드카 쓰기"를 켜십시오. 파일마다 구글 형식의 깨끗한 사이드카를 실제 날짜와 좌표로 써 주기 때문에 immich-go가 추측할 것이 없습니다.

결과는 날짜가 들어간 평범한 사진 폴더입니다. 웹 화면, CLI, immich-go 중 무엇으로 올려도 됩니다. 외부 라이브러리로 추가해서 Immich가 제자리에서 색인하게 해도 됩니다. 처음 1000장은 무료입니다.

어느 경로든 원본 zip은 Immich 타임라인을 확인할 때까지 남겨 두십시오. 짝을 찾지 못한 파일이 많다면 사이드카가 잘린 이름인지 먼저 의심하고, supplemental-metadata.json 설명을 참고하십시오.

앨범

테이크아웃은 앨범을 사진 사본이 들어 있는 폴더에 앨범 이름이 적힌 metadata.json을 더한 형태로 표현합니다. immich-go는 이것을 Immich 앨범으로 바꿉니다. 파일을 먼저 고치는 경로를 택했다면, 앨범 폴더도 같이 올려 중복이 생기게 한 뒤 Immich가 해시로 중복을 제거하게 하거나, Photos from YYYY 폴더만 올리고 앨범을 손으로 다시 만들어야 합니다.

Immich는 올릴 때 바이트 단위로 같은 사본을 중복 제거합니다. 파일에 날짜를 쓴 뒤에도 같은 사진의 두 사본은 서로 동일하므로 중복 제거는 여전히 동작합니다.

결과 확인

올린 뒤 타임라인을 열어 오래된 연도로 내려가 보십시오. 사진을 열어 정보 패널을 보면 날짜가 구글 포토에서 보던 것과 같아야 합니다. 지도를 여십시오. 실제 GPS가 있는 사진이 나타나야 합니다. 사이드카에 0.0, 0.0이 있던 사진이 바다 한가운데에 나오면 합치는 단계에서 0을 써 버린 것이니, 해당 파일에 exiftool -gps:all=로 지워야 합니다.

일부 묶음이 여전히 틀리다면 Immich 웹 화면에서 사진을 선택해 날짜를 일괄 수정할 수 있습니다.

자주 묻는 질문

immich-go를 쓸까요, 파일을 먼저 고칠까요?

둘 다 됩니다. immich-go가 더 빠르고 앨범을 다시 만듭니다. 파일을 먼저 고치면 날짜가 사진 안에 있어서, 외부 라이브러리를 쓰거나 나중에 또 옮길 때 유리합니다. 둘 다 하는 사람도 있습니다. 파일을 고친 뒤 앨범을 위해 immich-go로 올리는 것입니다.

Immich가 시간을 몇 시간 어긋나게 보여 줍니다.

사이드카 타임스탬프는 UTC입니다. EXIF에 쓰일 때 컴퓨터 시간대의 현지 시각이 되고 시간대는 기록되지 않습니다. Immich는 그것을 그대로 표시합니다. 합치기 전에 컴퓨터 시간대를 사진에 맞추거나, 나중에 Immich에서 조정하십시오. 사진 시간이 9시간 차이 나는 이유에 설명이 있습니다.

Immich가 모든 .json에 "Unsupported file"이라고 합니다.

문제 없습니다. 무시했다는 뜻입니다. 올리기 전에 사이드카를 지우거나, 사이드카를 소비하는 immich-go를 쓰십시오.

HEIC를 변환해야 하나요?

아니요. Immich는 HEIC를 읽고 자체 미리보기를 만듭니다. 원본을 유지하십시오.