<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules/music-config.el, branch v0.7.2</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=v0.7.2</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=v0.7.2'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<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/commit/?id=6cb923b4fb9ae66258a9eeef0d67d7e950daa737'/>
<id>urn:sha1:6cb923b4fb9ae66258a9eeef0d67d7e950daa737</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/commit/?id=94a8221668c3ce96daf7c3b062c5071c03bb20b4'/>
<id>urn:sha1:94a8221668c3ce96daf7c3b062c5071c03bb20b4</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/commit/?id=699f5ba8e51a90272bf80191eae72d84d7dbb71a'/>
<id>urn:sha1:699f5ba8e51a90272bf80191eae72d84d7dbb71a</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/commit/?id=17050d2ebbe926894d10b540e346ae85dae4e464'/>
<id>urn:sha1:17050d2ebbe926894d10b540e346ae85dae4e464</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/commit/?id=1242a731cbe9ffc8f223ce82795b3cd8f79d1216'/>
<id>urn:sha1:1242a731cbe9ffc8f223ce82795b3cd8f79d1216</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/commit/?id=f5955467babd5995b394d57e1f102ff221b6cf85'/>
<id>urn:sha1:f5955467babd5995b394d57e1f102ff221b6cf85</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/commit/?id=1c50845d4fd6c1f6ea44e23c177fecc0f2386b93'/>
<id>urn:sha1:1c50845d4fd6c1f6ea44e23c177fecc0f2386b93</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/commit/?id=4d25d607c73f4e98c51627019d4ea099f3fd00f4'/>
<id>urn:sha1:4d25d607c73f4e98c51627019d4ea099f3fd00f4</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/commit/?id=5e3a68c396a932f01cf85e72cd3689a2392088e7'/>
<id>urn:sha1:5e3a68c396a932f01cf85e72cd3689a2392088e7</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]
</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/commit/?id=b7d6310eb6eb866bc22a425e1851ac7147423412'/>
<id>urn:sha1:b7d6310eb6eb866bc22a425e1851ac7147423412</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
</content>
</entry>
</feed>
