def process_images(manga, file_list, user): # TODO: handle maximum total size errors = [] manga_page_list = [] process_list = [] page_num = MangaPage.objects.filter(manga=manga).count() for i, f in enumerate(file_list, start=1): if page_num >= MANGA_PAGE_LIMIT: errors.append(_('There are currently {} images; All other uploaded image files were ignored.').format(MANGA_PAGE_LIMIT)) break if f.size > MAX_IMAGE_FILE_SIZE: errors.append(_('{} is over 10MB in size.').format(f.name)) continue try: Image.open(f).verify() f.seek(0) except Exception as e: errors.append(_('{} failed to verify as an image file.').format(f.name)) continue im = Image.open(f) if im.format not in SUPPORTED_IMAGE_FORMATS: errors.append(_('{} is not a supported image type.').format(f.name)) continue if im.size[0] > MAX_IMAGE_DIMENSION[0] or im.size[1] > MAX_IMAGE_DIMENSION[1]: errors.append(_('{} is larger than 8000x8000 pixels.').format(f.name)) continue manga_page = MangaPage( manga=manga, page=page_num+i, image=f, name=f.name[:100], double=im.size[0] > im.size[1], ) manga_page_list.append(manga_page) if not manga.cover: manga.cover = f manga.save(updated_by=user) process_list.append((manga.cover.path, ImageKeyType.MANGA_COVER, manga.id)) MangaPage.objects.bulk_create(manga_page_list) # pre-generate image cache for speed manga_page_list = MangaPage.objects.filter(manga=manga, page__in=[mp.page for mp in manga_page_list]) for mp in manga_page_list: image_key_type = mp.double and ImageKeyType.MANGA_PAGE_DOUBLE or ImageKeyType.MANGA_PAGE process_list.append((mp.image.path, image_key_type, mp.id)) process_list.append((mp.image.path, ImageKeyType.MANGA_THUMB, mp.id)) for args in process_list: image_resize(*args) return errors
def __init__(self, user, *args, **kwargs): super().__init__(*args, **kwargs) self.user = user self.messages = [] for form in self: mp = form.instance mp.image_thumbnail_url = image_resize(mp.image, ImageKeyType.MANGA_THUMB, mp.id)
def get(self, request, id, slug): manga = self.get_manga_for_view(id) manga_page_list = manga.mangapage_set.all() for mp in manga_page_list: mp.image_thumbnail_url = image_resize(mp.image, ImageKeyType.MANGA_THUMB, mp.id) return self.render_to_response({ 'manga': manga, 'manga_page_list': manga_page_list, })
def get_payload(self, manga_page_list): """ returns a base 64 encoded json dump of the data needed for manga page """ page_list = [] for page in manga_page_list: key_type = page.double and ImageKeyType.MANGA_PAGE_DOUBLE or ImageKeyType.MANGA_PAGE page_list.append({ 'double': page.double, 'page': page.page, 'url': image_resize(page.image, key_type, page.id), }) payload = json.dumps({'page_list': page_list}) payload = payload.encode('utf-8') payload = base64.b64encode(payload) return payload.decode('utf-8')
def cover_url(self): return image_resize(self.cover, ImageKeyType.MANGA_COVER, self.id)
def avatar_url(self): return image_resize(self.avatar, ImageKeyType.ACCOUNT_AVATAR, self.id)