Notion va Python yordamida uy kutubxonasini yaratish

Meni har doim elektron kutubxonamdagi kitoblarni qanday qilib eng yaxshi tarzda tarqatish qiziqtirgan. Oxir-oqibat, men ushbu variantga sahifalar sonini va boshqa yaxshi narsalarni avtomatik hisoblash bilan keldim. Men barcha qiziquvchilardan mushuk ostida so'rayman.

1-qism. Dropbox

Mening barcha kitoblarim dropbox-da. Men hamma narsani 4 toifaga ajratdim: Darslik, Ma'lumotnoma, Badiiy adabiyot, Badiiy adabiyot. Lekin men jadvalga ma'lumotnomalarni qo'shmayman.

Kitoblarning aksariyati .epub, qolganlari .pdf. Ya'ni, yakuniy yechim qandaydir tarzda ikkala variantni ham qamrab olishi kerak.

Mening kitoblarga bo'lgan yo'llarim quyidagicha:

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

Agar kitob fantastika bo'lsa, unda toifa (ya'ni yuqoridagi holatda "Dizayn") olib tashlanadi.

Men Dropbox API bilan bezovta qilmaslikka qaror qildim, chunki menda jildni sinxronlashtiradigan ularning ilovasi bor. Ya'ni, reja shunday: biz papkadan kitoblarni olib, har bir kitobni so'z hisoblagichidan o'tkazamiz va uni Notionga qo'shamiz.

2-qism. Bir qator qo'shing

Jadvalning o'zi shunday ko'rinishi kerak. DIQQAT: ustun nomlarini lotin tilida yozgan ma'qul.

Notion va Python yordamida uy kutubxonasini yaratish

Biz norasmiy Notion API dan foydalanamiz, chunki rasmiy API hali yetkazilmagan.

Notion va Python yordamida uy kutubxonasini yaratish

Notion-ga o'ting, Ctrl + Shift + J tugmalarini bosing, Ilova -> Cookie-ga o'ting, token_v2-dan nusxa oling va uni TOKEN deb nomlang. Keyin kutubxona belgisi bilan kerakli sahifaga o'tamiz va havolani nusxalaymiz. Biz buni NOTION deb ataymiz.

Keyin Notion-ga ulanish uchun kodni yozamiz.

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

Keyinchalik, jadvalga qator qo'shish funksiyasini yozamiz.

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

Bu yerda nima bo'lyapti. Birinchi qatordagi jadvalga yangi qatorni olamiz va qo'shamiz. Keyinchalik, biz yo'limizni "/" bo'ylab ajratamiz va teglarni olamiz. Teglar - "San'at", "Dizayn", muallif kim va hokazo. Keyin plastinkaning barcha kerakli maydonlarini o'rnatamiz.

3-qism. So'zlarni, soatlarni va boshqa zavqlarni sanash

Bu qiyinroq vazifa. Esda tutganimizdek, bizda ikkita format mavjud: epub va pdf. Agar epub bilan hamma narsa aniq bo'lsa - so'zlar ehtimol u erda bo'lsa, unda pdf haqida hamma narsa unchalik aniq emas: u shunchaki yopishtirilgan tasvirlardan iborat bo'lishi mumkin.

Shunday qilib, PDF-dagi so'zlarni hisoblash funksiyamiz quyidagicha ko'rinadi: biz sahifalar sonini olamiz va ma'lum bir doimiyga ko'paytiramiz (har bir sahifadagi so'zlarning o'rtacha soni).

Mana u:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

A4 sahifasi uchun bu WORDS_PER_PAGE taxminan 300 ga teng.

Endi sahifalarni hisoblash funksiyasini yozamiz. foydalanamiz pyPDF2.

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

Keyinchalik, biz Epub-da sahifalarni hisoblash uchun biror narsa yozamiz. Biz foydalanamiz epub_converter. Bu erda biz kitobni olib, uni satrlarga aylantiramiz va har bir satr uchun so'zlarni hisoblaymiz.

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)

Endi vaqtni hisoblaylik. Biz sevimli so'zlar sonini olamiz va uni o'qish tezligiga bo'lamiz.

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

4-qism. Barcha qismlarni ulash

Biz kitoblar papkamizdagi barcha mumkin bo'lgan yo'llarni bosib o'tishimiz kerak. Notion-da allaqachon kitob bor yoki yo'qligini tekshiring: agar mavjud bo'lsa, biz endi chiziq yaratishimiz shart emas.
Keyin fayl turini aniqlashimiz kerak, bunga qarab, so'zlar sonini hisoblaymiz. Oxirida kitob qo'shing.

Bu biz olgan kod:

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)

Kitob qo'shilganligini tekshirish funktsiyasi quyidagicha ko'rinadi:

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

xulosa

Ushbu maqolani o'qigan barchaga rahmat. Umid qilamanki, bu sizga ko'proq o'qishga yordam beradi :)

Manba: www.habr.com

a Izoh qo'shish