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:
@@ -571,12 +571,6 @@ for candidate in "${!CANDIDATE_SCORE[@]}"; do
|
|||||||
days_ago=0
|
days_ago=0
|
||||||
fi
|
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")
|
affinity_s=$(_affinity_score "$raw_score")
|
||||||
breadth_s=$(_breadth_score "$seed_count")
|
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>
|
<span id="vv-log-dot" style="display:none;width:8px;height:8px;border-radius:50%;background:#4caf50;flex-shrink:0;"></span>
|
||||||
</div>
|
</div>
|
||||||
<div style="display:flex;align-items:center;gap:12px;">
|
<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>
|
<input type="checkbox" id="vv-auto-scroll" checked> <span>Auto Scroll</span>
|
||||||
</label>
|
</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">
|
<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>
|
<input type="checkbox" id="vv-invert-log" onchange="vvToggleInvert(this)"> <span>Invert</span>
|
||||||
</label>
|
</label>
|
||||||
@@ -365,8 +362,11 @@ function vvShowLogMode(id) {
|
|||||||
document.getElementById('vv-delete-script-btn').style.display = 'none';
|
document.getElementById('vv-delete-script-btn').style.display = 'none';
|
||||||
document.getElementById('vv-confform').style.display = 'none';
|
document.getElementById('vv-confform').style.display = 'none';
|
||||||
document.getElementById('vv-auto-scroll-label').style.display = '';
|
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-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').disabled = false;
|
||||||
document.getElementById('vv-save-schedule-btn').style.opacity = '';
|
document.getElementById('vv-save-schedule-btn').style.opacity = '';
|
||||||
const name = id.replace(/\.sh$/, '').split('/').pop();
|
const name = id.replace(/\.sh$/, '').split('/').pop();
|
||||||
@@ -379,17 +379,11 @@ function vvRestoreLastLog() {
|
|||||||
if (last && document.querySelector('[data-id="' + CSS.escape(last) + '"]')) vvOpenRight(last);
|
if (last && document.querySelector('[data-id="' + CSS.escape(last) + '"]')) vvOpenRight(last);
|
||||||
}
|
}
|
||||||
|
|
||||||
function vvToggleScrollLock(cb) {
|
function vvOnLogScroll() {
|
||||||
document.getElementById('vv-log-pre').style.overflowY = cb.checked ? 'hidden' : '';
|
const pre = document.getElementById('vv-log-pre');
|
||||||
localStorage.setItem('vv-scroll-lock', cb.checked ? '1' : '0');
|
const atBottom = pre.scrollHeight - pre.scrollTop - pre.clientHeight < 20;
|
||||||
}
|
const cb = document.getElementById('vv-auto-scroll');
|
||||||
|
if (cb) cb.checked = atBottom;
|
||||||
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 vvToggleInvert(cb) {
|
function vvToggleInvert(cb) {
|
||||||
@@ -429,10 +423,11 @@ function vvBackToSuggestions() {
|
|||||||
document.getElementById('vv-restore-btn').style.display = '';
|
document.getElementById('vv-restore-btn').style.display = '';
|
||||||
}
|
}
|
||||||
document.getElementById('vv-auto-scroll-label').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-invert-log-label').style.display = 'none';
|
||||||
document.getElementById('vv-auto-scroll').checked = true;
|
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-title').textContent = 'Suggested Schedules';
|
||||||
document.getElementById('vv-log-ts').textContent = '';
|
document.getElementById('vv-log-ts').textContent = '';
|
||||||
document.getElementById('vv-log-dot').style.display = 'none';
|
document.getElementById('vv-log-dot').style.display = 'none';
|
||||||
@@ -464,16 +459,13 @@ function vvFetchRight() {
|
|||||||
const pre = document.getElementById('vv-log-pre');
|
const pre = document.getElementById('vv-log-pre');
|
||||||
const ts = document.getElementById('vv-log-ts');
|
const ts = document.getElementById('vv-log-ts');
|
||||||
const autoScroll = document.getElementById('vv-auto-scroll').checked;
|
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 invert = document.getElementById('vv-invert-log').checked;
|
||||||
const savedScroll = pre.scrollTop;
|
const savedScroll = pre.scrollTop;
|
||||||
if (!d.ok) { pre.textContent = '✗ ' + (d.error ?? 'Error'); return; }
|
if (!d.ok) { pre.textContent = '✗ ' + (d.error ?? 'Error'); return; }
|
||||||
const content = d.content || '';
|
const content = d.content || '';
|
||||||
vvSetLogBtnState(vvActiveId, content.trim().length > 0);
|
vvSetLogBtnState(vvActiveId, content.trim().length > 0);
|
||||||
pre.textContent = content.trim() ? (invert ? content.split('\n').reverse().join('\n') : content) : '(no log yet)';
|
pre.textContent = content.trim() ? (invert ? content.split('\n').reverse().join('\n') : content) : '(no log yet)';
|
||||||
if (scrollLock) {
|
if (autoScroll) {
|
||||||
requestAnimationFrame(() => { pre.scrollTop = savedScroll; });
|
|
||||||
} else if (autoScroll) {
|
|
||||||
pre.scrollTop = invert ? 0 : pre.scrollHeight;
|
pre.scrollTop = invert ? 0 : pre.scrollHeight;
|
||||||
} else {
|
} else {
|
||||||
requestAnimationFrame(() => { pre.scrollTop = savedScroll; });
|
requestAnimationFrame(() => { pre.scrollTop = savedScroll; });
|
||||||
@@ -672,7 +664,6 @@ function vvShowEditorMode(title) {
|
|||||||
document.getElementById('vv-save-script-btn').style.display = '';
|
document.getElementById('vv-save-script-btn').style.display = '';
|
||||||
document.getElementById('vv-clear-btn').style.display = 'none';
|
document.getElementById('vv-clear-btn').style.display = 'none';
|
||||||
document.getElementById('vv-auto-scroll-label').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-invert-log-label').style.display = 'none';
|
||||||
document.getElementById('vv-log-title').textContent = title;
|
document.getElementById('vv-log-title').textContent = title;
|
||||||
document.getElementById('vv-log-ts').textContent = '';
|
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-delete-script-btn').style.display = 'none';
|
||||||
document.getElementById('vv-clear-btn').style.display = 'none';
|
document.getElementById('vv-clear-btn').style.display = 'none';
|
||||||
document.getElementById('vv-auto-scroll-label').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-invert-log-label').style.display = 'none';
|
||||||
document.getElementById('vv-log-title').textContent = title;
|
document.getElementById('vv-log-title').textContent = title;
|
||||||
document.getElementById('vv-log-ts').textContent = '';
|
document.getElementById('vv-log-ts').textContent = '';
|
||||||
@@ -825,7 +815,6 @@ function vvToggleSugBlock(bi) {
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
requestAnimationFrame(function() {
|
requestAnimationFrame(function() {
|
||||||
vvRestoreScrollLock();
|
|
||||||
vvRestoreInvert();
|
vvRestoreInvert();
|
||||||
const last = localStorage.getItem('vv-last-job');
|
const last = localStorage.getItem('vv-last-job');
|
||||||
if (last && document.querySelector('[data-id="' + CSS.escape(last) + '"]')) {
|
if (last && document.querySelector('[data-id="' + CSS.escape(last) + '"]')) {
|
||||||
|
|||||||
Reference in New Issue
Block a user