ساخت کتابخانه خانگی با Notion و Python

من همیشه علاقه مند بوده ام که چگونه کتاب ها را در کتابخانه الکترونیکی خود به بهترین نحو توزیع کنم. در نهایت با محاسبه خودکار تعداد صفحات و سایر موارد به این گزینه رسیدم. از همه علاقه مندان زیر گربه خواهش می کنم.

قسمت 1. دراپ باکس

همه کتاب های من در دراپ باکس هستند. 4 دسته وجود دارد که من همه چیز را به آنها تقسیم کردم: کتاب درسی، مرجع، داستان، غیرداستانی. اما من کتاب های مرجع را به جدول اضافه نمی کنم.

اکثر کتاب ها epub. بقیه .pdf هستند. یعنی راه حل نهایی باید به نحوی هر دو گزینه را پوشش دهد.

مسیر من به کتاب چیزی شبیه به این است:

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

اگر کتاب داستانی است، دسته (یعنی «طراحی» در مورد بالا) حذف می‌شود.

من تصمیم گرفتم که با Dropbox API خود را خسته نکنم، زیرا برنامه آنها را دارم که پوشه را همگام سازی می کند. یعنی طرح به این صورت است: کتاب‌ها را از پوشه می‌گیریم، هر کتاب را از طریق یک کلمه شمار اجرا می‌کنیم و به Notion اضافه می‌کنیم.

قسمت 2. یک خط اضافه کنید

خود جدول باید چیزی شبیه این باشد. توجه: بهتر است نام ستون ها را به لاتین بسازید.

ساخت کتابخانه خانگی با Notion و Python

ما از Notion API غیر رسمی استفاده خواهیم کرد، زیرا نسخه رسمی آن هنوز ارائه نشده است.

ساخت کتابخانه خانگی با Notion و Python

به Notion بروید، Ctrl + Shift + J را فشار دهید، به Application -> Cookies بروید، 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

اضافه کردن نظر