Ngadamel perpustakaan bumi nganggo Notion sareng Python

Kuring geus salawasna geus kabetot dina cara pangalusna pikeun ngadistribusikaeun buku di perpustakaan éléktronik kuring. Tungtungna, kuring sumping ka pilihan ieu sareng itungan otomatis tina jumlah halaman sareng barang-barang sanés. Kuring nanya ka sadaya jalma kabetot dina ucing.

Bagian 1. Dropbox

Sadaya buku abdi aya dina dropbox. Aya 4 kategori anu ku kuring dibagi sadayana: Buku Ajar, Rujukan, Fiksi, Nonfiksi. Tapi kuring henteu nambihan buku rujukan kana méja.

Kalolobaan buku téh .epub, sésana téh .pdf. Hartina, leyuran ahir kudu kumaha bae nutupan duanana pilihan.

Jalur kuring ka buku sapertos kieu:

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

Upami bukuna fiksi, teras kategorina (nyaéta, "Desain" dina kasus di luhur) dipiceun.

Kuring mutuskeun teu repot jeung Dropbox API, saprak kuring boga aplikasi maranéhanana anu nyingkronkeun folder. Maksudna, rencanana nyaéta kieu: urang nyandak buku tina polder, ngajalankeun unggal buku ngaliwatan counter kecap, sareng tambahkeun ka Notion.

Bagian 2. Tambahkeun garis

Méja sorangan kudu kasampak kawas kieu. PERHATIAN: leuwih sae pikeun nyieun ngaran kolom dina basa Latin.

Ngadamel perpustakaan bumi nganggo Notion sareng Python

Kami bakal nganggo API Notion henteu resmi, sabab anu resmi henteu acan dikirimkeun.

Ngadamel perpustakaan bumi nganggo Notion sareng Python

Pindah ka Notion, pencét Ctrl + Shift + J, buka Aplikasi -> Cookies, nyalin token_v2 sareng nyauran éta TOKEN. Teras we angkat ka halaman anu urang peryogikeun kalayan tanda perpustakaan sareng nyalin tautan. Urang sebut wae NOTION.

Teras we nyerat kodeu pikeun nyambung ka Notion.

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

Salajengna, hayu urang nulis fungsi pikeun nambahkeun hiji baris kana tabél.

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

Naon anu lumangsung di dieu. Urang nyandak tur nambahkeun baris anyar kana tabel di baris kahiji. Salajengna, urang ngabagi jalur kami sapanjang "/" sareng kéngingkeun tag. Tag - dina watesan "Seni", "Desain", saha pangarang, jeung saterusna. Teras we nyetél sagala widang perlu piring.

Bagian 3. Cacah kecap, jam jeung nikmat séjén

Ieu tugas leuwih hese. Sakumaha urang émut, urang gaduh dua format: epub sareng pdf. Upami sadayana jelas sareng epub - kecap-kecapna sigana aya, maka sadayana henteu jelas ngeunaan pdf: éta ngan saukur tiasa diwangun ku gambar anu dipasang.

Janten fungsi urang pikeun ngitung kecap dina PDF bakal katingali sapertos kieu: urang nyandak jumlah halaman sareng kalikeun ku konstanta anu tangtu (jumlah rata-rata kecap per halaman).

Ieu anjeunna:

def get_words_count(pages_number):
    return pages_number * WORDS_PER_PAGE

WORDS_PER_PAGE ieu kanggo halaman A4 kirang langkung 300.

Ayeuna hayu urang nyerat fungsi pikeun ngitung halaman. Urang bakal ngagunakeun pyPDF2.

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

Salajengna, urang bakal nulis hiji hal pikeun cacah kaca dina Epub. Urang make epub_converter. Di dieu urang nyandak buku, ngarobah kana garis, sarta cacah kecap pikeun tiap baris.

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)

Ayeuna hayu urang ngitung waktu. Kami nyandak cacah kecap karesep kami sareng ngabagi kana laju bacaan anjeun.

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

Bagian 4. Nyambungkeun sakabéh bagian

Urang kedah ngalangkungan sadaya jalur anu mungkin dina folder buku urang. Pariksa lamun geus aya buku dina Pamanggih: lamun aya, urang teu kedah deui nyieun garis.
Teras we kedah nangtukeun jinis file, gumantung kana ieu, cacah jumlah kecap. Tambahkeun buku dina tungtungna.

Ieu kode anu urang kéngingkeun:

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)

Sareng pungsi pikeun mariksa naha buku parantos ditambah sapertos kieu:

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

kacindekan

Hatur nuhun ka sadayana anu maca tulisan ieu. Abdi ngarepkeun éta ngabantosan anjeun maca deui :)

sumber: www.habr.com

Tambahkeun komentar