From 52057c0cd584f8f91a618f2df5daf0228b71714b Mon Sep 17 00:00:00 2001 From: dm1sh Date: Tue, 29 Jun 2021 20:12:52 +0500 Subject: [PATCH] Some code refactors --- app/epub.py | 67 +++++++++++++++++++++++++++++------------------------ app/main.py | 16 ++++++++----- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/app/epub.py b/app/epub.py index f79c5b3..473d611 100644 --- a/app/epub.py +++ b/app/epub.py @@ -7,53 +7,60 @@ from ebooklib import epub from tempfile import SpooledTemporaryFile -async def epub2html(file: SpooledTemporaryFile): +async def epub2html(file: SpooledTemporaryFile) -> str: """ Splits epub to tokens and joins them to one html file """ - tokens = await epub_to_tokens(file) - ... - # TODO: join tokens to HTML - html_content = "" - ... - return html_content + try: + + tokens = await epub_to_tokens(file) + ... + # TODO: join tokens to HTML + html_content = "" + ... + return html_content + + except Exception as e: + return "Error! Wrong epub file format: " + str(e) async def epub_to_tokens(file: SpooledTemporaryFile) -> dict[str, str]: - + """ Passes file content to ebooklib library and parses epub tokens into dict of the following format: "\": "\" Where file content is either plain text for xhtml or base64 encoded data for other formats, prepared for embeding to html - """ - + + tokens = {"metadata": {"test"}} + async with aiof.tempfile.NamedTemporaryFile() as tmp: - await tmp.write(file.read()) - await tmp.seek(0) - content = await tmp.read() - try: - book = epub.read_epub(tmp.name) - tokens = {} - for item in book.get_items(): - item_type = item.get_type() - if item_type in (ebooklib.ITEM_COVER, ebooklib.ITEM_IMAGE, ebooklib.ITEM_STYLE, ebooklib.ITEM_VIDEO): - name = item.get_name() - media_type = item.media_type - b64_content = b64encode(item.get_content()).decode() + book = epub.read_epub(tmp.name) + for item in book.get_items(): - tokens[name] = f'data:{media_type};base64,{b64_content}' - elif item_type == ebooklib.ITEM_DOCUMENT: - name = item.get_name() - content = item.get_content() + item_type = item.get_type() + name = item.get_name() + content = item.get_content() - tokens[name] = content - return tokens - except Exception as e: - return 'Error! Wrong epub file format: ' + str(e) + if item_type == ebooklib.ITEM_DOCUMENT: + tokens[name] = content + + elif item_type in ( + ebooklib.ITEM_COVER, + ebooklib.ITEM_IMAGE, + ebooklib.ITEM_STYLE, + ebooklib.ITEM_VIDEO, + ebooklib.ITEM_VECTOR, + ): + media_type = item.media_type + b64_content = b64encode(content).decode() + + tokens[name] = f"data:{media_type};base64,{b64_content}" + + return tokens diff --git a/app/main.py b/app/main.py index 01158cd..ca6eef4 100644 --- a/app/main.py +++ b/app/main.py @@ -5,16 +5,20 @@ from .epub import epub2html app = FastAPI() -@app.get('/') + +@app.get("/") def root(): return "Hello, World!" -@app.post('/uploadfile/', ) + +@app.post( + "/uploadfile/", +) async def create_upload_file(file: UploadFile = File(...)): - if file.filename.endswith('.epub'): + if file.filename.endswith(".epub"): content = await epub2html(file.file) - elif file.filename.endswith('.fb2'): + elif file.filename.endswith(".fb2"): content = await fb22html(file.file) else: - content = 'Error! Unsupported file type' - return HTMLResponse(content=content) \ No newline at end of file + content = "Error! Unsupported file type" + return HTMLResponse(content=content)