github fiso64/sockseek v3.0.1

7 hours ago

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 later versions

Sockseek will become a full self-hosted Soulseek client supporting the usual features (sharing, user browsing, chats), maybe also packaged as a desktop app.

Why?
  1. The existing CLI is fine for full automation (like downloading a long playlist), but interactive mode can be done much better with a proper UI. Concurrent jobs are hard to represent or manage in a TUI.
  2. Sharing is caring, but there is no way to share your music through Sockseek right now.
  3. In addition to the existing grouping and ranking engine, we can add cool features not available in other clients, such as:
    • Wishlists with granular per-item conditions which can optionally auto-download matching results. This would basically be the existing list.txt input, run periodically on a schedule and with a nice GUI. Since list files support any other input, you could also use it to sync e.g., a YouTube playlist.
    • A "smart" search bar hooked up to a music database (like Musicbrainz) with a dropdown showing music suggestions on key press. Selecting a result would search for its canonical name and album track count.
    • Shared user playlists: Peer A could opt-in to making some of their playlists playable. Peer B would browse peer A, then Sockseek would detect the shared playlists and expose them in the UI with a builtin player.
    • Other experimental fun stuff.

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.Api client 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-files and --shared-folders for 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-jobs for limiting concurrent leaf jobs.
  • Added --concurrent-searches for limiting concurrent Soulseek searches.
  • Added --concurrent-extractors for 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 -1 to disable required length filtering.
  • Aggregate searches now handle already-existing and skipped tracks more reliably.
  • Added --allowed-users and --pref-allowed-users; like --banned-users but works as a whitelist.
  • Default --search-timeout was 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-progress output.
  • Made live logs, --log-file more consistent and added many new logs.
  • Added -vv / --trace for 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:
    • c cancels a job or all jobs.
    • t tries the next candidate for a job (useful when a download hangs and you don't want to wait for the stale timer).
    • i shows detailed job information.
  • Added a new shortcut S in 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/--song or set song = true in config to restore the old behavior.
  • Added --upgrade-to-album to 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-cond and --skip-check-pref-cond now work more consistently across skip modes.
  • Nested lists and CSV inputs now interact better with indexing/skipping.
  • Fixed several --remove-from-source cases for lists and CSV files.
  • CSV source cleanup now preserves headers.

Config, profiles, and paths

  • Renamed the executable/config world from sldl to sockseek.
  • Config lookup now uses sockseek.conf under sockseek config 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-path with --incomplete-album-action supporting 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-json by @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-800859999 range.

Breaking changes / migration notes

  • The command and binary are now sockseek instead of sldl.
  • Config files are now looked up as sockseek.conf in sockseek config directories. Existing sldl config files need to be moved.
  • Project/assembly/API names changed from sldl/slsk-batchdl to Sockseek.
  • The license changed from GPL-3.0 to AGPL-3.0.
  • String/list string input defaults to album mode instead of song mode; -s / --song added. Add song = true to config to restore the old string/list default.
  • --album no longer upgrades song playlists to album lists, use --upgrade-to-album instead.
  • --concurrent-downloads / --concurrent-processes were removed. Use --concurrent-jobs, --concurrent-searches, and --concurrent-extractors.
  • --album-parallel-search and --album-parallel-search-count were removed. Albums now run in parallel like every other job type.
  • The --on-complete syntax was changed.
  • --failed-album-path was removed. Use --incomplete-album-action instead.
  • 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 -1 to disable required length filtering.
  • 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 as Done, instead of the old download-state wording.

Don't miss a new sockseek release

NewReleases is sending notifications on new releases.