<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rsplayer/TODO.md, branch main</title>
<subtitle>Daemon focused CLI music player
</subtitle>
<id>https://git.2137697.xyz/rsplayer/atom?h=main</id>
<link rel='self' href='https://git.2137697.xyz/rsplayer/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/'/>
<updated>2026-11-02T12:36:45Z</updated>
<entry>
<title>todo: config caching is done</title>
<updated>2026-11-02T12:36:45Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-11-02T12:36:45Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=a25f660e4a48123e015d75a463a1660f87d4d6b4'/>
<id>urn:sha1:a25f660e4a48123e015d75a463a1660f87d4d6b4</id>
<content type='text'>
</content>
</entry>
<entry>
<title>state: persist the queue and pick up where playback stopped</title>
<updated>2026-11-02T12:12:48Z</updated>
<author>
<name>salmonik</name>
<email>salmonik@tuta.io</email>
</author>
<published>2026-11-02T12:12:48Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=863b4017714130f042f993e7c9d0f3f8adee22bf'/>
<id>urn:sha1:863b4017714130f042f993e7c9d0f3f8adee22bf</id>
<content type='text'>
The queue, its shuffle order and whether playback was running are written to
~/.local/state/rsplayer/state.json whenever they change, and on shutdown, then
restored at daemon start. Tracks that disappeared from disk are dropped
instead of failing on play.

`rsp resume`/`rsp toggle` now start the restored track when nothing is loaded
into the engine yet, which is the state right after a restart with a queue
that was paused.
</content>
</entry>
<entry>
<title>dirty, broken commit</title>
<updated>2026-06-03T22:21:46Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-06-03T22:21:46Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=1e48765ab39a679abcc4eac6927ad3bb58f7b438'/>
<id>urn:sha1:1e48765ab39a679abcc4eac6927ad3bb58f7b438</id>
<content type='text'>
</content>
</entry>
<entry>
<title>add licensing</title>
<updated>2026-05-26T14:54:47Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-05-26T14:54:47Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=337a0ec8a55692f44031b00391a48a7b4b8c71b6'/>
<id>urn:sha1:337a0ec8a55692f44031b00391a48a7b4b8c71b6</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add scrobbling support (Last.fm + ListenBrainz) and rsp settings reload</title>
<updated>2026-05-16T09:43:32Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-05-16T09:43:32Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=04add15691578316ff3da5b5a07d05b314488370'/>
<id>urn:sha1:04add15691578316ff3da5b5a07d05b314488370</id>
<content type='text'>
- Full Last.fm API implementation with MD5 signing (track.updateNowPlaying, track.scrobble)
- Full ListenBrainz API implementation (/1/submit-listens for playing_now and single)
- ScrobbleState in daemon tracking track, start time, and unix timestamp per play
- Scrobble threshold: ≥30s play AND (≥half duration OR ≥4 min)
- Duration extraction from symphonia codec params into AudioMetadata and Track
- Token validation at daemon startup and on config change
- ListenBrainz token valid (user: Salmonium) command to re-read config from disk (avoids token in shell history)
- Desktop notifications for token validation results
- Empty-credential filtering (empty string = no-op)
</content>
</entry>
<entry>
<title>Add display_format config, fix restart command, clean up config code</title>
<updated>2026-05-11T14:25:49Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-05-11T14:25:49Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=455ec54613230f4004a24f8d2798fb0084e00cb4'/>
<id>urn:sha1:455ec54613230f4004a24f8d2798fb0084e00cb4</id>
<content type='text'>
- Add display_format option with get/set/list/unset for customizing track display
- Add Track::format() supporting $ARTIST, $ALBUM, $TRACK variables
- Update queue, status, notifications to use display_format
- Fix restart command using wrong subcommand 'start' -&gt; 'start-daemon'
- Remove socket_path from config (now computed at runtime from XDG_RUNTIME_DIR)
- Consolidate duplicate save() and save_all() into single save()
- Fix redundant .clone().clone() in config.rs
- Add todo item for caching config in daemon hot paths
</content>
</entry>
<entry>
<title>Fix album shuffle - shuffle tracks when adding in album mode</title>
<updated>2026-05-09T23:09:31Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-05-09T23:09:31Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=5320c6d08c13c5eb40b0431502b0c8b8d04da561'/>
<id>urn:sha1:5320c6d08c13c5eb40b0431502b0c8b8d04da561</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add shuffle restore tests, remove debug prints, update TODO</title>
<updated>2026-05-09T22:37:43Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-05-09T22:37:43Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=add0ace8f7b3de69679436aba80b1c7c7546633f'/>
<id>urn:sha1:add0ace8f7b3de69679436aba80b1c7c7546633f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add TODO for major rewrite phases</title>
<updated>2026-05-09T13:12:18Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-05-09T13:12:18Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=b41b4567ad0de547e900c90465f8d61a81108029'/>
<id>urn:sha1:b41b4567ad0de547e900c90465f8d61a81108029</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fix shuffle first song not being shuffled</title>
<updated>2026-05-07T23:12:31Z</updated>
<author>
<name>salmonik</name>
<email>raisersoft@proton.me</email>
</author>
<published>2026-05-07T23:12:31Z</published>
<link rel='alternate' type='text/html' href='https://git.2137697.xyz/rsplayer/commit/?id=0f00616dca071750381234b5c59c8ec1e71b28ed'/>
<id>urn:sha1:0f00616dca071750381234b5c59c8ec1e71b28ed</id>
<content type='text'>
update_shuffle_indices now shuffles all indices when position is 0
(no tracks have been played yet), so the first track played is random
instead of always being tracks[0]. Directory playback now uses
q.current() to pick the first track, resolving through shuffled indices
when shuffle is active.

Also pins notify-rust version in Cargo.toml and removes PLAN.md
(superseded by TODO.md).
</content>
</entry>
</feed>
