From 04688163671e73b89e249271eb197f77fdfd4a44 Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Wed, 20 May 2026 17:49:39 -0700 Subject: [PATCH] docs(downloads): docker mount heads-up for torrent / usenet sources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Torrent and usenet clients each download to their own folders (not Soulseek's). SoulSync needs read access to those paths to import the resulting files. Bare-metal setups work without configuration; Docker setups need volume mounts; remote downloader hosts need a network mount. - webui/index.html: orange warning card on the Indexers & Downloaders hero, listing the three deployment shapes (bare-metal / Docker / remote) and what each needs. - webui/static/style.css: ind-hero-warning rule set — warning-tone palette (amber on dark glass) so the card reads as advisory, not destructive. Inline ul + code styling for the bullet list inside. - docker-compose.yml: commented placeholder mounts under the existing IMPORTANT block for /downloads/torrents and /downloads/usenet. Same uncomment-and-edit pattern as the existing slskd helper block. Documents the in-container path must match what the torrent / usenet client reports as its save_path. --- docker-compose.yml | 14 ++++++++++++++ webui/index.html | 11 +++++++++++ webui/static/helper.js | 1 + webui/static/style.css | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index a2d8a0d4..74cdeb65 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -48,6 +48,20 @@ services: # - /path/to/music-library:/host/music:rw # Optional: Mount your music library for Plex/Jellyfin/Navidrome access # - /path/to/your/music:/music:ro + # + # ─── Torrent / Usenet download sources (Prowlarr integration) ──────── + # If you use the Torrent Only or Usenet Only download sources, SoulSync + # needs to read the files your torrent / usenet client downloads. The + # mount path INSIDE SoulSync must MATCH the save_path your torrent or + # usenet client reports — easiest is to use the same path on both + # sides. Uncomment + edit the host path to point at the client's + # download folder: + # - /path/to/qbittorrent/downloads:/downloads/torrents:rw + # - /path/to/sabnzbd/complete:/downloads/usenet:rw + # Then set the torrent client's save path to /downloads/torrents and + # SAB / NZBGet's complete folder to /downloads/usenet (or whatever + # in-container path you chose). Skip these if your downloader runs + # outside Docker and writes to a path already mounted above. extra_hosts: # Allow container to reach host services - "host.docker.internal:host-gateway" diff --git a/webui/index.html b/webui/index.html index 35147361..d638df41 100644 --- a/webui/index.html +++ b/webui/index.html @@ -4971,6 +4971,17 @@
Configure your Prowlarr instance to feed search results, and pick a torrent client and/or usenet client to handle the actual downloads. You only need to set up the protocols you actually use.
+
+
⚠️ Filesystem access required
+
+ Your torrent / usenet client downloads to its own folder (not Soulseek's). SoulSync needs read access to that folder to import the files. + +
+
diff --git a/webui/static/helper.js b/webui/static/helper.js index 27a60302..1a9d6913 100644 --- a/webui/static/helper.js +++ b/webui/static/helper.js @@ -3415,6 +3415,7 @@ function closeHelperSearch() { const WHATS_NEW = { '2.6.0': [ { unreleased: true }, + { title: 'Docker mount heads-up for torrent / usenet sources', desc: 'added an orange warning card on the Indexers & Downloaders tab explaining the filesystem-access requirement up front. torrent and usenet clients each download to their own folders (not Soulseek\'s), so SoulSync needs read access to those paths — works out of the box on bare-metal, needs a volume mount on Docker, needs SMB / NFS / rclone on remote-NAS setups. docker-compose.yml gained commented placeholder mounts for /downloads/torrents and /downloads/usenet that users can uncomment + edit to point at their qBit / SAB save folders.' }, { title: 'Torrent and Usenet downloads', desc: 'two new download sources live in the Download Source dropdown: Torrent Only (via Prowlarr) and Usenet Only (via Prowlarr). they reuse the Prowlarr + torrent client + usenet client you set up on the Indexers & Downloaders tab. searches go through Prowlarr filtered by protocol, picked releases get handed to your torrent client or usenet client, and the resulting files get walked through archive_pipeline (extracts .zip / .rar / .tar when the client didn\'t already do it) and handed to the matching pipeline. both sources are also available in hybrid mode alongside soulseek / youtube / tidal / etc. one caveat: SoulSync needs read access to the torrent / usenet client\'s save_path — works out of the box for everything-on-one-box setups, but remote downloader hosts will need a future sync step.' }, { title: 'Archive pipeline module (groundwork for torrent / usenet downloads)', desc: 'new core/archive_pipeline.py — walks a directory for audio files (recursive, case-insensitive extensions), extracts zip / tar / tar.gz / rar / 7z archives in-place (rar and 7z are optional deps that warn but don\'t crash if absent), and rejects any archive member trying to escape the destination via path traversal. shared helper the upcoming torrent and usenet download plugins both consume — usenet downloaders usually auto-extract, but the occasional torrent ships an album in a .rar and SoulSync handles it now. 21 unit tests cover the walker + zip + tar extraction + path-traversal protection.' }, { title: 'Indexers & Downloaders tab restyled with collapsible sections', desc: 'tab now opens with an intro hero card explaining the flow (indexers find releases → downloader fetches them → SoulSync imports) and folds the rest into three collapsible sections: Indexers, Torrent Client, Usenet Client. each section gets a per-service color accent (Prowlarr orange, torrent sky-blue, usenet violet), a status dot in the header (green when Test Connection succeeds, red on failure, grey before testing), and Lidarr-style indexer cards with protocol badges instead of the inline emoji list. Indexers section is open by default; the downloader sections start collapsed since not everyone uses both protocols.' }, diff --git a/webui/static/style.css b/webui/static/style.css index 6ba8a24d..2c24fcb2 100644 --- a/webui/static/style.css +++ b/webui/static/style.css @@ -3316,6 +3316,45 @@ body.helper-mode-active #dashboard-activity-feed:hover { line-height: 1.55; } +.ind-hero-warning { + margin-top: 14px; + padding: 12px 14px; + background: rgba(255, 165, 0, 0.06); + border: 1px solid rgba(255, 165, 0, 0.2); + border-radius: 10px; +} + +.ind-hero-warning-title { + font-size: 12px; + font-weight: 700; + color: #ffb155; + letter-spacing: 0.4px; + margin-bottom: 6px; +} + +.ind-hero-warning-body { + font-size: 12.5px; + color: rgba(255, 255, 255, 0.72); + line-height: 1.55; +} + +.ind-hero-warning-body ul { + margin: 6px 0 0 18px; + padding: 0; +} + +.ind-hero-warning-body li { + margin: 3px 0; +} + +.ind-hero-warning-body code { + font-family: 'SF Mono', Monaco, monospace; + font-size: 11.5px; + background: rgba(0, 0, 0, 0.3); + padding: 1px 5px; + border-radius: 3px; +} + /* Section-header status dots — Lidarr-style green/red/grey indicator */ .ind-status-dot { width: 9px;