Δημιουργία οικιακής βιβλιοθήκης με το Notion και την Python

Πάντα με ενδιέφερε ο καλύτερος τρόπος διανομής βιβλίων στην ηλεκτρονική μου βιβλιοθήκη. Στο τέλος, έφτασα σε αυτήν την επιλογή με αυτόματο υπολογισμό του αριθμού των σελίδων και άλλα καλούδια. Παρακαλώ όλους τους ενδιαφερόμενους κάτω από γάτα.

Μέρος 1. Dropbox

Όλα τα βιβλία μου είναι στο dropbox. Υπάρχουν 4 κατηγορίες στις οποίες χώρισα τα πάντα: Σχολικό βιβλίο, Αναφορά, Μυθοπλασία, Μη μυθοπλασία. Αλλά δεν προσθέτω βιβλία αναφοράς στον πίνακα.

Τα περισσότερα βιβλία είναι .epub, τα υπόλοιπα είναι .pdf. Δηλαδή, η τελική λύση πρέπει με κάποιο τρόπο να καλύπτει και τις δύο επιλογές.

Οι διαδρομές μου προς τα βιβλία είναι κάπως έτσι:

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

Εάν το βιβλίο είναι μυθοπλασίας, τότε η κατηγορία (δηλαδή «Σχέδιο» στην παραπάνω περίπτωση) αφαιρείται.

Αποφάσισα να μην ασχοληθώ με το Dropbox API, μιας και έχω την εφαρμογή τους που συγχρονίζει το φάκελο. Δηλαδή, το σχέδιο είναι το εξής: παίρνουμε βιβλία από το φάκελο, τρέχουμε κάθε βιβλίο μέσω ενός μετρητή λέξεων και το προσθέτουμε στο Notion.

Μέρος 2. Προσθέστε μια γραμμή

Ο ίδιος ο πίνακας θα πρέπει να μοιάζει κάπως έτσι. ΠΡΟΣΟΧΗ: είναι καλύτερα να κάνετε τα ονόματα των στηλών στα λατινικά.

Δημιουργία οικιακής βιβλιοθήκης με το Notion και την Python

Θα χρησιμοποιήσουμε το ανεπίσημο Notion API, επειδή το επίσημο δεν έχει ακόμη παραδοθεί.

Δημιουργία οικιακής βιβλιοθήκης με το Notion και την Python

Μεταβείτε στο Notion, πατήστε Ctrl + Shift + J, μεταβείτε στο Application -> Cookies, αντιγράψτε το token_v2 και ονομάστε το TOKEN. Στη συνέχεια πηγαίνουμε στη σελίδα που χρειαζόμαστε με το σύμβολο της βιβλιοθήκης και αντιγράφουμε τον σύνδεσμο. Το λέμε ΕΝΝΟΙΑ.

Έπειτα γράφουμε τον κώδικα για να συνδεθούμε στο Notion.

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

Στη συνέχεια, ας γράψουμε μια συνάρτηση για να προσθέσουμε μια σειρά στον πίνακα.

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

Τι συμβαίνει εδώ. Παίρνουμε και προσθέτουμε μια νέα σειρά στον πίνακα της πρώτης σειράς. Στη συνέχεια, χωρίζουμε τη διαδρομή μας κατά μήκος του "/" και παίρνουμε ετικέτες. Ετικέτες - από την άποψη της "Τέχνης", "Σχεδιασμός", ποιος είναι ο συγγραφέας και ούτω καθεξής. Στη συνέχεια ρυθμίζουμε όλα τα απαραίτητα πεδία του πιάτου.

Μέρος 3. Μετρώντας λέξεις, ώρες και άλλες απολαύσεις

Αυτό είναι πιο δύσκολο έργο. Όπως θυμόμαστε, έχουμε δύο μορφές: epub και pdf. Εάν όλα είναι ξεκάθαρα με το epub - οι λέξεις είναι πιθανώς εκεί, τότε όλα δεν είναι τόσο ξεκάθαρα για το pdf: μπορεί απλώς να αποτελείται από κολλημένες εικόνες.

Έτσι η συνάρτησή μας για την καταμέτρηση λέξεων σε PDF θα μοιάζει με αυτό: παίρνουμε τον αριθμό των σελίδων και πολλαπλασιάζουμε με μια ορισμένη σταθερά (τον μέσο αριθμό λέξεων ανά σελίδα).

Εδώ είναι:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Αυτή η WORDS_PER_PAGE για μια σελίδα A4 είναι περίπου 300.

Τώρα ας γράψουμε μια συνάρτηση για να μετράμε σελίδες. Θα το χρησιμοποιησουμε pyPDF2.

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

Στη συνέχεια, θα γράψουμε κάτι για την καταμέτρηση σελίδων στο Epub. Χρησιμοποιούμε epub_converter. Εδώ παίρνουμε το βιβλίο, το μετατρέπουμε σε γραμμές και μετράμε τις λέξεις για κάθε γραμμή.

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)

Τώρα ας υπολογίσουμε τον χρόνο. Παίρνουμε τον αριθμό των αγαπημένων μας λέξεων και το διαιρούμε με την ταχύτητα ανάγνωσης.

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

Μέρος 4. Σύνδεση όλων των εξαρτημάτων

Πρέπει να περάσουμε από όλες τις πιθανές διαδρομές στο φάκελο των βιβλίων μας. Ελέγξτε εάν υπάρχει ήδη ένα βιβλίο στο Notion: εάν υπάρχει, δεν χρειάζεται πλέον να δημιουργήσουμε μια γραμμή.
Στη συνέχεια, πρέπει να προσδιορίσουμε τον τύπο αρχείου, ανάλογα με αυτό, μετράμε τον αριθμό των λέξεων. Προσθέστε ένα βιβλίο στο τέλος.

Αυτός είναι ο κωδικός που παίρνουμε:

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)

Και η λειτουργία για να ελέγξετε αν έχει προστεθεί ένα βιβλίο μοιάζει με αυτό:

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

Συμπέρασμα

Ευχαριστώ όλους όσους διάβασαν αυτό το άρθρο. Ελπίζω να σας βοηθήσει να διαβάσετε περισσότερα :)

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο