revert guessed artist folder changes
there seems to be a performance issue somewhere
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user