TVRockの録画状況をTwitter経由で呟かせる
先週のハートキャッチプリキュアの録画をミスするという痛恨の事態があった.ログを見てみると前日の土曜日のケロロ軍曹から録画を失敗していた模様で,その時に対処してれば間に合った.
ということで,録画状況を呟かせてトラブルの拡大を最小限に阻止しようということで少し作業.
TwitterのBasic認証廃止後もTvRockからツイートする方法 | aquapple
TvRock Ver 0.9u以降でのツイート - Feelings deep inside
辺りを参考に,車輪の再発明.やってみると意外とはまりどころが多くて(お前が間抜けなだけとも言う),やっと安定した.
方向としては,tvrock->ruby->TweetConsoleという連携.下のスクリプトはrubyは1.9.1以降が必要なはず.
嵌まりどころを嵌まった順番に箇条書きにすると,
- logの更新が間に合ってないことがあるので,少しwaitを入れる.
- logから情報を読む際に,録画時間と番組名で二重に検証する.最初はtvrock.log2を使っていたので,きちんと検証しないとミスがかなり多かった.tvrock.logを使えばここまでの検証は不要かも知れない.
- 横着せずにtvrock.logを使う
- 引数の受け取りと引き渡しにはエスケープを忘れずに.「"」で囲んどく程度で十分なのに,やらなかった自分は間抜けすぎ.
たぶん,tvrock.logを使うことが一番重要.
とりあえず,出来上がりを置いておく.下のスクリプトをtweet_tvrock_log.rbとでもいう名前で(UTF-8で)保存して,
CS:ruby tweet_tvrock_log.rb "%8" CE:ruby tweet_tvrock_log.rb "%8"
とでも,tvrockのコマンド画面に打ち込めばOK.
#! /usr/bin/ruby # -*- coding: utf-8 -*- require 'date' log_file = "tvrock.logへのpath" #tvrock.log2ではない twitcnsl_path = "TweetConsoleへのpath" out_enc = "Windows-31J" sleep(3) now = DateTime.now keyword = ARGV.shift.encode("UTF-8") output = "" File.open(log_file, "r:#{out_enc}:UTF-8") do |file| file.each do |line| line =~ /\[(.+)\]\:(.+)$/ log = $2 header = $1.split(/\s+/) time = DateTime.parse(header[0]+" "+header[1]+"JST") if (log =~ /番組「(.+)」 録画開始/ && (now-time).to_f < 10.0/60/24) if ($1 == keyword) output = log end elsif (log =~ /番組「(.+)」 録画終了/ && (now-time).to_f < 10.0/60/24) if ($1 == keyword) log =~ /Error=(\d+)/ if ($1.to_i > 0) output = "エラー発生\n#{log}" else output = log end end end end end if (output.length == 0) output = "ログ記載なし "+keyword end output = output.split(//)[0,140].join("") system "#{twtcnsl_path} /t \"#{output}\"".encode(out_enc)
追記(2011-02-04)
なぜか,はまったので調べてみたら,a==bなのに,a=~/b/がマッチしないという謎の現象が発生したのでコードを修正.番組名とのマッチを正規表現でやるのではなく,最終的に==でやるように修正.
ちなみに,失敗した番組名は"ソウルイーターリピートショー「聖剣伝説3〜死武専番長物語?〜」".encode変換関係で変な挙動はなさそう.ソウルイーターでは普通にマッチがかかるので,後半部分が怪しいんだけど,なんで?
追記(2012-05-19)
これが、俗にいうSJIS波括弧問題というやつ?