使用 Notion 和 Python 制作家庭图书馆

我一直对如何最好地在我的电子图书馆中分发书籍感兴趣。 最后,我选择了这个选项,自动计算页数和其他好处。 我询问猫下所有感兴趣的人。

第 1 部分:Dropbox

我所有的书都在保管箱上。 我将所有内容分为 4 类:教科书、参考书、小说、非小说。 但我不会在桌子上添加参考书。

大多数书籍都是 .epub,其余的都是 .pdf。 也就是说,最终的解决方案必须以某种方式涵盖这两种选择。

我的读书之路是这样的:

/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub 

如果这本书是小说,则删除该类别(即上例中的“设计”)。

我决定不再使用 Dropbox API,因为我有他们的应用程序来同步文件夹。 也就是说,计划是这样的:我们从文件夹中取出书籍,通过字数计数器运行每本书,并将其添加到 Notion 中。

第 2 部分:添加一行

桌子本身应该看起来像这样。 注意:最好用拉丁文命名列名。

使用 Notion 和 Python 制作家庭图书馆

我们将使用非官方的 Notion API,因为官方尚未发布。

使用 Notion 和 Python 制作家庭图书馆

转到 Notion,按 Ctrl + Shift + J,转到应用程序 -> Cookies,复制 token_v2 并将其命名为 TOKEN。 然后我们进入我们需要的带有图书馆标志的页面并复制链接。 我们称之为“NOTION”。

然后我们编写连接Notion的代码。

database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()

接下来,让我们编写一个函数来向表中添加一行。

def add_row(path, file, words_count, pages_count, hours):
    row = database.collection.add_row()
    row.title = file

    tags = path.split("/")

    if len(tags) >= 1:
        row.what = tags[0]

    if len(tags) >= 2:
        row.state = tags[1]

    if len(tags) >= 3:
        if tags[0] == "Художественное":
            row.author = tags[2]

        elif tags[0] == "Нехудожественное":
            row.tags = tags[2]

        elif tags[0] == "Учебники":
            row.tags = tags[2]

    if len(tags) >= 4:
        row.author = tags[3]

    row.hours = hours
    row.pages = pages_count
    row.words = words_count

这里发生了什么。 我们在表的第一行中添加一个新行。 接下来,我们沿着“/”分割路径并获取标签。 标签——“艺术”、“设计”、作者是谁等等。 然后我们设置板的所有必要字段。

第 3 部分:计算字数、时间和其他乐趣

这是一项更加艰巨的任务。 我们记得,我们有两种格式:epub 和 pdf。 如果 epub 的一切都很清楚 - 文字可能就在那里,那么 pdf 的一切就不那么清楚了:它可能只是由粘合图像组成。

因此,我们计算 PDF 字数的函数将如下所示:我们获取页数并乘以某个常数(每页的平均字数)。

这里是:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

A4 页面的 WORDS_PER_PAGE 大约为 300。

现在让我们编写一个函数来计算页数。 我们将使用 pyPDF2.

def get_pdf_pages_number(path, filename):
    pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
    return pdf.getNumPages()

接下来,我们将编写一个用于计算 Epub 中页数的东西。 我们用 epub_转换器。 在这里,我们将这本书转换为行,并计算每行的单词数。

def get_epub_pages_number(path, filename):
    book = open_book(os.path.join(path, filename))
    lines = convert_epub_to_lines(book)
    words_count = 0

    for line in lines:
        words_count += len(line.split(" "))

    return round(words_count / WORDS_PER_PAGE)

现在我们来计算一下时间。 我们将我们最喜欢的字数除以您的阅读速度。

def get_reading_time(words_count):
    return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10

第 4 部分:连接所有部件

我们需要遍历 books 文件夹中所有可能的路径。 检查Notion中是否已经有一本书:如果有,我们就不再需要创建一行。
然后我们需要判断文件类型,根据这个,统计字数。 最后添加一本书。

这是我们得到的代码:

for root, subdirs, files in os.walk(BOOKS_DIR):
    if len(files) > 0 and check_for_excusion(root):
        for file in files:
            array = file.split(".")
            filetype = file.split(".")[len(array) - 1]
            filename = file.replace("." + filetype, "")
            local_root = root.replace(BOOKS_DIR, "")

            print("Dir: {}, file: {}".format(local_root, file))

            if not check_for_existence(filename):
                print("Dir: {}, file: {}".format(local_root, file))

                if filetype == "pdf":
                    count = get_pdf_pages_number(root, file)

                else:
                    count = get_epub_pages_number(root, file)

                words_count = get_words_count(count)
                hours = get_reading_time(words_count)
                print("Pages: {}, Words: {}, Hours: {}".format(count, words_count, hours))
                add_row(local_root, filename, words_count, count, hours)

检查是否已添加书籍的函数如下所示:

def check_for_existence(filename):
    for row in current_rows:
        if row.title in filename:
            return True

        elif filename in row.title:
            return True

    return False

结论

感谢所有阅读这篇文章的人。 我希望它能帮助你阅读更多:)

来源: habr.com

添加评论