pimoroni-pico/micropython/examples/inky_frame/inky_frame_quote_of_the_day.py

172 lines
4.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import gc
import time
import ujson
import uasyncio
import WIFI_CONFIG
from urllib import urequest
from network_manager import NetworkManager
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME as DISPLAY # 5.7"
# from picographics import PicoGraphics, DISPLAY_INKY_FRAME_4 as DISPLAY # 4.0"
from picographics import PicoGraphics, DISPLAY_INKY_FRAME_7 as DISPLAY # 7.3"
ENDPOINT = "https://en.wikiquote.org/w/api.php?format=json&action=expandtemplates&prop=wikitext&text={{{{Wikiquote:Quote%20of%20the%20day/{3}%20{2},%20{0}}}}}"
MONTHNAMES = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
last_date = ""
def parse_qotd(text):
print(text)
text = text.split("\n")
author = text[8].split("|")[2][5:-4]
text = text[6][2:]
gc.collect()
return text, author
def status_handler(mode, status, ip):
print(mode, status, ip)
network_manager = NetworkManager(WIFI_CONFIG.COUNTRY, status_handler=status_handler)
gc.collect()
graphics = PicoGraphics(DISPLAY)
WIDTH, HEIGHT = graphics.get_bounds()
graphics.set_font("bitmap8")
gc.collect()
BADCHARS = {
"": "'",
"": "",
"": "..."
}
def display_quote(text, ox, oy, scale, wordwrap):
# Processing text is memory intensive
# so we'll do it one char at a time as we draw to the screen
line_height = 9 * scale
html_tag = ""
word = ""
extra_text = ""
space_width = graphics.measure_text(" ", scale=scale)
x = ox
y = oy
i = -1
while True:
if len(extra_text) == 0:
i += 1
if i >= len(text):
break
if len(extra_text) > 0:
char = extra_text[0]
extra_text = extra_text[1:]
else:
char = text[i]
if char in BADCHARS:
word += BADCHARS[char]
continue
# Unpick stuff like [[word]] and [[disambiguation|word]]
# and [[w:wikipedia_page|word]]
# test cases: July 8th 2022, July 12th 2022
if char == "[":
if text[i:i + 2] == "[[":
link = False
if text[i + 2:i + 4] == "w:":
link = True
i += 2
end = text[i:].index("]]")
if "|" in text[i + 2:i + end]:
parts = text[i + 2:i + end].split("|")
word = parts[1]
if not link:
extra_text = " (" + parts[0] + ")"
else:
word = text[i + 2:i + end]
i += end + 1
continue
if char == "&":
if text[i:i + 5] == "&":
word += "&"
i += 4
continue
if char == "<":
j = i + text[i:].index(">")
html_tag = text[i + 1:j].replace("/", "").strip()
i = j
continue
if char in (" ", "\n") or html_tag == "br":
w = graphics.measure_text(word, scale=scale)
if x + w > wordwrap or char == "\n" or html_tag == "br":
x = ox
y += line_height
graphics.text(word, x, y, scale=scale)
word = ""
html_tag = ""
x += w + space_width
continue
word += char
# Last word
w = graphics.measure_text(word, scale=scale)
if x + w > wordwrap:
x = ox
y += line_height
graphics.text(word, x, y, scale=scale)
while True:
gc.collect()
uasyncio.get_event_loop().run_until_complete(network_manager.client(WIFI_CONFIG.SSID, WIFI_CONFIG.PSK))
date = list(time.localtime())[:3]
date.append(MONTHNAMES[date[1] - 1])
if "{3} {2}, {0}".format(*date) == last_date:
time.sleep(60)
continue
url = ENDPOINT.format(*date)
print("Requesting URL: {}".format(url))
socket = urequest.urlopen(url)
j = ujson.load(socket)
socket.close()
text = j['expandtemplates']['wikitext']
del j
gc.collect()
text, author = parse_qotd(text)
print(text)
graphics.set_pen(1)
graphics.clear()
graphics.set_pen(0)
graphics.text("QoTD - {2} {3} {0:04d}".format(*date), 10, 10, scale=3)
display_quote(text, 10, 40, 2, wordwrap=WIDTH - 20)
graphics.text(author, 10, HEIGHT - 20, scale=2)
graphics.update()
gc.collect()
last_date = "{3} {2}, {0}".format(*date)
time.sleep(60)