Soulseek search: one query, no search options, and per-file durations discarded #271

Closed
opened 2026-09-26 21:05:01 +00:00 by yonlu · 1 comment
Owner

The Soulseek search path finds less than it could, and discards signal it already receives. Found in the same audit as #263.

  • One query, no fallback. SearchText() is Artist + " " + Album. Edition qualifiers such as "(Deluxe Edition)" or "Remastered", punctuation (Soulseek treats a term with a leading - as an exclusion), and "Various Artists" all cost results. The server also silently drops searches containing some banned terms.
  • No search options sent. The POST carries only {id, searchText}, so slskd's server-side defaults for timeout and response/file limits apply. My understanding is that these are a 15 s timeout and 100 responses, which is below our own 20 s wait; this needs verifying against the running version. maximumPeerQueueLength and minimumResponseFileCount could let slskd discard hopeless peers itself.
  • Every poll re-downloads every response. Polling uses ?includeResponses=true every second. The state alone would do, followed by one responses fetch at the end.
  • Per-file length is received and thrown away. Comparing duration against ExpectedTrack.LengthMillis is the strongest available signal for the right edition, correct alignment and truncated files.
  • freeUploadSlots appears to be a field slskd does not send.

Direction

  • A small, bounded query ladder with results merged and de-duplicated.
  • Explicit search options.
  • A state-only poll.
  • LengthMillis on CandidateFile, feeding a duration fit into the match score.
The Soulseek search path finds less than it could, and discards signal it already receives. Found in the same audit as #263. - **One query, no fallback.** `SearchText()` is `Artist + " " + Album`. Edition qualifiers such as "(Deluxe Edition)" or "Remastered", punctuation (Soulseek treats a term with a leading `-` as an exclusion), and "Various Artists" all cost results. The server also silently drops searches containing some banned terms. - **No search options sent.** The POST carries only `{id, searchText}`, so slskd's server-side defaults for timeout and response/file limits apply. My understanding is that these are a 15 s timeout and 100 responses, which is below our own 20 s wait; this needs verifying against the running version. `maximumPeerQueueLength` and `minimumResponseFileCount` could let slskd discard hopeless peers itself. - **Every poll re-downloads every response.** Polling uses `?includeResponses=true` every second. The state alone would do, followed by one responses fetch at the end. - **Per-file `length` is received and thrown away.** Comparing duration against `ExpectedTrack.LengthMillis` is the strongest available signal for the right edition, correct alignment and truncated files. - **`freeUploadSlots` appears to be a field slskd does not send.** ## Direction - A small, bounded query ladder with results merged and de-duplicated. - Explicit search options. - A state-only poll. - `LengthMillis` on `CandidateFile`, feeding a duration fit into the match score.
yonlu added the Kind/Enhancement
Priority
Medium
3
Platform/DesktopArea/Downloads
labels 2026-09-26 21:05:01 +00:00
yonlu self-assigned this 2026-09-26 21:07:59 +00:00
yonlu added the
Status
In Progress
label 2026-09-26 21:07:59 +00:00
Author
Owner

Taking this on fix/271-slskd-search-recall, stacked on #270. Approach: explicit slskd search options, a state-only poll with one responses fetch at the end (falling back to includeResponses if that endpoint is absent), a second normalised query run alongside the first with results merged, per-file durations carried into a duration fit in the match score, and the phantom freeUploadSlots removed.

Taking this on `fix/271-slskd-search-recall`, stacked on #270. Approach: explicit slskd search options, a state-only poll with one responses fetch at the end (falling back to `includeResponses` if that endpoint is absent), a second normalised query run alongside the first with results merged, per-file durations carried into a duration fit in the match score, and the phantom `freeUploadSlots` removed.
yonlu closed this issue 2026-09-27 01:45:21 +00:00
gitea-actions bot removed the
Status
In Progress
label 2026-09-27 01:47:27 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yonlu/yellowjacket#271