Vždy ma zaujímalo, ako najlepšie distribuovať knihy v mojej elektronickej knižnici. Nakoniec som sa k tejto možnosti dostal s automatickým výpočtom počtu strán a ďalšími vychytávkami. Prosím všetkých záujemcov pod kat.
Časť 1. Dropbox
Všetky moje knihy sú na schránke. Sú 4 kategórie, do ktorých som všetko rozdelil: Učebnica, Referencie, Beletria, Literatúra faktu. Referenčné knihy však do tabuľky nepridávam.
Väčšina kníh je .epub, zvyšok je .pdf. To znamená, že konečné riešenie musí nejako pokryť obe možnosti.
Moje cesty ku knihám sú asi takéto:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Ak je kniha beletria, kategória (t. j. „Dizajn“ vo vyššie uvedenom prípade) sa odstráni.
Rozhodol som sa nezaťažovať Dropbox API, keďže mám ich aplikáciu, ktorá synchronizuje priečinok. To znamená, že plán je takýto: vyberieme knihy zo zložky, každú knihu prejdeme cez počítadlo slov a pridáme ju do Notion.
Časť 2. Pridajte riadok
Samotný stôl by mal vyzerať asi takto. POZOR: Názvy stĺpcov je lepšie robiť v latinke.
Použijeme neoficiálne API Notion, pretože to oficiálne ešte nebolo doručené.
Prejdite na Notion, stlačte Ctrl + Shift + J, prejdite na Aplikácia -> Cookies, skopírujte token_v2 a nazvite ho TOKEN. Potom prejdeme na požadovanú stránku s označením knižnice a skopírujeme odkaz. Hovoríme tomu NOTION.
Potom napíšeme kód na pripojenie k Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Ďalej napíšme funkciu na pridanie riadku do tabuľky.
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
Čo sa tu deje. Vezmeme a pridáme nový riadok do tabuľky v prvom riadku. Ďalej rozdelíme našu cestu pozdĺž „/“ a získame značky. Tagy - z hľadiska „umenia“, „dizajnu“, kto je autorom atď. Potom nastavíme všetky potrebné polia taniera.
Časť 3. Počítanie slov, hodín a iných pôžitkov
Toto je náročnejšia úloha. Ako si pamätáme, máme dva formáty: epub a pdf. Ak je všetko jasné s epub - slová sú tam pravdepodobne, potom nie je všetko také jasné o pdf: môže jednoducho pozostávať z lepených obrázkov.
Naša funkcia na počítanie slov v PDF bude teda vyzerať takto: vezmeme počet strán a vynásobíme určitou konštantou (priemerný počet slov na stránku).
Tu je:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Toto WORDS_PER_PAGE na stranu A4 je približne 300.
Teraz napíšme funkciu na počítanie stránok. Budeme používať
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Ďalej napíšeme vec na počítanie stránok v Epub. Používame
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)
Teraz vypočítajme čas. Zoberieme náš obľúbený počet slov a vydelíme ho rýchlosťou čítania.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Časť 4. Spojenie všetkých častí
Musíme prejsť všetkými možnými cestami v našej zložke kníh. Skontrolujte, či už v Notion existuje kniha: ak existuje, už nemusíme vytvárať riadok.
Potom musíme určiť typ súboru, v závislosti od toho spočítať počet slov. Na konci pridajte knihu.
Toto je kód, ktorý dostaneme:
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)
A funkcia na kontrolu, či bola kniha pridaná, vyzerá takto:
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
Záver
Ďakujem všetkým, ktorí si prečítali tento článok. Dúfam, že vám to pomôže prečítať si viac :)
Zdroj: hab.com