Takeout JSON

Google フォトから Immich へ移行して撮影日を正しく表示するには?immich-go と事前修正の 2 ルート

Google Takeout のエクスポートを正しい日付で Immich に取り込む方法です。普通にアップロードすると日付が壊れる理由、immich-go の使い方と注意点、先にファイルを直しておく方法、アルバムと確認の手順を説明します。自宅サーバー派の方向け。

Immich を立ち上げ、Takeout のフォルダーをアップロードしたら、タイムラインの全部が 1 日に集まってしまった。あるいは immich-go を使ったのに数千枚が日付なしで入り、ログには JSON が数百個見つからないと出ている。

Immich は良い行き先です。コツは、日付を Immich が読める形にしてから渡すことです。

Immich は写真の日付をどう決めるか

Immich は画像からは EXIF の DateTimeOriginal を、動画からはコンテナの作成日時を読みます。どちらもなければファイルの更新日時を使います。.xmp サイドカーも読みます。しかし、ウェブ画面、モバイルアプリ、CLI のどれからアップロードしても、Google の .json サイドカーは読みません。単に未対応のファイルで、1 つごとにエラーがログに残ります。

Takeout を解凍した直後のファイル更新日時は、解凍した瞬間です。ですから EXIF の日付がない写真は、すべてその日に置かれます。スクリーンショット、チャットの画像、スキャン、Google フォト内で日付を直したものが、いつもの被害者です。EXIF が無事なカメラ写真は問題ありません。

ルート 1: immich-go

immich-go は、まさにこのために作られた無料のコマンドラインツールです。Takeout の 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 不足が数百件出るのは普通です。たいてい Live Photos の動画部分、編集済みコピー、サイドカーが最初からない古いアップロードです。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 は、これを Windows、Mac、Linux のデスクトップアプリとして行います。Immich を動かしているマシンでも使えます。

Takeout の zip を指定します。すべての写真と動画に本当の日付と GPS を書き込み、ファイル日時を合わせ、必要なら出力を年/月フォルダーに整理します。Immich 向けに大事な設定が 2 つあります。Live Photos は「動画を写真の横に残す」のままにしておくと、Immich がアップロード時に静止画と動画を組にします。そして、あとで immich-go を使うつもりなら「.json サイドカーを書き出す」を有効にしてください。Google の形式で、本当の日付と座標が入ったきれいなサイドカーをファイルごとに書くので、immich-go が推測する余地がなくなります。

結果は、日付の入った普通の写真フォルダーです。ウェブ画面、CLI、immich-go のどれでアップロードしても構いません。外部ライブラリとして追加して、Immich にその場で索引させることもできます。最初の 1000 枚は無料です。

アルバム

Takeout はアルバムを、写真のコピーとアルバム名入りの metadata.json を含むフォルダーとして表現します。immich-go はそれを Immich のアルバムにします。ファイルを直すルートの場合、アルバムフォルダーもアップロードすれば重複ができて Immich がハッシュで重複排除するか、Photos from YYYY のフォルダーだけをアップロードしてアルバムを手で作り直すかのどちらかです。

Immich はアップロード時にバイト単位で同一のコピーを重複排除します。日付をファイルに書き込んでも、同じ写真の 2 つのコピーは互いに同一のままなので、重複排除は効きます。

結果の確認

アップロード後、タイムラインを古い年までスクロールします。写真を開いて情報パネルを見てください。日付が Google フォトで表示されていたものと一致するはずです。地図を開きます。本物の GPS を持つ写真は表示されるはずです。サイドカーが 0.0, 0.0 だった写真が海の上に出ていたら、書き込みの段階でゼロを書いてしまっています。該当ファイルに exiftool -gps:all= で取り除いてください。

まとまった数がまだ間違っているなら、Immich のウェブ画面で写真を選択して一括で日付を編集できます。

よくある質問

immich-go と事前修正のどちらを使うべきですか?

どちらも動きます。immich-go は速く、アルバムを再現します。先にファイルを直すと日付が写真の中に入るので、外部ライブラリを使う場合や、将来また移行するかもしれない場合に有利です。両方やる人もいます。ファイルを直してから、アルバムのために immich-go でアップロードするやり方です。

Immich の表示時刻が数時間ずれています

サイドカーのタイムスタンプは UTC です。EXIF に書き込むとパソコンのタイムゾーンの現地時刻になり、ゾーン情報は記録されません。Immich はそれをそのまま表示します。書き込む前にパソコンのゾーンを写真に合わせるか、あとで Immich 側で調整してください。

Immich がすべての .json に「Unsupported file」と言います

問題ありません。無視したと伝えているだけです。アップロード前にサイドカーを削除するか、サイドカーを消費する immich-go を使ってください。

HEIC を変換する必要はありますか?

いいえ。Immich は HEIC を読み、自分でプレビューを作ります。原本のままにしてください。