Изработка на домашна библиотека со Notion и Python

Отсекогаш ме интересирало како најдобро да се дистрибуираат книгите во мојата електронска библиотека. На крајот дојдов до оваа опција со автоматско пресметување на бројот на страници и други добрини. Ги прашувам сите заинтересирани под мачка.

Дел 1. Dropbox

Сите мои книги се на dropbox. Има 4 категории во кои поделив сè: Учебник, Референца, Фикција, Нефикција. Но, јас не додавам референтни книги на табелата.

Најголем дел од книгите се .epub, останатите се .pdf. Односно, конечното решение мора некако да ги опфати двете опции.

Моите патишта до книгите се отприлика вака:

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

Если книга художественная, то категория (то есть «Дизайн» в случае выше) убирается.

Решив да не се замарам со Dropbox API, бидејќи имам нивна апликација која ја синхронизира папката. Односно, планот е овој: земаме книги од папката, ја поминуваме секоја книга низ бројач на зборови и ја додаваме во Notion.

Дел 2. Додадете линија

Сама таблица должна выглядеть приблизительно следующим образом. ВНИМАНИЕ: названия столбцов лучше делать латиницей.

Изработка на домашна библиотека со Notion и Python

Ќе го користиме неофицијалното Notion API, бидејќи официјалниот сè уште не е испорачан.

Изработка на домашна библиотека со Notion и Python

Одете во Notion, притиснете Ctrl + Shift + J, одете до Application -> Cookies, копирајте 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 за страница А4 е приближно 300.

Теперь давайте напишем функцию для подсчета страничек. Будем юзать pyPDF2.

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

Далее напишем штучку для подсчета страниц в епабе. Используем 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

Заклучок

Спасибо всем, кто прочитал эту статью. Надеюсь, она вам поможет читать больше 🙂

Извор: www.habr.com

Додадете коментар