diff --git a/backends/funkwhale/funkwhale.go b/backends/funkwhale/funkwhale.go index 785761c..708f2f9 100644 --- a/backends/funkwhale/funkwhale.go +++ b/backends/funkwhale/funkwhale.go @@ -151,6 +151,7 @@ func (l Listening) ToListen() models.Listen { ReleaseName: track.Album.Title, ArtistNames: []string{track.Artist.Name}, TrackNumber: track.Position, + DiscNumber: track.DiscNumber, RecordingMbid: models.MBID(track.RecordingMbid), ReleaseMbid: models.MBID(track.Album.ReleaseMbid), ArtistMbids: []models.MBID{models.MBID(track.Artist.ArtistMbid)}, @@ -184,6 +185,7 @@ func (f FavoriteTrack) ToLove() models.Love { ReleaseName: track.Album.Title, ArtistNames: []string{track.Artist.Name}, TrackNumber: track.Position, + DiscNumber: track.DiscNumber, RecordingMbid: recordingMbid, ReleaseMbid: models.MBID(track.Album.ReleaseMbid), ArtistMbids: []models.MBID{models.MBID(track.Artist.ArtistMbid)}, diff --git a/backends/funkwhale/funkwhale_test.go b/backends/funkwhale/funkwhale_test.go index da18a69..a548c3c 100644 --- a/backends/funkwhale/funkwhale_test.go +++ b/backends/funkwhale/funkwhale_test.go @@ -70,6 +70,7 @@ func TestFunkwhaleListeningToListen(t *testing.T) { assert.Equal(fwListen.Track.Album.Title, listen.ReleaseName) assert.Equal([]string{fwListen.Track.Artist.Name}, listen.ArtistNames) assert.Equal(fwListen.Track.Position, listen.Track.TrackNumber) + assert.Equal(fwListen.Track.DiscNumber, listen.Track.DiscNumber) assert.Equal(fwListen.Track.Tags, listen.Track.Tags) // assert.Equal(backends.FunkwhaleClientName, listen.AdditionalInfo["disc_number"]) assert.Equal(models.MBID(fwListen.Track.RecordingMbid), listen.RecordingMbid) @@ -114,6 +115,7 @@ func TestFunkwhaleFavoriteTrackToLove(t *testing.T) { assert.Equal(favorite.Track.Album.Title, love.ReleaseName) assert.Equal([]string{favorite.Track.Artist.Name}, love.ArtistNames) assert.Equal(favorite.Track.Position, love.Track.TrackNumber) + assert.Equal(favorite.Track.DiscNumber, love.Track.DiscNumber) assert.Equal(favorite.Track.Tags, love.Track.Tags) assert.Equal(models.MBID(favorite.Track.RecordingMbid), love.RecordingMbid) assert.Equal(models.MBID(favorite.Track.RecordingMbid), love.Track.RecordingMbid) diff --git a/backends/listenbrainz/listenbrainz.go b/backends/listenbrainz/listenbrainz.go index 9e75003..e773929 100644 --- a/backends/listenbrainz/listenbrainz.go +++ b/backends/listenbrainz/listenbrainz.go @@ -207,6 +207,7 @@ func (lbListen Listen) ToListen() models.Listen { ArtistNames: []string{track.ArtistName}, Duration: track.Duration(), TrackNumber: track.TrackNumber(), + DiscNumber: track.DiscNumber(), RecordingMbid: models.MBID(track.RecordingMbid()), ReleaseMbid: models.MBID(track.ReleaseMbid()), ReleaseGroupMbid: models.MBID(track.ReleaseGroupMbid()), diff --git a/backends/listenbrainz/listenbrainz_test.go b/backends/listenbrainz/listenbrainz_test.go index 8101af2..507c89f 100644 --- a/backends/listenbrainz/listenbrainz_test.go +++ b/backends/listenbrainz/listenbrainz_test.go @@ -47,6 +47,7 @@ func TestListenBrainzListenToListen(t *testing.T) { "foo": "bar", "isrc": "DES561620801", "tracknumber": 5, + "discnumber": 1, "recording_mbid": "c0a1fc94-5f04-4a5f-bc09-e5de0c49cd12", "release_group_mbid": "80aca1ee-aa51-41be-9f75-024710d92ff4", "release_mbid": "d7f22677-9803-4d21-ba42-081b633a6f68", @@ -61,6 +62,7 @@ func TestListenBrainzListenToListen(t *testing.T) { assert.Equal(t, lbListen.TrackMetadata.ReleaseName, listen.ReleaseName) assert.Equal(t, []string{lbListen.TrackMetadata.ArtistName}, listen.ArtistNames) assert.Equal(t, 5, listen.TrackNumber) + assert.Equal(t, 1, listen.DiscNumber) assert.Equal(t, models.MBID("c0a1fc94-5f04-4a5f-bc09-e5de0c49cd12"), listen.RecordingMbid) assert.Equal(t, models.MBID("d7f22677-9803-4d21-ba42-081b633a6f68"), listen.ReleaseMbid) assert.Equal(t, models.MBID("80aca1ee-aa51-41be-9f75-024710d92ff4"), listen.ReleaseGroupMbid) diff --git a/backends/listenbrainz/models.go b/backends/listenbrainz/models.go index 4557783..2af9d72 100644 --- a/backends/listenbrainz/models.go +++ b/backends/listenbrainz/models.go @@ -136,6 +136,14 @@ func (t Track) TrackNumber() int { return 0 } +func (t Track) DiscNumber() int { + value, ok := tryGetInteger[int](t.AdditionalInfo, "discnumber") + if ok { + return value + } + return 0 +} + func (t Track) Isrc() string { return tryGetValueOrEmpty[string](t.AdditionalInfo, "isrc") } diff --git a/backends/listenbrainz/models_test.go b/backends/listenbrainz/models_test.go index 8f75eb7..330d7cc 100644 --- a/backends/listenbrainz/models_test.go +++ b/backends/listenbrainz/models_test.go @@ -111,6 +111,16 @@ func TestTrackTrackNumber(t *testing.T) { assert.Equal(t, expected, track.TrackNumber()) } +func TestTrackDiscNumber(t *testing.T) { + expected := 7 + track := listenbrainz.Track{ + AdditionalInfo: map[string]any{ + "discnumber": expected, + }, + } + assert.Equal(t, expected, track.DiscNumber()) +} + func TestTrackTrackNumberString(t *testing.T) { track := listenbrainz.Track{ AdditionalInfo: map[string]any{ diff --git a/backends/spotify/models_test.go b/backends/spotify/models_test.go index 0aa8fdb..5c4d256 100644 --- a/backends/spotify/models_test.go +++ b/backends/spotify/models_test.go @@ -45,6 +45,8 @@ func TestRecentlyPlayedResult(t *testing.T) { require.Len(t, result.Items, 3) track1 := result.Items[0].Track assert.Equal("Evidence", track1.Name) + assert.Equal(11, track1.TrackNumber) + assert.Equal(1, track1.DiscNumber) assert.Equal("Viva Emptiness", track1.Album.Name) require.Len(t, track1.Artists, 1) assert.Equal("Katatonia", track1.Artists[0].Name) diff --git a/backends/spotify/spotify.go b/backends/spotify/spotify.go index c352b3c..bb11c63 100644 --- a/backends/spotify/spotify.go +++ b/backends/spotify/spotify.go @@ -221,6 +221,7 @@ func (t Track) ToTrack() models.Track { ArtistNames: make([]string, 0, len(t.Artists)), Duration: time.Duration(t.DurationMs * int(time.Millisecond)), TrackNumber: t.TrackNumber, + DiscNumber: t.DiscNumber, Isrc: t.ExternalIds.ISRC, AdditionalInfo: map[string]any{}, } diff --git a/backends/spotify/spotify_test.go b/backends/spotify/spotify_test.go index 8180349..8872e83 100644 --- a/backends/spotify/spotify_test.go +++ b/backends/spotify/spotify_test.go @@ -42,6 +42,7 @@ func TestSpotifyListenToListen(t *testing.T) { assert.Equal(t, "Here Now, There Then", listen.ReleaseName) assert.Equal(t, []string{"Dool"}, listen.ArtistNames) assert.Equal(t, 5, listen.TrackNumber) + assert.Equal(t, 1, listen.DiscNumber) assert.Equal(t, "DES561620801", listen.Isrc) info := listen.AdditionalInfo assert.Equal(t, "spotify.com", info["music_service"]) diff --git a/backends/subsonic/subsonic.go b/backends/subsonic/subsonic.go index f22a3be..b3debd8 100644 --- a/backends/subsonic/subsonic.go +++ b/backends/subsonic/subsonic.go @@ -87,6 +87,7 @@ func SongToLove(song subsonic.Child, username string) models.Love { ReleaseName: song.Album, ArtistNames: []string{song.Artist}, TrackNumber: song.Track, + DiscNumber: song.DiscNumber, Tags: []string{song.Genre}, AdditionalInfo: map[string]any{}, Duration: time.Duration(song.Duration * int(time.Second)), diff --git a/backends/subsonic/subsonic_test.go b/backends/subsonic/subsonic_test.go index 7198728..3163a8d 100644 --- a/backends/subsonic/subsonic_test.go +++ b/backends/subsonic/subsonic_test.go @@ -55,5 +55,6 @@ func TestSongToLove(t *testing.T) { assert.Equal(song.Album, love.ReleaseName) assert.Equal([]string{song.Artist}, love.ArtistNames) assert.Equal(song.Track, love.Track.TrackNumber) + assert.Equal(song.DiscNumber, love.Track.DiscNumber) assert.Equal([]string{song.Genre}, love.Track.Tags) } diff --git a/models/models.go b/models/models.go index 32c5d1b..fca0ece 100644 --- a/models/models.go +++ b/models/models.go @@ -35,6 +35,7 @@ type Track struct { ReleaseName string ArtistNames []string TrackNumber int + DiscNumber int Duration time.Duration Isrc string RecordingMbid MBID