Vždy mě zajímalo, jak nejlépe distribuovat knihy ve své elektronické knihovně. Nakonec jsem k této možnosti dospěl s automatickým výpočtem počtu stran a dalšími vychytávkami. Prosím všechny zájemce pod kat.
Část 1. Dropbox
Všechny mé knihy jsou na schránce. Jsou 4 kategorie, do kterých jsem vše rozdělil: Učebnice, Reference, Beletrie, Literatura faktu. Referenční knihy ale do tabulky nepřidávám.
Většina knih je .epub, zbytek je .pdf. To znamená, že konečné řešení musí nějak pokrýt obě možnosti.
Moje cesty ke knihám jsou asi tyto:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Pokud je kniha beletrie, pak je kategorie (tj. „Design“ ve výše uvedeném případě) odstraněna.
Rozhodl jsem se neobtěžovat Dropbox API, protože mám jejich aplikaci, která synchronizuje složku. To znamená, že plán je tento: vezmeme knihy ze složky, každou knihu projdeme počítadlem slov a přidáme ji do Notion.
Část 2. Přidejte řádek
Samotný stůl by měl vypadat nějak takto. POZOR: názvy sloupců je lepší dělat v latině.
Použijeme neoficiální Notion API, protože to oficiální ještě nebylo doručeno.
Přejděte do Notion, stiskněte Ctrl + Shift + J, přejděte do Aplikace -> Cookies, zkopírujte token_v2 a nazvěte jej TOKEN. Poté přejdeme na potřebnou stránku se znakem knihovny a zkopírujeme odkaz. Říkáme tomu NOTION.
Poté napíšeme kód pro připojení k Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Dále napíšeme funkci pro přidání řádku do tabulky.
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
Co se tam děje. Vezmeme a přidáme nový řádek do tabulky v prvním řádku. Dále rozdělíme naši cestu podél „/“ a získáme značky. Tagy - ve smyslu „Umění“, „Design“, kdo je autorem atd. Poté nastavíme všechna potřebná pole talíře.
Část 3. Počítání slov, hodin a jiné slasti
To je těžší úkol. Jak si pamatujeme, máme dva formáty: epub a pdf. Pokud je u epub vše jasné - slova tam pravděpodobně jsou, pak u pdf není vše tak jasné: může se jednoduše skládat ze slepených obrázků.
Naše funkce pro počítání slov v PDF tedy bude vypadat takto: vezmeme počet stránek a vynásobíme určitou konstantou (průměrný počet slov na stránku).
Zde je:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Tato WORDS_PER_PAGE pro stránku A4 je přibližně 300.
Nyní napíšeme funkci pro počítání stránek. Budeme používat
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Dále napíšeme věc pro počítání stránek v Epubu. Používáme
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)
Nyní spočítáme čas. Vezmeme náš oblíbený počet slov a vydělíme ho podle rychlosti čtení.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Část 4. Spojení všech dílů
Musíme projít všechny možné cesty v naší složce knih. Zkontrolujte, zda v Notion již existuje kniha: pokud existuje, nemusíme již vytvářet čáru.
Poté musíme určit typ souboru a v závislosti na tom spočítat počet slov. Na konec přidejte knihu.
Toto je kód, který 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 funkce pro kontrolu, zda byla kniha přidána, vypadá 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ávěr
Děkuji všem, kteří si přečetli tento článek. Doufám, že vám to pomůže číst dál :)
Zdroj: www.habr.com