Notion жана Python менен үй китепканасын түзүү

Мен ар дайым электрондук китепканамдагы китептерди кантип жакшыраак таратууга кызыкчумун. Акыр-аягы, мен бул вариантка барактардын санын жана башка жакшы нерселерди автоматтык түрдө эсептөө менен келдим. Баардык кызыккандардан мышык астынан суранам.

1-бөлүк. Dropbox

Менин бардык китептерим dropboxто. Мен бардыгын 4 категорияга бөлдүм: Окуу китеби, маалымдама, Көркөм адабият, Көркөм адабият. Бирок мен столго маалымдама китептерин кошпойм.

Китептердин көбү .epub, калгандары .pdf. Башкача айтканда, акыркы чечим кандайдыр бир жол менен эки вариантты камтышы керек.

Менин китептерге болгон жолдорум мындай:

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

Эгерде китеп фантастика болсо, анда категория (башкача айтканда, жогорудагы учурда "Дизайн") алынып салынат.

Мен Dropbox API менен убара болбоону чечтим, анткени менде папканы синхрондоштуруучу алардын тиркемеси бар. Башкача айтканда, план мындай: папкадан китептерди алып, ар бир китепти сөз эсептегичтен өткөрүп, аны Notion программасына кошобуз.

2-бөлүк. Сапты кошуңуз

Столдун өзү ушундай болушу керек. КӨҢҮЛ БЕРҮҮ: тилкелердин аталыштарын латын арибинде жасаган жакшы.

Notion жана Python менен үй китепканасын түзүү

Биз расмий эмес Notion API колдонобуз, анткени расмийси азырынча жеткириле элек.

Notion жана Python менен үй китепканасын түзүү

Түшүнүккө өтүп, Ctrl + Shift + J баскычтарын басыңыз, Колдонмо -> 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

Бул А4 барагы үчүн WORDS_PER_PAGE болжол менен 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

жыйынтыктоо

Бул макаланы окугандардын баарына рахмат. Бул сизге көбүрөөк окууга жардам берет деп үмүттөнөм :)

Source: www.habr.com

Комментарий кошуу