Compare commits
3 commits
c8d218a16f
...
9666f104a2
| Author | SHA1 | Date | |
|---|---|---|---|
| 9666f104a2 | |||
| c3b88979a8 | |||
| 5edb413394 |
3 changed files with 99 additions and 91 deletions
|
|
@ -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,20 +65,27 @@ def improve_originals(originals: list[Original]) -> list[Improvement]:
|
||||||
return improvements
|
return improvements
|
||||||
|
|
||||||
|
|
||||||
app = FastAPI()
|
def init() -> FastAPI:
|
||||||
|
app = FastAPI()
|
||||||
|
app.mount("/static", StaticFiles(directory="static"), name="static")
|
||||||
|
|
||||||
origins = [
|
origins = [
|
||||||
"http://localhost",
|
"http://localhost",
|
||||||
"http://localhost:8080",
|
"http://localhost:8080",
|
||||||
]
|
]
|
||||||
|
|
||||||
app.add_middleware(
|
app.add_middleware(
|
||||||
CORSMiddleware,
|
CORSMiddleware,
|
||||||
allow_origins=origins,
|
allow_origins=origins,
|
||||||
allow_credentials=True,
|
allow_credentials=True,
|
||||||
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)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
129
prophet/view.py
129
prophet/view.py
|
|
@ -1,84 +1,69 @@
|
||||||
|
# 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 (
|
||||||
"""<button hx-get="/originals" hx-target="#content">Originals</button> """
|
"""<button hx-get="/originals" hx-target="#content">Originals</button> """
|
||||||
+ "\n".join(
|
+ "\n".join(
|
||||||
f"""
|
f"""
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-img">
|
<div class="card-img">
|
||||||
<img src="{item.original.image_link if item.original.image_link else "https://placehold.co/300x200"}" width="600">
|
<img src="{item.original.image_link if item.original.image_link else "https://placehold.co/300x200"}" width="600">
|
||||||
</div>
|
</div>
|
||||||
<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 (
|
"""<button hx-get="/improvements" hx-target="#content">Improvements</button> """
|
||||||
"""<button hx-get="/improvements" hx-target="#content">Improvements</button> """
|
+ "\n".join(
|
||||||
+ "\n".join(
|
f"""
|
||||||
f"""
|
<div class="card">
|
||||||
<div class="card">
|
<div class="card-img">
|
||||||
<div class="card-img">
|
<img src="{item.original.image_link if item.original.image_link else "https://placehold.co/300x200"}" width="600">
|
||||||
<img src="{item.original.image_link if item.original.image_link else "https://placehold.co/300x200"}" width="600">
|
</div>
|
||||||
</div>
|
<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(
|
||||||
for item in sorted(improved, key=lambda i: i.original.date, reverse=True)
|
improved, key=lambda i: i.original.date, reverse=True
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
|
@app.get("/", response_class=HTMLResponse)
|
||||||
style = """
|
def root_route():
|
||||||
.card {
|
return """
|
||||||
border: 1px solid #ccc;
|
<!DOCTYPE html>
|
||||||
padding: 10px;
|
<html>
|
||||||
margin: auto;
|
<head>
|
||||||
margin-bottom: 40px;
|
<title>The Pollen Prophet</title>
|
||||||
width: 600px;
|
<script src="https://unpkg.com/htmx.org@1.6.1"></script>
|
||||||
}
|
<link href="static/style.css" rel="stylesheet"
|
||||||
|
</head>
|
||||||
.card-title {
|
<body>
|
||||||
font-size: 24px;
|
<h1>The Pollen Prophet</h1>
|
||||||
margin-bottom: 5px;
|
<h2>Making funny since 2025 what ought not bee.</h2>
|
||||||
}
|
<div hx-get="/improvements" hx-target="#content" hx-trigger="load" id="content"></div>
|
||||||
"""
|
</body>
|
||||||
|
</html>
|
||||||
|
"""
|
||||||
@html_app.get("/", response_class=HTMLResponse)
|
|
||||||
def root_route():
|
|
||||||
return f"""
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>The Pollen Prophet</title>
|
|
||||||
<script src="https://unpkg.com/htmx.org@1.6.1"></script>
|
|
||||||
<style>
|
|
||||||
{style}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1>The Pollen Prophet</h1>
|
|
||||||
<h2>Making funny since 2025 what ought not bee.</h2>
|
|
||||||
<div hx-get="/improvements" hx-target="#content" hx-trigger="load" id="content"></div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
"""
|
|
||||||
|
|
|
||||||
12
static/style.css
Normal file
12
static/style.css
Normal 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;
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue