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.
Resmi olmayan Notion API'sini kullanacağız çünkü resmi olan henüz teslim edilmedi.
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
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
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