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

172 wiersze
4.4 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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)