Creare una libreria domestica con Notion e Python

Sono sempre stato interessato a come distribuire al meglio i libri nella mia biblioteca elettronica. Alla fine sono arrivato a questa opzione con il calcolo automatico del numero di pagine e altre chicche. Chiedo a tutti gli interessati di cui alla cat.

Parte 1. Dropbox

Tutti i miei libri sono su Dropbox. Ci sono 4 categorie in cui ho diviso tutto: Libri di testo, Consultazione, Narrativa, Saggistica. Ma non aggiungo libri di consultazione alla tabella.

La maggior parte dei libri sono in formato .epub, il resto in formato .pdf. Cioè, la soluzione finale deve in qualche modo coprire entrambe le opzioni.

Il mio percorso verso i libri è più o meno questo:

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

Se il libro è narrativa, la categoria (ovvero "Design" nel caso precedente) viene rimossa.

Ho deciso di non preoccuparmi delle API di Dropbox, dato che ho la loro applicazione che sincronizza la cartella. Cioè, il piano è questo: prendiamo i libri dalla cartella, eseguiamo ogni libro attraverso un contatore di parole e lo aggiungiamo a Notion.

Parte 2. Aggiungi una linea

La tabella stessa dovrebbe assomigliare a questa. ATTENZIONE: è meglio scrivere i nomi delle colonne in latino.

Creare una libreria domestica con Notion e Python

Utilizzeremo l'API Notion non ufficiale, perché quella ufficiale non è stata ancora consegnata.

Creare una libreria domestica con Notion e Python

Vai su Notion, premi Ctrl + Shift + J, vai su Applicazione -> Cookie, copia token_v2 e chiamalo TOKEN. Quindi andiamo alla pagina che ci serve con il segno della biblioteca e copiamo il collegamento. La chiamiamo NOZIONE.

Quindi scriviamo il codice per connetterci a Notion.

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

Successivamente, 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] == "Художественное":
            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

Cosa sta succedendo qui. Prendiamo e aggiungiamo una nuova riga alla tabella nella prima riga. Successivamente, dividiamo il nostro percorso lungo "/" e otteniamo i tag. Tag - in termini di "Arte", "Design", chi è l'autore e così via. Quindi impostiamo tutti i campi necessari della piastra.

Parte 3. Contare parole, ore e altri piaceri

Questo è un compito più difficile. Come ricordiamo, abbiamo due formati: epub e pdf. Se con l'epub tutto è chiaro - probabilmente le parole sono lì di sicuro, allora con il pdf non tutto è così chiaro: potrebbe consistere semplicemente di immagini incollate.

Quindi la nostra funzione per contare le parole nel PDF sarà simile a questa: prendiamo il numero di pagine e moltiplichiamo per una certa costante (il numero medio di parole per pagina).

Eccolo:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Queste WORDS_PER_PAGE per una pagina A4 sono circa 300.

Ora scriviamo una funzione per contare le pagine. Noi useremo pyPDF2.

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

Successivamente, scriveremo qualcosa per contare le pagine in Epub. Noi usiamo epub_convertitore. 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 conteggio delle nostre parole preferite e lo dividiamo per la velocità di lettura.

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

Parte 4. Collegamento di tutte le parti

Dobbiamo percorrere tutti i percorsi possibili nella nostra cartella dei libri. Controlla se il libro esiste già in Notion: in tal caso non abbiamo più bisogno di creare una riga.
Quindi dobbiamo determinare il tipo di file e, a seconda di questo, contare il numero di parole. Aggiungi un libro alla fine.

Questo è il codice che otteniamo:

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 la funzione per verificare se un libro è stato aggiunto è simile a questa:

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 coloro che hanno letto questo articolo. Spero che ti aiuti a leggere di più :)

Fonte: habr.com

Aggiungi un commento