Vytvorenie domácej knižnice pomocou Notion a Python

Vždy ma zaujímalo, ako najlepšie distribuovať knihy v mojej elektronickej knižnici. Nakoniec som sa k tejto možnosti dostal s automatickým výpočtom počtu strán a ďalšími vychytávkami. Prosím všetkých záujemcov pod kat.

Časť 1. Dropbox

Všetky moje knihy sú na schránke. Sú 4 kategórie, do ktorých som všetko rozdelil: Učebnica, Referencie, Beletria, Literatúra faktu. Referenčné knihy však do tabuľky nepridávam.

Väčšina kníh je .epub, zvyšok je .pdf. To znamená, že konečné riešenie musí nejako pokryť obe možnosti.

Moje cesty ku knihám sú asi takéto:

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

Ak je kniha beletria, kategória (t. j. „Dizajn“ vo vyššie uvedenom prípade) sa odstráni.

Rozhodol som sa nezaťažovať Dropbox API, keďže mám ich aplikáciu, ktorá synchronizuje priečinok. To znamená, že plán je takýto: vyberieme knihy zo zložky, každú knihu prejdeme cez počítadlo slov a pridáme ju do Notion.

Časť 2. Pridajte riadok

Samotný stôl by mal vyzerať asi takto. POZOR: Názvy stĺpcov je lepšie robiť v latinke.

Vytvorenie domácej knižnice pomocou Notion a Python

Použijeme neoficiálne API Notion, pretože to oficiálne ešte nebolo doručené.

Vytvorenie domácej knižnice pomocou Notion a Python

Prejdite na Notion, stlačte Ctrl + Shift + J, prejdite na Aplikácia -> Cookies, skopírujte token_v2 a nazvite ho TOKEN. Potom prejdeme na požadovanú stránku s označením knižnice a skopírujeme odkaz. Hovoríme tomu NOTION.

Potom napíšeme kód na pripojenie k Notion.

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

Ďalej napíšme funkciu na pridanie riadku do tabuľky.

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

Čo sa tu deje. Vezmeme a pridáme nový riadok do tabuľky v prvom riadku. Ďalej rozdelíme našu cestu pozdĺž „/“ a získame značky. Tagy - z hľadiska „umenia“, „dizajnu“, kto je autorom atď. Potom nastavíme všetky potrebné polia taniera.

Časť 3. Počítanie slov, hodín a iných pôžitkov

Toto je náročnejšia úloha. Ako si pamätáme, máme dva formáty: epub a pdf. Ak je všetko jasné s epub - slová sú tam pravdepodobne, potom nie je všetko také jasné o pdf: môže jednoducho pozostávať z lepených obrázkov.

Naša funkcia na počítanie slov v PDF bude teda vyzerať takto: vezmeme počet strán a vynásobíme určitou konštantou (priemerný počet slov na stránku).

Tu je:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Toto WORDS_PER_PAGE na stranu A4 je približne 300.

Teraz napíšme funkciu na počítanie stránok. Budeme používať pyPDF2.

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

Ďalej napíšeme vec na počítanie stránok v Epub. Používame epub_converter. Tu vezmeme knihu, prevedieme ju na riadky a spočítame slová pre každý riadok.

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)

Teraz vypočítajme čas. Zoberieme náš obľúbený počet slov a vydelíme ho rýchlosťou čítania.

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

Časť 4. Spojenie všetkých častí

Musíme prejsť všetkými možnými cestami v našej zložke kníh. Skontrolujte, či už v Notion existuje kniha: ak existuje, už nemusíme vytvárať riadok.
Potom musíme určiť typ súboru, v závislosti od toho spočítať počet slov. Na konci pridajte knihu.

Toto je kód, ktorý dostaneme:

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)

A funkcia na kontrolu, či bola kniha pridaná, vyzerá takto:

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

Záver

Ďakujem všetkým, ktorí si prečítali tento článok. Dúfam, že vám to pomôže prečítať si viac :)

Zdroj: hab.com

Pridať komentár