使用 ebooklib 查看 epub 电子书目录

创建日期: 2024-07-31 17:38 | 作者: 风波 | 浏览次数: 14 | 分类: Python
# -*- coding: utf-8 -*-


import os
import sys
import ebooklib
from ebooklib import epub
import urllib.parse
import argparse


def parse_args():
    parser = argparse.ArgumentParser()
    #parser.add_argument(
    #        "--encoding",
    #        help="encoding code for html",
    #        type=str,
    #        default='utf-8'
    #        )
    parser.add_argument(
            "-s",
            action="store_true",
            help="show spine",
            default=False
            )
    parser.add_argument(
            "-d",
            action="store_true",
            help="show doc",
            default=False
            )
    parser.add_argument(
            "-t",
            action="store_true",
            help="show toc",
            default=False
            )
    parser.add_argument(
            "files",
            nargs='*',
            metavar='N',
            type=str,
            help="file list",
            default=''
            )
    args = parser.parse_args()
    return args


def show_toc(e, indent=0):
    if isinstance(e, epub.Section):
        print(' ' * indent, end='')
        print("{}-@-{}-@-".format(e.title, urllib.parse.unquote(e.href)))
        return None
    if isinstance(e, list) or isinstance(e, tuple):
        for d in e:
            print(" " * indent, end='')
            show_toc(d, indent + 1)
        return None
    if isinstance(e, epub.Link):
        print(" " * indent, end='')
        print("{}-@-{}-@-{}-@-".format(e.title, urllib.parse.unquote(e.href), e.uid))
        return None
    print("unknown type: {}".format(type(e)))
    raise Exception("unknown type: {}".format(type(e)))


def show_file(filename, args):
    book = epub.read_epub(filename)
    if args.s or not any([args.s, args.t, args.d]):
       print("spine ======================")
       for s in book.spine:
           print(s)

    if args.t or not any([args.s, args.t, args.d]):
       print("toc ======================")
       for t in book.toc:
           show_toc(t)

    if args.d or not any([args.s, args.t, args.d]):
        print("doc ======================")
        for d in book.get_items_of_type(ebooklib.ITEM_DOCUMENT):
            print(d.id, d.file_name, d)


def main(args):
    for filename in args.files:
        show_file(filename, args)


if "__main__" == __name__:
    args = parse_args()
    #filename = sys.argv[1]
    main(args)
14 浏览
9 爬虫
0 评论