Fer una biblioteca domèstica amb Notion i Python

Sempre m'ha interessat la millor manera de distribuir llibres a la meva biblioteca electrònica. Al final, vaig arribar a aquesta opció amb el càlcul automàtic del nombre de pàgines i altres llaminadures. Demano a totes les persones interessades sota cat.

Part 1. Dropbox

Tots els meus llibres estan a Dropbox. Hi ha 4 categories en les quals ho he dividit tot: Llibre de text, Referència, Ficció, No ficció. Però no afegeixo llibres de referència a la taula.

La majoria de llibres són .epub, la resta són .pdf. És a dir, la solució final ha de cobrir d'alguna manera les dues opcions.

Els meus camins cap als llibres són com aquest:

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

Si el llibre és ficció, s'elimina la categoria (és a dir, "Disseny" en el cas anterior).

Vaig decidir no molestar-me amb l'API de Dropbox, ja que tinc la seva aplicació que sincronitza la carpeta. És a dir, el pla és el següent: agafem llibres de la carpeta, passem cada llibre a través d'un comptador de paraules i l'afegim a Notion.

Part 2. Afegeix una línia

La taula en si hauria de semblar així. ATENCIÓ: és millor fer noms de columnes en llatí.

Fer una biblioteca domèstica amb Notion i Python

Utilitzarem l'API Notion no oficial, perquè l'oficial encara no s'ha lliurat.

Fer una biblioteca domèstica amb Notion i Python

Aneu a Notion, premeu Ctrl + Maj + J, aneu a Aplicació -> Cookies, copieu token_v2 i anomeneu-lo TOKEN. Després anem a la pàgina que necessitem amb el rètol de la biblioteca i copiem l'enllaç. L'anomenem NOCIÓ.

Després escrivim el codi per connectar-nos a Notion.

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

A continuació, escrivim una funció per afegir una fila a la taula.

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

Que està passant aquí. Agafem i afegim una nova fila a la taula de la primera fila. A continuació, dividim el nostre camí per "/" i obtenim etiquetes. Etiquetes: en termes d'"Art", "Disseny", qui és l'autor, etc. A continuació, establim tots els camps necessaris de la placa.

Part 3. Comptar paraules, hores i altres delícies

Aquesta és una tasca més difícil. Com recordem, tenim dos formats: epub i pdf. Si tot està clar amb l'epub - probablement les paraules hi són segurs, aleshores amb el pdf tot no està tan clar: pot consistir simplement en imatges enganxades.

Així doncs, la nostra funció per comptar paraules en PDF serà així: prenem el nombre de pàgines i multipliquem per una determinada constant (el nombre mitjà de paraules per pàgina).

Aquí està ella:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Aquesta WORDS_PER_PAGE per a una pàgina A4 és d'aproximadament 300.

Ara anem a escriure una funció per comptar pàgines. Farem servir PyPDF2.

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

A continuació, escriurem una cosa per comptar pàgines a Epub. Fem servir epub_converter. Aquí agafem el llibre, el convertim en línies i comptem les paraules de cada línia.

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)

Ara calculem el temps. Agafem el nostre recompte de paraules preferit i el dividim per la teva velocitat de lectura.

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

Part 4. Connectant totes les parts

Hem de recórrer tots els camins possibles a la nostra carpeta de llibres. Comproveu si ja hi ha un llibre a Notion: si n'hi ha, ja no necessitem crear una línia.
Aleshores hem de determinar el tipus de fitxer, en funció d'això, comptar el nombre de paraules. Afegeix un llibre al final.

Aquest és el codi que obtenim:

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)

I la funció per comprovar si s'ha afegit un llibre té aquest aspecte:

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

Conclusió

Gràcies a tots els que llegiu aquest article. Espero que us ajudi a llegir més :)

Font: www.habr.com

Afegeix comentari