たこたこ研究所R

文章力鍛える

Google Photo一括ダウンロードとJSONから日時情報の復活(Google Photos Takeout Helper利用)

Google Photoから一括ダウンロードした画像は、メタデータ(日時)がDL時点にリセットされてしまう。
Google Photos Takeout Helperを利用して元に戻す事ができたので、その際に調べた情報をまとめる。
Windows環境前提で記載するが、他の場合も特に手順は変わらないと思う。

Contents

背景

現在私はスマホで撮影した写真をGoogle Photoにアップして一元管理している。 Pixelがシームレスに同期してくれて、検索もいい感じなので満足してるのだが、以下の理由から一旦まとめて写真ファイルを落としておこうかと思った

  • GooglePhoto無料版は容量が15GBしかなく、不安になってきた
  • プラットフォームに依存しすぎると、課金ルールが変わったりした際に移行が辛くなるので、できればローカルのNASとかで管理したい気持ちになってきた
  • 写真はデジタルより物理的にプリントしておいたほうが長く残るよなぁと思ったので、まずは棚卸ししたい

1. Google Photoから一括ダウンロード(TakeOut)

Google TakeOutGoogle Photoを対象に指定してExportする。

  1. Google TakeOutを開く
    Google Photoの設定画面からたどるといい
  2. ガイドの通り、対象を選択していけばOK。 ファイルサイズは分割されるZipのサイズになるので、ダウンロードし易い単位で選択。
  3. ダウンロードリンクが準備されると、メールが届く。
    • サイズにもよると思うが、自分の場合は合計30GBのファイルが半日くらいで準備された
  4. リンクを開いて一つずつポチポチDLする

2. ダウンロードしたZipファイルの中身

Google Takeoutでダウンロードした画像をそのまま保管できればHappyなのだが、以下の状態で出てくるので少し困る

  • 画像ファイルの更新日時がDLした当時になっており、撮影日時になっていない
    • 日時などのメタデータは、画像ファイルごとに作られた同名のjsonファイルに記載。このファイルも膨大にあって邪魔
  • 分割された各Zipファイル内に、年単位のフォルダ、画像がバラバラに出力される

そのため、jsonから情報を読み込んで、画像ファイルのメタデータにマージするような処理が必要になる。
Zipファイルの中身はこんな感じ

takeout-20230102T210059Z-001.zip   //1個めのZip
└─Takeout
    └─Google フォト
        ├─Photos from 2009
        │      IMG_1111.JPG
        │      IMG_1111.JPG.json
        │      …
        ├─Photos from 2015
        │      IMG_2222.JPG
        │      IMG_2222.JPG.json
        │      …

takeout-20230102T210059Z-002.zip    //2個めのZip
└─Takeout
    └─Google フォト
        ├─Photos from 2009    //別のZipの同じ年次フォルダが分かれて入ってたりする
        │      IMG_1112.JPG
        │      IMG_1112.JPG.json
        │      …
        ├─Photos from 2016
        │      IMG_3333.JPG
        │      IMG_3333.JPG.json
        │      …

jsonの中身。Google Photoでラベル付けしてる人名の項目とかもあったりする。

{
  "title": "PXL_20211031_040230080.jpg",
  "description": "",
  "imageViews": "16",
  "creationTime": {
    "timestamp": "1635693578",
    "formatted": "2021/10/31 15:19:38 UTC"
  },
  "photoTakenTime": {
    "timestamp": "1635652950",
    "formatted": "2021/10/31 4:02:30 UTC"
  },
  "geoData": {
    "latitude": 35.6824222,
    "longitude": 139.80656109999998,
    "altitude": 36.78,
    "latitudeSpan": 0.0,
    "longitudeSpan": 0.0
  },
  "geoDataExif": {
    "latitude": 35.6824222,
    "longitude": 139.80656109999998,
    "altitude": 36.78,
    "latitudeSpan": 0.0,
    "longitudeSpan": 0.0
  },
  "people": [{
    "name": "田中 太郎"
  }],
  "url": "https://lh3.googleusercontent.com/xxxxxxx",
  "googlePhotosOrigin": {
    "mobileUpload": {
      "deviceFolder": {
        "localFolderName": ""
      },
      "deviceType": "ANDROID_PHONE"
    }
  },
  "photoLastModifiedTime": {
    "timestamp": "1670526499",
    "formatted": "2022/12/08 19:08:19 UTC"
  }
}

3. 画像ファイルにJSONから日時情報を転記

そんな感じのことができそうなツールが落ちてないかしら、とググってみたら、JSONを読み込むマクロを組んでExifToolというツールで画像のメタデータに書き込む感じのTipsがほとんどだった。

ちなみに画像ファイルのメタデータ的なやつは、EXIF(Exchangeable Image File Format)ファイルというものに格納されている。1995年に日本電子工業振興協会が開発したらしい。へえ~。 EXIFファイルについて | Adobe

ちょっと面倒くさいのでもう少し探してみると、2021年からGooglePhotos Takeout HelperというGooglePhotoから落としたファイルに特化したメタデータ更新のツールを作ってる人がいたので、ありがたく使わせてもらうことにした。

手順はReadme参照だが、ここでは自分のやった手順を書く。

Google Photos Takeout Helper のダウンロード

Releases · TheLastGimbus/GooglePhotosTakeoutHelper · GitHubからexeをダウンロードして適当な場所に置く

Zipを解凍し、1つのフォルダにまとめる

変換前のファイルを準備する
複数Zipを解凍して、バラけてる中身の年次別フォルダのファイルをひとまとめにする必要がある
PowerShellで以下コマンドで実施した。

cd C:\Zipを置いたパス
Expand-Archive -Force .\takeout-20230102T210059Z-001.zip input
# takeout-20230102T210059Z-001.zipはGoogle PhotoからExportしたZip
# inputは出力先フォルダ
# -Forceオプション付与で、出力先フォルダ内に既存ファイルがあったとしても残して出力。
#  →Zipごとにバラけてたファイルが1つのフォルダにまとまる

参考 Expand-Archive (Microsoft.PowerShell.Archive) - PowerShell | Microsoft Learn

Google Photos Takeout Helper の実行

以下のような感じで実行する。詳しい設定は--helpでオプションを確認しよう。

cd C:\Folder\Where\You\Downloaded\takeout-helper
gpth-v3.1.1-Windows.exe -i "C:\INPUT\TAKEOUT\FOLDER" -o "C:\OUTPUT\FOLDER" --divide-to-dates
# 自分の場合は--divide-to-datesを指定し、年/月フォルダで出力するようにした
# inputファイルが消えてしまうと困る人は--copyを指定する。速度は落ちるが入力ファイルは消えない

完了すると、元気な雄叫びがprintされ、

DONE! FREEEEEDOOOOM!!!

作成日と更新日がjsonから読み込んだ日時で更新された状態でファイルが出力される。嬉しいですね。

参考