Repository navigation
feat(notes): add podcast feed-level notes (#163) - #187
Conversation
Deploying podnotes with
|
| Latest commit: |
685ae93
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://109bcc8e.podnotes.pages.dev |
| Branch Preview URL: | https://chhoumann-163-podcast-level.podnotes.pages.dev |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d28628802d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
d286288 to
2848144
Compare
Add first-class notes for a whole podcast feed (not just episodes): - New command "Create podcast feed note" opens a fuzzy picker over saved feeds and creates/opens the feed note without requiring playback (#161). - Rename the existing command's visible name to "Create episode note" (id kept as create-podcast-note for hotkey/API compatibility). - New FeedNoteTemplateEngine/FeedFilePathTemplateEngine plus episode-side tags ({{episodeurl}}, {{episodeartwork}}, {{feedurl}}, {{feedartwork}}, {{podcastlink}}); {{url}}/{{artwork}} keep meaning the note's own subject. - Extend PodcastFeed + FeedParser.getFeed with description/link/author (channel-scoped, atom:link-safe, no longer throws when <link> is absent). - New feedNote { path, template } setting with Bases-friendly defaults (#160); registered for settings import/export. - Feed-note creation is race-safe and enriches metadata on demand. Co-authored-by: Christian Bager Bach Houmann <christian@bagerbach.com>
2848144 to
685ae93
Compare
Runtime verification ✅ (real Obsidian)Verified end-to-end in a real Obsidian dev vault (plugin pointed at this branch's build), then restored the vault to its prior state. No console errors.
Setup: dev vault; commands |
# [2.17.0](2.16.0...2.17.0) (2026-06-22) ### Bug Fixes * behavioral-audit logic and robustness fixes (back-end, 1/2) ([#213](#213)) ([4e2845d](4e2845d)) * **download:** default per-episode download path and migrate empty default ([#183](#183)) ([#186](#186)) ([46a6486](46a6486)) * **download:** prevent Android crash and create missing folders on download ([#178](#178)) ([ecd09d5](ecd09d5)), closes [#113](#113) [#86](#86) [#113](#113) [#86](#86) * **lifecycle:** defer mobile podcast view startup ([#208](#208)) ([8bf9ce4](8bf9ce4)) * **notes:** cap note path length and harden folder creation ([#22](#22), [#87](#87)) ([#192](#192)) ([858e280](858e280)), closes [#87-class](#87) * **playback:** persist listened time during playback ([#33](#33)) ([#190](#190)) ([e3433c2](e3433c2)), closes [#191](#191) [#108](#108) [#163](#163) [#183](#183) * **playback:** play local files and downloads on iOS via resource path ([#100](#100)) ([#184](#184)) ([12c503a](12c503a)) * **player:** clear progress on episode switch to stop end-of-playback glitch ([#94](#94)) ([#194](#194)) ([59dccb3](59dccb3)) * **player:** reveal PodNotes view on Play with PodNotes so local files play ([#84](#84)) ([#198](#198)) ([5953625](5953625)) * **settings:** show labelled Add/Remove buttons in podcast search ([#109](#109)) ([#195](#195)) ([33399f5](33399f5)) * show downloaded episodes in the Local Files playlist ([#176](#176)) ([#177](#177)) ([184188c](184188c)) * **timestamps:** capture into the cursor's table cell without breaking the row ([#165](#165)) ([#203](#203)) ([964e342](964e342)) * **transcription:** always transcribe the currently playing episode ([#182](#182)) ([62b488a](62b488a)), closes [#107](#107) * **uri:** preserve '+' in episode titles and paths for timestamp links ([#181](#181)) ([8ad7aa5](8ad7aa5)), closes [#164](#164) * **view:** reliably reveal PodNotes view via command + ribbon icon ([#55](#55)) ([#199](#199)) ([fa1d708](fa1d708)) ### Features * add podcast segment links ([#205](#205)) ([d97e59e](d97e59e)) * **api:** expose generated episode transcripts ([e264465](e264465)), closes [#105](#105) * behavioral-audit UI and interaction fixes (front-end, 2/2) ([#215](#215)) ([894d93d](894d93d)) * **commands:** add playback rate and media timestamp controls ([#206](#206)) ([a8bb44a](a8bb44a)) * **devx:** isolated per-worktree Obsidian E2E vault wrapper ([#188](#188)) ([a8b7a4a](a8b7a4a)) * **episodes:** add a setting to control the Latest Episodes list length ([#114](#114)) ([#200](#200)) ([7b3e3c6](7b3e3c6)) * **notes:** add {{episodelink}} template tag to resume an episode from its note ([#35](#35)) ([#193](#193)) ([8c1ddd6](8c1ddd6)) * **notes:** add podcast feed-level notes ([#163](#163)) ([#187](#187)) ([db0de47](db0de47)), closes [#161](#161) [#160](#160) * **notes:** ship a Bases-friendly default episode note template ([#160](#160)) ([#201](#201)) ([209431d](209431d)), closes [#163](#163) [#183](#183) * **player:** scale episode title font size to its length ([#81](#81)) ([#202](#202)) ([659b6b8](659b6b8)) * **player:** support video episode playback ([#209](#209)) ([f92a91f](f92a91f)) * **queue:** add setting to disable queue auto-population and auto-advance ([#108](#108)) ([#185](#185)) ([cf3d73c](cf3d73c)) * **queue:** allow reordering the playback queue ([#80](#80)) ([#179](#179)) ([d994d61](d994d61)), closes [#173](#173) * **settings:** import/export settings & templates ([#180](#180)) ([a27d23d](a27d23d)), closes [#162](#162) [#162](#162) * **templates:** add {{currentDate}}, {{episodeNumber}}, {{duration}} template variables ([#189](#189)) ([ec573eb](ec573eb)), closes [#75](#75) [#34](#34) [#88](#88) [163/#186](#186) * **templates:** add episode chapters tag ([#207](#207)) ([9c98863](9c98863)) * **transcripts:** opt-in speaker diarization for transcripts ([#168](#168)) ([#204](#204)) ([a96e12f](a96e12f))
|
🎉 This PR is included in version 2.17.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Summary
Adds first-class notes for a whole podcast feed (not just individual episodes), so episodes can link up to a parent note for Obsidian Bases / Dataview rollups.
create-podcast-note) is unchanged, so existing hotkeys/API keep working.{{url}}/{{artwork}}always describe the note's own subject (the episode in an episode note, the feed in a feed note). No existing tag changes meaning.{{episodeurl}},{{episodeartwork}},{{feedurl}},{{feedartwork}}, and{{podcastlink}}(a ready-made wikilink to the feed note).FeedNoteTemplateEngineexposes{{title}},{{podcast}},{{url}}(website),{{feedurl}},{{artwork}},{{author}},{{description}},{{date}}.PodcastFeed+FeedParser.getFeednow capture the channeldescription, websitelink(atom-self/hub-safe), andauthor;getFeedno longer throws when a feed omits<link>.feedNote { path, template }with Bases-friendly defaults (addresses FR: Add Obsidian Bases in default note template #160), included in settings import/export.Closes #163. Relates to #161 and #160.
Implementation notes
{{podcast}}+ quoted URL scalars); raw{{title}}/{{author}}live in the note body so arbitrary titles/authors can't produce invalid YAML.TemplateEngine.tschanges are additive (new exported engines) to compose cleanly with fix(transcription): always transcribe the currently playing episode #182.Testing
Ran the CI-equivalent gates locally (Node 22):
npm run lint✓npm run typecheck✓npm run test✓ (278 tests, 29 files — includes new unit tests for the feed engines, feed metadata parsing incl. atom hub/alternate,createFeedNoterace-safety, settings round-trip, and picker ordering)npm run build✓npm run check:a11y✓ (0 errors, 0 warnings)npm run format:check✓docs:buildrequires mkdocs (not installed locally); docs changes are plain markdown additions tocommands.md/templates.md.Runtime verification: ✅ completed in a real Obsidian dev vault — command → fuzzy picker → live on-demand enrichment → Obsidian-parsed (valid Bases YAML) note, plus settings-migration backfill, the no-duplicate guard, and
{{podcastlink}}resolution. See the "Runtime verification" comment on this PR for the captured evidence.Release / migration impact
feedNote { path, template }with shipped defaults; backfills automatically for existing users (no migration needed) and round-trips through settings import/export.