Paghimo usa ka librarya sa balay nga adunay Notion ug Python

Kanunay kong interesado kon unsaon pag-apod-apod ug mga libro sa akong elektronikong librarya. Sa katapusan, nakaabut ako sa kini nga kapilian nga adunay awtomatikong pagkalkula sa gidaghanon sa mga panid ug uban pang mga butang. Mangutana ko sa tanang interesadong tawo ubos sa iring.

Bahin 1. Dropbox

Tanan nakong libro naa sa dropbox. Adunay 4 ka mga kategoriya diin akong gibahin ang tanan: Textbook, Reference, Fiction, Non-fiction. Apan wala ko magdugang og mga reference nga libro sa lamesa.

Kadaghanan sa mga libro kay .epub, ang uban kay .pdf. Kana mao, ang katapusan nga solusyon kinahanglan sa usa ka paagi sa pagtabon sa duha ka mga kapilian.

Ang akong mga agianan sa mga libro sama niini:

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

Kung ang libro usa ka fiction, nan ang kategorya (nga mao, "Disenyo" sa kaso sa ibabaw) tangtangon.

Nakahukom ko nga dili magsamok sa Dropbox API, tungod kay ako adunay ilang aplikasyon nga nag-synchronize sa folder. Sa ato pa, ang plano mao kini: magkuha mig mga libro gikan sa folder, padaganon ang matag libro pinaagi sa word counter, ug idugang kini sa Notion.

Bahin 2. Pagdugang og linya

Ang lamesa mismo kinahanglan nga tan-awon sama niini. ATTENTION: mas maayo nga maghimo ug mga ngalan sa column sa Latin.

Paghimo usa ka librarya sa balay nga adunay Notion ug Python

Atong gamiton ang dili opisyal nga Notion API, tungod kay ang opisyal wala pa mahatag.

Paghimo usa ka librarya sa balay nga adunay Notion ug Python

Adto sa Notion, pindota ang Ctrl + Shift + J, adto sa Application -> Cookies, kopyaha ang token_v2 ug tawga kini nga TOKEN. Dayon moadto kami sa panid nga among gikinahanglan uban ang karatula sa librarya ug kopyaha ang link. Gitawag namo ni nga NOTION.

Dayon among isulat ang code aron makonektar sa Notion.

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

Sunod, magsulat ta ug function para makadugang ug laray sa lamesa.

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

Unsa ang nahitabo dinhi. Among gikuha ug gidugang ang bag-ong laray sa lamesa sa unang laray. Sunod, gibahin namo ang among agianan sa "/" ug pagkuha og mga tag. Mga tag - sa termino sa "Art", "Disenyo", kinsa ang tagsulat, ug uban pa. Dayon among gibutang ang tanang gikinahanglan nga mga natad sa plato.

Bahin 3. Pag-ihap sa mga pulong, oras ug uban pang kalipay

Kini usa ka mas lisud nga buluhaton. Sa among nahinumduman, kami adunay duha ka format: epub ug pdf. Kung ang tanan klaro sa epub - ang mga pulong lagmit naa, nan ang tanan dili kaayo klaro bahin sa pdf: mahimo’g kini naglangkob sa mga gipapilit nga mga imahe.

Mao nga ang among function sa pag-ihap sa mga pulong sa PDF mahimong ingon niini: gikuha namon ang gidaghanon sa mga panid ug gipadaghan sa usa ka piho nga makanunayon (ang kasagaran nga gidaghanon sa mga pulong matag panid).

Ania siya:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Kini nga WORDS_PER_PAGE alang sa usa ka A4 nga panid gibanabana nga 300.

Karon magsulat kita ug function sa pag-ihap sa mga panid. Atong gamiton pyPDF2.

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

Sunod, magsulat kami usa ka butang alang sa pag-ihap sa mga panid sa Epub. Gigamit namo epub_converter. Dinhi atong kuhaon ang libro, i-convert kini ngadto sa mga linya, ug ihap ang mga pulong sa matag linya.

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)

Karon atong kuwentahon ang oras. Gikuha namo ang among paborito nga ihap sa pulong ug gibahin kini sa imong katulin sa pagbasa.

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

Bahin 4. Pagdugtong sa tanang bahin

Kinahanglan natong agian ang tanang posibleng mga dalan sa atong folder sa mga libro. Susiha kung aduna na bay libro sa Notion: kung naa, dili na kinahanglan nga maghimo usa ka linya.
Unya kinahanglan naton mahibal-an ang tipo sa file, depende niini, ihap ang gidaghanon sa mga pulong. Pagdugang og libro sa katapusan.

Mao kini ang code nga atong makuha:

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)

Ug ang function aron masusi kung ang usa ka libro gidugang ingon niini:

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

konklusyon

Salamat sa tanan nga nagbasa niini nga artikulo. Nanghinaut ko nga makatabang kini kanimo nga magbasa pa :)

Source: www.habr.com

Idugang sa usa ka comment