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

美女暦


美女暦は2017年7月以降、画像データが有りません。
サイトも既に閉鎖されています。
このページはほとんど役に立ちませんが、祭日の判定処理だけは2020年になっても動きました。

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

【STEP1】祭日の判定処理

美女暦は土日だけでなく祝日も休みです。
以下のURLで2015年の祝日を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を使うと2015年の祝日を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を利用して、以下のスクリプトで、今日が祝日かどうかを判定することができます。
この部分だけは2020年でも動きました。
#! /usr/bin/env python3
# -*- coding:utf-8 -*-
import csv
import datetime
import requests

def get_japan_holiday(now):
    today='{0:04d}/{1:02d}/{2:02d}'.format(now.year,now.month,now.day)
    print("today={}".format(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={}".format(url))
    contents = requests.get(url)
    #print("contents.text={}".format(contents.text))
    list = contents.text.split()
    #print("list={} {}".format(len(list), list))
    list.pop(0)
    for row in list:
        #print("row={}".format(row))
        item=row.split(',')
        holiday='{0:04d}/{1:02d}/{2:02d}'.format(int(item[0]),int(item[1]),int(item[2]))
        #print("holiday={}".format(holiday))
        if today == holiday:
            text = str(item[7])
            return text
    return u''


if __name__ == '__main__':
    NowDate = datetime.datetime.now()
    print("NowDate={}".format(NowDate))
    print("get_japan_holiday=[{}]".format(get_japan_holiday(NowDate)))

    NowDate = datetime.datetime(2015, 10, 12, 12, 00, 0, 688787)
    print("NowDate={}".format(NowDate))
    print("get_japan_holiday=[{}]".format(get_japan_holiday(NowDate)))

    NowDate = datetime.datetime(2015, 11, 3, 12, 00, 0, 688787)
    print("NowDate={}".format(NowDate))
    print("get_japan_holiday=[{}]".format(get_japan_holiday(NowDate)))

    NowDate = datetime.datetime(2015, 11, 23, 12, 00, 0, 688787)
    print("NowDate={}".format(NowDate))
    print("get_japan_holiday=[{}]".format(get_japan_holiday(NowDate)))

上記スクリプトの実行結果
$ python3 japan_holiday.py
NowDate=2022-05-11 08:52:23.221909
today=2022/05/11
get_japan_holiday=[]
NowDate=2015-10-12 12:00:00.688787
today=2015/10/12
get_japan_holiday=[体育の日]
NowDate=2015-11-03 12:00:00.688787
today=2015/11/03
get_japan_holiday=[文化の日]
NowDate=2015-11-23 12:00:00.688787
today=2015/11/23
get_japan_holiday=[勤労感謝の日]

【STEP2】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

    contents = opener.open( url ).read()
    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 ):
    flist=fnmatch.filter(os.listdir(path), 'image*.jpg')
    for file in flist :
        delfile = path + "/" + file
        os.remove(delfile)

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

def download( path,url,count ):
    opener = urllib2.build_opener()
    img = opener.open( url )
    fname = path + "/" + 'image{0:02d}.jpg'.format(count)
    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)

    #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)
    opener = urllib2.build_opener()
    contents = opener.open( url ).read()
    list=contents.split()
    list.pop(0)
    for row in list:
      item=row.split(',')
      holiday='{0:04d}/{1:02d}/{2:02d}'.format(int(item[0]),int(item[1]),int(item[2]))
      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 )
    count = saveImages( path,images )
    sys.exit(count)

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

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

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

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

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




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

全体のシェルスクリプトは以下の様になります。
今回は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"