summaryrefslogtreecommitdiff
path: root/internal/app/filters.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/app/filters.go')
-rw-r--r--internal/app/filters.go22
1 files changed, 20 insertions, 2 deletions
diff --git a/internal/app/filters.go b/internal/app/filters.go
index 691be41..3e864a5 100644
--- a/internal/app/filters.go
+++ b/internal/app/filters.go
@@ -17,6 +17,7 @@ type filterState struct {
minMinutes int
maxEnabled bool
maxMinutes int
+ tags string
}
type filterInputs struct {
@@ -28,8 +29,9 @@ func (m *model) applyFilterInputs() error {
name := strings.TrimSpace(m.inputs.fields[0].Value())
minText := strings.TrimSpace(m.inputs.fields[1].Value())
maxText := strings.TrimSpace(m.inputs.fields[2].Value())
+ tags := strings.TrimSpace(m.inputs.fields[3].Value())
- filters := filterState{name: name}
+ filters := filterState{name: name, tags: tags}
if err := populateMinFilter(&filters, minText); err != nil {
return err
}
@@ -98,6 +100,9 @@ func (m model) describeFilters() string {
if m.filters.name != "" {
parts = append(parts, fmt.Sprintf("name contains %q", m.filters.name))
}
+ if m.filters.tags != "" {
+ parts = append(parts, fmt.Sprintf("tags contain %q", m.filters.tags))
+ }
if m.filters.minEnabled {
parts = append(parts, fmt.Sprintf(">=%d min", m.filters.minMinutes))
}
@@ -121,6 +126,19 @@ func (m *model) passesFilters(v video) bool {
if m.filters.maxEnabled && (v.Duration == 0 || durMinutes > m.filters.maxMinutes) {
return false
}
+ if m.filters.tags != "" {
+ query := strings.ToLower(m.filters.tags)
+ matched := false
+ for _, tag := range v.Tags {
+ if strings.Contains(strings.ToLower(tag), query) {
+ matched = true
+ break
+ }
+ }
+ if !matched {
+ return false
+ }
+ }
return true
}
@@ -128,7 +146,7 @@ func (m *model) renderFilterModal() string {
var b strings.Builder
b.WriteString("Filter videos\n")
b.WriteString("(Enter to apply, Esc to cancel)\n\n")
- labels := []string{"Name contains:", "Min length (minutes):", "Max length (minutes):"}
+ labels := []string{"Name contains:", "Min length (minutes):", "Max length (minutes):", "Tags contain:"}
for i, field := range m.inputs.fields {
line := fmt.Sprintf("%s %s", labels[i], field.View())
if i == m.inputs.focus {