From 7502377840c2973709b37f1aa2ba17055ee90ec3 Mon Sep 17 00:00:00 2001 From: pvtejas Date: Fri, 30 Oct 2026 17:54:13 +0530 Subject: [PATCH 1/7] Add RSS feed generation --- flaskr/generate_rss.py | 69 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 flaskr/generate_rss.py diff --git a/flaskr/generate_rss.py b/flaskr/generate_rss.py new file mode 100644 index 0000000..16306cc --- /dev/null +++ b/flaskr/generate_rss.py @@ -0,0 +1,69 @@ +from datetime import datetime +import sqlite3 + +from bs4 import BeautifulSoup +from markdown import markdown + +def soup_append_multiple_tags(soup: BeautifulSoup, children: dict) -> None: + for name, string in children.items(): + soup.append(soup.new_tag(name)) + soup.find_all(name)[-1].string = string + +def post_find_first_plain_line(post: str) -> str: + while post: + if post[0].isalnum(): + break + end = post.find("\n") + post = post[end+1:] + end = post.find("\n") + return post[:end] + +def generate_feed(db): + soup = BeautifulSoup(features="xml") + + soup.append(soup.new_tag("rss", version="2.0")) + rss = soup.rss + rss["xmlns:atom"] = "http://www.w3.org/2005/Atom" + rss["xmlns:content"] = "http://purl.org/rss/1.0/modules/content/" + + rss.append(soup.new_tag("channel")) + channel = rss.channel + + channel_children = { + "description": "Blog posts from allsparkinfinite's blog", + "link": "https://blog.allsparkinfinite.name", + "title": "blogsparkinfinite", + "docs": "https://rssboard.org/rss-specification", + "language": "en-IN", + "lastBuildDate": datetime.now().strftime("%a, %d %b %Y %T +0530"), + "ttl": "240", + } + soup_append_multiple_tags(channel, channel_children) + + channel.append(channel.new_tag("atom:link")) + channel.find_all("atom:link")[-1]["href"] = "https://blog.allsparkinfinite.name/rss/" + channel.find_all("atom:link")[-1]["rel"] = "self" + channel.find_all("atom:link")[-1]["type"] = "application/rss+xml" + + channel.append(channel.new_tag("atom:link")) + channel.find_all("atom:link")[-1]["href"] = "https://blog.allsparkinfinite.name/" + channel.find_all("atom:link")[-1]["rel"] = "alternate" + channel.find_all("atom:link")[-1]["type"] = "text/html" + + db.execute("SELECT * FROM post").fetchall() + posts.reverse() + + for post in posts: + channel.append(soup.new_tag("item")) + item = channel.find_all("item")[-1] + item_children = { + "description": post_find_first_plain_line(post[4]), + "guid": f"https://blog.allsparkinfinite.name/{post[0]}/", + "pubDate": datetime.strptime(post[2], "%Y-%m-%d %T").strftime("%a, %d %b %Y %T GMT"), + "title": post[3], + "content:encoded": markdown(post[4]), + } + soup_append_multiple_tags(item, item_children) + + with open("flaskr/static/rss.xml", "w") as f: + f.write(soup.prettify()) From 19412540d56b236bae5c241b95efca8e76deafb9 Mon Sep 17 00:00:00 2001 From: pvtejas Date: Fri, 30 Oct 2026 17:55:57 +0530 Subject: [PATCH 2/7] Update flaskr/blog.py --- flaskr/blog.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/flaskr/blog.py b/flaskr/blog.py index 8082d2f..1cbb71c 100644 --- a/flaskr/blog.py +++ b/flaskr/blog.py @@ -5,6 +5,7 @@ from werkzeug.exceptions import abort from flaskr.auth import login_required from flaskr.db import get_db +from flaskr.generate_rss import generate_feed import markdown import datetime @@ -66,6 +67,7 @@ def create(): (title, body, g.user['id']) ) db.commit() + generate_feed(db) return redirect(url_for('blog.index')) return render_template('blog/create.html') From 8347c578ffeb8b3e5b95dad5883c9dd6dce16975 Mon Sep 17 00:00:00 2001 From: pvtejas Date: Fri, 30 Oct 2026 17:56:44 +0530 Subject: [PATCH 3/7] Update RSS feed on post creation/update --- flaskr/blog.py | 1 + 1 file changed, 1 insertion(+) diff --git a/flaskr/blog.py b/flaskr/blog.py index 1cbb71c..b5387b8 100644 --- a/flaskr/blog.py +++ b/flaskr/blog.py @@ -121,6 +121,7 @@ def update(id): (title, body, created, id) ) db.commit() + generate_feed(db) return redirect(url_for('blog.index')) return render_template('blog/update.html', post=post) From 0843d180e0568a5bc6e1a742ea843c6e8e9c3457 Mon Sep 17 00:00:00 2001 From: pvtejas Date: Fri, 30 Oct 2026 18:06:36 +0530 Subject: [PATCH 4/7] Fix missing variable name --- flaskr/generate_rss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flaskr/generate_rss.py b/flaskr/generate_rss.py index 16306cc..0338021 100644 --- a/flaskr/generate_rss.py +++ b/flaskr/generate_rss.py @@ -50,7 +50,7 @@ def generate_feed(db): channel.find_all("atom:link")[-1]["rel"] = "alternate" channel.find_all("atom:link")[-1]["type"] = "text/html" - db.execute("SELECT * FROM post").fetchall() + posts = db.execute("SELECT * FROM post").fetchall() posts.reverse() for post in posts: From abc6d04a0a3521f0f7a6c90b333776042d8a858c Mon Sep 17 00:00:00 2001 From: pvtejas Date: Fri, 30 Oct 2026 18:08:08 +0530 Subject: [PATCH 5/7] Use datetime object as datetime object instead of string --- flaskr/generate_rss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flaskr/generate_rss.py b/flaskr/generate_rss.py index 0338021..b06327b 100644 --- a/flaskr/generate_rss.py +++ b/flaskr/generate_rss.py @@ -59,7 +59,7 @@ def generate_feed(db): item_children = { "description": post_find_first_plain_line(post[4]), "guid": f"https://blog.allsparkinfinite.name/{post[0]}/", - "pubDate": datetime.strptime(post[2], "%Y-%m-%d %T").strftime("%a, %d %b %Y %T GMT"), + "pubDate": post[2].strftime("%a, %d %b %Y %T GMT"), "title": post[3], "content:encoded": markdown(post[4]), } From 81d60c9df264c842cee60e3632ee0b1030cf4acf Mon Sep 17 00:00:00 2001 From: pvtejas Date: Fri, 30 Oct 2026 18:20:20 +0530 Subject: [PATCH 6/7] RSS from template --- flaskr/blog.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/flaskr/blog.py b/flaskr/blog.py index b5387b8..4c77f7d 100644 --- a/flaskr/blog.py +++ b/flaskr/blog.py @@ -134,3 +134,7 @@ def delete(id): db.execute('DELETE FROM post WHERE id = ?',(id,)) db.commit() return redirect(url_for('blog.index')) + +@bp.route('/rss/', methods=('GET',)) +def redirect_rss(): + return render_template('rss.xml') From 4e467c6cae17525f90657ea60fd976c5ace976ec Mon Sep 17 00:00:00 2001 From: pvtejas Date: Fri, 30 Oct 2026 18:24:21 +0530 Subject: [PATCH 7/7] Change RSS feed to redirect --- flaskr/blog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flaskr/blog.py b/flaskr/blog.py index 4c77f7d..61b0715 100644 --- a/flaskr/blog.py +++ b/flaskr/blog.py @@ -137,4 +137,4 @@ def delete(id): @bp.route('/rss/', methods=('GET',)) def redirect_rss(): - return render_template('rss.xml') + return redirect(url_for('static', filename='rss.xml'))