Elektron kitabxanamdakı kitabları ən yaxşı şəkildə necə yaymaq mənə həmişə maraqlı olub. Sonda səhifələrin sayının və digər gözəlliklərin avtomatik hesablanması ilə bu seçimə gəldim. Bütün maraqlanan şəxslərdən pişik altında xahiş edirəm.
Hissə 1. Dropbox
Bütün kitablarım dropbox-dadır. Hər şeyi böldüyüm 4 kateqoriya var: Dərslik, İstinad, Bədii ədəbiyyat, Qeyri-bədii ədəbiyyat. Ancaq mən cədvələ istinad kitabları əlavə etmirəm.
Kitabların əksəriyyəti .epub, qalanları .pdf formatındadır. Yəni, son həll birtəhər hər iki variantı əhatə etməlidir.
Kitablara gedən yollarım belədir:
/Книги/Нехудожественное/Новое/Дизайн/Юрий Гордон/Книга про буквы от А до Я.epub
Kitab bədiidirsə, kateqoriya (yəni yuxarıdakı halda "Dizayn") çıxarılır.
Dropbox API ilə narahat olmamaq qərarına gəldim, çünki qovluğu sinxronlaşdıran tətbiqlərim var. Yəni plan belədir: qovluqdan kitabları götürürük, hər kitabı söz sayğacından keçirib onu Notion-a əlavə edirik.
Hissə 2. Xətt əlavə edin
Cədvəlin özü belə görünməlidir. DİQQƏT: sütun adlarını latın dilində etmək daha yaxşıdır.
Biz qeyri-rəsmi Notion API-dən istifadə edəcəyik, çünki rəsmi API hələ çatdırılmayıb.
Anlayışa gedin, Ctrl + Shift + J düyməsini basın, Proqram -> Kukilərə keçin, token_v2-ni kopyalayın və onu TOKEN adlandırın. Daha sonra kitabxana işarəsi ilə bizə lazım olan səhifəyə keçib linki kopyalayırıq. Biz buna NOTION deyirik.
Sonra Notion-a qoşulmaq üçün kodu yazırıq.
database = client.get_collection_view(NOTION)
current_rows = database.default_query().execute()
Sonra cədvələ sətir əlavə etmək funksiyasını yazaq.
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
Burda nə baş verir. Birinci sıradakı cədvələ yeni sətir götürüb əlavə edirik. Sonra, yolumuzu "/" boyunca ayırırıq və etiketlər alırıq. Teqlər - “İncəsənət”, “Dizayn”, müəllifin kim olduğu və s. Sonra plitənin bütün lazımi sahələrini təyin edirik.
Hissə 3. Sözlərin, saatların və digər ləzzətlərin hesablanması
Bu daha çətin bir işdir. Xatırladığımız kimi, iki formatımız var: epub və pdf. Epub ilə hər şey aydındırsa - sözlər yəqin ki, oradadır, onda pdf haqqında hər şey o qədər də aydın deyil: sadəcə yapışdırılmış şəkillərdən ibarət ola bilər.
Beləliklə, PDF-də sözləri saymaq üçün funksiyamız belə görünəcək: biz səhifələrin sayını götürürük və müəyyən bir sabitə vururuq (bir səhifədəki sözlərin orta sayı).
Budur o:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGE
A4 səhifəsi üçün bu WORDS_PER_PAGE təxminən 300-dür.
İndi səhifələri saymaq üçün funksiya yazaq. istifadə edəcəyik
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()
Sonra, Epub-da səhifələrin sayılması üçün bir şey yazacağıq. istifadə edirik
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)
İndi vaxtı hesablayaq. Ən sevdiyimiz sözlərin sayını götürürük və oxuma sürətinizə bölürük.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10
Hissə 4. Bütün hissələrin birləşdirilməsi
Kitab qovluğumuzda bütün mümkün yollardan keçməliyik. Notion-da artıq kitab olub-olmadığını yoxlayın: əgər varsa, artıq xətt yaratmağa ehtiyac yoxdur.
Sonra fayl tipini təyin etməliyik, bundan asılı olaraq sözlərin sayını hesablamalıyıq. Sonda kitab əlavə edin.
Aldığımız kod budur:
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)
Kitabın əlavə edilib-edilmədiyini yoxlamaq funksiyası belə görünü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
Nəticə
Bu yazını oxuyan hər kəsə təşəkkür edirəm. Ümid edirəm daha çox oxumağınıza kömək edir :)
Mənbə: www.habr.com