You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
stashr_image_thumbnailer/thumbnailer.py

153 lines
4.2 KiB

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""-------------------------------------------------------------------------------------------
-- IMPORTS
-------------------------------------------------------------------------------------------"""
""" --- PYTHON IMPORTS --- """
import os, pathlib, shutil
""" --- STASHR CORE IMPORTS --- """
from stashr import log, folders, utils
""" --- STASHR PLUGIN IMPORTS --- """
from . import database
from .config import thumbconfig
""" --- STASHR PLUGIN DEPENDENCY IMPORTS --- """
try:
from PIL import Image
except:
utils.install_package('pillow')
from PIL import Image
""" --- CREATE LOGGER --- """
logger = log.stashr_logger(__name__)
"""-------------------------------------------------------------------------------------------
-- THUMBNAILER FUNCTIONS
-------------------------------------------------------------------------------------------"""
def get_images():
stored_images = database.session \
.query(database.Images) \
.all()
stored_images = database.ImagesSchema(many=True).dump(stored_images)
new_images = []
existing_images = []
images_folder = folders.StashrFolders().images_folder()
subdirs = os.scandir(images_folder)
for subdir in subdirs:
files = os.scandir(os.path.join(images_folder, subdir))
for image in files:
existing_images.append(image)
for item in existing_images:
if not any(path['image_path'] == item.path for path in stored_images):
new_image = database.Images(
image_type = pathlib.Path(item.path).parent.name,
image_type_id = pathlib.Path(item.path).stem,
image_filename = item.name,
image_path = item.path,
)
new_images.append(new_image)
database.session.bulk_save_objects(new_images)
database.session.commit()
def get_image_stats():
missing_stats = database.session \
.query(database.Images) \
.filter(database.Images.image_original_size == None) \
.all()
try:
for image in missing_stats:
with Image.open(image.image_path) as img:
width, height = img.size
image.image_original_width = width
image.image_original_height = height
image.image_original_size = pathlib.Path(image.image_path).stat().st_size
database.session.merge(image)
except Exception as e:
logger.error(e)
database.session.commit()
def process_images():
non_processed = database.session \
.query(database.Images) \
.filter(database.Images.image_processed == False) \
.all()
for image in non_processed:
thumbnail = pathlib.Path(new_process_image(image))
if thumbnail.stat().st_size == 0:
thumbnail.unlink()
continue
if thumbconfig['THUMBNAILER']['save_original_file']:
backup_original_image(image.image_path)
thumbnail.replace(image.image_path)
image.image_processed = True
image.image_processed_size = pathlib.Path(image.image_path).stat().st_size
database.session.merge(image)
database.session.commit()
def new_process_image(image):
max_width = thumbconfig['THUMBNAILER']['max_width']
quality = thumbconfig['THUMBNAILER']['quality']
ratio = image.image_original_height/image.image_original_width
size = (max_width, int(max_width*ratio))
thumbnail_file = os.path.join(
pathlib.Path(image.image_path).parent,
f'{pathlib.Path(image.image_path).stem}-thumbnail.jpg'
)
try:
with Image.open(image.image_path) as img:
img.thumbnail(size)
img.save(thumbnail_file, quality=quality)
finally:
return thumbnail_file
def backup_original_image(original_file_path):
original_file_path = pathlib.Path(original_file_path)
backup_folder = os.path.join(
folders.StashrFolders().backup_folder(),
'images',
original_file_path.parent.name
)
if not os.path.isdir(backup_folder):
os.makedirs(backup_folder)
backup_file = pathlib.Path(os.path.join(
backup_folder,
original_file_path.name
))
shutil.copy(original_file_path, backup_file)