Notion və Python ilə ev kitabxanası yaratmaq

Elektron kitabxanamdakı kitabları ən yaxşı şəkildə necə yaymaq mənə həmişə maraqlı olub. Sonda səhifələrin sayının və digər gözəlliklərin avtomatik hesablanması ilə bu seçimə gəldim. Bütün maraqlanan şəxslərdən pişik altında xahiş edirəm.

Hissə 1. Dropbox

Bütün kitablarım dropbox-dadır. Hər şeyi böldüyüm 4 kateqoriya var: Dərslik, İstinad, Bədii ədəbiyyat, Qeyri-bədii ədəbiyyat. Ancaq mən cədvələ istinad kitabları əlavə etmirəm.

Kitabların əksəriyyəti .epub, qalanları .pdf formatındadır. Yəni, son həll birtəhər hər iki variantı əhatə etməlidir.

Kitablara gedən yollarım belədir:

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

Kitab bədiidirsə, kateqoriya (yəni yuxarıdakı halda "Dizayn") çıxarılır.

Dropbox API ilə narahat olmamaq qərarına gəldim, çünki qovluğu sinxronlaşdıran tətbiqlərim var. Yəni plan belədir: qovluqdan kitabları götürürük, hər kitabı söz sayğacından keçirib onu Notion-a əlavə edirik.

Hissə 2. Xətt əlavə edin

Cədvəlin özü belə görünməlidir. DİQQƏT: sütun adlarını latın dilində etmək daha yaxşıdır.

Notion və Python ilə ev kitabxanası yaratmaq

Biz qeyri-rəsmi Notion API-dən istifadə edəcəyik, çünki rəsmi API hələ çatdırılmayıb.

Notion və Python ilə ev kitabxanası yaratmaq

Anlayışa gedin, Ctrl + Shift + J düyməsini basın, Proqram -> Kukilərə keçin, token_v2-ni kopyalayın və onu TOKEN adlandırın. Daha sonra kitabxana işarəsi ilə bizə lazım olan səhifəyə keçib linki kopyalayırıq. Biz buna NOTION deyirik.

Sonra Notion-a qoşulmaq üçün kodu yazırıq.

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

Sonra cədvələ sətir əlavə etmək funksiyasını yazaq.

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

Burda nə baş verir. Birinci sıradakı cədvələ yeni sətir götürüb əlavə edirik. Sonra, yolumuzu "/" boyunca ayırırıq və etiketlər alırıq. Teqlər - “İncəsənət”, “Dizayn”, müəllifin kim olduğu və s. Sonra plitənin bütün lazımi sahələrini təyin edirik.

Hissə 3. Sözlərin, saatların və digər ləzzətlərin hesablanması

Bu daha çətin bir işdir. Xatırladığımız kimi, iki formatımız var: epub və pdf. Epub ilə hər şey aydındırsa - sözlər yəqin ki, oradadır, onda pdf haqqında hər şey o qədər də aydın deyil: sadəcə yapışdırılmış şəkillərdən ibarət ola bilər.

Beləliklə, PDF-də sözləri saymaq üçün funksiyamız belə görünəcək: biz səhifələrin sayını götürürük və müəyyən bir sabitə vururuq (bir səhifədəki sözlərin orta sayı).

Budur o:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

A4 səhifəsi üçün bu WORDS_PER_PAGE təxminən 300-dür.

İndi səhifələri saymaq üçün funksiya yazaq. istifadə edəcəyik pyPDF2.

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

Sonra, Epub-da səhifələrin sayılması üçün bir şey yazacağıq. istifadə edirik epub_converter. Burada kitabı götürürük, onu sətirlərə çeviririk və hər sətir üçün sözləri sayırıq.

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)

İndi vaxtı hesablayaq. Ən sevdiyimiz sözlərin sayını götürürük və oxuma sürətinizə bölürük.

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

Hissə 4. Bütün hissələrin birləşdirilməsi

Kitab qovluğumuzda bütün mümkün yollardan keçməliyik. Notion-da artıq kitab olub-olmadığını yoxlayın: əgər varsa, artıq xətt yaratmağa ehtiyac yoxdur.
Sonra fayl tipini təyin etməliyik, bundan asılı olaraq sözlərin sayını hesablamalıyıq. Sonda kitab əlavə edin.

Aldığımız kod budur:

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)

Kitabın əlavə edilib-edilmədiyini yoxlamaq funksiyası belə görünür:

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

Nəticə

Bu yazını oxuyan hər kəsə təşəkkür edirəm. Ümid edirəm daha çox oxumağınıza kömək edir :)

Mənbə: www.habr.com

Добавить комментарий