Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

iEPGデジタルを読む RubyでPVRを作ろう!その4

悩んでいてもしかたないので、iEPGDのデータを読む部分を作っていきます。
まず、multi形式は一旦おいておくことにして、シングル形式を扱うことにします。その上で、直接ファイルから読むのではなく、1行づつ配列に入っているものとします。こうしておけば、multi形式は、比較的簡単に扱えるはずです。問題は、内部表現なのですが、とりあえず解析はしてみたものの、リバースエンジニアリングの悲しさで、どんなキーワードがくるか良くわからないところですね・・・
まあ、「フィールド」というか、「キーワード」をキーとして、ハッシュでデータを持つことにしましょう。効率が悪いのはミエミエですが、昨今のCPUというか、PCの性能を信じることにします(=大名プログラミング)。録画の管理という点でみれば重要なのは、開始時間、終了時間、放送局名、プログラムの名前あたりですが、ほかの情報も必要になる可能性が(特に将来、機能の拡充の際)あるので、全部とっておけばそれに越したことはないでしょう。
 350ml.netさんの情報を信じるとすれば、ちょっと信じられないのは、日付(year:,month,date)が必須でないことですが、実際には入っています。まあ、これは本当に入っていない場合があったら対応することにしましょう。念のため、iEPGの古いバージョンにも何気にさり気に対応しておきます。文字コードは、とりあえずSJISのみ対応です。メソッド自体は、ちょっと悩んだのですがオブジェクトを返すクラスメソッドとして定義しました。


#
# iEPGD Class
#   (c) 2008-09 B.O
#   version 2009/04/03
#     re-written
#      to support V1 and V2 of iEPG
#        for V1 reference , http://350ml.net/labo/iepg.html
#            thanks to "AKINO Yoh, 350ml.net"
#
class IEPG < Hash
  # keywords
  @@Header = "Content-type:"
  @@V1SingleContent = "x-tv-program-info"
  @@V2SingleContent = "x-tv-program-digital-info"
  @@V1MultiContent = "x-multi-tv-program-info"
  @@V2MultiContent = "x-multi-tv-program-digital-
info"
  @@V1Mandatory = [  "version:", "station:", \
                    "start:", "end:" ]
  @@V1Axuary = [  "year:",  "month:" , "date:", "program-title:", \
             "program-subtitle:",  "performer:", "genre:" , "subgenre:" ] 
  @@V2Mandatory = [  "version:", "station:", "station-name:", \
                "program-title:", "program-id:", \
                    "start:", "end:" ]
  @@V2Axuary = [  "year:",  "month:" , "date:", \
             "genre-1:", "subgenre-1:", \
             "program-subtitle:",  "performer:", "genre:" , "subgenre:" ] 
  @@Memo = "_memo:" # adding memo section, needs to be
  #
  # class methods
  #
  # read one iEPGd from lines
  #   return a iEPGd
  def IEPG.fromLines( lines)
    if lines.length < 2
      return nil   # error
    end #if
    if !( lines[0] =~ /^#{@@Header} *(.*)$/ )
      return nil # error
    end
    contentType = $1.strip
    # checking 1st line
    if !(contentType =~ /application\/#{@@
V1SingleContent}|#{@@V2SingleContent}/ )
      return nil # error
    end
    #check charset
    contentType =~ /charset=(.*)/
    if (charset = $1.strip) != "shift_jis"
      print( __FILE__ + __LINE__.to_s + "Error unexpected charset type:" + charset + "\n" )
      return nil
    end
    tmp = IEPG.new
    tmp[@@Header] =  contentType
    i=1
    for i in 1..( lines.length() -1 )
      if lines[i] =~ /(.*?:)(.*)/
          tmp[ "#{$1.strip}" ] = $2.strip
      else
        break
      end
    end #for
    # check memo section
    if lines[i].strip == ""
      if (i = i +1 ) <= lines.length() -1
        tmp[ @@Memo  ] = (lines[i..-1].join("\n"))
      end
    end
    return tmp
  end #def fromLines( lines)
end #class IEPG < Hash

 



コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/635-dfb66f72
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。