Fazendo uma biblioteca doméstica com Notion e Python

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.

Fazendo uma biblioteca doméstica com Notion e Python

Usaremos a API Notion não oficial, pois a oficial ainda não foi entregue.

Fazendo uma biblioteca doméstica com Notion e Python

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 pyPDF2.

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 epub_converter. Aqui pegamos o livro, convertemos em linhas e contamos as palavras de cada linha.

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

Adicionar um comentário