Notion рдЖрдгрд┐ Python рд╕рд╣ рд╣реЛрдо рд▓рд╛рдпрдмреНрд░рд░реА рдмрдирд╡рдгреЗ

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

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

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

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

рдорд╛рдЭреЗ рдкреБрд╕реНрддрдХрд╛рдВрдЪреЗ рдорд╛рд░реНрдЧ рдЕрд╕реЗ рдЖрд╣реЗрдд:

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

рдЬрд░ рдкреБрд╕реНрддрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЕрд╕реЗрд▓, рддрд░ рд╢реНрд░реЗрдгреА (рдореНрд╣рдгрдЬреЗрдЪ рд╡рд░реАрд▓ рдмрд╛рдмрддреАрдд тАЬрдбрд┐рдЭрд╛рдЗрдитАЭ) рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реА рдЬрд╛рдИрд▓.

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

рднрд╛рдЧ 2. рдПрдХ рдУрд│ рдЬреЛрдбрд╛

рдЯреЗрдмрд▓ рд╕реНрд╡рддрдГ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. рд▓рдХреНрд╖ рджреНрдпрд╛: рд▓реЕрдЯрд┐рдирдордзреНрдпреЗ рд╕реНрддрдВрдн рдирд╛рд╡реЗ рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ.

Notion рдЖрдгрд┐ Python рд╕рд╣ рд╣реЛрдо рд▓рд╛рдпрдмреНрд░рд░реА рдмрдирд╡рдгреЗ

рдЖрдореНрд╣реА рдЕрдирдзрд┐рдХреГрдд рдиреЗрд╢рди API рд╡рд╛рдкрд░реВ, рдХрд╛рд░рдг рдЕрдзрд┐рдХреГрдд рдЕрджреНрдпрд╛рдк рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реА.

Notion рдЖрдгрд┐ Python рд╕рд╣ рд╣реЛрдо рд▓рд╛рдпрдмреНрд░рд░реА рдмрдирд╡рдгреЗ

Notion рд╡рд░ рдЬрд╛, Ctrl + Shift + J рджрд╛рдмрд╛, Application -> Cookies рд╡рд░ рдЬрд╛, token_v2 рдХреЙрдкреА рдХрд░рд╛ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ TOKEN рдореНрд╣рдгрд╛. рдордЧ рдЖрдореНрд╣реА рд▓рд╛рдпрдмреНрд░рд░реА рдЪрд┐рдиреНрд╣рд╛рд╕рд╣ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреГрд╖реНрдард╛рд╡рд░ рдЬрд╛рддреЛ рдЖрдгрд┐ рд▓рд┐рдВрдХ рдХреЙрдкреА рдХрд░рддреЛ. рддреНрдпрд╛рд▓рд╛ рдЖрдкрдг NOTION рдореНрд╣рдгрддреЛ.

рдордЧ рдЖрдкрдг 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 рдмрджреНрджрд▓ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЗрддрдХреЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рд╣реА: рддреНрдпрд╛рдд рдлрдХреНрдд рдЪрд┐рдХрдЯрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рдорд╛ рдЕрд╕реВ рд╢рдХрддрд╛рдд.

рдореНрд╣рдгреВрди рдкреАрдбреАрдПрдлрдордзреНрдпреЗ рд╢рдмреНрдж рдореЛрдЬрдгреНрдпрд╛рдЪреЗ рдЖрдордЪреЗ рдХрд╛рд░реНрдп рдЕрд╕реЗ рджрд┐рд╕реЗрд▓: рдЖрдореНрд╣реА рдкреГрд╖реНрдард╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдШреЗрддреЛ рдЖрдгрд┐ рдПрдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рд░рд╛рдВрдХрд╛рдиреЗ (рдкреНрд░рддрд┐ рдкреГрд╖реНрда рд╢рдмреНрджрд╛рдВрдЪреА рд╕рд░рд╛рд╕рд░реА рд╕рдВрдЦреНрдпрд╛) рдЧреБрдгрд╛рдХрд╛рд░ рдХрд░рддреЛ.

рддреА рдпреЗрдереЗ рдЖрд╣реЗ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛