إنشاء مكتبة منزلية باستخدام Notion و Python

لقد كنت دائمًا مهتمًا بأفضل السبل لتوزيع الكتب في مكتبتي الإلكترونية. في النهاية، جئت إلى هذا الخيار مع الحساب التلقائي لعدد الصفحات والأشياء الجيدة الأخرى. أسأل جميع الأشخاص المهتمين تحت القطة.

الجزء 1. دروببوإكس

جميع كتبي موجودة على Dropbox. هناك 4 فئات قمت بتقسيم كل شيء إليها: الكتاب المدرسي، والمرجع، والخيال، والواقعي. لكنني لا أضيف كتبًا مرجعية إلى الجدول.

معظم الكتب بصيغة .epub، والباقي بصيغة pdf. وهذا يعني أن الحل النهائي يجب أن يغطي كلا الخيارين بطريقة أو بأخرى.

طريقي إلى الكتب هو شيء من هذا القبيل:

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

إذا كان الكتاب خياليًا، فستتم إزالة الفئة (أي "التصميم" في الحالة أعلاه).

قررت عدم الاهتمام بـ Dropbox API، نظرًا لأن لدي تطبيقهم الذي يقوم بمزامنة المجلد. أي أن الخطة هي كما يلي: نأخذ الكتب من المجلد، ونمرر كل كتاب عبر عداد الكلمات، ونضيفه إلى Notion.

الجزء 2. أضف سطرًا

الجدول نفسه يجب أن يبدو مثل هذا. تنبيه: من الأفضل كتابة أسماء الأعمدة باللغة اللاتينية.

إنشاء مكتبة منزلية باستخدام Notion و Python

سنستخدم واجهة برمجة تطبيقات Notion غير الرسمية، لأنه لم يتم تسليم الواجهة الرسمية بعد.

إنشاء مكتبة منزلية باستخدام Notion و Python

انتقل إلى Notion، واضغط على Ctrl + Shift + J، وانتقل إلى التطبيق -> ملفات تعريف الارتباط، وانسخ token_v2 وأطلق عليه اسم TOKEN. ثم نذهب إلى الصفحة التي نحتاجها مع علامة المكتبة وننسخ الرابط. نحن نسميها NOTION.

ثم نكتب الكود للاتصال بـ 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

إضافة تعليق