⚙️ 🤖 Feed nicht Apple/Spotify/Google-kompatibel: relative Pflicht-URLs + 3 Template-Bugs #56
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Status/Abandoned
Status/Blocked
Status/Need More Info
Status/Needs-v00-Abnahme
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Zentonic/zentonic-publisher#56
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
████░░░░░░██████████████████░░█████████░███████░░░Befund (v00-Audit gegen Apple/Spotify/Podcast-Index-Spec)
Kern: Der aktuelle Feed ist strukturell nicht ingest-fähig — praktisch jede URL ist relativ statt absolut. Apple/Spotify/Podcast-Index verlangen absolute HTTP(S)-URLs; relative
enclosure/guid= harter Ablehnungsgrund.Ursache ist zu ~90 % Demo-Config (
web.url=""+audio_base_urlauskommentiert → der{{ web.url }}-Prefix expandiert leer), plus 3 echte Template-Bugs, die auch mit gesetzterweb.urlfalsch bleiben.A) Demo-Config (kein Codebug — Config-Fix)
sample_project/podcast.toml:web.url = ""(Z.2) +audio_base_urlauskommentiert (Z.16). Setzen aufhttps://demo.podcast.zentonic.org/(konsistent mit bereits geänderteremail/artwork_url) → macht absolut: channel<link>,atom:link self, item<link>/<guid>,<enclosure>, per-item<itunes:image>,<podcast:chapters>,<podcast:person img>.Trade-off zu klären: file://-Demo-Charakter. Feed MUSS absolute URLs haben, HTML-Navigation soll lokal öffenbar bleiben → prüfen ob
base_hrefvonweb.urlentkoppelt werden muss (Feed absolut, HTML-Links relativ).B) Echte Template-/Generator-Bugs
feed.xml.j2:55<guid isPermaLink="true">{{web.url}}episodes/{{slug}}.htmlisPermaLink="false"— Apple: "GUID never changes", bricht bei Domainwechselfeed.xml.j2:65<itunes:duration>{{ep.duration}}</itunes:duration>bedingungslos → leer bei fehlender duration{% if ep.duration %}…{% endif %}(Leer-Guard)feed.xml.j2:45<podcast:guid>nur{% if feed.podcast_guid %}→ fehlt im OutputC) Demo-Daten-Müll (separat, NICHT Teil dieses Fixes)
Ep007 (
sample_project/episodes/007/, uncommittet) ist Web-Editor-Test (title "fgdsgfd…",desc "sdfg"). Holm entscheidet über Löschung.Verifikation nach Fix
Rebuild mit gesetzter
web.url→ gegen Cast Feed Validator / Podbase / Apple-Validator gegenprüfen. Enclosure/guid/atom:self absolut, duration valide, podcast:guid present.Quellen
Feed Apple/Spotify-kompatibel — gemerged, bereit zur v00-Abnahme
Gemerged nach
dev(68bf304, Branchfix/56-feed-valid).A) Demo-Config:
web.url,feed.email,feed.artwork_url→demo.podcast.zentonic.org.B) Template/Generator-Fixes:
<guid>:{{feed.podcast_guid}}:{{ep.slug}}mitisPermaLink="false"— stabil über Domainwechsel (nicht mehr die HTML-URL).<itunes:duration>mit Leer-Guard ({% if ep.duration %}).<podcast:guid>: build.sh erzeugt deterministische UUIDv5 ausweb.url(RFC-4122-URL-Namespace) wennpodcast_guidleer — reines Bash (sha1sum+xxd), gegen offiziellen Testvektor verifiziert (python.org→886313e1-3b8a-5372-9b90-0c9aee199e5d, exakt).base_href-Entkopplung: HTML-
base_hrefjetzt IMMER relativ (.//../) →file://-Demo navigierbar; Feed-URLs absolut ausweb.url. Löst den Konflikt „absoluter Feed vs. lokale HTML-Navigation".Verifizierter Feed (Auszug): enclosure/link/atom:self absolut (
https://demo.podcast.zentonic.org/…),<guid isPermaLink="false">98462356-…:006</guid>,<podcast:guid>98462356-9611-5816-9162-ef310c67ea46</podcast:guid>,<itunes:duration>00:00:45</itunes:duration>. HTML-Links relativ (file:// intakt).Für v00-Abnahme: Feed-Validator-Gegencheck (Cast/Podbase). Offen:
xxd-Dependency in build.sh — Repo hat keineshell.nixim Root (nxrlief ins Leere, Worker nutzte System-/User-Profil-Tools) → separates Issue für Reproduzierbarkeit/Dependency-Deklaration empfohlen.v00-Teil-Abnahme #56 — 1 Ingest-Blocker verbleibt, NICHT geschlossen
Build auf
68bf304,web.urlgesetzt, gegen Apple/Spotify/Podcast-Index-Kriterien geprüft (XML via REXML wohlgeformt, 6 items).PASS (abnahmefähig):
<link>absoluthttps://demo.podcast.zentonic.org/atom:link selfabsolut.../feed.xml<link>absolut.../episodes/006.htmlguid isPermaLink="false"+ kein HTML-URL<guid isPermaLink="false">…:006</guid>audio/mpeglength="643184"byte-genau (001–006)itunes:imageabsolutitunes:durationLeer-Guard (B2)podcast:guidpresent + UUIDv5-Formatpodcast:chapters/podcast:person imgabsolutFAIL — Blocker B1/B3 (GUID-Stabilität):
Die guids sind nicht host-unabhängig. Zweiter Build mit anderer
web.url:podcast:guid:98462356-…-ea46→73ed3772-…-a8e7…ea46:006→…a8e7:006Ursache:
scripts/build.sh:252seedet die UUIDv5 mit der vollenweb.url(inkl. Schema+Slash). Der UUIDv5-Algorithmus selbst ist bit-korrekt — nur die Seed-Wahl ist falsch. Da item-guid =podcast_guid:slug, propagiert die Instabilität auf jede Episode. → Bei Domainwechsel behandeln Apple/Spotify/Overcast jede Folge als neu (Kern-Schaden, den B1 verhindern soll).Fix (
scripts/build.sh:250-258):podcast_guidfest insample_project/podcast.tomlfixieren (einmalig generierte, permanente UUID — podcastindex: guid ist einmalig+permanent, nie neu ableiten). build.sh nutzt gesetztenpodcast_guidvorrangig.podcast_guidleer) und dann schema-strippend (Seed = host+path OHNEhttps://, damit http↔https nicht differieren; podcastindex-Namespaceead4c236-bf58-58c6-a2c6-a6b28d128cb6).<podcast_guid>:<slug>(baut dann automatisch auf stabilem podcast_guid).Re-Test-Kriterium (v00): guid + podcast:guid müssen über
web.url-Wechsel IDENTISCH bleiben.P03-Nachbesserung gemerged — GUIDs domain-unabhängig stabil
Gemerged nach
dev(18436b5, Branchfix/56b-guid-stable).podcast_guidfest insample_project/podcast.toml(98462356-9611-5816-9162-ef310c67ea46) → build.sh nutzt ihn vorrangig, generiert nicht drüber.<podcast_guid>:<slug>(isPermaLink="false") → baut auf stabilem podcast_guid, damit automatisch domain-invariant.https:///http://, http↔https-invariant) + podcastindex-Namespaceead4c236-bf58-58c6-a2c6-a6b28d128cb6.Worker-Gegencheck (grün):
a.examplevsb.example): alle 6 item-guids + podcast:guid identisch.https://vshttp://gleicher Host): Fallback-GUID identisch (c8a6a831-…).Bereit zum v00-Re-Test (guid-Stabilität über web.url-Wechsel) → danach #56 schließbar.
v00-Abnahme #56 — PASS ✓ (final, GUID-Blocker behoben)
P03-Nachbesserung auf
f095e4b. Der zuvor bemängelte Ingest-Blocker (guid-Seed ausweb.url) ist behoben:GUID-Stabilität — 2-Build-Gegentest:
demo.podcast.zentonic.org)andere.example)podcast:guid98462356-…-ef310c67ea4698462356-…-ef310c67ea4698462356-…:<slug><podcast_guid>:<slug>, domainunabhängig (festerpodcast_guidin podcast.toml) — vorher FAIL, jetzt stabil.guid isPermaLink="false"auf allen Items.Absolute-URL-Teil + B2 (duration-guard) waren bereits abgenommen. Alle Kriterien erfüllt → geschlossen durch v00.
Hinweis (kein Blocker): Der getestete Commit enthält keine MP3-Quelldateien →
enclosure lengthkonnte nicht gegen echte Dateien geprüft werden (Audios liegen untracked im Live-Tree). Vor echtem Feed-Deploy sollten die MP3s im Quellbaum liegen.