From 920bcb06dca0429bb8b5414da9193e439f20fc86 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Fri, 11 Apr 2025 19:34:49 +0100 Subject: [PATCH 1/8] Print warnings when failing to get sensors --- internal/glance/cli.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/internal/glance/cli.go b/internal/glance/cli.go index a071e24..9cbb607 100644 --- a/internal/glance/cli.go +++ b/internal/glance/cli.go @@ -86,6 +86,12 @@ func cliSensorsPrint() int { tempSensors, err := sensors.SensorsTemperatures() if err != nil { fmt.Printf("Failed to retrieve list of sensors: %v\n", err) + if warns, ok := err.(*sensors.Warnings); ok { + for _, w := range warns.List { + fmt.Printf(" - %v\n", w) + } + } + return 1 } From d99944dcffa0506396b59b0faec7294caedd79bd Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Wed, 12 Mar 2025 10:35:49 +0000 Subject: [PATCH 2/8] Avoid spinning up unnecessary goroutines for single data jobs --- internal/glance/widget-utils.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/glance/widget-utils.go b/internal/glance/widget-utils.go index 8fb76dd..4aaf5d5 100644 --- a/internal/glance/widget-utils.go +++ b/internal/glance/widget-utils.go @@ -181,6 +181,11 @@ func workerPoolDo[I any, O any](job *workerPoolJob[I, O]) ([]O, []error, error) return results, errs, nil } + if len(job.data) == 1 { + output, err := job.task(job.data[0]) + return append(results, output), append(errs, err), nil + } + tasksQueue := make(chan *workerPoolTask[I, O]) resultsQueue := make(chan *workerPoolTask[I, O]) From 5ab962634e106dd4221c5df60d121946864eea16 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Sat, 22 Mar 2025 11:02:06 +0000 Subject: [PATCH 3/8] Fix sorting bug in twitch channels widget --- internal/glance/widget-twitch-channels.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/glance/widget-twitch-channels.go b/internal/glance/widget-twitch-channels.go index f3ab206..1290a26 100644 --- a/internal/glance/widget-twitch-channels.go +++ b/internal/glance/widget-twitch-channels.go @@ -196,6 +196,10 @@ func fetchChannelFromTwitchTask(channel string) (twitchChannel, error) { slog.Warn("Failed to parse Twitch stream started at", "error", err, "started_at", streamMetadata.UserOrNull.Stream.StartedAt) } } + } else { + // This prevents live channels with 0 viewers from being + // incorrectly sorted lower than offline channels + result.ViewersCount = -1 } return result, nil From b1247e5de66d4d25ca277055d0ba93ad9fb920fb Mon Sep 17 00:00:00 2001 From: "Lucas L." <18116857+HtFilia@users.noreply.github> Date: Sat, 22 Mar 2025 19:59:00 +0100 Subject: [PATCH 4/8] Add filter on already seen links for RSS feeds --- internal/glance/widget-rss.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/internal/glance/widget-rss.go b/internal/glance/widget-rss.go index e7d2e8b..1598371 100644 --- a/internal/glance/widget-rss.go +++ b/internal/glance/widget-rss.go @@ -331,6 +331,7 @@ func fetchItemsFromRSSFeeds(requests []rssFeedRequest) (rssFeedItemList, error) failed := 0 entries := make(rssFeedItemList, 0, len(feeds)*10) + seen := make(map[string]struct{}) for i := range feeds { if errs[i] != nil { @@ -339,7 +340,13 @@ func fetchItemsFromRSSFeeds(requests []rssFeedRequest) (rssFeedItemList, error) continue } - entries = append(entries, feeds[i]...) + for _, item := range feeds[i] { + if _, exists := seen[item.Link]; exists { + continue + } + entries = append(entries, item) + seen[item.Link] = struct{}{} + } } if failed == len(requests) { From ea7124db5230f79e80af1a1856dd6efdb6f2597f Mon Sep 17 00:00:00 2001 From: Ralph Ocdol Date: Mon, 31 Mar 2025 22:24:51 +0800 Subject: [PATCH 5/8] feat: custom-api's replaceAll with regex support --- internal/glance/widget-custom-api.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/internal/glance/widget-custom-api.go b/internal/glance/widget-custom-api.go index c9db2df..e092fc3 100644 --- a/internal/glance/widget-custom-api.go +++ b/internal/glance/widget-custom-api.go @@ -468,8 +468,16 @@ var customAPITemplateFuncs = func() template.FuncMap { return strings.TrimSuffix(s, suffix) }, "trimSpace": strings.TrimSpace, - "replaceAll": func(old, new, s string) string { - return strings.ReplaceAll(s, old, new) + "replaceAll": func(oldOrPattern, new, s string) string { + if s == "" { + return "" + } + + regex := getCachedRegexp(oldOrPattern) + if regex == nil { + return strings.ReplaceAll(s, oldOrPattern, new) + } + return regex.ReplaceAllString(s, new) }, "findMatch": func(pattern, s string) string { if s == "" { From f99d22738ce3ed8e1297a1cd4448ccbb81d33c03 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:05:18 +0100 Subject: [PATCH 6/8] Add replaceMatches --- docs/custom-api.md | 1 + internal/glance/widget-custom-api.go | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/custom-api.md b/docs/custom-api.md index 99e3a5e..1930f40 100644 --- a/docs/custom-api.md +++ b/docs/custom-api.md @@ -389,6 +389,7 @@ The following helper functions provided by Glance are available: - `trimSuffix(suffix string, str string) string`: Trims the suffix from a string. - `trimSpace(str string) string`: Trims whitespace from a string on both ends. - `replaceAll(old string, new string, str string) string`: Replaces all occurrences of a string in a string. +- `replaceMatches(pattern string, replacement string, str string) string`: Replaces all occurrences of a regular expression in a string. - `findMatch(pattern string, str string) string`: Finds the first match of a regular expression in a string. - `findSubmatch(pattern string, str string) string`: Finds the first submatch of a regular expression in a string. - `sortByString(key string, order string, arr []JSON): []JSON`: Sorts an array of JSON objects by a string key in either ascending or descending order. diff --git a/internal/glance/widget-custom-api.go b/internal/glance/widget-custom-api.go index e092fc3..5d82c5a 100644 --- a/internal/glance/widget-custom-api.go +++ b/internal/glance/widget-custom-api.go @@ -468,16 +468,15 @@ var customAPITemplateFuncs = func() template.FuncMap { return strings.TrimSuffix(s, suffix) }, "trimSpace": strings.TrimSpace, - "replaceAll": func(oldOrPattern, new, s string) string { + "replaceAll": func(old, new, s string) string { + return strings.ReplaceAll(s, old, new) + }, + "replaceMatches": func(pattern, replacement, s string) string { if s == "" { return "" } - regex := getCachedRegexp(oldOrPattern) - if regex == nil { - return strings.ReplaceAll(s, oldOrPattern, new) - } - return regex.ReplaceAllString(s, new) + return getCachedRegexp(pattern).ReplaceAllString(s, replacement) }, "findMatch": func(pattern, s string) string { if s == "" { From 3177af9524695a0e1b9bb16bb93eef5b277ab856 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Fri, 11 Apr 2025 22:34:53 +0100 Subject: [PATCH 7/8] Add rounded class --- internal/glance/static/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/glance/static/main.css b/internal/glance/static/main.css index a715565..2975a73 100644 --- a/internal/glance/static/main.css +++ b/internal/glance/static/main.css @@ -2038,6 +2038,7 @@ details[open] .summary::after { .color-primary { color: var(--color-primary); } .cursor-help { cursor: help; } +.rounded { border-radius: var(--border-radius); } .break-all { word-break: break-all; } .text-left { text-align: left; } .text-right { text-align: right; } From 97f43f88eb90a038208762dc6d2817dd69604c36 Mon Sep 17 00:00:00 2001 From: Svilen Markov <7613769+svilenmarkov@users.noreply.github.com> Date: Fri, 11 Apr 2025 23:14:06 +0100 Subject: [PATCH 8/8] Only set title if attribute isn't set --- internal/glance/static/js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/glance/static/js/main.js b/internal/glance/static/js/main.js index dcd8946..41d2ae3 100644 --- a/internal/glance/static/js/main.js +++ b/internal/glance/static/js/main.js @@ -649,7 +649,7 @@ function setupTruncatedElementTitles() { for (let i = 0; i < elements.length; i++) { const element = elements[i]; - if (element.title === "") element.title = element.textContent; + if (element.getAttribute("title") === null) element.title = element.textContent; } }