рдиреЛрд╢рди рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реЛрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдирд╛

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

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

рдореЗрд░реА рд╕рднреА рдкреБрд╕реНрддрдХреЗрдВ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдкрд░ рд╣реИрдВред рдРрд╕реА 4 рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ: рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ, рд╕рдВрджрд░реНрдн, рдлрд┐рдХреНрд╢рди, рдиреЙрди-рдлрд┐рдХреНрд╢рдиред рд▓реЗрдХрд┐рди рдореИрдВ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреБрд╕реНрддрдХреЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ред

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

рдХрд┐рддрд╛рдмреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдореЗрд░реЗ рд░рд╛рд╕реНрддреЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИрдВ:

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

рдпрджрд┐ рдкреБрд╕реНрддрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИ, рддреЛ рд╢реНрд░реЗрдгреА (рдЕрд░реНрдерд╛рддреН, рдЙрдкрд░реЛрдХреНрдд рдорд╛рдорд▓реЗ рдореЗрдВ "рдбрд┐рдЬрд╝рд╛рдЗрди") рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред

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

рднрд╛рдЧ 2. рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ

рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡рдпрдВ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП. рдзреНрдпрд╛рди рджреЗрдВ: рдХреЙрд▓рдо рдирд╛рдо рд▓реИрдЯрд┐рди рдореЗрдВ рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдиреЛрд╢рди рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реЛрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдирд╛

рд╣рдо рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдиреЛрд╢рди рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдкреАрдЖрдИ рдЕрднреА рддрдХ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдиреЛрд╢рди рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдПрдХ рд╣реЛрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдирд╛рдирд╛

рдиреЛрд╢рди рдкрд░ рдЬрд╛рдПрдВ, Ctrl + Shift + J рджрдмрд╛рдПрдВ, рдПрдкреНрд▓рд┐рдХреЗрд╢рди -> рдХреБрдХреАрдЬрд╝ рдкрд░ рдЬрд╛рдПрдВ, рдЯреЛрдХрди_v2 рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЯреЛрдХрди рдХрд╣реЗрдВред рдлрд┐рд░ рд╣рдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рд╛рдЗрди рдХреЗ рд╕рд╛рде рдЙрд╕ рдкреЗрдЬ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рд▓рд┐рдВрдХ рдХреЛ рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдзрд╛рд░рдгрд╛ рдХрд╣рддреЗ рд╣реИрдВ.

рдлрд┐рд░ рд╣рдо рдиреЛрдЯрд┐рдпрди рд╕реЗ рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВред

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. рд╢рдмреНрджреЛрдВ, рдШрдВрдЯреЛрдВ рдФрд░ рдЕрдиреНрдп рдкреНрд░рд╕рдиреНрдирддрд╛рдУрдВ рдХреА рдЧрд┐рдирддреА рдХрд░рдирд╛

рдпреЗ рддреЛ рдФрд░ рднреА рдореБрд╢реНрдХрд┐рд▓ рдХрд╛рдо рд╣реИ. рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░рд╛рд░реВрдк рд╣реИрдВ: рдИрдкреАрдпреВрдмреА рдФрд░ рдкреАрдбреАрдПрдлред рдпрджрд┐ рдИрдкреАрдпреВрдмреА рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рд╢рдмреНрдж рд╕рдВрднрд╡рддрдГ рд╡рд╣рд╛рдВ рд╣реИрдВ, рддреЛ рдкреАрдбреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ: рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЪрд┐рдкрдХреА рд╣реБрдИ рдЫрд╡рд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред

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

рдпрд╣рд╛рдВ рдпрд╣ рд╣реИ:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

A4 рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдпрд╣ Words_PER_PAGE рд▓рдЧрднрдЧ 300 рд╣реИред

рдЖрдЗрдП рдЕрдм рдкреГрд╖реНрдареЛрдВ рдХреА рдЧрд┐рдирддреА рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВред рд╣рдо рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВрдЧреЗ рдкреАрдкреАрдбреАрдПрдл2.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ