fix(podcast): fælles link virker i Messenger
Messengers indbyggede browser kan ikke åbne podcast-apps (podcast://, overcast:// osv.), så abonnér-knapperne gjorde ingenting. Siden genkender nu Facebook-, Messenger- og Instagram-browseren og viser en knap, der åbner siden i Safari (x-safari-https) eller på Android i den almindelige browser (intent://), plus en vejledning til menuen. Afspilleren virker stadig direkte. Link-forhåndsvisningen (facebookexternalhit m.fl.) får en minimal side med titel, en neutral tekst og omslaget som og:-tags, aldrig episodelisten, og den tælles ikke som en hentning. Den fulde side har de samme og:-tags. Claude-Session: https://claude.ai/code/session_012LCTmU2ewo8tnM1dByYAoG
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user