Add GetArtists RPC with artist monitor state (monitored/unmonitored/excluded)

This commit is contained in:
Alexander
2026-05-08 22:27:56 +02:00
parent 60c94935b2
commit e49cc25372
6 changed files with 125 additions and 247 deletions
+39
View File
@@ -40,6 +40,7 @@ type MusicAgregatorService struct {
riverClient *river.Client[pgx.Tx]
torrents *database.TorrentRepository
downloads *database.DownloadRepository
artists *database.ArtistRepository
}
func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.Tx], db *database.DB) (*MusicAgregatorService, error) {
@@ -76,6 +77,7 @@ func NewMusicAgregatorService(cfg config.Config, riverClient *river.Client[pgx.T
riverClient: riverClient,
torrents: database.NewTorrentRepository(db.Pool),
downloads: database.NewDownloadRepository(db.Pool),
artists: database.NewArtistRepository(db.Pool),
}, nil
}
@@ -85,6 +87,30 @@ func (s *MusicAgregatorService) Close() {
}
}
func (service *MusicAgregatorService) GetArtists(ctx context.Context, _ *pb.GetArtistsRequest) (*pb.GetArtistsResponse, error) {
dbArtists, err := service.artists.GetAll(ctx)
if err != nil {
log.Error().Err(err).Msg("failed to list artists")
return nil, fmt.Errorf("listing artists: %w", err)
}
artists := make([]*pb.ArtistSummary, 0, len(dbArtists))
for _, a := range dbArtists {
artists = append(artists, &pb.ArtistSummary{
Id: a.ID,
ExternalId: a.ExternalID,
Name: a.Name,
ArtistType: a.ArtistType,
Country: a.Country,
Genres: a.Genres,
ImageUrl: a.ImageURL,
MonitorState: toProtoMonitorState(a.MonitorState),
})
}
return &pb.GetArtistsResponse{Artists: artists}, nil
}
func (service *MusicAgregatorService) MonitorAlbum(ctx context.Context, req *pb.MonitorAlbumRequest) (*pb.MonitorAlbumResponse, error) {
album, err := service.metadata.GetAlbum(ctx, req.GetAlbumId())
if err != nil {
@@ -378,6 +404,19 @@ func buildMonitoredRelease(p parsedItem) *pb.MonitoredRelease {
}
}
func toProtoMonitorState(state database.ArtistMonitorState) pb.ArtistMonitorState {
switch state {
case database.ArtistMonitored:
return pb.ArtistMonitorState_ARTIST_MONITOR_STATE_MONITORED
case database.ArtistUnmonitored:
return pb.ArtistMonitorState_ARTIST_MONITOR_STATE_UNMONITORED
case database.ArtistExcluded:
return pb.ArtistMonitorState_ARTIST_MONITOR_STATE_EXCLUDED
default:
return pb.ArtistMonitorState_ARTIST_MONITOR_STATE_UNSPECIFIED
}
}
func downloadTorrentData(url string) ([]byte, error) {
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Get(url)