diff --git a/server/ctrlsubsonic/testdata/test_get_album_with_cover b/server/ctrlsubsonic/testdata/test_get_album_with_cover index 9fc6e92..04688ad 100644 --- a/server/ctrlsubsonic/testdata/test_get_album_with_cover +++ b/server/ctrlsubsonic/testdata/test_get_album_with_cover @@ -14,6 +14,7 @@ "name": "album-0", "songCount": 3, "duration": 300, + "genre": "Unknown Genre", "year": 2021, "song": [ { diff --git a/server/mockfs/mockfs.go b/server/mockfs/mockfs.go index ccc6ac9..66b5f22 100644 --- a/server/mockfs/mockfs.go +++ b/server/mockfs/mockfs.go @@ -352,9 +352,18 @@ func (m *Tags) Length() int { return 100 } func (m *Tags) Bitrate() int { return 100 } func (m *Tags) Year() int { return 2021 } -func (m *Tags) SomeAlbum() string { return m.Album() } -func (m *Tags) SomeArtist() string { return m.Artist() } -func (m *Tags) SomeAlbumArtist() string { return m.AlbumArtist() } -func (m *Tags) SomeGenre() string { return m.Genre() } +func (m *Tags) SomeAlbum() string { return first("Unknown Album", m.Album()) } +func (m *Tags) SomeArtist() string { return first("Unknown Artist", m.Artist()) } +func (m *Tags) SomeAlbumArtist() string { return first("Unknown Artist", m.AlbumArtist(), m.Artist()) } +func (m *Tags) SomeGenre() string { return first("Unknown Genre", m.Genre()) } var _ tags.Parser = (*Tags)(nil) + +func first(or string, strs ...string) string { + for _, str := range strs { + if str != "" { + return str + } + } + return or +} diff --git a/server/scanner/scanner_test.go b/server/scanner/scanner_test.go index b5cb3e4..c43e56d 100644 --- a/server/scanner/scanner_test.go +++ b/server/scanner/scanner_test.go @@ -514,3 +514,42 @@ func TestTagErrors(t *testing.T) { is.Equal(ctx.SeenTracks(), m.NumTracks()-(3*2)) // we saw all tracks bar 2 album contents is.Equal(ctx.SeenTracksNew(), 0) // we have no new tracks } + +// https://github.com/sentriz/gonic/issues/185#issuecomment-1050092128 +func TestCompilationAlbumWithoutAlbumArtist(t *testing.T) { + t.Parallel() + is := is.New(t) + m := mockfs.New(t) + defer m.CleanUp() + + const pathArtist = "various-artists" + const pathAlbum = "my-compilation" + const toAdd = 5 + + // add tracks to one folder with random artists and no album artist tag + for i := 0; i < toAdd; i++ { + p := fmt.Sprintf("%s/%s/track-%d.flac", pathArtist, pathAlbum, i) + m.AddTrack(p) + m.SetTags(p, func(tags *mockfs.Tags) error { + // don't set an album artist + tags.RawTitle = fmt.Sprintf("track %d", i) + tags.RawArtist = fmt.Sprintf("artist %d", i) + tags.RawAlbum = pathArtist + return nil + }) + } + + m.ScanAndClean() + + var trackCount int + is.NoErr(m.DB().Model(&db.Track{}).Count(&trackCount).Error) + is.Equal(trackCount, 5) + + var artists []*db.Artist + is.NoErr(m.DB().Preload("Albums").Find(&artists).Error) + is.Equal(len(artists), 1) // we only have one album artist + is.Equal(artists[0].Name, "artist 0") // it came from the first track's fallback to artist tag + is.Equal(len(artists[0].Albums), 1) // the artist has one album + is.Equal(artists[0].Albums[0].RightPath, pathAlbum) + is.Equal(artists[0].Albums[0].LeftPath, pathArtist+"/") +}