scheduler: smart auto-scroll replaces separate scroll lock checkbox; lidarr: allow single-seed candidates

Auto Scroll now pauses automatically when user scrolls up and resumes
when they reach the bottom — no separate Scroll Lock needed.

Lidarr discovery no longer hard-skips single-seed candidates; they
score low on breadth but can still reach threshold on merit.
This commit is contained in:
Gmer4Lfe
2026-05-24 21:40:03 -04:00
parent 253d5bf2e1
commit 1540c62d3a
2 changed files with 14 additions and 31 deletions
-6
View File
@@ -571,12 +571,6 @@ for candidate in "${!CANDIDATE_SCORE[@]}"; do
days_ago=0
fi
if (( seed_count < 2 )); then
log " $ICON_SKIP Single-seed candidate skipped: $candidate"
REJECT_LIST+=("0|${candidate}|${seed_count}|0|single-seed skip")
continue
fi
affinity_s=$(_affinity_score "$raw_score")
breadth_s=$(_breadth_score "$seed_count")
@@ -177,12 +177,9 @@ foreach ($tree as $orch) {
<span id="vv-log-dot" style="display:none;width:8px;height:8px;border-radius:50%;background:#4caf50;flex-shrink:0;"></span>
</div>
<div style="display:flex;align-items:center;gap:12px;">
<label id="vv-auto-scroll-label" class="vv-log-label" title="Auto-scroll to newest line" style="display:none">
<label id="vv-auto-scroll-label" class="vv-log-label" title="Auto-scroll to newest line (pauses when you scroll up, resumes at bottom)" style="display:none">
<input type="checkbox" id="vv-auto-scroll" checked> <span>Auto Scroll</span>
</label>
<label id="vv-scroll-lock-label" class="vv-log-label" title="Lock viewport — cannot scroll while active" style="display:none">
<input type="checkbox" id="vv-scroll-lock" onchange="vvToggleScrollLock(this)"> <span>Scroll Lock</span>
</label>
<label id="vv-invert-log-label" class="vv-log-label" title="Show newest lines at top" style="display:none">
<input type="checkbox" id="vv-invert-log" onchange="vvToggleInvert(this)"> <span>Invert</span>
</label>
@@ -365,8 +362,11 @@ function vvShowLogMode(id) {
document.getElementById('vv-delete-script-btn').style.display = 'none';
document.getElementById('vv-confform').style.display = 'none';
document.getElementById('vv-auto-scroll-label').style.display = '';
document.getElementById('vv-scroll-lock-label').style.display = '';
document.getElementById('vv-invert-log-label').style.display = '';
document.getElementById('vv-auto-scroll').checked = true;
const _pre = document.getElementById('vv-log-pre');
_pre.removeEventListener('scroll', vvOnLogScroll);
_pre.addEventListener('scroll', vvOnLogScroll);
document.getElementById('vv-save-schedule-btn').disabled = false;
document.getElementById('vv-save-schedule-btn').style.opacity = '';
const name = id.replace(/\.sh$/, '').split('/').pop();
@@ -379,17 +379,11 @@ function vvRestoreLastLog() {
if (last && document.querySelector('[data-id="' + CSS.escape(last) + '"]')) vvOpenRight(last);
}
function vvToggleScrollLock(cb) {
document.getElementById('vv-log-pre').style.overflowY = cb.checked ? 'hidden' : '';
localStorage.setItem('vv-scroll-lock', cb.checked ? '1' : '0');
}
function vvRestoreScrollLock() {
const val = localStorage.getItem('vv-scroll-lock');
const on = val === null ? true : val === '1';
const cb = document.getElementById('vv-scroll-lock');
cb.checked = on;
document.getElementById('vv-log-pre').style.overflowY = on ? 'hidden' : '';
function vvOnLogScroll() {
const pre = document.getElementById('vv-log-pre');
const atBottom = pre.scrollHeight - pre.scrollTop - pre.clientHeight < 20;
const cb = document.getElementById('vv-auto-scroll');
if (cb) cb.checked = atBottom;
}
function vvToggleInvert(cb) {
@@ -429,10 +423,11 @@ function vvBackToSuggestions() {
document.getElementById('vv-restore-btn').style.display = '';
}
document.getElementById('vv-auto-scroll-label').style.display = 'none';
document.getElementById('vv-scroll-lock-label').style.display = 'none';
document.getElementById('vv-invert-log-label').style.display = 'none';
document.getElementById('vv-auto-scroll').checked = true;
vvRestoreScrollLock();
const _preBack = document.getElementById('vv-log-pre');
_preBack.removeEventListener('scroll', vvOnLogScroll);
_preBack.style.overflowY = '';
document.getElementById('vv-log-title').textContent = 'Suggested Schedules';
document.getElementById('vv-log-ts').textContent = '';
document.getElementById('vv-log-dot').style.display = 'none';
@@ -464,16 +459,13 @@ function vvFetchRight() {
const pre = document.getElementById('vv-log-pre');
const ts = document.getElementById('vv-log-ts');
const autoScroll = document.getElementById('vv-auto-scroll').checked;
const scrollLock = document.getElementById('vv-scroll-lock').checked;
const invert = document.getElementById('vv-invert-log').checked;
const savedScroll = pre.scrollTop;
if (!d.ok) { pre.textContent = '✗ ' + (d.error ?? 'Error'); return; }
const content = d.content || '';
vvSetLogBtnState(vvActiveId, content.trim().length > 0);
pre.textContent = content.trim() ? (invert ? content.split('\n').reverse().join('\n') : content) : '(no log yet)';
if (scrollLock) {
requestAnimationFrame(() => { pre.scrollTop = savedScroll; });
} else if (autoScroll) {
if (autoScroll) {
pre.scrollTop = invert ? 0 : pre.scrollHeight;
} else {
requestAnimationFrame(() => { pre.scrollTop = savedScroll; });
@@ -672,7 +664,6 @@ function vvShowEditorMode(title) {
document.getElementById('vv-save-script-btn').style.display = '';
document.getElementById('vv-clear-btn').style.display = 'none';
document.getElementById('vv-auto-scroll-label').style.display = 'none';
document.getElementById('vv-scroll-lock-label').style.display = 'none';
document.getElementById('vv-invert-log-label').style.display = 'none';
document.getElementById('vv-log-title').textContent = title;
document.getElementById('vv-log-ts').textContent = '';
@@ -732,7 +723,6 @@ function vvShowConfMode(title) {
document.getElementById('vv-delete-script-btn').style.display = 'none';
document.getElementById('vv-clear-btn').style.display = 'none';
document.getElementById('vv-auto-scroll-label').style.display = 'none';
document.getElementById('vv-scroll-lock-label').style.display = 'none';
document.getElementById('vv-invert-log-label').style.display = 'none';
document.getElementById('vv-log-title').textContent = title;
document.getElementById('vv-log-ts').textContent = '';
@@ -825,7 +815,6 @@ function vvToggleSugBlock(bi) {
<script>
requestAnimationFrame(function() {
vvRestoreScrollLock();
vvRestoreInvert();
const last = localStorage.getItem('vv-last-job');
if (last && document.querySelector('[data-id="' + CSS.escape(last) + '"]')) {