neko-image-gallery / scripts /local_create_thumbnail.py
eggacheb's picture
Upload 97 files
21db53c verified
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)