Sempre me interessei em saber a melhor forma de distribuir os livros da minha biblioteca eletrônica. No final, cheguei a esta opção com cálculo automático do número de páginas e outras guloseimas. Peço a todas as pessoas interessadas em cat.
Parte 1. Dropbox
Todos os meus livros estão no dropbox. São 4 categorias nas quais dividi tudo: Livro Didático, Referência, Ficção, Não Ficção. Mas não adiciono livros de referência à mesa.
A maioria dos livros é .epub, o restante é .pdf. Ou seja, a solução final deve de alguma forma abranger ambas as opções.
Meus caminhos para os livros são mais ou menos assim:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Se o livro for de ficção, então a categoria (ou seja, “Design” no caso acima) é removida.
Resolvi não me preocupar com a API do Dropbox, pois tenho o aplicativo deles que sincroniza a pasta. Ou seja, o plano é este: pegamos os livros da pasta, passamos cada livro por um contador de palavras e adicionamos ao Notion.
Parte 2. Adicione uma linha
A tabela em si deve ser parecida com isto. ATENÇÃO: é melhor fazer os nomes das colunas em latim.
Usaremos a API Notion não oficial, pois a oficial ainda não foi entregue.
Vá para o Notion, pressione Ctrl + Shift + J, vá para Aplicativo -> Cookies, copie token_v2 e chame-o de TOKEN. Em seguida, vamos para a página que precisamos com a placa da biblioteca e copiamos o link. Chamamos isso de NOÇÃO.
Em seguida, escrevemos o código para conectar-se ao Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
A seguir, vamos escrever uma função para adicionar uma linha à tabela.
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
O que está acontecendo aqui. Pegamos e adicionamos uma nova linha à tabela na primeira linha. A seguir, dividimos nosso caminho ao longo de “/” e obtemos as tags. Tags - em termos de “Arte”, “Design”, quem é o autor, e assim por diante. Em seguida definimos todos os campos necessários da placa.
Parte 3. Contando palavras, horas e outras delícias
Esta é uma tarefa mais difícil. Como lembramos, temos dois formatos: epub e pdf. Se tudo estiver claro com o epub - provavelmente as palavras estão lá, então nem tudo está tão claro com o pdf: ele pode consistir simplesmente em imagens coladas.
Portanto, nossa função para contar palavras em PDF ficará assim: pegamos o número de páginas e multiplicamos por uma determinada constante (o número médio de palavras por página).
Aqui está:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Este WORDS_PER_PAGE para uma página A4 é de aproximadamente 300.
Agora vamos escrever uma função para contar páginas. Nós vamos usar
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
A seguir, escreveremos algo para contar páginas no Epub. Nós 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)
Agora vamos calcular o tempo. Pegamos nossa contagem de palavras favoritas e dividimos pela sua velocidade de leitura.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Parte 4. Conectando todas as peças
Precisamos percorrer todos os caminhos possíveis em nossa pasta de livros. Verifique se já existe um livro no Notion: se houver, não precisamos mais criar uma linha.
Então precisamos determinar o tipo de arquivo, dependendo disso, contar a quantidade de palavras. Adicione um livro no final.
Este é o código que obtemos:
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)
E a função para verificar se um livro foi adicionado fica assim:
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
Conclusão
Obrigado a todos que leram este artigo. Espero que ajude você a ler mais :)
Fonte: habr.com