Vytvoření domácí knihovny pomocí Notion a Python

Vždy mě zajímalo, jak nejlépe distribuovat knihy ve své elektronické knihovně. Nakonec jsem k této možnosti dospěl s automatickým výpočtem počtu stran a dalšími vychytávkami. Prosím všechny zájemce pod kat.

Část 1. Dropbox

Všechny mé knihy jsou na schránce. Jsou 4 kategorie, do kterých jsem vše rozdělil: Učebnice, Reference, Beletrie, Literatura faktu. Referenční knihy ale do tabulky nepřidávám.

Většina knih je .epub, zbytek je .pdf. To znamená, že konečné řešení musí nějak pokrýt obě možnosti.

Moje cesty ke knihám jsou asi tyto:

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

Pokud je kniha beletrie, pak je kategorie (tj. „Design“ ve výše uvedeném případě) odstraněna.

Rozhodl jsem se neobtěžovat Dropbox API, protože mám jejich aplikaci, která synchronizuje složku. To znamená, že plán je tento: vezmeme knihy ze složky, každou knihu projdeme počítadlem slov a přidáme ji do Notion.

Část 2. Přidejte řádek

Samotný stůl by měl vypadat nějak takto. POZOR: názvy sloupců je lepší dělat v latině.

Vytvoření domácí knihovny pomocí Notion a Python

Použijeme neoficiální Notion API, protože to oficiální ještě nebylo doručeno.

Vytvoření domácí knihovny pomocí Notion a Python

Přejděte do Notion, stiskněte Ctrl + Shift + J, přejděte do Aplikace -> Cookies, zkopírujte token_v2 a nazvěte jej TOKEN. Poté přejdeme na potřebnou stránku se znakem knihovny a zkopírujeme odkaz. Říkáme tomu NOTION.

Poté napíšeme kód pro připojení k Notion.

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

Dále napíšeme funkci pro přidání řádku do tabulky.

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

Co se tam děje. Vezmeme a přidáme nový řádek do tabulky v prvním řádku. Dále rozdělíme naši cestu podél „/“ a získáme značky. Tagy - ve smyslu „Umění“, „Design“, kdo je autorem atd. Poté nastavíme všechna potřebná pole talíře.

Část 3. Počítání slov, hodin a jiné slasti

To je těžší úkol. Jak si pamatujeme, máme dva formáty: epub a pdf. Pokud je u epub vše jasné - slova tam pravděpodobně jsou, pak u pdf není vše tak jasné: může se jednoduše skládat ze slepených obrázků.

Naše funkce pro počítání slov v PDF tedy bude vypadat takto: vezmeme počet stránek a vynásobíme určitou konstantou (průměrný počet slov na stránku).

Zde je:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Tato WORDS_PER_PAGE pro stránku A4 je přibližně 300.

Nyní napíšeme funkci pro počítání stránek. Budeme používat pyPDF2.

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

Dále napíšeme věc pro počítání stránek v Epubu. Používáme epub_converter. Zde vezmeme knihu, převedeme ji na řádky a spočítáme slova na každém řádku.

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)

Nyní spočítáme čas. Vezmeme náš oblíbený počet slov a vydělíme ho podle rychlosti čtení.

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

Část 4. Spojení všech dílů

Musíme projít všechny možné cesty v naší složce knih. Zkontrolujte, zda v Notion již existuje kniha: pokud existuje, nemusíme již vytvářet čáru.
Poté musíme určit typ souboru a v závislosti na tom spočítat počet slov. Na konec přidejte knihu.

Toto je kód, který 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 funkce pro kontrolu, zda byla kniha přidána, vypadá 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ávěr

Děkuji všem, kteří si přečetli tento článek. Doufám, že vám to pomůže číst dál :)

Zdroj: www.habr.com

Přidat komentář