aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-05-21 14:44:33 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2023-05-21 14:44:33 +0200
commitd4dbb47ac776471eb8a9f91a97da40b9b6621a74 (patch)
treeea6dc9824b3bc821d6618fe41472050277f6d25b
parentf638d3975225b895e7b0a8fb79c6c6de288a732a (diff)
downloadWRMS-d4dbb47ac776471eb8a9f91a97da40b9b6621a74.tar.gz
WRMS-d4dbb47ac776471eb8a9f91a97da40b9b6621a74.zip
paralyze searching
-rw-r--r--TODO4
-rw-r--r--main.go12
-rw-r--r--player.go23
-rw-r--r--wrms.go1
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() {