aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fischer@muhq.space>2023-07-23 13:55:27 +0200
committerFlorian Fischer <florian.fischer@muhq.space>2023-07-23 13:55:27 +0200
commit1ea08e2470544e823bebb7704983eb28b5168ba8 (patch)
tree00a2133be4bd729b12528863d8b1ba47c0b6f18d
parent6bc7063c68be760a52f621d2e3d77c89af21852b (diff)
downloadWRMS-1ea08e2470544e823bebb7704983eb28b5168ba8.tar.gz
WRMS-1ea08e2470544e823bebb7704983eb28b5168ba8.zip
implement advanced local search
-rw-r--r--TODO.md2
-rw-r--r--localBackend.go33
2 files changed, 31 insertions, 4 deletions
diff --git a/TODO.md b/TODO.md
index b534b4e..4b70498 100644
--- a/TODO.md
+++ b/TODO.md
@@ -7,7 +7,7 @@
- [ ] support advanced search
- [X] client
- [ ] spotify
- - [ ] local
+ - [X] local
- [X] Show more Song information
- [ ] Fetch and show cover art
- [X] Show a song's Album
diff --git a/localBackend.go b/localBackend.go
index e59bf03..129be35 100644
--- a/localBackend.go
+++ b/localBackend.go
@@ -129,11 +129,38 @@ func (b *LocalBackend) Play(song *Song, player Player) {
player.PlayUri("file://" + song.Uri)
}
+func genericQuery(pattern string) string {
+ return fmt.Sprintf("SELECT * FROM songs WHERE Title LIKE '%%%s%%' OR Artist LIKE '%%%s%%' OR Album LIKE '%%%s%%'", pattern, pattern, pattern)
+}
+
+func advancedQuery(patterns map[string]string) string {
+ query := "Select * FROM songs WHERE"
+ query_parts := []string{}
+ for _, comp := range []string{"title", "album", "artist"} {
+ if pattern, ok := patterns[comp]; ok {
+ query_parts = append(query_parts, fmt.Sprintf("%s LIKE '%%%s%%'", strings.Title(comp), pattern))
+ }
+ }
+
+ return fmt.Sprintf("%s %s", query, strings.Join(query_parts, " OR "))
+}
+
func (b *LocalBackend) Search(patterns map[string]string) (results []*Song) {
- pattern := strings.ToLower(patterns["pattern"])
+ advanced := false
+ for _, comp := range []string{"title", "album", "artist"} {
+ if _, ok := patterns[comp]; ok {
+ advanced = true
+ break
+ }
+ }
+
+ var query string
+ if advanced {
+ query = advancedQuery(patterns)
+ } else {
+ query = genericQuery(strings.ToLower(patterns["pattern"]))
+ }
- query := fmt.Sprintf("SELECT * FROM songs WHERE Title LIKE '%%%s%%' OR Artist LIKE '%%%s%%'",
- pattern, pattern)
llog.Debug("Searching in local DB using: %q", query)
rows, err := b.db.Query(query)
if err != nil {