From d9d19a8b3f9bcecdfae9ec9953c94487b06cd7e4 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Tue, 24 Jun 2025 12:12:02 +0000 Subject: [PATCH 1/4] fix(deps): update dependency vite to v7 --- ui/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/package.json b/ui/package.json index a570f83..7639583 100644 --- a/ui/package.json +++ b/ui/package.json @@ -37,6 +37,6 @@ "sass": "^1.49.7", "sass-loader": "^16.0.0", "@sveltestrap/sveltestrap": "^7.0.0", - "vite": "^6.0.0" + "vite": "^7.0.0" } } From b7b6d3f0a7cf724d0cd7c2fa165c3128df3c8332 Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Tue, 18 Feb 2025 09:35:43 +0100 Subject: [PATCH 2/4] Handle operating system sleep: check regularly the difference between the monotonic clock and the effective time difference --- app.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/app.go b/app.go index faaf258..88227ad 100644 --- a/app.go +++ b/app.go @@ -22,6 +22,7 @@ type App struct { srv *http.Server nextAlarm *time.Timer nextPreAlarm *time.Timer + ticker *time.Ticker } func NewApp(cfg *config.Config) *App { @@ -61,6 +62,10 @@ func NewApp(cfg *config.Config) *App { } func (app *App) Start() { + if app.ticker != nil { + app.ticker.Stop() + } + app.srv = &http.Server{ Addr: app.cfg.Bind, Handler: app.router, @@ -68,12 +73,28 @@ func (app *App) Start() { app.ResetTimer() + go app.CheckTime() + log.Printf("Ready, listening on %s\n", app.cfg.Bind) if err := app.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen: %s\n", err) } } +func (app *App) CheckTime() { + app.ticker = time.NewTicker(time.Minute) + + startTime := time.Now() + + for range app.ticker.C { + if time.Since(startTime).Round(time.Second).Seconds() != time.Since(startTime.Round(0)).Round(time.Second).Seconds() { + app.ResetTimer() + + startTime = time.Now() + } + } +} + func (app *App) ResetTimer() { if app.nextAlarm != nil { app.nextAlarm.Stop() @@ -137,6 +158,10 @@ func (app *App) Stop() { app.nextAlarm.Stop() } + if app.ticker != nil { + app.ticker.Stop() + } + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() if err := app.srv.Shutdown(ctx); err != nil { From 34917043ce8142d7b33b7295711393b2dccbe80d Mon Sep 17 00:00:00 2001 From: Pierre-Olivier Mercier Date: Tue, 25 Mar 2025 18:34:59 +0100 Subject: [PATCH 3/4] New setting: Start volume --- model/settings.go | 1 + player/player.go | 14 ++++++++++---- ui/src/lib/settings.js | 3 ++- ui/src/routes/settings/+page.svelte | 14 ++++++++++++++ 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/model/settings.go b/model/settings.go index fb9a02e..c2440a2 100644 --- a/model/settings.go +++ b/model/settings.go @@ -16,6 +16,7 @@ type Settings struct { PreAlarmAction string `json:"pre_alarm_action"` MaxRunTime time.Duration `json:"max_run_time"` MaxVolume uint16 `json:"max_volume"` + StartVolume uint16 `json:"start_volume"` Federation map[string]FederationServer `json:"federation"` } diff --git a/player/player.go b/player/player.go index b493953..ff9c121 100644 --- a/player/player.go +++ b/player/player.go @@ -22,6 +22,7 @@ type Player struct { Playlist []string MaxRunTime time.Duration MaxVolume uint16 + StartVolume uint16 Stopper chan bool currentCmd *exec.Cmd currentCmdCh chan bool @@ -95,6 +96,7 @@ func NewPlayer(cfg *config.Config, routines []reveil.Identifier) (*Player, error currentCmdCh: make(chan bool, 1), MaxRunTime: settings.MaxRunTime * time.Minute, MaxVolume: uint16(settings.MaxVolume), + StartVolume: uint16(settings.StartVolume), weatherTime: settings.WeatherDelay * time.Minute, weatherAction: wact, claironTime: settings.GongInterval * time.Minute, @@ -204,7 +206,7 @@ loop: } else { p.dontUpdateVolume = false p.volume = uint16(math.Log(1+float64(p.ntick)/8) * 9500) - p.SetVolume(p.volume) + p.SetVolume(p.StartVolume + p.volume) if p.reverseOrder { p.playedItem -= 1 @@ -226,7 +228,7 @@ loop: p.ntick += 1 if !p.dontUpdateVolume { p.volume = 3500 + uint16(math.Log(1+float64(p.ntick)/8)*9500) - p.SetVolume(p.volume) + p.SetVolume(p.StartVolume + p.volume) } case <-p.Stopper: @@ -249,8 +251,12 @@ loopcalm: for i := 0; i < 128 && p.volume >= 768; i += 1 { timer := time.NewTimer(40 * time.Millisecond) - p.volume -= 768 - p.SetVolume(p.volume) + if p.volume <= 0 { + p.StartVolume -= 768 + } else { + p.volume -= 768 + } + p.SetVolume(p.StartVolume + p.volume) select { case <-p.Stopper: diff --git a/ui/src/lib/settings.js b/ui/src/lib/settings.js index 064cd9a..2776d0f 100644 --- a/ui/src/lib/settings.js +++ b/ui/src/lib/settings.js @@ -5,7 +5,7 @@ export class Settings { } } - update({ language, gong_interval, weather_delay, weather_action, pre_alarm_delay, pre_alarm_action, max_run_time, max_volume, federation }) { + update({ language, gong_interval, weather_delay, weather_action, pre_alarm_delay, pre_alarm_action, max_run_time, max_volume, start_volume, federation }) { this.language = language; this.gong_interval = gong_interval; this.weather_delay = weather_delay; @@ -14,6 +14,7 @@ export class Settings { this.pre_alarm_action = pre_alarm_action; this.max_run_time = max_run_time; this.max_volume = max_volume; + this.start_volume = start_volume; this.federation = federation; } diff --git a/ui/src/routes/settings/+page.svelte b/ui/src/routes/settings/+page.svelte index d3c6911..4183486 100644 --- a/ui/src/routes/settings/+page.svelte +++ b/ui/src/routes/settings/+page.svelte @@ -160,6 +160,20 @@ + + + + submitSettings(settings)} + /> + + + Date: Tue, 25 Mar 2025 18:35:19 +0100 Subject: [PATCH 4/4] New setting: Avoid playlist randomization --- model/settings.go | 1 + player/player.go | 16 ++++++++++------ ui/src/lib/settings.js | 3 ++- ui/src/routes/settings/+page.svelte | 9 +++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/model/settings.go b/model/settings.go index c2440a2..2602749 100644 --- a/model/settings.go +++ b/model/settings.go @@ -17,6 +17,7 @@ type Settings struct { MaxRunTime time.Duration `json:"max_run_time"` MaxVolume uint16 `json:"max_volume"` StartVolume uint16 `json:"start_volume"` + NoRandom bool `json:"no_random"` Federation map[string]FederationServer `json:"federation"` } diff --git a/player/player.go b/player/player.go index ff9c121..4761246 100644 --- a/player/player.go +++ b/player/player.go @@ -23,6 +23,7 @@ type Player struct { MaxRunTime time.Duration MaxVolume uint16 StartVolume uint16 + NoRandom bool Stopper chan bool currentCmd *exec.Cmd currentCmdCh chan bool @@ -97,11 +98,12 @@ func NewPlayer(cfg *config.Config, routines []reveil.Identifier) (*Player, error MaxRunTime: settings.MaxRunTime * time.Minute, MaxVolume: uint16(settings.MaxVolume), StartVolume: uint16(settings.StartVolume), + NoRandom: settings.NoRandom, weatherTime: settings.WeatherDelay * time.Minute, weatherAction: wact, claironTime: settings.GongInterval * time.Minute, claironFile: reveil.CurrentGongPath(cfg), - reverseOrder: int(time.Now().Unix()/86400)%2 == 0, + reverseOrder: !settings.NoRandom && int(time.Now().Unix()/86400)%2 == 0, } // Load routines @@ -131,11 +133,13 @@ func NewPlayer(cfg *config.Config, routines []reveil.Identifier) (*Player, error p.Playlist = append(p.Playlist, track.Path) } - log.Println("Shuffling playlist...") - // Shuffle the playlist - rand.Shuffle(len(p.Playlist), func(i, j int) { - p.Playlist[i], p.Playlist[j] = p.Playlist[j], p.Playlist[i] - }) + if !p.NoRandom { + log.Println("Shuffling playlist...") + // Shuffle the playlist + rand.Shuffle(len(p.Playlist), func(i, j int) { + p.Playlist[i], p.Playlist[j] = p.Playlist[j], p.Playlist[i] + }) + } return &p, nil } diff --git a/ui/src/lib/settings.js b/ui/src/lib/settings.js index 2776d0f..ca9d1c6 100644 --- a/ui/src/lib/settings.js +++ b/ui/src/lib/settings.js @@ -5,7 +5,7 @@ export class Settings { } } - update({ language, gong_interval, weather_delay, weather_action, pre_alarm_delay, pre_alarm_action, max_run_time, max_volume, start_volume, federation }) { + update({ language, gong_interval, weather_delay, weather_action, pre_alarm_delay, pre_alarm_action, max_run_time, max_volume, start_volume, no_random, federation }) { this.language = language; this.gong_interval = gong_interval; this.weather_delay = weather_delay; @@ -15,6 +15,7 @@ export class Settings { this.max_run_time = max_run_time; this.max_volume = max_volume; this.start_volume = start_volume; + this.no_random = no_random; this.federation = federation; } diff --git a/ui/src/routes/settings/+page.svelte b/ui/src/routes/settings/+page.svelte index 4183486..8d75632 100644 --- a/ui/src/routes/settings/+page.svelte +++ b/ui/src/routes/settings/+page.svelte @@ -174,6 +174,15 @@ + + submitSettings(settings)} + /> + +