2012/07/22

録画後のredmineチケット処理

地デジ番組情報をチケット登録
チケットの録画予約
予約チケットの録画
「録画チケット処理」

めでたく録画された後のチケット処理についても、ActiveRecordで書いてみた。

録画されたはいいが、どうやって視聴しよう??っていうのが今悩み中だけど、その前に取り敢えず無事に録画されたよっていうチケットことにしておこうと思って、このフェースを踏んでいる。

こんなことを考えて制作している。
  1. 予約した番組の放送時間を過ぎたら、’予約’を’録画’にトラッカーを変更
  2. 無事エンコードファイルが完成したら、チケットの添付ファイルとして登録する
  3. 問題なければ、チケットステータスを、’完了’にする
こんな感じにして、Redmineから録画トラッカーチケット一覧すれば見やすいかなと。

最後にスクリプト全体を記載するとして、部分的な説明を書いておく。

放送時間が過ぎたチケットの検索
Issue.find( :all, :conditions => ["tracker_id=2 and start_date<=?", Date.today]).each {|issue|
  if on_air_time(issue) < Time.now

最近検索でちょっと悩む。:conditions => ["条件式"] か、:conditions => {ハッシュ}かで。どっちでもいいみたいだけど、ハッシュの方で条件式が書ければすっきりするんだけどなと・・

on_air_time関数
チケットから放送開始時間をTimeで返す関数
カスタムバリューからチケットカスタムフィールド’開始時間’を取得して開始日に加算。
2行程度の簡単関数だけど、もっとすっきりかけないかなぁ。

録画ファイルのアタッチ
Redmineでは、1添付ファイルごとにAttachmentsというレコードで記録されている。
アタッチレコードに追加してチケットと関連付けると、チケットの添付ファイルになる。

追加スクリプト
      Attachments.create( :container_id => container_id,
                          :container_type => "Issue",
                          :filename => filename,
                          :disk_filename => filename,
                          :filesize => File::stat( @media_path + filename ).size,
                          :content_type => type,
                          :digest => Digest::MD5.hexdigest(filename),
                          :author_id => 1,
                          :description => desc
                          )

普通のWeb操作で添付ファイルをつけると、何やらユニークコードがオリジナルファイル名の前に追加されて/filesに保存されていく。保存場所が/filesだけなので同じファイル名でも別のファイルとして識別する必要があるためだろう。
だけど今回は元からほぼユニークファイル名なので、disk_filenameも普通のファイル名で登録している。
Redmineのファイルモジュールでしか使わないであろうDigestも一応入れているけれど、かなり適当。ファイル名でしかDigestを作ってない。多分活用しないから、これでいいかと。ホントはDigestコードである必要もないかも。

ほんとに添付しているわけではない
添付って言うと、Redmineのファイル管理フォルダ'files'へ転送して・・・
っていうイメージだけれど巨大なデータファイルを扱うので現実的じゃない。
もっと簡単な方法。

一旦、/opt/redmine/files フォルダを削除して
$ sudo ln -s /録画ファイル保存場所 /opt/redmine/files
で保存場所=redmiine/filesにするだけです。


なぜアタッチ?
今のところの理由は、アタッチしておけば、そのチケットを削除するとアタッチファイルも勝手に削除してくれるのでファイル管理が楽ちんっていうところでしょうか。

一応、サムネールファイルも作ってアタッチしてるんで、どんなかな?とイメージだけ確認できるし。
Redmineに添付ファイルを勝手にサムネール表示してくれるプラグインとかもあるんで、入れると少し便利かも。

でも、添付された本体ビデオファイルをチケットからクリックしても視聴できるわけじゃない。
実際やると固まってしまう・・・ブラウザがダウンロードしようとしてるんだと思う。恐ろしい・・・
この辺が次のテーマかな。

完了?
サムネールが添付されたら無事に終わったということにして、チケットを’完了’ステータスにしてセーブする。サムネールがまだ出来てないなら処理中だと判断する。

そんなこんなをするスクリプトがこちら
record.rb
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
#
require 'rubygems'
require 'active_record'
require 'active_support/core_ext'
require 'digest/md5'

@media_path = '/opt/redmine/files/'

ActiveRecord::Base.establish_connection(
 :adapter => 'mysql2',
 :host => 'localhost',
 :username => 'redmine',
 :password => 'redmine',
 :database => 'redmine'
)

class Issue < ActiveRecord::Base
end

class CustomValues < ActiveRecord::Base
end

class Attachments < ActiveRecord::Base
end

def attach( desc, container_id, filename, type )
  if FileTest.exists?( @media_path + filename )
    if Attachments.first( :conditions => {
                            :container_id => container_id,
                            :digest => Digest::MD5.hexdigest(filename)
                          }).nil?
      Attachments.create( :container_id => container_id,
                          :container_type => "Issue",
                          :filename => filename,
                          :disk_filename => filename,
                          :filesize => File::stat( @media_path + filename ).size,
                          :content_type => type,
                          :digest => Digest::MD5.hexdigest(filename),
                          :author_id => 1,
                          :description => desc
                          )
      return true
    end
  end
  return false
end


def on_air_time issue
  time = format("%04d", CustomValues.first( :conditions => {:customized_id=>issue.id, :custom_field_id=>1} ).value.to_i)
  Time.parse(issue.start_date.strftime("%Y%m%d") + time)
end

# 時間が過ぎた予約チケット
Issue.find( :all, :conditions => ["tracker_id=2 and start_date<=?", Date.today]).each {|issue|

  if on_air_time(issue) < Time.now
    # 録画トラッカーへ
    issue.tracker_id = 3
    issue.save
  end
}

# 実行中の録画チケット
Issue.find( :all, :conditions => {:tracker_id => 3,:status_id => 2}).each {|issue|

  on_time = on_air_time issue

  # アタッチ
  if attach "サムネール", issue.id, on_time.strftime("%Y%m%d%H%M") + '.jpg', "image/jpg"
    attach "ビデオファイル", issue.id, on_time.strftime("%Y%m%d%H%M") + '.mp4', "video/mp4"
    # 録画完了
    issue.status_id = 4
    issue.save
    puts "Completed: #"+issue.id.to_s
  else
    puts "Running or Failed: #"+issue.id.to_s
  end
}

これも前回の予約実行スクリプトと同じようにJenkinsで定期的に実行しておく。

次回は、視聴に取り掛かりたいが、めどが立ってないので、キーワード予約とか過去の番組チケット整理とかについて書いておこうと思う。

0 件のコメント:

コメントを投稿