Lage et hjemmebibliotek med Notion og Python

Jeg har alltid vært interessert i hvordan jeg best kan distribuere bøker i det elektroniske biblioteket mitt. Til slutt kom jeg til dette alternativet med automatisk beregning av antall sider og andre godbiter. Jeg spør alle interesserte under katt.

Del 1. Dropbox

Alle bøkene mine er på dropbox. Det er 4 kategorier jeg delte alt inn i: Lærebok, Referanse, Skjønnlitteratur, Sakprosa. Men jeg legger ikke til oppslagsverk på bordet.

De fleste bøkene er .epub, resten er .pdf. Det vil si at den endelige løsningen på en eller annen måte må dekke begge alternativene.

Mine veier til bøker er omtrent slik:

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

Hvis boken er fiksjon, fjernes kategorien (det vil si "Design" i tilfellet ovenfor).

Jeg bestemte meg for ikke å bry meg med Dropbox API, siden jeg har applikasjonen deres som synkroniserer mappen. Det vil si at planen er denne: vi tar bøker fra mappen, kjører hver bok gjennom en ordteller og legger den til Notion.

Del 2. Legg til en linje

Selve bordet skal se omtrent slik ut. OBS: det er bedre å lage kolonnenavn på latin.

Lage et hjemmebibliotek med Notion og Python

Vi vil bruke den uoffisielle Notion API, fordi den offisielle ennå ikke er levert.

Lage et hjemmebibliotek med Notion og Python

Gå til Notion, trykk Ctrl + Shift + J, gå til Application -> Cookies, kopier token_v2 og kall det TOKEN. Så går vi til siden vi trenger med bibliotekskiltet og kopierer lenken. Vi kaller det NOTION.

Deretter skriver vi koden for å koble til Notion.

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

La oss deretter skrive en funksjon for å legge til en rad i 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

Hva foregår her. Vi tar og legger til en ny rad i tabellen i den første raden. Deretter deler vi veien langs "/" og får tags. Tagger - når det gjelder "Kunst", "Design", hvem som er forfatteren, og så videre. Deretter setter vi alle de nødvendige feltene på platen.

Del 3. Å telle ord, timer og andre herligheter

Dette er en vanskeligere oppgave. Som vi husker har vi to formater: epub og pdf. Hvis alt er klart med epub - ordene er sannsynligvis der, så er ikke alt så klart om pdf-en: den kan ganske enkelt bestå av limte bilder.

Så funksjonen vår for å telle ord i PDF vil se slik ut: vi tar antall sider og multipliserer med en viss konstant (gjennomsnittlig antall ord per 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 omtrent 300.

La oss nå skrive en funksjon for å telle sider. Vi vil bruke pyPDF2.

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

Deretter skal vi skrive en ting for å telle sider i Epub. Vi bruker epub_konverter. Her tar vi boka, konverterer den til linjer, og teller 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)

La oss nå beregne tiden. Vi tar vår favorittordtelling og deler den på lesehastigheten din.

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

Del 4. Koble til alle delene

Vi må gå gjennom alle mulige veier i bokmappen vår. Sjekk om det allerede er en bok i Notion: hvis det finnes, trenger vi ikke lenger å opprette en linje.
Deretter må vi bestemme filtypen og, avhengig av dette, telle antall ord. Legg til en bok på slutten.

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 funksjonen for å sjekke om en bok er lagt til ser slik ut:

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

Konklusjon

Takk til alle som leser denne artikkelen. Jeg håper det hjelper deg å lese mer :)

Kilde: www.habr.com

Legg til en kommentar