diff --git a/server/ctrladmin/handlers.go b/server/ctrladmin/handlers.go index 10a1bc7..8e94688 100644 --- a/server/ctrladmin/handlers.go +++ b/server/ctrladmin/handlers.go @@ -16,6 +16,15 @@ import ( "go.senan.xyz/gonic/server/scrobble/listenbrainz" ) +func firstExisting(or string, strings ...string) string { + for _, s := range strings { + if s != "" { + return s + } + } + return or +} + func doScan(scanner *scanner.Scanner, opts scanner.ScanOptions) { go func() { if err := scanner.ScanAndClean(opts); err != nil { @@ -39,7 +48,18 @@ func (c *Controller) ServeHome(r *http.Request) *Response { c.DB.Model(&db.Album{}).Count(&data.AlbumCount) c.DB.Table("tracks").Count(&data.TrackCount) // lastfm box - data.RequestRoot = c.BaseURL(r) + scheme := firstExisting( + "http", // fallback + r.Header.Get("X-Forwarded-Proto"), + r.Header.Get("X-Forwarded-Scheme"), + r.URL.Scheme, + ) + host := firstExisting( + "localhost:4747", // fallback + r.Header.Get("X-Forwarded-Host"), + r.Host, + ) + data.RequestRoot = fmt.Sprintf("%s://%s", scheme, host) data.CurrentLastFMAPIKey, _ = c.DB.GetSetting("lastfm_api_key") data.DefaultListenBrainzURL = listenbrainz.BaseURL // users box diff --git a/server/ctrlbase/ctrl.go b/server/ctrlbase/ctrl.go index 59841cb..a2f91c1 100644 --- a/server/ctrlbase/ctrl.go +++ b/server/ctrlbase/ctrl.go @@ -55,21 +55,6 @@ func (c *Controller) Path(rel string) string { return path.Join(c.ProxyPrefix, rel) } -func (c *Controller) BaseURL(r *http.Request) string { - scheme := firstExisting( - "http", // fallback - r.Header.Get("X-Forwarded-Proto"), - r.Header.Get("X-Forwarded-Scheme"), - r.URL.Scheme, - ) - host := firstExisting( - "localhost:4747", // fallback - r.Header.Get("X-Forwarded-Host"), - r.Host, - ) - return fmt.Sprintf("%s://%s", scheme, host) -} - func (c *Controller) WithLogging(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // this is (should be) the first middleware. pass right though it @@ -102,12 +87,3 @@ func (c *Controller) WithCORS(next http.Handler) http.Handler { next.ServeHTTP(w, r) }) } - -func firstExisting(or string, strings ...string) string { - for _, s := range strings { - if s != "" { - return s - } - } - return or -} diff --git a/server/ctrlsubsonic/handlers_by_tags.go b/server/ctrlsubsonic/handlers_by_tags.go index db8bcb3..3174832 100644 --- a/server/ctrlsubsonic/handlers_by_tags.go +++ b/server/ctrlsubsonic/handlers_by_tags.go @@ -4,8 +4,6 @@ import ( "errors" "fmt" "net/http" - "net/url" - "strconv" "strings" "github.com/jinzhu/gorm" @@ -21,7 +19,6 @@ func (c *Controller) ServeGetArtists(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) var artists []*db.Artist q := c.DB. - Preload("GuessedFolder"). Select("*, count(sub.id) album_count"). Joins("LEFT JOIN albums sub ON artists.id=sub.tag_artist_id"). Group("artists.id"). @@ -62,7 +59,6 @@ func (c *Controller) ServeGetArtist(r *http.Request) *spec.Response { } artist := &db.Artist{} c.DB. - Preload("GuessedFolder"). Preload("Albums", func(db *gorm.DB) *gorm.DB { return db. Select("*, count(sub.id) child_count, sum(sub.length) duration"). @@ -189,7 +185,6 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { // search "artists" var artists []*db.Artist q := c.DB. - Preload("GuessedFolder"). Select("*, count(albums.id) album_count"). Group("artists.id"). Where("name LIKE ? OR name_u_dec LIKE ?", query, query). @@ -253,53 +248,40 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - - sub := spec.NewResponse() - sub.ArtistInfoTwo = &spec.ArtistInfo{} - apiKey, _ := c.DB.GetSetting("lastfm_api_key") if apiKey == "" { + sub := spec.NewResponse() + sub.ArtistInfoTwo = &spec.ArtistInfo{} return sub } - artist := &db.Artist{} err = c.DB. - Preload("GuessedFolder"). Where("id=?", id.Value). Find(artist). Error if errors.Is(err, gorm.ErrRecordNotFound) { return spec.NewError(70, "artist with id `%s` not found", id) } - - if artist.GuessedFolder != nil && artist.GuessedFolder.Cover != "" { - sub.ArtistInfoTwo.SmallImageURL = c.genAlbumCoverURL(r, artist.GuessedFolder, 64) - sub.ArtistInfoTwo.MediumImageURL = c.genAlbumCoverURL(r, artist.GuessedFolder, 126) - sub.ArtistInfoTwo.LargeImageURL = c.genAlbumCoverURL(r, artist.GuessedFolder, 256) - } - info, err := lastfm.ArtistGetInfo(apiKey, artist) if err != nil { return spec.NewError(0, "fetching artist info: %v", err) } - - sub.ArtistInfoTwo.Biography = info.Bio.Summary - sub.ArtistInfoTwo.MusicBrainzID = info.MBID - sub.ArtistInfoTwo.LastFMURL = info.URL - - if !(artist.GuessedFolder != nil && artist.GuessedFolder.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 - } + sub := spec.NewResponse() + sub.ArtistInfoTwo = &spec.ArtistInfo{ + Biography: info.Bio.Summary, + MusicBrainzID: info.MBID, + LastFMURL: info.URL, + } + 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 } } - count := params.GetOrInt("count", 20) inclNotPresent := params.GetOrBool("includeNotPresent", false) for i, similarInfo := range info.Similar.Artists { @@ -328,7 +310,6 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { sub.ArtistInfoTwo.SimilarArtist = append( sub.ArtistInfoTwo.SimilarArtist, similar) } - return sub } @@ -390,16 +371,3 @@ func (c *Controller) ServeGetStarredTwo(r *http.Request) *spec.Response { } return sub } - -func (c *Controller) genAlbumCoverURL(r *http.Request, folder *db.Album, size int) string { - coverURL, _ := url.Parse(c.BaseURL(r)) - coverURL.Path = c.Path("/rest/getCoverArt") - - id := specid.ID{Type: specid.Album, Value: folder.ID} - query := r.URL.Query() - query.Set("id", id.String()) - query.Set("size", strconv.Itoa(size)) - coverURL.RawQuery = query.Encode() - - return coverURL.String() -} diff --git a/server/ctrlsubsonic/spec/construct_by_tags.go b/server/ctrlsubsonic/spec/construct_by_tags.go index 4475f85..3250995 100644 --- a/server/ctrlsubsonic/spec/construct_by_tags.go +++ b/server/ctrlsubsonic/spec/construct_by_tags.go @@ -72,15 +72,11 @@ func NewTrackByTags(t *db.Track, album *db.Album) *TrackChild { } func NewArtistByTags(a *db.Artist) *Artist { - ret := &Artist{ + return &Artist{ ID: a.SID(), Name: a.Name, AlbumCount: a.AlbumCount, } - if a.GuessedFolder != nil && a.GuessedFolder.Cover != "" { - ret.CoverID = a.GuessedFolder.SID() - } - return ret } func NewGenre(g *db.Genre) *Genre { diff --git a/server/db/migrations.go b/server/db/migrations.go index 77df72a..7a515ac 100644 --- a/server/db/migrations.go +++ b/server/db/migrations.go @@ -37,7 +37,6 @@ func (db *DB) Migrate(ctx MigrationContext) error { construct(ctx, "202102191448", migratePodcastAutoDownload), construct(ctx, "202110041330", migrateAlbumCreatedAt), construct(ctx, "202111021951", migrateAlbumRootDir), - construct(ctx, "202201042236", migrateArtistGuessedFolder), } return gormigrate. @@ -307,7 +306,3 @@ func migrateAlbumRootDir(tx *gorm.DB, ctx MigrationContext) error { } return nil } - -func migrateArtistGuessedFolder(tx *gorm.DB, ctx MigrationContext) error { - return tx.AutoMigrate(Artist{}).Error -} diff --git a/server/db/model.go b/server/db/model.go index 87810f1..1580192 100644 --- a/server/db/model.go +++ b/server/db/model.go @@ -43,13 +43,11 @@ func joinInt(in []int, sep string) string { } type Artist struct { - ID int `gorm:"primary_key"` - Name string `gorm:"not null; unique_index"` - NameUDec string `sql:"default: null"` - Albums []*Album `gorm:"foreignkey:TagArtistID"` - AlbumCount int `sql:"-"` - GuessedFolder *Album - GuessedFolderID int `sql:"default: null; type:int REFERENCES albums(id) ON DELETE SET NULL"` + ID int `gorm:"primary_key"` + Name string `gorm:"not null; unique_index"` + NameUDec string `sql:"default: null"` + Albums []*Album `gorm:"foreignkey:TagArtistID"` + AlbumCount int `sql:"-"` } func (a *Artist) SID() *specid.ID { diff --git a/server/scanner/scanner.go b/server/scanner/scanner.go index 3320d32..17b67b7 100644 --- a/server/scanner/scanner.go +++ b/server/scanner/scanner.go @@ -217,7 +217,7 @@ func (s *Scanner) populateTrackAndAlbumArtists(tx *db.DB, c *ctx, i int, album * } artistName := trags.SomeAlbumArtist() - albumArtist, err := s.populateAlbumArtist(tx, album, artistName) + albumArtist, err := s.populateAlbumArtist(tx, artistName) if err != nil { return fmt.Errorf("populate artist: %w", err) } @@ -315,15 +315,12 @@ func populateTrack(tx *db.DB, album *db.Album, albumArtist *db.Artist, track *db return nil } -func (s *Scanner) populateAlbumArtist(tx *db.DB, guessedArtistFolder *db.Album, artistName string) (*db.Artist, error) { +func (s *Scanner) populateAlbumArtist(tx *db.DB, artistName string) (*db.Artist, error) { var artist db.Artist update := db.Artist{ Name: artistName, NameUDec: decoded(artistName), } - if guessedArtistFolder != nil { - update.GuessedFolderID = guessedArtistFolder.ParentID - } if err := tx.Where("name=?", artistName).Assign(update).FirstOrCreate(&artist).Error; err != nil { return nil, fmt.Errorf("find or create artist: %w", err) } @@ -479,8 +476,7 @@ func isCover(name string) bool { "folder.png", "folder.jpg", "folder.jpeg", "album.png", "album.jpg", "album.jpeg", "albumart.png", "albumart.jpg", "albumart.jpeg", - "front.png", "front.jpg", "front.jpeg", - "artist.png", "artist.jpg", "artist.jpeg": + "front.png", "front.jpg", "front.jpeg": return true default: return false