AutomatorでFFmpegを呼び出して動画ファイルをGIFに変換するフォルダアクションを作った

# 概要
レビュアーが簡単に挙動を確認できるようにPull RequestにGIFを作成して添付していますが、毎回FFmpegのコマンドを実行することに耐えられなくなったので、Automatorを利用して自動化しました。  
おそらく誰しもがこの作業を面倒くさく感じていると思うので、そんな方のために作成したAutomatorフォルダアクションをお手元で再現する手順を紹介します。

# 環境
- macOS: 12.0.1
- FFmpeg: 4.4.1

# Automatorフォルダアクションの作成手順
## 作るものの簡単な説明
指定したフォルダを監視してフォルダ内にファイルが追加されたら処理を実行するフォルダアクションを作ります。  
追加するファイルはMOVファイルを想定しています。  
その他の動画形式でも動くかもしれませんが検証はしていないので、動かないときは適宜設定を自分で見直して動くように修正してください。  

フォルダアクションは指定したフォルダに追加されたファイルごとに決められた処理を実行します。  
inputフォルダがフォルダアクションが指定されているフォルダ、outputフォルダが最終的にgifと縮小されたMOVファイルが格納されるフォルダとなります。  
フォルダの名称はなんでもいいのですが、わかりやすくするためinput/outputと命名しました。  

以下が実行される処理になります。

1. MOVファイルのサイズを縮小するため、720pで書き出し、outputフォルダに同名で書き出します
2. 1で生成されたファイルをFFmpegでGIFに変換します

## 事前準備
FFmpegはmacOSにインストールされていないので、未インストールの場合はまずFFmpegをインストールしてください。  
Homebrew を利用するのが簡単だと思います。  
導入方法は「Homebrew FFmpeg インストール」などのキーワードでググるとインストール方法に関する記事が見つかると思います。  

公式サイトのリンクは以下からどうぞ。  
[Homebrew 公式](https://brew.sh/)  
[FFmpeg 公式](https://ffmpeg.org/)  

## 作成手順
1. Automatorを起動する
2. メニューから `ファイル > 新規 > フォルダアクション` を選択する
3. 右上に表示されている「フォルダを選択」プルダウンをクリックして「その他...」を選択する
4. フォルダアクションを設定するフォルダを選択する（このフォルダがinputフォルダとなり、ここに追加したファイルに対して処理が実行される）
5. 開いたウィンドウに左上に検索フィールドがあるので、そこをクリックして「メディアをエンコード」と入力。検索結果として表示されている「メディアをエンコード」を右のカラムにドラッグ＆ドロップする
6. 設定プルダウンをクリックして「H.264 720p」を選択する（作成されたGIFの解像度が低いと感じる場合は、ここの数値を変えてみると改善されます。ただし、その分GIFのファイルサイズが大きくなります）
7. 再度検索フィールドをクリックして「AppleScriptを実行」と入力。検索結果として表示されている「AppleScriptを実行」を右のカラムの「メディアをエンコード」の下にドラッグ＆ドロップする
8. 「AppleScriptを実行」のテキストエリアに以下のコードをペーストする（エラーになる場合はインデントをすべてタブに変換してください）
    ```applescript
	on removeExtension(thisName)
		if thisName contains "." then
			set thisName to (the reverse of every character of thisName) as string
			set x to the offset of "." in thisName
			set thisName to (text (x + 1) thru -1 of thisName)
			set thisName to (the reverse of every character of thisName) as string
		end if
		return thisName
	end removeExtension

	on run {input, parameters}
		-- ffmpegのフルパス
		set ffmpegPath to "/opt/homebrew/bin/ffmpeg"
		-- ffmpegのoption
		set options to " -vf scale=320:-1 -r 24 "
		
		repeat with targetFile in input
			tell application "System Events"
				set inputFilename to name of (get properties of targetFile)
			end tell
			set inputFilePath to quoted form of (POSIX path of targetFile)
			set outputFilePath to quoted form of (my removeExtension(POSIX path of targetFile) & ".gif")
			do shell script ffmpegPath & " -i " & inputFilePath & options & outputFilePath
		end repeat
		return input
	end run

    ```
9. メニューから `ファイル > 保存...` を選択して、適当な名前をつけて保存する

作成したフォルダアクションは以下のスクショの通りになっているはず。
<img width="778" alt="スクリーンショット 2022-02-27 16 42 52" src="https://user-images.githubusercontent.com/5406126/155874574-44640796-0f82-47ca-95e9-8ee05d19d697.png">
---
### 2022/04/17 追加
AppleScriptがわからないという声もあったので、Shell Script版に書き換えたものを記載します。
[作成手順](#作成手順) の7と8を以下の1と2に置き換えてください。

1. 再度検索フィールドをクリックして「シェルスクリプトを実行」と入力。検索結果として表示されている「シェルスクリプトを実行」を右のカラムの「メディアをエンコード」の下にドラッグ＆ドロップする
1. 「シェルスクリプトを実行」の右上にある「入力の引き渡し方法」を「引数として」に変更して、テキストエリアに以下のコードをペーストする
    ```shell
    FFMPEG=/opt/homebrew/bin/ffmpeg
    
    for FILE_PATH in "$@"
    do
      OUTPUT_PATH=`echo ${FILE_PATH:a:r}`
      $FFMPEG -i $FILE_PATH -vf scale=320:-1 -r 24 ${OUTPUT_PATH}.gif
    done
    ```

作成したフォルダアクションは以下のようになっているはず

<img width="782" alt="スクリーンショット 2022-04-19 23 50 40" src="https://user-images.githubusercontent.com/5406126/164032261-ba5690bc-6125-46ab-86f3-72270a248f03.png">


---

## 動作確認
以下のGIFのようにMOVファイルをinputフォルダに追加したあと、outputにGIFとMOVが作成されたら成功です。
![画面収録 2022-02-27 16 27 49](https://user-images.githubusercontent.com/5406126/155874668-98cef5ea-4e2f-47a7-8925-bf7b77192730.gif)


## 改善したいところ
- 縮小したMOVファイルファイルは削除してもよさそう
    - 雑に消したらGIF作成処理中に削除されてGIFが作成されなかったので、delayするとかしないといけなそう

# まとめ
このフォルダアクションを使ってたくさんGIFを作ってください！