Notion ve Python ile ev kütüphanesi oluşturma

Elektronik kütüphanemdeki kitapların en iyi şekilde nasıl dağıtılacağı konusu her zaman ilgimi çekmiştir. Sonunda sayfa sayısının ve diğer güzelliklerin otomatik olarak hesaplanmasıyla bu seçeneğe ulaştım. İlgilenen herkese kedi başlığı altında soruyorum.

Bölüm 1. Dropbox

Tüm kitaplarım dropbox'ta. Her şeyi ayırdığım 4 kategori var: Ders Kitabı, Referans, Kurgu, Kurgu Dışı. Ancak tabloya referans kitapları eklemiyorum.

Kitapların çoğu .epub, geri kalanı .pdf. Yani nihai çözüm bir şekilde her iki seçeneği de kapsamalıdır.

Kitaplara giden yollarım şöyle:

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

Kitabın kurgu olması durumunda kategori (yani yukarıdaki durumda “Tasarım”) kaldırılır.

Klasörü senkronize eden uygulamalarına sahip olduğum için Dropbox API'si ile uğraşmamaya karar verdim. Yani plan şu: Kitapları klasörden alıyoruz, her kitabı bir kelime sayacından geçirip Notion'a ekliyoruz.

Bölüm 2. Satır ekleme

Tablonun kendisi buna benzer bir şeye benzemelidir. DİKKAT: Sütun adlarını Latince yapmak daha iyidir.

Notion ve Python ile ev kütüphanesi oluşturma

Resmi olmayan Notion API'sini kullanacağız çünkü resmi olan henüz teslim edilmedi.

Notion ve Python ile ev kütüphanesi oluşturma

Notion'a gidin, Ctrl + Shift + J tuşlarına basın, Uygulama -> Çerezler'e gidin, token_v2'yi kopyalayın ve buna TOKEN adını verin. Daha sonra kütüphane işaretiyle ihtiyacımız olan sayfaya gidip bağlantıyı kopyalıyoruz. Biz buna NOT diyoruz.

Daha sonra Notion'a bağlanacak kodu yazıyoruz.

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

Daha sonra tabloya satır ekleyecek bir fonksiyon yazalım.

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

Burada neler oluyor. İlk satırdaki tabloya yeni bir satır alıp ekliyoruz. Daha sonra yolumuzu “/” boyunca bölüyoruz ve etiketleri alıyoruz. Etiketler - “Sanat”, “Tasarım”, yazarın kim olduğu vb. açısından. Daha sonra plakanın gerekli tüm alanlarını ayarlıyoruz.

Bölüm 3. Kelimeleri, saatleri ve diğer zevkleri saymak

Bu daha zor bir iştir. Hatırladığımız gibi iki formatımız var: epub ve pdf. Epub'da her şey açıksa - kelimeler muhtemelen oradadır, o zaman pdf hakkında her şey o kadar net değildir: sadece yapıştırılmış görüntülerden oluşabilir.

Yani PDF'deki kelime sayma fonksiyonumuz şu şekilde görünecektir: sayfa sayısını alıyoruz ve belirli bir sabitle (sayfa başına ortalama kelime sayısı) çarpıyoruz.

İşte:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

Bu WORDS_PER_PAGE, bir A4 sayfası için yaklaşık 300'dür.

Şimdi sayfaları sayacak bir fonksiyon yazalım. Kullanacağız pyPDF2.

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

Daha sonra Epub'da sayfa saymaya yönelik bir şeyler yazacağız. Kullanırız epub_converter. Burada kitabı alıp satırlara dönüştürüyoruz ve her satırın kelimelerini sayıyoruz.

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)

Şimdi zamanı hesaplayalım. Favori kelime sayımızı alıp okuma hızınıza bölüyoruz.

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

Bölüm 4. Tüm parçaların bağlanması

Kitaplar klasörümüzdeki tüm olası yollardan geçmemiz gerekiyor. Notion'da zaten bir kitap olup olmadığını kontrol edin: varsa artık bir satır oluşturmamıza gerek yok.
Daha sonra dosya türünü belirlememiz, buna bağlı olarak kelime sayısını saymamız gerekiyor. Sonuna bir kitap ekleyin.

Aldığımız kod bu:

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)

Ve bir kitabın eklenip eklenmediğini kontrol etme işlevi şuna benzer:

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

Sonuç

Bu makaleyi okuyan herkese teşekkürler. Umarım daha fazlasını okumanıza yardımcı olur :)

Kaynak: habr.com

Yorum ekle