Izveidojam mājas bibliotēku ar Notion un Python

Man vienmēr bija interesanti, kā labāk izvietot grāmatas manā elektroniskajā bibliotēkā. Beigās es nonācu pie tāda risinājuma ar automātisku lapu skaita skaitīŔanu un citiem labumiem. Visus interesentus aicinu zemāk.

1. daļa. Dropbox

Visas grāmatas man ir Dropbox. Ir četras kategorijas, uz kurām es visu sadalīju: Mācību grāmata, Rokasgrāmata, literāra, nenovizuot. Taču rokasgrāmatas es tabulā neiekļauju.

Lielākā daļa grāmatu ir .epub, pārējās – .pdf. Tāpēc gala risinājumam jāsedz abi varianti.

Grāmatu ceļi izskatās aptuveni Ŕādi:

/Книги/ŠŠµŃ…ŃƒŠ“Š¾Š¶ŠµŃŃ‚Š²ŠµŠ½Š½Š¾Šµ/ŠŠ¾Š²Š¾Šµ/Дизайн/Юрий ГорГон/Книга про Š±ŃƒŠŗŠ²Ń‹ от А Го ŠÆ.epub 

Ja grāmata ir literāra, tad kategorija (t.i., "Dizains", ja runājam par iepriekÅ” minēto) tiek izņemta.

Es nolēmu nenodarboties ar Dropbox API, jo man ir viņu aplikācija, kas sinhronizē mapi. Tātad plāns ir Ŕāds: ņemam grāmatas no mapes, katru grāmatu palaidÄ«sim cauri vārdu skaitÄ«tājam, pievienojam Notion.

2. daļa. Pievienojam rindu

PaÅ”ai tabulai jāizskatās aptuveni Ŕādi. UZMANÄŖBU: kolonu nosaukumus labāk veidot latīņu burtiem.

Izveidojam mājas bibliotēku ar Notion un Python

Mēs izmantosim neoficiālo Notion API, jo oficiālais vēl nav pieejams.

Izveidojam mājas bibliotēku ar Notion un Python

IepriekÅ” dodamies uz Notion, nospiežam Ctrl + Shift + J, ejam uz Application -> Cookies, kopējam token_v2 un nosaucam to par TOKEN. Pēc tam dodamies uz nepiecieÅ”amo lapu ar bibliotēkas tabulu un kopējam saiti. Nosaucam NATION.

Pēc tam rakstām kodu savienojumam ar Notion.

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

Pēc tam uzrakstÄ«sim funkciju rindu pievienoÅ”anai tabulā.

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] == "Literāra":
            row.author = tags[2]

        elif tags[0] == "Nenovizuot":
            row.tags = tags[2]

        elif tags[0] == "Mācību grāmatas":
            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 tabulas pirmajā rindā. Pēc tam sadalām mÅ«su ceļu pa ā€œ/ā€ un iegÅ«stam tagus. Tagus — tādā izpratnē kā ā€œLiterāraā€, ā€œDizainsā€, kurÅ” ir autors un tā tālāk. Pēc tam norādām visus nepiecieÅ”amos tabulas laukus.

3. daļa. Skaitām vārdus, stundas un citus labumus

Tas jau ir sarežģītāks uzdevums. Kā mēs atceramies, mums ir divi formāti: ePub un PDF. Ja par ePub viss ir skaidrs — tajā, visticamāk, tieŔām ir vārdi, tad attiecÄ«bā uz PDF viss nav tik vienkārÅ”i: tas var sastāvēt tikai no saliktām bildēm.

Tāpēc PDF vārdu skaita funkcija izskatÄ«sies Ŕādi: mēs ņemam lapu skaitu un reizinām to ar noteiktu konstanti (vidējais vārdu skaits lapā).

Šeit tā ir:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Tas pats WORDS_PER_PAGE A4 lapai ir apmēram 300.

Tagad uzrakstīsim funkciju lapu skaita noteikŔanai. Izmantosim PyPDF2.

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

Tālāk uzrakstÄ«sim lietu, lai saskaitÄ«tu lapas ePub formātā. Izmantosim epub_converter. Å eit mēs ņemam grāmatu, pārvērÅ”am to rindās, un katrai rindai saskaitām vārdus.

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. Ņemam mÅ«su iecienÄ«to vārdu skaitu un dalā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. Apvienojam visas daļas

Mums jāapiet visi iespējamie ceļi mÅ«su grāmatu mapē. Jāpārbauda, vai grāmata jau ir Notion: ja ir — rindu jau neizveidosim.
Pēc tam mums jānosaka faila tips, atkarībā no tā jāsaskaita vārdu skaits. Beigās jāpievieno grāmata.

Šāds kods mums sanāk:

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)

Savukārt 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 izlasÄ«ja Å”o rakstu. Ceru, ka tas palÄ«dzēs jums lasÄ«t vairāk šŸ™‚

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster