Loome koduse raamatukogu Notioni ja Pythoni abil

Mind on alati huvitav, kuidas oma e-raamatukogus raamatuid paremini jaotada. Lõpuks leidsin sellise lahenduse automaatse lehekülgede arvu ja teiste lisafunktsioonidega. Kõiki huvilisi palun alla.

Osa 1. Dropbox

Kõik minu raamatud on Dropboxis. Olen need jaganud neljale kategooriale: Õpik, Käsiraamat, Ilukirjandus, Mitte-ilukirjandus. Käsiraamatud ei ole tabelisse lisatud.

Enamik raamatutest on .epub formaadis, ülejäänud on .pdf. Seega peab lõpplahendus katma mõlemad variandid.

Raamatute teed on mul sellised:

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

Kui raamat on ilukirjandus, siis kategooria (st "Disain" eelnevas näites) kustutatakse.

Otsustasin mitte vaevata Dropboxi API’ga, kuna mul on nende rakendus, mis sünkroniseerib kausta. Seega plaan on selline: võtame raamatud kaustast, iga raamatu töötleme sõnade loendi kaudu ja lisame Notionisse.

Osa 2. Lisame rea

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

Loome koduse raamatukogu Notioni ja Pythoni abil

Kasutame mitteformaalseid Notioni API-sid, sest ametlikud pole veel kohal.

Loome koduse raamatukogu Notioni ja Pythoni abil

Läheme Notioni, vajutame Ctrl + Shift + J, läheme rakendusse -> Küpsised, kopeerime token_v2 ja nimetame selle TOKENiks. Siis läheme soovitud tabelile ja kopeerime lingi. Nimega NOTION.

Siis kirjutame koodi Notioni ühendamiseks.

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

        elif tags[0] == "Mitte-ilukirjandus":
            row.tags = tags[2]

        elif tags[0] == "Õpik":
            row.tags = tags[2]

    if len(tags) >= 4:
        row.author = tags[3]

    row.hours = hours
    row.pages = pages_count
    row.words = words_count

Mida me siin teeme. Me võtame ja lisame uue rea tabelisse esimesse ritta. Edasi jagame meie tee „/” järgi ja saame sildid. Sildid on nagu „Ilukirjandus”, „Disain”, kes on autor ja nii edasi. Siis määrame kõik vajalikud tabeli väljad.

Osa 3. Arvutame sõnu, tunde ja muid vahvaid asju

See on keerulisem ülesanne. Nagu me mäletame, on meil kaks formaati: EPUB ja PDF. Kui EPUB-formati puhul on asi arusaadav — seal on tõenäoliselt sõnu palju, siis PDF’i puhul ei ole kõik nii üheselt mõistetav: see võib koosneda lihtsalt ühendatud piltidest.

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

Siin see on:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

WORDS_PER_PAGE väärtus A4 lehe kohta on umbes 300.

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

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

Jätkame EPUB lehekülgede arvu arvutamise funktsiooniga. Kasutame epub_converter. Siin võtame raamatu, konverteerime selle ridadeks ja iga rea puhul arvutame 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 lugemiseks kuluva aja. Võtame meie lemmik sõnade arvu ja jagame selle teie lugemiskiirusena.

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

Osa 4. Kogume kõik osad kokku

Peame uurima kõiki võimalikke teid meie raamatute kaustas. Kontrollime, kas raamat on juba Notionis olemas: kui on — siis me rida looma ei pea.
Seejärel peame määrama faili tüübi ja selle alusel arvutama sõnade arvu. Lõpus lisama raamatu.

Selline kood meil lõpuks saab:

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 raamatute olemasolu kontrollimiseks näeb välja selline:

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 hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster