Zawsze interesowało mnie, jak najlepiej dystrybuować książki w mojej bibliotece elektronicznej. W końcu doszedłem do tej opcji z automatycznym obliczaniem liczby stron i innymi bajerami. Wszystkich zainteresowanych proszę pod kat.
Część 1. Dropbox
Wszystkie moje książki są na Dropboxie. Istnieją 4 kategorie, na które wszystko podzieliłem: Podręcznik, Literatura, Beletrystyka, Literatura faktu. Ale nie dodaję podręczników do tabeli.
Większość książek to .epub, reszta to .pdf. Oznacza to, że ostateczne rozwiązanie musi w jakiś sposób obejmować obie opcje.
Moja droga do książek wygląda mniej więcej tak:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Jeśli książka jest fikcją, kategoria (w powyższym przypadku „Projekt”) jest usuwana.
Postanowiłem nie zawracać sobie głowy API Dropbox, ponieważ mam ich aplikację, która synchronizuje folder. To znaczy, plan jest taki: bierzemy książki z folderu, przepuszczamy każdą książkę przez licznik słów i dodajemy do Notion.
Część 2. Dodaj linię
Sam stół powinien wyglądać mniej więcej tak. UWAGA: lepiej jest tworzyć nazwy kolumn w języku łacińskim.
Będziemy korzystać z nieoficjalnego API Notion, ponieważ oficjalne nie zostało jeszcze dostarczone.
Przejdź do Notion, naciśnij Ctrl + Shift + J, przejdź do Aplikacja -> Ciasteczka, skopiuj token_v2 i nazwij go TOKEN. Następnie przechodzimy na potrzebną nam stronę ze znakiem biblioteki i kopiujemy link. Nazywamy to POJĘCIEM.
Następnie piszemy kod umożliwiający połączenie z Notion.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Następnie napiszmy funkcję dodającą wiersz do tabeli.
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 tu się dzieje. Bierzemy i dodajemy nowy wiersz do tabeli w pierwszym wierszu. Następnie dzielimy naszą ścieżkę wzdłuż „/” i otrzymujemy tagi. Tagi - pod względem „sztuki”, „projektu”, kto jest autorem i tak dalej. Następnie ustawiamy wszystkie niezbędne pola tablicy.
Część 3. Liczenie słów, godzin i innych rozkoszy
To jest trudniejsze zadanie. Jak pamiętamy, mamy dwa formaty: epub i pdf. Jeśli w przypadku epuba wszystko jest jasne - prawdopodobnie są tam słowa, to w przypadku pdf nie wszystko jest już tak jasne: może on po prostu składać się z sklejonych obrazów.
Zatem nasza funkcja zliczania słów w formacie PDF będzie wyglądać następująco: bierzemy liczbę stron i mnożymy przez pewną stałą (średnią liczbę słów na stronę).
Tutaj jest:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
Ta WORDS_PER_PAGE na stronie A4 wynosi około 300.
Napiszmy teraz funkcję zliczającą strony. Użyjemy
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Następnie napiszemy coś o liczeniu stron w Epubie. Używamy
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 obliczmy czas. Bierzemy naszą ulubioną liczbę słów i dzielimy ją przez szybkość czytania.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Część 4. Łączenie wszystkich części
Musimy przejść wszystkimi możliwymi ścieżkami w naszym folderze książek. Sprawdź, czy księga już istnieje w Notionie: jeśli tak, nie musimy już tworzyć linijki.
Następnie musimy określić typ pliku, w zależności od tego policzyć liczbę słów. Na koniec dodaj książkę.
Oto kod, który otrzymujemy:
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 funkcja sprawdzająca czy książka została dodana wygląda następująco:
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
wniosek
Dziękuję wszystkim, którzy przeczytali ten artykuł. Mam nadzieję, że pomoże Ci to przeczytać więcej :)
Źródło: www.habr.com