Refactor return type of the search

This commit is contained in:
Alexander
2026-05-05 14:41:45 +02:00
parent b41ea7d023
commit 2400c6345a
20 changed files with 339 additions and 56 deletions
+14 -10
View File
@@ -4,11 +4,14 @@ import (
"encoding/xml"
pb "homelab.lan/music-agregator/gen/music_agregator/indexer/v1"
"homelab.lan/music-agregator/internal/tracker/rutracker"
)
var parserFactory = rutracker.NewParserFactory()
type SearchResult struct {
XMLName xml.Name `xml:"rss"`
Items []Item `xml:"channel>item"` // Directly targets items inside channel
Items []Item `xml:"channel>item"`
}
type Item struct {
@@ -38,7 +41,6 @@ func (sr *SearchResult) ToProto() *pb.SearchResponse {
pbItems := make([]*pb.SearchItem, len(sr.Items))
for i, item := range sr.Items {
// Map Torznab Attributes
pbAttrs := make([]*pb.TorznabAttr, len(item.TorznabAttrs))
for j, attr := range item.TorznabAttrs {
pbAttrs[j] = &pb.TorznabAttr{
@@ -47,21 +49,23 @@ func (sr *SearchResult) ToProto() *pb.SearchResponse {
}
}
// Map the Item
release := parserFactory.GetParser(item.Categories).Parse(item.Title)
pbItems[i] = &pb.SearchItem{
Title: item.Title,
Link: item.Link,
Guid: item.Guid,
PubDate: item.PubDate,
Size: item.Size,
Description: item.Description,
Categories: item.Categories,
Title: item.Title,
DownloadLink: item.Link,
TorrentPageUrl: item.Guid,
PubDate: item.PubDate,
Size: item.Size,
Description: item.Description,
Categories: item.Categories,
Enclosure: &pb.Enclosure{
Url: item.Enclosure.URL,
Length: item.Enclosure.Length,
Type: item.Enclosure.Type,
},
TorznabAttrs: pbAttrs,
Release: release.ToProto(),
}
}
+9 -21
View File
@@ -2,7 +2,6 @@ package indexer
import (
"context"
"fmt"
"github.com/rs/zerolog/log"
"google.golang.org/grpc"
@@ -12,39 +11,28 @@ import (
)
type IndexerServer struct {
indexer Indexer
service *IndexerService
pb.UnimplementedIndexerServiceServer
}
func NewIndexerServer(cfg config.Config) (*IndexerServer, error) {
switch cfg.Indexer.Type {
case config.IndexerTypeJackett:
indexer := NewIndexer(cfg)
return &IndexerServer{indexer: indexer}, nil
default:
return nil, fmt.Errorf("Unable to create the indexer for type: %v", cfg.Indexer.Type)
service, err := NewIndexerService(cfg)
if err != nil {
log.Err(err).Msg("Failed to initialize IndexerService")
return nil, err
}
return &IndexerServer{service: service}, nil
}
func (server *IndexerServer) Search(ctx context.Context, req *pb.SearchRequest) (*pb.SearchResponse, error) {
log.Debug().Str("query", req.GetQuery()).Int32("limit", req.GetLimit()).Str("indexer", req.GetTracker()).Msg("Running search with these prams")
searchResult, err := server.indexer.Search(req.GetQuery(), req.GetLimit(), req.GetTracker())
if err != nil {
log.Error().Err(err).Msg("Failed to search in indexer")
return nil, err
}
return searchResult.ToProto(), nil
return server.service.Search(req)
}
func (server *IndexerServer) Capabilities(ctx context.Context, req *pb.CapabilitiesRequest) (*pb.CapabilitiesResponse, error) {
capabilities, err := server.indexer.Capabilities(req.GetIndexer())
if err != nil {
log.Error().Err(err).Msg("Failed to get capabilities from indexer")
return nil, err
}
return capabilities.ToProto(), nil
return server.service.Capabilities(req)
}
func (s *IndexerServer) Register(server *grpc.Server) {
+42
View File
@@ -0,0 +1,42 @@
package indexer
import (
"fmt"
"github.com/rs/zerolog/log"
pb "homelab.lan/music-agregator/gen/music_agregator/indexer/v1"
"homelab.lan/music-agregator/internal/config"
)
type IndexerService struct {
indexer Indexer
}
func NewIndexerService(cfg config.Config) (*IndexerService, error) {
switch cfg.Indexer.Type {
case config.IndexerTypeJackett:
indexer := NewIndexer(cfg)
return &IndexerService{indexer: indexer}, nil
default:
return nil, fmt.Errorf("Unable to create the indexer for type: %v", cfg.Indexer.Type)
}
}
func (service *IndexerService) Search(req *pb.SearchRequest) (*pb.SearchResponse, error) {
searchResult, err := service.indexer.Search(req.GetQuery(), req.GetLimit(), req.GetTracker())
if err != nil {
log.Error().Err(err).Msg("Failed to search in indexer")
return nil, err
}
return searchResult.ToProto(), nil
}
func (service *IndexerService) Capabilities(req *pb.CapabilitiesRequest) (*pb.CapabilitiesResponse, error) {
capabilities, err := service.indexer.Capabilities(req.GetIndexer())
if err != nil {
log.Error().Err(err).Msg("Failed to get capabilities from indexer")
return nil, err
}
return capabilities.ToProto(), nil
}