|
|
- import requests
- from flask import Flask, Response, render_template, request
- from base64 import b64encode
- import feedparser
- import re
-
- from dotenv import load_dotenv, find_dotenv
-
- load_dotenv(find_dotenv())
-
-
- PROGRESS_REGEX = r".*<img .* alt=\"([^\"]*) by ([^\"]*)\".*src=\"([^\"]*)\".*.* is on page ([0-9]*) of ([0-9]*) of <a.*"
- READ_REGEX = (
- r".*<img .* alt=\"([^\"]*) by ([^\"]*)\".*src=\"([^\"]*)\".*finished reading.*"
- )
-
-
- def loadImageB64(url):
- resposne = requests.get(url)
- return b64encode(resposne.content).decode("ascii")
-
-
- def makeSVG(books):
- return render_template("goodreads.html.j2", books=books)
-
-
- class Book:
- def __init__(self, title, author, img_url):
- self.title = title
- self.author = author
- self.img = ""
- if img_url != "":
- self.img = loadImageB64(img_url)
-
- def __eq__(self, other):
- return self.title == other.title and self.author == other.author
-
-
- app = Flask(__name__)
-
-
- @app.route("/", defaults={"path": ""})
- @app.route("/<path:path>")
- def last_activity(path):
- goodread_rss_url = (
- f'https://www.goodreads.com/user/updates_rss/{request.args.get("id")}'
- )
- print(goodread_rss_url)
- activityFeed = feedparser.parse(goodread_rss_url)
- entries = activityFeed.entries
- pr = re.compile(PROGRESS_REGEX)
- rr = re.compile(READ_REGEX)
- books = []
-
- for i in entries:
- i["summary"] = (
- i["summary"]
- .replace("<", "<")
- .replace(">", ">")
- .replace(""", '"')
- .replace("\n", "")
- )
- res = pr.search(i["summary"])
-
- if res:
- title, author, img = res.group(1, 2, 3)
- book = Book(title, author, img)
- if book not in books:
- books.append(book)
- # progress = int(100 * int(res.group(4)) / int(res.group(5)))
- else:
- res = rr.search(i["summary"])
- if res:
- title, author, img = res.group(1, 2, 3)
- book = Book(title, author, img)
- if book not in books:
- books.append(book)
- # progress = 100
- else:
- continue
-
- if len(books) >= request.args.get("maxbooks", 3):
- break
- svg = makeSVG(books)
- resp = Response(svg, mimetype="image/svg+xml")
- resp.headers["Cache-Control"] = "s-maxage=1"
- return resp
-
-
- if __name__ == "__main__":
- app.run(debug=True)
|