Maak 'n tuisbiblioteek met Notion en Python

Ek was nog altyd geïnteresseerd in hoe om boeke die beste in my elektroniese biblioteek te versprei. Op die ou end het ek by hierdie opsie uitgekom met outomatiese berekening van die aantal bladsye en ander lekkernye. Ek vra alle belangstellendes onder kat.

Deel 1. Dropbox

Al my boeke is op dropbox. Daar is 4 kategorieë waarin ek alles verdeel het: Handboek, Verwysing, Fiksie, Nie-fiksie. Maar ek voeg nie naslaanboeke by die tabel nie.

Die meeste van die boeke is .epub, die res is .pdf. Dit wil sê, die finale oplossing moet op een of ander manier albei opsies dek.

My paaie na boeke is iets soos hierdie:

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

As die boek fiksie is, word die kategorie (dit is "Ontwerp" in die geval hierbo) verwyder.

Ek het besluit om my nie aan die Dropbox API te steur nie, aangesien ek hul toepassing het wat die gids sinchroniseer. Dit wil sê, die plan is so: ons neem boeke uit die gids, hardloop elke boek deur 'n woordteller en voeg dit by Notion.

Deel 2. Voeg 'n reël by

Die tafel self moet so iets lyk. AANDAG: dit is beter om kolomname in Latyn te maak.

Maak 'n tuisbiblioteek met Notion en Python

Ons sal die nie-amptelike Notion API gebruik, want die amptelike een is nog nie afgelewer nie.

Maak 'n tuisbiblioteek met Notion en Python

Gaan na Notion, druk Ctrl + Shift + J, gaan na Toepassing -> Koekies, kopieer token_v2 en noem dit TOKEN. Dan gaan ons na die bladsy wat ons benodig met die biblioteekteken en kopieer die skakel. Ons noem dit NOTION.

Dan skryf ons die kode om aan Notion te koppel.

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

Kom ons skryf dan 'n funksie om 'n ry by die tabel te voeg.

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

Wat gaan hier aan. Ons neem en voeg 'n nuwe ry by die tabel in die eerste ry. Vervolgens verdeel ons ons pad langs “/” en kry etikette. Merkers - in terme van "Kuns", "Ontwerp", wie is die skrywer, ensovoorts. Dan stel ons al die nodige velde van die bord.

Deel 3. Tel woorde, ure en ander lekkernye

Dit is 'n moeiliker taak. Soos ons onthou, het ons twee formate: epub en pdf. As alles duidelik is met die epub - die woorde is waarskynlik daar, dan is alles nie so duidelik oor die pdf nie: dit kan bloot uit vasgeplakte beelde bestaan.

Ons funksie vir die tel van woorde in PDF sal dus so lyk: ons neem die aantal bladsye en vermenigvuldig met 'n sekere konstante (die gemiddelde aantal woorde per bladsy).

Hier is sy:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Hierdie WORDS_PER_PAGE vir 'n A4-bladsy is ongeveer 300.

Kom ons skryf nou 'n funksie om bladsye te tel. Ons sal gebruik pyPDF2.

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

Vervolgens skryf ons 'n ding vir die tel van bladsye in Epub. Ons gebruik epub_omskakelaar. Hier neem ons die boek, verander dit in reëls en tel die woorde vir elke reël.

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)

Kom ons bereken nou die tyd. Ons neem ons gunstelingwoordtelling en deel dit deur jou leesspoed.

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

Deel 4. Verbind al die dele

Ons moet deur alle moontlike paaie in ons boeke-lêergids gaan. Kyk of daar reeds 'n boek in Notion is: as daar is, hoef ons nie meer 'n reël te skep nie.
Dan moet ons die lêertipe bepaal, afhangende hiervan, tel die aantal woorde. Voeg 'n boek aan die einde by.

Dit is die kode wat ons kry:

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)

En die funksie om te kyk of 'n boek bygevoeg is, lyk soos volg:

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

Gevolgtrekking

Dankie aan almal wat hierdie artikel gelees het. Ek hoop dit help jou om meer te lees :)

Bron: will.com

Voeg 'n opmerking