Erstellen einer Heimbibliothek mit Notion und Python

Ich habe mich schon immer dafür interessiert, wie ich Bücher in meiner elektronischen Bibliothek am besten verteilen kann. Am Ende bin ich zu dieser Option mit automatischer Berechnung der Seitenzahl und anderen Extras gekommen. Ich frage alle Interessierten unter Kat.

Teil 1. Dropbox

Alle meine Bücher sind auf Dropbox. Es gibt 4 Kategorien, in die ich alles eingeteilt habe: Lehrbuch, Nachschlagewerk, Belletristik, Sachbuch. Aber ich füge der Tabelle keine Nachschlagewerke hinzu.

Die meisten Bücher sind im .epub-Format, der Rest im .pdf-Format. Das heißt, die endgültige Lösung muss irgendwie beide Optionen abdecken.

Meine Wege zu Büchern sind etwa so:

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

Wenn es sich bei dem Buch um Belletristik handelt, wird die Kategorie (im obigen Fall „Design“) entfernt.

Ich habe beschlossen, mich nicht mit der Dropbox-API herumzuschlagen, da ich deren Anwendung habe, die den Ordner synchronisiert. Das heißt, der Plan ist folgender: Wir nehmen Bücher aus dem Ordner, lassen jedes Buch durch einen Wortzähler laufen und fügen es zu Notion hinzu.

Teil 2. Fügen Sie eine Zeile hinzu

Die Tabelle selbst sollte in etwa so aussehen. ACHTUNG: Es ist besser, Spaltennamen in lateinischer Sprache zu erstellen.

Erstellen einer Heimbibliothek mit Notion und Python

Wir werden die inoffizielle Notion-API verwenden, da die offizielle noch nicht ausgeliefert wurde.

Erstellen einer Heimbibliothek mit Notion und Python

Gehen Sie zu Notion, drücken Sie Strg + Umschalt + J, gehen Sie zu Anwendung -> Cookies, kopieren Sie token_v2 und nennen Sie es TOKEN. Dann gehen wir auf die benötigte Seite mit dem Bibliotheksschild und kopieren den Link. Wir nennen es VORSTELLUNG.

Dann schreiben wir den Code, um eine Verbindung zu Notion herzustellen.

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

Als nächstes schreiben wir eine Funktion, um der Tabelle eine Zeile hinzuzufügen.

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

Was ist denn hier los. Wir nehmen und fügen der Tabelle in der ersten Zeile eine neue Zeile hinzu. Als nächstes teilen wir unseren Pfad entlang „/“ auf und erhalten Tags. Tags – in Bezug auf „Kunst“, „Design“, wer der Autor ist usw. Dann legen wir alle notwendigen Felder der Platte fest.

Teil 3. Wörter, Stunden und andere Freuden zählen

Dies ist eine schwierigere Aufgabe. Wie wir uns erinnern, haben wir zwei Formate: epub und pdf. Wenn beim Epub alles klar ist - die Wörter sind wahrscheinlich da, dann ist beim PDF nicht alles so klar: Es besteht möglicherweise einfach aus eingeklebten Bildern.

Unsere Funktion zum Zählen von Wörtern in PDFs sieht also folgendermaßen aus: Wir nehmen die Anzahl der Seiten und multiplizieren sie mit einer bestimmten Konstante (der durchschnittlichen Anzahl der Wörter pro Seite).

Da ist sie:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Diese WORDS_PER_PAGE für eine A4-Seite beträgt ungefähr 300.

Schreiben wir nun eine Funktion zum Zählen von Seiten. Wir werden verwenden 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 von Seiten in Epub. Wir gebrauchen epub_converter. Hier nehmen wir das Buch, wandeln es in Zeilen um und zählen die Wörter für jede Zeile.

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)

Berechnen wir nun die Zeit. Wir nehmen die Anzahl unserer Lieblingswörter und dividieren sie durch Ihre Lesegeschwindigkeit.

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

Teil 4. Alle Teile verbinden

Wir müssen alle möglichen Pfade in unserem Bücherordner durchgehen. Überprüfen Sie, ob in Notion bereits ein Buch vorhanden ist: Wenn ja, müssen wir keine Zeile mehr erstellen.
Dann müssen wir den Dateityp bestimmen und abhängig davon die Anzahl der Wörter zählen. Fügen Sie am Ende ein Buch hinzu.

Dies ist der Code, den wir erhalten:

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, um zu prüfen, ob ein 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

Abschluss

Vielen Dank an alle, die diesen Artikel gelesen haben. Ich hoffe, es hilft dir, mehr zu lesen :)

Source: habr.com

Kommentar hinzufügen