package indexer import ( "encoding/xml" "fmt" "io" "net/http" "time" "github.com/rs/zerolog/log" "homelab.lan/music-agregator/internal/config" ) type JacketIndexer struct { cfg config.Config client *http.Client } func NewIndexer(cfg config.Config) Indexer { return &JacketIndexer{ cfg: cfg, client: &http.Client{ Timeout: time.Second * 10, }, } } func (indexer *JacketIndexer) Search(query string, limit int32, tracker string) (SearchResult, error) { searchTracker := "all" if len(tracker) != 0 { searchTracker = tracker } url := indexer.cfg.Indexer.Url uri := fmt.Sprintf("%v/api/v2.0/indexers/%v/results/torznab?apikey=%v&limit=%d&cat=3010,3040&q=%v&t=search", url, searchTracker, indexer.cfg.Indexer.ApiKey, limit, query) log.Debug().Str("uri", uri).Msg("Sending search request") req, err := http.NewRequest("GET", uri, nil) if err != nil { log.Error().Err(err).Msg("Error creating request") return SearchResult{}, err } resp, err := indexer.client.Do(req) if err != nil { log.Error().Err(err).Msg("Error making search request") return SearchResult{}, err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { log.Error().Err(err).Msg("Error reading search response body") return SearchResult{}, err } var searchResult SearchResult if err := xml.Unmarshal(body, &searchResult); err != nil { log.Error().Err(err).Msg("Error parsing search XML") return SearchResult{}, err } return searchResult, nil } func (indexer *JacketIndexer) Capabilities(indexerName string) (IndexerCapabilities, error) { url := indexer.cfg.Indexer.Url uri := fmt.Sprintf("%v/api/v2.0/indexers/%v/results/torznab/api?apikey=%v&t=caps", url, indexerName, indexer.cfg.Indexer.ApiKey) req, err := http.NewRequest("GET", uri, nil) if err != nil { log.Error().Err(err).Msg("Error creating request") return IndexerCapabilities{}, err } resp, err := indexer.client.Do(req) if err != nil { log.Error().Err(err).Msg("Error making capabilities request") return IndexerCapabilities{}, err } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { log.Error().Err(err).Msg("Error reading response body") return IndexerCapabilities{}, err } var capabilities IndexerCapabilities if err := xml.Unmarshal(body, &capabilities); err != nil { log.Error().Err(err).Msg("Error parsing capabilities XML") return IndexerCapabilities{}, err } log.Debug().Str("server", capabilities.Server.Title).Msg("Parsed capabilities") return capabilities, nil }