Skip to content

Commit

Permalink
Switching from using JPEG to JSON files
Browse files Browse the repository at this point in the history
  • Loading branch information
thirdr committed Mar 1, 2023
1 parent 45a1289 commit 0cec01c
Showing 1 changed file with 57 additions and 22 deletions.
79 changes: 57 additions & 22 deletions micropython/examples/inky_frame/inkylauncher/random_joke.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import gc
import random
import jpegdec
from urllib import urequest
from ujson import load
import qrcode

gc.collect() # We're really gonna need that RAM!

Expand All @@ -13,19 +14,39 @@
FILENAME = "random-joke.jpg"

JOKE_IDS = "https://pimoroni.github.io/feed2image/jokeapi-ids.txt"
JOKE_IMG = "https://pimoroni.github.io/feed2image/jokeapi-{}-{}x{}.jpg"
JOKE_IMG = "https://pimoroni.github.io/feed2image/jokeapi-{}.json"

UPDATE_INTERVAL = 60

gc.collect() # Claw back some RAM!


# We don't have the RAM to store the list of Joke IDs in memory.
# the first line of `jokeapi-ids.txt` is a COUNT of IDs.
# Grab it, then pick a random line between 0 and COUNT.
# Seek to that line and ...y'know... there's our totally random joke ID

joke = []


def measure_qr_code(size, code):
w, h = code.get_size()
module_size = int(size / w)
return module_size * w, module_size


def draw_qr_code(ox, oy, size, code):
size, module_size = measure_qr_code(size, code)
graphics.set_pen(1)
graphics.rectangle(ox, oy, size, size)
graphics.set_pen(0)
for x in range(size):
for y in range(size):
if code.get_module(x, y):
graphics.rectangle(ox + x * module_size, oy + y * module_size, module_size, module_size)


def update():
global joke

try:
socket = urequest.urlopen(JOKE_IDS)
Expand All @@ -49,34 +70,48 @@ def update():

print("Random joke ID: {}".format(random_joke_id))

url = JOKE_IMG.format(random_joke_id, WIDTH, HEIGHT)
url = JOKE_IMG.format(random_joke_id)

socket = urequest.urlopen(url)
gc.collect()

# Stream the image data from the socket onto disk in 1024 byte chunks
# the 600x448-ish jpeg will be roughly ~24k, we really don't have the RAM!
data = bytearray(1024)
with open(FILENAME, "wb") as f:
while True:
if socket.readinto(data) == 0:
break
f.write(data)
socket.close()
del data
gc.collect() # We really are tight on RAM!
# Grab the data
try:
socket = urequest.urlopen(url)
gc.collect()
j = load(socket)
socket.close()
joke = j
del j
gc.collect()
except OSError as e:
print(e)


def draw():
jpeg = jpegdec.JPEG(graphics)
gc.collect() # For good measure...

code = qrcode.QRCode()
graphics.set_pen(1)
graphics.clear()

try:
jpeg.open_file(FILENAME)
jpeg.decode()
except OSError:
if joke:
if joke['type'] == "single":
graphics.set_pen(4)
graphics.text(joke['joke'], 10, 10, WIDTH - 75, 5)
if joke['type'] == "twopart":
graphics.set_pen(4)
graphics.text(joke['setup'], 10, 10, WIDTH - 75, 5)
graphics.set_pen(3)
graphics.text(joke['delivery'], 10, 290, WIDTH - 75, 5)

graphics.set_pen(0)
# Donate link QR
code.set_text("https://github.com/sponsors/Sv443")
draw_qr_code(WIDTH - 75, HEIGHT - 75, 75, code)

graphics.text("curated by jokeapi.dev", 10, HEIGHT - 15, WIDTH, 1)
graphics.text("donate <3", WIDTH - 65, HEIGHT - 12, WIDTH, 1)

else:
graphics.set_pen(4)
graphics.rectangle(0, (HEIGHT // 2) - 20, WIDTH, 40)
graphics.set_pen(1)
Expand Down

0 comments on commit 0cec01c

Please sign in to comment.