44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
from __future__ import annotations
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
|
|
def _parse_iso_datetime(value: str | None) -> datetime | None:
|
|
if not value:
|
|
return None
|
|
raw = value.strip()
|
|
if not raw:
|
|
return None
|
|
if raw.endswith("Z"):
|
|
raw = raw[:-1] + "+00:00"
|
|
try:
|
|
parsed = datetime.fromisoformat(raw)
|
|
except ValueError:
|
|
return None
|
|
if parsed.tzinfo is None:
|
|
parsed = parsed.replace(tzinfo=timezone.utc)
|
|
return parsed
|
|
|
|
|
|
def article_age_days(published_at: str | None, now: datetime | None = None) -> int | None:
|
|
published = _parse_iso_datetime(published_at)
|
|
if not published:
|
|
return None
|
|
ref = now or datetime.now(timezone.utc)
|
|
delta = ref - published
|
|
if delta.total_seconds() < 0:
|
|
return 0
|
|
return delta.days
|
|
|
|
|
|
def article_relevance(published_at: str | None, now: datetime | None = None) -> str:
|
|
days = article_age_days(published_at, now=now)
|
|
if days is None:
|
|
return "unbekannt"
|
|
if days <= 2:
|
|
return "hoch"
|
|
if days <= 7:
|
|
return "mittel"
|
|
if days <= 30:
|
|
return "niedrig"
|
|
return "alt"
|