写真からメタデータ(exif)をexiftoolで消す。

目次

  • 1.インストール
  • 2.exift削除
  • 3.GitHub Workflowsでexift削除

1. インストール

brewでインストールできる。windowsは知らない。

% brew install exiftool

exiftool ファイル名.pngでexifを確認できる

% exiftool ファイル名.png

ExifTool Version Number         : 12.76
File Name                       : essentialism.png
Directory                       : .
File Size                       : 7.4 MB

...省略...

2. exift削除

exiftool -all= ファイル名でexifを削除でき、勝手にファイル名末尾に_originalを付けた加工前ファイルをバックアップしてくれる。バックアップが不要な場合は-overwrite_originalオプションをつければバックアップを取らずに上書きしてくれる。

% man exiftool

       exiftool -all= dst.jpg
            Delete all meta information from an image.  Note: You should NOT do this to RAW images (except
            DNG) since proprietary RAW image formats often contain information in the makernotes that is
            necessary for converting the image.

...省略...

       Processing control
         -a          (-duplicates)        Allow duplicate tags to be extracted
         -overwrite_original              Overwrite original by renaming tmp file

バックアップ無しでexif削除

% exiftool -all= -overwrite_original ファイル名.png

ついでに、ディレクトリ指定で全配下画像のexifを削除できる。

% exiftool -all= -overwrite_original ディレクトリ名

1階層までしかスキャンしてくれないため、再帰的にやらせるなら-rを指定する。

% exiftool -all= -overwrite_original -r ディレクトリ名

3.GitHub Workflowsでexift削除

pushされたら画像のexifを削除する pushするとs3へアップロードされcloud frontへ登録するActionsが動いているため、exif削除Actionsをpushで起動させこのActionsがs3へアップロードするActionsを呼び出すように修正する。

3.1 exif削除 Actions

main branchへのpushをトリガーとしてexifを削除し、再度pushするworkflowを作成。push起動でpushすると無限ループする?気がしたが、個人アクセストークンを使用しない限り後続のworkflowが動作しないようになってるらしい。

sshの鍵や払い出したトークンを渡す必要は無く、ビルトイントークンを使用してpushできるらしい。ただしこのレポジトリで動作させるWorkFlowに変更権限を付与するのと、Actions自体にもWrite権限を付与する必要がある。

レポジトリ側の設定はSettingsActionsGeneralWorkflow permissionsRead and write permissionsを選択すれば良い。Actionsはcontents: writeを記載する。

workflow permissions

完成したexifを削除するActions。

name: delete-image-metadata
# main branchへのpushをトリガーとしてアップロード
# https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#onpushbranchestagsbranches-ignoretags-ignore
on:
   push:
      branches:
         - main
jobs:
   delete-image-metadata:
    runs-on: ubuntu-latest

    permissions:
      # action checkoutのためcontentsのread権限を付与
      # repositoryへpushするためcontentsのwrite権限を付与
      contents: write  # This is required for actions/checkout and push    

    # workflowのタイムアウトは決め打ちで10分
    # https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idtimeout-minutes
    timeout-minutes: 10

    steps:
      # レポジトリ チェックアウト
      - name: Check out the repository
        uses: actions/checkout@v4   
      
      # exiftoolをインストール
      - name: install exiftool
        run: |
         sudo apt install exiftool         

      # exifを削除
      - name: delete exif
        run: |
         exiftool -all= -overwrite_original -r content/posts         

      # 変更をpush
      - name: push repo
        run: |
         git config user.name "github-actions[bot]"
         git config user.email "github-actions[bot]@users.noreply.github.com"
         git add .
         git commit -m "delete exif"
         git push         

3.2 s3 Upload Actions起動条件変更

s3 へアップロードするActionsの起動条件を前段Actionsdelete-image-metadataが完了した後動作し、かつ、前段Actionsが成功した場合のみJobを起動させるように修正する。

name: build-site-and-upload-s3
# exif削除workflow終了をトリガーに起動させる
# https://docs.github.com/ja/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#workflow_run
on:
  workflow_run:
    workflows: [delete-image-metadata]
    types: 
      - completed

jobs:
   build-site-and-upload-s3:
    runs-on: ubuntu-latest
    # 前段のexifを削除するActionsが成功したときのみs3へアップロードする
    # https://docs.github.com/ja/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#running-a-workflow-based-on-the-conclusion-of-another-workflow
    if: ${{ github.event.workflow_run.conclusion == 'success' }}

4. つまずいたとこ

Actionsからpushの権限が無い

pushが失敗して403が返ってきてしまった。

remote: Write access to repository not granted.
fatal: unable to access 'https://github.com/UserName/Repoasitory/': The requested URL returned error: 403
Error: Process completed with exit code 128.

SettingsActionsGeneralWorkflow permissionsRead and write permissionsを選べば書き込み権限もゲットできてpushできるようになる。もちらんActions側にもwrite権限を渡しておく必要がある。

前段のActionsが失敗しても後段のActionsが動作する

前段Actionsが失敗したら後段Actionsを起動させないことを目的に後段の起動条件をcompletedにしていた。前段Actionsが失敗してもcompletedになるらしくフツーに後段Actionsが動作してしまった。

on:
  workflow_run:
    workflows: [delete-image-metadata]
    types: 
      - completed

よく読んだらちゃんと書いてあった。もちろん対策も書いてあって、前段Actionsがsuccessであれば起動するようにJob起動条件に記載すればいいらしい。

ワークフロー実行は、前のワークフローの結果に関係なくトリガーされます。