diff --git a/main.py b/main.py index 66489af..55bd480 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,7 @@ from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from starlette.middleware.sessions import SessionMiddleware +import re import time import urllib.parse @@ -441,16 +442,42 @@ async def podcast_ny_noegle(request: Request): # Det fælles familielink: ingen login, ingen kladder, noindex. Står før de # personlige ruter, så "f" aldrig forveksles med en nøgle. +# Messenger/Facebooks link-forhåndsvisning og deres indbyggede browsere. +_FORHAANDSVISNING = re.compile(r"facebookexternalhit|meta-external(agent|fetcher)|Facebot|WhatsApp", re.I) +_INDBYGGET = re.compile(r"FBAN|FBAV|FB_IAB|FBIOS|Messenger|Instagram|LinkedInApp", re.I) + + @app.get("/podcast/f/{key}/", response_class=HTMLResponse) async def podcast_faelles_side(request: Request, key: str): - if podcast.blokeret(_klient_ip(request)) or not podcast.faelles_slaa_op(key, "side"): + ua = request.headers.get("user-agent", "") + forhaandsvisning = bool(_FORHAANDSVISNING.search(ua)) + if podcast.blokeret(_klient_ip(request)) or not podcast.faelles_slaa_op(key, "" if forhaandsvisning else "side"): _ikke_fundet(request) rod = f"/podcast/f/{key}" + base = str(request.base_url).rstrip("/") + udsendelser = _podcast_kontekst(request, rod, med_kladder=False) + s = udsendelser[0] if udsendelser else {"titel": "Podcast", "slug": "", "har_cover": False} + og = {"titel": s["titel"], "url": f"{base}{rod}/", + "beskrivelse": "Familiens podcast. Lyt i browseren, eller abonnér i din podcast-app.", + "billede": f"{base}{rod}/{s['slug']}/cover.jpg" if s.get("har_cover") else ""} + headers = {"X-Robots-Tag": "noindex, nofollow, noarchive", "Referrer-Policy": "no-referrer", + "Cache-Control": "private, no-store"} + if forhaandsvisning: + # Forhåndsvisningen får kun titel, en neutral tekst og omslaget, aldrig + # episodelisten (den nævner familiemedlemmer ved navn). + return templates.TemplateResponse(request, "podcast_og.html", {"request": request, "og": og}, headers=headers) + indbygget = None + if _INDBYGGET.search(ua): + sti = f"{request.url.hostname}{rod}/" + if re.search(r"iPhone|iPad|iOS", ua): + indbygget = {"knap": "Åbn i Safari", "href": f"x-safari-https://{sti}"} + elif "Android" in ua: + indbygget = {"knap": "Åbn i Chrome", "href": f"intent://{sti}#Intent;scheme=https;end"} + else: + indbygget = {"knap": "", "href": ""} return templates.TemplateResponse(request, "podcast.html", { - "request": request, "user": None, "is_admin": False, "rod": rod, "delt": True, - "udsendelser": _podcast_kontekst(request, rod, med_kladder=False), "saved": ""}, - headers={"X-Robots-Tag": "noindex, nofollow, noarchive", "Referrer-Policy": "no-referrer", - "Cache-Control": "private, no-store"}) + "request": request, "user": None, "is_admin": False, "rod": rod, "delt": True, "og": og, + "indbygget": indbygget, "udsendelser": udsendelser, "saved": ""}, headers=headers) @app.get("/podcast/f/{key}/{name}.xml") diff --git a/templates/podcast.html b/templates/podcast.html index 85bfbb6..8bb5f59 100644 --- a/templates/podcast.html +++ b/templates/podcast.html @@ -1,7 +1,12 @@ {% extends "base.html" %} {% block title %}{% if delt and udsendelser %}{{ udsendelser[0].titel }}{% else %}Podcast{% endif %}{% endblock %} {% block head %}{% if delt %} -{% endif %}{% endblock %} + +{% if og %} + + + +{% if og.billede %}{% endif %}{% endif %}{% endif %}{% endblock %} {% block body %} {% if saved %}
{% if delt %}Tryk på din app, så kommer nye episoder af sig selv. Linket er familiens fælles, så del det kun inden for familien.{% else %}Tryk på din app. Nye episoder kommer så af sig selv. Adressen er din egen, så del den ikke; familien får hver sin.{% endif %}
{{ og.beskrivelse }}
+