Move web stuff out of line
This commit is contained in:
parent
463abcb923
commit
1152ec3e36
2 changed files with 74 additions and 59 deletions
61
cry/cli.py
61
cry/cli.py
|
|
@ -1,8 +1,5 @@
|
||||||
# https://simonwillison.net/2023/Sep/30/cli-tools-python/
|
# https://simonwillison.net/2023/Sep/30/cli-tools-python/
|
||||||
import asyncio
|
import asyncio
|
||||||
import html
|
|
||||||
import http.server
|
|
||||||
import io
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import click
|
import click
|
||||||
|
|
@ -11,6 +8,7 @@ from . import feed
|
||||||
from . import feedfinder
|
from . import feedfinder
|
||||||
from . import database
|
from . import database
|
||||||
from . import opml
|
from . import opml
|
||||||
|
from . import web
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
@ -249,59 +247,4 @@ def unsubscribe(url):
|
||||||
|
|
||||||
@cli.command("serve")
|
@cli.command("serve")
|
||||||
def serve():
|
def serve():
|
||||||
class Handler(http.server.BaseHTTPRequestHandler):
|
web.serve()
|
||||||
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(
|
|
||||||
"""
|
|
||||||
<!doctype html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf8">
|
|
||||||
<title>Subscribed Feeds</title>
|
|
||||||
<style>
|
|
||||||
body { margin-left: 4rem; }
|
|
||||||
li.entry { display: inline; padding-right: 1rem; }
|
|
||||||
li.entry:before { content: '\\2022'; padding-right: 0.5rem; }
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<h1>Feeds</h1>
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
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"<div class='feed'>")
|
|
||||||
buffer.write(f'<h2><a href="{f.link}">{feed_title}</a>{ago}</h2>')
|
|
||||||
if len(f.entries) > 0:
|
|
||||||
buffer.write(f"<ul>")
|
|
||||||
for entry in f.entries:
|
|
||||||
title = html.escape(entry.title)
|
|
||||||
buffer.write(
|
|
||||||
f'<li class="entry"><a href="{entry.link}">{title}</a> ({entry.time_ago()})</li>'
|
|
||||||
)
|
|
||||||
buffer.write(f"</ul>")
|
|
||||||
else:
|
|
||||||
buffer.write("<i>No entries...</i>")
|
|
||||||
buffer.write(f"</div>") # 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()
|
|
||||||
|
|
|
||||||
72
cry/web.py
Normal file
72
cry/web.py
Normal file
|
|
@ -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(
|
||||||
|
"""
|
||||||
|
<!doctype html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf8">
|
||||||
|
<title>Subscribed Feeds</title>
|
||||||
|
<style>
|
||||||
|
body { margin-left: 4rem; margin-right: 4rem; }
|
||||||
|
li.entry { display: inline; padding-right: 1rem; }
|
||||||
|
li.entry:before { content: '\\2022'; padding-right: 0.5rem; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<h1>Feeds</h1>
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
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"<div class='feed'>")
|
||||||
|
buffer.write(f'<h2><a href="{f.link}">{feed_title}</a>{ago}</h2>')
|
||||||
|
if len(f.entries) > 0:
|
||||||
|
buffer.write(f"<ul>")
|
||||||
|
for entry in f.entries:
|
||||||
|
title = html.escape(entry.title)
|
||||||
|
buffer.write(
|
||||||
|
f'<li class="entry"><a href="{entry.link}">{title}</a> ({entry.time_ago()})</li>'
|
||||||
|
)
|
||||||
|
buffer.write(f"</ul>")
|
||||||
|
else:
|
||||||
|
buffer.write("<i>No entries...</i>")
|
||||||
|
buffer.write(f"</div>") # 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()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue