рдзрд╛рд░рдгрд╛ рд░ рдкрд╛рдЗрдерди рд╕рдВрдЧ рдПрдХ рдЧреГрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдЙрди

рдо рд╕рдзреИрдВ рдореЗрд░реЛ рдЗрд▓реЗрдХреНрдЯреНрд░реЛрдирд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рдкреБрд╕реНрддрдХрд╣рд░реВ рдХрд╕рд░реА рд╡рд┐рддрд░рдг рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдЪрд╛рд╕реЛ рд░рд╛рдЦреЗрдХреЛ рдЫреБред рдЕрдиреНрддрдорд╛, рдо рдкреГрд╖реНрдард╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рд░ рдЕрдиреНрдп рд╕рд╛рдорд╛рдирд╣рд░реВрдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрдгрдирд╛рдХреЛ рд╕рд╛рде рдпреЛ рд╡рд┐рдХрд▓реНрдкрдорд╛ рдЖрдПрдХреЛ рдЫреБред рдо рдмрд┐рд░рд╛рд▓реЛ рдЕрдиреНрддрд░реНрдЧрдд рд╕рдмреИ рдЗрдЪреНрдЫреБрдХ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрд▓рд╛рдИ рд╕реЛрдзреНрдЫреБред

рднрд╛рдЧ рез. рдбреНрд░рдкрдмрдХреНрд╕

рдореЗрд░рд╛ рд╕рдмреИ рдХрд┐рддрд╛рдмрд╣рд░реВ рдбреНрд░рдкрдмрдХреНрд╕рдорд╛ рдЫрдиреНред рддреНрдпрд╣рд╛рдБ 4 рдХреЛрдЯрд┐рд╣рд░реВ рдЫрдиреН рдЬрд╕рдорд╛ рдореИрд▓реЗ рд╕рдмреИ рдХреБрд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдЧрд░реЗрдХреЛ рдЫреБ: рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ, рд╕рдиреНрджрд░реНрдн, рдХрдерд╛, рдЧреИрд░-рдХрдерд╛ред рддрд░ рдо рдЯреЗрдмреБрд▓рдорд╛ рд╕рдиреНрджрд░реНрдн рдкреБрд╕реНрддрдХрд╣рд░реВ рдердкреНрджрд┐рдиред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреБрд╕реНрддрдХрд╣рд░реВ .epub рдЫрдиреН, рдмрд╛рдБрдХреАрд╣рд░реВ .pdf рдЫрдиреНред рддреНрдпреЛ рд╣реЛ, рдЕрдиреНрддрд┐рдо рд╕рдорд╛рдзрд╛рдирд▓реЗ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рджреБрдмреИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрд▓рд╛рдИ рдХрднрд░ рдЧрд░реНрдиреБрдкрд░реНрдЫред

рдореЗрд░реЛ рдкреБрд╕реНрддрдХрд╣рд░реБ рдХреЛ рдмрд╛рдЯреЛрд╣рд░реБ рдХреЗрд╣рд┐ рдпрд╕ рдкреНрд░рдХрд╛рд░ рдЫрдиреН:

/╨Ъ╨╜╨╕╨│╨╕/╨Э╨╡╤Е╤Г╨┤╨╛╨╢╨╡╤Б╤В╨▓╨╡╨╜╨╜╨╛╨╡/╨Э╨╛╨▓╨╛╨╡/╨Ф╨╕╨╖╨░╨╣╨╜/╨о╤А╨╕╨╣ ╨У╨╛╤А╨┤╨╛╨╜/╨Ъ╨╜╨╕╨│╨░ ╨┐╤А╨╛ ╨▒╤Г╨║╨▓╤Л ╨╛╤В ╨Р ╨┤╨╛ ╨п.epub 

рдпрджрд┐ рдкреБрд╕реНрддрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реЛ рднрдиреЗ, рддрдм рд╡рд░реНрдЧ (рддреНрдпреЛ рд╣реЛ, рдорд╛рдерд┐рдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ "рдбрд┐рдЬрд╛рдЗрди") рд╣рдЯрд╛рдЗрдиреНрдЫред

рдореИрд▓реЗ рдбреНрд░рдкрдмрдХреНрд╕ рдПрдкреАрдЖрдИрд╕рдБрдЧ рдЪрд┐рдиреНрддрд╛ рдирдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВ, рдХрд┐рдирдХрд┐ рдорд╕рдБрдЧ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЫ рдЬрд╕рд▓реЗ рдлреЛрд▓реНрдбрд░рд▓рд╛рдИ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрджрдЫред рддреНрдпреЛ рд╣реЛ, рдпреЛрдЬрдирд╛ рдпреЛ рд╣реЛ: рд╣рд╛рдореА рдлреЛрд▓реНрдбрд░рдмрд╛рдЯ рдкреБрд╕реНрддрдХрд╣рд░реВ рд▓рд┐рдиреНрдЫреМрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХрд▓рд╛рдИ рд╢рдмреНрдж рдХрд╛рдЙрдиреНрдЯрд░ рдорд╛рд░реНрдлрдд рдЪрд▓рд╛рдЙрдБрдЫреМрдВ, рд░ рдпрд╕рд▓рд╛рдИ рдзрд╛рд░рдгрд╛рдорд╛ рдердкреНрдЫреМрдВред

рднрд╛рдЧ реиред рд▓рд╛рдЗрди рдердкреНрдиреБрд╣реЛрд╕реН

рддрд╛рд▓рд┐рдХрд╛ рдЖрдлреИ рдпреЛ рдЬрд╕реНрддреИ рдХреЗрд╣рд┐ рджреЗрдЦрд┐рдиреБ рдкрд░реНрдЫред рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН: рдпреЛ рд▓реНрдпрд╛рдЯрд┐рди рдорд╛ рд╕реНрддрдореНрдн рдирд╛рдо рдмрдирд╛рдЙрди рд░рд╛рдореНрд░реЛ рдЫред

рдзрд╛рд░рдгрд╛ рд░ рдкрд╛рдЗрдерди рд╕рдВрдЧ рдПрдХ рдЧреГрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдЙрди

рд╣рд╛рдореА рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдзрд╛рд░рдгрд╛ API рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ, рдХрд┐рдирднрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдХ рдЕрдЭреИ рдбреЗрд▓рд┐рднрд░ рдЧрд░рд┐рдПрдХреЛ рдЫреИрдиред

рдзрд╛рд░рдгрд╛ рд░ рдкрд╛рдЗрдерди рд╕рдВрдЧ рдПрдХ рдЧреГрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдЙрди

Notion рдорд╛ рдЬрд╛рдиреБрд╣реЛрд╕реН, 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ред рдпрджрд┐ рдЗрдкрдмрд╕рдБрдЧ рд╕рдмреИ рдХреБрд░рд╛ рд╕реНрдкрд╖реНрдЯ рдЫ рднрдиреЗ - рд╢рдмреНрджрд╣рд░реВ рд╕рдореНрднрд╡рддрдГ рддреНрдпрд╣рд╛рдБ рдЫрдиреН, рддреНрдпрд╕рдкрдЫрд┐ рд╕рдмреИ рдХреБрд░рд╛ pdf рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реНрдкрд╖реНрдЯ рдЫреИрди: рдпреЛ рдХреЗрд╡рд▓ рдЯрд╛рдБрд╕рд┐рдПрдХреЛ рдЫрд╡рд┐рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрди рд╕рдХреНрдЫред

рддреНрдпрд╕реЛрднрдП рдкреАрдбреАрдПрдлрдорд╛ рд╢рдмреНрджрд╣рд░реВ рдЧрдгрдирд╛ рдЧрд░реНрдиреЗ рд╣рд╛рдореНрд░реЛ рдХрд╛рд░реНрдп рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ: рд╣рд╛рдореА рдкреГрд╖реНрдард╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рд▓рд┐рдиреНрдЫреМрдВ рд░ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рд░рддрд╛ (рдкреНрд░рддрд┐ рдкреГрд╖реНрда рд╢рдмреНрджрд╣рд░реВрдХреЛ рдФрд╕рдд рд╕рдВрдЦреНрдпрд╛) рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрди рдЧрд░реНрдЫреМрдВред

рдпрд╣рд╛рдБ рдЙрдиреА рдЫрд┐рдиреН:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

A4 рдкреГрд╖реНрдардХреЛ рд▓рд╛рдЧрд┐ рдпреЛ 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

рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛

рдпреЛ рд▓реЗрдЦ рдкрдвреНрдиреЗ рд╕рдмреИрд▓рд╛рдИ рдзрдиреНрдпрд╡рд╛рджред рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдердк рдкрдвреНрди рдорджреНрджрдд рдЧрд░реНрджрдЫ :)

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди