Compare commits

...

3 commits

4 changed files with 99 additions and 91 deletions

View file

@ -4,8 +4,10 @@ from datetime import datetime
import feedparser import feedparser
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi_utils.tasks import repeat_every from fastapi_utils.tasks import repeat_every
from prophet import view
from prophet.domain.improvement import Improvement from prophet.domain.improvement import Improvement
from prophet.domain.improvement_repo import IImprovementRepo from prophet.domain.improvement_repo import IImprovementRepo
from prophet.domain.original import Original from prophet.domain.original import Original
@ -63,7 +65,9 @@ def improve_originals(originals: list[Original]) -> list[Improvement]:
return improvements return improvements
def init() -> FastAPI:
app = FastAPI() app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static")
origins = [ origins = [
"http://localhost", "http://localhost",
@ -77,6 +81,11 @@ app.add_middleware(
allow_methods=["*"], allow_methods=["*"],
allow_headers=["*"], allow_headers=["*"],
) )
view.define_routes(app)
return app
app = init()
@app.get("/improve-title") @app.get("/improve-title")
@ -92,18 +101,20 @@ def improve_summary(original_title: str, new_title: str, original_summary: str):
return llm.rewrite_summary(o, new_title) return llm.rewrite_summary(o, new_title)
# TODO: Switch to lifecycle events to avoid deprecated method
@app.on_event("startup") @app.on_event("startup")
@repeat_every(seconds=REFRESH_PERIOD) @repeat_every(seconds=REFRESH_PERIOD)
def refresh_articles(): async def refresh_articles():
adding = keep_only_new_originals(grab_latest_originals()) _ = await fetch_update()
improved = improve_originals(adding)
repo.add_all(improved)
print(f"Updated articles. Added {len(improved)} new ones.")
@app.get("/update") @app.get("/update")
async def fetch_update(): async def fetch_update(debug_print: bool = True):
await refresh_articles() adding = keep_only_new_originals(grab_latest_originals())
improved = improve_originals(adding)
repo.add_all(improved)
if debug_print:
print(f"Updated articles. Added {len(improved)} new ones.")
return json.dumps(improved) return json.dumps(improved)

View file

@ -1,15 +1,16 @@
# pyright: reportUnusedFunction=false
from fastapi import FastAPI
from fastapi.responses import HTMLResponse from fastapi.responses import HTMLResponse
from prophet import app
from prophet.domain.improvement_repo import IImprovementRepo from prophet.domain.improvement_repo import IImprovementRepo
from prophet.infra.improvement_pickle_repo import ImprovementPickleRepo from prophet.infra.improvement_pickle_repo import ImprovementPickleRepo
repo: IImprovementRepo = ImprovementPickleRepo() repo: IImprovementRepo = ImprovementPickleRepo()
html_app = app.app
def define_routes(app: FastAPI):
@html_app.get("/improvements", response_class=HTMLResponse) @app.get("/improvements", response_class=HTMLResponse)
def list_improvements(): def list_improvements():
improved = repo.get_all() improved = repo.get_all()
return ( return (
@ -23,12 +24,13 @@ def list_improvements():
<div class="card-title">{item.title}</div> <div class="card-title">{item.title}</div>
<div class="card-summary">{item.summary}</div> <div class="card-summary">{item.summary}</div>
</div>""" </div>"""
for item in sorted(improved, key=lambda i: i.original.date, reverse=True) for item in sorted(
improved, key=lambda i: i.original.date, reverse=True
)
) )
) )
@app.get("/originals", response_class=HTMLResponse)
@html_app.get("/originals", response_class=HTMLResponse)
def list_originals(): def list_originals():
improved = repo.get_all() improved = repo.get_all()
return ( return (
@ -42,38 +44,21 @@ def list_originals():
<div class="card-title">{item.original.title}</div> <div class="card-title">{item.original.title}</div>
<div class="card-summary">{item.original.summary}</div> <div class="card-summary">{item.original.summary}</div>
</div>""" </div>"""
for item in sorted(improved, key=lambda i: i.original.date, reverse=True) for item in sorted(
improved, key=lambda i: i.original.date, reverse=True
)
) )
) )
@app.get("/", response_class=HTMLResponse)
style = """
.card {
border: 1px solid #ccc;
padding: 10px;
margin: auto;
margin-bottom: 40px;
width: 600px;
}
.card-title {
font-size: 24px;
margin-bottom: 5px;
}
"""
@html_app.get("/", response_class=HTMLResponse)
def root_route(): def root_route():
return f""" return """
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>The Pollen Prophet</title> <title>The Pollen Prophet</title>
<script src="https://unpkg.com/htmx.org@1.6.1"></script> <script src="https://unpkg.com/htmx.org@1.6.1"></script>
<style> <link href="static/style.css" rel="stylesheet"
{style}
</style>
</head> </head>
<body> <body>
<h1>The Pollen Prophet</h1> <h1>The Pollen Prophet</h1>

BIN
static/me.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

12
static/style.css Normal file
View file

@ -0,0 +1,12 @@
.card {
border: 1px solid #ccc;
padding: 10px;
margin: auto;
margin-bottom: 40px;
width: 600px;
}
.card-title {
font-size: 24px;
margin-bottom: 5px;
}