Vedno me je zanimalo, kako najbolje razdeliti knjige v svoji elektronski knjižnici. Na koncu sem prišel do te možnosti s samodejnim izračunom števila strani in ostalih dobrot. Prosim vse zainteresirane pod kat.
1. del. Dropbox
Vse moje knjige so na dropboxu. Obstajajo 4 kategorije, v katere sem razdelil vse: učbenik, referenca, leposlovje, stvarna literatura. Toda referenčnih knjig ne dodajam na tabelo.
Večina knjig je .epub, ostale so .pdf. Se pravi, da mora končna rešitev nekako pokriti obe možnosti.
Moje poti do knjig so nekako takole:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Če je knjiga leposlovje, se kategorija (tj. »Oblikovanje« v zgornjem primeru) odstrani.
Odločil sem se, da se ne bom ukvarjal z Dropbox API, saj imam njihovo aplikacijo, ki sinhronizira mapo. Se pravi, načrt je tak: vzamemo knjige iz mape, vsako knjigo poženemo skozi števec besed in jo dodamo v Notion.
Del 2. Dodajte vrstico
Sama miza bi morala izgledati nekako takole. POZOR: imena stolpcev je bolje narediti v latinici.
Uporabili bomo neuradni Notion API, ker uradni še ni bil dostavljen.
Pojdite na Notion, pritisnite Ctrl + Shift + J, pojdite na Application -> Cookies, kopirajte token_v2 in ga poimenujte TOKEN. Nato gremo na stran, ki jo potrebujemo, z znakom knjižnice in kopiramo povezavo. Imenujemo ga POJM.
Nato napišemo kodo za povezavo z Notionom.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Nato napišimo funkcijo za dodajanje vrstice v 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
Kaj se tukaj dogaja. Vzamemo in v prvo vrstico tabeli dodamo novo vrstico. Nato svojo pot razdelimo vzdolž "/" in dobimo oznake. Oznake - v smislu "Umetnost", "Oblikovanje", kdo je avtor itd. Nato nastavimo vsa potrebna polja tablice.
3. del. Štetje besed, ur in drugih užitkov
To je težja naloga. Kot se spomnimo, imamo dva formata: epub in pdf. Če je z epubom vse jasno - besede so verjetno tam, potem o pdfju ni vse tako jasno: morda je preprosto sestavljen iz zlepljenih slik.
Torej bo naša funkcija za štetje besed v PDF izgledala takole: vzamemo število strani in ga pomnožimo z določeno konstanto (povprečno število besed na stran).
Tukaj je:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Ta WORDS_PER_PAGE za stran A4 je približno 300.
Zdaj pa napišimo funkcijo za štetje strani. Bomo uporabili
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Nato bomo napisali stvar za štetje strani v Epubu. Uporabljamo
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)
Zdaj pa izračunajmo čas. Vzamemo število naših najljubših besed in ga delimo z vašo hitrostjo branja.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Del 4. Povezovanje vseh delov
Iti moramo skozi vse možne poti v naši mapi s knjigami. Preverite, ali v Notionu že obstaja knjiga: če obstaja, nam ni več treba ustvariti vrstice.
Nato moramo določiti vrsto datoteke, glede na to prešteti število besed. Dodajte knjigo na koncu.
To je koda, ki jo dobimo:
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)
In funkcija za preverjanje, ali je bila knjiga dodana, izgleda takole:
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
Zaključek
Hvala vsem, ki ste prebrali ta članek. Upam, da vam bo pomagalo prebrati več :)
Vir: www.habr.com