Skip to content

fix(player): open and reveal the PodNotes view from "Play with PodNotes" (#84) - #198

Merged
chhoumann merged 1 commit into
masterfrom
chhoumann/84-play-with-podnotes-broken
Jun 16, 2026
Merged

chhoumann merged 1 commit into
masterfrom
chhoumann/84-play-with-podnotes-broken

Conversation

@chhoumann

Copy link
Copy Markdown
Owner

Summary

Right-clicking an audio file and choosing Play with PodNotes now reliably opens and reveals the PodNotes player and starts playback, even when the PodNotes pane is closed or hidden in a collapsed sidebar.

Closes #84.

Background

Issue #84 (filed on Obsidian 1.4.1 / PodNotes 2.10.8) reported three symptoms: the action didn't open the player pane, didn't play, and showed a broken miniature with DOMException: The element has no supported sources.

The playback-source half was already fixed by #100 / #184, which replaced in-memory blob: URLs with app.vault.getResourcePath() and replaced an extension regex that matched every file with an explicit allow-list. I verified this on current master in a real Obsidian instance (isolated e2e vault, real MP3): with the PodNotes pane already open, the file plays — valid app:// src, audio.error is null, readyState 1, real duration, currentTime advances.

The remaining half still reproduced: with the pane closed, clicking Play with PodNotes did nothing visible — no leaf opened and nothing played:

{ "leavesAfterClose": 0, "playItemFound": true,
  "leavesAfterClick": 0, "podcastViewInDomAfterClick": false, "audioPresent": false }

Root cause: the handler set the currentEpisode and viewState stores, but those only update an already-mounted Svelte view. When the view was closed (or hidden in a collapsed sidebar) nothing reacted, so the file played to no visible player — exactly the "doesn't open associated pane" symptom.

The fix

In src/getContextMenuHandler.ts, after setting the stores, ensure the player view is open and revealed via a small revealPodcastView(app) helper:

  • reuse an existing VIEW_TYPE leaf when present, otherwise open one in the right sidebar with getRightLeaf(false).setViewState(...);
  • workspace.revealLeaf(leaf) — which also surfaces a leaf hidden inside a collapsed sidebar.

This mirrors the existing Show PodNotes command and onLayoutReady in main.ts. Setting the stores before opening the leaf is what lets a freshly mounted EpisodePlayer read viewState = Player / currentEpisode on first render and autoplay the app:// resource. main.ts is untouched — the change stays in the context-menu handler.

Verification

Post-fix runtime repro (same isolated vault, pane closed before the click):

{ "leavesAfterClose": 0, "playItemFound": true,
  "leavesAfterClick": 1, "podcastViewInDomAfterClick": true,
  "audioPresent": true, "audioPlaying": true, "leafIsRevealed": true }

The already-open path is unchanged (it falls into the existing-leaf branch and just reveals), so there's no regression there.

  • Local file used: a 3s 440 Hz sine MP3 (Audio/test-tone.mp3) generated with ffmpeg, played from the file-explorer context menu.
  • Runtime: real Obsidian via the isolated worktree e2e vault (npm run obsidian:e2e), triggering the real file-menu event and invoking the captured item's onClick.

New tests

src/getContextMenuHandler.test.ts covers: the item is offered only for audio files, the current episode is wired with the app:// resource URL, and both reveal paths (reuse an existing leaf vs. open a new one).

Gates (Node 22)

npm run lint, format:check, typecheck, build, and test (457 tests) all pass.

Release / migration impact

None. No settings, storage, API, or URI changes — purely the context-menu playback flow.

…s play (#84)

Selecting 'Play with PodNotes' on an audio file set the currentEpisode and
viewState stores but never opened or revealed the PodNotes view. When the
view was closed or hidden in a collapsed sidebar nothing reacted, so the
action silently did nothing — the file played to no visible player. This is
the remaining half of issue #84; the no-supported-sources/blob playback half
was fixed by #100.

Open the right-sidebar view when no leaf exists and reveal it (which also
surfaces a leaf hidden in a collapsed sidebar), mirroring the 'Show PodNotes'
command and onLayoutReady. Keep the fix in getContextMenuHandler.ts; main.ts
is untouched.

Add unit tests covering the audio-only menu item, current-episode wiring, and
both reveal paths (existing leaf vs. opening a new one).
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying podnotes with  Cloudflare Pages  Cloudflare Pages

Latest commit: d024780
Status: ✅  Deploy successful!
Preview URL: https://d1dc76bc.podnotes.pages.dev
Branch Preview URL: https://chhoumann-84-play-with-podno.podnotes.pages.dev

View logs

@chhoumann
chhoumann merged commit 5953625 into master Jun 16, 2026
2 checks passed
github-actions Bot pushed a commit that referenced this pull request Jun 22, 2026
# [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))
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 2.17.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

@chhoumann
chhoumann deleted the chhoumann/84-play-with-podnotes-broken branch June 29, 2026 05:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Play with podnotes dosnt seems to work

1 participant