Mind on alati huvitav, kuidas oma e-raamatukogus raamatud paremini üles seada. Lõppkokkuvõttes jõudsin sellise lahenduseni, mis automaatselt arvestab lehekülgede arvu ja pakub muid mugavusi. Kõiki huvilisi palun lugema edasi.
Jagamine 1. Dropbox
Kõik raamatud asuvad mul Dropboxis. Olen need jaganud neljaks kategooriaks: Õpik, Viidatud, Ilukirjandus, Teaduslik. Kuid viidatud raamatud ma tabelisse ei lisa.
Enamik raamatuid on .epub formaadis, teised aga .pdf. See tähendab, et lõpplahendus peaks katma mõlemad variandid.
Raamatute teed on mul umbes sellised:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub Kui raamat on ilukirjanduslik, eemaldatakse kategooria (näiteks „Disain” ülaltoodud juhul).
Otsustasin mitte vaeva näha Dropboxi API-ga, kuna mul on installitud nende rakendus, mis sünkroniseerib kausta. Plaan on järgmine: võtame raamatud kaustast, töötleme iga raamatu sõnade loendiga ning lisame Notionisse.
Jagamine 2. Lisame rea
Tabel peaks välja nägema umbes järgmiselt. TÄHELEPANU: veergude nimetused on parem kirjutada ladina tähtedega.

Kasutame mitteformaalsest Notioni API’t, kuna ametlikku pole veel saadaval.

Minge Notionisse, vajutage Ctrl + Shift + J, minge menüüsse Rakendus -> Küpsised, kopeerige token_v2 ja nimetage see TOKEN. Siis minge soovitud lehele, kus on raamatukogu tabel, ja kopeerige link. Nimetage see NOTION.
Seejärel kirjutame Notioniga ühenduse saamise koodi.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()Nüüd kirjutame funktsiooni rea lisamiseks tabelisse.
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] == "Kunstiline":
row.author = tags[2]
elif tags[0] == "Mittekunstiline":
row.tags = tags[2]
elif tags[0] == "Õpikud":
row.tags = tags[2]
if len(tags) >= 4:
row.author = tags[3]
row.hours = hours
row.pages = pages_count
row.words = words_countMis siin toimub. Me võtame ja lisame uue rea tabelisse esimesse ritta. Seejärel jagame oma tee "/" kohaselt ja saame märksõnad. Märksõnad on nagu "Kunstiline", "Disain", kes on autor ja nii edasi. Siis määrame kõik vajalikud tabeli väljad.
Osa 3. Arvutame sõnad, tunnid ja muud toredused.
See on juba keerulisem ülesanne. Nagu mäletame, on meil kaks formaati: ePub ja PDF. Kui ePub-i osas ei ole küsimust — seal on tõenäoliselt sõnad olemas, siis PDF-i puhul ei ole kõik nii selge: see võib koosneda lihtsalt liimitud piltidest.
Seega näeb PDF-is sõnade arvu arvestamise funktsioon välja järgmine: võtame lehekülgede arvu ja korrutame selle teatud konstantsiga (keskmine sõnade arv leheküljel).
Siin see on:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGESelle WORDS_PER_PAGE A4 lehekülje kohta on ligikaudu 300.
Nüüd kirjutame funktsiooni lehekülgede arvu arvestamiseks. Kasutame .
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()Järgmisena kirjutame koodi lehekülgede arvestamiseks ePub-is. Kasutame . Siin võtame raamatu, konverteerime selle ridadeks ja loendame igas reas sõnad.
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)Nüüd arvestame aega. Võtame meie lemmik sõnade arvu ja jagame selle teie lugemiskiirus.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10Osa 4. Ühendame kõik osad
Peame uurima kõiki võimalikke teid meie raamatute kaustas. Kontrollime, kas raamat on juba Notionis: kui on, siis rida looma ei pea.
Siis peame määrama faili tüübi, sõltuvalt sellest arvutame sõnade arvu. Lõpuks lisame raamatu.
Siin on meie kood:
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)Ja funktsioon, mis kontrollib, kas raamat on lisatud, näeb välja järgmine:
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 FalseKokkuvõte
Aitäh kõigile, kes selle artikli läbi lugesid. Loodan, et see aitab teil rohkem lugeda 🙂
Allikas: habr.com
