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() # Here path maybe either local path or pure path 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 # generate thumbnail max size 256*256 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) # update payload 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)