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.

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

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_countCosa 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_PAGEIl valore di WORDS_PER_PAGE per una pagina A4 è di circa 300.
Ora scriviamo una funzione per contare le pagine. Utilizzeremo .
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 . 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) / 10Parte 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 FalseConclusione
Grazie a tutti per aver letto questo articolo. Spero possa aiutarti a leggere di più 🙂
Fonte: habr.com
