X-Git-Url: https://git.mdrn.pl/librarian.git/blobdiff_plain/74ca1f5739a7d7af361c67d0aa5748edf9adb57b..d4beaf40d156e3aabb4c8f7e6b0d034d9d0d5ad8:/librarian/cover.py diff --git a/librarian/cover.py b/librarian/cover.py index 08a5748..02d76f9 100644 --- a/librarian/cover.py +++ b/librarian/cover.py @@ -3,6 +3,7 @@ # This file is part of Librarian, licensed under GNU Affero GPLv3 or later. # Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. # +import re import Image, ImageFont, ImageDraw, ImageFilter from librarian import get_resource @@ -33,9 +34,10 @@ class TextBox(object): """Skips some vertical space.""" self.height += height - def text(self, text, color='#000', font=None, line_height=20, + def text(self, text, color='#000', font=None, line_height=20, shadow_color=None): """Writes some centered text.""" + text = re.sub(r'\s+', ' ', text) if shadow_color: if not self.shadow_img: self.shadow_img = Image.new('RGBA', self.img.size) @@ -154,7 +156,7 @@ class Cover(object): self.author_lineskip, self.author_shadow) text_img = tbox.image() img.paste(text_img, (self.author_margin_left, top), text_img) - + top += text_img.size[1] + self.title_top tbox = TextBox( self.width - self.title_margin_left - self.title_margin_right, @@ -181,6 +183,8 @@ class Cover(object): class WLCover(Cover): """Default Wolne Lektury cover generator.""" + width = 600 + height = 833 uses_dc_cover = True author_font = ImageFont.truetype( get_resource('fonts/JunicodeWL-Regular.ttf'), 20) @@ -192,23 +196,23 @@ class WLCover(Cover): bar_width = 35 background_color = '#444' author_color = '#444' - default_background = get_resource('res/shaireproductions-4945819544-cc-by.jpg') + default_background = get_resource('res/cover.png') format = 'JPEG' - epochs = { - u'Starożytność': 0, - u'Średniowiecze': 30, - u'Renesans': 60, - u'Barok': 90, - u'Oświecenie': 120, - u'Romantyzm': 150, - u'Pozytywizm': 180, - u'Modernizm': 210, - u'Dwudziestolecie międzywojenne': 240, - u'Współczesność': 270, + epoch_colors = { + u'Starożytność': '#9e3610', + u'Średniowiecze': '#564c09', + u'Renesans': '#8ca629', + u'Barok': '#a6820a', + u'Oświecenie': '#f2802e', + u'Romantyzm': '#db4b16', + u'Pozytywizm': '#961060', + u'Modernizm': '#7784e0', + u'Dwudziestolecie międzywojenne': '#3044cf', + u'Współczesność': '#06393d', } - def __init__(self, book_info): + def __init__(self, book_info, image_cache=None): super(WLCover, self).__init__(book_info) self.kind = book_info.kind self.epoch = book_info.epoch @@ -216,7 +220,16 @@ class WLCover(Cover): from urllib2 import urlopen from StringIO import StringIO - bg_src = urlopen(book_info.cover_url) + url = book_info.cover_url + bg_src = None + if image_cache: + from urllib import quote + try: + bg_src = urlopen(image_cache + quote(url, safe="")) + except: + pass + if bg_src is None: + bg_src = urlopen(url) self.background_img = StringIO(bg_src.read()) bg_src.close() else: @@ -226,14 +239,11 @@ class WLCover(Cover): return self.author.upper() def image(self): - from colorsys import hsv_to_rgb - img = Image.new('RGB', (self.width, self.height), self.background_color) draw = ImageDraw.Draw(img) - if self.epoch in self.epochs: - epoch_color = tuple(int(255 * c) for c in hsv_to_rgb( - float(self.epochs[self.epoch]) / 360, .7, .7)) + if self.epoch in self.epoch_colors: + epoch_color = self.epoch_colors[self.epoch] else: epoch_color = '#000' draw.rectangle((0, 0, self.bar_width, self.height), fill=epoch_color) @@ -257,12 +267,12 @@ class WLCover(Cover): cut = (resized[0] - trg_size[0]) / 2 src = src.resize(resized) src = src.crop((cut, 0, src.size[0] - cut, src.size[1])) - + img.paste(src, (self.bar_width, 0)) del src box = TextBox(self.title_box_width, self.height, padding_y=20) - box.text(self.pretty_author(), + box.text(self.pretty_author(), font=self.author_font, line_height=self.author_lineskip, color=self.author_color, @@ -270,7 +280,7 @@ class WLCover(Cover): ) box.skip(10) - box.draw.line((75, box.height, 275, box.height), + box.draw.line((75, box.height, 275, box.height), fill=self.author_color, width=2) box.skip(15) @@ -292,9 +302,9 @@ class WLCover(Cover): # center box_top = (self.height - box_img.size[1]) / 2 - box_left = self.bar_width + (self.width - self.bar_width - + box_left = self.bar_width + (self.width - self.bar_width - box_img.size[0]) / 2 - draw.rectangle((box_left, box_top, + draw.rectangle((box_left, box_top, box_left + box_img.size[0], box_top + box_img.size[1]), fill='#fff') img.paste(box_img, (box_left, box_top), box_img)