Loome koduraamatukogu Notioni ja Pythoni abil.

Mind on alati huvitav, kuidas oma e-raamatukogus raamatud paremini üles seada. Lõppkokkuvõttes jõudsin sellise lahenduseni, mis automaatselt arvestab lehekülgede arvu ja pakub muid mugavusi. Kõiki huvilisi palun lugema edasi.

Jagamine 1. Dropbox

Kõik raamatud asuvad mul Dropboxis. Olen need jaganud neljaks kategooriaks: Õpik, Viidatud, Ilukirjandus, Teaduslik. Kuid viidatud raamatud ma tabelisse ei lisa.

Enamik raamatuid on .epub formaadis, teised aga .pdf. See tähendab, et lõpplahendus peaks katma mõlemad variandid.

Raamatute teed on mul umbes sellised:

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

Kui raamat on ilukirjanduslik, eemaldatakse kategooria (näiteks „Disain” ülaltoodud juhul).

Otsustasin mitte vaeva näha Dropboxi API-ga, kuna mul on installitud nende rakendus, mis sünkroniseerib kausta. Plaan on järgmine: võtame raamatud kaustast, töötleme iga raamatu sõnade loendiga ning lisame Notionisse.

Jagamine 2. Lisame rea

Tabel peaks välja nägema umbes järgmiselt. TÄHELEPANU: veergude nimetused on parem kirjutada ladina tähtedega.

Loome koduraamatukogu Notioni ja Pythoni abil.

Kasutame mitteformaalsest Notioni API’t, kuna ametlikku pole veel saadaval.

Loome koduraamatukogu Notioni ja Pythoni abil.

Minge Notionisse, vajutage Ctrl + Shift + J, minge menüüsse Rakendus -> Küpsised, kopeerige token_v2 ja nimetage see TOKEN. Siis minge soovitud lehele, kus on raamatukogu tabel, ja kopeerige link. Nimetage see NOTION.

Seejärel kirjutame Notioniga ühenduse saamise koodi.

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

Nüüd kirjutame funktsiooni rea lisamiseks tabelisse.

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] == "Kunstiline":
            row.author = tags[2]

        elif tags[0] == "Mittekunstiline":
            row.tags = tags[2]

        elif tags[0] == "Õpikud":
            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. Me võtame ja lisame uue rea tabelisse esimesse ritta. Seejärel jagame oma tee "/" kohaselt ja saame märksõnad. Märksõnad on nagu "Kunstiline", "Disain", kes on autor ja nii edasi. Siis määrame kõik vajalikud tabeli väljad.

Osa 3. Arvutame sõnad, tunnid ja muud toredused.

See on juba keerulisem ülesanne. Nagu mäletame, on meil kaks formaati: ePub ja PDF. Kui ePub-i osas ei ole küsimust — seal on tõenäoliselt sõnad olemas, siis PDF-i puhul ei ole kõik nii selge: see võib koosneda lihtsalt liimitud piltidest.

Seega näeb PDF-is sõnade arvu arvestamise funktsioon välja järgmine: võtame lehekülgede arvu ja korrutame selle teatud konstantsiga (keskmine sõnade arv leheküljel).

Siin see on:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Selle WORDS_PER_PAGE A4 lehekülje kohta on ligikaudu 300.

Nüüd kirjutame funktsiooni lehekülgede arvu arvestamiseks. Kasutame PyPDF2.

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

Järgmisena kirjutame koodi lehekülgede arvestamiseks ePub-is. Kasutame epub_converter. Siin võtame raamatu, konverteerime selle ridadeks ja loendame igas reas 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 arvestame aega. Võtame meie lemmik sõnade arvu ja jagame selle teie lugemiskiirus.

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

Osa 4. Ühendame kõik osad

Peame uurima kõiki võimalikke teid meie raamatute kaustas. Kontrollime, kas raamat on juba Notionis: kui on, siis rida looma ei pea.
Siis peame määrama faili tüübi, sõltuvalt sellest arvutame sõnade arvu. Lõpuks lisame raamatu.

Siin on meie kood:

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, mis kontrollib, 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

Kokkuvõte

Aitäh kõigile, kes selle artikli läbi lugesid. Loodan, et see aitab teil rohkem lugeda 🙂

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster