普通の録画ビデオフォーマットだと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
}
ここでのポイント(微妙だけど・・)は、アタッチするファイルタイプを'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>
config/routes.rb に忘れないように以下の1行を追加
get 'video/podcast',:to=>'video#podcast'iTunesからhttp://(redmine-home)/video/podcast をpodcast登録しておく。
前回悩んだguidタグだけど、記述しなくても大丈夫そうだったのでなしにした。
オリンピック録画中なので、あまり大きな変更修正で失敗しない程度の拡張でした。
0 件のコメント:
コメントを投稿