The batch guidance optimised for parallelism and judgement and was nearly silent on what actually gets you blocked on Soulseek, which is the thing an agent driving this unattended is most likely to walk into. Rewritten around the risk, in the order it bites: - Sharing nothing is the commonest reason to be banned, so `shares status` is now a precondition: if files is 0, say so before downloading anything. - Queueing many files at once from one person reads as abuse to them. Subagents now report their pick and wait, because only the main agent can see every pick and resolve two subagents landing on the same peer. The batch form gets the matching rule: interleave the lines so consecutive ones name different users, since the workers take them in order. - Searches are rate-limited by the server, so never re-run a query; pick again from the results already held. - A failed transfer means take the next candidate, not retry the same peer. Also adds the strategy for an album, which fresh agents reading the previous draft worked out for themselves and which is both faster and safer: search once, browse whoever has most of it, and only search per-track for the remainder. Checked against agents given only this file: 2/2 verify shares first, coordinate peers, and refuse both the retry loop and the repeat search.
soulseek-rs
A Soulseek client for the terminal: a full-screen TUI, and a one-shot command surface built for scripts and agents.
Website: https://re-invention.nl/soulseek-rs/
Installation
brew install michel/tap/soulseek-rs # macOS and Linux, prebuilt
cargo install soulseek-rs # anywhere with a Rust toolchain
Usage
Run it with no subcommand for the interactive TUI:
soulseek-rs
Anything else is a one-shot command that runs headless. stdout carries records only, stderr carries progress, and the exit code carries the verdict:
soulseek-rs search <QUERY> # print matching files
soulseek-rs get <QUERY> # search, pick the best, download
soulseek-rs download <USER> <PATH> # fetch one known file
soulseek-rs download --stdin # fetch files listed on stdin
soulseek-rs browse <USER> # list a user's shared files
soulseek-rs serve [--follow] # stay online sharing, stream uploads
soulseek-rs whoami # confirm credentials and connection
soulseek-rs user <NAME> # a peer's status and share counts
soulseek-rs room list|say|users|listen
soulseek-rs message send|read
soulseek-rs shares list|add|remove|status|reindex
soulseek-rs config path|list|get|set
soulseek-rs portmap # test automatic port mapping
soulseek-rs completions install # tab completion for bash/zsh/fish
Add --json for newline-delimited JSON instead of tab-separated text, so
commands compose:
soulseek-rs search "rjd2" --json \
| jq -c 'select(.size > 5000000 and .free_slot)' \
| soulseek-rs download --stdin
Exit codes: 0 success, 2 usage or config, 3 connect or login, 4 nothing
found, 5 timed out, 6 transfer failed, 7 session lost mid-command, 1
unexpected error.
The full README documents every
command, record shape, flag, environment variable and config.toml key.
Building from Source
git clone https://github.com/michel/soulseek-rs.git
cd soulseek-rs
cargo build --release
Library
To build your own Soulseek client, use the soulseek-rs-lib crate: the protocol implementation this client is built on.