At lave et hjemmebibliotek med Notion og Python

Jeg har altid været interesseret i, hvordan jeg bedst distribuerer bøger i mit elektroniske bibliotek. Til sidst kom jeg til denne mulighed med automatisk udregning af antal sider og andet godt. Jeg spørger alle interesserede under kat.

Del 1. Dropbox

Alle mine bøger er på dropbox. Der er 4 kategorier, som jeg har opdelt alt i: Lærebog, Reference, Skønlitteratur, Faglitteratur. Men jeg tilføjer ikke opslagsbøger til bordet.

De fleste af bøgerne er .epub, resten er .pdf. Det vil sige, at den endelige løsning på en eller anden måde skal dække begge muligheder.

Mine veje til bøger er sådan her:

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

Hvis bogen er fiktion, fjernes kategorien (det vil sige "Design" i ovenstående tilfælde).

Jeg besluttede ikke at genere Dropbox API, da jeg har deres applikation, der synkroniserer mappen. Det vil sige, planen er denne: Vi tager bøger fra mappen, kører hver bog gennem en ordtæller og tilføjer den til Notion.

Del 2. Tilføj en linje

Selve bordet skal se sådan ud. OBS: det er bedre at lave kolonnenavne på latin.

At lave et hjemmebibliotek med Notion og Python

Vi vil bruge den uofficielle Notion API, fordi den officielle endnu ikke er leveret.

At lave et hjemmebibliotek med Notion og Python

Gå til Notion, tryk på Ctrl + Shift + J, gå til Application -> Cookies, kopier token_v2 og kald det TOKEN. Så går vi til den side vi skal bruge med biblioteksskiltet og kopierer linket. Vi kalder det NOTION.

Derefter skriver vi koden for at oprette forbindelse til Notion.

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

Lad os derefter skrive en funktion for at tilføje en række til tabellen.

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

Hvad sker der her. Vi tager og tilføjer en ny række til tabellen i første række. Dernæst deler vi vores vej langs "/" og får tags. Tags - i form af "Kunst", "Design", hvem der er forfatter, og så videre. Derefter sætter vi alle de nødvendige felter af pladen.

Del 3. At tælle ord, timer og andre lækkerier

Dette er en sværere opgave. Som vi husker, har vi to formater: epub og pdf. Hvis alt er klart med epub - ordene er der nok, så er alt ikke så klart om pdf'en: den kan simpelthen bestå af limede billeder.

Så vores funktion til at tælle ord i PDF vil se således ud: vi tager antallet af sider og multiplicerer med en bestemt konstant (det gennemsnitlige antal ord pr. side).

Her er hun:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Denne WORDS_PER_PAGE for en A4-side er cirka 300.

Lad os nu skrive en funktion til at tælle sider. Vi vil bruge pyPDF2.

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

Dernæst vil vi skrive en ting om at tælle sider i Epub. Vi bruger epub_konverter. Her tager vi bogen, konverterer den til linjer og tæller ordene for hver linje.

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)

Lad os nu beregne tiden. Vi tager vores yndlingsordtælling og dividerer det med din læsehastighed.

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

Del 4. Tilslutning af alle dele

Vi skal gennemgå alle mulige veje i vores bogmappe. Tjek, om der allerede er en bog i Notion: hvis der er, behøver vi ikke længere at oprette en linje.
Så skal vi bestemme filtypen, afhængigt af dette, tælle antallet af ord. Tilføj en bog til sidst.

Dette er koden vi får:

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)

Og funktionen til at kontrollere, om en bog er tilføjet, ser sådan ud:

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

Konklusion

Tak til alle, der læste denne artikel. Jeg håber det hjælper dig med at læse mere :)

Kilde: www.habr.com

Tilføj en kommentar