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

А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-бөлім. Барлық бөлшектерді қосу

Біз кітаптар қалтасындағы барлық мүмкін жолдарды өтуіміз керек. Notion ішінде кітаптың бар-жоғын тексеріңіз: егер бар болса, енді сызық жасаудың қажеті жоқ.
Содан кейін біз файл түрін анықтауымыз керек, осыған байланысты сөздердің санын санаймыз. Соңында кітап қосыңыз.

Бұл біз алатын код:

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

пікір қалдыру