デジタルフォトフレームを簡易モニターとして使う(美女暦)


今回は、もう1つ、WEBページからイメージファイルを抜き出して表示する方法を紹介します。
美女暦というページがあ ります。
このページからイメージを抜き出して、フォトフレームに表示する方法を紹介します。
今回、この ページを大いに参考にさせて頂きました。
この場を借りて、作者の方にはお礼申し上げます。

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

前回までのパッケージに加え、以下のパッケージをインストールします。
※2015年11月26日追記
祝日の判定方法を変更したので、このパッケージのインストールは不要になりました。

$ sudo apt-get install python-urllib3

【STEP2】祭日の判定処理

美女暦は土日だけでなく祝日も休みです。
以下のURLで祝日をXML形式で取り出せることがわかりました。
http://calendar-service.net/cal?start_year=2015&start_mon=1&end_year=2015&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=xml&holiday_only=1

また、以下のURLを使うと祝日をCSV形式で取り出すことができます。
http://calendar-service.net/cal?start_year=2015&start_mon=1&end_year=2015&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=csv&holiday_only=1

<余談>
このページもいつまでサポートしてくれるか分かりません。
祝日の情報はそもそも政府機関が提供すべきと思いますがね....
</余談>

上記URLを利用して、以下のスクリプトで祝日かどうかを判定することができます。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
import csv
import datetime
import urllib2

def get_japan_holiday(now):
    today='{0:04d}/{1:02d}/{2:02d}'.format(now.year,now.month,now.day)
#    print 'today='+today

#    url = 'http://calendar-service.net/cal?start_year=2015&start_mon=1&end_year=2015&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=csv&holiday_only=1'
    url = 'http://calendar-service.net/cal?start_year={0:04d}&start_mon=1&end_year={0:04d}&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=csv&holiday_only=1'.format(now.year)
#    print "url>"+url
    opener = urllib2.build_opener()
    contents = opener.open( url ).read()
#    print contents.decode('euc_jp')
    list=contents.split()
#    print list
    list.pop(0)
#    print len(list)
    for row in list:
#      print row
      item=row.split(',')
#      print item[0]+"/"+item[1]+"/"+item[2]+" "+item[7]
      holiday='{0:04d}/{1:02d}/{2:02d}'.format(int(item[0]),int(item[1]),int(item[2]))
#      print 'holiday='+holiday
      if today == holiday:
        text = str(item[7])
        text = text.decode('euc_jp')
        return text

    return u''


if __name__ == '__main__':
    NowDate = datetime.datetime.now()
    print NowDate
    print 'get_japan_holiday=[' + get_japan_holiday(NowDate) + ']'

    NowDate = datetime.datetime(2015, 10, 12, 12, 00, 0, 688787)
    print NowDate
    print 'get_japan_holiday=[' + get_japan_holiday(NowDate) + ']'

    NowDate = datetime.datetime(2015, 11, 3, 12, 00, 0, 688787)
    print NowDate
    print 'get_japan_holiday=[' + get_japan_holiday(NowDate) + ']'

    NowDate = datetime.datetime(2015, 11, 23, 12, 00, 0, 688787)
    print NowDate
    print 'get_japan_holiday=[' + get_japan_holiday(NowDate) + ']'

上記スクリプトの実行結果


【STEP3】pythonスクリプト

全体のスクリプトは以下の通りです。
上で紹介している祝日判定処理を含んでいます。

#! /usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import urllib2
import re
import fnmatch
import datetime

def getHtml():
    opener = urllib2.build_opener()
    baseurl = 'http://www.bijogoyomi.com/bijo3/index.php/'
    url = '%s%s' % ( baseurl, datetime.datetime.now().strftime( '%Y/%m/%d' ) )
#    print 'url>'+url
#for DEBUG
#    now = datetime.datetime.now() + timedelta(days=-2)
#    print now
#    url = '%s%s' % ( baseurl, now.strftime( '%Y/%m/%d' ) )
#for DEBUG

#    print 'url>'+url
    contents = opener.open( url ).read()
#    print 'contents>'+contents
    return contents

def getImages( html ):
    if re.compile( r'<span id="coda-nav-right-1">.*?<img.*?src="(.*?)"' ).findall( html ) is None:
        exit()
    return re.compile( r'<span id="coda-nav-right-1">.*?<img.*?src="(.*?)"' ).findall( html )

def delImages( path ):
#    print fnmatch.filter(os.listdir(path), 'image*.jpg')
    flist=fnmatch.filter(os.listdir(path), 'image*.jpg')
#    print len(flist)
    for file in flist :
        delfile = path + "/" + file
#        print 'delImages>'+delfile
        os.remove(delfile)

def saveImages( path,images ):
    baseurl = 'http://www.bijogoyomi.com'
    count = 0
    for i in images:
#        print 'i='+i
        if 'icon' in i:
            continue
        count = count + 1
        download(path,baseurl+i,count)
    return count

def download( path,url,count ):
#    print 'download>url='+url
    opener = urllib2.build_opener()
    img = opener.open( url )
    fname = path + "/" + 'image{0:02d}.jpg'.format(count)
#    print 'download>'+fname
    localfile = open( fname, 'wb')
    localfile.write(img.read())
    img.close()
    localfile.close()


def get_japan_holiday(now):
    today='{0:04d}/{1:02d}/{2:02d}'.format(now.year,now.month,now.day)
#    print 'today='+today

#    url = 'http://calendar-service.net/cal?start_year=2015&start_mon=1&end_year=2015&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=csv&holiday_only=1'
    url = 'http://calendar-service.net/cal?start_year={0:04d}&start_mon=1&end_year={0:04d}&end_mon=12&year_style=normal&month_style=ja&wday_style=ja&format=csv&holiday_only=1'.format(now.year)
#    print "url>"+url
    opener = urllib2.build_opener()
    contents = opener.open( url ).read()
#    print contents.decode('euc_jp')
    list=contents.split()
#    print list
    list.pop(0)
#    print len(list)
    for row in list:
#      print row
      item=row.split(',')
#      print item[0]+"/"+item[1]+"/"+item[2]+" "+item[7]
      holiday='{0:04d}/{1:02d}/{2:02d}'.format(int(item[0]),int(item[1]),int(item[2]))
#      print 'holiday='+holiday
      if today == holiday:
        text = str(item[7])
        text = text.decode('euc_jp')
        return text

    return u''

if __name__ == '__main__':
    NowDate = datetime.datetime.now()
#土曜日、日曜日は美女暦はお休み
    if NowDate.weekday() > 4:
        sys.exit()
#祝日も美女暦はお休み
    if get_japan_holiday(NowDate) != "":
         sys.exit()

    path="/tmp"
    delImages(path)
    html = getHtml()
    images = getImages( html )
#    print images
    count = saveImages( path,images )
#    print 'count='+str(count)
    sys.exit(count)


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

上記のスクリプトを「SaveImages.py」の名前で保存してください。

$ python /home/pi/bijyo/SaveImages.py

イメージファイルが「/tmp/image***.jpg」に保存されます。
保存されたイメージファイルをフォトフレーム側にダウンロードしてやれば、フォトフレームに美女暦を表示することができます。

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




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

全体のシェルスクリプトは以下の様になります。
今回はTranscendのディジタルフォトフレームを使ったので、以下の様になります。
(SONYのディジタルフォトフレームは内蔵メモリの書き替えにすごーーーーーく、時間が掛かります)
USB-SWはGPIO15でON/OFFしています。

#!/bin/bash
#
#Imageのダウンロード
python /home/pi/bijyo/SaveImages.py

#USB-SWのON
sudo sh -c "echo 15 > /sys/class/gpio/export"
sudo sh -c "echo out > /sys/class/gpio/gpio15/direction"
sudo sh -c "echo 1 > /sys/class/gpio/gpio15/value"

#SD Cardのマウント
#deviceは各自の環境に合わせて変更してください
device="/dev/sdb1"
dfcnt=0
while [ $dfcnt -eq 0 ]
do
  sudo mount -t vfat ${device} /mnt/sdcard
  dfcnt=`df | grep -c /mnt/sdcard`
  sleep 10
done

#SD Card内のImageファイルを全て削除
files=`find /mnt/sdcard -name "*.jpg" -print`
if test -n "$files" ; then
    sudo rm /mnt/sdcard/*.jpg
fi

#新しいImageファイルをコピー
sudo cp /tmp/*.jpg /mnt/sdcard/
sync
sync
sync

#SD Cardのアンマウント
sudo umount -l ${device}
sleep 5

#USB-SWのOFF
sudo sh -c "echo 0 > /sys/class/gpio/gpio15/value"
sudo sh -c "echo 15 > /sys/class/gpio/unexport"


次回は、このイメージを加工して表示する方法を紹介する予定です。