In thúsbibleteek meitsje mei Notion en Python

Ik haw altyd ynteressearre west yn hoe't ik boeken it bêste kin fersprieden yn myn elektroanyske bibleteek. Oan 'e ein kaam ik ta dizze opsje mei automatyske berekkening fan it oantal siden en oare guod. Ik freegje alle ynteressearre persoanen ûnder kat.

Diel 1. Dropbox

Al myn boeken binne op dropbox. Der binne 4 kategoryen dêr't ik alles yn ferdield: Learboek, Referinsje, Fiksje, Non-fiksje. Mar ik foegje gjin referinsjeboeken oan 'e tafel.

De measte boeken binne .epub, de rest binne .pdf. Dat is, de definitive oplossing moat op ien of oare manier beide opsjes dekke.

Myn paden nei boeken binne sa:

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

As it boek fiksje is, dan wurdt de kategory (dat is "ûntwerp" yn it gefal hjirboppe) fuorthelle.

Ik besleat my net te bemuoien mei de Dropbox API, om't ik har applikaasje haw dy't de map syngronisearret. Dat is, it plan is dit: wy nimme boeken út de map, rinne elk boek troch in wurdteller en foegje it ta oan Notion.

Diel 2. Foegje in rigel ta

De tafel sels moat der sa útsjen. ATTENTION: it is better om kolomnammen yn it Latyn te meitsjen.

In thúsbibleteek meitsje mei Notion en Python

Wy sille de net-offisjele Notion API brûke, om't de offisjele noch net is levere.

In thúsbibleteek meitsje mei Notion en Python

Gean nei Notion, druk op Ctrl + Shift + J, gean nei Applikaasje -> Koekjes, kopiearje token_v2 en neam it TOKEN. Dan geane wy ​​nei de side dy't wy nedich binne mei it bibleteekteken en kopiearje de keppeling. Wy neame it NOTION.

Dan skriuwe wy de koade om te ferbinen mei Notion.

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

Litte wy dan in funksje skriuwe om in rige oan 'e tabel ta te foegjen.

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

Wat bart hjir. Wy nimme en tafoegje in nije rige oan 'e tafel yn' e earste rige. Dêrnei splitje wy ús paad lâns "/" en krije tags. Tags - yn termen fan "keunst", "ûntwerp", wa is de auteur, ensafuorthinne. Dan sette wy alle nedige fjilden fan 'e plaat.

Diel 3. Telle wurden, oeren en oare lekkernijen

Dit is in dreger taak. As wy ûnthâlde, hawwe wy twa formaten: epub en pdf. As alles dúdlik is mei de epub - de wurden binne der wierskynlik, dan is alles net sa dúdlik oer de pdf: it kin gewoan bestean út oanplakte bylden.

Dat ús funksje foar it tellen fan wurden yn PDF sil der sa útsjen: wy nimme it oantal siden en fermannichfâldigje mei in bepaalde konstante (it gemiddelde oantal wurden per side).

Hjir is se:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Dizze WORDS_PER_PAGE foar in A4-side is sawat 300.

Litte wy no in funksje skriuwe om siden te tellen. Wy sille brûke pyPDF2.

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

Folgjende sille wy in ding skriuwe foar it tellen fan siden yn Epub. Wy brûke epub_konverter. Hjir nimme wy it boek, konvertearje it yn rigels en telle de wurden foar elke rigel.

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)

Litte wy no de tiid berekkenje. Wy nimme ús favorite wurdtelling en diele it troch jo lêssnelheid.

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

Diel 4. Ferbine alle dielen

Wy moatte troch alle mooglike paden gean yn ús boekenmap. Kontrolearje oft der al in boek yn Notion stiet: as der is, hoege wy gjin rigel mear oan te meitsjen.
Dan moatte wy it bestânstype bepale, ôfhinklik fan dit, it oantal wurden telle. Foegje in boek oan 'e ein ta.

Dit is de koade dy't wy krije:

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)

En de funksje om te kontrolearjen oft der in boek is tafoege, sjocht der sa út:

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

konklúzje

Mei tank oan elkenien dy't dit artikel lêze. Ik hoopje dat it jo helpt mear te lêzen :)

Boarne: www.habr.com

Add a comment