Ustvarjanje domače knjižnice z Notionom in Pythonom

Vedno me je zanimalo, kako najbolje razdeliti knjige v svoji elektronski knjižnici. Na koncu sem prišel do te možnosti s samodejnim izračunom števila strani in ostalih dobrot. Prosim vse zainteresirane pod kat.

1. del. Dropbox

Vse moje knjige so na dropboxu. Obstajajo 4 kategorije, v katere sem razdelil vse: učbenik, referenca, leposlovje, stvarna literatura. Toda referenčnih knjig ne dodajam na tabelo.

Večina knjig je .epub, ostale so .pdf. Se pravi, da mora končna rešitev nekako pokriti obe možnosti.

Moje poti do knjig so nekako takole:

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

Če je knjiga leposlovje, se kategorija (tj. »Oblikovanje« v zgornjem primeru) odstrani.

Odločil sem se, da se ne bom ukvarjal z Dropbox API, saj imam njihovo aplikacijo, ki sinhronizira mapo. Se pravi, načrt je tak: vzamemo knjige iz mape, vsako knjigo poženemo skozi števec besed in jo dodamo v Notion.

Del 2. Dodajte vrstico

Sama miza bi morala izgledati nekako takole. POZOR: imena stolpcev je bolje narediti v latinici.

Ustvarjanje domače knjižnice z Notionom in Pythonom

Uporabili bomo neuradni Notion API, ker uradni še ni bil dostavljen.

Ustvarjanje domače knjižnice z Notionom in Pythonom

Pojdite na Notion, pritisnite Ctrl + Shift + J, pojdite na Application -> Cookies, kopirajte token_v2 in ga poimenujte TOKEN. Nato gremo na stran, ki jo potrebujemo, z znakom knjižnice in kopiramo povezavo. Imenujemo ga POJM.

Nato napišemo kodo za povezavo z Notionom.

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

Nato napišimo funkcijo za dodajanje vrstice v tabelo.

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

Kaj se tukaj dogaja. Vzamemo in v prvo vrstico tabeli dodamo novo vrstico. Nato svojo pot razdelimo vzdolž "/" in dobimo oznake. Oznake - v smislu "Umetnost", "Oblikovanje", kdo je avtor itd. Nato nastavimo vsa potrebna polja tablice.

3. del. Štetje besed, ur in drugih užitkov

To je težja naloga. Kot se spomnimo, imamo dva formata: epub in pdf. Če je z epubom vse jasno - besede so verjetno tam, potem o pdfju ni vse tako jasno: morda je preprosto sestavljen iz zlepljenih slik.

Torej bo naša funkcija za štetje besed v PDF izgledala takole: vzamemo število strani in ga pomnožimo z določeno konstanto (povprečno število besed na stran).

Tukaj je:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Ta WORDS_PER_PAGE za stran A4 je približno 300.

Zdaj pa napišimo funkcijo za štetje strani. Bomo uporabili pyPDF2.

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

Nato bomo napisali stvar za štetje strani v Epubu. Uporabljamo epub_pretvornik. Tu vzamemo knjigo, jo pretvorimo v vrstice in preštejemo besede za vsako vrstico.

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)

Zdaj pa izračunajmo čas. Vzamemo število naših najljubših besed in ga delimo z vašo hitrostjo branja.

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

Del 4. Povezovanje vseh delov

Iti moramo skozi vse možne poti v naši mapi s knjigami. Preverite, ali v Notionu že obstaja knjiga: če obstaja, nam ni več treba ustvariti vrstice.
Nato moramo določiti vrsto datoteke, glede na to prešteti število besed. Dodajte knjigo na koncu.

To je koda, ki jo dobimo:

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)

In funkcija za preverjanje, ali je bila knjiga dodana, izgleda takole:

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

Zaključek

Hvala vsem, ki ste prebrali ta članek. Upam, da vam bo pomagalo prebrati več :)

Vir: www.habr.com

Dodaj komentar