diff --git a/cry/cli.py b/cry/cli.py index beaed84..6bb988b 100644 --- a/cry/cli.py +++ b/cry/cli.py @@ -1,8 +1,5 @@ # https://simonwillison.net/2023/Sep/30/cli-tools-python/ import asyncio -import html -import http.server -import io import logging import click @@ -11,6 +8,7 @@ from . import feed from . import feedfinder from . import database from . import opml +from . import web LOG = logging.getLogger(__name__) @@ -249,59 +247,4 @@ def unsubscribe(url): @cli.command("serve") def serve(): - class Handler(http.server.BaseHTTPRequestHandler): - def do_GET(self): - db = database.Database.local() - feeds = db.load_all(feed_limit=10) - del db - - feeds.sort(key=feed.sort_key, reverse=True) - - buffer = io.StringIO() - buffer.write( - """ - - - - Subscribed Feeds - - -

Feeds

- """ - ) - for f in feeds: - feed_title = html.escape(f.title) - if len(f.entries) > 0: - ago = f" ({f.entries[0].time_ago()})" - else: - ago = "" - buffer.write(f"
") - buffer.write(f'

{feed_title}{ago}

') - if len(f.entries) > 0: - buffer.write(f"") - else: - buffer.write("No entries...") - buffer.write(f"
") # feed - buffer.flush() - text = buffer.getvalue() - response = text.encode("utf-8") - - self.send_response(200) - self.send_header("content-type", "text/html") - self.send_header("content-length", str(len(response))) - self.end_headers() - self.wfile.write(response) - - with http.server.HTTPServer(("", 8000), Handler) as server: - click.echo("Serving at http://127.0.0.1:8000/") - server.serve_forever() + web.serve() diff --git a/cry/web.py b/cry/web.py new file mode 100644 index 0000000..c6e5801 --- /dev/null +++ b/cry/web.py @@ -0,0 +1,72 @@ +import html +import http.server +import io + +from . import database +from . import feed + + +class Handler(http.server.BaseHTTPRequestHandler): + def do_GET(self): + if self.path == "/": + return self.serve_feeds() + else: + self.send_response_only(404) + + def serve_feeds(self): + db = database.Database.local() + feeds = db.load_all(feed_limit=10) + del db + + feeds.sort(key=feed.sort_key, reverse=True) + + buffer = io.StringIO() + buffer.write( + """ + + + + Subscribed Feeds + + +

Feeds

+ """ + ) + for f in feeds: + feed_title = html.escape(f.title) + if len(f.entries) > 0: + ago = f" ({f.entries[0].time_ago()})" + else: + ago = "" + buffer.write(f"
") + buffer.write(f'

{feed_title}{ago}

') + if len(f.entries) > 0: + buffer.write(f"") + else: + buffer.write("No entries...") + buffer.write(f"
") # feed + buffer.flush() + text = buffer.getvalue() + response = text.encode("utf-8") + + self.send_response(200) + self.send_header("content-type", "text/html") + self.send_header("content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + + +def serve(): + with http.server.HTTPServer(("", 8000), Handler) as server: + print("Serving at http://127.0.0.1:8000/") + server.serve_forever()