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
|
config.scheduler.enabled = req.scheduler_enabled
|
||||||
if req.scheduler_interval_minutes is not None:
|
if req.scheduler_interval_minutes is not None:
|
||||||
config.scheduler.interval_minutes = req.scheduler_interval_minutes
|
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
|
# Update logging configuration
|
||||||
if req.logging_level:
|
if req.logging_level:
|
||||||
|
|||||||
@@ -62,7 +62,16 @@ class SetupRequest(BaseModel):
|
|||||||
default=True, description="Enable/disable scheduler"
|
default=True, description="Enable/disable scheduler"
|
||||||
)
|
)
|
||||||
scheduler_interval_minutes: Optional[int] = Field(
|
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
|
# Logging configuration
|
||||||
|
|||||||
@@ -202,6 +202,47 @@
|
|||||||
line-height: 1.4;
|
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 {
|
.setup-button {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 0.75rem;
|
padding: 0.75rem;
|
||||||
@@ -390,11 +431,66 @@
|
|||||||
<div class="form-help">Automatically check for new episodes</div>
|
<div class="form-help">Automatically check for new episodes</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="scheduler_interval_minutes" class="form-label">Interval (minutes)</label>
|
<label for="scheduler_schedule_time" class="form-label">Run at (HH:MM)</label>
|
||||||
<input type="number" id="scheduler_interval_minutes" name="scheduler_interval_minutes"
|
<input type="time" id="scheduler_schedule_time" name="scheduler_schedule_time"
|
||||||
class="form-input" value="60" min="1" required>
|
class="form-input" value="03:00">
|
||||||
</div>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
|
|
||||||
<!-- Logging Settings -->
|
<!-- Logging Settings -->
|
||||||
@@ -673,7 +769,10 @@
|
|||||||
name: document.getElementById('name').value.trim(),
|
name: document.getElementById('name').value.trim(),
|
||||||
data_dir: document.getElementById('data_dir').value.trim(),
|
data_dir: document.getElementById('data_dir').value.trim(),
|
||||||
scheduler_enabled: document.getElementById('scheduler_enabled').checked,
|
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_level: document.getElementById('logging_level').value,
|
||||||
logging_file: document.getElementById('logging_file').value.trim() || null,
|
logging_file: document.getElementById('logging_file').value.trim() || null,
|
||||||
logging_max_bytes: document.getElementById('logging_max_bytes').value ?
|
logging_max_bytes: document.getElementById('logging_max_bytes').value ?
|
||||||
|
|||||||
Reference in New Issue
Block a user