2012/07/29

録画ビデオのpodcast対応をredmineプラグインで

録画ビデオ視聴をredmineプラグインで出来るようにしたので、podcastも対応させる。
普通の録画ビデオフォーマットだとiPodTouch初代だと観れない問題を解決すべく、mpeg4フォーマットに更に変換したものをpodcastで観れるようにするというもので、
以前の記事でepgrecを対応させたが、便利だったのでredmineシステムでもやってみた。

前回は録画したものを何でもかんでもpodcastで出すようにしていたが、今回は録画が終了したものをredmine上で選択したものだけpodcastへ公開する形にした。

録画が正常終了したものはredmineステートで「完了」になるのだけど、新たに「公開」ステートを設けた。マニュアル操作で録画チケットを「公開」にしておくと、次の日にはpodcast上に出てくるという感じ。

そのステート監視と変換処理をするスクリプト
podcast.rb
#!/usr/bin/ruby
# -*- coding: utf-8 -*-
#
require 'rubygems'
require 'active_record'
require 'digest/md5'

@media_path = '/opt/videos/'

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 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
                        )
  end
end

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

# 公開ステータスの録画チケット
Issue.find( :all, :conditions => {:tracker_id => 3,:status_id => 6}).each {|issue|

  t_start = start_date_time issue
  filename = t_start.strftime("%Y%m%d%H%M")
  outfile = filename + '-p.mp4'

  if !FileTest.exists?( @media_path + outfile )
    # MPEG4
    if system '/opt/task/podcast.sh ' + @media_path + filename
      # アタッチ
      attach "MPEG4", issue.id, outfile, "video/m4v"
    end
  end
}
録画で公開ステータスになっているチケットを検索して、podcast用(mpeg4フォーマットのスモールバージョン)ビデオファイルが存在していなければ、作ってチケットにアタッチする処理。
ここでのポイント(微妙だけど・・)は、アタッチするファイルタイプを'video/mp4'ではなく、'video/m4v'にしたことかな。直接クリックして視聴できないんでタイプに意味はないけど、後でこれをキーワードにして検索したりするんで、他のアタッチファイルと区別できるようにしておく。

ipod-touch初代で観れるmpeg4ビデオを作成するシェルスクリプトはこちら
#!/bin/sh
OUT=$1
echo "OUTPUT  : $OUT"
ffmpeg -y -i ${OUT}.mp4 -threads 0 -s 480x272 -c:a copy -c:v mpeg4 -b:v 900k -qmin 3 -qmax 5 -f mp4 ${OUT}-p.mp4
この辺は前記事と変わりはないかな。ファイルの置き場所とかファイル名が違うくらい。

下回りはこんなでいいとして、podcastのGET部分をredmineのプラグインで簡単に組み込んでみた。この記事で書いたプラグインのビューとして作ってみた。

app/controllers/video_controller.rb に’podcast'関数を追加
  def podcast
    @issues = get_public_issues
    render :layout => false, :content_type => 'text/xml'
  end
  def get_public_issues
    Issue.find(:all, :conditions => {:tracker_id => 3, :status_id => 6}, :order => "start_date DESC")
  end

podcastはrss(xml)だ。xml出力をビューで処理したい。ということで、
render :layout => false; って書いておく。redmineのビューフォーマット全部をなしにしてくれる。

ビューの部分 app/views/video/podcast.html.erb を記述
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
  <channel>
    <title>公開ビデオ</title>
    <language>jp</language>
    <itunes:category text="録画">
      <itunes:category text="TV録画"/>
    </itunes:category>

    <% @issues.each do |issue|
       video = issue.attachments.detect {|a| a.content_type == "video/m4v"}

       if video
       channel = issue.custom_values.detect {|v| v.customized_id == issue.id and v.custom_field_id == 2 }
       pubdate = video.filename.sub(/\..*/,'')
       %>
    <item>
      <title><%= issue.subject %></title>
      <enclosure url="http://<%= request.host + path_to_video(video.disk_filename) %>" type="video/mp4"/\
>
      <pubDate><%= pubdate %></pubDate>
      <itunes:author><%= channel.value %></itunes:author>
      <itunes:summary><%= issue.description %></itunes:summary>
      <itunes:category><%= issue.category %></itunes:category>
      <itunes:duration><%= issue.estimated_hours %></itunes:duration>
    </item>
    <% end %>
    <% end %>

  </channel>
</rss>
Railsのviewsになっただけで、以前Smartyテンプレートで記述したのとほとんど同じ。前回は内部処理をPHPで記述していたが、今回はrubyだ。(今回はペースト成功した!)

config/routes.rb に忘れないように以下の1行を追加
get 'video/podcast',:to=>'video#podcast'                                                                       
iTunesからhttp://(redmine-home)/video/podcast をpodcast登録しておく。
前回悩んだguidタグだけど、記述しなくても大丈夫そうだったのでなしにした。

オリンピック録画中なので、あまり大きな変更修正で失敗しない程度の拡張でした。

0 件のコメント:

コメントを投稿