Tạo thư viện tại nhà với Notion và Python

Tôi luôn quan tâm đến cách phân phối sách tốt nhất trong thư viện điện tử của mình. Cuối cùng, tôi đã tìm đến tùy chọn này với tính năng tự động tính toán số trang và các tính năng khác. Tôi hỏi tất cả những người quan tâm đến con mèo.

Phần 1. Dropbox

Tất cả sách của tôi đều có trên dropbox. Có 4 loại mà tôi chia mọi thứ: Sách giáo khoa, Tài liệu tham khảo, Tiểu thuyết, Phi hư cấu. Nhưng tôi không thêm sách tham khảo vào bảng.

Hầu hết sách là .epub, còn lại là .pdf. Nghĩa là, giải pháp cuối cùng bằng cách nào đó phải bao gồm cả hai lựa chọn.

Con đường đến với sách của tôi giống như thế này:

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

Nếu cuốn sách là hư cấu thì danh mục (tức là “Thiết kế” trong trường hợp trên) sẽ bị xóa.

Tôi quyết định không bận tâm đến API Dropbox vì tôi có ứng dụng đồng bộ hóa thư mục của họ. Tức là, kế hoạch là thế này: chúng tôi lấy sách từ thư mục, chạy từng cuốn sách qua bộ đếm từ và thêm nó vào Notion.

Phần 2. Thêm một dòng

Bản thân cái bàn sẽ trông giống như thế này. CHÚ Ý: tốt hơn là đặt tên cột bằng tiếng Latin.

Tạo thư viện tại nhà với Notion và Python

Chúng tôi sẽ sử dụng API Notion không chính thức vì API chính thức vẫn chưa được phân phối.

Tạo thư viện tại nhà với Notion và Python

Vào Notion, nhấn Ctrl + Shift + J, vào Application -> Cookies, sao chép token_v2 và gọi nó là TOKEN. Sau đó, chúng tôi đi đến trang chúng tôi cần có ký hiệu thư viện và sao chép liên kết. Chúng tôi gọi nó là NOTION.

Sau đó chúng ta viết code để kết nối với Notion.

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

Tiếp theo, hãy viết hàm để thêm một hàng vào bảng.

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

Những gì đang xảy ra ở đây. Chúng tôi lấy và thêm một hàng mới vào bảng ở hàng đầu tiên. Tiếp theo, chúng tôi chia đường dẫn của mình dọc theo “/” và nhận thẻ. Thẻ - về mặt “Nghệ thuật”, “Thiết kế”, tác giả là ai, v.v. Sau đó, chúng tôi thiết lập tất cả các trường cần thiết của tấm.

Phần 3. Đếm từ, đếm giờ và những thú vui khác

Đây là một nhiệm vụ khó khăn hơn. Như chúng tôi nhớ, chúng tôi có hai định dạng: epub và pdf. Nếu mọi thứ đều rõ ràng với epub - các từ có thể ở đó, thì mọi thứ về pdf không quá rõ ràng: nó có thể chỉ bao gồm các hình ảnh được dán.

Vì vậy, hàm đếm từ trong PDF của chúng ta sẽ như thế này: chúng ta lấy số trang và nhân với một hằng số nhất định (số từ trung bình trên mỗi trang).

Cô ấy đây rồi:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

WORDS_PER_PAGE này cho trang A4 là khoảng 300.

Bây giờ hãy viết một hàm để đếm trang. Chúng tôi sẽ sử dụng pyPDF2.

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

Tiếp theo, chúng ta sẽ viết một thứ để đếm trang trong Epub. Chúng tôi sử dụng epub_converter. Ở đây chúng tôi lấy cuốn sách, chuyển nó thành dòng và đếm số từ cho mỗi dòng.

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)

Bây giờ hãy tính thời gian. Chúng tôi lấy số từ yêu thích của chúng tôi và chia cho tốc độ đọc của bạn.

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

Phần 4. Kết nối tất cả các bộ phận

Chúng ta cần đi qua tất cả các đường dẫn có thể có trong thư mục sách của mình. Kiểm tra xem đã có sách trong Notion chưa: nếu có thì chúng ta không cần tạo dòng nữa.
Sau đó chúng ta cần xác định loại file, tùy vào điều này mà đếm số từ. Thêm một cuốn sách vào cuối.

Đây là mã chúng tôi nhận được:

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)

Và chức năng kiểm tra xem một cuốn sách đã được thêm vào trông như thế này:

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

Kết luận

Cảm ơn mọi người đã đọc bài viết này. Tôi hy vọng nó sẽ giúp bạn đọc nhiều hơn :)

Nguồn: www.habr.com

Thêm một lời nhận xét