92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
package internal
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/riverqueue/river"
|
|
"github.com/rs/zerolog/log"
|
|
"google.golang.org/grpc"
|
|
|
|
metadataPb "homelab.lan/music-agregator/gen/metadata/v1"
|
|
pb "homelab.lan/music-agregator/gen/music_agregator/v1"
|
|
|
|
"homelab.lan/music-agregator/internal/config"
|
|
"homelab.lan/music-agregator/internal/indexer"
|
|
"homelab.lan/music-agregator/internal/metadata"
|
|
)
|
|
|
|
type MusicAgregatorService struct {
|
|
config config.Config
|
|
metadataClient metadataPb.MetadataServiceClient
|
|
metadataConn *grpc.ClientConn
|
|
indexer *indexer.IndexerService
|
|
}
|
|
|
|
func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.Tx]) (*MusicAgregatorService, error) {
|
|
indexer, err := indexer.NewIndexerService(cfg, riverClient)
|
|
if err != nil {
|
|
log.Err(err).Msg("failed to create IndexerService")
|
|
return nil, err
|
|
}
|
|
|
|
metadataClient, conn, err := metadata.NewMetadataClient(cfg.Metadata.Endpoint)
|
|
if err != nil {
|
|
log.Err(err).Msg("failed to create metadata client")
|
|
return nil, err
|
|
}
|
|
|
|
return &MusicAgregatorService{
|
|
config: cfg,
|
|
metadataClient: metadataClient,
|
|
metadataConn: conn,
|
|
indexer: indexer,
|
|
}, nil
|
|
}
|
|
|
|
func (s *MusicAgregatorService) Close() {
|
|
if s.metadataConn != nil {
|
|
s.metadataConn.Close()
|
|
}
|
|
}
|
|
|
|
func (service *MusicAgregatorService) MonitorAlbum(ctx context.Context, req *pb.MonitorAlbumRequest) (*pb.MonitorAlbumResponse, error) {
|
|
resp, err := service.metadataClient.GetAlbum(ctx, &metadataPb.GetAlbumRequest{
|
|
Identifier: &metadataPb.GetAlbumRequest_Id{Id: req.GetAlbumId()},
|
|
})
|
|
if err != nil {
|
|
log.Error().Err(err).Str("album_id", req.GetAlbumId()).Msg("metadata GetAlbum failed")
|
|
return nil, err
|
|
}
|
|
album := resp.GetAlbum()
|
|
artistName := ""
|
|
if len(album.GetArtists()) > 0 {
|
|
artistName = album.GetArtists()[0].GetArtist().GetName()
|
|
}
|
|
|
|
log.Debug().
|
|
Str("album_id", req.GetAlbumId()).
|
|
Str("title", album.GetTitle()).
|
|
Str("artist", artistName).
|
|
Msg("album found, monitoring")
|
|
|
|
query := album.GetTitle()
|
|
if artistName != "" {
|
|
query = artistName + " " + query
|
|
}
|
|
|
|
tracker := req.GetIndexerOptions().GetTracker()
|
|
if tracker == "" {
|
|
tracker = "all"
|
|
}
|
|
|
|
searchResult, err := service.indexer.Search(query, -1, tracker)
|
|
if err != nil {
|
|
log.Error().Err(err).Str("query", query).Msg("indexer search album failed")
|
|
return nil, err
|
|
}
|
|
log.Debug().Int("results", len(searchResult.GetResult())).Str("query", query).Msg("indexer search completed")
|
|
|
|
return &pb.MonitorAlbumResponse{}, nil
|
|
}
|