<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotemacs/modules/music-config.el, branch load-graph-classify-start</title>
<subtitle>My Emacs configuration
</subtitle>
<id>https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-start</id>
<link rel='self' href='https://git.cjennings.net/dotemacs/atom?h=load-graph-classify-start'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/'/>
<updated>2026-05-08T00:25:29+00:00</updated>
<entry>
<title>chore(modules): pass validate-modules in batch by adding requires</title>
<updated>2026-05-08T00:25:29+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-08T00:25:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/dotemacs/commit/?id=a41ef9774f6550da446a3ae8fbbcbcd5bf6c23c4'/>
<id>urn:sha1:a41ef9774f6550da446a3ae8fbbcbcd5bf6c23c4</id>
<content type='text'>
`make validate-modules` had 19 module-load failures, all the same shape: a module references a symbol or feature owned by another module without saying so. Production was fine because init.el orders requires correctly. The batch target loads each module in isolation, though, and surfaces the gap.

I added explicit `(require 'keybindings)` or `(require 'user-constants)` to each affected module. The requires are idempotent at runtime, so production load order is unchanged. For three optional packages (elpa-mirror, mu4e, org-contacts), I switched to `(require 'X nil t)` so the modules load cleanly when those packages aren't installed. The activation calls become no-ops in that case.

`make validate-modules` now reports 0 failures.
</content>
</entry>
<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>
</feed>
