#!/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)