The project was renamed to Sockseek! I couldn't come up with a better name.
🧦
Why rename (again)?
The old-old name "slsk-batchdl" was annoying to say and type, so I shortened it to sldl. Now, the project is moving from a short-lived download utility towards becoming a fully-featured persistent Soulseek client. "sldl" made it sound like the former, hence the rename.
Plan for v4
Sockseek will become a full self-hosted Soulseek client supporting the usual features (sharing, user browsing, chats), potentially also packaged as a desktop app.
Why?
v3.0.0
v3 is effectively a rewrite since v2.6.0. The biggest change is a shift from a sequential(-ish) download utility to a persistent job engine: downloads now run as concurrent, cancellable workflows that can be driven locally, through a remote CLI, or over an HTTP/SignalR API. Existing CLI workflows are preserved (possibly under different names), and the release also includes substantial improvements to search ranking, fuzzy matching, live progress rendering, and config/profile handling. See the breaking changes section before upgrading.
Daemon mode, remote CLI, and API
- Added
sockseek daemon, an HTTP/SignalR daemon for running Sockseek persistently. - Added
--remote <url>, allowing the CLI to submit and control work through a running daemon instead of doing everything in-process. - Added the
Sockseek.Apiclient package/contracts for .NET integrations. - Added OpenAPI docs/specs for the HTTP API.
- Added API support for jobs, workflows, profiles, search/download submissions, result projections, cancellation, manual completion, retrying the next candidate, folder retrieval, and live event updates.
- Added
--no-listen,--server-ip, and--server-port. - Added
--shared-filesand--shared-foldersfor advertised share counts. Sockseek still does not actually share files.
New job engine
- Replaced the old linear download flow with a job/workflow engine.
- Songs, albums, aggregate downloads, album aggregate downloads, searches, extraction, and folder retrieval are now separate job types and can run concurrently.
- Added per-job and per-workflow cancellation.
- Added manual “try next candidate” support.
- Added better fallback handling when a song, album, aggregate result, or album-aggregate result fails.
- Album retries now respect retry limits more consistently.
- Added
--concurrent-jobsfor limiting concurrent leaf jobs. - Added
--concurrent-searchesfor limiting concurrent Soulseek searches. - Added
--concurrent-extractorsfor limiting metadata/list extraction work. - Now reconnects with exponential backoff.
Search, matching, and ranking
- Reworked result sorting/ranking for tracks, albums, aggregate tracks, and aggregate albums.
- Added fuzzy/normalized matching to better handle punctuation, casing, special characters, fullwidth characters, and similar title/artist/album differences.
- Improved strict artist/album/title behavior.
- Improved album folder matching and grouping.
- Album audio-quality requirements (format, br, sr, bd) now apply as coverage, meaning that a folder where 90% of the files satisfy a given audio requirement is ranked above a 10% folder.
- Added
--strict-album-quality, which requires every audio file to satisfy the quality constraints. - Required track-length filtering now defaults to a 3-second tolerance when source length metadata is available. Previously, the 3-second tolerance was only a ranking preference. Set
--length-tol -1to disable required length filtering. - Aggregate searches now handle already-existing and skipped tracks more reliably.
- Added
--allowed-usersand--pref-allowed-users; like--banned-usersbut works as a whitelist. - Default
--search-timeoutwas reduced from 6000ms to 5000ms.
CLI, progress UI, and logging
- Rewrote live CLI rendering using Spectre.Console.
- Fixed many progress rendering issues, including duplicated lines, bad redraws, wide/Asian/fullwidth character handling, and noisy output.
- Jobs now show the number of search results while searching.
- Improved
--no-progressoutput. - Made live logs,
--log-filemore consistent and added many new logs. - Added
-vv/--tracefor trace-level logging. - Now distinguishes between "no Soulseek results" and "Soulseek results found, but none match required conditions".
- Added job shortcuts in the live UI:
ccancels a job or all jobs.ttries the next candidate for a job (useful when a download hangs and you don't want to wait for the stale timer).ishows detailed job information.
- Added a new shortcut
Sin interactive mode, which skips the current and all remaining prompts. - Changed interactive album prompt bindings: q and Esc now skip the current album instead of quitting. Q and S skip the current and all remaining new album prompts; retries for albums that were already accepted may still prompt.
- Now reports clearly when search rate limits are hit.
Extractors
- ⚠ Album mode is the new default for string inputs. Use
-s/--songor setsong = truein config to restore the old behavior. - Added
--upgrade-to-albumto upgrade a playlist of songs to a list of album downloads (previously done by--album). - Added
s:prefix for list input lines to treat it as a song download instead of album. - Fixed Spotify playlist extraction 403 (Forbidden) by @yramocan.
- Also updated the docs. Spotify now requires a premium account for API access.
Skipping, indexes, remove-from-source
- Album jobs are indexed at the album level (only) instead of indexing every internal child file.
- Aggregate and album-aggregate downloads now skip already-existing results more reliably.
--skip-check-condand--skip-check-pref-condnow work more consistently across skip modes.- Nested lists and CSV inputs now interact better with indexing/skipping.
- Fixed several
--remove-from-sourcecases for lists and CSV files. - CSV source cleanup now preserves headers.
Config, profiles, and paths
- Renamed the executable/config world from
sldltosockseek. - Config lookup now uses
sockseek.confundersockseekconfig directories. - Added
{configdir}path/name-format support. - Added
{outputdir}name-format support. - Reworked profile handling and auto-profile application.
- Auto-profiles are now applied more predictably per job.
- Many previously hidden or under-documented options are now included in help/docs.
- Improved config parsing, validation, and error messages.
On-complete and album fail actions
- Changed the on-complete syntax to be more readable.
- Added support for more on-complete run conditions.
- Removed
r:as stdout is now always read when possible. - Improved on-complete status and error reporting and fixed several bugs.
- Replaced
--failed-album-pathwith--incomplete-album-actionsupporting options move, keep, and delete options.
Headless/library usage, scripting
- Replaced hard process exits in more places with structured errors/cancellation.
- Added consistent CLI exit codes depending on result.
- Added JSON progress reporting with
--progress-jsonby @markst.
Build, packaging, docs, and license
- Project/assembly names were renamed to Sockseek.
- The codebase now targets .NET 10 and has been reorganized into multiple projects.
- Relicensed from GPL-3.0 to AGPL-3.0.
- Release tarballs now have proper permissions when packaged on Windows.
- Disabled assembly trimming because it can be unpredictable. As a result, all release binaries got larger.
- Bumped dependencies.
- Soulseek.NET now requires a unique minor version; Sockseek uses the
800850000-800859999range.
- Soulseek.NET now requires a unique minor version; Sockseek uses the
Breaking changes / migration notes
- The command and binary are now
sockseekinstead ofsldl. - Config files are now looked up as
sockseek.confinsockseekconfig directories. Existingsldlconfig files need to be moved. - Project/assembly/API names changed from
sldl/slsk-batchdltoSockseek. - The license changed from GPL-3.0 to AGPL-3.0.
- String/list string input defaults to album mode instead of song mode;
-s/--songadded. Addsong = trueto config to restore the old string/list default. --albumno longer upgrades song playlists to album lists, use--upgrade-to-albuminstead.--concurrent-downloads/--concurrent-processeswere removed. Use--concurrent-jobs,--concurrent-searches, and--concurrent-extractors.--album-parallel-searchand--album-parallel-search-countwere removed. Albums now run in parallel like every other job type.- The
--on-completesyntax was changed. --failed-album-pathwas removed. Use--incomplete-album-actioninstead.- The default max download retry count changed from 30 to 10.
- Auto-profiles can no longer contain engine-lifetime settings that cannot safely vary per job.
- The
{state}name-format value now uses the new job state names, such asDone, instead of the old download-state wording.