Mi ĉiam interesiĝis pri kiel plej bone distribui librojn en mia elektronika biblioteko. Fine, mi venis al ĉi tiu opcio kun aŭtomata kalkulo de la nombro da paĝoj kaj aliaj bonaĵoj. Mi petas ĉiujn interesatojn sub kato.
Parto 1. Dropbox
Ĉiuj miaj libroj estas en dropbox. Estas 4 kategorioj en kiuj mi dividis ĉion: Lernolibro, Referenco, Fikcio, Nefikcio. Sed mi ne aldonas konsultlibrojn al la tablo.
La plej multaj el la libroj estas .epub, la ceteraj estas .pdf. Tio estas, la fina solvo devas iel kovri ambaŭ opciojn.
Miaj vojoj al libroj estas io kiel ĉi tio:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Se la libro estas fikcio, tiam la kategorio (tio estas, "Dezajno" en la kazo supre) estas forigita.
Mi decidis ne ĝeni la Dropbox API, ĉar mi havas ilian aplikaĵon, kiu sinkronigas la dosierujon. Tio estas, la plano estas jena: ni prenas librojn el la dosierujo, kuras ĉiun libron tra vortkalkulilo kaj aldonas ĝin al Notion.
Parto 2. Aldonu linion
La tablo mem devus aspekti kiel ĉi tio. ATENTU: estas pli bone fari kolonnomojn en la latina.
Ni uzos la neoficialan Notion API, ĉar la oficiala ankoraŭ ne estis liverita.
Iru al Notion, premu Ctrl + Shift + J, iru al Apliko -> Kuketoj, kopiu token_v2 kaj nomu ĝin TOKEN. Poste ni iras al la paĝo, kiun ni bezonas kun la biblioteko-signo kaj kopiu la ligilon. Ni nomas ĝin NOCIO.
Poste ni skribas la kodon por konekti al Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Poste, ni skribu funkcion por aldoni vicon al la tabelo.
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
Kio okazas ĉi tie. Ni prenas kaj aldonas novan vicon al la tablo en la unua vico. Poste ni disigas nian vojon laŭ "/" kaj ricevas etikedojn. Etikedoj - laŭ "Arto", "Dezajno", kiu estas la aŭtoro, ktp. Tiam ni starigas ĉiujn necesajn kampojn de la telero.
Parto 3. Nombri vortojn, horojn kaj aliajn ĝojojn
Ĉi tio estas pli malfacila tasko. Kiel ni memoras, ni havas du formatojn: epub kaj pdf. Se ĉio estas klara ĉe la epub - la vortoj verŝajne estas tie, tiam ĉio ne estas tiel klara pri la pdf: ĝi povas simple konsisti el gluitaj bildoj.
Do nia funkcio por kalkuli vortojn en PDF aspektos jene: ni prenas la nombron da paĝoj kaj multobligas per certa konstanto (la averaĝa nombro da vortoj po paĝo).
Jen ŝi:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Ĉi tiu WORDS_PER_PAGE por paĝo A4 estas proksimume 300.
Nun ni skribu funkcion por kalkuli paĝojn. Ni uzos
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Poste, ni skribos aferon por kalkuli paĝojn en Epub. Ni uzas
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)
Nun ni kalkulu la tempon. Ni prenas nian plej ŝatatan vortkalkulon kaj dividas ĝin per via legadrapideco.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Parto 4. Konektante ĉiujn partojn
Ni devas trairi ĉiujn eblajn vojojn en nia dosierujo de libroj. Kontrolu ĉu jam estas libro en Notion: se ekzistas, ni ne plu bezonas krei linion.
Tiam ni devas determini la dosiertipo, depende de ĉi tio, kalkuli la nombron da vortoj. Aldonu libron ĉe la fino.
Jen la kodo, kiun ni ricevas:
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)
Kaj la funkcio por kontroli ĉu libro estis aldonita aspektas jene:
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
konkludo
Dankon al ĉiuj, kiuj legis ĉi tiun artikolon. Mi esperas, ke ĝi helpos vin legi pli :)
fonto: www.habr.com