aerkalov/ebooklib

Generated Ebook throws error when trying to read it with ebook readers

Altair2169 opened this issue · 2 comments

While the epub is being generated successfully, but when I try to read the epub using readers like Calibre or Sigil. They throw errors like certain files are missing.

Here's my code to generate the epub file:


book = epub.EpubBook()
book.set_title(novelName)
book.set_language("en")
book.set_cover('temp.jpg', content=open('temp.jpg','rb').read())
book.set_identifier("test")

for i in authorNames:
    book.add_author(i)
for i in range(1):
    driver.get(chapterLinks[i])
    try:
        content=driver.find_element_by_id('chr-content').get_attribute("innerHTML")
        time.sleep(5)
    except Exception as e:
        driver.close()
        driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)
        driver.get(chapterLinks[i])
        content=driver.find_element_by_id('chr-content').get_attribute("innerHTML")
        time.sleep(5)
        
    soup = BeautifulSoup(content)
    ads=soup.find("div", class_="ads-holder")
    if(ads!=None):
        ads.decompose()
    print(chapterNames[i], chapterLinks[i])
    chapterName=chapterNames[i].replace("-","")
    c=epub.EpubHtml(title=chapterName,
                   file_name='{}.xhtml'.format(chapterName),
                   lang='en')
    c.set_content(str(soup).encode('utf-8'))
    book.add_item(c)
    chapterList.append(c)

book.toc = chapterList
book.spine = chapterList
book.add_item(epub.EpubNcx())
book.add_item(epub.EpubNav())
epub.write_epub('test.epub', book)

and here are the errors:

Calibre :

calibre, version 5.20.0
ERROR: Loading book failed: Failed to open the book at C:\Users\xxxxx\Documents\Visual Studio 2019\PersonalProjects\Novel Grabber\test.epub. Click "Show details" for more info.

Failed to convert book: C:\Users\xxxxx\Documents\Visual Studio 2019\PersonalProjects\Novel Grabber\test.epub with error:
InputFormatPlugin: EPUB Input running
on C:\Users\xxxxx\Documents\Visual Studio 2019\PersonalProjects\Novel Grabber\test.epub
Failed to run pipe worker with command: from calibre.srv.render_book import viewer_main; viewer_main()
Traceback (most recent call last):
  File "runpy.py", line 194, in _run_module_as_main
  File "runpy.py", line 87, in _run_code
  File "site.py", line 82, in <module>
  File "site.py", line 77, in main
  File "site.py", line 49, in run_entry_point
  File "calibre\utils\ipc\worker.py", line 197, in main
  File "<string>", line 1, in <module>
  File "calibre\srv\render_book.py", line 824, in viewer_main
  File "calibre\srv\render_book.py", line 815, in render_for_viewer
  File "calibre\srv\render_book.py", line 793, in render
  File "calibre\srv\render_book.py", line 601, in process_exploded_book
  File "calibre\srv\render_book.py", line 604, in <setcomp>
  File "calibre\ebooks\oeb\polish\container.py", line 561, in has_name_and_is_not_empty
  File "genericpath.py", line 50, in getsize
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'C:\\Users\\xxxxxx\\AppData\\Local\\calibre-cache\\ev2\\t\\c0-vdo66nim\\EPUB\\Chapter 2  '

Sigil:

Files exist in epub that are not listed in manifest, they will be ignored

Hard to say but I would say that this is the problem:

    c=epub.EpubHtml(title=chapterName,
                   file_name='{}.xhtml'.format(chapterName),
                   lang='en')

I assume the chapterName should be more filesystem friendly with out space, unicode characters and etc. Specs does not allow some of it but also some readers don't know how to handle it. Do something like:

file_name='{}.xhtml'.format(urllib.parse.quote(chapterName))

yea that was the problem, thanks!