Add inital multiple artist support
This commit is contained in:
@@ -82,7 +82,7 @@ func (c *Controller) ServeGetAlbum(r *http.Request) *spec.Response {
|
||||
Select("albums.*, count(tracks.id) child_count, sum(tracks.length) duration").
|
||||
Joins("LEFT JOIN tracks ON tracks.album_id=albums.id").
|
||||
Preload("TagArtist").
|
||||
Preload("TagGenre").
|
||||
Preload("Genres").
|
||||
Preload("Tracks", func(db *gorm.DB) *gorm.DB {
|
||||
return db.Order("tracks.tag_disc_number, tracks.tag_track_number")
|
||||
}).
|
||||
@@ -123,8 +123,9 @@ func (c *Controller) ServeGetAlbumListTwo(r *http.Request) *spec.Response {
|
||||
params.GetOrInt("toYear", 2200))
|
||||
q = q.Order("tag_year")
|
||||
case "byGenre":
|
||||
q = q.Joins("JOIN genres ON albums.tag_genre_id=genres.id AND genres.name=?",
|
||||
params.GetOr("genre", "Unknown Genre"))
|
||||
genre, _ := params.Get("genre")
|
||||
q = q.Joins("JOIN album_genres ON album_genres.album_id=albums.id")
|
||||
q = q.Joins("JOIN genres ON genres.id=album_genres.genre_id AND genres.name=?", genre)
|
||||
case "frequent":
|
||||
user := r.Context().Value(CtxUser).(*db.User)
|
||||
q = q.Joins("JOIN plays ON albums.id=plays.album_id AND plays.user_id=?",
|
||||
@@ -291,8 +292,8 @@ func (c *Controller) ServeGetGenres(r *http.Request) *spec.Response {
|
||||
var genres []*db.Genre
|
||||
c.DB.
|
||||
Select(`*,
|
||||
(SELECT count(id) FROM albums WHERE tag_genre_id=genres.id) album_count,
|
||||
(SELECT count(id) FROM tracks WHERE tag_genre_id=genres.id) track_count`).
|
||||
(SELECT count(1) FROM album_genres WHERE genre_id=genres.id) album_count,
|
||||
(SELECT count(1) FROM track_genres WHERE genre_id=genres.id) track_count`).
|
||||
Group("genres.id").
|
||||
Find(&genres)
|
||||
sub := spec.NewResponse()
|
||||
@@ -316,7 +317,8 @@ func (c *Controller) ServeGetSongsByGenre(r *http.Request) *spec.Response {
|
||||
var tracks []*db.Track
|
||||
c.DB.
|
||||
Joins("JOIN albums ON tracks.album_id=albums.id").
|
||||
Joins("JOIN genres ON tracks.tag_genre_id=genres.id AND genres.name=?", genre).
|
||||
Joins("JOIN track_genres ON track_genres.track_id=tracks.id").
|
||||
Joins("JOIN genres ON track_genres.genre_id=genres.id AND genres.name=?", genre).
|
||||
Preload("Album").
|
||||
Offset(params.GetOrInt("offset", 0)).
|
||||
Limit(params.GetOrInt("count", 10)).
|
||||
|
||||
@@ -197,9 +197,9 @@ func (c *Controller) ServeGetRandomSongs(r *http.Request) *spec.Response {
|
||||
params := r.Context().Value(CtxParams).(params.Params)
|
||||
var tracks []*db.Track
|
||||
q := c.DB.DB.
|
||||
Joins("JOIN albums ON tracks.album_id=albums.id").
|
||||
Limit(params.GetOrInt("size", 10)).
|
||||
Preload("Album").
|
||||
Joins("JOIN albums ON tracks.album_id=albums.id").
|
||||
Order(gorm.Expr("random()"))
|
||||
if year, err := params.GetInt("fromYear"); err == nil {
|
||||
q = q.Where("albums.tag_year >= ?", year)
|
||||
@@ -208,10 +208,8 @@ func (c *Controller) ServeGetRandomSongs(r *http.Request) *spec.Response {
|
||||
q = q.Where("albums.tag_year <= ?", year)
|
||||
}
|
||||
if genre, err := params.Get("genre"); err == nil {
|
||||
q = q.Joins(
|
||||
"JOIN genres ON tracks.tag_genre_id=genres.id AND genres.name=?",
|
||||
genre,
|
||||
)
|
||||
q = q.Joins("JOIN track_genres ON track_genres.track_id=tracks.id")
|
||||
q = q.Joins("JOIN genres ON genres.id=track_genres.genre_id AND genres.name=?", genre)
|
||||
}
|
||||
q.Find(&tracks)
|
||||
sub := spec.NewResponse()
|
||||
|
||||
@@ -2,6 +2,7 @@ package spec
|
||||
|
||||
import (
|
||||
"path"
|
||||
"strings"
|
||||
|
||||
"go.senan.xyz/gonic/server/db"
|
||||
)
|
||||
@@ -13,11 +14,9 @@ func NewAlbumByTags(a *db.Album, artist *db.Artist) *Album {
|
||||
Name: a.TagTitle,
|
||||
Year: a.TagYear,
|
||||
TrackCount: a.ChildCount,
|
||||
Genre: strings.Join(a.GenreStrings(), ", "),
|
||||
Duration: a.Duration,
|
||||
}
|
||||
if a.TagGenre != nil {
|
||||
ret.Genre = a.TagGenre.Name
|
||||
}
|
||||
if a.Cover != "" {
|
||||
ret.CoverID = a.SID()
|
||||
}
|
||||
@@ -47,6 +46,7 @@ func NewTrackByTags(t *db.Track, album *db.Album) *TrackChild {
|
||||
),
|
||||
Album: album.TagTitle,
|
||||
AlbumID: album.SID(),
|
||||
Genre: strings.Join(t.GenreStrings(), ", "),
|
||||
Duration: t.Length,
|
||||
Bitrate: t.Bitrate,
|
||||
Type: "music",
|
||||
|
||||
@@ -42,12 +42,16 @@ func New(in string) (ID, error) {
|
||||
if err != nil {
|
||||
return ID{}, fmt.Errorf("%q: %w", partValue, ErrNotAnInt)
|
||||
}
|
||||
for _, acc := range []IDT{Artist, Album, Track} {
|
||||
if partType == string(acc) {
|
||||
return ID{Type: acc, Value: val}, nil
|
||||
}
|
||||
switch IDT(partType) {
|
||||
case Artist:
|
||||
return ID{Type: Artist, Value: val}, nil
|
||||
case Album:
|
||||
return ID{Type: Album, Value: val}, nil
|
||||
case Track:
|
||||
return ID{Type: Track, Value: val}, nil
|
||||
default:
|
||||
return ID{}, fmt.Errorf("%q: %w", partType, ErrBadPrefix)
|
||||
}
|
||||
return ID{}, fmt.Errorf("%q: %w", partType, ErrBadPrefix)
|
||||
}
|
||||
|
||||
func (i ID) String() string {
|
||||
|
||||
Reference in New Issue
Block a user