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.
Usaremos la API de Notion no oficial, porque la oficial aún no se ha entregado.
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
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
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