From c236facb4d4c277773c83f1a4ee85b48833d7e67 Mon Sep 17 00:00:00 2001 From: Joris Date: Sat, 16 Sep 2023 18:28:54 +0200 Subject: Add CLI command to insert book in library --- src/new/command.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/new/command.py (limited to 'src/new/command.py') diff --git a/src/new/command.py b/src/new/command.py new file mode 100644 index 0000000..fe706c2 --- /dev/null +++ b/src/new/command.py @@ -0,0 +1,94 @@ +import PIL.Image +import io +import os +import pathlib +import re +import requests +import shutil +import subprocess +import sys +import unicodedata +import urllib.request + +import new.reader as reader +import new.format as format + +def run(book_library, book_source=None): + + # Get data + + title = reader.required('Title') + subtitle = reader.optional('Subtitle') + authors = reader.non_empty_list('Authors') + author_sort = reader.required('Authors sorting') + genres = reader.non_empty_list('Genres') + year = reader.integer('Year') + lang = reader.choices('Lang', ['fr', 'en', 'de']) + summary = format.cleanup_text(reader.multi_line('Summary'), lang) + cover_url = reader.required('Cover url') + read = reader.choices('Read', ['Read', 'Unread', 'Reading', 'Stopped']) + + # Output paths + + author_path = format.path_part(author_sort) + title_path = format.path_part(title) + + library_path = '/home/joris/documents/books' + output_dir = f'{library_path}/{author_path}/{title_path}' + metadata_path = f'{output_dir}/metadata.toml' + cover_path = f'{output_dir}/cover.webp' + + if not book_source is None: + ext = format.extension(book_source) + book_path = f'{output_dir}/book{ext}' + book_source_dir = os.path.dirname(os.path.realpath(book_source)) + book_source_new = f'{book_source_dir}/{author_path}-{title_path}.mobi' + + # Metadata + + metadata = f"""title = "{title}" + subtitle = "{subtitle}" + authors = {format.format_list(authors)} + authorsSort = "{author_sort}" + genres = {format.format_list(genres)} + date = {year} + summary = \"\"\" + {summary} + \"\"\" + read = "{read}" + """ + + # Ask for confirmation + + print(f'About to create:\n\n- {metadata_path}\n- {cover_path}') + if not book_source is None: + print(f'- {book_path}') + print(f'\nAnd moving:\n\n {book_source},\n -> {book_source_new}.') + print() + + reader.confirm('OK?') + + # Create files + + pathlib.Path(output_dir).mkdir(parents=True, exist_ok=True) + download_cover(cover_url, cover_path) + with open(metadata_path, 'w') as f: + f.write(metadata) + if not book_path is None: + shutil.copyfile(book_source, book_path) + if format.extension(book_source) in ['mobi', 'azw3']: + os.rename(book_source, book_source_new) + else: + subprocess.run(['ebook-convert', book_source, book_source_new]) + os.remove(book_source) + +# Download cover as WEBP +def download_cover(url, path): + response = requests.get(url, headers={ 'User-Agent': 'python-script' }) + image = PIL.Image.open(io.BytesIO(response.content)) + width, height = image.size + if width > 300: + image = image.resize((300, int(300 * height / width)), PIL.Image.LANCZOS) + image = image.convert('RGB') + image.save(path, 'WEBP', optimize=True, quality=85) + -- cgit v1.2.3