Add a central job registry that library scans and search index builds report into, so background work is visible instead of buried in the settings page. - backend/jobs: registry with per-job ring-buffer logs, capability-driven controls, and one coalesced JobsChanged snapshot at 4Hz - pause survives restart via a job_state table; a paused scan is adopted back on launch and skipped by the soft scan - top-bar indicator, popover, details drawer and a Jobs page replacing the config page's scan UI; per-library start/stop retained - scan timing breakdown moves into the job log, Full rescan to the Jobs page; delete the orphaned library-manager component Also add cmd/indexbuild and cmd/indexexport so the explore index can be built once centrally rather than by every install, which today streams ~205GB from the ListenBrainz spark dump on first run. indexbuild picks build/refresh/rebuild from index state; the Gitea workflow runs it on push, weekly, or manually and publishes only when content changed. fresh-install no longer defaults YJ_HOME under /tmp: it is tmpfs on most distros, and the import needs ~6GB of real disk. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package jobs
|
|
|
|
// Service is the Wails-bound facade over the registry. It deliberately
|
|
// exposes only the read and control surface — producers get a *Handle
|
|
// through the registry instead, so the frontend cannot invent jobs.
|
|
type Service struct {
|
|
reg *Registry
|
|
}
|
|
|
|
// NewService wraps a registry for frontend binding.
|
|
func NewService(reg *Registry) *Service {
|
|
return &Service{reg: reg}
|
|
}
|
|
|
|
// GetJobs returns every known job — active first by registration order,
|
|
// including recently finished ones so the panel can show outcomes.
|
|
func (s *Service) GetJobs() []Job {
|
|
return s.reg.Snapshot()
|
|
}
|
|
|
|
// GetJobLog returns the retained log tail for one job.
|
|
func (s *Service) GetJobLog(id string) []LogEntry {
|
|
return s.reg.Logs(id)
|
|
}
|
|
|
|
// PauseJob asks the owning subsystem to pause a job. Returns
|
|
// immediately; the job reports "paused" once it actually stops.
|
|
func (s *Service) PauseJob(id string) {
|
|
s.reg.Pause(id)
|
|
}
|
|
|
|
// ResumeJob continues a paused job.
|
|
func (s *Service) ResumeJob(id string) {
|
|
s.reg.Resume(id)
|
|
}
|
|
|
|
// CancelJob abandons a job.
|
|
func (s *Service) CancelJob(id string) {
|
|
s.reg.Cancel(id)
|
|
}
|
|
|
|
// DismissJob removes a single finished job from the list.
|
|
func (s *Service) DismissJob(id string) {
|
|
s.reg.Remove(id)
|
|
}
|
|
|
|
// ClearFinishedJobs removes every terminal job from the list.
|
|
func (s *Service) ClearFinishedJobs() {
|
|
s.reg.ClearFinished()
|
|
}
|