Example #1
0
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
Example #2
0
    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)
Example #3
0
 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,
     })
Example #4
0
    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')
Example #5
0
 def cover_url(self):
     return image_resize(self.cover, ImageKeyType.MANGA_COVER, self.id)
Example #6
0
 def avatar_url(self):
     return image_resize(self.avatar, ImageKeyType.ACCOUNT_AVATAR, self.id)