TVRockの録画状況をTwitter経由で呟かせる

先週のハートキャッチプリキュアの録画をミスするという痛恨の事態があった.ログを見てみると前日の土曜日のケロロ軍曹から録画を失敗していた模様で,その時に対処してれば間に合った.

ということで,録画状況を呟かせてトラブルの拡大を最小限に阻止しようということで少し作業.

no title

TvRock Ver 0.9u以降でのツイート - Feelings deep inside

辺りを参考に,車輪の再発明.やってみると意外とはまりどころが多くて(お前が間抜けなだけとも言う),やっと安定した.

方向としては,tvrock->ruby->TweetConsoleという連携.下のスクリプトrubyは1.9.1以降が必要なはず.

嵌まりどころを嵌まった順番に箇条書きにすると,

  • logの更新が間に合ってないことがあるので,少しwaitを入れる.
  • logから情報を読む際に,録画時間と番組名で二重に検証する.最初はtvrock.log2を使っていたので,きちんと検証しないとミスがかなり多かった.tvrock.logを使えばここまでの検証は不要かも知れない.
  • 横着せずにtvrock.logを使う
    • tvrock.log2は新しいものほど上にかいてあるので,スクリプトを作るのがらくちんではあるのだが,tvrock.log2は更新がtvrock.logよりもなぜか遅いことがあって嵌まる.番組開始とか番組終了とかが入ってる一番上の行を取得しようという戦術だと,waitを10秒入れても更新されてなくて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波括弧問題というやつ?