I regularly backup my book reviews from Goodreads to my local storage (and this blog). The import/export functionality can be accessed at https://www.goodreads.com/review/import/.
The exported format is typically csv which is convinient for most automations to process. I would've preferred json but it makes sense for Goodreads to provide limited support for exporting in favour of encouraging imports and resulting engagement with their product i.e. Goodreads.
I authored a simple python script to format the csv to the md markdown layout that can be directly used in this jekyll based blog.
- First a small utility to read a csv and return a json with headers as keys:
import csv
def csvToJson(file_path):
data = []
with open(file_path, mode='r') as file:
csv_reader = csv.reader(file)
header = next(csv_reader)
for review in csv_reader:
review_data = {}
for i, column in enumerate(header):
review_data[column] = review[i]
data.append(review_data)
return data
- A utility to iterate over all of your reviews
def formatReview(csv_filepath):
out_str = ""
jsonReviews = csvToJson(csv_filepath)
for jsonReview in jsonReviews:
if jsonReview["Date Read"] != "":
out_str += getMarkdownReview(jsonReview)
return out_str
- Compose a markdown format to write the json values int:
def getMarkdownReview(jsonReview):
# print(jsonReview)
return f"""
## {jsonReview["Title"]} - {jsonReview["Author"]}
#### read on {jsonReview["Date Read"]} | rating {jsonReview["My Rating"]} (avg. {jsonReview["Average Rating"]})
""" + ("\n" + jsonReview["My Review"] + "\n") if jsonReview["My Review"] != "" else ""
- Finally just execute it on the exported csv file:
import sys
str = format_review("/path/to/exported_reviews.csv")
f = open(f"/path/to/reviews.md", "w")
f.write(str)
f.close()
Of course I had copilot orchestrate the above for me using a few prompts. Anyway, the book reviews page is the end result of the above execution.