Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 23 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.

Expand Down Expand Up @@ -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

Expand Down
37 changes: 31 additions & 6 deletions docs/docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
Binary file added docs/docs/resources/bases_view.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/docs/resources/diarization_settings.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/docs/resources/feed_note.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/docs/resources/player.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/docs/resources/podcast_grid.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/docs/resources/podcast_grid_big.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/docs/resources/podcast_note.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/docs/resources/timestamps.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/docs/resources/transcript_diarization.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions docs/docs/templates.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 4 additions & 0 deletions docs/docs/timestamps.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Don't describe plain timestamps as clickable by default

For a fresh install the default setting is still DEFAULT_SETTINGS.timestamp.template = "- {{time}} " in src/constants.ts, so Capture Timestamp inserts a plain time rather than an episode link unless the user changes the format to {{linktime}}. This added sentence tells users the default capture is clickable, which will make the new screenshot/docs incorrect for the default configuration.

Useful? React with 👍 / 👎.


![Notes with clickable timestamp links](resources/timestamps.png)

## Settings
For timestamps, you can use the following format strings:

Expand Down
10 changes: 4 additions & 6 deletions docs/docs/transcripts.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
Loading