Créer une bibliothèque personnelle avec Notion et Python

J'ai toujours été intéressé par la meilleure façon de distribuer les livres dans ma bibliothèque électronique. Au final, je suis arrivé à cette option avec calcul automatique du nombre de pages et autres goodies. Je demande à toutes les personnes intéressées sous chat.

Partie 1. Dropbox

Tous mes livres sont sur Dropbox. Il y a 4 catégories dans lesquelles j'ai tout divisé : manuel, référence, fiction, non-fiction. Mais je n’ajoute pas d’ouvrages de référence au tableau.

La plupart des livres sont au format .epub, le reste est au format .pdf. Autrement dit, la solution finale doit, d’une manière ou d’une autre, couvrir les deux options.

Mes chemins vers les livres ressemblent à ceci :

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

Si le livre est une fiction, alors la catégorie (c'est-à-dire « Conception » dans le cas ci-dessus) est supprimée.

J'ai décidé de ne pas m'embêter avec l'API Dropbox, puisque j'ai leur application qui synchronise le dossier. Autrement dit, le plan est le suivant : nous prenons des livres du dossier, passons chaque livre dans un compteur de mots et l'ajoutons à Notion.

Partie 2. Ajouter une ligne

Le tableau lui-même devrait ressembler à ceci. ATTENTION : il est préférable de faire les noms de colonnes en latin.

Créer une bibliothèque personnelle avec Notion et Python

Nous utiliserons l'API Notion non officielle, car l'API officielle n'a pas encore été livrée.

Créer une bibliothèque personnelle avec Notion et Python

Allez dans Notion, appuyez sur Ctrl + Shift + J, allez dans Application -> Cookies, copiez token_v2 et appelez-le TOKEN. Ensuite, nous allons à la page dont nous avons besoin avec le signe de la bibliothèque et copions le lien. Nous l'appelons NOTION.

Ensuite, nous écrivons le code pour nous connecter à Notion.

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

Ensuite, écrivons une fonction pour ajouter une ligne au tableau.

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 se passe t-il ici. Nous prenons et ajoutons une nouvelle ligne au tableau dans la première ligne. Ensuite, nous divisons notre chemin le long de « / » et obtenons des balises. Tags - en termes d'« Art », de « Design », qui est l'auteur, etc. Ensuite, nous définissons tous les champs nécessaires de la plaque.

Partie 3. Compter les mots, les heures et autres délices

C'est une tâche plus difficile. Si nous nous en souvenons, nous avons deux formats : epub et pdf. Si tout est clair avec l'epub - les mots sont probablement là, alors tout n'est pas si clair avec le pdf : il peut simplement être constitué d'images collées.

Notre fonction de comptage de mots dans un PDF ressemblera donc à ceci : nous prenons le nombre de pages et le multiplions par une certaine constante (le nombre moyen de mots par page).

Ici c'est:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Ce WORDS_PER_PAGE pour une page A4 est d'environ 300.

Écrivons maintenant une fonction pour compter les pages. Nous utiliserons pyPDF2.

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

Ensuite, nous écrirons quelque chose pour compter les pages dans Epub. Nous utilisons convertisseur epub_. Ici, nous prenons le livre, le convertissons en lignes et comptons les mots pour chaque ligne.

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)

Calculons maintenant le temps. Nous prenons notre nombre de mots préférés et le divisons par votre vitesse de lecture.

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

Partie 4. Connecter toutes les pièces

Nous devons parcourir tous les chemins possibles dans notre dossier de livres. Vérifiez s'il y a déjà un livre dans Notion : s'il y en a, on n'a plus besoin de créer de ligne.
Ensuite, nous devons déterminer le type de fichier, en fonction de cela, compter le nombre de mots. Ajoutez un livre à la fin.

Voici le code que nous obtenons :

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)

Et la fonction pour vérifier si un livre a été ajouté ressemble à ceci :

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

Conclusion

Merci à tous ceux qui ont lu cet article. J'espère que cela vous aidera à en savoir plus :)

Source: habr.com

Ajouter un commentaire