Skapa ett hemmabibliotek med Notion och Python

Jag har alltid varit nyfiken pÄ hur jag kan bÀttre organisera böckerna i mitt digitala bibliotek. Slutligen kom jag fram till en lösning med automatisk rÀkning av sidantal och andra funktioner. Alla intresserade Àr vÀlkomna att lÀsa vidare.

Del 1. Dropbox

Alla böcker jag har ligger pÄ Dropbox. Det finns fyra kategorier som jag har delat upp allt i: LÀrbok, Handbok, Skönlitteratur, Facklitteratur. Men handböckerna lÀgger jag inte till i tabellen.

Största delen av böckerna Àr .epub, resten Àr .pdf. SÄ den slutgiltiga lösningen mÄste tÀcka bÄda alternativen.

VÀgarna till böckerna ser ungefÀr ut sÄ hÀr:

/ĐšĐœĐžĐłĐž/ĐĐ”Ń…ŃƒĐŽĐŸĐ¶Đ”ŃŃ‚ĐČĐ”ĐœĐœĐŸĐ”/ĐĐŸĐČĐŸĐ”/ДОзаĐčĐœ/мроĐč Đ“ĐŸŃ€ĐŽĐŸĐœ/ĐšĐœĐžĐłĐ° ĐżŃ€ĐŸ буĐșĐČы ĐŸŃ‚ А ĐŽĐŸ ĐŻ.epub 

Om boken Àr skönlitterÀr tas kategorin (dvs 'Design' i det ovanstÄende fallet) bort.

Jag beslöt mig för att inte krÄngla med Dropbox API, lyckligtvis har jag deras app installerad som synkroniserar mappen. SÄ planen Àr att hÀmta böcker frÄn mappen, köra varje bok genom en ordrÀknare och lÀgga till den i Notion.

Del 2. LĂ€gga till en rad

SjÀlva tabellen bör se ungefÀr ut sÄ hÀr. OBS: kolumnnamnen Àr bÀst att göra med latinska bokstÀver.

Skapa ett hemmabibliotek med Notion och Python

Vi kommer att anvÀnda det inofficiella Notion API, eftersom det officiella Ànnu inte har kommit.

Skapa ett hemmabibliotek med Notion och Python

Vi gÄr till Notion, trycker Ctrl + Shift + J, gÄr till Application -> Cookies, kopierar token_v2 och kallar det TOKEN. Sedan gÄr vi till den sida dÀr vÄr biblioteks-tabell finns och kopierar lÀnken. Vi kallar det NOTION.

Sedan skriver vi koden för att ansluta till Notion.

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

DÀrefter skriver vi en funktion för att lÀgga till 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] == "Skönlitteratur":
            row.author = tags[2]

        elif tags[0] == "Facklitteratur":
            row.tags = tags[2]

        elif tags[0] == "LÀroböcker":
            row.tags = tags[2]

    if len(tags) >= 4:
        row.author = tags[3]

    row.hours = hours
    row.pages = pages_count
    row.words = words_count

Vad som hÀnder hÀr Àr att vi tar och lÀgger till en ny rad i tabellen som första rad. Sedan splittar vi vÄr vÀg pÄ '/' och fÄr taggar. Taggarna handlar om 'Skönlitteratur', 'Design', vem författaren Àr och sÄ vidare. Sedan fyller vi i alla nödvÀndiga fÀlt i tabellen.

Del 3. BerÀkna ord, timmar och andra fördelar

Det hĂ€r Ă€r en lite svĂ„rare uppgift. Som vi minns har vi tvĂ„ format: ePub och PDF. Medan det Ă€r klart med ePub — dĂ€r finns förmodligen orden, sĂ„ Ă€r det inte sĂ„ entydigt med PDF: den kan bestĂ„ av bara hopklistrade bilder.

SÄ funktionen för att rÀkna ord i PDF kommer att se ut sÄ hÀr: vi tar antalet sidor och multiplicerar med en viss konstant (det genomsnittliga antalet ord per sida).

SÄ hÀr Àr den:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Det genomsnittliga WORDS_PER_PAGE för ett A4-blad Àr ungefÀr 300.

Nu lÄt oss skriva en funktion för att rÀkna sidor. Vi kommer att anvÀnda PyPDF2.

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

DÀrefter skriver vi en del för att rÀkna sidor i ePub. Vi anvÀnder epub_converter. HÀr tar vi boken, konverterar den till rader, och rÀknar orden i varje rad.

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)

Nu ska vi rÀkna tiden. Vi tar vÄrt favoritantal ord och delar det med din lÀshastighet.

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

Del 4. Kopplar ihop alla delar

Vi behöver gĂ„ igenom alla möjliga vĂ€gar i vĂ„r mapp med böcker. Kontrollera om boken redan finns i Notion: om den finns — behöver vi inte skapa en rad.
Sedan behöver vi bestÀmma filtypen, och beroende pÄ detta rÀkna antalet ord. I slutet lÀgga till boken.

SÄ hÀr ser vÄr kod ut:

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)

Och funktionen för att kontrollera om boken har lagts till ser ut sÄ hÀr:

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

Slutsats

Tack till alla som lĂ€ste den hĂ€r artikeln. Jag hoppas att den hjĂ€lper dig att lĂ€sa mer 🙂

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster