- One profile for every video source. Quality is read from the release name / filename — choose what you'll accept, then how to break ties.
+ One profile for every video source (slskd · torrent · usenet). Quality is read from the release name — pick the ladder you'll accept, where to stop upgrading, what to reject outright, then the soft tie-breakers.
-
Resolutions to accept toggle on what you want · order = preference (best first)
-
+
Quality ladder toggle what you'll accept · rank best→worst with the arrows
+
-
Preferred source tie-breaker when two releases match the same resolution
-
+
Upgrade until once the library holds this tier (or better) stop grabbing upgrades
+
+
+
+
Never grab hard rejects — skipped no matter what else matches
+
+
+
+
Preferences soft tie-breakers — they rank candidates, they never reject on their own
+
+
+ Codec
+
+
+
+
+
+
+
+ HDR
+
+
+
+
+
+
+
+ Audio
+
+
+
+
+
+
+
+
+
-
Codec
-
-
-
-
-
+
Min size per item No limit
+
+
+
+
Max size per item No limit
+
-
-
-
Max size per item No limit
-
-
-
diff --git a/webui/static/video/video-settings.js b/webui/static/video/video-settings.js
index b5453232..0e9086f9 100644
--- a/webui/static/video/video-settings.js
+++ b/webui/static/video/video-settings.js
@@ -19,8 +19,18 @@
var QUALITY_URL = '/api/video/downloads/quality';
var SLSKD_URL = '/api/video/downloads/slskd';
var _videoQuality = null;
- var RES_LABEL = { '2160p': '4K (2160p)', '1080p': '1080p', '720p': '720p', '480p': '480p (SD)' };
- var SRC_LABEL = { 'bluray': 'BluRay', 'web-dl': 'WEB-DL', 'webrip': 'WEBRip', 'hdtv': 'HDTV' };
+ // Pretty labels for the source×resolution quality ladder (keys come from the backend).
+ var TIER_LABEL = {
+ 'remux-2160p': 'Remux · 4K', 'bluray-2160p': 'BluRay · 4K', 'web-2160p': 'WEB · 4K',
+ 'remux-1080p': 'Remux · 1080p', 'bluray-1080p': 'BluRay · 1080p', 'web-1080p': 'WEB-DL · 1080p',
+ 'webrip-1080p': 'WEBRip · 1080p', 'hdtv-1080p': 'HDTV · 1080p',
+ 'bluray-720p': 'BluRay · 720p', 'web-720p': 'WEB-DL · 720p', 'hdtv-720p': 'HDTV · 720p',
+ 'dvd': 'DVD', 'sdtv': 'SDTV'
+ };
+ var REJECT_LABEL = {
+ 'cam': 'CAM / TS', 'screener': 'Screener', 'workprint': 'Workprint', '3d': '3D', 'x264': 'x264 / AVC'
+ };
+ var REJECT_ORDER = ['cam', 'screener', 'workprint', '3d', 'x264'];
function esc(s) {
return String(s == null ? '' : s).replace(/&/g, '&').replace(//g, '>');
@@ -442,70 +452,89 @@
.catch(function () { /* ignore */ });
}
+ function _vqSizeLabel(id, v) {
+ var lab = document.getElementById(id);
+ if (lab) lab.textContent = v ? (v + ' GB') : 'No limit';
+ }
+
+ function _vqSeg(id, attr, value) {
+ var seg = document.getElementById(id);
+ if (!seg) return;
+ Array.prototype.forEach.call(seg.querySelectorAll('[' + attr + ']'), function (b) {
+ b.classList.toggle('active', b.getAttribute(attr) === value);
+ });
+ }
+
function renderQuality() {
var p = _videoQuality;
if (!p) return;
- var resHost = document.getElementById('vq-resolution-rows');
- if (resHost) {
- var keys = Object.keys(p.resolutions).sort(function (a, b) {
- return p.resolutions[a].priority - p.resolutions[b].priority;
- });
- resHost.innerHTML = keys.map(function (k, i) {
- var r = p.resolutions[k];
- return '