diff --git a/core/external_info.go b/core/external_info.go index e521d2404..30b080c58 100644 --- a/core/external_info.go +++ b/core/external_info.go @@ -149,23 +149,33 @@ func (e *externalInfo) TopSongs(ctx context.Context, artist string, count int) ( } var songs model.MediaFiles for _, t := range tracks { - mfs, err := e.ds.MediaFile(ctx).GetAll(model.QueryOptions{ - Filters: squirrel.And{ + mf, err := e.findMatchingTrack(ctx, artist, t.Name, t.MBID) + if err != nil { + continue + } + songs = append(songs, *mf) + } + return songs, nil +} + +func (e *externalInfo) findMatchingTrack(ctx context.Context, artist, title, mbid string) (*model.MediaFile, error) { + mfs, err := e.ds.MediaFile(ctx).GetAll(model.QueryOptions{ + Filters: squirrel.Or{ + squirrel.And{ squirrel.Or{ squirrel.Like{"artist": artist}, squirrel.Like{"album_artist": artist}, }, - squirrel.Like{"title": t.Name}, + squirrel.Like{"title": title}, }, - Sort: "year", - Order: "asc", - }) - if err != nil || len(mfs) == 0 { - continue - } - songs = append(songs, mfs[0]) + squirrel.Like{"mbz_track_id": mbid}, + }, + Sort: "mbz_track_id desc, year asc", + }) + if err != nil || len(mfs) == 0 { + return nil, model.ErrNotFound } - return songs, nil + return &mfs[0], nil } func (e *externalInfo) ArtistInfo(ctx context.Context, id string) (*model.ArtistInfo, error) { diff --git a/db/migration/20201021093209_add_media_file_indexes.go b/db/migration/20201021093209_add_media_file_indexes.go new file mode 100644 index 000000000..170a8811b --- /dev/null +++ b/db/migration/20201021093209_add_media_file_indexes.go @@ -0,0 +1,27 @@ +package migration + +import ( + "database/sql" + + "github.com/pressly/goose" +) + +func init() { + goose.AddMigration(Up20201021093209, Down20201021093209) +} + +func Up20201021093209(tx *sql.Tx) error { + _, err := tx.Exec(` +create index if not exists media_file_artist + on media_file (artist); +create index if not exists media_file_album_artist + on media_file (album_artist); +create index if not exists media_file_mbz_track_id + on media_file (mbz_track_id); +`) + return err +} + +func Down20201021093209(tx *sql.Tx) error { + return nil +}