Wir erstellen eine persönliche Bibliothek mit Notion und Python

Ich habe mich immer gefragt, wie ich die Bücher in meiner elektronischen Bibliothek besser organisieren kann. Schließlich kam ich zu einer Variante mit automatischer Seitenanzahl und anderen Vorteilen. Alle Interessierten lade ich dazu ein, weiterzulesen.

Teil 1. Dropbox

Alle Bücher liegen in meinem Dropbox. Es gibt 4 Kategorien, in die ich alles eingeteilt habe: Lehrbuch, Nachschlagewerk, Belletristik, Sachliteratur. Nachschlagewerke füge ich jedoch nicht in die Tabelle ein.

Der Großteil der Bücher sind .epub, die anderen sind .pdf. Das heißt, die endgültige Lösung sollte beide Varianten abdecken.

Die Pfade zu den Büchern sehen bei mir ungefähr so aus:

/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub 

Wenn das Buch Belletristik ist, wird die Kategorie (also „Design“ im vorigen Fall) weggelassen.

Ich habe mich entschieden, mich nicht mit der Dropbox-API zu beschäftigen, da ich die App installiert habe, die den Ordner synchronisiert. Der Plan ist also folgender: Wir nehmen die Bücher aus dem Ordner, lassen jedes Buch durch einen Wörterzähler laufen und fügen es in Notion ein.

Teil 2. Eine Zeile hinzufügen

Die Tabelle sollte ungefähr so aussehen. ACHTUNG: Die Spaltenüberschriften sollten besser in lateinischen Buchstaben geschrieben werden.

Wir erstellen eine persönliche Bibliothek mit Notion und Python

Wir werden die inoffizielle Notion-API verwenden, da die offizielle noch nicht verfügbar ist.

Wir erstellen eine persönliche Bibliothek mit Notion und Python

Wir gehen zu Notion, drücken Ctrl + Shift + J, gehen zu Anwendung -> Cookies, kopieren token_v2 und nennen es TOKEN. Dann gehen wir zu der benötigten Seite mit der Bibliothekstabelle und kopieren den Link. Nennen wir ihn NOTION.

Dann schreiben wir den Code für die Verbindung zu Notion.

database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()

Dann schreiben wir eine Funktion zum Hinzufügen einer Zeile in die Tabelle.

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] == "Belletristik":
            row.author = tags[2]

        elif tags[0] == "Sachliteratur":
            row.tags = tags[2]

        elif tags[0] == "Lehrbücher":
            row.tags = tags[2]

    if len(tags) >= 4:
        row.author = tags[3]

    row.hours = hours
    row.pages = pages_count
    row.words = words_count

Was passiert hier. Wir nehmen und fügen eine neue Zeile an die erste Stelle in der Tabelle hinzu. Anschließend splitten wir unseren Pfad nach „/“ und erhalten die Tags. Die Tags sind die Begriffe „Belletristik“, „Design“, wer der Autor ist usw. Dann setzen wir alle erforderlichen Felder der Tabelle fest.

Teil 3. Wörter, Stunden und andere Vorzüge zählen

Das ist schon eine etwas schwierigere Aufgabe. Wie wir uns erinnern, haben wir zwei Formate: EPUB und PDF. Bei EPUB ist alles klar – die Wörter sind dort wahrscheinlich tatsächlich vorhanden, aber beim PDF ist es nicht so eindeutig: Es kann einfach aus zusammengeklebten Bildern bestehen.

Die Funktion zur Wortzählung in PDF wird wie folgt aussehen: Wir nehmen die Anzahl der Seiten und multiplizieren sie mit einer bestimmten Konstante (durchschnittliche Anzahl der Wörter pro Seite).

Hier ist sie:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Das ist das WORDS_PER_PAGE für eine A4-Seite, das ungefähr 300 entspricht.

Jetzt lassen Sie uns eine Funktion schreiben, um die Seitenzahl zu zählen. Wir werden PyPDF2.

def get_pdf_pages_number(path, filename):
    pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
    return pdf.getNumPages()

Als Nächstes schreiben wir etwas zum Zählen der Seiten in EPUB. Wir verwenden epub_converter. Hier nehmen wir das Buch, konvertieren es in Zeilen und zählen für jede Zeile die Wörter.

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)

Nun berechnen wir die Lesezeit. Wir nehmen unsere Lieblingsanzahl an Wörtern und teilen sie durch Ihre Lesegeschwindigkeit.

def get_reading_time(words_count):
    return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10

Teil 4. Wir verbinden alle Teile

Wir müssen alle möglichen Pfade in unserem Buchverzeichnis durchgehen. Überprüfen, ob das Buch bereits in Notion vorhanden ist: wenn ja – müssen wir die Zeile nicht mehr erstellen.
Danach müssen wir den Dateityp bestimmen, abhängig davon die Wortanzahl berechnen. Am Ende das Buch hinzufügen.

So sieht unser Code aus:

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)

Und die Funktion zur Überprüfung, ob das Buch hinzugefügt wurde, sieht so aus:

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

Fazit

Danke an alle, die diesen Artikel gelesen haben. Ich hoffe, er hilft Ihnen, mehr zu lesen 🙂

Quelle: habr.com

60GB SSD 8Gb DDR4