Tworzenie domowej biblioteki za pomocą Notion i Pythona

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.

Tworzenie domowej biblioteki za pomocą Notion i Pythona

Będziemy korzystać z nieoficjalnego API Notion, ponieważ oficjalne nie zostało jeszcze dostarczone.

Tworzenie domowej biblioteki za pomocą Notion i Pythona

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 pyPDF2.

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 epub_converter. Tutaj bierzemy książkę, przekształcamy ją w wiersze i liczymy słowa w każdym wierszu.

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

Dodaj komentarz