109 lines
2.6 KiB
Go
109 lines
2.6 KiB
Go
package indexer
|
|
|
|
import (
|
|
"encoding/xml"
|
|
"strings"
|
|
|
|
pb "homelab.lan/music-agregator/gen/music_agregator/indexer/v1"
|
|
)
|
|
|
|
type Indexer interface {
|
|
Search()
|
|
Capabilities(indexerName string) (IndexerCapabilities, error)
|
|
}
|
|
|
|
type IndexerCapabilities struct {
|
|
XMLName xml.Name `xml:"caps"`
|
|
Server Server `xml:"server"`
|
|
Limits Limits `xml:"limits"`
|
|
Searching Searching `xml:"searching"`
|
|
Categories []Category `xml:"categories>category"`
|
|
}
|
|
|
|
type Server struct {
|
|
Title string `xml:"title,attr"`
|
|
}
|
|
|
|
type Limits struct {
|
|
Default int `xml:"default,attr"`
|
|
Max int `xml:"max,attr"`
|
|
}
|
|
|
|
type Searching struct {
|
|
Search SearchCapability `xml:"search"`
|
|
TvSearch SearchCapability `xml:"tv-search"`
|
|
MovieSearch SearchCapability `xml:"movie-search"`
|
|
MusicSearch SearchCapability `xml:"music-search"`
|
|
AudioSearch SearchCapability `xml:"audio-search"`
|
|
BookSearch SearchCapability `xml:"book-search"`
|
|
}
|
|
|
|
type SearchCapability struct {
|
|
Available string `xml:"available,attr"`
|
|
SupportedParams string `xml:"supportedParams,attr"`
|
|
SearchEngine string `xml:"searchEngine,attr"`
|
|
}
|
|
|
|
type Category struct {
|
|
ID int `xml:"id,attr"`
|
|
Name string `xml:"name,attr"`
|
|
Subcats []Subcat `xml:"subcat"`
|
|
}
|
|
|
|
type Subcat struct {
|
|
ID int `xml:"id,attr"`
|
|
Name string `xml:"name,attr"`
|
|
}
|
|
|
|
func (c *IndexerCapabilities) ToProto() *pb.CapabilitiesResponse {
|
|
return &pb.CapabilitiesResponse{
|
|
Server: &pb.Server{
|
|
Title: c.Server.Title,
|
|
},
|
|
Limits: &pb.Limits{
|
|
Default: int32(c.Limits.Default),
|
|
Max: int32(c.Limits.Max),
|
|
},
|
|
Searching: &pb.Searching{
|
|
Search: c.Searching.Search.toProto(),
|
|
TvSearch: c.Searching.TvSearch.toProto(),
|
|
MovieSearch: c.Searching.MovieSearch.toProto(),
|
|
MusicSearch: c.Searching.MusicSearch.toProto(),
|
|
AudioSearch: c.Searching.AudioSearch.toProto(),
|
|
BookSearch: c.Searching.BookSearch.toProto(),
|
|
},
|
|
Categories: c.categoriesToProto(),
|
|
}
|
|
}
|
|
|
|
func (s *SearchCapability) toProto() *pb.SearchCapability {
|
|
var params []string
|
|
if s.SupportedParams != "" {
|
|
params = strings.Split(s.SupportedParams, ",")
|
|
}
|
|
return &pb.SearchCapability{
|
|
Available: s.Available == "yes",
|
|
SupportedParams: params,
|
|
SearchEngine: s.SearchEngine,
|
|
}
|
|
}
|
|
|
|
func (c *IndexerCapabilities) categoriesToProto() []*pb.Category {
|
|
categories := make([]*pb.Category, len(c.Categories))
|
|
for i, cat := range c.Categories {
|
|
subcats := make([]*pb.Subcat, len(cat.Subcats))
|
|
for j, sub := range cat.Subcats {
|
|
subcats[j] = &pb.Subcat{
|
|
Id: int32(sub.ID),
|
|
Name: sub.Name,
|
|
}
|
|
}
|
|
categories[i] = &pb.Category{
|
|
Id: int32(cat.ID),
|
|
Name: cat.Name,
|
|
Subcats: subcats,
|
|
}
|
|
}
|
|
return categories
|
|
}
|