使用 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

結論

感謝所有閱讀這篇文章的人。 我希望它能幫助你閱讀更多:)

來源: www.habr.com

添加評論