mirror of
https://github.com/navidrome/navidrome.git
synced 2026-11-14 06:08:46 +01:00
67 lines
2 KiB
Go
67 lines
2 KiB
Go
package public
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"path"
|
|
|
|
"github.com/go-chi/chi/v5"
|
|
"github.com/navidrome/navidrome/conf"
|
|
"github.com/navidrome/navidrome/consts"
|
|
"github.com/navidrome/navidrome/core"
|
|
"github.com/navidrome/navidrome/core/artwork"
|
|
"github.com/navidrome/navidrome/core/publicurl"
|
|
"github.com/navidrome/navidrome/core/stream"
|
|
"github.com/navidrome/navidrome/model"
|
|
"github.com/navidrome/navidrome/server"
|
|
"github.com/navidrome/navidrome/ui"
|
|
)
|
|
|
|
type Router struct {
|
|
http.Handler
|
|
artwork artwork.Artwork
|
|
streamer stream.MediaStreamer
|
|
decider stream.TranscodeDecider
|
|
archiver core.Archiver
|
|
share core.Share
|
|
assetsHandler http.Handler
|
|
ds model.DataStore
|
|
}
|
|
|
|
func New(ds model.DataStore, artwork artwork.Artwork, streamer stream.MediaStreamer, decider stream.TranscodeDecider, share core.Share, archiver core.Archiver) *Router {
|
|
p := &Router{ds: ds, artwork: artwork, streamer: streamer, decider: decider, share: share, archiver: archiver}
|
|
shareRoot := path.Join(conf.Server().BasePath, consts.URLPathPublic)
|
|
p.assetsHandler = http.StripPrefix(shareRoot, http.FileServer(http.FS(ui.BuildAssets())))
|
|
p.Handler = p.routes()
|
|
|
|
return p
|
|
}
|
|
|
|
func (pub *Router) routes() http.Handler {
|
|
r := chi.NewRouter()
|
|
|
|
r.Group(func(r chi.Router) {
|
|
r.Use(server.URLParamsMiddleware)
|
|
r.Group(func(r chi.Router) {
|
|
r.Use(server.ThrottleBacklog(conf.Server().DevArtworkMaxRequests, conf.Server().DevArtworkThrottleBacklogLimit,
|
|
conf.Server().DevArtworkThrottleBacklogTimeout))
|
|
r.HandleFunc("/img/{id}", pub.handleImages)
|
|
})
|
|
if conf.Server().EnableSharing {
|
|
r.HandleFunc("/s/{id}", pub.handleStream)
|
|
if conf.Server().EnableDownloads {
|
|
r.HandleFunc("/d/{id}", pub.handleDownloads)
|
|
}
|
|
r.HandleFunc("/{id}/m3u", pub.handleM3U)
|
|
r.HandleFunc("/{id}", pub.handleShares)
|
|
r.HandleFunc("/", pub.handleShares)
|
|
r.Handle("/*", pub.assetsHandler)
|
|
}
|
|
})
|
|
return r
|
|
}
|
|
|
|
func ShareURL(ctx context.Context, id string) string {
|
|
uri := path.Join(consts.URLPathPublic, id)
|
|
return publicurl.PublicURL(ctx, uri, nil)
|
|
}
|