Membuat perpustakaan rumah dengan Notion dan Python

Saya sentiasa berminat dengan cara terbaik untuk mengedarkan buku di perpustakaan elektronik saya. Pada akhirnya, saya datang ke pilihan ini dengan pengiraan automatik bilangan halaman dan barangan lain. Saya bertanya kepada semua orang yang berminat di bawah kucing.

Bahagian 1. Dropbox

Semua buku saya ada di dropbox. Terdapat 4 kategori yang saya bahagikan semuanya: Buku Teks, Rujukan, Fiksyen, Bukan fiksyen. Tetapi saya tidak menambah buku rujukan pada jadual.

Kebanyakan buku ialah .epub, selebihnya ialah .pdf. Iaitu, penyelesaian akhir entah bagaimana mesti meliputi kedua-dua pilihan.

Laluan saya ke buku adalah seperti ini:

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

Jika buku itu fiksyen, maka kategori (iaitu, "Reka Bentuk" dalam kes di atas) dialih keluar.

Saya memutuskan untuk tidak mengganggu API Dropbox, kerana saya mempunyai aplikasi mereka yang menyegerakkan folder. Iaitu, rancangannya ialah: kami mengambil buku dari folder, menjalankan setiap buku melalui pembilang perkataan, dan menambahkannya pada Notion.

Bahagian 2. Tambah baris

Meja itu sendiri sepatutnya kelihatan seperti ini. PERHATIAN: adalah lebih baik untuk membuat nama lajur dalam bahasa Latin.

Membuat perpustakaan rumah dengan Notion dan Python

Kami akan menggunakan API Notion tidak rasmi, kerana API rasmi masih belum dihantar.

Membuat perpustakaan rumah dengan Notion dan Python

Pergi ke Notion, tekan Ctrl + Shift + J, pergi ke Application -> Cookies, salin token_v2 dan panggil TOKEN. Kemudian kita pergi ke halaman yang kita perlukan dengan tanda perpustakaan dan salin pautan. Kami memanggilnya NOTION.

Kemudian kami menulis kod untuk menyambung ke Notion.

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

Seterusnya, mari kita tulis fungsi untuk menambah baris pada jadual.

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

Apa yang berlaku di sini. Kami mengambil dan menambah baris baharu pada jadual di baris pertama. Seterusnya, kami membahagikan laluan kami di sepanjang "/" dan mendapatkan teg. Tag - dari segi "Seni", "Reka Bentuk", siapa pengarang, dan sebagainya. Kemudian kami menetapkan semua bidang plat yang diperlukan.

Bahagian 3. Mengira perkataan, jam dan kegembiraan lain

Ini adalah tugas yang lebih sukar. Seperti yang kami ingat, kami mempunyai dua format: epub dan pdf. Jika semuanya jelas dengan epub - perkataan mungkin ada di sana, maka semuanya tidak begitu jelas tentang pdf: ia mungkin hanya terdiri daripada imej terpaku.

Jadi fungsi kami untuk mengira perkataan dalam PDF akan kelihatan seperti ini: kami mengambil bilangan halaman dan mendarab dengan pemalar tertentu (purata bilangan perkataan setiap halaman).

Inilah dia:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

WORDS_PER_PAGE ini untuk halaman A4 adalah lebih kurang 300.

Sekarang mari kita tulis fungsi untuk mengira halaman. Kami akan gunakan pyPDF2.

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

Seterusnya, kami akan menulis sesuatu untuk mengira halaman dalam Epub. Kami guna epub_converter. Di sini kita mengambil buku itu, menukarnya menjadi baris, dan mengira perkataan untuk setiap baris.

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)

Sekarang mari kita mengira masa. Kami mengambil kiraan perkataan kegemaran kami dan membahagikannya dengan kelajuan membaca anda.

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

Bahagian 4. Menyambung semua bahagian

Kami perlu melalui semua laluan yang mungkin dalam folder buku kami. Semak sama ada sudah ada buku dalam Notion: jika ada, kita tidak perlu lagi membuat baris.
Kemudian kita perlu menentukan jenis fail, bergantung pada ini, hitung bilangan perkataan. Tambah buku di penghujungnya.

Ini kod yang kami dapat:

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)

Dan fungsi untuk menyemak sama ada buku telah ditambah kelihatan seperti ini:

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

Kesimpulan

Terima kasih kepada semua yang membaca artikel ini. Saya harap ia membantu anda membaca lebih lanjut :)

Sumber: www.habr.com

Tambah komen