aboutsummaryrefslogtreecommitdiffstats
path: root/app/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'app/server.py')
-rw-r--r--app/server.py38
1 files changed, 36 insertions, 2 deletions
diff --git a/app/server.py b/app/server.py
index 8e90dea..0d1becc 100644
--- a/app/server.py
+++ b/app/server.py
@@ -1,7 +1,7 @@
+import os
from typing import Any, cast
import bottle
from tinydb import Query
-
from app.DatabaseManager import database_manager
@@ -17,6 +17,10 @@ def feed_to_tr(feed: dict[str, str]) -> str:
return f'<tr>{feed_id_to_td(feed["feed_id"])}{feed_last_build_date_to_td(feed.get("feed_last_build_date", ""))}</tr>'
+def opml_to_tr() -> str:
+ return '<tr><td colspan="2"><a href="/opml">All feeds (OPML)</a></td></tr>'
+
+
def feeds_to_table(feeds: list[dict[str, str]]) -> str:
if len(feeds) == 0:
return (
@@ -24,7 +28,7 @@ def feeds_to_table(feeds: list[dict[str, str]]) -> str:
+ "If you did that already, you might have to wait a bit for the data to propagate."
)
- trs: list[str] = [feed_to_tr(feed) for feed in feeds]
+ trs: list[str] = [feed_to_tr(feed) for feed in feeds] + [opml_to_tr()]
thead = f"<thead><tr><td>Feed</td><td>Last build date</td></tr></thead>"
tbody = f'<tbody>{"".join(trs)}</tbody>'
return "<table>" + thead + tbody + "</table>"
@@ -114,6 +118,36 @@ def feed(feed_id: str):
feed_xml: str = feed["feed_xml"]
return feed_xml
+@bottle.route("/opml")
+def opml():
+ if database_manager.db is None:
+ raise Exception("Database is not initialized")
+
+ base_url = os.environ.get("AGGRO_BASE_URL", "http://localhost:8080")
+
+ _feeds = database_manager.feeds.all()
+ feeds = cast(list[dict[str, str]], _feeds)
+
+ bottle.response.set_header("content-type", "text/xml")
+
+ outlines = "\n".join(
+ f'<outline text="{feed["feed_id"]}" title="{feed["feed_id"]}" type="rss" xmlUrl="{base_url}/{feed["feed_id"]}" />'
+ for feed in feeds
+ )
+
+ opml = f"""<?xml version="1.0" encoding="UTF-8"?>
+<opml version="2.0">
+ <head>
+ <title>Aggro Subscriptions</title>
+ </head>
+ <body>
+{outlines}
+ </body>
+</opml>
+"""
+ return opml
+
+
def run_web_server(host: str, port: int):
bottle.run(host=host, port=port)