123 lines
3.3 KiB
Python
123 lines
3.3 KiB
Python
import datetime
|
|
import os
|
|
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.BLACK, (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():
|
|
from selenium import webdriver
|
|
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
|
|
|
|
payload = {
|
|
'email': os.environ.get('EMAIL'),
|
|
'password': os.environ.get('PASSW'),
|
|
}
|
|
|
|
LOGIN_URL= 'https://www.goodreads.com/user/sign_in'
|
|
|
|
#driver = webdriver.Firefox(firefox_binary=FirefoxBinary("/usr/bin/firefox"))
|
|
print("before driver")
|
|
driver = webdriver.Firefox()
|
|
print("after driver")
|
|
driver.get(LOGIN_URL)
|
|
print("after login")
|
|
|
|
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')
|
|
print("Got stats from goodreads live:")
|
|
print(pages)
|
|
print(books)
|
|
return pages, books
|
|
|
|
def get_stats(pages, books):
|
|
size = 5
|
|
|
|
coords = defaultdict(list)
|
|
|
|
columns = ["year", "books", "pages"]
|
|
|
|
start_x, start_y = 12, 25
|
|
column_offset = [0,78,140]
|
|
year_offset = 15
|
|
_stats = []
|
|
|
|
for idy, year in enumerate(sorted(pages.keys(), key=lambda yr: -int(yr))):
|
|
row = {}
|
|
col_data = {'year':year, 'pages': pages[year], 'books': books[year]}
|
|
y = start_y + (year_offset * idy)
|
|
for idx, column in enumerate(columns):
|
|
x = start_x + column_offset[idx]
|
|
row[column] = (col_data[column], (x,y))
|
|
_stats.append(row)
|
|
return _stats
|
|
|
|
def draw(stats):
|
|
inkyphat.set_colour('red')
|
|
inkyphat.set_border(inkyphat.WHITE)
|
|
inkyphat.set_image("./background.png")
|
|
|
|
draw_row('year', stats)
|
|
draw_row('books', stats)
|
|
draw_row('pages', stats)
|
|
|
|
inkyphat.show()
|
|
|
|
def draw_row(row, stats):
|
|
for year in stats:
|
|
count = year[row][0]
|
|
x,y = year[row][1]
|
|
print_number((x,y), count)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|