Mājas bibliotēkas izveide, izmantojot Notion un Python

Mani vienmēr interesējis, kā vislabāk izplatīt grāmatas savā elektroniskajā bibliotēkā. Beigās nonācu pie šīs iespējas ar automātisku lappušu skaita un citu labumu aprēķinu. Jautāju visiem interesentiem zem kat.

1. daļa. Dropbox

Visas manas grāmatas atrodas dropbox. Ir 4 kategorijas, kurās es visu sadalīju: Mācību grāmata, Uzziņas, Daiļliteratūra, Non-fiction. Bet es nepievienoju tabulai atsauces grāmatas.

Lielākā daļa grāmatu ir .epub formātā, pārējās ir .pdf formātā. Tas ir, gala risinājumam kaut kādā veidā jāaptver abas iespējas.

Mani ceļi uz grāmatām ir apmēram šādi:

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

Ja grāmata ir daiļliteratūra, kategorija (tas ir, iepriekš minētajā gadījumā “Dizains”) tiek noņemta.

Es nolēmu neuztraukties ar Dropbox API, jo man ir viņu lietojumprogramma, kas sinhronizē mapi. Tas ir, plāns ir šāds: mēs paņemam grāmatas no mapes, izlaižam katru grāmatu caur vārdu skaitītāju un pievienojam to Notion.

2. daļa. Pievienojiet rindiņu

Pašai tabulai vajadzētu izskatīties apmēram šādi. UZMANĪBU: kolonnu nosaukumus labāk veidot latīņu valodā.

Mājas bibliotēkas izveide, izmantojot Notion un Python

Mēs izmantosim neoficiālo Notion API, jo oficiālā vēl nav piegādāta.

Mājas bibliotēkas izveide, izmantojot Notion un Python

Dodieties uz Notion, nospiediet Ctrl + Shift + J, dodieties uz Lietojumprogramma -> Sīkfaili, kopējiet token_v2 un nosauciet to TOKEN. Tad dodamies uz mums vajadzīgo lapu ar bibliotēkas zīmi un nokopējam saiti. Mēs to saucam par jēdzienu.

Pēc tam mēs rakstām kodu, lai izveidotu savienojumu ar Notion.

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

Tālāk uzrakstīsim funkciju, lai tabulai pievienotu rindu.

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

Kas šeit notiek. Mēs ņemam un pievienojam jaunu rindu tabulai pirmajā rindā. Tālāk mēs sadalām ceļu pa “/” un iegūstam atzīmes. Atzīmes - “Māksla”, “Dizains”, kas ir autors un tā tālāk. Pēc tam iestatām visus nepieciešamos plāksnes laukus.

3. daļa. Vārdu, stundu un citu prieku skaitīšana

Tas ir grūtāks uzdevums. Kā mēs atceramies, mums ir divi formāti: epub un pdf. Ja ar epub viss ir skaidrs - iespējams, ka tur ir vārdi, tad pdf failā viss nav tik skaidrs: tas var vienkārši sastāvēt no salīmētiem attēliem.

Tātad mūsu funkcija vārdu skaitīšanai PDF formātā izskatīsies šādi: mēs ņemam lappušu skaitu un reizinām ar noteiktu konstanti (vidējais vārdu skaits lapā).

Šeit viņa ir:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Šis WORDS_PER_PAGE A4 lapai ir aptuveni 300.

Tagad uzrakstīsim funkciju lapu skaitīšanai. Mēs izmantosim pyPDF2.

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

Tālāk mēs uzrakstīsim lapu skaitīšanai Epub. Mēs izmantojam epub_converter. Šeit mēs paņemam grāmatu, pārvēršam to rindās un saskaitām vārdus katrā rindā.

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)

Tagad aprēķināsim laiku. Mēs ņemam savu iecienītāko vārdu skaitu un sadalām to ar jūsu lasīšanas ātrumu.

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

4. daļa. Visu detaļu savienošana

Mums ir jāiet cauri visi iespējamie ceļi mūsu grāmatu mapē. Pārbaudiet, vai programmā Notion jau ir grāmata: ja tāda ir, mums vairs nav jāveido rindiņa.
Pēc tam mums ir jānosaka faila tips, atkarībā no tā, saskaitiet vārdu skaitu. Beigās pievienojiet grāmatu.

Šis ir kods, ko mēs saņemam:

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)

Un funkcija, lai pārbaudītu, vai grāmata ir pievienota, izskatās šādi:

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

Secinājums

Paldies visiem, kas lasīja šo rakstu. Es ceru, ka tas palīdzēs jums lasīt vairāk :)

Avots: www.habr.com

Pievieno komentāru