import PIL.Image import cli.new.format as format import cli.new.reader as reader import io import os import pathlib import requests import shutil import subprocess def run(books_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) output_dir = f'{books_library}/{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)