Otthoni könyvtár készítése Notion és Python segítségével

Mindig is érdekelt, hogyan lehet a legjobban terjeszteni a könyveket az elektronikus könyvtáramban. Végül az oldalszám és egyéb finomságok automatikus kiszámításával jutottam ehhez a lehetőséghez. Kérek minden érdeklődőt a kat.

1. rész. Dropbox

Minden könyvem a dropboxon van. 4 kategória van, amelyekbe mindent felosztottam: Tankönyv, Referencia, Szépirodalmi, Non-fiction. De nem adok hozzá kézikönyveket a táblázathoz.

A legtöbb könyv .epub, a többi .pdf. Vagyis a végső megoldásnak valahogy mindkét lehetőséget le kell fednie.

Az én utam a könyvekhez a következő:

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

Ha a könyv szépirodalom, akkor a kategória (azaz a fenti esetben a „Dizájn”) törlésre kerül.

Úgy döntöttem, hogy nem foglalkozom a Dropbox API-val, mivel megvan az alkalmazásuk, amely szinkronizálja a mappát. Vagyis a terv a következő: kiveszünk a mappából könyveket, minden könyvet átfuttatunk egy szószámlálón, és hozzáadjuk a Fogalomhoz.

2. rész. Adjon hozzá egy sort

Magának az asztalnak valahogy így kell kinéznie. FIGYELEM: jobb az oszlopneveket latinul írni.

Otthoni könyvtár készítése Notion és Python segítségével

A nem hivatalos Notion API-t fogjuk használni, mert a hivatalosat még nem szállították le.

Otthoni könyvtár készítése Notion és Python segítségével

Lépjen a Notion elemre, nyomja meg a Ctrl + Shift + J billentyűket, lépjen az Alkalmazás -> Cookie-k elemre, másolja a token_v2-t, és hívja TOKEN-nek. Ezután a könyvtár jelzéssel ellátott oldalra lépünk, amelyre szükségünk van, és bemásoljuk a hivatkozást. FONTOSSÁGNAK hívjuk.

Ezután megírjuk a kódot a Notionhoz való csatlakozáshoz.

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

Ezután írjunk egy függvényt egy sor hozzáadásához a táblázathoz.

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

Mi folyik itt. Vegyünk és adunk hozzá egy új sort az első sorban lévő táblázathoz. Ezután felosztjuk az utat a „/” mentén, és címkéket kapunk. Címkék - a „Művészet”, a „Dizájn”, a szerző stb. szempontjából. Ezután beállítjuk a lemez összes szükséges mezőjét.

3. rész. Szavak, órák és egyéb örömök számolása

Ez nehezebb feladat. Ahogy emlékszünk, két formátumunk van: epub és pdf. Ha minden világos az epub-ban - valószínűleg ott vannak a szavak, akkor a pdf-ben nem minden olyan egyértelmű: lehet, hogy egyszerűen összeragasztott képekből áll.

Tehát a PDF-ben a szavak számlálására szolgáló függvényünk így fog kinézni: vesszük az oldalak számát, és megszorozzuk egy bizonyos állandóval (az oldalankénti szavak átlagos számával).

Ott van:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Ez a WORDS_PER_PAGE egy A4-es oldal esetében körülbelül 300.

Most írjunk egy függvényt az oldalak számlálására. Használni fogjuk pyPDF2.

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

Ezután írunk egy dolgot az Epub oldalak számlálására. Használjuk epub_converter. Itt vesszük a könyvet, sorokká alakítjuk, és minden sorhoz megszámoljuk a szavakat.

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)

Most számoljuk ki az időt. Kivesszük kedvenc szószámunkat, és elosztjuk az olvasási sebességeddel.

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

4. rész Az összes alkatrész csatlakoztatása

Minden lehetséges utat végig kell mennünk a könyvmappánkban. Ellenőrizze, hogy van-e már könyv a Notionban: ha van, akkor már nem kell sort létrehoznunk.
Ezután meg kell határoznunk a fájl típusát, ettől függően számoljuk meg a szavak számát. Adj hozzá egy könyvet a végén.

Ezt a kódot kapjuk:

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 könyv hozzáadásának ellenőrzésére szolgáló funkció pedig így néz ki:

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

Következtetés

Köszönöm mindenkinek, aki elolvasta ezt a cikket. Remélem segít tovább olvasni :)

Forrás: will.com

Hozzászólás