Farante hejman bibliotekon kun Notion kaj Python

Mi ĉiam interesiĝis pri kiel plej bone distribui librojn en mia elektronika biblioteko. Fine, mi venis al ĉi tiu opcio kun aŭtomata kalkulo de la nombro da paĝoj kaj aliaj bonaĵoj. Mi petas ĉiujn interesatojn sub kato.

Parto 1. Dropbox

Ĉiuj miaj libroj estas en dropbox. Estas 4 kategorioj en kiuj mi dividis ĉion: Lernolibro, Referenco, Fikcio, Nefikcio. Sed mi ne aldonas konsultlibrojn al la tablo.

La plej multaj el la libroj estas .epub, la ceteraj estas .pdf. Tio estas, la fina solvo devas iel kovri ambaŭ opciojn.

Miaj vojoj al libroj estas io kiel ĉi tio:

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

Se la libro estas fikcio, tiam la kategorio (tio estas, "Dezajno" en la kazo supre) estas forigita.

Mi decidis ne ĝeni la Dropbox API, ĉar mi havas ilian aplikaĵon, kiu sinkronigas la dosierujon. Tio estas, la plano estas jena: ni prenas librojn el la dosierujo, kuras ĉiun libron tra vortkalkulilo kaj aldonas ĝin al Notion.

Parto 2. Aldonu linion

La tablo mem devus aspekti kiel ĉi tio. ATENTU: estas pli bone fari kolonnomojn en la latina.

Farante hejman bibliotekon kun Notion kaj Python

Ni uzos la neoficialan Notion API, ĉar la oficiala ankoraŭ ne estis liverita.

Farante hejman bibliotekon kun Notion kaj Python

Iru al Notion, premu Ctrl + Shift + J, iru al Apliko -> Kuketoj, kopiu token_v2 kaj nomu ĝin TOKEN. Poste ni iras al la paĝo, kiun ni bezonas kun la biblioteko-signo kaj kopiu la ligilon. Ni nomas ĝin NOCIO.

Poste ni skribas la kodon por konekti al Notion.

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

Poste, ni skribu funkcion por aldoni vicon al la tabelo.

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

Kio okazas ĉi tie. Ni prenas kaj aldonas novan vicon al la tablo en la unua vico. Poste ni disigas nian vojon laŭ "/" kaj ricevas etikedojn. Etikedoj - laŭ "Arto", "Dezajno", kiu estas la aŭtoro, ktp. Tiam ni starigas ĉiujn necesajn kampojn de la telero.

Parto 3. Nombri vortojn, horojn kaj aliajn ĝojojn

Ĉi tio estas pli malfacila tasko. Kiel ni memoras, ni havas du formatojn: epub kaj pdf. Se ĉio estas klara ĉe la epub - la vortoj verŝajne estas tie, tiam ĉio ne estas tiel klara pri la pdf: ĝi povas simple konsisti el gluitaj bildoj.

Do nia funkcio por kalkuli vortojn en PDF aspektos jene: ni prenas la nombron da paĝoj kaj multobligas per certa konstanto (la averaĝa nombro da vortoj po paĝo).

Jen ŝi:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Ĉi tiu WORDS_PER_PAGE por paĝo A4 estas proksimume 300.

Nun ni skribu funkcion por kalkuli paĝojn. Ni uzos pyPDF2.

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

Poste, ni skribos aferon por kalkuli paĝojn en Epub. Ni uzas epub_konvertilo. Ĉi tie ni prenas la libron, konvertas ĝin en liniojn, kaj nombras la vortojn por ĉiu linio.

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)

Nun ni kalkulu la tempon. Ni prenas nian plej ŝatatan vortkalkulon kaj dividas ĝin per via legadrapideco.

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

Parto 4. Konektante ĉiujn partojn

Ni devas trairi ĉiujn eblajn vojojn en nia dosierujo de libroj. Kontrolu ĉu jam estas libro en Notion: se ekzistas, ni ne plu bezonas krei linion.
Tiam ni devas determini la dosiertipo, depende de ĉi tio, kalkuli la nombron da vortoj. Aldonu libron ĉe la fino.

Jen la kodo, kiun ni ricevas:

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)

Kaj la funkcio por kontroli ĉu libro estis aldonita aspektas jene:

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

konkludo

Dankon al ĉiuj, kiuj legis ĉi tiun artikolon. Mi esperas, ke ĝi helpos vin legi pli :)

fonto: www.habr.com

Aldoni komenton