Koduraamatukogu loomine Notioni ja Pythoniga

Mind on alati huvitanud, kuidas kõige paremini oma elektroonilises raamatukogus raamatuid levitada. Lõpuks jõudsin selle võimaluseni lehtede arvu ja muu hea automaatse arvutamisega. Küsin kõigilt huvilistelt kat.

1. osa. Dropbox

Kõik mu raamatud on dropboxis. Seal on 4 kategooriat, millesse ma kõik jaotasin: õpik, teatmik, ilukirjandus, mitteilukirjandus. Kuid ma ei lisa tabelisse teatmeteoseid.

Enamik raamatuid on .epub, ülejäänud on .pdf. See tähendab, et lõpplahendus peab kuidagi katma mõlemad variandid.

Minu teed raamatuteni on umbes sellised:

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

Kui raamat on ilukirjandus, siis kategooria (st ülaltoodud juhul „Disain”) eemaldatakse.

Otsustasin Dropbox API-ga mitte vaeva näha, kuna mul on nende rakendus, mis kausta sünkroonib. See tähendab, et plaan on järgmine: võtame kaustast raamatud, laseme iga raamatu läbi sõnade loenduri ja lisame selle mõistesse.

Osa 2. Lisa rida

Tabel ise peaks välja nägema umbes selline. TÄHELEPANU: veergude nimed on parem teha ladina keeles.

Koduraamatukogu loomine Notioni ja Pythoniga

Kasutame mitteametlikku Notion API-t, kuna ametlikku pole veel tarnitud.

Koduraamatukogu loomine Notioni ja Pythoniga

Avage Notion, vajutage klahvikombinatsiooni Ctrl + Shift + J, avage rakendus -> Küpsised, kopeerige token_v2 ja nimetage see TOKEN. Seejärel läheme raamatukogu märgiga vajalikule lehele ja kopeerime lingi. Me nimetame seda MÕISTEKS.

Seejärel kirjutame Notioniga ühenduse loomiseks koodi.

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

Järgmisena kirjutame tabelisse rea lisamiseks funktsiooni.

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

Mis siin toimub. Võtame ja lisame esimese rea tabelisse uue rea. Järgmisena jagame oma tee mööda "/" ja saame sildid. Sildid - "Kunst", "Disain", kes on autor ja nii edasi. Seejärel määrame plaadi kõik vajalikud väljad.

3. osa. Sõnade, tundide ja muude naudingute lugemine

See on keerulisem ülesanne. Nagu mäletame, on meil kaks vormingut: epub ja pdf. Kui epubiga on kõik selge - sõnad on tõenäoliselt seal, siis pdf-i puhul pole kõik nii selge: see võib koosneda lihtsalt liimitud piltidest.

Seega näeb meie funktsioon sõnade lugemiseks PDF-is välja järgmine: võtame lehekülgede arvu ja korrutame kindla konstandiga (keskmine sõnade arv lehel).

Siin ta on:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

See WORDS_PER_PAGE A4-lehel on ligikaudu 300.

Nüüd kirjutame funktsiooni lehtede loendamiseks. Me kasutame pyPDF2.

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

Järgmisena kirjutame Epubis lehekülgede lugemise. Me kasutame epub_converter. Siin võtame raamatu, teisendame selle ridadeks ja loendame iga rea ​​sõnad.

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)

Nüüd arvutame aega. Võtame oma lemmiksõnade arvu ja jagame selle teie lugemiskiirusega.

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

Osa 4. Kõikide osade ühendamine

Peame oma raamatute kaustas läbima kõik võimalikud teed. Kontrollige, kas Notionis on juba raamat: kui see on olemas, ei pea me enam rida looma.
Seejärel peame määrama failitüübi, sõltuvalt sellest loendama sõnade arvu. Lisage lõppu raamat.

Selle koodi saame:

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)

Ja funktsioon kontrollimaks, kas raamat on lisatud, näeb välja järgmine:

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

Järeldus

Aitäh kõigile, kes seda artiklit lugesid. Loodan, et see aitab teil rohkem lugeda :)

Allikas: www.habr.com

Lisa kommentaar