From 54d94b939ea47641509d6eac75aeef9dc81f37cc Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 7 May 2026 17:02:46 +0200 Subject: [PATCH] Refactor the proto --- internal/server/server.go | 12 +- pkg/gen/metadata/v1/metadata.pb.go | 482 +++++++++++++++--------- pkg/gen/metadata/v1/metadata_grpc.pb.go | 50 +-- proto/metadata/v1/metadata.proto | 60 ++- tests/e2e/metadata_test.go | 15 +- 5 files changed, 371 insertions(+), 248 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index 3c023eb..c3bbd3f 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -39,7 +39,7 @@ func (s *MetadataServer) getService(ctx context.Context, p metadatav1.Provider) return svc, nil } -func (s *MetadataServer) GetArtist(ctx context.Context, req *metadatav1.GetArtistRequest) (*metadatav1.Artist, error) { +func (s *MetadataServer) GetArtist(ctx context.Context, req *metadatav1.GetArtistRequest) (*metadatav1.GetArtistResponse, error) { log := zerolog.Ctx(ctx) svc, err := s.getService(ctx, req.Provider) @@ -66,7 +66,7 @@ func (s *MetadataServer) GetArtist(ctx context.Context, req *metadatav1.GetArtis } log.Trace().Str("artist_id", artist.ID).Str("name", artist.Name).Msg("artist found") - return toProtoArtist(artist), nil + return &metadatav1.GetArtistResponse{Artist: toProtoArtist(artist)}, nil } func (s *MetadataServer) SearchArtists(ctx context.Context, req *metadatav1.SearchArtistsRequest) (*metadatav1.SearchArtistsResponse, error) { @@ -133,7 +133,7 @@ func (s *MetadataServer) SearchAlbums(ctx context.Context, req *metadatav1.Searc return resp, nil } -func (s *MetadataServer) GetAlbum(ctx context.Context, req *metadatav1.GetAlbumRequest) (*metadatav1.Album, error) { +func (s *MetadataServer) GetAlbum(ctx context.Context, req *metadatav1.GetAlbumRequest) (*metadatav1.GetAlbumResponse, error) { log := zerolog.Ctx(ctx) svc, err := s.getService(ctx, req.Provider) @@ -160,7 +160,7 @@ func (s *MetadataServer) GetAlbum(ctx context.Context, req *metadatav1.GetAlbumR } log.Trace().Str("album_id", album.ID).Str("title", album.Title).Msg("album found") - return toProtoAlbum(album), nil + return &metadatav1.GetAlbumResponse{Album: toProtoAlbum(album)}, nil } func (s *MetadataServer) GetArtistAlbums(ctx context.Context, req *metadatav1.GetArtistAlbumsRequest) (*metadatav1.GetArtistAlbumsResponse, error) { @@ -195,7 +195,7 @@ func (s *MetadataServer) GetArtistAlbums(ctx context.Context, req *metadatav1.Ge return resp, nil } -func (s *MetadataServer) GetTrack(ctx context.Context, req *metadatav1.GetTrackRequest) (*metadatav1.Track, error) { +func (s *MetadataServer) GetTrack(ctx context.Context, req *metadatav1.GetTrackRequest) (*metadatav1.GetTrackResponse, error) { log := zerolog.Ctx(ctx) svc, err := s.getService(ctx, req.Provider) @@ -236,7 +236,7 @@ func (s *MetadataServer) GetTrack(ctx context.Context, req *metadatav1.GetTrackR } log.Trace().Str("track_id", track.Id).Str("title", track.Title).Msg("track found") - return track, nil + return &metadatav1.GetTrackResponse{Track: track}, nil } func (s *MetadataServer) GetAlbumTracks(ctx context.Context, req *metadatav1.GetAlbumTracksRequest) (*metadatav1.GetAlbumTracksResponse, error) { diff --git a/pkg/gen/metadata/v1/metadata.pb.go b/pkg/gen/metadata/v1/metadata.pb.go index d9fc054..248592b 100644 --- a/pkg/gen/metadata/v1/metadata.pb.go +++ b/pkg/gen/metadata/v1/metadata.pb.go @@ -74,7 +74,7 @@ type GetArtistRequest struct { // *GetArtistRequest_Id // *GetArtistRequest_External Identifier isGetArtistRequest_Identifier `protobuf_oneof:"identifier"` - Provider Provider `protobuf:"varint,3,opt,name=provider,proto3,enum=metadata.v1.Provider" json:"provider,omitempty"` // UNSPECIFIED = query all providers + Provider Provider `protobuf:"varint,3,opt,name=provider,proto3,enum=metadata.v1.Provider" json:"provider,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -146,11 +146,11 @@ type isGetArtistRequest_Identifier interface { } type GetArtistRequest_Id struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3,oneof"` // Internal UUID + Id string `protobuf:"bytes,1,opt,name=id,proto3,oneof"` } type GetArtistRequest_External struct { - External *ExternalID `protobuf:"bytes,2,opt,name=external,proto3,oneof"` // External source ID (e.g., musicbrainz MBID) + External *ExternalID `protobuf:"bytes,2,opt,name=external,proto3,oneof"` } func (*GetArtistRequest_Id) isGetArtistRequest_Identifier() {} @@ -617,58 +617,6 @@ func (x *SearchAlbumsRequest) GetProvider() Provider { return Provider_PROVIDER_UNSPECIFIED } -type SearchAlbumsResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - Albums []*Album `protobuf:"bytes,1,rep,name=albums,proto3" json:"albums,omitempty"` - Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *SearchAlbumsResponse) Reset() { - *x = SearchAlbumsResponse{} - mi := &file_metadata_v1_metadata_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *SearchAlbumsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SearchAlbumsResponse) ProtoMessage() {} - -func (x *SearchAlbumsResponse) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[7] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SearchAlbumsResponse.ProtoReflect.Descriptor instead. -func (*SearchAlbumsResponse) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{7} -} - -func (x *SearchAlbumsResponse) GetAlbums() []*Album { - if x != nil { - return x.Albums - } - return nil -} - -func (x *SearchAlbumsResponse) GetTotal() int32 { - if x != nil { - return x.Total - } - return 0 -} - type SyncArtistRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Types that are valid to be assigned to Target: @@ -683,7 +631,7 @@ type SyncArtistRequest struct { func (x *SyncArtistRequest) Reset() { *x = SyncArtistRequest{} - mi := &file_metadata_v1_metadata_proto_msgTypes[8] + mi := &file_metadata_v1_metadata_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -695,7 +643,7 @@ func (x *SyncArtistRequest) String() string { func (*SyncArtistRequest) ProtoMessage() {} func (x *SyncArtistRequest) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[8] + mi := &file_metadata_v1_metadata_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -708,7 +656,7 @@ func (x *SyncArtistRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncArtistRequest.ProtoReflect.Descriptor instead. func (*SyncArtistRequest) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{8} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{7} } func (x *SyncArtistRequest) GetTarget() isSyncArtistRequest_Target { @@ -759,6 +707,50 @@ func (*SyncArtistRequest_Name) isSyncArtistRequest_Target() {} func (*SyncArtistRequest_External) isSyncArtistRequest_Target() {} +type GetArtistResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Artist *Artist `protobuf:"bytes,1,opt,name=artist,proto3" json:"artist,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetArtistResponse) Reset() { + *x = GetArtistResponse{} + mi := &file_metadata_v1_metadata_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetArtistResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetArtistResponse) ProtoMessage() {} + +func (x *GetArtistResponse) ProtoReflect() protoreflect.Message { + mi := &file_metadata_v1_metadata_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetArtistResponse.ProtoReflect.Descriptor instead. +func (*GetArtistResponse) Descriptor() ([]byte, []int) { + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{8} +} + +func (x *GetArtistResponse) GetArtist() *Artist { + if x != nil { + return x.Artist + } + return nil +} + type SearchArtistsResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Artists []*Artist `protobuf:"bytes,1,rep,name=artists,proto3" json:"artists,omitempty"` @@ -811,6 +803,50 @@ func (x *SearchArtistsResponse) GetTotal() int32 { return 0 } +type GetAlbumResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Album *Album `protobuf:"bytes,1,opt,name=album,proto3" json:"album,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetAlbumResponse) Reset() { + *x = GetAlbumResponse{} + mi := &file_metadata_v1_metadata_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAlbumResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAlbumResponse) ProtoMessage() {} + +func (x *GetAlbumResponse) ProtoReflect() protoreflect.Message { + mi := &file_metadata_v1_metadata_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAlbumResponse.ProtoReflect.Descriptor instead. +func (*GetAlbumResponse) Descriptor() ([]byte, []int) { + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{10} +} + +func (x *GetAlbumResponse) GetAlbum() *Album { + if x != nil { + return x.Album + } + return nil +} + type GetArtistAlbumsResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Albums []*Album `protobuf:"bytes,1,rep,name=albums,proto3" json:"albums,omitempty"` @@ -821,7 +857,7 @@ type GetArtistAlbumsResponse struct { func (x *GetArtistAlbumsResponse) Reset() { *x = GetArtistAlbumsResponse{} - mi := &file_metadata_v1_metadata_proto_msgTypes[10] + mi := &file_metadata_v1_metadata_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -833,7 +869,7 @@ func (x *GetArtistAlbumsResponse) String() string { func (*GetArtistAlbumsResponse) ProtoMessage() {} func (x *GetArtistAlbumsResponse) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[10] + mi := &file_metadata_v1_metadata_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -846,7 +882,7 @@ func (x *GetArtistAlbumsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetArtistAlbumsResponse.ProtoReflect.Descriptor instead. func (*GetArtistAlbumsResponse) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{10} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{11} } func (x *GetArtistAlbumsResponse) GetAlbums() []*Album { @@ -863,6 +899,50 @@ func (x *GetArtistAlbumsResponse) GetTotal() int32 { return 0 } +type GetTrackResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Track *Track `protobuf:"bytes,1,opt,name=track,proto3" json:"track,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetTrackResponse) Reset() { + *x = GetTrackResponse{} + mi := &file_metadata_v1_metadata_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetTrackResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTrackResponse) ProtoMessage() {} + +func (x *GetTrackResponse) ProtoReflect() protoreflect.Message { + mi := &file_metadata_v1_metadata_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTrackResponse.ProtoReflect.Descriptor instead. +func (*GetTrackResponse) Descriptor() ([]byte, []int) { + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{12} +} + +func (x *GetTrackResponse) GetTrack() *Track { + if x != nil { + return x.Track + } + return nil +} + type GetAlbumTracksResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Tracks []*Track `protobuf:"bytes,1,rep,name=tracks,proto3" json:"tracks,omitempty"` @@ -872,7 +952,7 @@ type GetAlbumTracksResponse struct { func (x *GetAlbumTracksResponse) Reset() { *x = GetAlbumTracksResponse{} - mi := &file_metadata_v1_metadata_proto_msgTypes[11] + mi := &file_metadata_v1_metadata_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -884,7 +964,7 @@ func (x *GetAlbumTracksResponse) String() string { func (*GetAlbumTracksResponse) ProtoMessage() {} func (x *GetAlbumTracksResponse) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[11] + mi := &file_metadata_v1_metadata_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -897,7 +977,7 @@ func (x *GetAlbumTracksResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAlbumTracksResponse.ProtoReflect.Descriptor instead. func (*GetAlbumTracksResponse) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{11} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{13} } func (x *GetAlbumTracksResponse) GetTracks() []*Track { @@ -907,6 +987,58 @@ func (x *GetAlbumTracksResponse) GetTracks() []*Track { return nil } +type SearchAlbumsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Albums []*Album `protobuf:"bytes,1,rep,name=albums,proto3" json:"albums,omitempty"` + Total int32 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SearchAlbumsResponse) Reset() { + *x = SearchAlbumsResponse{} + mi := &file_metadata_v1_metadata_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SearchAlbumsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SearchAlbumsResponse) ProtoMessage() {} + +func (x *SearchAlbumsResponse) ProtoReflect() protoreflect.Message { + mi := &file_metadata_v1_metadata_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SearchAlbumsResponse.ProtoReflect.Descriptor instead. +func (*SearchAlbumsResponse) Descriptor() ([]byte, []int) { + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{14} +} + +func (x *SearchAlbumsResponse) GetAlbums() []*Album { + if x != nil { + return x.Albums + } + return nil +} + +func (x *SearchAlbumsResponse) GetTotal() int32 { + if x != nil { + return x.Total + } + return 0 +} + type SyncArtistResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Artist *Artist `protobuf:"bytes,1,opt,name=artist,proto3" json:"artist,omitempty"` @@ -918,7 +1050,7 @@ type SyncArtistResponse struct { func (x *SyncArtistResponse) Reset() { *x = SyncArtistResponse{} - mi := &file_metadata_v1_metadata_proto_msgTypes[12] + mi := &file_metadata_v1_metadata_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +1062,7 @@ func (x *SyncArtistResponse) String() string { func (*SyncArtistResponse) ProtoMessage() {} func (x *SyncArtistResponse) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[12] + mi := &file_metadata_v1_metadata_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +1075,7 @@ func (x *SyncArtistResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncArtistResponse.ProtoReflect.Descriptor instead. func (*SyncArtistResponse) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{12} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{15} } func (x *SyncArtistResponse) GetArtist() *Artist { @@ -972,7 +1104,7 @@ type Artist struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` SortName string `protobuf:"bytes,3,opt,name=sort_name,json=sortName,proto3" json:"sort_name,omitempty"` - ArtistType string `protobuf:"bytes,4,opt,name=artist_type,json=artistType,proto3" json:"artist_type,omitempty"` // person, group, orchestra, etc. + ArtistType string `protobuf:"bytes,4,opt,name=artist_type,json=artistType,proto3" json:"artist_type,omitempty"` Country string `protobuf:"bytes,5,opt,name=country,proto3" json:"country,omitempty"` FormedDate string `protobuf:"bytes,6,opt,name=formed_date,json=formedDate,proto3" json:"formed_date,omitempty"` DisbandedDate string `protobuf:"bytes,7,opt,name=disbanded_date,json=disbandedDate,proto3" json:"disbanded_date,omitempty"` @@ -986,7 +1118,7 @@ type Artist struct { func (x *Artist) Reset() { *x = Artist{} - mi := &file_metadata_v1_metadata_proto_msgTypes[13] + mi := &file_metadata_v1_metadata_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -998,7 +1130,7 @@ func (x *Artist) String() string { func (*Artist) ProtoMessage() {} func (x *Artist) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[13] + mi := &file_metadata_v1_metadata_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1011,7 +1143,7 @@ func (x *Artist) ProtoReflect() protoreflect.Message { // Deprecated: Use Artist.ProtoReflect.Descriptor instead. func (*Artist) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{13} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{16} } func (x *Artist) GetId() string { @@ -1095,7 +1227,7 @@ type Album struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - AlbumType string `protobuf:"bytes,3,opt,name=album_type,json=albumType,proto3" json:"album_type,omitempty"` // album, ep, single, compilation + AlbumType string `protobuf:"bytes,3,opt,name=album_type,json=albumType,proto3" json:"album_type,omitempty"` ReleaseDate string `protobuf:"bytes,4,opt,name=release_date,json=releaseDate,proto3" json:"release_date,omitempty"` Upc string `protobuf:"bytes,5,opt,name=upc,proto3" json:"upc,omitempty"` TotalTracks int32 `protobuf:"varint,6,opt,name=total_tracks,json=totalTracks,proto3" json:"total_tracks,omitempty"` @@ -1111,7 +1243,7 @@ type Album struct { func (x *Album) Reset() { *x = Album{} - mi := &file_metadata_v1_metadata_proto_msgTypes[14] + mi := &file_metadata_v1_metadata_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1123,7 +1255,7 @@ func (x *Album) String() string { func (*Album) ProtoMessage() {} func (x *Album) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[14] + mi := &file_metadata_v1_metadata_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1136,7 +1268,7 @@ func (x *Album) ProtoReflect() protoreflect.Message { // Deprecated: Use Album.ProtoReflect.Descriptor instead. func (*Album) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{14} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{17} } func (x *Album) GetId() string { @@ -1241,7 +1373,7 @@ type Track struct { func (x *Track) Reset() { *x = Track{} - mi := &file_metadata_v1_metadata_proto_msgTypes[15] + mi := &file_metadata_v1_metadata_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1253,7 +1385,7 @@ func (x *Track) String() string { func (*Track) ProtoMessage() {} func (x *Track) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[15] + mi := &file_metadata_v1_metadata_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1266,7 +1398,7 @@ func (x *Track) ProtoReflect() protoreflect.Message { // Deprecated: Use Track.ProtoReflect.Descriptor instead. func (*Track) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{15} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{18} } func (x *Track) GetId() string { @@ -1352,7 +1484,7 @@ type Work struct { func (x *Work) Reset() { *x = Work{} - mi := &file_metadata_v1_metadata_proto_msgTypes[16] + mi := &file_metadata_v1_metadata_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1364,7 +1496,7 @@ func (x *Work) String() string { func (*Work) ProtoMessage() {} func (x *Work) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[16] + mi := &file_metadata_v1_metadata_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1377,7 +1509,7 @@ func (x *Work) ProtoReflect() protoreflect.Message { // Deprecated: Use Work.ProtoReflect.Descriptor instead. func (*Work) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{16} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{19} } func (x *Work) GetId() string { @@ -1426,7 +1558,7 @@ type Label struct { func (x *Label) Reset() { *x = Label{} - mi := &file_metadata_v1_metadata_proto_msgTypes[17] + mi := &file_metadata_v1_metadata_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1438,7 +1570,7 @@ func (x *Label) String() string { func (*Label) ProtoMessage() {} func (x *Label) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[17] + mi := &file_metadata_v1_metadata_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1451,7 +1583,7 @@ func (x *Label) ProtoReflect() protoreflect.Message { // Deprecated: Use Label.ProtoReflect.Descriptor instead. func (*Label) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{17} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{20} } func (x *Label) GetId() string { @@ -1485,7 +1617,7 @@ type Genre struct { func (x *Genre) Reset() { *x = Genre{} - mi := &file_metadata_v1_metadata_proto_msgTypes[18] + mi := &file_metadata_v1_metadata_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1497,7 +1629,7 @@ func (x *Genre) String() string { func (*Genre) ProtoMessage() {} func (x *Genre) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[18] + mi := &file_metadata_v1_metadata_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1510,7 +1642,7 @@ func (x *Genre) ProtoReflect() protoreflect.Message { // Deprecated: Use Genre.ProtoReflect.Descriptor instead. func (*Genre) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{18} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{21} } func (x *Genre) GetId() string { @@ -1530,16 +1662,16 @@ func (x *Genre) GetName() string { type ArtistCredit struct { state protoimpl.MessageState `protogen:"open.v1"` Artist *Artist `protobuf:"bytes,1,opt,name=artist,proto3" json:"artist,omitempty"` - Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` // primary, featured, remixer, producer + Role string `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` Position int32 `protobuf:"varint,3,opt,name=position,proto3" json:"position,omitempty"` - JoinPhrase string `protobuf:"bytes,4,opt,name=join_phrase,json=joinPhrase,proto3" json:"join_phrase,omitempty"` // " & ", " feat. ", etc. + JoinPhrase string `protobuf:"bytes,4,opt,name=join_phrase,json=joinPhrase,proto3" json:"join_phrase,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ArtistCredit) Reset() { *x = ArtistCredit{} - mi := &file_metadata_v1_metadata_proto_msgTypes[19] + mi := &file_metadata_v1_metadata_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1551,7 +1683,7 @@ func (x *ArtistCredit) String() string { func (*ArtistCredit) ProtoMessage() {} func (x *ArtistCredit) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[19] + mi := &file_metadata_v1_metadata_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1564,7 +1696,7 @@ func (x *ArtistCredit) ProtoReflect() protoreflect.Message { // Deprecated: Use ArtistCredit.ProtoReflect.Descriptor instead. func (*ArtistCredit) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{19} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{22} } func (x *ArtistCredit) GetArtist() *Artist { @@ -1597,7 +1729,7 @@ func (x *ArtistCredit) GetJoinPhrase() string { type ExternalID struct { state protoimpl.MessageState `protogen:"open.v1"` - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // musicbrainz, spotify, discogs, etc. + Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` SourceId string `protobuf:"bytes,2,opt,name=source_id,json=sourceId,proto3" json:"source_id,omitempty"` Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` unknownFields protoimpl.UnknownFields @@ -1606,7 +1738,7 @@ type ExternalID struct { func (x *ExternalID) Reset() { *x = ExternalID{} - mi := &file_metadata_v1_metadata_proto_msgTypes[20] + mi := &file_metadata_v1_metadata_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1618,7 +1750,7 @@ func (x *ExternalID) String() string { func (*ExternalID) ProtoMessage() {} func (x *ExternalID) ProtoReflect() protoreflect.Message { - mi := &file_metadata_v1_metadata_proto_msgTypes[20] + mi := &file_metadata_v1_metadata_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1631,7 +1763,7 @@ func (x *ExternalID) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalID.ProtoReflect.Descriptor instead. func (*ExternalID) Descriptor() ([]byte, []int) { - return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{20} + return file_metadata_v1_metadata_proto_rawDescGZIP(), []int{23} } func (x *ExternalID) GetSource() string { @@ -1697,23 +1829,29 @@ const file_metadata_v1_metadata_proto_rawDesc = "" + "\x06artist\x18\x02 \x01(\tR\x06artist\x12\x14\n" + "\x05limit\x18\x03 \x01(\x05R\x05limit\x12\x16\n" + "\x06offset\x18\x04 \x01(\x05R\x06offset\x121\n" + - "\bprovider\x18\x05 \x01(\x0e2\x15.metadata.v1.ProviderR\bprovider\"X\n" + - "\x14SearchAlbumsResponse\x12*\n" + - "\x06albums\x18\x01 \x03(\v2\x12.metadata.v1.AlbumR\x06albums\x12\x14\n" + - "\x05total\x18\x02 \x01(\x05R\x05total\"\x9d\x01\n" + + "\bprovider\x18\x05 \x01(\x0e2\x15.metadata.v1.ProviderR\bprovider\"\x9d\x01\n" + "\x11SyncArtistRequest\x12\x14\n" + "\x04name\x18\x01 \x01(\tH\x00R\x04name\x125\n" + "\bexternal\x18\x02 \x01(\v2\x17.metadata.v1.ExternalIDH\x00R\bexternal\x121\n" + "\bprovider\x18\x03 \x01(\x0e2\x15.metadata.v1.ProviderR\bproviderB\b\n" + - "\x06target\"\\\n" + + "\x06target\"@\n" + + "\x11GetArtistResponse\x12+\n" + + "\x06artist\x18\x01 \x01(\v2\x13.metadata.v1.ArtistR\x06artist\"\\\n" + "\x15SearchArtistsResponse\x12-\n" + "\aartists\x18\x01 \x03(\v2\x13.metadata.v1.ArtistR\aartists\x12\x14\n" + - "\x05total\x18\x02 \x01(\x05R\x05total\"[\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\"<\n" + + "\x10GetAlbumResponse\x12(\n" + + "\x05album\x18\x01 \x01(\v2\x12.metadata.v1.AlbumR\x05album\"[\n" + "\x17GetArtistAlbumsResponse\x12*\n" + "\x06albums\x18\x01 \x03(\v2\x12.metadata.v1.AlbumR\x06albums\x12\x14\n" + - "\x05total\x18\x02 \x01(\x05R\x05total\"D\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\"<\n" + + "\x10GetTrackResponse\x12(\n" + + "\x05track\x18\x01 \x01(\v2\x12.metadata.v1.TrackR\x05track\"D\n" + "\x16GetAlbumTracksResponse\x12*\n" + - "\x06tracks\x18\x01 \x03(\v2\x12.metadata.v1.TrackR\x06tracks\"\x8b\x01\n" + + "\x06tracks\x18\x01 \x03(\v2\x12.metadata.v1.TrackR\x06tracks\"X\n" + + "\x14SearchAlbumsResponse\x12*\n" + + "\x06albums\x18\x01 \x03(\v2\x12.metadata.v1.AlbumR\x06albums\x12\x14\n" + + "\x05total\x18\x02 \x01(\x05R\x05total\"\x8b\x01\n" + "\x12SyncArtistResponse\x12+\n" + "\x06artist\x18\x01 \x01(\v2\x13.metadata.v1.ArtistR\x06artist\x12#\n" + "\ralbums_synced\x18\x02 \x01(\x05R\falbumsSynced\x12#\n" + @@ -1789,13 +1927,13 @@ const file_metadata_v1_metadata_proto_rawDesc = "" + "\x03url\x18\x03 \x01(\tR\x03url*>\n" + "\bProvider\x12\x18\n" + "\x14PROVIDER_UNSPECIFIED\x10\x00\x12\x18\n" + - "\x14PROVIDER_MUSICBRAINZ\x10\x012\x83\x05\n" + - "\x0fMetadataService\x12?\n" + - "\tGetArtist\x12\x1d.metadata.v1.GetArtistRequest\x1a\x13.metadata.v1.Artist\x12V\n" + - "\rSearchArtists\x12!.metadata.v1.SearchArtistsRequest\x1a\".metadata.v1.SearchArtistsResponse\x12<\n" + - "\bGetAlbum\x12\x1c.metadata.v1.GetAlbumRequest\x1a\x12.metadata.v1.Album\x12\\\n" + - "\x0fGetArtistAlbums\x12#.metadata.v1.GetArtistAlbumsRequest\x1a$.metadata.v1.GetArtistAlbumsResponse\x12<\n" + - "\bGetTrack\x12\x1c.metadata.v1.GetTrackRequest\x1a\x12.metadata.v1.Track\x12Y\n" + + "\x14PROVIDER_MUSICBRAINZ\x10\x012\xa4\x05\n" + + "\x0fMetadataService\x12J\n" + + "\tGetArtist\x12\x1d.metadata.v1.GetArtistRequest\x1a\x1e.metadata.v1.GetArtistResponse\x12V\n" + + "\rSearchArtists\x12!.metadata.v1.SearchArtistsRequest\x1a\".metadata.v1.SearchArtistsResponse\x12G\n" + + "\bGetAlbum\x12\x1c.metadata.v1.GetAlbumRequest\x1a\x1d.metadata.v1.GetAlbumResponse\x12\\\n" + + "\x0fGetArtistAlbums\x12#.metadata.v1.GetArtistAlbumsRequest\x1a$.metadata.v1.GetArtistAlbumsResponse\x12G\n" + + "\bGetTrack\x12\x1c.metadata.v1.GetTrackRequest\x1a\x1d.metadata.v1.GetTrackResponse\x12Y\n" + "\x0eGetAlbumTracks\x12\".metadata.v1.GetAlbumTracksRequest\x1a#.metadata.v1.GetAlbumTracksResponse\x12S\n" + "\fSearchAlbums\x12 .metadata.v1.SearchAlbumsRequest\x1a!.metadata.v1.SearchAlbumsResponse\x12M\n" + "\n" + @@ -1815,7 +1953,7 @@ func file_metadata_v1_metadata_proto_rawDescGZIP() []byte { } var file_metadata_v1_metadata_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_metadata_v1_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_metadata_v1_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_metadata_v1_metadata_proto_goTypes = []any{ (Provider)(0), // 0: metadata.v1.Provider (*GetArtistRequest)(nil), // 1: metadata.v1.GetArtistRequest @@ -1825,71 +1963,77 @@ var file_metadata_v1_metadata_proto_goTypes = []any{ (*GetTrackRequest)(nil), // 5: metadata.v1.GetTrackRequest (*GetAlbumTracksRequest)(nil), // 6: metadata.v1.GetAlbumTracksRequest (*SearchAlbumsRequest)(nil), // 7: metadata.v1.SearchAlbumsRequest - (*SearchAlbumsResponse)(nil), // 8: metadata.v1.SearchAlbumsResponse - (*SyncArtistRequest)(nil), // 9: metadata.v1.SyncArtistRequest + (*SyncArtistRequest)(nil), // 8: metadata.v1.SyncArtistRequest + (*GetArtistResponse)(nil), // 9: metadata.v1.GetArtistResponse (*SearchArtistsResponse)(nil), // 10: metadata.v1.SearchArtistsResponse - (*GetArtistAlbumsResponse)(nil), // 11: metadata.v1.GetArtistAlbumsResponse - (*GetAlbumTracksResponse)(nil), // 12: metadata.v1.GetAlbumTracksResponse - (*SyncArtistResponse)(nil), // 13: metadata.v1.SyncArtistResponse - (*Artist)(nil), // 14: metadata.v1.Artist - (*Album)(nil), // 15: metadata.v1.Album - (*Track)(nil), // 16: metadata.v1.Track - (*Work)(nil), // 17: metadata.v1.Work - (*Label)(nil), // 18: metadata.v1.Label - (*Genre)(nil), // 19: metadata.v1.Genre - (*ArtistCredit)(nil), // 20: metadata.v1.ArtistCredit - (*ExternalID)(nil), // 21: metadata.v1.ExternalID + (*GetAlbumResponse)(nil), // 11: metadata.v1.GetAlbumResponse + (*GetArtistAlbumsResponse)(nil), // 12: metadata.v1.GetArtistAlbumsResponse + (*GetTrackResponse)(nil), // 13: metadata.v1.GetTrackResponse + (*GetAlbumTracksResponse)(nil), // 14: metadata.v1.GetAlbumTracksResponse + (*SearchAlbumsResponse)(nil), // 15: metadata.v1.SearchAlbumsResponse + (*SyncArtistResponse)(nil), // 16: metadata.v1.SyncArtistResponse + (*Artist)(nil), // 17: metadata.v1.Artist + (*Album)(nil), // 18: metadata.v1.Album + (*Track)(nil), // 19: metadata.v1.Track + (*Work)(nil), // 20: metadata.v1.Work + (*Label)(nil), // 21: metadata.v1.Label + (*Genre)(nil), // 22: metadata.v1.Genre + (*ArtistCredit)(nil), // 23: metadata.v1.ArtistCredit + (*ExternalID)(nil), // 24: metadata.v1.ExternalID } var file_metadata_v1_metadata_proto_depIdxs = []int32{ - 21, // 0: metadata.v1.GetArtistRequest.external:type_name -> metadata.v1.ExternalID + 24, // 0: metadata.v1.GetArtistRequest.external:type_name -> metadata.v1.ExternalID 0, // 1: metadata.v1.GetArtistRequest.provider:type_name -> metadata.v1.Provider 0, // 2: metadata.v1.SearchArtistsRequest.provider:type_name -> metadata.v1.Provider - 21, // 3: metadata.v1.GetAlbumRequest.external:type_name -> metadata.v1.ExternalID + 24, // 3: metadata.v1.GetAlbumRequest.external:type_name -> metadata.v1.ExternalID 0, // 4: metadata.v1.GetAlbumRequest.provider:type_name -> metadata.v1.Provider 0, // 5: metadata.v1.GetArtistAlbumsRequest.provider:type_name -> metadata.v1.Provider - 21, // 6: metadata.v1.GetTrackRequest.external:type_name -> metadata.v1.ExternalID + 24, // 6: metadata.v1.GetTrackRequest.external:type_name -> metadata.v1.ExternalID 0, // 7: metadata.v1.GetTrackRequest.provider:type_name -> metadata.v1.Provider 0, // 8: metadata.v1.GetAlbumTracksRequest.provider:type_name -> metadata.v1.Provider 0, // 9: metadata.v1.SearchAlbumsRequest.provider:type_name -> metadata.v1.Provider - 15, // 10: metadata.v1.SearchAlbumsResponse.albums:type_name -> metadata.v1.Album - 21, // 11: metadata.v1.SyncArtistRequest.external:type_name -> metadata.v1.ExternalID - 0, // 12: metadata.v1.SyncArtistRequest.provider:type_name -> metadata.v1.Provider - 14, // 13: metadata.v1.SearchArtistsResponse.artists:type_name -> metadata.v1.Artist - 15, // 14: metadata.v1.GetArtistAlbumsResponse.albums:type_name -> metadata.v1.Album - 16, // 15: metadata.v1.GetAlbumTracksResponse.tracks:type_name -> metadata.v1.Track - 14, // 16: metadata.v1.SyncArtistResponse.artist:type_name -> metadata.v1.Artist - 19, // 17: metadata.v1.Artist.genres:type_name -> metadata.v1.Genre - 21, // 18: metadata.v1.Artist.external_ids:type_name -> metadata.v1.ExternalID - 20, // 19: metadata.v1.Album.artists:type_name -> metadata.v1.ArtistCredit - 18, // 20: metadata.v1.Album.label:type_name -> metadata.v1.Label - 19, // 21: metadata.v1.Album.genres:type_name -> metadata.v1.Genre - 21, // 22: metadata.v1.Album.external_ids:type_name -> metadata.v1.ExternalID - 20, // 23: metadata.v1.Track.artists:type_name -> metadata.v1.ArtistCredit - 17, // 24: metadata.v1.Track.work:type_name -> metadata.v1.Work - 21, // 25: metadata.v1.Track.external_ids:type_name -> metadata.v1.ExternalID - 20, // 26: metadata.v1.Work.composers:type_name -> metadata.v1.ArtistCredit - 14, // 27: metadata.v1.ArtistCredit.artist:type_name -> metadata.v1.Artist - 1, // 28: metadata.v1.MetadataService.GetArtist:input_type -> metadata.v1.GetArtistRequest - 2, // 29: metadata.v1.MetadataService.SearchArtists:input_type -> metadata.v1.SearchArtistsRequest - 3, // 30: metadata.v1.MetadataService.GetAlbum:input_type -> metadata.v1.GetAlbumRequest - 4, // 31: metadata.v1.MetadataService.GetArtistAlbums:input_type -> metadata.v1.GetArtistAlbumsRequest - 5, // 32: metadata.v1.MetadataService.GetTrack:input_type -> metadata.v1.GetTrackRequest - 6, // 33: metadata.v1.MetadataService.GetAlbumTracks:input_type -> metadata.v1.GetAlbumTracksRequest - 7, // 34: metadata.v1.MetadataService.SearchAlbums:input_type -> metadata.v1.SearchAlbumsRequest - 9, // 35: metadata.v1.MetadataService.SyncArtist:input_type -> metadata.v1.SyncArtistRequest - 14, // 36: metadata.v1.MetadataService.GetArtist:output_type -> metadata.v1.Artist - 10, // 37: metadata.v1.MetadataService.SearchArtists:output_type -> metadata.v1.SearchArtistsResponse - 15, // 38: metadata.v1.MetadataService.GetAlbum:output_type -> metadata.v1.Album - 11, // 39: metadata.v1.MetadataService.GetArtistAlbums:output_type -> metadata.v1.GetArtistAlbumsResponse - 16, // 40: metadata.v1.MetadataService.GetTrack:output_type -> metadata.v1.Track - 12, // 41: metadata.v1.MetadataService.GetAlbumTracks:output_type -> metadata.v1.GetAlbumTracksResponse - 8, // 42: metadata.v1.MetadataService.SearchAlbums:output_type -> metadata.v1.SearchAlbumsResponse - 13, // 43: metadata.v1.MetadataService.SyncArtist:output_type -> metadata.v1.SyncArtistResponse - 36, // [36:44] is the sub-list for method output_type - 28, // [28:36] is the sub-list for method input_type - 28, // [28:28] is the sub-list for extension type_name - 28, // [28:28] is the sub-list for extension extendee - 0, // [0:28] is the sub-list for field type_name + 24, // 10: metadata.v1.SyncArtistRequest.external:type_name -> metadata.v1.ExternalID + 0, // 11: metadata.v1.SyncArtistRequest.provider:type_name -> metadata.v1.Provider + 17, // 12: metadata.v1.GetArtistResponse.artist:type_name -> metadata.v1.Artist + 17, // 13: metadata.v1.SearchArtistsResponse.artists:type_name -> metadata.v1.Artist + 18, // 14: metadata.v1.GetAlbumResponse.album:type_name -> metadata.v1.Album + 18, // 15: metadata.v1.GetArtistAlbumsResponse.albums:type_name -> metadata.v1.Album + 19, // 16: metadata.v1.GetTrackResponse.track:type_name -> metadata.v1.Track + 19, // 17: metadata.v1.GetAlbumTracksResponse.tracks:type_name -> metadata.v1.Track + 18, // 18: metadata.v1.SearchAlbumsResponse.albums:type_name -> metadata.v1.Album + 17, // 19: metadata.v1.SyncArtistResponse.artist:type_name -> metadata.v1.Artist + 22, // 20: metadata.v1.Artist.genres:type_name -> metadata.v1.Genre + 24, // 21: metadata.v1.Artist.external_ids:type_name -> metadata.v1.ExternalID + 23, // 22: metadata.v1.Album.artists:type_name -> metadata.v1.ArtistCredit + 21, // 23: metadata.v1.Album.label:type_name -> metadata.v1.Label + 22, // 24: metadata.v1.Album.genres:type_name -> metadata.v1.Genre + 24, // 25: metadata.v1.Album.external_ids:type_name -> metadata.v1.ExternalID + 23, // 26: metadata.v1.Track.artists:type_name -> metadata.v1.ArtistCredit + 20, // 27: metadata.v1.Track.work:type_name -> metadata.v1.Work + 24, // 28: metadata.v1.Track.external_ids:type_name -> metadata.v1.ExternalID + 23, // 29: metadata.v1.Work.composers:type_name -> metadata.v1.ArtistCredit + 17, // 30: metadata.v1.ArtistCredit.artist:type_name -> metadata.v1.Artist + 1, // 31: metadata.v1.MetadataService.GetArtist:input_type -> metadata.v1.GetArtistRequest + 2, // 32: metadata.v1.MetadataService.SearchArtists:input_type -> metadata.v1.SearchArtistsRequest + 3, // 33: metadata.v1.MetadataService.GetAlbum:input_type -> metadata.v1.GetAlbumRequest + 4, // 34: metadata.v1.MetadataService.GetArtistAlbums:input_type -> metadata.v1.GetArtistAlbumsRequest + 5, // 35: metadata.v1.MetadataService.GetTrack:input_type -> metadata.v1.GetTrackRequest + 6, // 36: metadata.v1.MetadataService.GetAlbumTracks:input_type -> metadata.v1.GetAlbumTracksRequest + 7, // 37: metadata.v1.MetadataService.SearchAlbums:input_type -> metadata.v1.SearchAlbumsRequest + 8, // 38: metadata.v1.MetadataService.SyncArtist:input_type -> metadata.v1.SyncArtistRequest + 9, // 39: metadata.v1.MetadataService.GetArtist:output_type -> metadata.v1.GetArtistResponse + 10, // 40: metadata.v1.MetadataService.SearchArtists:output_type -> metadata.v1.SearchArtistsResponse + 11, // 41: metadata.v1.MetadataService.GetAlbum:output_type -> metadata.v1.GetAlbumResponse + 12, // 42: metadata.v1.MetadataService.GetArtistAlbums:output_type -> metadata.v1.GetArtistAlbumsResponse + 13, // 43: metadata.v1.MetadataService.GetTrack:output_type -> metadata.v1.GetTrackResponse + 14, // 44: metadata.v1.MetadataService.GetAlbumTracks:output_type -> metadata.v1.GetAlbumTracksResponse + 15, // 45: metadata.v1.MetadataService.SearchAlbums:output_type -> metadata.v1.SearchAlbumsResponse + 16, // 46: metadata.v1.MetadataService.SyncArtist:output_type -> metadata.v1.SyncArtistResponse + 39, // [39:47] is the sub-list for method output_type + 31, // [31:39] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name } func init() { file_metadata_v1_metadata_proto_init() } @@ -1910,7 +2054,7 @@ func file_metadata_v1_metadata_proto_init() { (*GetTrackRequest_External)(nil), (*GetTrackRequest_Isrc)(nil), } - file_metadata_v1_metadata_proto_msgTypes[8].OneofWrappers = []any{ + file_metadata_v1_metadata_proto_msgTypes[7].OneofWrappers = []any{ (*SyncArtistRequest_Name)(nil), (*SyncArtistRequest_External)(nil), } @@ -1920,7 +2064,7 @@ func file_metadata_v1_metadata_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_metadata_v1_metadata_proto_rawDesc), len(file_metadata_v1_metadata_proto_rawDesc)), NumEnums: 1, - NumMessages: 21, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/gen/metadata/v1/metadata_grpc.pb.go b/pkg/gen/metadata/v1/metadata_grpc.pb.go index 0b69e17..f382674 100644 --- a/pkg/gen/metadata/v1/metadata_grpc.pb.go +++ b/pkg/gen/metadata/v1/metadata_grpc.pb.go @@ -32,24 +32,14 @@ const ( // MetadataServiceClient is the client API for MetadataService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -// -// MetadataService provides music metadata aggregation. type MetadataServiceClient interface { - // GetArtist retrieves an artist by ID or external source ID. - GetArtist(ctx context.Context, in *GetArtistRequest, opts ...grpc.CallOption) (*Artist, error) - // SearchArtists searches for artists by name. + GetArtist(ctx context.Context, in *GetArtistRequest, opts ...grpc.CallOption) (*GetArtistResponse, error) SearchArtists(ctx context.Context, in *SearchArtistsRequest, opts ...grpc.CallOption) (*SearchArtistsResponse, error) - // GetAlbum retrieves an album by ID. - GetAlbum(ctx context.Context, in *GetAlbumRequest, opts ...grpc.CallOption) (*Album, error) - // GetArtistAlbums retrieves all albums by an artist. + GetAlbum(ctx context.Context, in *GetAlbumRequest, opts ...grpc.CallOption) (*GetAlbumResponse, error) GetArtistAlbums(ctx context.Context, in *GetArtistAlbumsRequest, opts ...grpc.CallOption) (*GetArtistAlbumsResponse, error) - // GetTrack retrieves a track by ID. - GetTrack(ctx context.Context, in *GetTrackRequest, opts ...grpc.CallOption) (*Track, error) - // GetAlbumTracks retrieves all tracks on an album. + GetTrack(ctx context.Context, in *GetTrackRequest, opts ...grpc.CallOption) (*GetTrackResponse, error) GetAlbumTracks(ctx context.Context, in *GetAlbumTracksRequest, opts ...grpc.CallOption) (*GetAlbumTracksResponse, error) - // SearchAlbums searches for albums by name, optionally filtered by artist. SearchAlbums(ctx context.Context, in *SearchAlbumsRequest, opts ...grpc.CallOption) (*SearchAlbumsResponse, error) - // SyncArtist triggers ingestion of an artist from external sources. SyncArtist(ctx context.Context, in *SyncArtistRequest, opts ...grpc.CallOption) (*SyncArtistResponse, error) } @@ -61,9 +51,9 @@ func NewMetadataServiceClient(cc grpc.ClientConnInterface) MetadataServiceClient return &metadataServiceClient{cc} } -func (c *metadataServiceClient) GetArtist(ctx context.Context, in *GetArtistRequest, opts ...grpc.CallOption) (*Artist, error) { +func (c *metadataServiceClient) GetArtist(ctx context.Context, in *GetArtistRequest, opts ...grpc.CallOption) (*GetArtistResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(Artist) + out := new(GetArtistResponse) err := c.cc.Invoke(ctx, MetadataService_GetArtist_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -81,9 +71,9 @@ func (c *metadataServiceClient) SearchArtists(ctx context.Context, in *SearchArt return out, nil } -func (c *metadataServiceClient) GetAlbum(ctx context.Context, in *GetAlbumRequest, opts ...grpc.CallOption) (*Album, error) { +func (c *metadataServiceClient) GetAlbum(ctx context.Context, in *GetAlbumRequest, opts ...grpc.CallOption) (*GetAlbumResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(Album) + out := new(GetAlbumResponse) err := c.cc.Invoke(ctx, MetadataService_GetAlbum_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -101,9 +91,9 @@ func (c *metadataServiceClient) GetArtistAlbums(ctx context.Context, in *GetArti return out, nil } -func (c *metadataServiceClient) GetTrack(ctx context.Context, in *GetTrackRequest, opts ...grpc.CallOption) (*Track, error) { +func (c *metadataServiceClient) GetTrack(ctx context.Context, in *GetTrackRequest, opts ...grpc.CallOption) (*GetTrackResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(Track) + out := new(GetTrackResponse) err := c.cc.Invoke(ctx, MetadataService_GetTrack_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -144,24 +134,14 @@ func (c *metadataServiceClient) SyncArtist(ctx context.Context, in *SyncArtistRe // MetadataServiceServer is the server API for MetadataService service. // All implementations must embed UnimplementedMetadataServiceServer // for forward compatibility. -// -// MetadataService provides music metadata aggregation. type MetadataServiceServer interface { - // GetArtist retrieves an artist by ID or external source ID. - GetArtist(context.Context, *GetArtistRequest) (*Artist, error) - // SearchArtists searches for artists by name. + GetArtist(context.Context, *GetArtistRequest) (*GetArtistResponse, error) SearchArtists(context.Context, *SearchArtistsRequest) (*SearchArtistsResponse, error) - // GetAlbum retrieves an album by ID. - GetAlbum(context.Context, *GetAlbumRequest) (*Album, error) - // GetArtistAlbums retrieves all albums by an artist. + GetAlbum(context.Context, *GetAlbumRequest) (*GetAlbumResponse, error) GetArtistAlbums(context.Context, *GetArtistAlbumsRequest) (*GetArtistAlbumsResponse, error) - // GetTrack retrieves a track by ID. - GetTrack(context.Context, *GetTrackRequest) (*Track, error) - // GetAlbumTracks retrieves all tracks on an album. + GetTrack(context.Context, *GetTrackRequest) (*GetTrackResponse, error) GetAlbumTracks(context.Context, *GetAlbumTracksRequest) (*GetAlbumTracksResponse, error) - // SearchAlbums searches for albums by name, optionally filtered by artist. SearchAlbums(context.Context, *SearchAlbumsRequest) (*SearchAlbumsResponse, error) - // SyncArtist triggers ingestion of an artist from external sources. SyncArtist(context.Context, *SyncArtistRequest) (*SyncArtistResponse, error) mustEmbedUnimplementedMetadataServiceServer() } @@ -173,19 +153,19 @@ type MetadataServiceServer interface { // pointer dereference when methods are called. type UnimplementedMetadataServiceServer struct{} -func (UnimplementedMetadataServiceServer) GetArtist(context.Context, *GetArtistRequest) (*Artist, error) { +func (UnimplementedMetadataServiceServer) GetArtist(context.Context, *GetArtistRequest) (*GetArtistResponse, error) { return nil, status.Error(codes.Unimplemented, "method GetArtist not implemented") } func (UnimplementedMetadataServiceServer) SearchArtists(context.Context, *SearchArtistsRequest) (*SearchArtistsResponse, error) { return nil, status.Error(codes.Unimplemented, "method SearchArtists not implemented") } -func (UnimplementedMetadataServiceServer) GetAlbum(context.Context, *GetAlbumRequest) (*Album, error) { +func (UnimplementedMetadataServiceServer) GetAlbum(context.Context, *GetAlbumRequest) (*GetAlbumResponse, error) { return nil, status.Error(codes.Unimplemented, "method GetAlbum not implemented") } func (UnimplementedMetadataServiceServer) GetArtistAlbums(context.Context, *GetArtistAlbumsRequest) (*GetArtistAlbumsResponse, error) { return nil, status.Error(codes.Unimplemented, "method GetArtistAlbums not implemented") } -func (UnimplementedMetadataServiceServer) GetTrack(context.Context, *GetTrackRequest) (*Track, error) { +func (UnimplementedMetadataServiceServer) GetTrack(context.Context, *GetTrackRequest) (*GetTrackResponse, error) { return nil, status.Error(codes.Unimplemented, "method GetTrack not implemented") } func (UnimplementedMetadataServiceServer) GetAlbumTracks(context.Context, *GetAlbumTracksRequest) (*GetAlbumTracksResponse, error) { diff --git a/proto/metadata/v1/metadata.proto b/proto/metadata/v1/metadata.proto index 2897009..7ec0f4f 100644 --- a/proto/metadata/v1/metadata.proto +++ b/proto/metadata/v1/metadata.proto @@ -9,30 +9,14 @@ enum Provider { PROVIDER_MUSICBRAINZ = 1; } -// MetadataService provides music metadata aggregation. service MetadataService { - // GetArtist retrieves an artist by ID or external source ID. - rpc GetArtist(GetArtistRequest) returns (Artist); - - // SearchArtists searches for artists by name. + rpc GetArtist(GetArtistRequest) returns (GetArtistResponse); rpc SearchArtists(SearchArtistsRequest) returns (SearchArtistsResponse); - - // GetAlbum retrieves an album by ID. - rpc GetAlbum(GetAlbumRequest) returns (Album); - - // GetArtistAlbums retrieves all albums by an artist. + rpc GetAlbum(GetAlbumRequest) returns (GetAlbumResponse); rpc GetArtistAlbums(GetArtistAlbumsRequest) returns (GetArtistAlbumsResponse); - - // GetTrack retrieves a track by ID. - rpc GetTrack(GetTrackRequest) returns (Track); - - // GetAlbumTracks retrieves all tracks on an album. + rpc GetTrack(GetTrackRequest) returns (GetTrackResponse); rpc GetAlbumTracks(GetAlbumTracksRequest) returns (GetAlbumTracksResponse); - - // SearchAlbums searches for albums by name, optionally filtered by artist. rpc SearchAlbums(SearchAlbumsRequest) returns (SearchAlbumsResponse); - - // SyncArtist triggers ingestion of an artist from external sources. rpc SyncArtist(SyncArtistRequest) returns (SyncArtistResponse); } @@ -40,10 +24,10 @@ service MetadataService { message GetArtistRequest { oneof identifier { - string id = 1; // Internal UUID - ExternalID external = 2; // External source ID (e.g., musicbrainz MBID) + string id = 1; + ExternalID external = 2; } - Provider provider = 3; // UNSPECIFIED = query all providers + Provider provider = 3; } message SearchArtistsRequest { @@ -90,11 +74,6 @@ message SearchAlbumsRequest { Provider provider = 5; } -message SearchAlbumsResponse { - repeated Album albums = 1; - int32 total = 2; -} - message SyncArtistRequest { oneof target { string name = 1; @@ -105,20 +84,37 @@ message SyncArtistRequest { // Responses +message GetArtistResponse { + Artist artist = 1; +} + message SearchArtistsResponse { repeated Artist artists = 1; int32 total = 2; } +message GetAlbumResponse { + Album album = 1; +} + message GetArtistAlbumsResponse { repeated Album albums = 1; int32 total = 2; } +message GetTrackResponse { + Track track = 1; +} + message GetAlbumTracksResponse { repeated Track tracks = 1; } +message SearchAlbumsResponse { + repeated Album albums = 1; + int32 total = 2; +} + message SyncArtistResponse { Artist artist = 1; int32 albums_synced = 2; @@ -131,7 +127,7 @@ message Artist { string id = 1; string name = 2; string sort_name = 3; - string artist_type = 4; // person, group, orchestra, etc. + string artist_type = 4; string country = 5; string formed_date = 6; string disbanded_date = 7; @@ -144,7 +140,7 @@ message Artist { message Album { string id = 1; string title = 2; - string album_type = 3; // album, ep, single, compilation + string album_type = 3; string release_date = 4; string upc = 5; int32 total_tracks = 6; @@ -190,13 +186,13 @@ message Genre { message ArtistCredit { Artist artist = 1; - string role = 2; // primary, featured, remixer, producer + string role = 2; int32 position = 3; - string join_phrase = 4; // " & ", " feat. ", etc. + string join_phrase = 4; } message ExternalID { - string source = 1; // musicbrainz, spotify, discogs, etc. + string source = 1; string source_id = 2; string url = 3; } diff --git a/tests/e2e/metadata_test.go b/tests/e2e/metadata_test.go index 84780f0..b6529a5 100644 --- a/tests/e2e/metadata_test.go +++ b/tests/e2e/metadata_test.go @@ -130,13 +130,14 @@ func TestGetArtist(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - artist, err := client.GetArtist(ctx, &metadatav1.GetArtistRequest{ + resp, err := client.GetArtist(ctx, &metadatav1.GetArtistRequest{ Identifier: &metadatav1.GetArtistRequest_Id{Id: radioheadMBID}, }) if err != nil { t.Fatalf("GetArtist failed: %v", err) } + artist := resp.Artist if artist.Id != radioheadMBID { t.Errorf("expected ID %q, got %q", radioheadMBID, artist.Id) } @@ -234,13 +235,14 @@ func TestGetAlbum(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - album, err := client.GetAlbum(ctx, &metadatav1.GetAlbumRequest{ + albumResp, err := client.GetAlbum(ctx, &metadatav1.GetAlbumRequest{ Identifier: &metadatav1.GetAlbumRequest_Id{Id: okComputerMBID}, }) if err != nil { t.Fatalf("GetAlbum failed: %v", err) } + album := albumResp.Album if album.Id != okComputerMBID { t.Errorf("expected ID %q, got %q", okComputerMBID, album.Id) } @@ -335,13 +337,14 @@ func TestGetTrack(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - track, err := client.GetTrack(ctx, &metadatav1.GetTrackRequest{ + trackResp, err := client.GetTrack(ctx, &metadatav1.GetTrackRequest{ Identifier: &metadatav1.GetTrackRequest_Id{Id: paranoidAndroid}, }) if err != nil { t.Fatalf("GetTrack failed: %v", err) } + track := trackResp.Track if track.Id != paranoidAndroid { t.Errorf("expected ID %q, got %q", paranoidAndroid, track.Id) } @@ -375,15 +378,15 @@ func TestGetTrackByISRC(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - track, err := client.GetTrack(ctx, &metadatav1.GetTrackRequest{ + isrcResp, err := client.GetTrack(ctx, &metadatav1.GetTrackRequest{ Identifier: &metadatav1.GetTrackRequest_Isrc{Isrc: "GBAYE9701376"}, }) if err != nil { t.Fatalf("GetTrack by ISRC failed: %v", err) } - if track.Title != "Paranoid Android" { - t.Errorf("expected title 'Paranoid Android', got %q", track.Title) + if isrcResp.Track.Title != "Paranoid Android" { + t.Errorf("expected title 'Paranoid Android', got %q", isrcResp.Track.Title) } }