Skip to content

Commit

Permalink
feat(subsonic)!: drop support for guessed artist covers in filesystem
Browse files Browse the repository at this point in the history
it doesn't make sense with multi-artist support anymore

gonic will use lastfm or an album cover instead

Release-As: 0.16.0
  • Loading branch information
sentriz committed Sep 10, 2023
1 parent 3ac7782 commit 657fb22
Show file tree
Hide file tree
Showing 16 changed files with 180 additions and 138 deletions.
16 changes: 16 additions & 0 deletions db/migrations.go
Expand Up @@ -57,6 +57,7 @@ func (db *DB) Migrate(ctx MigrationContext) error {
construct(ctx, "202304221528", migratePlaylistsToM3U),
construct(ctx, "202305301718", migratePlayCountToLength),
construct(ctx, "202307281628", migrateAlbumArtistsMany2Many),
construct(ctx, "202309070009", migrateDeleteArtistCoverField),
}

return gormigrate.
Expand Down Expand Up @@ -589,3 +590,18 @@ func migrateAlbumArtistsMany2Many(tx *gorm.DB, _ MigrationContext) error {

return nil
}

func migrateDeleteArtistCoverField(tx *gorm.DB, _ MigrationContext) error {
if !tx.Dialect().HasColumn("artists", "cover") {
return nil
}

step := tx.Exec(`
ALTER TABLE artists DROP COLUMN cover;
`)
if err := step.Error; err != nil {
return fmt.Errorf("step drop: %w", err)
}

return nil
}
1 change: 0 additions & 1 deletion db/model.go
Expand Up @@ -49,7 +49,6 @@ type Artist struct {
NameUDec string `sql:"default: null"`
Albums []*Album `gorm:"many2many:album_artists"`
AlbumCount int `sql:"-"`
Cover string `sql:"default: null"`
ArtistStar *ArtistStar
ArtistRating *ArtistRating
AverageRating float64 `sql:"default: null"`
Expand Down
11 changes: 4 additions & 7 deletions scanner/scanner.go
Expand Up @@ -324,15 +324,15 @@ func (s *Scanner) scanDir(tx *db.DB, c *Context, musicDir string, absPath string
sort.Strings(tracks)
for i, basename := range tracks {
absPath := filepath.Join(musicDir, relPath, basename)
if err := s.populateTrackAndAlbumArtists(tx, c, i, &parent, &album, basename, absPath); err != nil {
if err := s.populateTrackAndAlbumArtists(tx, c, i, &album, basename, absPath); err != nil {
return fmt.Errorf("populate track %q: %w", basename, err)
}
}

return nil
}

func (s *Scanner) populateTrackAndAlbumArtists(tx *db.DB, c *Context, i int, parent, album *db.Album, basename string, absPath string) error {
func (s *Scanner) populateTrackAndAlbumArtists(tx *db.DB, c *Context, i int, album *db.Album, basename string, absPath string) error {
stat, err := os.Stat(absPath)
if err != nil {
return fmt.Errorf("stating %q: %w", basename, err)
Expand Down Expand Up @@ -364,7 +364,7 @@ func (s *Scanner) populateTrackAndAlbumArtists(tx *db.DB, c *Context, i int, par
albumArtists := tags.MustAlbumArtists(trags)
var albumArtistIDs []int
for _, albumArtistName := range albumArtists {
albumArtist, err := populateArtist(tx, parent, albumArtistName)
albumArtist, err := populateArtist(tx, albumArtistName)
if err != nil {
return fmt.Errorf("populate album artist: %w", err)
}
Expand Down Expand Up @@ -461,13 +461,10 @@ func populateTrack(tx *db.DB, album *db.Album, track *db.Track, trags tags.Parse
return nil
}

func populateArtist(tx *db.DB, parent *db.Album, artistName string) (*db.Artist, error) {
func populateArtist(tx *db.DB, artistName string) (*db.Artist, error) {
var update db.Artist
update.Name = artistName
update.NameUDec = decoded(artistName)
if parent.Cover != "" {
update.Cover = parent.Cover
}
var artist db.Artist
if err := tx.Where("name=?", artistName).Assign(update).FirstOrCreate(&artist).Error; err != nil {
return nil, fmt.Errorf("find or create artist: %w", err)
Expand Down
18 changes: 0 additions & 18 deletions scanner/scanner_test.go
Expand Up @@ -509,24 +509,6 @@ func TestSymlinkedSubdiscs(t *testing.T) {
require.NotZero(info.ModTime()) // track resolves
}

func TestArtistHasCover(t *testing.T) {
t.Parallel()
require := require.New(t)
m := mockfs.New(t)

m.AddItemsWithCovers()
m.AddCover("artist-2/artist.png")
m.ScanAndClean()

var artistWith db.Artist
require.NoError(m.DB().Where("name=?", "artist-2").First(&artistWith).Error)
require.Equal("artist.png", artistWith.Cover)

var artistWithout db.Artist
require.NoError(m.DB().Where("name=?", "artist-0").First(&artistWithout).Error)
require.Equal("", artistWithout.Cover)
}

func TestTagErrors(t *testing.T) {
t.Parallel()
require := require.New(t)
Expand Down
31 changes: 9 additions & 22 deletions server/ctrlsubsonic/handlers_by_tags.go
Expand Up @@ -319,11 +319,6 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response {

sub := spec.NewResponse()
sub.ArtistInfoTwo = &spec.ArtistInfo{}
if artist.Cover != "" {
sub.ArtistInfoTwo.SmallImageURL = c.genArtistCoverURL(r, &artist, 64)
sub.ArtistInfoTwo.MediumImageURL = c.genArtistCoverURL(r, &artist, 126)
sub.ArtistInfoTwo.LargeImageURL = c.genArtistCoverURL(r, &artist, 256)
}

apiKey, _ := c.DB.GetSetting("lastfm_api_key")
if apiKey == "" {
Expand All @@ -338,23 +333,15 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response {
sub.ArtistInfoTwo.MusicBrainzID = info.MBID
sub.ArtistInfoTwo.LastFMURL = info.URL

if artist.Cover == "" {
for _, image := range info.Image {
switch image.Size {
case "small":
sub.ArtistInfoTwo.SmallImageURL = image.Text
case "medium":
sub.ArtistInfoTwo.MediumImageURL = image.Text
case "large":
sub.ArtistInfoTwo.LargeImageURL = image.Text
}
}
if url, _ := c.LastFMClient.StealArtistImage(info.URL); url != "" {
sub.ArtistInfoTwo.SmallImageURL = url
sub.ArtistInfoTwo.MediumImageURL = url
sub.ArtistInfoTwo.LargeImageURL = url
sub.ArtistInfoTwo.ArtistImageURL = url
}
sub.ArtistInfoTwo.SmallImageURL = c.genArtistCoverURL(r, &artist, 64)
sub.ArtistInfoTwo.MediumImageURL = c.genArtistCoverURL(r, &artist, 126)
sub.ArtistInfoTwo.LargeImageURL = c.genArtistCoverURL(r, &artist, 256)

if url, _ := c.LastFMClient.StealArtistImage(info.URL); url != "" {
sub.ArtistInfoTwo.SmallImageURL = url
sub.ArtistInfoTwo.MediumImageURL = url
sub.ArtistInfoTwo.LargeImageURL = url
sub.ArtistInfoTwo.ArtistImageURL = url
}

count := params.GetOrInt("count", 20)
Expand Down
6 changes: 3 additions & 3 deletions server/ctrlsubsonic/handlers_raw.go
Expand Up @@ -149,10 +149,10 @@ func coverGetPathAlbum(dbc *db.DB, id int) (string, error) {
func coverGetPathArtist(dbc *db.DB, id int) (string, error) {
folder := &db.Album{}
err := dbc.DB.
Select("parent.id, parent.root_dir, parent.left_path, parent.right_path, parent.cover").
Joins("JOIN album_artists ON album_artists.album_id").
Select("albums.id, albums.root_dir, albums.left_path, albums.right_path, albums.cover").
Joins("JOIN album_artists ON album_artists.album_id=albums.id").
Where("album_artists.artist_id=?", id).
Joins("JOIN albums parent ON parent.id=albums.parent_id").
Group("albums.id").
Find(folder).
Error
if err != nil {
Expand Down
4 changes: 1 addition & 3 deletions server/ctrlsubsonic/spec/construct_by_tags.go
Expand Up @@ -102,9 +102,7 @@ func NewArtistByTags(a *db.Artist) *Artist {
Name: a.Name,
AlbumCount: a.AlbumCount,
AverageRating: formatRating(a.AverageRating),
}
if a.Cover != "" {
r.CoverID = a.SID()
CoverID: a.SID(),
}
if a.ArtistStar != nil {
r.Starred = &a.ArtistStar.StarDate
Expand Down
60 changes: 30 additions & 30 deletions server/ctrlsubsonic/testdata/test_get_album_list_random
Expand Up @@ -6,6 +6,19 @@
"serverVersion": "",
"albumList": {
"album": [
{
"id": "al-8",
"coverArt": "al-8",
"artist": "artist-1",
"created": "2019-11-30T00:00:00Z",
"title": "album-1",
"album": "",
"parent": "al-6",
"isDir": true,
"name": "",
"songCount": 3,
"duration": 300
},
{
"id": "al-7",
"coverArt": "al-7",
Expand All @@ -19,6 +32,19 @@
"songCount": 3,
"duration": 300
},
{
"id": "al-9",
"coverArt": "al-9",
"artist": "artist-1",
"created": "2019-11-30T00:00:00Z",
"title": "album-2",
"album": "",
"parent": "al-6",
"isDir": true,
"name": "",
"songCount": 3,
"duration": 300
},
{
"id": "al-4",
"coverArt": "al-4",
Expand Down Expand Up @@ -58,19 +84,6 @@
"songCount": 3,
"duration": 300
},
{
"id": "al-13",
"coverArt": "al-13",
"artist": "artist-2",
"created": "2019-11-30T00:00:00Z",
"title": "album-2",
"album": "",
"parent": "al-10",
"isDir": true,
"name": "",
"songCount": 3,
"duration": 300
},
{
"id": "al-5",
"coverArt": "al-5",
Expand All @@ -85,26 +98,13 @@
"duration": 300
},
{
"id": "al-9",
"coverArt": "al-9",
"artist": "artist-1",
"id": "al-13",
"coverArt": "al-13",
"artist": "artist-2",
"created": "2019-11-30T00:00:00Z",
"title": "album-2",
"album": "",
"parent": "al-6",
"isDir": true,
"name": "",
"songCount": 3,
"duration": 300
},
{
"id": "al-8",
"coverArt": "al-8",
"artist": "artist-1",
"created": "2019-11-30T00:00:00Z",
"title": "album-1",
"album": "",
"parent": "al-6",
"parent": "al-10",
"isDir": true,
"name": "",
"songCount": 3,
Expand Down

0 comments on commit 657fb22

Please sign in to comment.