From 710eb274ed24eb98e91d84b671b7e5cab154e61e Mon Sep 17 00:00:00 2001 From: "a.gorbunov" Date: Mon, 13 Jan 2020 10:19:47 +0300 Subject: [PATCH] remove debug info. Cleanup code. Set default quality --- .../commands/news_optimize_images.py | 50 ++++++++----------- apps/utils/methods.py | 2 +- 2 files changed, 23 insertions(+), 29 deletions(-) diff --git a/apps/news/management/commands/news_optimize_images.py b/apps/news/management/commands/news_optimize_images.py index ee93061a..7e1de7e1 100644 --- a/apps/news/management/commands/news_optimize_images.py +++ b/apps/news/management/commands/news_optimize_images.py @@ -1,23 +1,16 @@ # coding=utf-8 from django.core.management.base import BaseCommand -from django.conf import settings -from utils.methods import get_url_images_in_text, get_page_size_by_url +from utils.methods import get_url_images_in_text, get_image_meta_by_url from news.models import News from sorl.thumbnail import get_thumbnail class Command(BaseCommand): - SORL_THUMBNAIL_ALIASES = 'news_description' IMAGE_MAX_SIZE_IN_BYTES = 1048576 # ~ 1mb + IMAGE_QUALITY_PERCENTS = 50 def add_arguments(self, parser): - parser.add_argument( - '-a', - '--alias', - default=self.SORL_THUMBNAIL_ALIASES, - help='Ключ для параметров оптимизации', - ) parser.add_argument( '-s', '--size', @@ -25,11 +18,18 @@ class Command(BaseCommand): help='Максимальный размер файла в байтах', type=int ) + parser.add_argument( + '-q', + '--quality', + default=self.IMAGE_QUALITY_PERCENTS, + help='Качество изображения', + type=int + ) - def optimize(self, text, alias, max_size): + def optimize(self, text, max_size, max_quality): """optimize news images""" for image in get_url_images_in_text(text): - size, width, height = get_page_size_by_url(image) + size, width, height = get_image_meta_by_url(image) if size < max_size: continue @@ -40,7 +40,8 @@ class Command(BaseCommand): optimized_image = get_thumbnail( file_=image, geometry_string=f'{width}x{height}', - upscale=False + upscale=False, + quality=max_quality ).url text = text.replace(image, optimized_image) self.stdout.write(self.style.SUCCESS(f'Optimized {image} -> {optimized_image}\n' @@ -49,21 +50,14 @@ class Command(BaseCommand): return text def handle(self, *args, **options): - alias = options['alias'] size = options['size'] + quality = options['quality'] - if alias not in settings.SORL_THUMBNAIL_ALIASES: - self.stdout.write(self.style.ERROR(f'{alias} not found in alias')) - return - - self.optimize('https://upload.wikimedia.org/wikipedia/commons/b/b9/Pizigani_1367_Chart_1MB.jpg', - 'news_description', size) - - # for news in News.objects.all(): - # if not isinstance(news.description, dict): - # continue - # news.description = { - # locale: self.optimize(text, alias, size) - # for locale, text in news.description.items() - # } - # news.save() + for news in News.objects.all(): + if not isinstance(news.description, dict): + continue + news.description = { + locale: self.optimize(text, size, quality) + for locale, text in news.description.items() + } + news.save() diff --git a/apps/utils/methods.py b/apps/utils/methods.py index 095b406f..45f15c58 100644 --- a/apps/utils/methods.py +++ b/apps/utils/methods.py @@ -177,7 +177,7 @@ def get_url_images_in_text(text): """Find images urls in text""" return re.findall(r'(?:http:|https:)?//.*\.(?:png|jpg|svg)', text) -def get_page_size_by_url(url) -> (int, int, int): +def get_image_meta_by_url(url) -> (int, int, int, str): """Returns image size (bytes, width, height)""" image_raw = requests.get(url) image = Image.open(BytesIO(image_raw.content))