goodread-phat/good_sprite.py

123 lines
3.2 KiB
Python
Raw Normal View History

2018-08-29 01:59:15 +00:00
import datetime
import requests
import json
import os
import sys
from selenium import webdriver
from collections import defaultdict
2018-08-29 02:05:53 +00:00
from PIL import ImageFont, Image
2018-08-29 01:59:15 +00:00
import inkyphat
FAKE = True
2018-08-29 02:04:39 +00:00
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))
2018-08-29 02:14:45 +00:00
inkyphat.paste(inkyphat.BLACK, (o_x, o_y), sprite)
2018-08-29 02:04:39 +00:00
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])
2018-08-29 01:59:15 +00:00
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):
2018-08-29 02:05:53 +00:00
size = 3
2018-08-29 02:08:47 +00:00
col_w, col_h = 50, 32
x_start, y_start = 60, 14
2018-08-29 01:59:15 +00:00
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")
2018-08-29 02:08:54 +00:00
2018-08-29 01:59:15 +00:00
draw_row('year', stats, 12)
draw_row('books', stats, 18)
draw_row('pages', stats, 12)
inkyphat.show()
def draw_row(row, stats, size):
for year in stats:
count = year[row][0]
x,y = year[row][1]
2018-08-29 02:04:39 +00:00
print_number((x,y), count)
2018-08-29 01:59:15 +00:00
if __name__ == "__main__":
main()