рдорд╛рдЭреНрдпрд╛ рдЗрд▓реЗрдХреНтАНрдЯреНрд░реЙрдирд┐рдХ рд▓рд╛рдпрдмреНрд░рд░реАрдордзреНрдпреЗ рдкреБрд╕реНрддрдХрд╛рдВрдЪреЗ рд╡рд┐рддрд░рдг рдХрд╕реЗ рдЪрд╛рдВрдЧрд▓реЗ рдХрд░рд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рдорд▓рд╛ рдиреЗрд╣рдореАрдЪ рд░рд╕ рдЖрд╣реЗ. рд╢реЗрд╡рдЯреА, рдореА рдкреГрд╖реНрдард╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЖрдгрд┐ рдЗрддрд░ рд╡рд╕реНрддреВрдВрдЪреА рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдЧрдгрдирд╛ рдХрд░реВрди рдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рд╡рд░ рдЖрд▓реЛ. рдореА рдорд╛рдВрдЬрд░ рдЕрдВрддрд░реНрдЧрдд рд╕рд░реНрд╡ рд╕реНрд╡рд╛рд░рд╕реНрдп рд╡реНрдпрдХреНрддреА рд╡рд┐рдЪрд╛рд░реВ.
рднрд╛рдЧ 1. рдбреНрд░реЙрдкрдмреЙрдХреНрд╕
рдорд╛рдЭреА рд╕рд░реНрд╡ рдкреБрд╕реНрддрдХреЗ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕рд╡рд░ рдЖрд╣реЗрдд. 4 рд╡рд░реНрдЧ рдЖрд╣реЗрдд рдЬреНрдпрд╛рдд рдореА рд╕рд░реНрд╡рдХрд╛рд╣реА рд╡рд┐рднрд╛рдЧрд▓реЗ рдЖрд╣реЗ: рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ, рд╕рдВрджрд░реНрдн, рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрдерд╛, рдЧреИрд░-рдХрд╛рд▓реНрдкрдирд┐рдХ. рдкрдг рдореА рдЯреЗрдмрд▓рдордзреНрдпреЗ рд╕рдВрджрд░реНрдн рдкреБрд╕реНрддрдХреЗ рдЬреЛрдбрдд рдирд╛рд╣реА.
рдмрд╣реБрддреЗрдХ рдкреБрд╕реНрддрдХреЗ .epub рдЖрд╣реЗрдд, рдмрд╛рдХреАрдЪреА .pdf рдЖрд╣реЗрдд. рдореНрд╣рдгрдЬреЗрдЪ, рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рдирд╛рдордзреНрдпреЗ рджреЛрдиреНрд╣реА рдкрд░реНрдпрд╛рдпрд╛рдВрдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдорд╛рдЭреЗ рдкреБрд╕реНрддрдХрд╛рдВрдЪреЗ рдорд╛рд░реНрдЧ рдЕрд╕реЗ рдЖрд╣реЗрдд:
/╨Ъ╨╜╨╕╨│╨╕/╨Э╨╡╤Е╤Г╨┤╨╛╨╢╨╡╤Б╤В╨▓╨╡╨╜╨╜╨╛╨╡/╨Э╨╛╨▓╨╛╨╡/╨Ф╨╕╨╖╨░╨╣╨╜/╨о╤А╨╕╨╣ ╨У╨╛╤А╨┤╨╛╨╜/╨Ъ╨╜╨╕╨│╨░ ╨┐╤А╨╛ ╨▒╤Г╨║╨▓╤Л ╨╛╤В ╨Р ╨┤╨╛ ╨п.epub
рдЬрд░ рдкреБрд╕реНрддрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЕрд╕реЗрд▓, рддрд░ рд╢реНрд░реЗрдгреА (рдореНрд╣рдгрдЬреЗрдЪ рд╡рд░реАрд▓ рдмрд╛рдмрддреАрдд тАЬрдбрд┐рдЭрд╛рдЗрдитАЭ) рдХрд╛рдвреВрди рдЯрд╛рдХрд▓реА рдЬрд╛рдИрд▓.
рдореА рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ API рдЪрд╛ рддреНрд░рд╛рд╕ рди рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛, рдХрд╛рд░рдг рдорд╛рдЭреНрдпрд╛рдХрдбреЗ рддреНрдпрд╛рдВрдЪрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЖрд╣реЗ рдЬреЛ рдлреЛрд▓реНрдбрд░ рд╕рдордХреНрд░рдорд┐рдд рдХрд░рддреЛ. рдореНрд╣рдгрдЬреЗрдЪ, рдпреЛрдЬрдирд╛ рдЕрд╢реА рдЖрд╣реЗ: рдЖрдореНрд╣реА рдлреЛрд▓реНрдбрд░рдордзреВрди рдкреБрд╕реНрддрдХреЗ рдШреЗрддреЛ, рдкреНрд░рддреНрдпреЗрдХ рдкреБрд╕реНрддрдХ рд╡рд░реНрдб рдХрд╛рдЙрдВрдЯрд░рджреНрд╡рд╛рд░реЗ рдЪрд╛рд▓рд╡рддреЛ рдЖрдгрд┐ рддреЗ рдиреЛрдЯреЗрд╢рдирдордзреНрдпреЗ рдЬреЛрдбрддреЛ.
рднрд╛рдЧ 2. рдПрдХ рдУрд│ рдЬреЛрдбрд╛
рдЯреЗрдмрд▓ рд╕реНрд╡рддрдГ рдЕрд╕реЗ рдХрд╛рд╣реАрддрд░реА рджрд┐рд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ. рд▓рдХреНрд╖ рджреНрдпрд╛: рд▓реЕрдЯрд┐рдирдордзреНрдпреЗ рд╕реНрддрдВрдн рдирд╛рд╡реЗ рдХрд░рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ.
рдЖрдореНрд╣реА рдЕрдирдзрд┐рдХреГрдд рдиреЗрд╢рди API рд╡рд╛рдкрд░реВ, рдХрд╛рд░рдг рдЕрдзрд┐рдХреГрдд рдЕрджреНрдпрд╛рдк рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реА.
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 рдЖрд╣реЗ.
рдЖрддрд╛ рдкреЗрдЬ рдореЛрдЬрдгреНрдпрд╛рд╕рд╛рдареА рдлрдВрдХреНрд╢рди рд▓рд┐рд╣реВ. рдЖрдореНрд╣реА рд╡рд╛рдкрд░реВ
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
рдкреБрдвреЗ, рдЖрдореНрд╣реА Epub рдордзреНрдпреЗ рдкреГрд╖реНрдареЗ рдореЛрдЬрдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рдЧреЛрд╖реНрдЯ рд▓рд┐рд╣реВ. рдЖрдореНрд╣реА рд╡рд╛рдкрд░рддреЛ
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