Сохтани китобхонаи хонагӣ бо Notion ва Python

Ман ҳамеша ба он шавқ доштам, ки чӣ гуна беҳтарин китобҳоро дар китобхонаи электронии худ паҳн кунам. Дар ниҳоят, ман ба ин вариант бо ҳисобкунии автоматии шумораи саҳифаҳо ва дигар чизҳои хуб омадам. Ман аз ҳама манфиатдор дар зери гурба мепурсам.

Қисми 1. Dropbox

Ҳама китобҳои ман дар dropbox ҳастанд. 4 категория вуҷуд дорад, ки ман ҳама чизро ба онҳо тақсим кардам: Китоби дарсӣ, истинод, адабиёти бадеӣ, ғайрифантастика. Аммо ман китобҳои маълумотро ба ҷадвал илова намекунам.

Аксари китобҳо .epub, боқимондаҳо .pdf мебошанд. Яъне, ҳалли ниҳоӣ бояд ҳар ду вариантро дар бар гирад.

Роҳҳои ман ба китобҳо чунинанд:

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

Агар китоб бадеӣ бошад, пас категория (яъне "Тарроҳӣ" дар ҳолати боло) хориҷ карда мешавад.

Ман тасмим гирифтам, ки бо Dropbox API ташвиш надиҳам, зеро ман замимаи онҳоро дорам, ки папкаро ҳамоҳанг мекунад. Яъне, нақша чунин аст: мо китобҳоро аз папка мегирем, ҳар як китобро тавассути ҳисобкунаки калимаҳо мегузаронем ва онро ба Мафҳум илова мекунем.

Қисми 2. Илова кардани сатр

Худи ҷадвал бояд чунин бошад. ДИККАТ: номхои сутунхоро бо хатти лотинй тартиб додан бехтар аст.

Сохтани китобхонаи хонагӣ бо Notion ва Python

Мо API-и ғайрирасмии Notion-ро истифода хоҳем бурд, зеро API-и расмӣ ҳанӯз дастрас нашудааст.

Сохтани китобхонаи хонагӣ бо Notion ва Python

Ба мафҳум равед, Ctrl + Shift + J -ро пахш кунед, ба Барнома -> Кукиҳо гузаред, 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. Пайваст кардани ҳамаи қисмҳо

Мо бояд тамоми роҳҳои имконпазирро дар папкаи китобҳои худ тай кунем. Санҷед, ки оё китоб аллакай дар Мафҳум вуҷуд дорад: агар ин тавр бошад, ба мо дигар лозим нест, ки сатр эҷод кунем.
Пас мо бояд навъи файлро муайян кунем, вобаста ба ин шумораи калимаҳоро ҳисоб кунем. Дар охири китоб илова кунед.

Ин кодест, ки мо мегирем:

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

хулоса

Ташаккур ба ҳамаи онҳое, ки ин мақоларо мехонанд. Ман умедворам, ки ин ба шумо бештар хондан кӯмак мекунад :)

Манбаъ: will.com

Илова Эзоҳ