Setup page: add full scheduler config (time, days, auto-download)
This commit is contained in:
@@ -70,6 +70,12 @@ async def setup_auth(req: SetupRequest):
|
||||
config.scheduler.enabled = req.scheduler_enabled
|
||||
if req.scheduler_interval_minutes is not None:
|
||||
config.scheduler.interval_minutes = req.scheduler_interval_minutes
|
||||
if req.scheduler_schedule_time is not None:
|
||||
config.scheduler.schedule_time = req.scheduler_schedule_time
|
||||
if req.scheduler_schedule_days is not None:
|
||||
config.scheduler.schedule_days = req.scheduler_schedule_days
|
||||
if req.scheduler_auto_download_after_rescan is not None:
|
||||
config.scheduler.auto_download_after_rescan = req.scheduler_auto_download_after_rescan
|
||||
|
||||
# Update logging configuration
|
||||
if req.logging_level:
|
||||
|
||||
@@ -62,7 +62,16 @@ class SetupRequest(BaseModel):
|
||||
default=True, description="Enable/disable scheduler"
|
||||
)
|
||||
scheduler_interval_minutes: Optional[int] = Field(
|
||||
default=60, ge=1, description="Scheduler interval in minutes"
|
||||
default=60, ge=1, description="Scheduler interval in minutes (legacy)"
|
||||
)
|
||||
scheduler_schedule_time: Optional[str] = Field(
|
||||
default="03:00", description="Daily run time in HH:MM format"
|
||||
)
|
||||
scheduler_schedule_days: Optional[list] = Field(
|
||||
default=None, description="Days of week to run scheduler (mon-sun)"
|
||||
)
|
||||
scheduler_auto_download_after_rescan: Optional[bool] = Field(
|
||||
default=False, description="Auto-download missing episodes after rescan"
|
||||
)
|
||||
|
||||
# Logging configuration
|
||||
|
||||
@@ -202,6 +202,47 @@
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.scheduler-days-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.4rem;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
|
||||
.scheduler-day-toggle-label {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.25rem;
|
||||
cursor: pointer;
|
||||
padding: 0.3rem 0.6rem;
|
||||
border: 2px solid var(--color-border);
|
||||
border-radius: 6px;
|
||||
font-size: 0.85rem;
|
||||
font-weight: 500;
|
||||
background: var(--color-surface);
|
||||
color: var(--color-text-secondary);
|
||||
transition: all 0.15s ease;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.scheduler-day-toggle-label input[type="checkbox"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scheduler-day-toggle-label:has(input:checked) {
|
||||
border-color: var(--color-primary);
|
||||
background: rgba(var(--color-primary-rgb), 0.12);
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
details.form-advanced > summary {
|
||||
cursor: pointer;
|
||||
color: var(--color-text-secondary);
|
||||
font-size: 0.85rem;
|
||||
margin-top: 0.5rem;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.setup-button {
|
||||
width: 100%;
|
||||
padding: 0.75rem;
|
||||
@@ -390,11 +431,66 @@
|
||||
<div class="form-help">Automatically check for new episodes</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="scheduler_interval_minutes" class="form-label">Interval (minutes)</label>
|
||||
<input type="number" id="scheduler_interval_minutes" name="scheduler_interval_minutes"
|
||||
class="form-input" value="60" min="1" required>
|
||||
<label for="scheduler_schedule_time" class="form-label">Run at (HH:MM)</label>
|
||||
<input type="time" id="scheduler_schedule_time" name="scheduler_schedule_time"
|
||||
class="form-input" value="03:00">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group full-width">
|
||||
<label class="form-label">Days of week</label>
|
||||
<div class="scheduler-days-row">
|
||||
<label class="scheduler-day-toggle-label">
|
||||
<input type="checkbox" id="scheduler_day_mon" class="scheduler-day-setup-cb" value="mon" checked>
|
||||
<span>Mon</span>
|
||||
</label>
|
||||
<label class="scheduler-day-toggle-label">
|
||||
<input type="checkbox" id="scheduler_day_tue" class="scheduler-day-setup-cb" value="tue" checked>
|
||||
<span>Tue</span>
|
||||
</label>
|
||||
<label class="scheduler-day-toggle-label">
|
||||
<input type="checkbox" id="scheduler_day_wed" class="scheduler-day-setup-cb" value="wed" checked>
|
||||
<span>Wed</span>
|
||||
</label>
|
||||
<label class="scheduler-day-toggle-label">
|
||||
<input type="checkbox" id="scheduler_day_thu" class="scheduler-day-setup-cb" value="thu" checked>
|
||||
<span>Thu</span>
|
||||
</label>
|
||||
<label class="scheduler-day-toggle-label">
|
||||
<input type="checkbox" id="scheduler_day_fri" class="scheduler-day-setup-cb" value="fri" checked>
|
||||
<span>Fri</span>
|
||||
</label>
|
||||
<label class="scheduler-day-toggle-label">
|
||||
<input type="checkbox" id="scheduler_day_sat" class="scheduler-day-setup-cb" value="sat" checked>
|
||||
<span>Sat</span>
|
||||
</label>
|
||||
<label class="scheduler-day-toggle-label">
|
||||
<input type="checkbox" id="scheduler_day_sun" class="scheduler-day-setup-cb" value="sun" checked>
|
||||
<span>Sun</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-help">Scheduler runs at the selected time on checked days. Uncheck all to disable scheduling.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label class="form-checkbox">
|
||||
<input type="checkbox" id="scheduler_auto_download" name="scheduler_auto_download">
|
||||
<span>Auto-download missing episodes after rescan</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<details class="form-advanced">
|
||||
<summary>Advanced</summary>
|
||||
<div class="form-row" style="margin-top:0.75rem">
|
||||
<div class="form-group">
|
||||
<label for="scheduler_interval_minutes" class="form-label">Legacy Interval (minutes)</label>
|
||||
<input type="number" id="scheduler_interval_minutes" name="scheduler_interval_minutes"
|
||||
class="form-input" value="60" min="1">
|
||||
<div class="form-help">Deprecated: only used if cron scheduling is not configured.</div>
|
||||
</div>
|
||||
</div>
|
||||
</details>
|
||||
</div>
|
||||
|
||||
<!-- Logging Settings -->
|
||||
@@ -673,7 +769,10 @@
|
||||
name: document.getElementById('name').value.trim(),
|
||||
data_dir: document.getElementById('data_dir').value.trim(),
|
||||
scheduler_enabled: document.getElementById('scheduler_enabled').checked,
|
||||
scheduler_interval_minutes: parseInt(document.getElementById('scheduler_interval_minutes').value),
|
||||
scheduler_schedule_time: document.getElementById('scheduler_schedule_time').value || '03:00',
|
||||
scheduler_schedule_days: Array.from(document.querySelectorAll('.scheduler-day-setup-cb:checked')).map(cb => cb.value),
|
||||
scheduler_auto_download_after_rescan: document.getElementById('scheduler_auto_download').checked,
|
||||
scheduler_interval_minutes: parseInt(document.getElementById('scheduler_interval_minutes').value) || 60,
|
||||
logging_level: document.getElementById('logging_level').value,
|
||||
logging_file: document.getElementById('logging_file').value.trim() || null,
|
||||
logging_max_bytes: document.getElementById('logging_max_bytes').value ?
|
||||
|
||||
Reference in New Issue
Block a user