Realizarea unei biblioteci de acasă cu Notion și Python

Întotdeauna am fost interesat de cum să distribuim cel mai bine cărțile în biblioteca mea electronică. Până la urmă, am ajuns la această variantă cu calcul automat al numărului de pagini și alte bunătăți. Întreb toate persoanele interesate sub cat.

Partea 1. Dropbox

Toate cărțile mele sunt pe dropbox. Sunt 4 categorii în care am împărțit totul: Manual, Referință, Ficțiune, Non-ficțiune. Dar nu adaug cărți de referință pe tabel.

Majoritatea cărților sunt .epub, restul sunt .pdf. Adică soluția finală trebuie să acopere cumva ambele variante.

Drumurile mele către cărți sunt cam așa:

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

Dacă cartea este ficțiune, atunci categoria (adică „Design” în cazul de mai sus) este eliminată.

Am decis să nu mă deranjez cu API-ul Dropbox, deoarece am aplicația lor care sincronizează folderul. Adică, planul este următorul: luăm cărți din dosar, trecem fiecare carte printr-un contor de cuvinte și o adăugăm la Notion.

Partea 2. Adăugați o linie

Masa în sine ar trebui să arate cam așa. ATENȚIE: este mai bine să faceți numele coloanelor în latină.

Realizarea unei biblioteci de acasă cu Notion și Python

Vom folosi API-ul Notion neoficial, deoarece cel oficial nu a fost încă livrat.

Realizarea unei biblioteci de acasă cu Notion și Python

Accesați Notion, apăsați Ctrl + Shift + J, accesați Aplicație -> Cookies, copiați token_v2 și numiți-l TOKEN. Apoi mergem la pagina de care avem nevoie cu semnul bibliotecii și copiem linkul. O numim NOȚIUNE.

Apoi scriem codul pentru a ne conecta la Notion.

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

Apoi, să scriem o funcție pentru a adăuga un rând la tabel.

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

Ce se petrece aici. Luăm și adăugăm un nou rând la tabelul din primul rând. Apoi, ne împărțim calea de-a lungul „/” și obținem etichete. Etichete - în ceea ce privește „Artă”, „Design”, cine este autorul și așa mai departe. Apoi setăm toate câmpurile necesare ale plăcii.

Partea 3. Numărarea cuvintelor, a orelor și a altor delicii

Aceasta este o sarcină mai dificilă. După cum ne amintim, avem două formate: epub și pdf. Dacă totul este clar cu epub - cuvintele sunt probabil acolo, atunci totul nu este atât de clar despre pdf: poate consta pur și simplu din imagini lipite.

Deci funcția noastră de numărare a cuvintelor în PDF va arăta astfel: luăm numărul de pagini și înmulțim cu o anumită constantă (numărul mediu de cuvinte pe pagină).

Acolo e:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Această WORDS_PER_PAGE pentru o pagină A4 este de aproximativ 300.

Acum să scriem o funcție pentru a număra paginile. Noi vom folosi pyPDF2.

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

În continuare, vom scrie un lucru pentru numărarea paginilor în Epub. Folosim epub_converter. Aici luăm cartea, o transformăm în rânduri și numărăm cuvintele pentru fiecare rând.

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)

Acum să calculăm timpul. Luăm numărul de cuvinte preferate și îl împărțim la viteza de citire.

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

Partea 4. Conectarea tuturor pieselor

Trebuie să parcurgem toate căile posibile în dosarul nostru de cărți. Verificați dacă există deja o carte în Notion: dacă există, nu mai trebuie să creăm o linie.
Apoi trebuie să determinăm tipul de fișier, în funcție de acesta, numărăm numărul de cuvinte. Adăugați o carte la sfârșit.

Acesta este codul pe care îl obținem:

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)

Și funcția pentru a verifica dacă a fost adăugată o carte arată astfel:

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

Concluzie

Mulțumesc tuturor celor care au citit acest articol. Sper sa te ajute sa citesti mai mult :)

Sursa: www.habr.com

Adauga un comentariu