From d4dbb47ac776471eb8a9f91a97da40b9b6621a74 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 21 May 2023 14:44:33 +0200 Subject: paralyze searching --- TODO | 4 +++- main.go | 12 +++++++++++- player.go | 23 +++++++++++++++++++---- wrms.go | 1 - 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/TODO b/TODO index 4e33df8..ed29307 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,5 @@ ## Fronted +- [ ] support incremental search results ## Web Backend @@ -6,7 +7,8 @@ ## Backends -- [ ] Split paralyze search +- [X] paralyze search + - [ ] report results incrementally - [X] Implement local storage backend - [X] Implement upload - [ ] Remove uploaded songs after were played diff --git a/main.go b/main.go index 420ade8..94e11b9 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "net/http" "strings" + "time" "muhq.space/go/wrms/llog" @@ -36,7 +37,16 @@ func searchHandler(w http.ResponseWriter, r *http.Request) { llog.Debug("Searching for %s", pattern) - results := wrms.Player.Search(pattern) + start := time.Now() + resultsChan := wrms.Player.Search(pattern) + results := []Song{} + + for result := range resultsChan { + results = append(results, result...) + } + + llog.Debug("searching for %s took %v", pattern, time.Since(start)) + data, err := json.Marshal(Event{"search", results}) if err != nil { llog.Error("Encoding the search result failed with %s", err) diff --git a/player.go b/player.go index 3cee6b4..b4a9dc6 100644 --- a/player.go +++ b/player.go @@ -3,6 +3,7 @@ package main import ( "io" "os/exec" + "sync" "syscall" "muhq.space/go/wrms/llog" @@ -110,10 +111,24 @@ func (player *Player) Pause() { } } -func (player *Player) Search(pattern string) []Song { - results := []Song{} +func (player *Player) Search(pattern string) chan []Song { + var wg sync.WaitGroup + wg.Add(len(player.Backends)) + + ch := make(chan []Song) + for _, backend := range player.Backends { - results = append(results, backend.Search(pattern)...) + backend := backend + go func() { + ch <- backend.Search(pattern) + wg.Done() + }() } - return results + + go func() { + wg.Wait() + close(ch) + }() + + return ch } diff --git a/wrms.go b/wrms.go index 9a334c3..9cd0ac4 100644 --- a/wrms.go +++ b/wrms.go @@ -112,7 +112,6 @@ func (wrms *Wrms) Next() { } wrms.CurrentSong = *next - } func (wrms *Wrms) PlayPause() { -- cgit v1.2.3