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)