aboutsummaryrefslogtreecommitdiff
path: root/src/book_store.py
diff options
context:
space:
mode:
authorJoris Guyonvarch2025-12-26 18:41:26 +0100
committerJoris Guyonvarch2025-12-27 20:41:44 +0100
commita110c200e86d2325af07167531fac0f61d9681a0 (patch)
tree90e843f915a2e153ba735849afd83710d90560bf /src/book_store.py
parenta26d92ad5055fa057647158eb79511e7b1841162 (diff)
Switch to GUI to manage the library
Allow to regroup the CLI and the view into one unique tool.
Diffstat (limited to 'src/book_store.py')
-rw-r--r--src/book_store.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/book_store.py b/src/book_store.py
new file mode 100644
index 0000000..93836c7
--- /dev/null
+++ b/src/book_store.py
@@ -0,0 +1,102 @@
+import nanoid
+import os
+from PIL import Image
+import pathlib
+import shutil
+import glob
+import logging
+
+import src.db as db
+
+logger = logging.getLogger(__name__)
+
+def store(library, conn, data, cover, books, book = None):
+ book_id = book['id'] if book else nanoid.generate()
+ directory = f'{library}/{book_id}'
+
+ try:
+ os.makedirs(directory, exist_ok=True)
+
+ save_cover(cover, directory)
+
+ if book:
+ if not already_exist(directory, books) or has_delete(directory, books):
+ update_books(directory, books)
+ else:
+ create_books(directory, books)
+
+ if book:
+ db.update_book(conn, book_id, data)
+ else:
+ db.create_book(conn, book_id, data)
+
+ return book_id
+ except Exception as err:
+ if book:
+ print(f'Error updating book: {err}')
+ else:
+ print(f'Error creating book: {err}')
+ shutil.rmtree(directory, ignore_errors=True)
+ db.delete_book(conn, book_id)
+ return None
+
+def already_exist(directory, books):
+ for path, name in books.items():
+ ext = path.suffix
+ dest = f'{directory}/{name}{ext}'
+ if not dest == str(path):
+ return False
+ return True
+
+def has_delete(directory, books):
+ new_paths = books.keys()
+ for path in glob.glob(f'{directory}/*'):
+ if not path in new_paths:
+ return True
+ return False
+
+def update_books(directory, books):
+ try:
+ tmp_dir = f'{directory}/tmp'
+ os.makedirs(tmp_dir, exist_ok=True)
+ # Copy books to tmp directory
+ for i, path in enumerate(books.keys()):
+ dest = f'{tmp_dir}/{i}'
+ logger.info('Copying %s to %s', path, dest)
+ shutil.copyfile(path, dest)
+ # Remove existing files (except cover.png and tmp)
+ for path in glob.glob(f'{directory}/*'):
+ bn = os.path.basename(path)
+ if bn not in ['cover.png', 'cover-min.png', 'tmp']:
+ logger.info('Removing %s', path)
+ pathlib.Path.unlink(path)
+ # Move from tmp to directory
+ for i, path in enumerate(books.keys()):
+ src = f'{tmp_dir}/{i}'
+ ext = path.suffix
+ name = books[path]
+ dest = f'{directory}/{name}{ext}'
+ logger.info('Copying %s to %s', src, dest)
+ shutil.copyfile(src, dest)
+ finally:
+ # Remove tmp
+ shutil.rmtree(f'{directory}/tmp', ignore_errors=True)
+
+def create_books(directory, books):
+ for path, name in books.items():
+ ext = path.suffix
+ shutil.copy(path, f'{directory}/{name}{ext}')
+
+# Save as PNG
+def save_cover(image, directory):
+ image = image.convert('RGB')
+ image.save(f'{directory}/cover.png', 'Png', optimize=True, quality=85)
+ image_min = resize(image, 200)
+ image_min.save(f'{directory}/cover-min.png', 'Png', optimize=True, quality=85)
+
+def resize(image, new_width):
+ width, height = image.size
+ if width > new_width:
+ image = image.resize((new_width, int(new_width * height / width)), Image.LANCZOS)
+ return image
+