Skapa ett hembibliotek med Notion och Python

Jag har alltid varit intresserad av hur man bäst distribuerar böcker i mitt elektroniska bibliotek. I slutändan kom jag till det här alternativet med automatisk beräkning av antalet sidor och andra godsaker. Jag frågar alla intresserade personer under katt.

Del 1. Dropbox

Alla mina böcker finns på dropbox. Det finns 4 kategorier som jag delade upp allt i: Lärobok, Referens, Skönlitteratur, Facklitteratur. Men jag lägger inte till referensböcker till bordet.

De flesta av böckerna är .epub, resten är .pdf. Det vill säga, den slutliga lösningen måste på något sätt täcka båda alternativen.

Mina vägar till böcker är ungefär så här:

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

Om boken är fiktion tas kategorin (det vill säga "Design" i fallet ovan) bort.

Jag bestämde mig för att inte bry mig om Dropbox API, eftersom jag har deras applikation som synkroniserar mappen. Det vill säga, planen är denna: vi tar böcker från mappen, kör varje bok genom en ordräknare och lägger till den i Notion.

Del 2. Lägg till en rad

Själva bordet ska se ut ungefär så här. OBSERVERA: det är bättre att göra kolumnnamn på latin.

Skapa ett hembibliotek med Notion och Python

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

Skapa ett hembibliotek med Notion och Python

Gå till Notion, tryck på Ctrl + Shift + J, gå till Application -> Cookies, kopiera token_v2 och kalla det TOKEN. Sedan går vi till sidan vi behöver med biblioteksskylten 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()

Låt oss sedan skriva 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] == "Художественное":
            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

Vad händer här. Vi tar och lägger till en ny rad i tabellen i första raden. Därefter delar vi vår väg längs "/" och får taggar. Taggar - i termer av "Konst", "Design", vem som är författare och så vidare. Sedan ställer vi in ​​alla nödvändiga fält på plattan.

Del 3. Räkna ord, timmar och andra nöjen

Detta är en svårare uppgift. Som vi minns har vi två format: epub och pdf. Om allt är klart med epub - orden finns förmodligen där, så är allt inte så tydligt om pdf:en: den kan helt enkelt bestå av limmade bilder.

Så vår funktion 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 (genomsnittligt antal ord per sida).

Här är hon:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Denna WORDS_PER_PAGE för en A4-sida är cirka 300.

Låt oss nu skriva en funktion för att räkna sidor. Vi kommer använda pyPDF2.

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

Därefter kommer vi att skriva en sak för att räkna sidor i Epub. Vi använder epub_converter. Här tar vi boken, omvandlar den till rader och räknar orden för 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)

Låt oss nu beräkna tiden. Vi tar vår favoritordräkning och dividerar den med din läshastighet.

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

Del 4. Anslutning av alla delar

Vi måste gå igenom alla möjliga vägar i vår bokmapp. Kontrollera om det redan finns en bok i Notion: om det finns behöver vi inte längre skapa en rad.
Sedan måste vi bestämma filtypen, beroende på detta, räkna antalet ord. Lägg till en bok i slutet.

Detta är 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)

Och funktionen för att kontrollera om en bok 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äser denna artikel. Jag hoppas att det hjälper dig att läsa mer :)

Källa: will.com

Lägg en kommentar