Crear una biblioteca casera con Notion y Python

Siempre me ha interesado saber cuál es la mejor manera de distribuir los libros en mi biblioteca electrónica. Al final, llegué a esta opción con cálculo automático del número de páginas y otras ventajas. Pregunto a todas las personas interesadas bajo cat.

Parte 1. Dropbox

Todos mis libros están en Dropbox. Hay 4 categorías en las que dividí todo: Libro de texto, Referencia, Ficción, No ficción. Pero no agrego libros de referencia a la mesa.

La mayoría de los libros son .epub, el resto son .pdf. Es decir, la solución final debe cubrir de alguna manera ambas opciones.

Mis caminos hacia los libros son algo como esto:

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

Si el libro es ficción, entonces se elimina la categoría (es decir, “Diseño” en el caso anterior).

Decidí no molestarme con la API de Dropbox, ya que tengo su aplicación que sincroniza la carpeta. Es decir, el plan es el siguiente: sacamos libros de la carpeta, pasamos cada libro por un contador de palabras y lo agregamos a Notion.

Parte 2. Agregar una línea

La tabla en sí debería verse así. ATENCIÓN: es mejor hacer los nombres de las columnas en latín.

Crear una biblioteca casera con Notion y Python

Usaremos la API de Notion no oficial, porque la oficial aún no se ha entregado.

Crear una biblioteca casera con Notion y Python

Vaya a Notion, presione Ctrl + Shift + J, vaya a Aplicación -> Cookies, copie token_v2 y llámelo TOKEN. Luego vamos a la página que necesitamos con el cartel de la biblioteca y copiamos el enlace. Lo llamamos NOCIÓN.

Luego escribimos el código para conectarnos a Notion.

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

A continuación, escribamos una función para agregar una fila a la tabla.

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á pasando aqui. Tomamos y agregamos una nueva fila a la tabla en la primera fila. A continuación, dividimos nuestra ruta por "/" y obtenemos etiquetas. Etiquetas: en términos de "Arte", "Diseño", quién es el autor, etc. Luego configuramos todos los campos necesarios de la placa.

Parte 3. Contar palabras, horas y otras delicias

Esta es una tarea más difícil. Como recordamos, disponemos de dos formatos: epub y pdf. Si con el epub todo está claro (las palabras probablemente estén ahí), entonces no todo está tan claro con el pdf: puede que consista simplemente en imágenes pegadas.

Entonces nuestra función para contar palabras en PDF se verá así: tomamos el número de páginas y lo multiplicamos por una determinada constante (el número promedio de palabras por página).

Aquí está:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Este WORDS_PER_PAGE para una página A4 es aproximadamente 300.

Ahora escribamos una función para contar páginas. Usaremos Pypdf2.

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

A continuación, escribiremos algo para contar páginas en Epub. Usamos epub_converter. Aquí tomamos el libro, lo convertimos en líneas y contamos las palabras de cada línea.

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)

Ahora calculemos el tiempo. Tomamos nuestro recuento de palabras favoritas y lo dividimos por su velocidad de lectura.

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

Parte 4. Conectando todas las piezas.

Necesitamos recorrer todas las rutas posibles en nuestra carpeta de libros. Comprobar si ya hay un libro en Notion: si lo hay, ya no necesitamos crear una línea.
Luego debemos determinar el tipo de archivo, dependiendo de esto, contar la cantidad de palabras. Añade un libro al final.

Este es el código que obtenemos:

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)

Y la función para comprobar si se ha agregado un libro se ve así:

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ón

Gracias a todos los que leyeron este artículo. Espero que te ayude a leer más :)

Fuente: habr.com

Añadir un comentario