summaryrefslogtreecommitdiff
path: root/modes.py
blob: b0e7848ebf8564b74e408fbb9fc659f9a9e75778 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import cups
import logging
import redis
import requests
import sys

from PIL import Image, ImageColor, ImageDraw, ImageFont
from datetime import datetime
from time import sleep


ROOT_URL = 'http://www.modes.me/prints'
BASE_IMAGE = 'base.jpg'
BASE_FONT = 'cutive.ttf'
MATRIX_PADDING = 3
MATRIX_SIZE = 9
MATRIX_PIXEL_SIZE = 80
MATRIX_OFFSET = ((1181 - (MATRIX_PIXEL_SIZE * MATRIX_SIZE)) / 2, 300)
PRINTER = 'Canon_iP7200_series'

logging.basicConfig(filename='modes.log', filemode='a', level=logging.INFO, format='%(asctime)-15s %(levelname)s %(message)s')
logging.getLogger('requests').setLevel(logging.WARNING)  # suppress requests stuff

r = redis.StrictRedis(host='localhost', port=6379, db=0)


class ModesPrinter(object):

    def __init__(self, imstr):
        username, d, dominants, matrix = imstr.split('|')
        self.username = username
        self.date = datetime.strptime(d, '%m%Y').date()
        self.dominants = [ImageColor.getrgb(x) for x in ('#' + dominants[:6], '#' + dominants[6:])]
        self.matrix = bin(int(matrix, 16))[2+MATRIX_PADDING:]
        self.filename = 'photos/{}_{}.jpg'.format(self.username, self.date.strftime('%Y_%m'))

    def _debug(self):
        print(self.username, self.date.month, self.date.year, self.dominants, self.matrix)

    def _draw_image_matrix(self):
        for y in range(MATRIX_SIZE):
            for x in range(MATRIX_SIZE):
                start = (
                    MATRIX_OFFSET[0] + (x * MATRIX_PIXEL_SIZE), 
                    MATRIX_OFFSET[1] + (y * MATRIX_PIXEL_SIZE)
                )
                end = (
                    start[0] + MATRIX_PIXEL_SIZE, 
                    start[1] + MATRIX_PIXEL_SIZE
                )
                fill = self.dominants[int(self.matrix[(y * MATRIX_SIZE) + x])]
                self.draw.rectangle([start, end], fill=fill)

    def _draw_image_text(self):
        font = ImageFont.truetype('cutive.ttf', 48)
        text = '@{} / {}'.format(self.username, self.date.strftime('%B %Y'))
        size = font.getsize(text)
        self.draw.text(((1181 / 2) - (size[0] / 2),1100), text, font=font, fill=(0,0,0))

    def draw_image(self):
        self.im = Image.open(BASE_IMAGE).convert('RGB')
        self.draw = ImageDraw.Draw(self.im)
        self._draw_image_matrix()
        self._draw_image_text()

    def save_image(self):
        self.im.save(self.filename)

    def print_image(self):
        conn = cups.Connection()
        conn.printFile(PRINTER, self.filename, 'title', {})

    def show_image(self):
        self.im.show()

    def process_image(self):
        self.draw_image()
        self.save_image()
        self.print_image()

    def test_image(self):
        self.draw_image()
        self.show_image()


def process_jobs(jobs):
    for job in jobs:
        jobkey = 'jobs:{}'.format(job['data'])
        if r.get(jobkey):
            logging.debug('Ignoring job {}'.format(job['data']))
        else:
            logging.info('Got job {}'.format(job['data']))
            ModesPrinter(job['data']).process_image()
            r.set(jobkey, '1', 60 * 5)

def loop():
    while True:
        try:
            res = requests.get(ROOT_URL)
            process_jobs(res.json())
        except Exception as e:
            logging.error('{}'.format(e))
        finally:
            sleep(10)

if __name__ == '__main__':
    if len(sys.argv) > 1 and sys.argv[1] == 'test':
        test = 'yuv.adm|062015|9A8D6D736489|eff51f2af82c06071120a'
        ModesPrinter(test).test_image()
    else:
        logging.info('Startup...')
        loop()