mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-05 21:47:36 +03:00
Replace MinInt/MaxInt with generic versions
This commit is contained in:
parent
6f5aaa1ec4
commit
e03ccb3166
9 changed files with 82 additions and 74 deletions
core
model
server/subsonic
utils
|
@ -17,6 +17,7 @@ import (
|
|||
"github.com/navidrome/navidrome/log"
|
||||
"github.com/navidrome/navidrome/model"
|
||||
"github.com/navidrome/navidrome/utils"
|
||||
"github.com/navidrome/navidrome/utils/math2"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -172,7 +173,7 @@ func (e *externalMetadata) SimilarSongs(ctx context.Context, id string, count in
|
|||
return ctx.Err()
|
||||
}
|
||||
|
||||
topCount := utils.MaxInt(count, 20)
|
||||
topCount := math2.Max(count, 20)
|
||||
topSongs, err := e.getMatchingTopSongs(ctx, e.ag, &auxArtist{Name: a.Name, Artist: a}, topCount)
|
||||
if err != nil {
|
||||
log.Warn(ctx, "Error getting artist's top songs", "artist", a.Name, err)
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
"time"
|
||||
|
||||
"github.com/navidrome/navidrome/model/criteria"
|
||||
"github.com/navidrome/navidrome/utils"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
type Playlist struct {
|
||||
|
@ -46,7 +46,7 @@ func (pls Playlist) MediaFiles() MediaFiles {
|
|||
func (pls *Playlist) RemoveTracks(idxToRemove []int) {
|
||||
var newTracks PlaylistTracks
|
||||
for i, t := range pls.Tracks {
|
||||
if utils.IntInSlice(i, idxToRemove) {
|
||||
if slices.Index(idxToRemove, i) >= 0 {
|
||||
continue
|
||||
}
|
||||
newTracks = append(newTracks, t)
|
||||
|
|
|
@ -11,6 +11,7 @@ import (
|
|||
"github.com/navidrome/navidrome/server/subsonic/filter"
|
||||
"github.com/navidrome/navidrome/server/subsonic/responses"
|
||||
"github.com/navidrome/navidrome/utils"
|
||||
"github.com/navidrome/navidrome/utils/math2"
|
||||
)
|
||||
|
||||
func (api *Router) getAlbumList(r *http.Request) (model.Albums, int64, error) {
|
||||
|
@ -59,7 +60,7 @@ func (api *Router) getAlbumList(r *http.Request) (model.Albums, int64, error) {
|
|||
}
|
||||
|
||||
opts.Offset = utils.ParamInt(r, "offset", 0)
|
||||
opts.Max = utils.MinInt(utils.ParamInt(r, "size", 10), 500)
|
||||
opts.Max = math2.Min(utils.ParamInt(r, "size", 10), 500)
|
||||
albums, err := api.ds.Album(r.Context()).GetAllWithoutGenres(opts)
|
||||
|
||||
if err != nil {
|
||||
|
@ -167,7 +168,7 @@ func (api *Router) GetNowPlaying(r *http.Request) (*responses.Subsonic, error) {
|
|||
}
|
||||
|
||||
func (api *Router) GetRandomSongs(r *http.Request) (*responses.Subsonic, error) {
|
||||
size := utils.MinInt(utils.ParamInt(r, "size", 10), 500)
|
||||
size := math2.Min(utils.ParamInt(r, "size", 10), 500)
|
||||
genre := utils.ParamString(r, "genre")
|
||||
fromYear := utils.ParamInt(r, "fromYear", 0)
|
||||
toYear := utils.ParamInt(r, "toYear", 0)
|
||||
|
@ -185,8 +186,8 @@ func (api *Router) GetRandomSongs(r *http.Request) (*responses.Subsonic, error)
|
|||
}
|
||||
|
||||
func (api *Router) GetSongsByGenre(r *http.Request) (*responses.Subsonic, error) {
|
||||
count := utils.MinInt(utils.ParamInt(r, "count", 10), 500)
|
||||
offset := utils.MinInt(utils.ParamInt(r, "offset", 0), 500)
|
||||
count := math2.Min(utils.ParamInt(r, "count", 10), 500)
|
||||
offset := math2.Min(utils.ParamInt(r, "offset", 0), 500)
|
||||
genre := utils.ParamString(r, "genre")
|
||||
|
||||
songs, err := api.getSongs(r.Context(), offset, count, filter.SongsByGenre(genre))
|
||||
|
|
|
@ -19,6 +19,7 @@ import (
|
|||
"github.com/navidrome/navidrome/server/events"
|
||||
"github.com/navidrome/navidrome/server/subsonic/responses"
|
||||
"github.com/navidrome/navidrome/utils"
|
||||
"github.com/navidrome/navidrome/utils/math2"
|
||||
)
|
||||
|
||||
const Version = "1.16.1"
|
||||
|
@ -137,7 +138,7 @@ func (api *Router) routes() http.Handler {
|
|||
})
|
||||
r.Group(func(r chi.Router) {
|
||||
// configure request throttling
|
||||
maxRequests := utils.MaxInt(2, runtime.NumCPU())
|
||||
maxRequests := math2.Max(2, runtime.NumCPU())
|
||||
r.Use(middleware.ThrottleBacklog(maxRequests, consts.RequestThrottleBacklogLimit, consts.RequestThrottleBacklogTimeout))
|
||||
hr(r, "getAvatar", api.GetAvatar)
|
||||
hr(r, "getCoverArt", api.GetCoverArt)
|
||||
|
|
|
@ -5,7 +5,7 @@ import (
|
|||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/navidrome/navidrome/utils"
|
||||
"github.com/navidrome/navidrome/utils/math2"
|
||||
)
|
||||
|
||||
const baseUrl = "https://www.gravatar.com/avatar"
|
||||
|
@ -19,7 +19,7 @@ func Url(email string, size int) string {
|
|||
if size < 1 {
|
||||
size = defaultSize
|
||||
}
|
||||
size = utils.MinInt(maxSize, size)
|
||||
size = math2.Min(maxSize, size)
|
||||
|
||||
return fmt.Sprintf("%s/%x?s=%d", baseUrl, hash, size)
|
||||
}
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
package utils
|
||||
|
||||
func MinInt(x, y int) int {
|
||||
if x < y {
|
||||
return x
|
||||
}
|
||||
return y
|
||||
}
|
||||
|
||||
func MaxInt(x, y int) int {
|
||||
if x > y {
|
||||
return x
|
||||
}
|
||||
return y
|
||||
}
|
||||
|
||||
func IntInSlice(a int, list []int) bool {
|
||||
for _, b := range list {
|
||||
if b == a {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
var _ = Describe("Int utils", func() {
|
||||
Describe("MinInt", func() {
|
||||
It("returns the first value if it is the smallest", func() {
|
||||
Expect(MinInt(1, 2)).To(Equal(1))
|
||||
})
|
||||
It("returns the second value if it is the smallest", func() {
|
||||
Expect(MinInt(-4, -6)).To(Equal(-6))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("MaxInt", func() {
|
||||
It("returns the first value if it is the biggest", func() {
|
||||
Expect(MaxInt(1, 2)).To(Equal(2))
|
||||
})
|
||||
It("returns the second value if it is the smallest", func() {
|
||||
Expect(MaxInt(-4, -6)).To(Equal(-4))
|
||||
})
|
||||
})
|
||||
|
||||
Describe("IntInSlice", func() {
|
||||
It("returns false if slice is empty", func() {
|
||||
Expect(IntInSlice(1, nil)).To(BeFalse())
|
||||
})
|
||||
|
||||
It("returns false if number is not in slice", func() {
|
||||
Expect(IntInSlice(1, []int{3, 4, 5})).To(BeFalse())
|
||||
})
|
||||
|
||||
It("returns true if number is in slice", func() {
|
||||
Expect(IntInSlice(4, []int{3, 4, 5})).To(BeTrue())
|
||||
})
|
||||
})
|
||||
})
|
31
utils/math2/math2.go
Normal file
31
utils/math2/math2.go
Normal file
|
@ -0,0 +1,31 @@
|
|||
package math2
|
||||
|
||||
import "golang.org/x/exp/constraints"
|
||||
|
||||
func Min[T constraints.Ordered](vs ...T) T {
|
||||
if len(vs) == 0 {
|
||||
var zero T
|
||||
return zero
|
||||
}
|
||||
min := vs[0]
|
||||
for _, v := range vs[1:] {
|
||||
if v < min {
|
||||
min = v
|
||||
}
|
||||
}
|
||||
return min
|
||||
}
|
||||
|
||||
func Max[T constraints.Ordered](vs ...T) T {
|
||||
if len(vs) == 0 {
|
||||
var zero T
|
||||
return zero
|
||||
}
|
||||
max := vs[0]
|
||||
for _, v := range vs[1:] {
|
||||
if v > max {
|
||||
max = v
|
||||
}
|
||||
}
|
||||
return max
|
||||
}
|
38
utils/math2/math2_test.go
Normal file
38
utils/math2/math2_test.go
Normal file
|
@ -0,0 +1,38 @@
|
|||
package math2_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/navidrome/navidrome/utils/math2"
|
||||
. "github.com/onsi/ginkgo/v2"
|
||||
. "github.com/onsi/gomega"
|
||||
)
|
||||
|
||||
func TestMath2(t *testing.T) {
|
||||
RegisterFailHandler(Fail)
|
||||
RunSpecs(t, "Math2 Suite")
|
||||
}
|
||||
|
||||
var _ = Describe("Min", func() {
|
||||
It("returns zero value if no arguments are passed", func() {
|
||||
Expect(math2.Min[int]()).To(BeZero())
|
||||
})
|
||||
It("returns the smallest int", func() {
|
||||
Expect(math2.Min(1, 2)).To(Equal(1))
|
||||
})
|
||||
It("returns the smallest float", func() {
|
||||
Expect(math2.Min(-4.1, -4.2, -4.0)).To(Equal(-4.2))
|
||||
})
|
||||
})
|
||||
|
||||
var _ = Describe("Max", func() {
|
||||
It("returns zero value if no arguments are passed", func() {
|
||||
Expect(math2.Max[int]()).To(BeZero())
|
||||
})
|
||||
It("returns the biggest int", func() {
|
||||
Expect(math2.Max(1, 2)).To(Equal(2))
|
||||
})
|
||||
It("returns the biggest float", func() {
|
||||
Expect(math2.Max(-4.1, -4.2, -4.0)).To(Equal(-4.0))
|
||||
})
|
||||
})
|
Loading…
Add table
Add a link
Reference in a new issue