2012/12/07

XBMC用.nfoファイルを用意する

XMBCがAndroid端末(MK808)で動きましたので、次の段階です。

再生時の操作については別途書きたいなと思ってますが、今回のテーマは録画ビデオファイルのリスト表示を、ファイル名だけとかサムネイルだけとかじゃなくてちゃんと番組名、内容説明を表示するようにしたいということへの取り組みです。

詳しくはないんですが、XBMCのImport-export library を読むと、nfoファイルというものを用意すれば、無機質なファイル名ではなくて、タイトル名やらなんやら、オンデマンドコンテンツのように表示させることが出来るとありますね。

ビデオファイル名.nfoファイルを作ってあげればよいと

初めは、XBMCの方でそのファイルをインポートするなんて操作をしなければならないのかな?面倒だな。なんて勘違いしてましたが、全然大丈夫でした。
ビデオファイルが入っている同じフォルダ内に拡張子を"nfo"にして置いておけば勝手に読んでライブラリ化してくれます。これなら自動化も楽ちんです。

nfoファイルの中身

XBMCがライブラリ化できるのは大きく分けて、映画(movie)、TV番組(tvshow)、TVエピソード(episodedetails)及び音楽ビデオ(musicvideo)のようです。

メジャーコンテンツ扱う場合なら、オンラインデータベースからの情報とリンクさせてより詳しいデータとかを取得出来たりするようですね。そういうのが一切関係ないローカルで汎用的なビデオ(video)とかあればいいなと思いましたがね。

どのライブラリタイプを使うか

どれが一番適しているか色々試してみました。

本来はtvshow(TV番組)としてライブラリ化するのが自然だろうなぁと思いましたが、tvshowは"tvshow.nfo"と名前が決まっていて、1ファイル1ディレクトリ管理じゃないとだめっぽい。
TV_Show_files_naming_conventions
この辺を読むと、さらにその下にepisodedetailsを置いて、ファイル名とか色々構成を整えないといい感じにならないらしい。

movieとmusicvideoは、ファイル単位のnfoを作るだけで読まれたので、どっちでもよさそうでしたが、musicvideoだと、並べ替えで「日付」を選ぶことが出来なくて、リストがいまいち使いにくい。どちらもpodcastのような公開日とかがないので、実ファイルの作成日が使えることが重要だったりします。

消去法で、内容はTV番組ですが、映画ライブラリとして構成するのが一番使い勝手が良いようです。結論を先に書きましたが、作成と読み込み手順は以下のような感じで進めました。

nfoファイル作成

録画サーバーから提供できる番組情報は、元々地デジEPG情報なので、番組名・内容・日時・長さ(分)・ジャンル・チャンネル位なので、それをどうにか対応させます。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<movie>
 <id>番組ID</id>
 <title>番組名</title>
 <outline>内容</outline>
 <plot>内容</plot>
 <runtime>長さ</runtime>
 <genre>ジャンル</genre>
 <studio>チャンネル</studio>
 <director>録画日時</director>
 <set>番組名のサブセット</set>
</movie>
outline,plotどっちで内容が出てくれるのかよく分からないので両方に。
チャンネル項目がないので、studioに適当に入れました。
録画日時を表示させたいので、directorに適当に入れました。
studioとdirectorがとにかく目立つところに表示されるのでね。意味が全然違いますけど・・・
idってのがあったのでチケットID入れてみましたが、どこにも表示されませんな。

このnfoファイルを作成する録画システム上のスクリプトがこちら
xbmc-movie.rb

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
#
require 'rubygems'
require 'active_record'
require 'rexml/document'
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 IssueCategories < ActiveRecord::Base; end
class Attachments < ActiveRecord::Base; end
class CustomValues < ActiveRecord::Base; end

def add_element_with_text (parent, element, text)
  e = parent.add_element element
  e.text = text
end

# create a nfo file
def create_nfo (issue)

  video = Attachments.first(:conditions => {
                              :container_id => issue.id,
                              :content_type => "video/mp4"})
  channel = CustomValues.first(:conditions => {
                                 :customized_id => issue.id,
                                 :custom_field_id => 2})
  time_tmp = format("%04d", CustomValues.first( :conditions => {
                                                  :customized_id => issue.id,
                                                  :custom_field_id => 1}).value.to_i)
  time = "#{time_tmp[0..1]}:#{time_tmp[2..3]}"

  # 試行錯誤の末こんな感じに
  set = issue.subject.sub(/[  ”’#(「・◇].*/,'')

  xml = REXML::Document.new
  info = xml.add_element 'movie'
  add_element_with_text info, 'id', issue.id
  add_element_with_text info, 'title', issue.subject
  add_element_with_text info, 'year', issue.start_date
  add_element_with_text info, 'runtime', issue.estimated_hours
  add_element_with_text info, 'outline', issue.description
  add_element_with_text info, 'plot', issue.description
  add_element_with_text info, 'genre', IssueCategories.find(issue.category_id).name
  add_element_with_text info, 'director', "#{issue.start_date} / #{time}"
  add_element_with_text info, 'studio', channel.value
  add_element_with_text info, 'set', set

  nfo_file = video.filename.to_s.sub(/.mp4/,".nfo")
  puts "#{nfo_file}:#{set}"

  nfo = File.open(@media_path + nfo_file,"w")
  nfo.puts '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>'
  xml.write nfo
  nfo.puts "\n"
  nfo.close

  # 本件に関係ないので省略
  #attach "nfoファイル", issue.id, nfo_file, "xbmc/nfo"
end

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

今までのビデオファイル全てにnfoファイルを作成するものになってますが、録画システムとしては番組録画後にそれ用のnfoファイルを作成するフローにしています。以前podcastがらみでやったこととほとんど同じ要領なので、ちゃちゃと出来ました。

XBMC側で読んでもらうには

ビデオソースを追加して、HTTPとかSMBとかで、ビデオフォルダを見れるようにします。
この辺の手順は他のHOWTO記事を参考にされた方が親切でいいです。

コンテンツの種類として”(映画)”を選んで設定ボタンを押して、有効になっているやつを全部外します。外さなくてもいいけれど勝手にDBへアクセスしに行ったりするようなので。
設定を全部OKしてダイアログを全部閉じるとライブラリ化はその瞬間から自動で開始されます。

終了するまで数分時間がかかりました。その最中でも大丈夫そうでしたが、落ち着いたかなぁという頃合いにXBMCのホームに戻るとビデオの下にはにはライブラリ、横に「映画」という項目が増えています。この辺をたどっていくとnfoファイルで設定した内容でビデオファイルが表示されました。

新しい順にリストさせるには、表示オプションで、並べ替えを「日付」にソートを「降順」にすれば新しい順に出ます。後は表示の種類を自分の好みにしてみる。うーん。いい感じです。

setがいい

setタグのところで、番組名のサブセットと書きましたが、XBMC上で同じセット名は仮想的なサブディレクトリとして扱われます。
毎週録画している番組とか、本来はエピソード番号とかで管理されるといいと思いますが、地デジ情報からは得られないので、番組名の共通項をセット名として定義することでシリーズ番組とかを同じセットグループとして分類が出来て便利です。

日本語での検索

表示オプションから検索が出来ますが、残念ながら日本語入力が出来ません。これはがっかりですが、xbmcユーザからすると周知の事実らしいですね。バージョンが上がると解決するんでしょうか。パッチとかあるんでしょうか?

別のAndroid/iOS/その他デバイスでXBMCリモートアプリを使って検索すれば日本語検索できるんで、さほど問題ではないですけど、出来れば普通に本体だけで済ませたいですね。

何だか思っていた以上の環境が整いそうな予感です。
もっといい感じにできるのか調べてみましょう。

0 件のコメント:

コメントを投稿