mirror of
https://git.sr.ht/~phw/scotty
synced 2025-06-07 05:18:33 +02:00
Use LB API to lookup missing metadata for loves
This is faster than using the MBID API individually
This commit is contained in:
parent
dddd2e4eec
commit
7542657925
4 changed files with 194 additions and 51 deletions
|
@ -32,35 +32,6 @@ import (
|
|||
"go.uploadedlobster.com/scotty/internal/models"
|
||||
)
|
||||
|
||||
func LookupRecording(
|
||||
ctx context.Context,
|
||||
mb *musicbrainzws2.Client,
|
||||
mbid mbtypes.MBID,
|
||||
) (*listenbrainz.Track, error) {
|
||||
filter := musicbrainzws2.IncludesFilter{
|
||||
Includes: []string{"artist-credits"},
|
||||
}
|
||||
recording, err := mb.LookupRecording(ctx, mbid, filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
artistMBIDs := make([]mbtypes.MBID, 0, len(recording.ArtistCredit))
|
||||
for _, artist := range recording.ArtistCredit {
|
||||
artistMBIDs = append(artistMBIDs, artist.Artist.ID)
|
||||
}
|
||||
track := listenbrainz.Track{
|
||||
TrackName: recording.Title,
|
||||
ArtistName: recording.ArtistCredit.String(),
|
||||
MBIDMapping: &listenbrainz.MBIDMapping{
|
||||
// In case of redirects this MBID differs from the looked up MBID
|
||||
RecordingMBID: recording.ID,
|
||||
ArtistMBIDs: artistMBIDs,
|
||||
},
|
||||
}
|
||||
return &track, nil
|
||||
}
|
||||
|
||||
func AsListen(lbListen listenbrainz.Listen) models.Listen {
|
||||
listen := models.Listen{
|
||||
ListenedAt: time.Unix(lbListen.ListenedAt, 0),
|
||||
|
@ -113,3 +84,107 @@ func AsTrack(t listenbrainz.Track) models.Track {
|
|||
|
||||
return track
|
||||
}
|
||||
|
||||
func LookupRecording(
|
||||
ctx context.Context,
|
||||
mb *musicbrainzws2.Client,
|
||||
mbid mbtypes.MBID,
|
||||
) (*listenbrainz.Track, error) {
|
||||
filter := musicbrainzws2.IncludesFilter{
|
||||
Includes: []string{"artist-credits"},
|
||||
}
|
||||
recording, err := mb.LookupRecording(ctx, mbid, filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
artistMBIDs := make([]mbtypes.MBID, 0, len(recording.ArtistCredit))
|
||||
for _, artist := range recording.ArtistCredit {
|
||||
artistMBIDs = append(artistMBIDs, artist.Artist.ID)
|
||||
}
|
||||
track := listenbrainz.Track{
|
||||
TrackName: recording.Title,
|
||||
ArtistName: recording.ArtistCredit.String(),
|
||||
MBIDMapping: &listenbrainz.MBIDMapping{
|
||||
// In case of redirects this MBID differs from the looked up MBID
|
||||
RecordingMBID: recording.ID,
|
||||
ArtistMBIDs: artistMBIDs,
|
||||
},
|
||||
}
|
||||
return &track, nil
|
||||
}
|
||||
|
||||
func ExtendTrackMetadata(
|
||||
ctx context.Context,
|
||||
lb *listenbrainz.Client,
|
||||
mb *musicbrainzws2.Client,
|
||||
feedbacks *[]listenbrainz.Feedback,
|
||||
) ([]models.Love, error) {
|
||||
mbids := make([]mbtypes.MBID, 0, len(*feedbacks))
|
||||
for _, feedback := range *feedbacks {
|
||||
if feedback.TrackMetadata == nil && feedback.RecordingMBID != "" {
|
||||
mbids = append(mbids, feedback.RecordingMBID)
|
||||
}
|
||||
}
|
||||
result, err := lb.MetadataRecordings(ctx, mbids)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
loves := make([]models.Love, 0, len(*feedbacks))
|
||||
for _, feedback := range *feedbacks {
|
||||
if feedback.TrackMetadata == nil && feedback.RecordingMBID != "" {
|
||||
metadata, ok := result[feedback.RecordingMBID]
|
||||
if ok {
|
||||
feedback.TrackMetadata = trackFromMetadataLookup(
|
||||
feedback.RecordingMBID, metadata)
|
||||
} else {
|
||||
// MBID not in result. This is probably a MBID redirect, get
|
||||
// data from MB instead (slower).
|
||||
// If this also fails, just leave the metadata empty.
|
||||
track, err := LookupRecording(ctx, mb, feedback.RecordingMBID)
|
||||
if err == nil {
|
||||
feedback.TrackMetadata = track
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
loves = append(loves, AsLove(feedback))
|
||||
}
|
||||
|
||||
return loves, nil
|
||||
}
|
||||
|
||||
func trackFromMetadataLookup(
|
||||
recordingMBID mbtypes.MBID,
|
||||
metadata listenbrainz.RecordingMetadata,
|
||||
) *listenbrainz.Track {
|
||||
artistMBIDs := make([]mbtypes.MBID, 0, len(metadata.Artist.Artists))
|
||||
artists := make([]listenbrainz.Artist, 0, len(metadata.Artist.Artists))
|
||||
for _, artist := range metadata.Artist.Artists {
|
||||
artistMBIDs = append(artistMBIDs, artist.ArtistMBID)
|
||||
artists = append(artists, listenbrainz.Artist{
|
||||
ArtistCreditName: artist.Name,
|
||||
ArtistMBID: artist.ArtistMBID,
|
||||
JoinPhrase: artist.JoinPhrase,
|
||||
})
|
||||
}
|
||||
|
||||
return &listenbrainz.Track{
|
||||
TrackName: metadata.Recording.Name,
|
||||
ArtistName: metadata.Artist.Name,
|
||||
ReleaseName: metadata.Release.Name,
|
||||
AdditionalInfo: map[string]any{
|
||||
"duration_ms": metadata.Recording.Length,
|
||||
"release_group_mbid": metadata.Release.ReleaseGroupMBID,
|
||||
},
|
||||
MBIDMapping: &listenbrainz.MBIDMapping{
|
||||
RecordingMBID: recordingMBID,
|
||||
ReleaseMBID: metadata.Release.MBID,
|
||||
ArtistMBIDs: artistMBIDs,
|
||||
Artists: artists,
|
||||
CAAID: metadata.Release.CAAID,
|
||||
CAAReleaseMBID: metadata.Release.CAAReleaseMBID,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue