Add GetAlbum RPC with track details and persist metadata on discovery
This commit is contained in:
@@ -14,6 +14,7 @@ type MetadataService struct {
|
||||
client metadataPb.MetadataServiceClient
|
||||
artists *database.ArtistRepository
|
||||
albums *database.AlbumRepository
|
||||
tracks *database.TrackRepository
|
||||
}
|
||||
|
||||
func NewMetadataService(client metadataPb.MetadataServiceClient, db *database.DB) *MetadataService {
|
||||
@@ -21,6 +22,7 @@ func NewMetadataService(client metadataPb.MetadataServiceClient, db *database.DB
|
||||
client: client,
|
||||
artists: database.NewArtistRepository(db.Pool),
|
||||
albums: database.NewAlbumRepository(db.Pool),
|
||||
tracks: database.NewTrackRepository(db.Pool),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,8 +37,8 @@ func (s *MetadataService) GetAlbum(ctx context.Context, albumID string) (*metada
|
||||
album := resp.GetAlbum()
|
||||
|
||||
if _, err := s.albums.GetByExternalID(ctx, album.GetId()); err != nil {
|
||||
s.persistArtist(ctx, album)
|
||||
s.persistAlbum(ctx, album)
|
||||
s.PersistArtist(ctx, album, database.Monitored)
|
||||
s.PersistAlbum(ctx, album, database.Monitored)
|
||||
}
|
||||
|
||||
return album, nil
|
||||
@@ -52,10 +54,24 @@ func (s *MetadataService) GetArtistAlbums(ctx context.Context, artistExternalID
|
||||
return resp.GetAlbums(), nil
|
||||
}
|
||||
|
||||
func (s *MetadataService) GetAlbumTracks(ctx context.Context, albumExternalID string) ([]*metadataPb.Track, error) {
|
||||
resp, err := s.client.GetAlbumTracks(ctx, &metadataPb.GetAlbumTracksRequest{
|
||||
AlbumId: albumExternalID,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("fetching album tracks: %w", err)
|
||||
}
|
||||
return resp.GetTracks(), nil
|
||||
}
|
||||
|
||||
func (s *MetadataService) GetArtistByExternalID(ctx context.Context, externalID string) (*database.Artist, error) {
|
||||
return s.artists.GetByExternalID(ctx, externalID)
|
||||
}
|
||||
|
||||
func (s *MetadataService) GetAlbumByID(ctx context.Context, id string) (*database.Album, error) {
|
||||
return s.albums.GetByID(ctx, id)
|
||||
}
|
||||
|
||||
func (s *MetadataService) GetAlbumByExternalID(ctx context.Context, externalID string) (*database.Album, error) {
|
||||
return s.albums.GetByExternalID(ctx, externalID)
|
||||
}
|
||||
@@ -64,7 +80,11 @@ func (s *MetadataService) GetAlbumsByArtistID(ctx context.Context, artistID stri
|
||||
return s.albums.GetByArtistID(ctx, artistID)
|
||||
}
|
||||
|
||||
func (s *MetadataService) persistArtist(ctx context.Context, album *metadataPb.Album) {
|
||||
func (s *MetadataService) GetTracksByAlbumID(ctx context.Context, albumID string) ([]*database.Track, error) {
|
||||
return s.tracks.GetByAlbumID(ctx, albumID)
|
||||
}
|
||||
|
||||
func (s *MetadataService) PersistArtist(ctx context.Context, album *metadataPb.Album, state database.MonitorState) {
|
||||
if len(album.GetArtists()) == 0 {
|
||||
return
|
||||
}
|
||||
@@ -82,14 +102,14 @@ func (s *MetadataService) persistArtist(ctx context.Context, album *metadataPb.A
|
||||
Country: artist.GetCountry(),
|
||||
Genres: genres,
|
||||
ImageURL: artist.GetImageUrl(),
|
||||
MonitorState: database.Monitored,
|
||||
MonitorState: state,
|
||||
})
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Str("name", artist.GetName()).Msg("failed to persist artist")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *MetadataService) persistAlbum(ctx context.Context, album *metadataPb.Album) {
|
||||
func (s *MetadataService) PersistAlbum(ctx context.Context, album *metadataPb.Album, state database.MonitorState) {
|
||||
artistID := ""
|
||||
if len(album.GetArtists()) > 0 {
|
||||
a, err := s.artists.GetByExternalID(ctx, album.GetArtists()[0].GetArtist().GetId())
|
||||
@@ -123,9 +143,26 @@ func (s *MetadataService) persistAlbum(ctx context.Context, album *metadataPb.Al
|
||||
Label: labelName,
|
||||
Genres: genres,
|
||||
CoverURL: album.GetCoverUrl(),
|
||||
MonitorState: database.Monitored,
|
||||
MonitorState: state,
|
||||
})
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Str("title", album.GetTitle()).Msg("failed to persist album")
|
||||
}
|
||||
}
|
||||
|
||||
func (s *MetadataService) PersistTracks(ctx context.Context, albumDBID string, tracks []*metadataPb.Track) {
|
||||
for _, t := range tracks {
|
||||
err := s.tracks.Create(ctx, &database.Track{
|
||||
ExternalID: t.GetId(),
|
||||
AlbumID: albumDBID,
|
||||
Title: t.GetTitle(),
|
||||
DurationMS: int(t.GetDurationMs()),
|
||||
ISRC: t.GetIsrc(),
|
||||
DiscNumber: int(t.GetDiscNumber()),
|
||||
TrackNumber: int(t.GetTrackNumber()),
|
||||
})
|
||||
if err != nil {
|
||||
log.Warn().Err(err).Str("title", t.GetTitle()).Msg("failed to persist track")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user