Fè yon bibliyotèk lakay ak Notion ak Python

Mwen te toujou enterese nan ki jan pi byen distribye liv nan bibliyotèk elektwonik mwen an. Nan fen a, mwen te rive nan opsyon sa a ak kalkil otomatik nan kantite paj ak lòt kado. Mwen mande tout moun ki enterese anba chat.

Pati 1. Dropbox

Tout liv mwen yo sou dropbox. Gen 4 kategori kote mwen divize tout bagay: Liv, Referans, Fiksyon, Non-fiksyon. Men, mwen pa ajoute liv referans sou tab la.

Pifò nan liv yo se .epub, rès yo se .pdf. Sa vle di, solisyon final la dwe yon jan kanmenm kouvri tou de opsyon.

Chemen mwen nan liv yo se yon bagay tankou sa a:

/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub 

Si liv la se fiksyon, Lè sa a, kategori a (ki se, "Design" nan ka ki anwo a) yo retire.

Mwen deside pa deranje ak Dropbox API a, depi mwen gen aplikasyon yo ki senkronize katab la. Sa vle di, plan an se sa a: nou pran liv nan katab la, kouri chak liv nan yon kontwa mo, epi ajoute li nan Nosyon.

Pati 2. Ajoute yon liy

Tablo nan tèt li ta dwe gade yon bagay tankou sa a. ATANSYON: li pi bon pou fè non kolòn an laten.

Fè yon bibliyotèk lakay ak Notion ak Python

Nou pral sèvi ak API Notion ki pa ofisyèl la, paske youn ofisyèl la poko te delivre.

Fè yon bibliyotèk lakay ak Notion ak Python

Ale nan Notion, peze Ctrl + Shift + J, ale nan Aplikasyon -> Cookies, kopye token_v2 epi rele li TOKEN. Lè sa a, nou ale nan paj nou bezwen an ak siy bibliyotèk la epi kopye lyen an. Nou rele li NOTION.

Lè sa a, nou ekri kòd la konekte ak Notion.

database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()

Apre sa, ann ekri yon fonksyon pou ajoute yon ranje sou tab la.

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

Sa k ap pase la a. Nou pran epi ajoute yon nouvo ranje sou tab la nan premye ranje a. Apre sa, nou divize chemen nou an sou "/" epi jwenn tags. Tags - an tèm de "Atis", "Design", ki moun ki otè a, ak sou sa. Lè sa a, nou mete tout jaden ki nesesè nan plak la.

Pati 3. Konte mo, èdtan ak lòt plezi

Sa a se yon travay ki pi difisil. Kòm nou sonje, nou gen de fòma: epub ak pdf. Si tout bagay klè ak epub la - mo yo pwobableman la pou asire w, Lè sa a, ak pdf la tout bagay se pa tèlman klè: li ka tou senpleman konpoze de imaj kole.

Se konsa, fonksyon nou an pou konte mo nan PDF pral sanble sa a: nou pran kantite paj ak miltipliye pa yon sèten konstan (kantite an mwayèn nan mo pou chak paj).

Men li ye:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

WORDS_PER_PAGE sa a pou yon paj A4 se apeprè 300.

Koulye a, ann ekri yon fonksyon pou konte paj. Nou pral itilize pyPDF2.

def get_pdf_pages_number(path, filename):
    pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
    return pdf.getNumPages()

Apre sa, nou pral ekri yon bagay pou konte paj nan Epub. Nou itilize epub_converter. Isit la nou pran liv la, konvèti li an liy, epi konte mo yo pou chak liy.

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)

Koulye a, ann kalkile tan an. Nou pran konte mo pi renmen nou an epi divize li pa vitès lekti ou.

def get_reading_time(words_count):
    return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10

Pati 4. Konekte tout pati yo

Nou bezwen ale nan tout chemen posib nan katab liv nou an. Tcheke si liv la deja egziste nan Notion: si se konsa, nou pa bezwen kreye yon liy ankò.
Lè sa a, nou bezwen detèmine kalite dosye a, tou depann de sa a, konte kantite mo yo. Ajoute yon liv nan fen a.

Sa a se kòd nou jwenn:

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)

Ak fonksyon pou tcheke si yo te ajoute yon liv sanble tankou sa a:

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

Konklizyon

Mèsi a tout moun ki li atik sa a. Mwen espere ke li ede ou li plis :)

Sous: www.habr.com

Add nouvo kòmantè