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.
153 lines
4.2 KiB
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)
|
|
|