Support downloading full album and artist discography through Subsonic API
This commit is contained in:
@@ -31,6 +31,7 @@ type Router struct {
|
||||
Search engine.Search
|
||||
Users engine.Users
|
||||
Streamer core.MediaStreamer
|
||||
Archiver core.Archiver
|
||||
Players engine.Players
|
||||
DataStore model.DataStore
|
||||
|
||||
@@ -39,10 +40,10 @@ type Router struct {
|
||||
|
||||
func New(browser engine.Browser, artwork core.Artwork, listGenerator engine.ListGenerator, users engine.Users,
|
||||
playlists engine.Playlists, scrobbler engine.Scrobbler, search engine.Search,
|
||||
streamer core.MediaStreamer, players engine.Players, ds model.DataStore) *Router {
|
||||
streamer core.MediaStreamer, archiver core.Archiver, players engine.Players, ds model.DataStore) *Router {
|
||||
r := &Router{Browser: browser, Artwork: artwork, ListGenerator: listGenerator, Playlists: playlists,
|
||||
Scrobbler: scrobbler, Search: search, Users: users, Streamer: streamer, Players: players,
|
||||
DataStore: ds}
|
||||
Scrobbler: scrobbler, Search: search, Users: users, Streamer: streamer, Archiver: archiver,
|
||||
Players: players, DataStore: ds}
|
||||
r.mux = r.routes()
|
||||
return r
|
||||
}
|
||||
|
||||
@@ -7,16 +7,19 @@ import (
|
||||
|
||||
"github.com/deluan/navidrome/core"
|
||||
"github.com/deluan/navidrome/log"
|
||||
"github.com/deluan/navidrome/model"
|
||||
"github.com/deluan/navidrome/server/subsonic/responses"
|
||||
"github.com/deluan/navidrome/utils"
|
||||
)
|
||||
|
||||
type StreamController struct {
|
||||
streamer core.MediaStreamer
|
||||
archiver core.Archiver
|
||||
ds model.DataStore
|
||||
}
|
||||
|
||||
func NewStreamController(streamer core.MediaStreamer) *StreamController {
|
||||
return &StreamController{streamer: streamer}
|
||||
func NewStreamController(streamer core.MediaStreamer, archiver core.Archiver, ds model.DataStore) *StreamController {
|
||||
return &StreamController{streamer: streamer, archiver: archiver, ds: ds}
|
||||
}
|
||||
|
||||
func (c *StreamController) Stream(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
|
||||
@@ -73,11 +76,25 @@ func (c *StreamController) Download(w http.ResponseWriter, r *http.Request) (*re
|
||||
return nil, err
|
||||
}
|
||||
|
||||
stream, err := c.streamer.NewStream(r.Context(), id, "raw", 0)
|
||||
isTrack, err := c.ds.MediaFile(r.Context()).Exists(id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
http.ServeContent(w, r, stream.Name(), stream.ModTime(), stream)
|
||||
if isTrack {
|
||||
stream, err := c.streamer.NewStream(r.Context(), id, "raw", 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
http.ServeContent(w, r, stream.Name(), stream.ModTime(), stream)
|
||||
} else {
|
||||
w.Header().Set("Content-Type", "application/zip")
|
||||
err := c.archiver.Zip(r.Context(), id, w)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -60,7 +60,9 @@ func initMediaRetrievalController(router *Router) *MediaRetrievalController {
|
||||
|
||||
func initStreamController(router *Router) *StreamController {
|
||||
mediaStreamer := router.Streamer
|
||||
streamController := NewStreamController(mediaStreamer)
|
||||
archiver := router.Archiver
|
||||
dataStore := router.DataStore
|
||||
streamController := NewStreamController(mediaStreamer, archiver, dataStore)
|
||||
return streamController
|
||||
}
|
||||
|
||||
@@ -82,5 +84,6 @@ var allProviders = wire.NewSet(
|
||||
NewUsersController,
|
||||
NewMediaRetrievalController,
|
||||
NewStreamController,
|
||||
NewBookmarksController, wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Scrobbler", "Search", "Streamer", "DataStore"),
|
||||
NewBookmarksController, wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Scrobbler",
|
||||
"Search", "Streamer", "Archiver", "DataStore"),
|
||||
)
|
||||
|
||||
@@ -17,7 +17,8 @@ var allProviders = wire.NewSet(
|
||||
NewMediaRetrievalController,
|
||||
NewStreamController,
|
||||
NewBookmarksController,
|
||||
wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Scrobbler", "Search", "Streamer", "DataStore"),
|
||||
wire.FieldsOf(new(*Router), "Browser", "Artwork", "ListGenerator", "Playlists", "Scrobbler",
|
||||
"Search", "Streamer", "Archiver", "DataStore"),
|
||||
)
|
||||
|
||||
func initSystemController(router *Router) *SystemController {
|
||||
|
||||
Reference in New Issue
Block a user