<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs.git/modules/music-config.el, branch v0.7.2</title>
<subtitle>my Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2</id>
<link rel='self' href='https://git.cjennings.net/dotemacs.git/atom?h=v0.7.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/'/>
<updated>2026-04-03T13:33:33+00:00</updated>
<entry>
<title>feat(music): add random-aware next/previous; refactor music + calendar-sync</title>
<updated>2026-04-03T13:33:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-03T13:33:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=eb01b3d24739e916d9dca33f5f039650a9de8457'/>
<id>urn:sha1:eb01b3d24739e916d9dca33f5f039650a9de8457</id>
<content type='text'>
Music: random mode now respected by next/previous keys. Previous navigates
a 50-track play history ring buffer. Fixed playlist replacement bug.
24 new tests.

Calendar-sync: consolidated duplicate parse functions, extracted timezone
localization helper, unified expand-daily/monthly/yearly into parameterized
function, removed dead code. 33 new characterization tests. -90 lines.
</content>
</entry>
<entry>
<title>feat(music): add test coverage for 7 functions, refactor with extracted helpers</title>
<updated>2026-04-01T13:13:33+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-04-01T13:13:33+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=fdc63ea6675709d6ca42362b1be1918f8bf24478'/>
<id>urn:sha1:fdc63ea6675709d6ca42362b1be1918f8bf24478</id>
<content type='text'>
Add 47 new unit tests across 7 test files covering playlist-modified-p,
assert-valid-playlist-file, playlist-tracks, create-radio-station,
ensure-playlist-buffer, after-playlist-clear, and header-text.

Extract three helpers to reduce duplication: assert-m3u-files-exist (dedupes
2 identical guards), sync-playlist-file (dedupes 3 state-sync patterns),
and select-m3u-file (reusable M3U selection with cancel). Simplify
append-track-to-playlist nesting from 6 to 4 levels. Delete unused
cj/music-keymap-prefix variable.
</content>
</entry>
<entry>
<title>fix(music): place point on first track after playlist load/reload</title>
<updated>2026-03-10T12:24:25+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-03-10T12:24:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=34e815ea969ad043b581d096c95f28608d1701a5'/>
<id>urn:sha1:34e815ea969ad043b581d096c95f28608d1701a5</id>
<content type='text'>
</content>
</entry>
<entry>
<title>fix(music): force case-insensitive search when adding songs</title>
<updated>2026-02-21T13:01:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-21T13:01:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=eafdf18496eb00111d3e502ef967b2cf86295d3b'/>
<id>urn:sha1:eafdf18496eb00111d3e502ef967b2cf86295d3b</id>
<content type='text'>
Bind orderless-smart-case to nil in cj/music-fuzzy-select-and-add
so typing uppercase characters doesn't switch to case-sensitive matching.
</content>
</entry>
<entry>
<title>feat(music): add playlist UI with header overlay, track styling, and tests</title>
<updated>2026-02-15T20:31:36+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-15T20:31:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=600986e1ea6797bf2a47cc5de22d7a79f15a1b75'/>
<id>urn:sha1:600986e1ea6797bf2a47cc5de22d7a79f15a1b75</id>
<content type='text'>
Replace raw file paths with clean track descriptions (Artist - Title [M:SS]),
add multi-line header overlay showing playlist info, now-playing, mode
indicators with gold/muted toggle states, and keybinding hints. Style
non-playing tracks in Dupre steel, playing track in Dupre gold. Playlist
window now opens from the bottom at 50% height with subtle background
highlight on focus.

Unit tests for format-duration (13 tests) and track-description (16 tests).
</content>
</entry>
<entry>
<title>docs(music): add ncmpcpp keybinding comparison table to commentary</title>
<updated>2026-02-15T07:07:53+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-15T07:07:53+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=01b91bcda9f665c5a132dec9cb0c602e9bf77cf5'/>
<id>urn:sha1:01b91bcda9f665c5a132dec9cb0c602e9bf77cf5</id>
<content type='text'>
Document playlist-mode keybindings with ncmpcpp default alignment
status (83% match). Note intentional divergences (SPC/p swap,
x=consume vs crossfade) and EMMS-only features.
</content>
</entry>
<entry>
<title>feat(music): align EMMS keybindings with ncmpcpp, add consume mode</title>
<updated>2026-02-15T07:02:23+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-15T07:02:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=f010700dba1d240e6d485c440d7758de7473a7d2'/>
<id>urn:sha1:f010700dba1d240e6d485c440d7758de7473a7d2</id>
<content type='text'>
Reconcile playlist-mode bindings with ncmpcpp defaults: add ncmpcpp-
compatible aliases (&gt;/&lt;, +, S-up/S-down, c), new toggles (r repeat,
t repeat-track, z random, x consume), info keys (i, o), and relocate
radio (r→R), reload (R→g), shuffle (x→Z). Add consume mode that
removes tracks from playlist after playback via emms-player-finished-
hook. Fix buffer-local bug where emms-playlist-selected-marker was
checked outside with-current-buffer. 13 ERT tests.
</content>
</entry>
<entry>
<title>feat(music): add dirvish keybinding for EMMS playlist</title>
<updated>2026-02-01T07:44:44+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-02-01T07:44:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=cccc3bf9a6dab273671d0d814118b3fe29291be8'/>
<id>urn:sha1:cccc3bf9a6dab273671d0d814118b3fe29291be8</id>
<content type='text'>
Bind + to cj/music-add-dired-selection in dirvish-mode-map.
</content>
</entry>
<entry>
<title>feat(dwim-shell): fix M-D menu binding and enhance audio extraction</title>
<updated>2025-11-24T13:54:37+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-24T13:54:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=c0066af134cb0ffb21889b455963c6917fd690e7'/>
<id>urn:sha1:c0066af134cb0ffb21889b455963c6917fd690e7</id>
<content type='text'>
- Fix dwim-shell-commands-menu keybinding in dirvish/dired
  - Remove :after (dired dirvish) which prevented package loading
  - Add :demand t to load package immediately at startup
  - Move keybindings inside :config block after menu function definition
  - M-D now works immediately in dirvish without manual trigger

- Enhance extract-audio-from-video function
  - Fix :extensions parameter (was regex string, now proper list)
  - Change from copy to AAC re-encoding for codec compatibility
  - Add interactive bitrate selection (64k/96k/128k/192k)
  - Fixes Opus codec compatibility issues with M4A containers

- Remove conflicting keybindings
  - Remove music-config p binding in dirvish (was overriding path copy)
  - Clean up extraneous requires/hooks from troubleshooting

- Add TODO for dwim-shell-command status dashboard [#D priority]

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat(music): Switch EMMS from MPD to MPV backend</title>
<updated>2025-11-15T19:16:57+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2025-11-15T19:16:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs.git/commit/?id=fbae1614bf8cff06366de69f5f1694d0c813824c'/>
<id>urn:sha1:fbae1614bf8cff06366de69f5f1694d0c813824c</id>
<content type='text'>
Major improvements to music player configuration:

Backend Changes:
- Switch from emms-player-mpd to emms-player-mpv
- Remove MPD daemon dependency (no service management required)
- Configure MPV with --quiet, --no-video, --audio-display flags
- Support both local files and streaming URLs (http/https/mms)

Keybinding Enhancements:
- Add C-; m n → next track
- Add C-; m p → previous track
- Add C-; m g → go to playlist
- In playlist: n/P for next/prev, f/b for seek forward/backward
- Update which-key descriptions

Code Quality:
- Use music-dir constant from user-constants.el (not hardcoded path)
- Add (require 'user-constants) for proper dependency
- Update commentary to reflect MPV backend

Test Fixes:
- Fix 8 failing append-track tests
- Update test mock data to use cj/music-root for portability
- All 104 music-config tests now passing

Benefits:
- No daemon to start/stop/manage
- Simpler architecture (one process vs MPD+EMMS)
- Streaming radio URLs work out of the box
- Better path consistency across codebase

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
