aboutsummaryrefslogtreecommitdiff
path: root/src/new/command.py
blob: fe706c208da9062b582fc5dcc0ead298e1e89bb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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)