Takeout JSON

exiftool で Google Takeout の日付を直す方法と、コマンドがうまくいかないケース

Takeout の .json から撮影日と GPS を写真にコピーする exiftool コマンドと、それが失敗する切り詰められた名前・(1) の重複・動画・タイムゾーンのケース、そして GUI に切り替えるべき目安を正直に説明します。無料で確実に直したい人向けです。

exiftool は無料で、どの OS でも動き、Google Takeout のエクスポートを直せます。たいていの解説はコマンドを 1 つ示して終わりです。そのコマンドは写真 5 枚のうち 4 枚には効きます。ここでは残りの 1 枚に何が起きるかも書きます。

インストール

Mac は brew install exiftool。Debian や Ubuntu は sudo apt install libimage-exiftool-perl。Fedora は sudo dnf install perl-Image-ExifTool。Windows は exiftool.org から zip をダウンロードして展開し、exiftool(-k).exeexiftool.exe にリネームします。それから、解凍した Takeout フォルダーがある場所でターミナル(Windows なら PowerShell やコマンドプロンプト)を開きます。

最初はコピーで作業してください。exiftool はファイルに直接書き込みます。

コマンド

各写真の横にサイドカーがあります。2024 年以降のエクスポートでは IMG_2034.JPG.supplemental-metadata.json、それより前は IMG_2034.JPG.json です。サイドカーの photoTakenTime.timestamp が本当の撮影日時で、1970 年からの秒数です。これを写真にコピーするコマンドは次のとおりです。

exiftool -r -d %s -tagsfromfile "%d/%F.supplemental-metadata.json" \
  "-DateTimeOriginal<PhotoTakenTimeTimestamp" \
  "-CreateDate<PhotoTakenTimeTimestamp" \
  "-FileModifyDate<PhotoTakenTimeTimestamp" \
  -ext jpg -ext jpeg -ext png -ext heic -ext gif \
  -overwrite_original -progress "Takeout/Google Photos"

分解すると、-r はサブフォルダーを再帰的に処理します。-d %s は読む日付がエポック秒だと exiftool に伝えます。-tagsfromfile%d(写真のフォルダー)と %F(拡張子付きのファイル名)でサイドカーの名前を組み立てます。< の付いた 3 行が、タイムスタンプを EXIF の撮影日時、EXIF の作成日時、ファイルの更新日時にコピーします。-overwrite_original を付けないと、全ファイルの _original コピーが残ります。

古いエクスポートには "%d/%F.json" でもう一度実行します。1 回目で日付が入ったファイルは同じ値で上書きされるだけです。

GPS も同時に入れたいなら、次の 4 行を足します。

  "-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
  "-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \

Google は位置情報のない写真に 0.0 を書くので、-if '$GeoDataLatitude ne 0' で囲まないと、数百枚の写真が大西洋上に置かれます。詳しくは Takeout の位置情報を復元する にあります。

終わると、exiftool は更新したファイル数と飛ばしたファイル数を表示します。飛ばされた分に、その夜の残り時間が消えます。

うまくいかないところ

切り詰められたサイドカー名。Google は長いサイドカー名を 46 文字あたりで切ります。PXL_20230812_193044123.RAW-01.COVER.jpg のサイドカーは PXL_20230812_193044123.RAW-01.COVER.supplemen.json か、それより短くなります。%F のパターンは一致しません。長いカメラ名、LINE や WhatsApp の名前、説明入りのファイル名はここに引っかかります。残りを一覧にして、手かスクリプトで照合するしかありません。

(1) 付きの重複。同じ名前を 2 回アップロードすると、写真は IMG_1234(1).jpg なのにサイドカーは IMG_1234.jpg(1).json です。括弧の位置が動いています。メインのコマンドの前に、サイドカーをリネームするパスを通します(bash の例)。

for j in "Takeout/Google Photos"/*/*"("*").json"; do
  mv "$j" "$(echo "$j" | sed -E 's/\.([a-zA-Z0-9]+)\(([0-9]+)\)(\.supplemental-metadata)?\.json$/(\2).\1\3.json/')"
done

編集済みコピー。IMG_1234-edited.jpg には専用のサイドカーがなく、元の写真と共有です。元の写真を済ませてから、そこからコピーします。

for f in "Takeout/Google Photos"/*/*-edited.*; do
  exiftool -tagsfromfile "${f/-edited/}" -AllDates -GPS:all -overwrite_original "$f"
done

動画。MP4 と MOV は EXIF を使いません。QuickTime コンテナの別のタグに日付を持ち、そのタグは UTC として読まれます。

exiftool -r -d %s -api QuickTimeUTC -tagsfromfile "%d/%F.supplemental-metadata.json" \
  "-CreateDate<PhotoTakenTimeTimestamp" "-ModifyDate<PhotoTakenTimeTimestamp" \
  "-TrackCreateDate<PhotoTakenTimeTimestamp" "-MediaCreateDate<PhotoTakenTimeTimestamp" \
  "-FileModifyDate<PhotoTakenTimeTimestamp" \
  -ext mp4 -ext mov -overwrite_original "Takeout/Google Photos"

Live Photos の動画部分にはサイドカーがまったくないので、これを実行しても日付なしのままです。静止画側の日付を与える必要があります。

タイムゾーンの罠

サイドカーのタイムスタンプは UTC の正確な瞬間です。EXIF の DateTimeOriginal はタイムゾーンを持たない壁時計の時刻です。exiftool はその差をパソコンの現在のタイムゾーンで埋めます。東京で 11 時 5 分に撮った写真は、マシンが日本時間なら 11:05、ニューヨーク時間なら前日の 22:05 になります。

実行前に、大半の写真を撮った場所のゾーンを設定します。

TZ=Asia/Tokyo exiftool ...

他のゾーンで撮った旅行写真は、それでも数時間ずれます。サイドカーだけではどうにもなりません。現地時刻の唯一の記録は、残っていればカメラ自身の EXIF です。すでに正しい EXIF 日付を持つ写真を「直して」はいけません。-if 'not $DateTimeOriginal' を付けて、それらには触れないようにします。

一晩かける価値はあるか

カメラ写真数千枚のきれいなエクスポートなら、この記事を読む時間を含めて 1 時間で済みます。LINE の画像、スクリーンショット、(1) の重複、HEIC、動画、Live Photos が混ざった実際のライブラリなら、一晩を見込んでください。exiftool -r -if 'not $DateTimeOriginal' -filename を何度か走らせて、まだ日付のないものを確かめることになります。

さらに撮影日でファイル名を付け直し、年/月フォルダーに振り分け、HEIC を JPG にし、Live Photos の組を保ちたいなら、コマンドがあと 4 つとループが 1 つ増えます。楽しめるなら、それで問題ありません。GooglePhotosTakeoutHelper は名前の癖を処理してくれる無料スクリプトで、ターミナルは平気だが sed を自分で書きたくはない人にとって、良い中間点です。

アプリ

Takeout JSON Metadata Fixer は、この一覧すべてを 1 回の実行で、先にドライランをしてから行います。Windows、Mac、Linux で動き、画面は日本語です。

すべての写真をサイドカーに突き合わせます。切り詰められた名前、(1) の重複、-edited のコピーも含みます。photoTakenTime と GPS をファイルに書き込みます。動画には QuickTime のタグを書きます。Live Photos の動画部分は静止画の日付を引き継ぎます。サイドカーのない写真は EXIF の日付を保ち、どちらもない写真はファイル日時になるので、日付なしのものは出ません。

名前とフォルダーのテンプレートは任意で、「名前をそのまま」と「フォルダーをそのまま」なら日付だけを直します。開始前にディスクの空き容量を確認し、完全にオフラインで動きます。最初の 1000 枚は無料です。無制限は 19.99 米ドルの買い切りで、一晩の時間より安いはずです。

よくある質問

exiftool が「Warning: No writable tags set from」と言います

サイドカーはあるのに photoTakenTime がないか、名前のパターンが違うファイルに一致しています。.json を開いて確かめてください。アルバムの metadata.json でもこの警告が出ますが、無視して構いません。

解凍せずに zip のまま実行できますか?

いいえ。exiftool はディスク上のファイルが必要です。すべてのパートを 1 つのフォルダーに解凍してからにしてください。

EXIF を書き込むと画像が変わりますか?

いいえ。exiftool はメタデータ領域を書き換えるだけで、画像データには触れません。ファイルが数百バイト大きくなることはあります。

photoTakenTime と creationTime のどちらをコピーすべきですか?

photoTakenTime です。creationTime は Google にアップロードした日時で、何年も後のことがよくあります。