Creiamo una libreria domestica con Notion e Python

Sono sempre stato curioso di come ottimizzare la distribuzione dei libri nella mia biblioteca elettronica. Alla fine, sono arrivato a una soluzione con il conteggio automatico delle pagine e altre funzionalità interessanti. Invito tutti gli interessati a scoprire di più.

Parte 1. Dropbox

Tutti i miei libri sono su Dropbox. Ho diviso tutto in 4 categorie: Testo, Manuale, Narrativa, Non-Narrativa. Tuttavia, non aggiungo i manuali nella tabella.

La maggior parte dei libri sono in .epub, gli altri sono in .pdf. Quindi, la soluzione finale deve coprire entrambe le opzioni.

I percorsi per i libri sono più o meno questi:

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

Se il libro è di narrativa, la categoria (cioè “Design” nel caso precedente) viene rimossa.

Ho deciso di non complicarmi la vita con l'API di Dropbox, fortunatamente ho installato la loro app che sincronizza la cartella. Quindi il piano è questo: prendiamo i libri dalla cartella, li passiamo attraverso un contatore di parole e li aggiungiamo a Notion.

Parte 2. Aggiungiamo una riga

La tabella dovrebbe apparire all'incirca in questo modo. ATTENZIONE: è meglio utilizzare caratteri latini per i nomi delle colonne.

Creiamo una libreria domestica con Notion e Python

Utilizzeremo l'API non ufficiale di Notion, poiché quella ufficiale non è ancora stata fornita.

Creiamo una libreria domestica con Notion e Python

Andiamo su Notion, premiamo Ctrl + Shift + J, andiamo su Applicazione -> Cookie, copiamo token_v2 e lo chiamiamo TOKEN. Poi andiamo sulla pagina che ci serve con la tabella della biblioteca e copiamo il link. Lo chiamiamo NOTION.

Poi scriviamo il codice per collegarci a Notion.

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

Ora scriviamo una funzione per aggiungere una riga alla tabella.

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] == "Fiction":
            row.author = tags[2]

        elif tags[0] == "Non-Fiction":
            row.tags = tags[2]

        elif tags[0] == "Textbooks":
            row.tags = tags[2]

    if len(tags) >= 4:
        row.author = tags[3]

    row.hours = hours
    row.pages = pages_count
    row.words = words_count

Cosa sta succedendo qui. Stiamo aggiungendo una nuova riga alla tabella nella prima riga. Poi splittiamo il nostro percorso in base a "/" e otteniamo i tag. I tag riguardano le categorie come "Fiction", "Design", chi è l'autore, e così via. Infine, impostiamo tutti i campi necessari della tabella.

Parte 3. Contiamo parole, ore e altre belle cose.

Questo è un compito un po' più complesso. Come sappiamo, ci sono due formati: ePub e PDF. Se per l'ePub è tutto chiaro — ci sono sicuramente delle parole, per il PDF la situazione non è così semplice: può consistere semplicemente in immagini unite.

Quindi, la funzione per contare le parole nel PDF sarà la seguente: prendiamo il numero di pagine e lo moltiplichiamo per una costante specifica (numero medio di parole per pagina).

Ecco qui:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Il valore di WORDS_PER_PAGE per una pagina A4 è di circa 300.

Ora scriviamo una funzione per contare le pagine. Utilizzeremo PyPDF2.

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

Successivamente, scriviamo qualcosa per contare le pagine nell'ePub. Useremo epub_converter. Qui prendiamo il libro, lo convertiamo in righe e contiamo le parole per ogni riga.

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)

Ora calcoliamo il tempo. Prendiamo il nostro amato numero di parole e lo dividiamo per la vostra velocità di lettura.

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

Parte 4. Uniamo tutte le parti

Dobbiamo esaminare tutti i possibili percorsi nella nostra cartella dei libri. Controllare se un libro è già presente in Notion: se sì, non è necessario creare la riga.
Poi dobbiamo determinare il tipo di file, e in base a questo contare il numero di parole. Infine, aggiungere il libro.

Ecco il codice che abbiamo ottenuto:

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)

La funzione per controllare se il libro è già stato aggiunto è così:

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

Conclusione

Grazie a tutti per aver letto questo articolo. Spero possa aiutarti a leggere di più 🙂

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster