Mind on alati huvitav, kuidas oma e-raamatukogus raamatuid paremini jaotada. Lõpuks leidsin sellise lahenduse automaatse lehekülgede arvu ja teiste lisafunktsioonidega. Kõiki huvilisi palun alla.
Osa 1. Dropbox
Kõik minu raamatud on Dropboxis. Olen need jaganud neljale kategooriale: Õpik, Käsiraamat, Ilukirjandus, Mitte-ilukirjandus. Käsiraamatud ei ole tabelisse lisatud.
Enamik raamatutest on .epub formaadis, ülejäänud on .pdf. Seega peab lõpplahendus katma mõlemad variandid.
Raamatute teed on mul sellised:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub Kui raamat on ilukirjandus, siis kategooria (st "Disain" eelnevas näites) kustutatakse.
Otsustasin mitte vaevata Dropboxi API’ga, kuna mul on nende rakendus, mis sünkroniseerib kausta. Seega plaan on selline: võtame raamatud kaustast, iga raamatu töötleme sõnade loendi kaudu ja lisame Notionisse.
Osa 2. Lisame rea
Tabel peaks välja nägema umbes järgmiselt. TÄHELEPANU: veergude nimetused on parem kirjutada ladina tähestikus.

Kasutame mitteformaalseid Notioni API-sid, sest ametlikud pole veel kohal.

Läheme Notioni, vajutame Ctrl + Shift + J, läheme rakendusse -> Küpsised, kopeerime token_v2 ja nimetame selle TOKENiks. Siis läheme soovitud tabelile ja kopeerime lingi. Nimega NOTION.
Siis kirjutame koodi Notioni ühendamiseks.
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] == "Ilukirjandus":
row.author = tags[2]
elif tags[0] == "Mitte-ilukirjandus":
row.tags = tags[2]
elif tags[0] == "Õpik":
row.tags = tags[2]
if len(tags) >= 4:
row.author = tags[3]
row.hours = hours
row.pages = pages_count
row.words = words_countMida me siin teeme. Me võtame ja lisame uue rea tabelisse esimesse ritta. Edasi jagame meie tee „/” järgi ja saame sildid. Sildid on nagu „Ilukirjandus”, „Disain”, kes on autor ja nii edasi. Siis määrame kõik vajalikud tabeli väljad.
Osa 3. Arvutame sõnu, tunde ja muid vahvaid asju
See on keerulisem ülesanne. Nagu me mäletame, on meil kaks formaati: EPUB ja PDF. Kui EPUB-formati puhul on asi arusaadav — seal on tõenäoliselt sõnu palju, siis PDF’i puhul ei ole kõik nii üheselt mõistetav: see võib koosneda lihtsalt ühendatud piltidest.
Seega näeb PDF-sõnade arvu arvutamise funktsioon välja järgmine: võtame lehekülgede arvu ja korrutame selle teatud konstandiga (keskmine sõnade arv leheküljel).
Siin see on:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGEWORDS_PER_PAGE väärtus A4 lehe kohta on umbes 300.
Nüüd kirjutame funktsiooni lehekülgede arvu arvutamiseks. Kasutame .
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()Jätkame EPUB lehekülgede arvu arvutamise funktsiooniga. Kasutame . Siin võtame raamatu, konverteerime selle ridadeks ja iga rea puhul arvutame 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 arvutame lugemiseks kuluva aja. Võtame meie lemmik sõnade arvu ja jagame selle teie lugemiskiirusena.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10Osa 4. Kogume kõik osad kokku
Peame uurima kõiki võimalikke teid meie raamatute kaustas. Kontrollime, kas raamat on juba Notionis olemas: kui on — siis me rida looma ei pea.
Seejärel peame määrama faili tüübi ja selle alusel arvutama sõnade arvu. Lõpus lisama raamatu.
Selline kood meil lõpuks saab:
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 raamatute olemasolu kontrollimiseks näeb välja selline:
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
