+ Where the video side lands downloads and where it moves finished files — SEPARATE from your Music paths.
+
+
+
+
+
+
+
+
+
+
Download Source
@@ -6025,95 +6039,89 @@
-
+
+
-
Hybrid order best-first; toggle off any you don't want
-
+
Use the arrows to order sources. Enable the ones you want — downloads try each enabled source in order.
+
+ app-wide soulseek.* config, not video.db. Collapsible; shown when soulseek
+ is active. Inner header/body carry no data-stg so the broad hide rule
+ doesn't catch them (the wrapping group is data-video-only). -->
-
Soulseek (slskd) Connection shared with Music
-
- These connect to your one slskd instance and are SHARED with the Music side — changing them here changes them for both.
+
+ ▼
+
Soulseek (slskd) Connection
+ shared with Music · URL, key, timeouts, peers
-
-
-
-
-
-
-
-
-
-
-
-
How long to search for results (15-300 seconds)
-
-
-
-
-
Extra time to wait for late results (5-60 seconds)
-
-
-
-
-
Forces a gap between consecutive searches (0 disables).
-
-
-
-
-
Ignore results from peers slower than this
-
-
-
-
-
Skip peers with a queue longer than this (0 = no limit)
-
-
-
-
-
Abandon stuck downloads after this many minutes
-
-
-
-
-
Video Download Folders
-
- Where the video side lands downloads and where it moves finished files. These are SEPARATE from your Music paths — point them at wherever your video library lives.
-
-
-
-
-
-
-
-
+
+
These connect to your one slskd instance and are SHARED with the Music side — changing them here changes them for both.
+
+
+
+
+
+
+
+
+
+
+
+
How long to search for results (15-300 seconds)
+
+
+
+
+
Extra time to wait for late results (5-60 seconds)
+
+
+
+
+
Forces a gap between consecutive searches (0 disables).
+
+
+
+
+
Ignore results from peers slower than this
+
+
+
+
+
Skip peers with a queue longer than this (0 = no limit)
+
+
+
+
+
Abandon stuck downloads after this many minutes
+
+
Video Quality Profile
- One profile across slskd, torrent & usenet — quality is read from the release name / filename. Toggle the tiers you want and order them best-first.
+ One profile for every video source. Quality is read from the release name / filename — choose what you'll accept, then how to break ties.
-
Resolution order best-first with the arrows
+
Resolutions to accept toggle on what you want · order = preference (best first)
-
Source preference
+
Preferred source tie-breaker when two releases match the same resolution
-
+
Codec
diff --git a/webui/static/video/video-settings.js b/webui/static/video/video-settings.js
index 851c23ad..81019fb8 100644
--- a/webui/static/video/video-settings.js
+++ b/webui/static/video/video-settings.js
@@ -260,6 +260,7 @@
// ── Downloads tab: folders + source mode + hybrid chain ──
var VIDEO_SOURCES = ['soulseek', 'torrent', 'usenet'];
var SRC_DL_LABEL = { soulseek: 'Soulseek', torrent: 'Torrent', usenet: 'Usenet' };
+ var SRC_DL_EMOJI = { soulseek: '🎵', torrent: '🧲', usenet: '📰' };
var _videoMode = 'soulseek';
var _videoHybrid = ['soulseek'];
@@ -297,33 +298,29 @@
.catch(function () { /* ignore */ });
}
- // Hybrid chain: enabled sources (ordered) + disabled ones appended. No
- // album-level/track-level distinction — that's a music-only concept.
+ // Hybrid chain — reuses music's .hybrid-source-item markup/CSS for visual
+ // parity. Enabled sources (ordered, numbered) first, disabled ones appended.
+ // No album-level/track-level badge — that's a music-only concept.
function renderVideoHybrid() {
var host = document.getElementById('video-hybrid-rows');
if (!host) return;
var enabled = _videoHybrid.filter(function (s) { return VIDEO_SOURCES.indexOf(s) >= 0; });
var disabled = VIDEO_SOURCES.filter(function (s) { return enabled.indexOf(s) < 0; });
- var rows = enabled.map(function (s, i) {
- return '
' +
- '' +
- '' +
- '' +
+ var visual = enabled.concat(disabled);
+ host.innerHTML = visual.map(function (s) {
+ var on = enabled.indexOf(s) >= 0;
+ var i = enabled.indexOf(s);
+ return '
';
- }));
- host.innerHTML = rows.join('');
+ }).join('');
}
function moveVH(s, dir) {
diff --git a/webui/static/video/video-side.css b/webui/static/video/video-side.css
index 3bb5dee5..ec554f39 100644
--- a/webui/static/video/video-side.css
+++ b/webui/static/video/video-side.css
@@ -147,10 +147,12 @@ body[data-side="video"] .settings-group[data-stg="connections"]:not([data-video-
display: none !important;
}
/* The Downloads tab is almost entirely music-specific (streaming sources, music
- quality profile, retry logic). Hide the music download sections on the video
- side; the video-only ones (folders, video hybrid, video quality) replace them.
+ quality profile, retry logic). Hide EVERY music download element on the video
+ side — not just .settings-group, but also the quality-profile tile + the
+ collapsible section headers/bodies (#quality-profile-tile, .settings-section-*).
+ The video-only ones (folders, video source/hybrid, video quality) replace them.
The shared "Indexers & Downloaders" tab is NOT hidden — it's identical for both. */
-body[data-side="video"] .settings-group[data-stg="downloads"]:not([data-video-only]) {
+body[data-side="video"] [data-stg="downloads"]:not([data-video-only]) {
display: none !important;
}