ゆっくり技術ノート!

いつかきっとできるだろうよ

AppleScriptでiTunesのビデオにアートワークを付ける時に嵌った箇所

追記(2016.05.23)

iTunes 12.4からdescription of artwork 1 of the_trackがmissing valueを返すようになったようです なので

set artwork_description to description of artwork 1 of the_track
if artwork_description is missing value then
   ...
end if

となります missing valueはnillのようなものです

追記終わり

既に設定しているファイルをスキップする

既にアートワークを設定したファイルをスキップしたい時に音楽ファイルの場合は
if exists data of artwork1 of theTrack is false
if data of artwork1 of theTrack is not ""とすれば設定されていないことが分かる
だたビデオファイルの場合はビデオの中から自動的にサムネイルを作成してアートワークに設定してくれている様だった(違うかもしれない)

artworkの設定個数 scriptで出力されるファイル
0 artwork サムネイル
1 artwork artwork1
2 artwork artwork1 / artwork2

アートワークの説明を使う

そこでスクリプトでアートワークを設定する際にアートワークに説明(text)に任意のキーワードを設定して次にスクリプトを実行した時、説明にキーワードが設定されていたらスキップするようにした

set theDescription to description of artwork 1 of theTrack

if theDescription is "" then
    --アートワークの説明が設定されていない
end if

こうすることで1度このスクリプトで設定されたファイルはスキップできる

参考ページ

  1. itunes - Applescript editor not responding - Stack Overflow
    • exitsの使い方

ffmpegでmkvをmp4にした

動画を以下の様に映像は無変換でmkv(FLAC/AVC)からmp4(AAC/AVC)にしたい

今回はffmpegを使うことにする

ffmpeg

FFmpeg(エフエフエムペグ)は動画と音声を変換することのできるUNIX系OS生まれのフリーソフトウェアであり、libavcodec(動画/音声のコーデックライブラリ)、libavformat(動画/音声のコンテナライブラリ)、libswscale(色空間・サイズ変換ライブラリ)、libavfilter(動画のフィルタリングライブラリ)などを含む。ライセンスはコンパイル時のオプションによりLGPLGPLに決定される。コマンドラインから使用することができる。対応コーデックが多く、多彩なオプションを使用可能なため、幅広く利用されている。
via FFmpeg - Wikipedia

やってみる

ffmpegで普通に変換したらMPEG Audioになって音が曇った感じになってしまった
いろいろ調べて今のところ最適なオプションにたどり着いた

DIRPATH=$1

for FILE in ${DIRPATH}*.mkv
do

    ffmpeg -i "${FILE}"  -vcodec copy -acodec aac -strict experimental -ab 128k -aprofile aac_low -ac 2 -ar 44100 "${FILE%.mkv}.mp4"

done

変換するファイルが複数だったので初めてシェルスクリプト使った

変換するファイルのあるディレクトリで実行するとmkvのファイルだけをmp4に変換してくれる

雑感

  • 映像のエンコードはしないので20GBほどがファイルコピーと同じくらいの速さで仕上がった
  • 音質もほとんど聞き分けられないほどになった
  • これからシェルスクリプトも積極的に使っていきたい

参考ページ

  1. シェルスクリプトで指定したディレクトリ内のファイルを取得する - Webエンジニア(予定)のメモ帳
  2. H264 - 動画処理の定番ツール「FFmpeg」ことはじめ - Qiita
  3. 最近のFFmpegで動画の音声にMP3やAACを指定する方法 | TeraDas-テラダス
    • audioオプションについて

AppleScriptでtell 内で他の関数を呼ぶ

on run
    tell application
        hello()
    end tell
end run

on hello()
    log "Hello World"
end hello

このままだと Can’t get hello of application. と言われてしまうので

tell application
    hello() of me
end tell

とすることでtell内で他のハンドラを呼ぶことができた

参考ヘージ

  1. AppleScriptを使ってみるよ!(言語編1/2)