goodread-phat/good_sprite.py
2018-08-28 22:12:10 -04:00

128 lines
3.4 KiB
Python

import datetime
import requests
import json
import os
import sys
from selenium import webdriver
from collections import defaultdict
from PIL import ImageFont, Image
import inkyphat
FAKE = True
text = Image.open("numbers.png")
text_mask = inkyphat.create_mask(text, [inkyphat.WHITE])
def print_digit(position, digit):
"""Print a single digit using the sprite sheet.
Each number is grabbed from the masked sprite sheet,
and then used as a mask to paste the desired color
onto Inky pHATs image buffer.
"""
o_x, o_y = position
num_margin = 2
num_width = 6
num_height = 7
s_x = num_margin + (digit * (num_width + num_margin))
sprite = text_mask.crop((s_x, 0, s_x + num_width, num_height))
inkyphat.paste(inkyphat.RED, (o_x, o_y), sprite)
def print_number(position, number):
"""Prints a number using the sprite sheet."""
for digit in str(number):
print_digit(position, int(digit))
position = (position[0] + 8, position[1])
def main():
pages = {'2014': 7375, '2015': 23508, '2016': 17696, '2017': 19706, '2018': 9388}
books = {"2018":33,"2017":64,"2016":47,"2015":75,"2014":19}
if not FAKE:
pages, books = get_goodreads_stats()
stats = get_stats(pages, books)
draw(stats)
def get_goodreads_stats():
payload = {
'email': os.environ.get('EMAIL'),
'password': os.environ.get('PASSW'),
}
LOGIN_URL= 'https://www.goodreads.com/user/sign_in'
driver = webdriver.PhantomJS()
driver.get(LOGIN_URL)
username = driver.find_element_by_id('user_email')
password = driver.find_element_by_id('user_password')
username.send_keys(payload['email'])
password.send_keys(payload['password'])
form = driver.find_element_by_name('sign_in')
form.submit()
driver.get('https://www.goodreads.com/review/stats/24381583#pages')
pages = driver.execute_script('return page_stats')
books = driver.execute_script('return year_stats')
return pages, books
def get_stats(pages, books):
size = 3
col_w, col_h = 50, 32
x_start, y_start = 60, 14
row_offsets = [0,5,0]
rows = ["year", "books", "pages"]
coords = defaultdict(list)
for column in range(0, size):
for row in range(0, len(rows)):
coords[rows[row]].append([
row_offsets[row] + x_start + (column*col_w),
y_start + (row*col_h),
])
_stats = []
for idx, year in enumerate(list(reversed(sorted(books.keys())))[:size]):
page_count = pages[year]
book_count = books[year]
_stats.append({
'year': [str(year), coords['year'][idx]],
'books': [str(book_count), coords['books'][idx]],
'pages': [str(page_count), coords['pages'][idx]],
})
return _stats
def draw(stats):
colour = 'red'
inkyphat.set_colour(colour)
inkyphat.set_border(inkyphat.WHITE)
inkyphat.set_image("./background.png")
inkyphat.show()
draw_row('year', stats, 12)
draw_row('books', stats, 18)
draw_row('pages', stats, 12)
inkyphat.show()
def draw_row(row, stats, size):
#font = ImageFont.truetype(inkyphat.fonts.PressStart2P, size)
font = ImageFont.truetype(inkyphat.fonts.FredokaOne, size)
#font = ImageFont.truetype(inkyphat.fonts.AmaticSC, size)
for year in stats:
count = year[row][0]
x,y = year[row][1]
print_number((x,y), count)
if __name__ == "__main__":
main()