mirror of
https://github.com/navidrome/navidrome.git
synced 2025-06-04 01:21:19 +03:00
Started the big refactor to extract common logic from engine
package (Subsonic only) to core
package (more generic)
This commit is contained in:
parent
5418a6b6b1
commit
5620c58a30
@ -6,8 +6,9 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/deluan/navidrome/core"
|
||||||
|
"github.com/deluan/navidrome/core/transcoder"
|
||||||
"github.com/deluan/navidrome/engine"
|
"github.com/deluan/navidrome/engine"
|
||||||
"github.com/deluan/navidrome/engine/transcoder"
|
|
||||||
"github.com/deluan/navidrome/persistence"
|
"github.com/deluan/navidrome/persistence"
|
||||||
"github.com/deluan/navidrome/scanner"
|
"github.com/deluan/navidrome/scanner"
|
||||||
"github.com/deluan/navidrome/server"
|
"github.com/deluan/navidrome/server"
|
||||||
@ -40,11 +41,11 @@ func CreateAppRouter() *app.Router {
|
|||||||
func CreateSubsonicAPIRouter() (*subsonic.Router, error) {
|
func CreateSubsonicAPIRouter() (*subsonic.Router, error) {
|
||||||
dataStore := persistence.New()
|
dataStore := persistence.New()
|
||||||
browser := engine.NewBrowser(dataStore)
|
browser := engine.NewBrowser(dataStore)
|
||||||
imageCache, err := engine.NewImageCache()
|
imageCache, err := core.NewImageCache()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
cover := engine.NewCover(dataStore, imageCache)
|
cover := core.NewCover(dataStore, imageCache)
|
||||||
nowPlayingRepository := engine.NewNowPlayingRepository()
|
nowPlayingRepository := engine.NewNowPlayingRepository()
|
||||||
listGenerator := engine.NewListGenerator(dataStore, nowPlayingRepository)
|
listGenerator := engine.NewListGenerator(dataStore, nowPlayingRepository)
|
||||||
users := engine.NewUsers(dataStore)
|
users := engine.NewUsers(dataStore)
|
||||||
@ -53,11 +54,11 @@ func CreateSubsonicAPIRouter() (*subsonic.Router, error) {
|
|||||||
scrobbler := engine.NewScrobbler(dataStore, nowPlayingRepository)
|
scrobbler := engine.NewScrobbler(dataStore, nowPlayingRepository)
|
||||||
search := engine.NewSearch(dataStore)
|
search := engine.NewSearch(dataStore)
|
||||||
transcoderTranscoder := transcoder.New()
|
transcoderTranscoder := transcoder.New()
|
||||||
transcodingCache, err := engine.NewTranscodingCache()
|
transcodingCache, err := core.NewTranscodingCache()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
mediaStreamer := engine.NewMediaStreamer(dataStore, transcoderTranscoder, transcodingCache)
|
mediaStreamer := core.NewMediaStreamer(dataStore, transcoderTranscoder, transcodingCache)
|
||||||
players := engine.NewPlayers(dataStore)
|
players := engine.NewPlayers(dataStore)
|
||||||
router := subsonic.New(browser, cover, listGenerator, users, playlists, ratings, scrobbler, search, mediaStreamer, players)
|
router := subsonic.New(browser, cover, listGenerator, users, playlists, ratings, scrobbler, search, mediaStreamer, players)
|
||||||
return router, nil
|
return router, nil
|
||||||
@ -65,4 +66,4 @@ func CreateSubsonicAPIRouter() (*subsonic.Router, error) {
|
|||||||
|
|
||||||
// wire_injectors.go:
|
// wire_injectors.go:
|
||||||
|
|
||||||
var allProviders = wire.NewSet(engine.Set, scanner.New, subsonic.New, app.New, persistence.New)
|
var allProviders = wire.NewSet(engine.Set, core.Set, scanner.New, subsonic.New, app.New, persistence.New)
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/deluan/navidrome/core"
|
||||||
"github.com/deluan/navidrome/engine"
|
"github.com/deluan/navidrome/engine"
|
||||||
"github.com/deluan/navidrome/persistence"
|
"github.com/deluan/navidrome/persistence"
|
||||||
"github.com/deluan/navidrome/scanner"
|
"github.com/deluan/navidrome/scanner"
|
||||||
@ -14,6 +15,7 @@ import (
|
|||||||
|
|
||||||
var allProviders = wire.NewSet(
|
var allProviders = wire.NewSet(
|
||||||
engine.Set,
|
engine.Set,
|
||||||
|
core.Set,
|
||||||
scanner.New,
|
scanner.New,
|
||||||
subsonic.New,
|
subsonic.New,
|
||||||
app.New,
|
app.New,
|
||||||
|
@ -4,7 +4,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/deluan/navidrome/engine/auth"
|
"github.com/deluan/navidrome/core/auth"
|
||||||
"github.com/deluan/navidrome/log"
|
"github.com/deluan/navidrome/log"
|
||||||
"github.com/dgrijalva/jwt-go"
|
"github.com/dgrijalva/jwt-go"
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
15
core/common.go
Normal file
15
core/common.go
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/deluan/navidrome/model/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
func userName(ctx context.Context) string {
|
||||||
|
if user, ok := request.UserFrom(ctx); !ok {
|
||||||
|
return "UNKNOWN"
|
||||||
|
} else {
|
||||||
|
return user.UserName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
35
core/core_suite_test.go
Normal file
35
core/core_suite_test.go
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/deluan/navidrome/log"
|
||||||
|
"github.com/deluan/navidrome/tests"
|
||||||
|
"github.com/djherbis/fscache"
|
||||||
|
. "github.com/onsi/ginkgo"
|
||||||
|
. "github.com/onsi/gomega"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestEngine(t *testing.T) {
|
||||||
|
tests.Init(t, false)
|
||||||
|
log.SetLevel(log.LevelCritical)
|
||||||
|
RegisterFailHandler(Fail)
|
||||||
|
RunSpecs(t, "Core Suite")
|
||||||
|
}
|
||||||
|
|
||||||
|
var testCache fscache.Cache
|
||||||
|
var testCacheDir string
|
||||||
|
|
||||||
|
var _ = Describe("Core Suite Setup", func() {
|
||||||
|
BeforeSuite(func() {
|
||||||
|
testCacheDir, _ = ioutil.TempDir("", "core_test_cache")
|
||||||
|
fs, _ := fscache.NewFs(testCacheDir, 0755)
|
||||||
|
testCache, _ = fscache.NewCache(fs, nil)
|
||||||
|
})
|
||||||
|
|
||||||
|
AfterSuite(func() {
|
||||||
|
os.RemoveAll(testCacheDir)
|
||||||
|
})
|
||||||
|
})
|
@ -1,4 +1,4 @@
|
|||||||
package engine
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
@ -1,4 +1,4 @@
|
|||||||
package engine
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
@ -1,4 +1,4 @@
|
|||||||
package engine
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
@ -1,4 +1,4 @@
|
|||||||
package engine
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
@ -1,4 +1,4 @@
|
|||||||
package engine
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
@ -10,7 +10,7 @@ import (
|
|||||||
|
|
||||||
"github.com/deluan/navidrome/conf"
|
"github.com/deluan/navidrome/conf"
|
||||||
"github.com/deluan/navidrome/consts"
|
"github.com/deluan/navidrome/consts"
|
||||||
"github.com/deluan/navidrome/engine/transcoder"
|
"github.com/deluan/navidrome/core/transcoder"
|
||||||
"github.com/deluan/navidrome/log"
|
"github.com/deluan/navidrome/log"
|
||||||
"github.com/deluan/navidrome/model"
|
"github.com/deluan/navidrome/model"
|
||||||
"github.com/deluan/navidrome/model/request"
|
"github.com/deluan/navidrome/model/request"
|
@ -1,4 +1,4 @@
|
|||||||
package engine
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
22
core/mock_transcoding_repo_test.go
Normal file
22
core/mock_transcoding_repo_test.go
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import "github.com/deluan/navidrome/model"
|
||||||
|
|
||||||
|
type mockTranscodingRepository struct {
|
||||||
|
model.TranscodingRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mockTranscodingRepository) Get(id string) (*model.Transcoding, error) {
|
||||||
|
return &model.Transcoding{ID: id, TargetFormat: "mp3", DefaultBitRate: 160}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *mockTranscodingRepository) FindByFormat(format string) (*model.Transcoding, error) {
|
||||||
|
switch format {
|
||||||
|
case "mp3":
|
||||||
|
return &model.Transcoding{ID: "mp31", TargetFormat: "mp3", DefaultBitRate: 160}, nil
|
||||||
|
case "oga":
|
||||||
|
return &model.Transcoding{ID: "oga1", TargetFormat: "oga", DefaultBitRate: 128}, nil
|
||||||
|
default:
|
||||||
|
return nil, model.ErrNotFound
|
||||||
|
}
|
||||||
|
}
|
14
core/wire_providers.go
Normal file
14
core/wire_providers.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/deluan/navidrome/core/transcoder"
|
||||||
|
"github.com/google/wire"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Set = wire.NewSet(
|
||||||
|
NewCover,
|
||||||
|
NewMediaStreamer,
|
||||||
|
NewTranscodingCache,
|
||||||
|
NewImageCache,
|
||||||
|
transcoder.New,
|
||||||
|
)
|
@ -1,13 +1,10 @@
|
|||||||
package engine
|
package engine
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/deluan/navidrome/log"
|
"github.com/deluan/navidrome/log"
|
||||||
"github.com/deluan/navidrome/tests"
|
"github.com/deluan/navidrome/tests"
|
||||||
"github.com/djherbis/fscache"
|
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
)
|
)
|
||||||
@ -18,18 +15,3 @@ func TestEngine(t *testing.T) {
|
|||||||
RegisterFailHandler(Fail)
|
RegisterFailHandler(Fail)
|
||||||
RunSpecs(t, "Engine Suite")
|
RunSpecs(t, "Engine Suite")
|
||||||
}
|
}
|
||||||
|
|
||||||
var testCache fscache.Cache
|
|
||||||
var testCacheDir string
|
|
||||||
|
|
||||||
var _ = Describe("Engine Suite Setup", func() {
|
|
||||||
BeforeSuite(func() {
|
|
||||||
testCacheDir, _ = ioutil.TempDir("", "engine_test_cache")
|
|
||||||
fs, _ := fscache.NewFs(testCacheDir, 0755)
|
|
||||||
testCache, _ = fscache.NewCache(fs, nil)
|
|
||||||
})
|
|
||||||
|
|
||||||
AfterSuite(func() {
|
|
||||||
os.RemoveAll(testCacheDir)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/deluan/navidrome/engine/auth"
|
"github.com/deluan/navidrome/core/auth"
|
||||||
"github.com/deluan/navidrome/model"
|
"github.com/deluan/navidrome/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package engine
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/deluan/navidrome/engine/auth"
|
"github.com/deluan/navidrome/core/auth"
|
||||||
"github.com/deluan/navidrome/model"
|
"github.com/deluan/navidrome/model"
|
||||||
"github.com/deluan/navidrome/persistence"
|
"github.com/deluan/navidrome/persistence"
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
|
@ -1,13 +1,11 @@
|
|||||||
package engine
|
package engine
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/deluan/navidrome/engine/transcoder"
|
|
||||||
"github.com/google/wire"
|
"github.com/google/wire"
|
||||||
)
|
)
|
||||||
|
|
||||||
var Set = wire.NewSet(
|
var Set = wire.NewSet(
|
||||||
NewBrowser,
|
NewBrowser,
|
||||||
NewCover,
|
|
||||||
NewListGenerator,
|
NewListGenerator,
|
||||||
NewPlaylists,
|
NewPlaylists,
|
||||||
NewRatings,
|
NewRatings,
|
||||||
@ -15,9 +13,5 @@ var Set = wire.NewSet(
|
|||||||
NewSearch,
|
NewSearch,
|
||||||
NewNowPlayingRepository,
|
NewNowPlayingRepository,
|
||||||
NewUsers,
|
NewUsers,
|
||||||
NewMediaStreamer,
|
|
||||||
transcoder.New,
|
|
||||||
NewTranscodingCache,
|
|
||||||
NewImageCache,
|
|
||||||
NewPlayers,
|
NewPlayers,
|
||||||
)
|
)
|
||||||
|
@ -8,7 +8,7 @@ import (
|
|||||||
|
|
||||||
"github.com/deluan/navidrome/assets"
|
"github.com/deluan/navidrome/assets"
|
||||||
"github.com/deluan/navidrome/conf"
|
"github.com/deluan/navidrome/conf"
|
||||||
"github.com/deluan/navidrome/engine/auth"
|
"github.com/deluan/navidrome/core/auth"
|
||||||
"github.com/deluan/navidrome/model"
|
"github.com/deluan/navidrome/model"
|
||||||
"github.com/deluan/rest"
|
"github.com/deluan/rest"
|
||||||
"github.com/go-chi/chi"
|
"github.com/go-chi/chi"
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/deluan/navidrome/consts"
|
"github.com/deluan/navidrome/consts"
|
||||||
"github.com/deluan/navidrome/engine/auth"
|
"github.com/deluan/navidrome/core/auth"
|
||||||
"github.com/deluan/navidrome/log"
|
"github.com/deluan/navidrome/log"
|
||||||
"github.com/deluan/navidrome/model"
|
"github.com/deluan/navidrome/model"
|
||||||
"github.com/deluan/navidrome/model/request"
|
"github.com/deluan/navidrome/model/request"
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"encoding/xml"
|
"encoding/xml"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/deluan/navidrome/core"
|
||||||
"net/http"
|
"net/http"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
@ -22,22 +23,22 @@ type Handler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, er
|
|||||||
|
|
||||||
type Router struct {
|
type Router struct {
|
||||||
Browser engine.Browser
|
Browser engine.Browser
|
||||||
Cover engine.Cover
|
Cover core.Cover
|
||||||
ListGenerator engine.ListGenerator
|
ListGenerator engine.ListGenerator
|
||||||
Playlists engine.Playlists
|
Playlists engine.Playlists
|
||||||
Ratings engine.Ratings
|
Ratings engine.Ratings
|
||||||
Scrobbler engine.Scrobbler
|
Scrobbler engine.Scrobbler
|
||||||
Search engine.Search
|
Search engine.Search
|
||||||
Users engine.Users
|
Users engine.Users
|
||||||
Streamer engine.MediaStreamer
|
Streamer core.MediaStreamer
|
||||||
Players engine.Players
|
Players engine.Players
|
||||||
|
|
||||||
mux http.Handler
|
mux http.Handler
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(browser engine.Browser, cover engine.Cover, listGenerator engine.ListGenerator, users engine.Users,
|
func New(browser engine.Browser, cover core.Cover, listGenerator engine.ListGenerator, users engine.Users,
|
||||||
playlists engine.Playlists, ratings engine.Ratings, scrobbler engine.Scrobbler, search engine.Search,
|
playlists engine.Playlists, ratings engine.Ratings, scrobbler engine.Scrobbler, search engine.Search,
|
||||||
streamer engine.MediaStreamer, players engine.Players) *Router {
|
streamer core.MediaStreamer, players engine.Players) *Router {
|
||||||
r := &Router{Browser: browser, Cover: cover, ListGenerator: listGenerator, Playlists: playlists,
|
r := &Router{Browser: browser, Cover: cover, ListGenerator: listGenerator, Playlists: playlists,
|
||||||
Ratings: ratings, Scrobbler: scrobbler, Search: search, Users: users, Streamer: streamer, Players: players}
|
Ratings: ratings, Scrobbler: scrobbler, Search: search, Users: users, Streamer: streamer, Players: players}
|
||||||
r.mux = r.routes()
|
r.mux = r.routes()
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
package subsonic
|
package subsonic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/deluan/navidrome/core"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/deluan/navidrome/consts"
|
"github.com/deluan/navidrome/consts"
|
||||||
"github.com/deluan/navidrome/engine"
|
|
||||||
"github.com/deluan/navidrome/log"
|
"github.com/deluan/navidrome/log"
|
||||||
"github.com/deluan/navidrome/model"
|
"github.com/deluan/navidrome/model"
|
||||||
"github.com/deluan/navidrome/resources"
|
"github.com/deluan/navidrome/resources"
|
||||||
@ -14,10 +14,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type MediaRetrievalController struct {
|
type MediaRetrievalController struct {
|
||||||
cover engine.Cover
|
cover core.Cover
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMediaRetrievalController(cover engine.Cover) *MediaRetrievalController {
|
func NewMediaRetrievalController(cover core.Cover) *MediaRetrievalController {
|
||||||
return &MediaRetrievalController{cover: cover}
|
return &MediaRetrievalController{cover: cover}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
package subsonic
|
package subsonic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/deluan/navidrome/core"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
"github.com/deluan/navidrome/engine"
|
|
||||||
"github.com/deluan/navidrome/log"
|
"github.com/deluan/navidrome/log"
|
||||||
"github.com/deluan/navidrome/server/subsonic/responses"
|
"github.com/deluan/navidrome/server/subsonic/responses"
|
||||||
"github.com/deluan/navidrome/utils"
|
"github.com/deluan/navidrome/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
type StreamController struct {
|
type StreamController struct {
|
||||||
streamer engine.MediaStreamer
|
streamer core.MediaStreamer
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewStreamController(streamer engine.MediaStreamer) *StreamController {
|
func NewStreamController(streamer core.MediaStreamer) *StreamController {
|
||||||
return &StreamController{streamer: streamer}
|
return &StreamController{streamer: streamer}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user