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() { log.Warn().Msg("Unimplemented method search on the Jacket Indexer") } 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 }