Maacht eng Heembibliothéik mat Notion a Python

Ech war ëmmer interesséiert wéi ech Bicher a menger elektronescher Bibliothéik am beschten verdeelen. Um Enn sinn ech op dës Optioun komm mat automatescher Berechnung vun der Zuel vun de Säiten an aner Goodies. Ech froen all interesséiert Persounen ënner Kaz.

Deel 1. Dropbox

All meng Bicher sinn op Dropbox. Et gi 4 Kategorien an deenen ech alles opgedeelt hunn: Textbuch, Referenz, Fiction, Non-Fiction. Awer ech addéieren keng Referenzbicher op den Dësch.

Déi meescht vun de Bicher sinn .epub, de Rescht sinn .pdf. Dat ass, déi lescht Léisung muss iergendwéi béid Optiounen ofdecken.

Meng Weeër zu Bicher sinn eppes wéi dat:

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

Wann d'Buch Fiktioun ass, da gëtt d'Kategorie (dat ass "Design" am Fall hei uewen) ewechgeholl.

Ech hu beschloss net mat der Dropbox API ze stéieren, well ech hir Applikatioun hunn déi den Dossier synchroniséiert. Dat ass, de Plang ass dëst: mir huelen Bicher aus dem Dossier, lafen all Buch duerch e Wuertzähler, a fügen se un d'Notion.

Deel 2. Dobäizemaachen eng Linn

Den Dësch selwer soll esou ausgesinn. OPGEPASST: et ass besser Spaltennimm op Latäin ze maachen.

Maacht eng Heembibliothéik mat Notion a Python

Mir wäerten déi inoffiziell Notion API benotzen, well déi offiziell nach net geliwwert gouf.

Maacht eng Heembibliothéik mat Notion a Python

Gitt op Notion, dréckt Ctrl + Shift + J, gitt op Applikatioun -> Cookien, kopéiert token_v2 a nennt et TOKEN. Da gi mir op d'Säit déi mir brauchen mam Bibliothéiksschëld a kopéieren de Link. Mir nennen et NOTION.

Da schreiwen mir de Code fir mat Notion ze verbannen.

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

Als nächst schreiwen mer eng Funktioun fir eng Zeil un den Dësch ze addéieren.

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 leeft hei. Mir huelen a fügen eng nei Zeil op den Dësch an der éischter Zeil. Als nächst verdeele mir eise Wee laanscht "/" a kréien Tags. Tags - wat "Art", "Design", wien den Auteur ass, asw. Da setzen mir all déi néideg Felder vun der Plack.

Deel 3. Wierder, Stonnen an aner Freed zielen

Dëst ass eng méi schwéier Aufgab. Wéi mir eis erënneren, hu mir zwee Formater: epub an pdf. Wann alles kloer ass mam epub - d'Wierder si wuel sécher do, dann ass mam pdf alles net sou kloer: et kann einfach aus gekollt Biller bestoen.

Also eis Funktioun fir Wierder am PDF ze zielen wäert esou ausgesinn: mir huelen d'Zuel vun de Säiten a multiplizéieren mat enger gewësser Konstant (déi duerchschnëttlech Zuel vu Wierder pro Säit).

Hei ass et:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Dës WORDS_PER_PAGE fir eng A4 Säit ass ongeféier 300.

Loosst eis elo eng Funktioun schreiwen fir Säiten ze zielen. Mir wäerten benotzen pyPDF2.

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

Als nächst wäerte mir eng Saach schreiwen fir Säiten am Epub ze zielen. Mir benotzen epub_konverter. Hei huelen mir d'Buch, konvertéieren et an Zeilen, a zielen d'Wierder fir all Zeil.

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)

Loosst eis elo d'Zäit berechnen. Mir huelen eis Liiblingswortzuel an deelen se duerch Är Liesgeschwindegkeet.

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

Deel 4. Verbindung all Deeler

Mir mussen duerch all méiglech Weeër an eisem Bicher Dossier goen. Kuckt ob d'Buch schonn an der Notioun existéiert: wann jo, brauche mir keng Zeil méi ze kreéieren.
Da musse mir d'Dateityp bestëmmen, ofhängeg vun dësem, d'Zuel vu Wierder zielen. Füügt e Buch um Enn dobäi.

Dëst ass de Code dee mir kréien:

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)

An d'Funktioun fir ze kontrolléieren ob e Buch bäigefüügt gouf gesäit esou aus:

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

Konklusioun

Merci un jiddereen deen dësen Artikel gelies huet. Ech hoffen et hëlleft Iech méi ze liesen :)

Source: will.com

Setzt e Commentaire