Paggawa ng home library gamit ang Notion at Python

Ako ay palaging interesado sa kung paano pinakamahusay na ipamahagi ang mga libro sa aking elektronikong aklatan. Sa huli, dumating ako sa pagpipiliang ito na may awtomatikong pagkalkula ng bilang ng mga pahina at iba pang mga goodies. Tanong ko sa lahat ng interesadong tao sa ilalim ng pusa.

Bahagi 1. Dropbox

Lahat ng libro ko ay nasa dropbox. Mayroong 4 na kategorya kung saan hinati ko ang lahat: Textbook, Reference, Fiction, Non-fiction. Ngunit hindi ako nagdaragdag ng mga reference na libro sa talahanayan.

Karamihan sa mga aklat ay .epub, ang iba ay .pdf. Iyon ay, ang pangwakas na solusyon ay dapat sa anumang paraan ay sumasakop sa parehong mga pagpipilian.

Ang aking mga landas patungo sa mga aklat ay katulad nito:

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

Kung fiction ang libro, aalisin ang kategorya (iyon ay, "Disenyo" sa kaso sa itaas).

Nagpasya akong huwag mag-abala sa Dropbox API, dahil mayroon akong kanilang application na nagsi-synchronize sa folder. Ibig sabihin, ang plano ay ito: kumukuha kami ng mga aklat mula sa folder, patakbuhin ang bawat aklat sa pamamagitan ng word counter, at idagdag ito sa Notion.

Part 2. Magdagdag ng linya

Ang talahanayan mismo ay dapat magmukhang ganito. PANSIN: mas mainam na gumawa ng mga pangalan ng column sa Latin.

Paggawa ng home library gamit ang Notion at Python

Gagamitin namin ang hindi opisyal na Notion API, dahil ang opisyal ay hindi pa naihahatid.

Paggawa ng home library gamit ang Notion at Python

Pumunta sa Notion, pindutin ang Ctrl + Shift + J, pumunta sa Application -> Cookies, kopyahin ang token_v2 at tawagan itong TOKEN. Pagkatapos ay pumunta kami sa pahina na kailangan namin na may sign ng library at kopyahin ang link. Tinatawag namin itong NOTION.

Pagkatapos ay isusulat namin ang code upang kumonekta sa Notion.

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

Susunod, magsulat tayo ng isang function upang magdagdag ng isang hilera sa talahanayan.

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

Anong nangyayari dito. Kumuha kami at nagdagdag ng bagong hilera sa talahanayan sa unang hilera. Susunod, hinati namin ang aming landas kasama ang "/" at kumuha ng mga tag. Mga tag - sa mga tuntunin ng "Sining", "Disenyo", kung sino ang may-akda, at iba pa. Pagkatapos ay itinakda namin ang lahat ng kinakailangang mga patlang ng plato.

Bahagi 3. Nagbibilang ng mga salita, oras at iba pang kasiyahan

Ito ay isang mas mahirap na gawain. Tulad ng naaalala namin, mayroon kaming dalawang format: epub at pdf. Kung ang lahat ay malinaw sa epub - ang mga salita ay malamang na naroroon, kung gayon ang lahat ay hindi masyadong malinaw tungkol sa pdf: maaari lamang itong binubuo ng mga nakadikit na imahe.

Kaya ang aming function para sa pagbibilang ng mga salita sa PDF ay magiging ganito: kinukuha namin ang bilang ng mga pahina at i-multiply sa isang tiyak na pare-pareho (ang average na bilang ng mga salita sa bawat pahina).

Narito siya:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Ang WORDS_PER_PAGE na ito para sa isang A4 na pahina ay humigit-kumulang 300.

Ngayon magsulat tayo ng isang function upang mabilang ang mga pahina. Gagamitin natin pyPDF2.

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

Susunod, magsusulat kami ng isang bagay para sa pagbibilang ng mga pahina sa Epub. Ginagamit namin epub_converter. Dito natin kukunin ang aklat, i-convert ito sa mga linya, at binibilang ang mga salita para sa bawat 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)

Ngayon kalkulahin natin ang oras. Kinukuha namin ang aming paboritong bilang ng salita at hinahati ito sa bilis ng iyong pagbabasa.

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

Bahagi 4. Pagkonekta sa lahat ng mga bahagi

Kailangan nating dumaan sa lahat ng posibleng landas sa folder ng ating mga aklat. Suriin kung mayroon nang aklat sa Notion: kung mayroon, hindi na natin kailangang gumawa ng linya.
Pagkatapos ay kailangan nating matukoy ang uri ng file, depende dito, bilangin ang bilang ng mga salita. Magdagdag ng libro sa dulo.

Ito ang code na nakukuha namin:

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)

At ang function upang suriin kung ang isang libro ay naidagdag ay ganito ang hitsura:

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 lahat ng nagbasa ng artikulong ito. Sana makatulong ito sa iyo na magbasa pa :)

Pinagmulan: www.habr.com

Magdagdag ng komento