Skip to content

Instantly share code, notes, and snippets.

@ToastShaman
Last active January 1, 2023 12:10
Show Gist options
  • Save ToastShaman/f5da397398e6c5845cb19f4456e78845 to your computer and use it in GitHub Desktop.
Save ToastShaman/f5da397398e6c5845cb19f4456e78845 to your computer and use it in GitHub Desktop.
BookBuddy: My Library Manager to Markdown
#!/usr/bin/env python3
# pip3 install pathvalidate
# pip3 install pillow
# brew install libffi libheif
# pip3 install pyheif
import sqlite3
import base64
import io
import pyheif
from pathvalidate import sanitize_filename
from PIL import Image
from dataclasses import dataclass
@dataclass
class Record:
first_name: str
last_name: str
title: str
sub_title: str
isbn: str
publisher: str
publish_year: str
synopsis: str
raw_cover_image: str
def query_books(file_name):
con = sqlite3.connect(file_name)
cur = con.cursor()
query = """
SELECT
Z2.ZFIRSTNAME,
Z2.ZLASTNAME,
B.ZTITLE,
B.ZSUBTITLE,
B.ZISBN,
B.ZPUBLISHER,
B.ZPUBLISHYEAR,
B.ZSYNOPSIS,
Z.ZIMAGE
FROM ZBOOK B
LEFT OUTER JOIN ZIMAGE Z on B.Z_PK = Z.ZBOOK
LEFT OUTER JOIN ZAUTHOR Z2 on B.ZAUTHORINFO = Z2.Z_PK
LEFT OUTER JOIN ZCATEGORY Z3 on B.ZCATEGORY = Z3.Z_PK
WHERE Z3.ZNAME = 'Photography'
ORDER BY Z2.ZLASTNAME;
"""
for r in cur.execute(query):
yield Record(r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], r[8])
con.close()
def heic_to_png(bytes):
heif_file = pyheif.read(bytes)
image = Image.frombytes(
heif_file.mode,
heif_file.size,
heif_file.data,
"raw",
heif_file.mode,
heif_file.stride
)
buff = io.BytesIO()
image.save(buff, format="PNG")
return base64.b64encode(buff.getvalue()).decode('utf-8')
if __name__ == "__main__":
for r in query_books('/Users/ked/Dropbox/Kimico/BookBuddy.backup'):
f_name = sanitize_filename(f'{r.last_name} {r.first_name} - {r.title}.md')
with open(f_name, "w") as f:
f.write('---\n')
f.write(f'author: {r.last_name} {r.first_name}\n')
f.write(f'title: {sanitize_filename(r.title)}\n')
f.write(f'sub_title: {sanitize_filename(r.sub_title)}\n')
f.write(f'isbn: {r.isbn}\n')
f.write(f'publisher: {r.publisher}\n')
f.write(f'publish_year: {r.publish_year}\n')
f.write('---\n')
f.write('\n')
if r.raw_cover_image is not None:
encoded_png = heic_to_png(r.raw_cover_image)
f.write(f'![Cover](data:image/png;base64,{encoded_png})\n\n')
f.write(f'{r.synopsis}\n')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment