鯖構築運用雑記

管理してる鯖関連とか技術とかの雑記をメモしておく。

【nphantom】foltia Anime Lockerでの変換完了通知Botを共同で作ってみた

今度こそは技術系ブログみたいにやったことのメモ書くぞ…*1
やったことは、タイトルのとおりです。アニメ自動録画ソフト foltia Anime Locker で録画したアニメの変換開始と完了をツイートしてくれるBotの作成です。作り方とか気をつけたことは続きにて。

此処から先のことをやるときは自己責任でお願いします。責任は取れません。

裏話とか前提とかは前回の記事を参考にしてください(脚注参考)

今回の目標

今回は次のツイート動作を行うことを前提にして各種構成を行いました。

  1. エンコードプログラム(=ipodtranscode.pl)の実行開始
  2. タイトル+エンコード開始
  3. タイトル+エンコード終了
  4. エンコードプログラム終了

エンコード開始のツイートのところでは、エンコードするファイルが無いときは別メッセージがログでも用意されていたので、そこもツイートするように対策しました。

操作したファイル

環境によって保存場所が異なるので、ファイル名だけ。デフォルトでは、

/home/foltia/perl 

以下にあります。

  • ipodtranscode.pl (既存のものに書き足し)
  • tweet_msg.rb (新規作成・単一メッセージのツイート)
  • tweet_with_title.rb (新規作成・番組名と合わせてのツイート)

これら3種のファイルで実装しました。

ipodtranscode.pl での操作したところ

現状、書き換えた行番号がどこになるのかがわからないので、大体この辺であるということを書いておきます。
また、残念ながら共同管理者を含め、Perlをまともに扱える人間(Perlだけならまだしも、他の言語ですらまともに扱えるかどうか…あ、私だけか( ^ω^))はいないので、文法とか書き方とかは調べつつ雰囲気で読み解きましたので予めご了承を。

各種ツイートを行う場所

ツイートを行うのは、ipodtranscode.plの外にある2種類のRubyファイルです。そこで、ipodtranscode.plのツイートを行いたい場所にそれぞれコマンド実行関数systemを配置し、そこからRubyを実行させツイートします。*2
基本的にはログとして出力している直下に配置しました。実際の配置場所*3は次に示すものの真下。

 ○ プログラム実行開始

&write("ipodtranscode starting up");

 ○ エンコードするべきファイルが無いとき

&write("ipodtranscode No MPEG2 files to transcode and edit.");


また、エンコードを行う部分では、以下に示す順番で行われているはずです。*4
BonTsDemux (映像・音声分離)

ffmpeg (映像エンコード)

neroAacEnc (音声エンコード)

MP4Box (MP4ファイルの結合)

ATOM (?)

mv (移動)

以上のことから、どの部分でツイートするかは好きに選べます。今回は、BonTsDemuxの開始とffmpegの開始・終了部分にツイートを行わせるようにしました。
ちなみに、ffmpegはFAL録画時の設定によって、SDとHDの2種類のエンコードを行います。今回は両方に組み込みましたが、説明の関係上、SDのみを例示します。HDにも組み込む場合は、SDをHDに変えれば大丈夫なはずです。

 ○ エンコード開始(BonTsDemux)

&write("ipodtranscode BonTsDemux $inputmpeg2");

 ○ エンコード開始(ffmpeg)

&write("ipodtranscode ffmpeg SD $trcnmpegfile $filenamebody.264");

エンコード終了に関しては、ファイルではなく、次の文の直前に配置しました。((理由はわかりません。この辺りは共同管理者様辺りがやってくれたので(^ ^)))

 ○ エンコード終了

&updatemp4file("SD");

 ○ エンコードプログラム終了

&writelog("ipodtranscode ALL COMPLETE");

以上のポイントに、別途で作成したツイートプログラムのsystem関数を用いた実行コマンドを書き加えます。

番組タイトルの書き出し

2つ目のRubyプログラム tweet_with_title.rb で用いるタイトルを予め書き出しておきます。
書き出させるポイントは、ipodtranscode.pl内で#タイトル取得コメントアウトされている部分の中、次のコメントアウトの後です。

#Jcode::convert(\$movietitle,'utf8');# Title入れるとiTunes7.0.2がクラッシュする

この直後にperlのファイル書込かなんかで外部ファイルに放り投げてください。
ちなみに、タイトルのフォームはその少し上にある、

$movietitle = " -title \"$programtitle[0] 第$programtitle[1]話 $programtitle[2]\" ";

から、配列(?)の
0:タイトル
1:話数
2:サブタイトル
ということがわかります。書きだされたファイルの文字コードは、配列から呼び出されたものはISO-8859-1、プログラム内にある"第"と"話"はUTF-8という残念な仕様ですので、"第"と"話"をそれぞれ、ISO-8859-1に変換した"第$"と"話"に置き換えると、後々変換するときに楽になるはずです。*5

tweet_meg.rb の作成

こちらのプログラムは共同管理者様が作ってくれました。これを元にもう一つの tweet_with_title.rb を作成しました。
このプログラムは、実行時引数にツイートするメッセージを受け取り、受け取ったメッセージと現在時刻(時:分:秒 のフォーム)を合わせてつぶやくものです。
ソースコードの公開は…しません。著作者私じゃないので。

tweet_with_title.rb

これは、tweet_msg.rbを元にして、作成したものです。単純に実行の最初の段階で外部に書き出しておいたファイルを読み込んで、それと実行時引数として渡されたつぶやくメッセージ、現在時間(フォームはさっきのやつと同じ)を組み合わせたものをTwitterに投稿するものです。
ソースコードの公開はしません。

このようなものを組み合わせると、Botが出来上がるわけですが…残念ながらこれを組み上げるのに1週間かかってしまいました。時間がかかりすぎです。
そんなこんなで今回はここまで。ソースとかないとこんなにも残念な説明文になるのね…

*1:http://kayo-tozaki.hatenablog.com/entry/2015/02/19/104319を参考のこと

*2:絶対にexecなんていう地雷を使うんじゃないですよ。(裏話参考)

*3:vimの検索でも使ってやってください。

*4:個人的な見方。正しいとは保証できないです。

*5:rubyでは自動的に文字コードが変換されることが確認できました