|
import io |
|
import uuid |
|
|
|
from PIL import Image |
|
from loguru import logger |
|
|
|
from app.Services.provider import ServiceProvider |
|
|
|
|
|
async def main(): |
|
services = ServiceProvider() |
|
await services.onload() |
|
|
|
count = 0 |
|
async for item in services.storage_service.active_storage.list_files("", '*.*', batch_max_files=1): |
|
item = item[0] |
|
count += 1 |
|
logger.info("[{}] Processing {}", str(count), str(item)) |
|
size = await services.storage_service.active_storage.size(item) |
|
if size < 1024 * 500: |
|
logger.warning("File size too small: {}. Skip...", size) |
|
continue |
|
try: |
|
if await services.storage_service.active_storage.is_exist(f'thumbnails/{item.stem}.webp'): |
|
logger.warning("Thumbnail for {} already exists. Skip...", item.stem) |
|
continue |
|
image_id = uuid.UUID(item.stem) |
|
except ValueError: |
|
logger.warning("Invalid file name: {}. Skip...", item.stem) |
|
continue |
|
try: |
|
imgdata = await services.db_context.retrieve_by_id(str(image_id)) |
|
except Exception as e: |
|
logger.error("Error when retrieving image {}: {}", image_id, e) |
|
continue |
|
try: |
|
img_byte = await services.storage_service.active_storage.fetch(item) |
|
img = Image.open(io.BytesIO(img_byte)) |
|
except Exception as e: |
|
logger.error("Error when opening image {}: {}", item, e) |
|
continue |
|
|
|
|
|
img.thumbnail((256, 256)) |
|
img_byte_arr = io.BytesIO() |
|
img.save(img_byte_arr, 'WebP', save_all=True) |
|
await services.storage_service.active_storage.upload(img_byte_arr.getvalue(), |
|
f'thumbnails/{str(image_id)}.webp') |
|
logger.success("Thumbnail for {} generated!", image_id) |
|
|
|
|
|
imgdata.thumbnail_url = await services.storage_service.active_storage.url(f'thumbnails/{str(image_id)}.webp') |
|
imgdata.local_thumbnail = True |
|
await services.db_context.updatePayload(imgdata) |
|
logger.success("Payload for {} updated!", image_id) |
|
|
|
logger.success("OK. Updated {} items.", count) |
|
|