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

日めくりカレンダー


今回は、WEBページからイメージファイルを抜き出して表示する方法を紹介します。
日めくりカレンダーというのがありますが、ずぼらな私は新年しばらくは日めくりをするのですが、
そのうちメンドーになっていつの間にか気がついたら、1ヶ月前のカレンダーのまま...ということが良くあります。
そこで、デジタル日めくりカレンダーを紹介します。

こちら
のページで「365カレンダー」が公開されています。
色々な種類のカレンダーが公開されていますが、以下のURLで2020年7月31日の写真を表示することができます。

https://www.365calendar.net/index?action=user_calendar_detail&calendar_id=1134&target=20200731

そこで、このWEBページからイメージファイルを抜き出して、フォトフレームに表示してみます。

【STEP1】pythonスクリプト

こ ちらのページから画像データを抜き出すスクリプトは以下の通りです。
このスクリプトを「SaveImages.py」の名前で保存してください。
Python2とPython3では使用するライブラリが変わります。
# -*- coding: utf-8 -*-

import os
import sys
import datetime
import inspect

#python2
#import urllib2
#from HTMLParser import HTMLParser

#python3
import urllib.request
from html.parser import HTMLParser

DEBUG = 0

def downloadImage(url, savename):
    function_name = inspect.currentframe().f_code.co_name
    if DEBUG: print("{} url={} savename={}".format(function_name,url,savename))
    print("download image from {}".format(url))
    #img = urllib.urlopen(url)
    img = urllib.request.urlopen(url)
    localfile = open(savename, 'wb')
    localfile.write(img.read())
    img.close()
    localfile.close()


def get_url_root(url):
    if("http://" in url):
        url_delet_http = url.lstrip("http://")
        if("/" in url_delet_http):
            url_root = "http://" + url_delet_http[0:url_delet_http.find("/")]
            return url_root
    elif("https://" in url):
        url_delet_http = url.lstrip("https://")
        if("/" in url_delet_http):
            url_root = "http://" + url_delet_http[0:url_delet_http.find("/")]
            return url_root
    return 0

class imgParser(HTMLParser):

    def __init__(self):
        HTMLParser.__init__(self)

    def handle_starttag(self,tagname,attribute):
        if tagname.lower() == "img":
            for i in attribute:
                if i[0].lower() == "src":
                    img_url=i[1]
                    # 取得した写真のURLを集めたファイルの作成
                    f = open("collection_url.txt","a")
                    f.write("%s\t"%img_url)
                    f.close()

if __name__ == "__main__":
    argvs = sys.argv
    argc = len(argvs)
    if argc == 1:
        print("{0:s} SaveFileName [id]".format(argvs[0]))
        sys.exit(1)

    savefile = argvs[1]
    id = "935"
    if (argc == 3):
        id = argvs[2]
    date_file = os.path.dirname(savefile) + "/date.gif"
    month_file = os.path.dirname(savefile) + "/month.gif"

    NowDate = datetime.datetime.now()
    input_url = "http://www.365calendar.net/index?action=user_calendar_detail&calendar_id={:s}&target={:%Y%m%d}".format(id,NowDate)
    if DEBUG: print("input_url={}".format(input_url))
    serch_url = input_url
    #htmldata = urllib2.urlopen(serch_url)
    htmldata = urllib.request.urlopen(serch_url)

    date_url = "http://www.365calendar.net/lib_image/calendar/img_num{:%-d}.gif".format(NowDate)
    if DEBUG: print("date_url={}".format(date_url))

    month_url = "http://www.365calendar.net/lib_image/calendar/img_num{:%-m}.gif".format(NowDate)
    if DEBUG: print("month_url={}".format(month_url))

    parser = imgParser()
    data = htmldata.read()
    #print("type(data)={}".format(type(data)))
    data = data.decode()
    #print("type(data)={}".format(type(data)))
    #parser.feed(htmldata.read())
    parser.feed(data)

    parser.close()
    htmldata.close()

    # 生成したファイルの読み込み
    f = open("collection_url.txt","r")
    for row in f:
        row_url = row.split('\t')
        len_url = len(row_url)
    f.close()

    number_url = []
    if(DEBUG): print("len_url={}".format(len_url))

    for i in range(0,(len_url-1)):
        number_url.append(row_url[i])

    rcode = 1
    for j in range(0,(len_url-1)):
        url = number_url[j]
        if DEBUG: print("url={}".format(url))
        if not "user_photo.php" in url:
           continue

        root_url = get_url_root(serch_url)
        if DEBUG: print("root_url={}".format(root_url))
        downloadImage(root_url + url, savefile)
        downloadImage(date_url, date_file)
        downloadImage(month_url, month_file)
        rcode = 0


    # ファイルの削除
    os.remove("collection_url.txt")
    sys.exit(rcode)

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

起動時の引数に保存先のイメージファイル名と、calendar_idを指定します。
calendar_idはカレンダーの種類を示すIDで、適当な画像を表示するとIDが分かります。
例えば2020年の一覧は、こちらで確認 する事ができます。
ページの中にある「完成カレンダーリスト」から選ぶと、365日のイメージを表示することができます。
毎年、新しいIDがアサインされるので、年が明けると変更する必要が有ります。

以下のコマンドを実行すると、ID=1134(2020年の日本犬)から、当日のイメージファイルを「/tmp/image000.jpg」に保 存します。
保存したイメージファイルをフォトフレーム側にダウンロードしてやれば、フォトフレームに日めくりカレンダーを表示することができます。
$ sudo python SaveImages.py /tmp/image000.jpg 1134

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

cronで1日1回、以下のスクリプトを実行すれば、フォトフレームに日めくりカレンダーを表示することができます。
USB-SWはデバイスファイルを直接操作してON/OFFしています。
#!/bin/bash
#set -x

HomeDir="/home/pi"

#イメージファイルのダウンロード
SrcFile="/tmp/imageSrc.jpg"
DstFile="/tmp/imageDst.jpg"
WorkFile="/tmp/imageWrk.jpg"
DateFile="/tmp/date.gif"
MonthFile="/tmp/month.gif"

#2020年 日本犬
sudo python ${HomeDir}/365cal/SaveImages.py ${SrcFile} 1134

#2020年 MIX/ミックス
if [ $? = 1 ]; then
  sudo python ${HomeDir}/365cal/SaveImages.py ${SrcFile} 1135
fi

#2020年 オールWAN
if [ $? = 1 ]; then
  sudo python ${HomeDir}/365cal/SaveImages.py ${SrcFile} 1136
fi

#2020年 ウェルシュ・コーギーPart2
if [ $? = 1 ]; then
  sudo python ${HomeDir}/365cal/SaveImages.py ${SrcFile} 1145
fi

#イメージファイルがダウンロードできないときは終了
if [ $? = 1 ]; then
    exit
fi
#identify ${SrcFile}

#イメージファイルのサイズを変換
sudo convert ${SrcFile} -geometry 320x240 ${DstFile}
#identify ${DstFile}

#日付画像の背景を透明にする
sudo cp ${MonthFile} ${WorkFile}
sudo convert ${WorkFile} -fuzz 10% -transparent white ${MonthFile}

sudo cp ${DateFile} ${WorkFile}
sudo convert ${WorkFile} -fuzz 10% -transparent white ${DateFile}

#日付画像を重ねる
sudo cp ${DstFile} ${WorkFile}
sudo composite -gravity northwest -geometry +0+0 -compose over ${MonthFile} ${WorkFile} ${DstFile}

sudo cp ${DstFile} ${WorkFile}
sudo composite -gravity northwest -geometry +270+0 -compose over ${DateFile} ${WorkFile} ${DstFile}

#デバイスファイルとマウントポイント
device="/dev/sda1"
mpoint="/mnt/sdcard"

#USB-SWのON
GPIO=11

for i in `seq 1 30`
do
    sudo sh -c "echo ${GPIO} > /sys/class/gpio/export"
    sudo sh -c "echo out > /sys/class/gpio/gpio${GPIO}/direction"
    sudo sh -c "echo 1 > /sys/class/gpio/gpio${GPIO}/value"
    sleep 20

#フォトフレームの内蔵メモリのマウント
    sudo mount -t vfat ${device} ${mpoint}

#マウントチェック
    Check=`df | grep -c ${mpoint}`
    if test $Check -eq 1 ; then
        break;
    fi
    sleep 10
done

#フォトフレームの内蔵メモリ内のイメー ジファイルをすべて削除
files=`find ${mpoint} -name "*.jpg" -print`
if test -n "$files" ; then
    sudo rm ${mpoint}/*.jpg
fi

#新しいイメージファイルをフォトフレームの内蔵メモリにコピー
sudo cp ${DstFile} ${mpoint}/
sync
sync
sync
sleep 5

#フォトフレームの内蔵メモリのアンマウ ント
sudo umount -l ${device}

#USB-SWのOFF
sudo sh -c "echo 0 > /sys/class/gpio/gpio${GPIO}/value"
sudo sh -c "echo ${GPIO} > /sys/class/gpio/unexport"

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




毎日イメージが変わるサイトを探していますが、他にはなかなか見つかりません。
こちらに タミル語のポータルサイトが有り、毎日イメージが変わります。
どうもその日の何かの時間帯などを公開しているみたいですが、さっぱり意味が分かりません。

検索サイトとして知られているMicrosoft Bing Search Engineが毎日違う写真を公開しています。
こ ちらに詳しく紹介されていますが、Windowsの背景イメージを毎日切り替えるのが目的の様です。
サイトから写真をダウンロードしてWindowsとLinuxの背景に設定するpythonコードがこちらに公開されています。

次回は、もう1例、イメージファイルを抜き出して表示する方法を紹介します。