aboutsummaryrefslogtreecommitdiff
path: root/cli/new/command.py
diff options
context:
space:
mode:
authorJoris2023-09-17 12:23:47 +0200
committerJoris2023-09-17 12:23:47 +0200
commit1ebc55c72a1a17293bbf4ad86e0177a10a794750 (patch)
tree5fce0ea3a011ccbae85b0d3927f8ac33099585fb /cli/new/command.py
parentc236facb4d4c277773c83f1a4ee85b48833d7e67 (diff)
Make app packageable
Diffstat (limited to 'cli/new/command.py')
-rw-r--r--cli/new/command.py88
1 files changed, 88 insertions, 0 deletions
diff --git a/cli/new/command.py b/cli/new/command.py
new file mode 100644
index 0000000..9f5e5dc
--- /dev/null
+++ b/cli/new/command.py
@@ -0,0 +1,88 @@
+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)
+