ゆっくり技術ノート!

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

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)

Arduinoの嵌ったところ

Arduinoのリセットスイッチを増やす時はRESETピンにGNDを繋げるとリセットできた

GND-----スイッチ------RESET
とすることでスイッチを押したときにリセットできる

ApppleScriptを触る(2)

AppleScriptを使ってカンマで区切られているテキストをレコードに読み込むハンドラを書いてみた

与えるテキスト

,item-A,item-B,item-C,item-A,item-B,item-C,item-A,item-B,item-C,item-A,item-B,item-C,

こんな感じで3種類の文字列をカンマで区切ります これを適当な場所にtest.txtという名前で保存します

プログラム

-- ファイルの場所を指定
set dpath to "/Users/UserName/Documents/"

set theRecode to read_log(dpath)

-----------------------------------------------
on read_log(dpath)
    --logファイルのパスを作成
    set fileName to "test.txt"
    set readFile to dpath & fileName
    
    --ファイルを文字列として読み込む
    open for access readFile without write permission
    set myContents to read readFile as «class utf8»
    close access readFile
    get myContents
    
    --カンマ区切り文字列をリストに代入
    set myList to read_cvs(myContents)
    
    set myListNo to count myList
    
    set recordNo to (myListNo / 3)
    (*
   recodeNo回リピートする
   値の代入はmyListNoを使う
   1回リピートするごとにcounterを3プラスする
   
   *)
    
    set counter to 1
    
    set theRecode to {}
    
    repeat recordNo times
        
        set a to item (counter + 0) of myList --myListのi+0個目をaに代入
        set b to item (counter + 1) of myList --myListのi+1個目をbに代入
        set c to item (counter + 2) of myList --myListのi+2個目をcに代入
        
        copy {aName:a, bName:b, cName:c} to the end of theRecode
        
        set counter to counter + 3
    end repeat
    
    return theRecode
    
end read_log



--カンマ区切りテキストをリストで返す
-----------------------------------------------

on read_cvs(source_text)
    set comma_p to findText(source_text, ",") as list --カンマの場所を探索
    --カンマの個数を取得
    set commas_no to count comma_p
    --cvsコンテンツを格納するリストを作成
    set cvs to {}
    --カンマの個数回ループ
    repeat with i from 1 to (commas_no - 1)
        set s to (item i of comma_p) --i個目のcomma_p要素を代入
        set e to (item (i + 1) of comma_p) --i+1個目のcomma_p要素を代入
        
        set cvs_i to text s thru e of source_text --i個目のcvsコンテンツを切り出す
        set cvs_i to text 2 thru -2 of cvs_i --カンマを削除
        
        copy cvs_i to the end of cvs --cvsリストの末尾にcsv_iを追加
    end repeat
    
    return cvs
end read_cvs






--function by 鳶嶋工房

--文字列検索
on findText(theText, serchStr)
    set tmp to AppleScript's text item delimiters
    set AppleScript's text item delimiters to serchStr
    set theText to every text item of theText
    set theList to {}
    set x to 0
    set delNum to number of serchStr
    repeat with curItem in theText
        set x to x + (number of curItem)
        set end of theList to x + 1
        set x to x + delNum
    end repeat
    set AppleScript's text item delimiters to tmp
    if (number of theList) = 1 then return {}
    return items 1 thru -2 of theList
end findText

結果

{{aName:"item-A", bName:"item-B", cName:"item-C"}, {aName:"item-A", bName:"item-B", cName:"item-C"}, {aName:"item-A", bName:"item-B", cName:"item-C"}, {aName:"item-A", bName:"item-B", cName:"item-C"}}

ちなみにこれらを取り出す時は

log aName of item 4 of theRecode

とすれば4番目のaNameが取り出せる

雑感

  • だいぶAppleScriptになれてきた
  • 途中から変数の付け方かえたのでとても汚くなった
  • でも、レコードを使えばリストで無理矢理やりくりするより遥かに分かりやすいと思う

    参考にしたページ

  • 鳶嶋工房 / AppleScript / Tips / 文字列の検索・置換
    • findTextハンドラをお借りました。ありがとうございます。

ApppleScriptを触る(1)

AppleScriptを初めて触って、幾つか使った基本型をメモする.

変数宣言

text(文字列)

set a to "Hello Word!" as text
  • 変数aにHello Word!を代入できる
  • as testは省略できる

number(数字)

set a to 1234 as number
  • 変数aに数値1234を代入できる
  • as numberは省略できる

list(配列)

set a to {123,456,789} as list
  • 配列変数aに数値1234,456,789を代入できる
  • as listは省略できる
  • 文字列もset a to {"Hello","World","!"}とすることでできる

表示する

イベントログに表示する

set a to "Hello Word!" 
log a
  • 結果(*Hello Word!*)
set a to {123,456,789} as list
log a
  • 結果(*123, 456, 789*)
  • カンマ区切りで表示された
set a to {"Hello","World","!"}
log a
  • 結果(*Hello, World, !*)
  • 文字列もいける

    結合

set a to {"Hello", "World", "!"}
set b to {"こんにちは", "せかい", "!"}
log a &  b
  • 結果(*Hello, World, !, こんにちは, せかい, !*)
  • &で変数、文字列を繋げることができる

ダイアログを表示する

set a to "Hello World !"
set b to "こんにちは、せかい!"
display dialog a & b
  • 結果

    f:id:Coro:20140209092423p:plain

  • 表示できた

set a to {"Hello", "World", "!"}
set b to {"こんにちは", "せかい", "!"}
display dialog a & return & b
  • 結果

    f:id:Coro:20140209092432p:plain

  • 文字列のリストを表示することはできなかった

  • display dialog命令がlist型をstring型に変換できないために起こるらしい
set a to {"Hello", "World", "!"}
set b to {"こんにちは", "せかい", "!"}
display dialog a & return & b as text
  • 結果

    f:id:Coro:20140209092739p:plain

  • as textをつけることで表示することができた

雑感

今回はAppleScriptの基本事項を試してみた
簡単にダイアログを出せて感動した
この簡単さはApple Scriptならではなのでは...
Apple Scriptは他のMacアプリケーションと連携できるらしいのでそれも試してみたい

参考にしたページ

  1. life log: AppleScript 最速基本文法マスター
    • 基本事項がまとまっていてよかったです
  2. 鳶嶋工房 / AppleScript / Tips / 暗黙の型変換
    • AppleScript特有の型変換について納得することができます

ありがとうございます

Vagrant導入メモ

準備

VagrantVirtualBox サイトからダウンロードしてインストール

VagantをインストールするとVagrantフォルダが出来るのでそこに今回のBox用のフォルダlocaldevを作る。

vagrant boxをつくる

BoxファイルをVagrantbox.esから落としてくる。
今回はcentosでやったので

$ vagrant box add centos64box http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130731.box

とした。
centos64boxがBoxの名前。

initする

$ vagrant init centos64box

Vagrantfileを編集

$ vi Vagrantfile
config.vm.network :private_network, ip: “192.168.33.10”をアンコメント

起動

$ vagrant upで起動

sshログイン

$ vagrant ssh

お手本にしました。
ローカル開発環境の構築 (全13回) - プログラミングならドットインストール
ありがとうございます!