デジタルフォトフレームを簡易モニターとして使う(テレビ番組表)


前回はデジタルフォトフレームを電子看板として利用する方法を 紹 介しました。
今回はWEBページから必要な情報を抜き出してフォトフレームに表示するサンプルとして、
so-netのG ガイド・テレビ王国から、現在放送中の番組表 を抜き出してフォトフレームに表示する方法を紹介します。
so-netのGガイド・テレビ王国はXML形式で表示されるので、コンピュータで定型処理を行うには便利です。

【STEP1】パッケージのインストール

前回までのパッケージに加え、以下のパッケージをインストールします。

$ sudo apt-get install python-beautifulsoup

【STEP2】pythonスクリプト

スクリプトは以下のとおりです。

#!/usr/bin/python
#-*- encoding: utf-8 -*-
import sys
import os
import csv
import urllib2
import BeautifulSoup
import unicodedata
import HTMLParser

if __name__ == '__main__':
    argv = sys.argv  # コマンドライン引数を格納したリストの取得
    argc = len(argv) # 引数の個数
    CurDir=argv[0]
    DirName=os.path.dirname(CurDir)
    if not DirName:
      DirName="."
    csv_file=DirName+"/param.csv"
#    print csv_file

#テストモード設定
    TestMode=""
    if argc == 2:
      if argv[1] == "test":
        TestMode="test"

#番組情報取得
    city='33' # 名古屋
#    city='23' # 東京
#    city='40' # 大阪

#    url = 'http://www.tvguide.or.jp/TXML301PG.php?type=TVG&dummy=10&regionId={0:s}'.format(city)
#    url = 'http://tv.so-net.ne.jp/rss/schedulesByCurrentTime.action?group=10&stationAreaId=33'
    url = 'http://tv.so-net.ne.jp/rss/schedulesByCurrentTime.action?group=10&stationAreaId={0:s}'.format(city)
#    print "url>"+url
    opener = urllib2.build_opener()
    contents = opener.open( url ).read()
#    print contents
    soup = BeautifulSoup.BeautifulSoup(contents)

    for item in soup.find("title"):
      header=str(item.string)
      list=header.split('-')
      header=list[0]+list[2]
#      print header

    title=[]
    for item in soup.findAll("title"):
      text=str(item.string)
#      print text
#      print HTMLParser.HTMLParser().unescape(text)
      text=HTMLParser.HTMLParser().unescape(text)
      text=text.replace('[字]','')
      text=text.replace('[二]','')
      title.append(text)

    desc=[]
    for item in soup.findAll("description"):
      text=str(item.string)
#      print text
      list=text.split(' ')
#      print len(list)
      if len(list) == 1:
        text=" "
      else:
        text=str(list[1]) + ' ' + str(list[2])
#      print text
      desc.append(text)

#
#フォントサイズなど
#適当に変更してください
    FontSizeHeader="45"
    FontStyleHeader="M"
    FillColorHeader="DarkBlue"

    FontSizeDesc="25"
    FontStyleDesc="G"
    FillColorDesc="DarkGreen"

    FontSizeTitle="33"
    FontStyleTitle="M"
    FillColorTitle="Black"


#CSVファイル作成
    fd=open(csv_file,'w')
    writer = csv.writer(fd, lineterminator='\n')

    csvdata=[]
    csvdata.append(header)
    csvdata.append(FontSizeHeader)
    csvdata.append(FillColorHeader)
    csvdata.append(FontStyleHeader)
    writer.writerow(csvdata)

    csvdata=[]
    csvdata.append(' ')
    csvdata.append(FontSizeDesc)
    csvdata.append(FillColorDesc)
    csvdata.append(FontStyleDesc)
    writer.writerow(csvdata)

    for x in (range(1,len(title))):
      if TestMode:
        print title[x]
        print desc[x]
     
      csvdata=[]
      csvdata.append(desc[x])
      csvdata.append(FontSizeDesc)
      csvdata.append(FillColorDesc)
      csvdata.append(FontStyleDesc)
      writer.writerow(csvdata)

      csvdata=[]
      csvdata.append(title[x])
      csvdata.append(FontSizeTitle)
      csvdata.append(FillColorTitle)
      csvdata.append(FontStyleTitle)
      writer.writerow(csvdata)


上記のスクリプトを「tv-guild.py」などのファイル名で保存してください。
なお、スクリプトの以下の部分はお住まいの地域にあわせて変更してください。

city='33' # 名古屋

この番号の調べ方ですが
http://tv.so-net.ne.jp/rss/schedulesByCurrentTime.action?group=10&stationAreaId=33
上記のURLをブラウザーで開いて、末尾の番号を適当な数字に変えてみてください。

【STEP3】pythonスクリプトの実行

起動時の引数に「test」を指定すると、以下の様に画面に現在放送中の番組表が表示されます。

$ python tv-guide.py test
ワイド!スクランブル 年末スペシャル
12:00〜15:00 [メ〜テレ(Ch.6)]
ダウンタウンのガキの使いやあらへんで!!大晦日SP直前!!徹底解剖SP
12:55〜16:50 [中京テレビ(Ch.4)]
「花子とアン」ダイジェスト こぴっと一挙放送!「大正編」(2)
13:05〜15:30 [NHK総合・名古屋(Ch.3)]
CBC年末スペシャル『いきなり親孝行バラエティ「母が訪ねて三千里」』[再]
13:55〜14:55 [CBCテレビ(Ch.5)]
年末スペシャル 最強!ものまね紅白!史上初の頂上決戦スペシャル[再]
14:00〜16:00 [東海テレビ(Ch.1)]
NHK高校講座 日本史「織田信長」
14:00〜14:20 [NHKEテレ1・名古屋(Ch.2)]
スポーツがあったから【東北復興物語▽羽生結弦▽釜石ラグビー(他)】
14:00〜15:00 [テレビ愛知(Ch.10)]

同時にカレントディレクトリに「param.csv」のファイルが作られます。

$ cat param.csv
Gガイド.テレビ王国  地上波(愛知),45,DarkBlue,M
 ,25,DarkGreen,G
12:00〜15:00 [メ〜テレ(Ch.6)],25,DarkGreen,G
ワイド!スクランブル 年末スペシャル,33,Black,M
12:55〜16:50 [中京テレビ(Ch.4)],25,DarkGreen,G
ダウンタウンのガキの使いやあらへんで!!大晦日SP直前!!徹底解剖SP,33,Black,M
13:05〜15:30 [NHK総合・名古屋(Ch.3)],25,DarkGreen,G
「花子とアン」ダイジェスト こぴっと一挙放送!「大正編」(2),33,Black,M
13:55〜14:55 [CBCテレビ(Ch.5)],25,DarkGreen,G
CBC年末スペシャル『いきなり親孝行バラエティ「母が訪ねて三千里」』[再],33,Black,M
14:00〜16:00 [東海テレビ(Ch.1)],25,DarkGreen,G
年末スペシャル 最強!ものまね紅白!史上初の頂上決戦スペシャル[再],33,Black,M
14:00〜14:20 [NHKEテレ1・名古屋(Ch.2)],25,DarkGreen,G
NHK高校講座 日本史「織田信長」,33,Black,M
14:00〜15:00 [テレビ愛知(Ch.10)],25,DarkGreen,G
スポーツがあったから【東北復興物語▽羽生結弦▽釜石ラグビー(他)】,33,Black,M


出来上がったパラメータファイル(param.csv)を使って、前回と同様の手順でイメージファイルを作成し、
イメージファイルをフォトフレーム側にダウンロードしてやれば、フォトフレームに番組表を表示することができます。

【STEP4】全体のシェルスクリプト

cronで定期的に以下のスクリプトを実行すれば、フォトフレームに定期的に番組表を表示することができます。

#!/bin/bash
#
#TV Guide for Raspberry
#
python /home/pi/tv-guide.py
/home/pi/fusen.sh /home/pi/param.csv /home/pi/back.jpg /tmp/out.jpg → こちらで紹介した スクリプト
/home/pi/download.sh → こちらで 紹介したスクリプト

フォトフレームへの表示は以下の様になります。



次回はもう1例、WEBページから必要な情報を抜き出してフォトフレームに表示するサン プルを紹介します。