media.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import io
  2. from PIL import Image
  3. from django.core.files.images import ImageFile
  4. from .utils import get_file_hash
  5. IMAGE_TYPES = ("image/gif", "image/png", "image/jpeg", "image/bmp", "image/webp")
  6. THUMBNAIL_SIZE = (32, 32)
  7. def create_media(theme, media):
  8. if media_exists(theme, media):
  9. delete_media(theme, media)
  10. if media_is_image(media):
  11. save_image(theme, media)
  12. else:
  13. save_media(theme, media)
  14. def media_exists(theme, media):
  15. return theme.media.filter(name=media.name).exists()
  16. def delete_media(theme, media):
  17. theme.media.get(name=media.name).delete()
  18. def media_is_image(image):
  19. return image.content_type in IMAGE_TYPES
  20. def save_image(theme, image):
  21. try:
  22. img = Image.open(image.file)
  23. except Exception: # pylint: disable=broad-except
  24. return
  25. else:
  26. width, height = img.size
  27. theme.media.create(
  28. name=image.name,
  29. file=image,
  30. hash=get_file_hash(image),
  31. type=image.content_type,
  32. width=width,
  33. height=height,
  34. size=image.size,
  35. thumbnail=get_image_thumbnail(img, image.name),
  36. )
  37. img.close()
  38. def get_image_thumbnail(image, src_name):
  39. img = image.copy()
  40. img.thumbnail(THUMBNAIL_SIZE)
  41. file = io.BytesIO()
  42. img.save(file, format="png")
  43. img.close()
  44. filename = ".".join(src_name.split(".")[:1])
  45. return ImageFile(file, name="thumb_%s.png" % filename)
  46. def save_media(theme, media):
  47. theme.media.create(
  48. name=media.name,
  49. file=media,
  50. hash=get_file_hash(media),
  51. type=media.content_type,
  52. size=media.size,
  53. )