Jag har alltid varit nyfiken pÄ hur jag kan bÀttre organisera böckerna i mitt digitala bibliotek. Slutligen kom jag fram till en lösning med automatisk rÀkning av sidantal och andra funktioner. Alla intresserade Àr vÀlkomna att lÀsa vidare.
Del 1. Dropbox
Alla böcker jag har ligger pÄ Dropbox. Det finns fyra kategorier som jag har delat upp allt i: LÀrbok, Handbok, Skönlitteratur, Facklitteratur. Men handböckerna lÀgger jag inte till i tabellen.
Största delen av böckerna Àr .epub, resten Àr .pdf. SÄ den slutgiltiga lösningen mÄste tÀcka bÄda alternativen.
VÀgarna till böckerna ser ungefÀr ut sÄ hÀr:
/ĐĐœĐžĐłĐž/ĐĐ”Ń
ŃĐŽĐŸĐ¶Đ”ŃŃĐČĐ”ĐœĐœĐŸĐ”/ĐĐŸĐČĐŸĐ”/ĐОзаĐčĐœ/ĐźŃĐžĐč ĐĐŸŃĐŽĐŸĐœ/ĐĐœĐžĐłĐ° ĐżŃĐŸ бŃĐșĐČŃ ĐŸŃ Đ ĐŽĐŸ ĐŻ.epub Om boken Ă€r skönlitterĂ€r tas kategorin (dvs 'Design' i det ovanstĂ„ende fallet) bort.
Jag beslöt mig för att inte krÄngla med Dropbox API, lyckligtvis har jag deras app installerad som synkroniserar mappen. SÄ planen Àr att hÀmta böcker frÄn mappen, köra varje bok genom en ordrÀknare och lÀgga till den i Notion.
Del 2. LĂ€gga till en rad
SjÀlva tabellen bör se ungefÀr ut sÄ hÀr. OBS: kolumnnamnen Àr bÀst att göra med latinska bokstÀver.

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

Vi gÄr till Notion, trycker Ctrl + Shift + J, gÄr till Application -> Cookies, kopierar token_v2 och kallar det TOKEN. Sedan gÄr vi till den sida dÀr vÄr biblioteks-tabell finns 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()DÀrefter skriver vi 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] == "Skönlitteratur":
row.author = tags[2]
elif tags[0] == "Facklitteratur":
row.tags = tags[2]
elif tags[0] == "LÀroböcker":
row.tags = tags[2]
if len(tags) >= 4:
row.author = tags[3]
row.hours = hours
row.pages = pages_count
row.words = words_countVad som hÀnder hÀr Àr att vi tar och lÀgger till en ny rad i tabellen som första rad. Sedan splittar vi vÄr vÀg pÄ '/' och fÄr taggar. Taggarna handlar om 'Skönlitteratur', 'Design', vem författaren Àr och sÄ vidare. Sedan fyller vi i alla nödvÀndiga fÀlt i tabellen.
Del 3. BerÀkna ord, timmar och andra fördelar
Det hĂ€r Ă€r en lite svĂ„rare uppgift. Som vi minns har vi tvĂ„ format: ePub och PDF. Medan det Ă€r klart med ePub â dĂ€r finns förmodligen orden, sĂ„ Ă€r det inte sĂ„ entydigt med PDF: den kan bestĂ„ av bara hopklistrade bilder.
SÄ funktionen 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 (det genomsnittliga antalet ord per sida).
SÄ hÀr Àr den:
def get_words_count(pages_number):
return pages_number * WORDS_PER_PAGEDet genomsnittliga WORDS_PER_PAGE för ett A4-blad Àr ungefÀr 300.
Nu lÄt oss skriva en funktion för att rÀkna sidor. Vi kommer att anvÀnda .
def get_pdf_pages_number(path, filename):
pdf = PdfFileReader(open(os.path.join(path, filename), 'rb'))
return pdf.getNumPages()DÀrefter skriver vi en del för att rÀkna sidor i ePub. Vi anvÀnder . HÀr tar vi boken, konverterar den till rader, och rÀknar orden i 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)Nu ska vi rÀkna tiden. Vi tar vÄrt favoritantal ord och delar det med din lÀshastighet.
def get_reading_time(words_count):
return round(((words_count / WORDS_PER_MINUTE) / 60) * 10) / 10Del 4. Kopplar ihop alla delar
Vi behöver gĂ„ igenom alla möjliga vĂ€gar i vĂ„r mapp med böcker. Kontrollera om boken redan finns i Notion: om den finns â behöver vi inte skapa en rad.
Sedan behöver vi bestÀmma filtypen, och beroende pÄ detta rÀkna antalet ord. I slutet lÀgga till boken.
SÄ hÀr ser vÄr kod ut:
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 boken 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 FalseSlutsats
Tack till alla som lĂ€ste den hĂ€r artikeln. Jag hoppas att den hjĂ€lper dig att lĂ€sa mer đ
KĂ€lla: habr.com
