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 }