Deduplicate GetAlbum response: merge release info into AlbumDetail, track release into TrackDetail

This commit is contained in:
Alexander
2026-05-09 23:23:34 +02:00
parent 2740585261
commit 6320f37240
2 changed files with 69 additions and 95 deletions
+61 -70
View File
@@ -289,6 +289,44 @@ func (service *MusicAgregatorService) buildAlbumInfo(ctx context.Context, dbAlbu
dbTracksByExternalID[t.ExternalID] = t dbTracksByExternalID[t.ExternalID] = t
} }
var trackReleasesByTrackID map[string]*database.TrackRelease
albumReleases, err := service.albumReleases.GetByAlbumID(ctx, dbAlbum.ID)
if err == nil && len(albumReleases) > 0 {
ar := albumReleases[0]
album.Release = &pb.AlbumReleaseDetail{
Id: ar.ID,
Format: ar.Format,
Channels: int32(ar.Channels),
IsLossless: ar.IsLossless,
TotalSize: ar.TotalSize,
TotalDurationMs: int32(ar.TotalDurationMs),
TrackCount: int32(ar.TrackCount),
HasCoverArt: ar.HasCoverArt,
HasCueSheet: ar.HasCueSheet,
HasRipLog: ar.HasRipLog,
Path: ar.Path,
}
if ar.BitDepth != nil {
album.Release.BitDepth = int32(*ar.BitDepth)
}
if ar.SampleRate != nil {
album.Release.SampleRate = int32(*ar.SampleRate)
}
if ar.Source != nil {
album.Release.Source = *ar.Source
}
trs, err := service.trackReleases.GetByAlbumReleaseID(ctx, ar.ID)
if err == nil {
trackReleasesByTrackID = make(map[string]*database.TrackRelease, len(trs))
for _, tr := range trs {
if tr.TrackID != nil {
trackReleasesByTrackID[*tr.TrackID] = tr
}
}
}
}
tracks := make([]*pb.TrackDetail, 0, len(metadataTracks)) tracks := make([]*pb.TrackDetail, 0, len(metadataTracks))
for _, mt := range metadataTracks { for _, mt := range metadataTracks {
td := &pb.TrackDetail{ td := &pb.TrackDetail{
@@ -310,85 +348,38 @@ func (service *MusicAgregatorService) buildAlbumInfo(ctx context.Context, dbAlbu
if dbTrack, ok := dbTracksByExternalID[mt.GetId()]; ok { if dbTrack, ok := dbTracksByExternalID[mt.GetId()]; ok {
td.Id = dbTrack.ID td.Id = dbTrack.ID
if df, ok := downloadFilesByTrackID[dbTrack.ID]; ok {
td.File = &pb.TrackFile{ if tr, ok := trackReleasesByTrackID[dbTrack.ID]; ok {
Path: df.FilePath, td.FilePath = tr.FilePath
Format: df.FileType, td.FileSize = tr.FileSize
Size: df.FileSize, td.Format = tr.Format
td.Channels = int32(tr.Channels)
if tr.DurationMs != nil {
td.DurationMs = int32(*tr.DurationMs)
} }
if tr.BitDepth != nil {
td.BitDepth = int32(*tr.BitDepth)
}
if tr.SampleRate != nil {
td.SampleRate = int32(*tr.SampleRate)
}
if tr.BitrateKbps != nil {
td.BitrateKbps = int32(*tr.BitrateKbps)
}
} else if df, ok := downloadFilesByTrackID[dbTrack.ID]; ok {
td.FilePath = df.FilePath
td.FileSize = df.FileSize
td.Format = df.FileType
} }
} }
tracks = append(tracks, td) tracks = append(tracks, td)
} }
info := &pb.AlbumInfo{ return &pb.AlbumInfo{
Album: album, Album: album,
Tracks: tracks, Tracks: tracks,
} }, nil
albumReleases, err := service.albumReleases.GetByAlbumID(ctx, dbAlbum.ID)
if err == nil && len(albumReleases) > 0 {
ar := albumReleases[0]
releaseDetail := &pb.AlbumReleaseDetail{
Id: ar.ID,
Format: ar.Format,
Channels: int32(ar.Channels),
IsLossless: ar.IsLossless,
TotalSize: ar.TotalSize,
TotalDurationMs: int32(ar.TotalDurationMs),
TrackCount: int32(ar.TrackCount),
HasCoverArt: ar.HasCoverArt,
HasCueSheet: ar.HasCueSheet,
HasRipLog: ar.HasRipLog,
Path: ar.Path,
}
if ar.BitDepth != nil {
releaseDetail.BitDepth = int32(*ar.BitDepth)
}
if ar.SampleRate != nil {
releaseDetail.SampleRate = int32(*ar.SampleRate)
}
if ar.Source != nil {
releaseDetail.Source = *ar.Source
}
trackReleases, err := service.trackReleases.GetByAlbumReleaseID(ctx, ar.ID)
if err == nil {
for _, tr := range trackReleases {
trd := &pb.TrackReleaseDetail{
Id: tr.ID,
Title: tr.Title,
TrackNumber: int32(tr.TrackNumber),
DiscNumber: int32(tr.DiscNumber),
Format: tr.Format,
Channels: int32(tr.Channels),
FileSize: tr.FileSize,
FilePath: tr.FilePath,
}
if tr.TrackID != nil {
trd.TrackId = *tr.TrackID
}
if tr.DurationMs != nil {
trd.DurationMs = int32(*tr.DurationMs)
}
if tr.BitDepth != nil {
trd.BitDepth = int32(*tr.BitDepth)
}
if tr.SampleRate != nil {
trd.SampleRate = int32(*tr.SampleRate)
}
if tr.BitrateKbps != nil {
trd.BitrateKbps = int32(*tr.BitrateKbps)
}
releaseDetail.Tracks = append(releaseDetail.Tracks, trd)
}
}
info.Release = releaseDetail
}
return info, nil
} }
func (service *MusicAgregatorService) AnalyzeAlbumRelease(ctx context.Context, req *pb.AnalyzeAlbumReleaseRequest) (*pb.AnalyzeAlbumReleaseResponse, error) { func (service *MusicAgregatorService) AnalyzeAlbumRelease(ctx context.Context, req *pb.AnalyzeAlbumReleaseRequest) (*pb.AnalyzeAlbumReleaseResponse, error) {
+8 -25
View File
@@ -69,6 +69,7 @@ message AlbumDetail {
string label = 10; string label = 10;
MonitorState monitor_state = 11; MonitorState monitor_state = 11;
DownloadInfo download = 12; DownloadInfo download = 12;
AlbumReleaseDetail release = 13;
} }
message DownloadInfo { message DownloadInfo {
@@ -85,7 +86,6 @@ message GetAlbumRequest {
message AlbumInfo { message AlbumInfo {
AlbumDetail album = 1; AlbumDetail album = 1;
repeated TrackDetail tracks = 2; repeated TrackDetail tracks = 2;
AlbumReleaseDetail release = 3;
} }
message GetAlbumResponse { message GetAlbumResponse {
@@ -110,7 +110,13 @@ message TrackDetail {
string isrc = 7; string isrc = 7;
bool explicit = 8; bool explicit = 8;
repeated ArtistCredit artists = 9; repeated ArtistCredit artists = 9;
TrackFile file = 10; string file_path = 10;
int64 file_size = 11;
string format = 12;
int32 bit_depth = 13;
int32 sample_rate = 14;
int32 channels = 15;
int32 bitrate_kbps = 16;
} }
message ArtistCredit { message ArtistCredit {
@@ -118,12 +124,6 @@ message ArtistCredit {
string name = 2; string name = 2;
} }
message TrackFile {
string path = 1;
string format = 2;
int64 size = 3;
}
message AlbumReleaseDetail { message AlbumReleaseDetail {
string id = 1; string id = 1;
string format = 2; string format = 2;
@@ -139,23 +139,6 @@ message AlbumReleaseDetail {
bool has_cue_sheet = 12; bool has_cue_sheet = 12;
bool has_rip_log = 13; bool has_rip_log = 13;
string path = 14; string path = 14;
repeated TrackReleaseDetail tracks = 15;
}
message TrackReleaseDetail {
string id = 1;
string track_id = 2;
string title = 3;
int32 track_number = 4;
int32 disc_number = 5;
int32 duration_ms = 6;
string format = 7;
int32 bit_depth = 8;
int32 sample_rate = 9;
int32 channels = 10;
int32 bitrate_kbps = 11;
int64 file_size = 12;
string file_path = 13;
} }
message MonitoredRelease { message MonitoredRelease {