diff --git a/README.md b/README.md index 715c3914..fc1f5f4b 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,17 @@ Here are the features that will help you do that 👇. ## Features -- Mobile friendly -- Podcast player built into Obsidian +- Mobile friendly — works on iOS and Android, including offline playback of local files and downloads +- Podcast player built into Obsidian, for both audio and video episodes - Add any publicly available podcast through search, or custom feeds by URL -- Track played episodes & playback progress -- Create podcast notes from templates with metadata about episodes +- Track played episodes & playback progress, with continuous resume +- Create podcast notes from templates with rich metadata about episodes +- Bases-friendly default notes you can sort, filter, and group with [Obsidian Bases](https://help.obsidian.md/bases) +- Create a feed note for an entire podcast that every episode note links back to - Capture timestamps & link directly to the time in the episode +- Transcribe episodes, with optional speaker labels (diarization) - Download episodes for offline playback -- Support for non-podcast local audio files +- Support for non-podcast local audio and video files - API that can be used by plugins like [QuickAdd](https://github.com/chhoumann/QuickAdd) or [Templater](https://github.com/silentvoid13/Templater) for custom workflows ## Installation @@ -33,7 +36,7 @@ Other installation options can be found in the [documentation](https://chhoumann ## Development -- `npm run test` runs the jsdom/unit test suite. +- `npm run test` runs the accessibility checks and the jsdom/unit test suite. - `npm run build` type-checks and bundles the plugin. - `npm run test:e2e` builds the plugin, then runs the local Obsidian-backed E2E suite. @@ -66,9 +69,21 @@ vault automatically. ![Player](docs/docs/resources/player.png) -### Podcast Note Editing +### Episode notes (Bases-friendly) -![Podcast Note Editing](docs/docs/resources/podcast_note.png) +![Episode note](docs/docs/resources/podcast_note.png) + +### Timestamps + +![Timestamps](docs/docs/resources/timestamps.png) + +### Transcripts with speaker labels + +![Transcript with speaker labels](docs/docs/resources/transcript_diarization.png) + +### Browse your library with Bases + +![Bases view of episode notes](docs/docs/resources/bases_view.png) ### Podcast search diff --git a/docs/docs/index.md b/docs/docs/index.md index 6ae6124b..d77bb566 100644 --- a/docs/docs/index.md +++ b/docs/docs/index.md @@ -6,12 +6,15 @@ Here are the features that will help you do that 👇. ## Features -- Mobile friendly -- Podcast player built into Obsidian +- Mobile friendly — works on iOS and Android, including offline playback of local files and downloads +- Podcast player built into Obsidian, for both audio and video episodes - Add any publicly available podcast through search, or custom feeds by URL -- Track played episodes & playback progress -- Create podcast notes from templates with metadata about episodes +- Track played episodes & playback progress, with continuous resume +- Create podcast notes from templates with rich metadata about episodes +- Bases-friendly default notes you can sort, filter, and group with [Obsidian Bases](https://help.obsidian.md/bases) +- Create a feed note for an entire podcast that every episode note links back to - Capture timestamps & link directly to the time in the episode +- [Transcribe episodes](transcripts.md), with optional speaker labels (diarization) - Download episodes for offline playback - Support for non-podcast local audio and video files - API that can be used by plugins like [QuickAdd](https://github.com/chhoumann/QuickAdd) or [Templater](https://github.com/silentvoid13/Templater) for custom workflows @@ -52,11 +55,33 @@ Now refresh the plugins in Obsidian and enable PodNotes. ### Player +Play audio and video episodes, adjust the speed, and pick up exactly where you left off. + ![Player](resources/player.png) -### Podcast Note Editing +### Episode notes + +Notes are created from a template with structured, [Bases](https://help.obsidian.md/bases)-friendly frontmatter. + +![Episode note](resources/podcast_note.png) + +### Timestamps + +Capture the moment you're listening to as a clickable link straight into your notes. + +![Timestamps](resources/timestamps.png) + +### Transcripts with speaker labels + +Transcribe an episode and, optionally, label who said what. + +![Transcript with speaker labels](resources/transcript_diarization.png) + +### Browse your library with Bases + +Because episode notes carry structured metadata, you can query them with Obsidian Bases. -![Podcast Note Editing](resources/podcast_note.png) +![Bases view of episode notes](resources/bases_view.png) ### Podcast search diff --git a/docs/docs/resources/bases_view.png b/docs/docs/resources/bases_view.png new file mode 100644 index 00000000..4f01f2f3 Binary files /dev/null and b/docs/docs/resources/bases_view.png differ diff --git a/docs/docs/resources/diarization_settings.png b/docs/docs/resources/diarization_settings.png new file mode 100644 index 00000000..8228fb42 Binary files /dev/null and b/docs/docs/resources/diarization_settings.png differ diff --git a/docs/docs/resources/feed_note.png b/docs/docs/resources/feed_note.png new file mode 100644 index 00000000..baf15a59 Binary files /dev/null and b/docs/docs/resources/feed_note.png differ diff --git a/docs/docs/resources/player.png b/docs/docs/resources/player.png index 8e2ecb27..0b42f531 100644 Binary files a/docs/docs/resources/player.png and b/docs/docs/resources/player.png differ diff --git a/docs/docs/resources/podcast_grid.png b/docs/docs/resources/podcast_grid.png index 38baf833..77b92625 100644 Binary files a/docs/docs/resources/podcast_grid.png and b/docs/docs/resources/podcast_grid.png differ diff --git a/docs/docs/resources/podcast_grid_big.png b/docs/docs/resources/podcast_grid_big.png index 3c4880dd..77b92625 100644 Binary files a/docs/docs/resources/podcast_grid_big.png and b/docs/docs/resources/podcast_grid_big.png differ diff --git a/docs/docs/resources/podcast_note.png b/docs/docs/resources/podcast_note.png index 6635936e..19f18c53 100644 Binary files a/docs/docs/resources/podcast_note.png and b/docs/docs/resources/podcast_note.png differ diff --git a/docs/docs/resources/timestamps.png b/docs/docs/resources/timestamps.png new file mode 100644 index 00000000..29bd5096 Binary files /dev/null and b/docs/docs/resources/timestamps.png differ diff --git a/docs/docs/resources/transcript_diarization.png b/docs/docs/resources/transcript_diarization.png new file mode 100644 index 00000000..d79aad33 Binary files /dev/null and b/docs/docs/resources/transcript_diarization.png differ diff --git a/docs/docs/templates.md b/docs/docs/templates.md index 81a63842..665f9c47 100644 --- a/docs/docs/templates.md +++ b/docs/docs/templates.md @@ -111,11 +111,15 @@ views: Open the base in Obsidian to sort, filter, or add views from the view options. Because `note.podcast` resolves to the linked [feed note](#podcast-feed-notes), you can also group by show or pivot from a feed note to all of its episodes. +![Bases view of episode notes, grouped by listening status](resources/bases_view.png) + ## Podcast feed notes A *feed note* is a single parent note for an entire podcast (the feed), which episode notes can link to (great for [Obsidian Bases](https://help.obsidian.md/bases) / Dataview rollups). Create one with the `Create podcast feed note` command (pick a saved podcast — no playback needed) or from an episode's right-click menu. Configure the feed note **file path** and **template** under PodNotes settings → *Podcast feed note settings*. PodNotes ships sensible Bases-friendly defaults. +![A podcast feed note](resources/feed_note.png) + In a feed note, `{{url}}` and `{{artwork}}` describe the **feed** (the note's subject). Available tags: - `{{title}}`: The podcast's name. diff --git a/docs/docs/timestamps.md b/docs/docs/timestamps.md index c624ea03..0ef18e75 100644 --- a/docs/docs/timestamps.md +++ b/docs/docs/timestamps.md @@ -3,6 +3,10 @@ Timestamps can be created with the `Capture Timestamp` Obsidian command. This will make PodNotes capture the current playback time to the active note, in the format given in the plugin settings. PodNotes can also capture recent playback segments with the `Capture Last 10 Seconds` and `Capture Last 20 Seconds` commands. +With the default `{{linktime}}` format, each captured timestamp becomes a clickable link that reopens the episode at that exact moment: + +![Notes with clickable timestamp links](resources/timestamps.png) + ## Settings For timestamps, you can use the following format strings: diff --git a/docs/docs/transcripts.md b/docs/docs/transcripts.md index c89b5cf4..917981bd 100644 --- a/docs/docs/transcripts.md +++ b/docs/docs/transcripts.md @@ -31,18 +31,16 @@ The transcript template works similarly to the [note template](./templates.md#no ## Speaker Diarization -By default the transcription uses OpenAI's Whisper model, which produces plain text with **no speaker labels**. Speaker diarization is an opt-in setting that instead labels each segment of the transcript by speaker, e.g.: +By default the transcription uses OpenAI's Whisper model, which produces plain text with **no speaker labels**. Speaker diarization is an opt-in setting that instead labels each segment of the transcript by speaker, turning a wall of text into a readable, speaker-by-speaker conversation: -``` -**A:** Welcome to the show. - -**B:** Thanks for having me. -``` +![Transcript with speaker labels](resources/transcript_diarization.png) ### Enabling it In the **Transcript settings** section, turn on **Speaker diarization** and choose a provider: +![Speaker diarization settings](resources/diarization_settings.png) + - **OpenAI** (`gpt-4o-transcribe-diarize`): reuses the OpenAI API key you already entered above, so there is nothing else to configure. Because each request is capped at ~20 MB (a conservative margin under OpenAI's 25 MB request cap), a long episode is split into chunks that are diarized independently — so on long episodes the speaker labels can change across chunk boundaries (the same person may be labelled `A` in one chunk and `B` in the next). A typical-length episode fits in a single request and is fully consistent. - **Deepgram**: sends the whole episode in one request, so speaker labels stay consistent across the entire episode. This requires a separate **Deepgram API key**, which you can create at [deepgram.com](https://deepgram.com) (new accounts include free credit). Your Deepgram key is stored separately from your OpenAI key and is only used for diarization.