Nagħmlu librerija tad-dar b'Notion u Python

Dejjem kont interessat kif l-aħjar inqassam il-kotba fil-librerija elettronika tiegħi. Fl-aħħar, wasalt għal din l-għażla b'kalkolu awtomatiku tan-numru ta 'paġni u goodies oħra. Nistaqsi lill-persuni kollha interessati taħt cat.

Parti 1. Dropbox

Il-kotba tiegħi kollha jinsabu fuq dropbox. Hemm 4 kategoriji li fihom qsamt kollox: Ktieb tat-test, Referenza, Finzjoni, Mhux finzjoni. Imma ma nżidx kotba ta' referenza mat-tabella.

Ħafna mill-kotba huma .epub, il-bqija huma .pdf. Jiġifieri, is-soluzzjoni finali trid b'xi mod tkopri ż-żewġ għażliet.

It-toroq tiegħi lejn il-kotba huma xi ħaġa bħal din:

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

Jekk il-ktieb huwa finzjoni, allura l-kategorija (jiġifieri, "Disinn" fil-każ ta 'hawn fuq) titneħħa.

Iddeċidejt li ma niddejjaqx bl-API Dropbox, peress li għandi l-applikazzjoni tagħhom li tissinkronizza l-folder. Jiġifieri, il-pjan huwa dan: nieħdu kotba mill-folder, inmexxu kull ktieb permezz ta 'counter tal-kliem, u nżiduh ma' Notion.

Parti 2. Żid linja

It-tabella nnifisha għandha tidher xi ħaġa bħal din. ATTENZJONI: huwa aħjar li tagħmel l-ismijiet tal-kolonni bil-Latin.

Nagħmlu librerija tad-dar b'Notion u Python

Se nużaw l-API Notion mhux uffiċjali, minħabba li dik uffiċjali għadha ma ġietx ikkunsinnata.

Nagħmlu librerija tad-dar b'Notion u Python

Mur fuq Notion, agħfas Ctrl + Shift + J, mur Applikazzjoni -> Cookies, ikkopja token_v2 u sejjaħlu TOKEN. Imbagħad immorru fil-paġna li għandna bżonn bis-sinjal tal-librerija u nikkopja l-link. Aħna nsejħulu NOZZJONI.

Imbagħad niktbu l-kodiċi biex tikkonnettja ma 'Notion.

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

Sussegwentement, ejja nikteb funzjoni biex iżżid ringiela mat-tabella.

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

X'qed jiġri hawn. Nieħdu u żid ringiela ġdida mat-tabella fl-ewwel ringiela. Sussegwentement, naqsmu t-triq tagħna tul "/" u nġibu tags. Tags - f'termini ta '"Arti", "Disinn", min huwa l-awtur, eċċ. Imbagħad waqqafna l-oqsma kollha meħtieġa tal-pjanċa.

Parti 3. Għadd ta’ kliem, sigħat u pjaċiri oħra

Dan huwa kompitu aktar diffiċli. Kif niftakru, għandna żewġ formati: epub u pdf. Jekk kollox huwa ċar bl-epub - il-kliem x'aktarx hemm, allura kollox mhux daqshekk ċar dwar il-pdf: jista 'sempliċement jikkonsisti minn stampi inkollati.

Allura l-funzjoni tagħna għall-għadd tal-kliem f'PDF se tidher bħal din: nieħdu n-numru ta 'paġni u mmultiplikaw b'ċerta kostanti (in-numru medju ta' kliem għal kull paġna).

Hawn hi:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Din il-WORDS_PER_PAGE għal paġna A4 hija madwar 300.

Issa ejja niktbu funzjoni biex tgħodd il-paġni. Aħna se nużaw pyPDF2.

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

Sussegwentement, aħna ser niktbu ħaġa għall-għadd tal-paġni fl-Epub. Aħna nużaw epub_converter. Hawnhekk nieħdu l-ktieb, jaqilbuh f'linji, u ngħoddu l-kliem għal kull linja.

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)

Issa ejja nikkalkulaw il-ħin. Nieħdu l-għadd tal-kliem favorit tagħna u naqsmuh bil-veloċità tal-qari tiegħek.

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

Parti 4. Tqabbad il-partijiet kollha

Irridu ngħaddu mill-mogħdijiet kollha possibbli fil-folder tal-kotba tagħna. Iċċekkja jekk diġà hemmx ktieb f'Notion: jekk hemm, m'għadniex bżonn noħolqu linja.
Imbagħad irridu niddeterminaw it-tip ta 'fajl, skont dan, għodd in-numru ta' kliem. Żid ktieb fl-aħħar.

Dan huwa l-kodiċi li nġibu:

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)

U l-funzjoni biex tiċċekkja jekk ktieb ġiex miżjud tidher bħal din:

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

Konklużjoni

Grazzi lil kull min qara dan l-artiklu. Nispera li jgħinek taqra aktar :)

Sors: www.habr.com

Żid kumment