Refactor search into source-specific collectors
build-push / docker (push) Successful in 4m35s

This commit is contained in:
AI Assistant
2026-03-13 19:11:54 +09:00
parent ae091c5a7d
commit 5aebbef639
4 changed files with 122 additions and 60 deletions
+34 -59
View File
@@ -29,6 +29,7 @@ type SearchService struct {
GoogleVideoEngine string
WebEngine string
Client *http.Client
collectors []searchCollector
}
func NewSearchService(baseURL, googleVideoEngine, webEngine string) *SearchService {
@@ -43,6 +44,11 @@ func NewSearchService(baseURL, googleVideoEngine, webEngine string) *SearchServi
GoogleVideoEngine: googleVideoEngine,
WebEngine: webEngine,
Client: &http.Client{Timeout: 20 * time.Second},
collectors: []searchCollector{
envatoCollector{},
artgridCollector{},
googleVideoCollector{},
},
}
}
@@ -51,42 +57,6 @@ func (s *SearchService) SearchMedia(queries []string, enabledPlatforms map[strin
return nil, fmt.Errorf("searxng base url is not configured")
}
type sourceConfig struct {
name string
categories string
engine string
maxResults int
build func(string) []string
accept func(SearchResult) bool
}
sources := []sourceConfig{
{
name: "Envato",
categories: "general",
engine: s.WebEngine,
maxResults: 8,
build: buildEnvatoQueries,
accept: isRenderableEnvatoResult,
},
{
name: "Artgrid",
categories: "general",
engine: s.WebEngine,
maxResults: 8,
build: buildArtgridQueries,
accept: isRenderableArtgridResult,
},
{
name: "Google Video",
categories: "videos",
engine: s.GoogleVideoEngine,
maxResults: 6,
build: buildGoogleVideoQueries,
accept: isUsefulGoogleVideoResult,
},
}
seen := map[string]bool{}
sourceCounts := map[string]int{}
results := make([]SearchResult, 0, 90)
@@ -100,37 +70,33 @@ func (s *SearchService) SearchMedia(queries []string, enabledPlatforms map[strin
if base == "" {
continue
}
for _, source := range sources {
if len(enabledPlatforms) > 0 && !enabledPlatforms[strings.ToLower(source.name)] {
for _, collector := range s.collectors {
if !collector.Enabled(enabledPlatforms) {
continue
}
if sourceCounts[source.name] >= source.maxResults {
if sourceCounts[collector.Name()] >= collector.MaxResults() {
continue
}
if onlyMissing && sourceCounts[source.name] > 0 {
if onlyMissing && sourceCounts[collector.Name()] > 0 {
continue
}
for _, searchQuery := range source.build(base) {
if sourceCounts[source.name] >= source.maxResults {
for _, searchQuery := range collector.BuildQueries(base) {
if sourceCounts[collector.Name()] >= collector.MaxResults() {
break
}
items, err := s.search(searchQuery, source.categories, source.engine, source.name)
if err != nil {
lastErr = err
items, err = s.search(searchQuery, source.categories, "", source.name)
}
items, err := collector.Collect(s, searchQuery)
if err != nil {
lastErr = err
continue
}
for _, item := range items {
if item.Link == "" || seen[item.Link] || !source.accept(item) {
if item.Link == "" || seen[item.Link] || !collector.Accept(item) {
continue
}
seen[item.Link] = true
results = append(results, item)
sourceCounts[source.name]++
if sourceCounts[source.name] >= source.maxResults {
sourceCounts[collector.Name()]++
if sourceCounts[collector.Name()] >= collector.MaxResults() {
break
}
}
@@ -179,17 +145,26 @@ func (s *SearchService) EnrichResults(results []SearchResult) []SearchResult {
}
func (s *SearchService) enrichResult(result SearchResult) SearchResult {
switch result.Source {
case "Envato":
return s.enrichEnvato(result)
case "Artgrid":
return s.enrichArtgrid(result)
default:
if result.ThumbnailURL == "" {
result.ThumbnailURL = deriveThumbnail(result.Link)
for _, collector := range s.collectors {
if collector.Name() == result.Source {
return collector.Enrich(s, result)
}
return result
}
if result.ThumbnailURL == "" {
result.ThumbnailURL = deriveThumbnail(result.Link)
}
return result
}
func (s *SearchService) searchWithFallback(query, categories, engine, source string) ([]SearchResult, error) {
items, err := s.search(query, categories, engine, source)
if err == nil {
return items, nil
}
if strings.TrimSpace(engine) == "" {
return nil, err
}
return s.search(query, categories, "", source)
}
func (s *SearchService) enrichEnvato(result SearchResult) SearchResult {