add scan interval
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
|||||||
"flag"
|
"flag"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
_ "github.com/jinzhu/gorm/dialects/sqlite"
|
_ "github.com/jinzhu/gorm/dialects/sqlite"
|
||||||
"github.com/peterbourgon/ff"
|
"github.com/peterbourgon/ff"
|
||||||
@@ -22,6 +23,7 @@ func main() {
|
|||||||
listenAddr := set.String("listen-addr", "0.0.0.0:6969", "listen address (optional)")
|
listenAddr := set.String("listen-addr", "0.0.0.0:6969", "listen address (optional)")
|
||||||
musicPath := set.String("music-path", "", "path to music")
|
musicPath := set.String("music-path", "", "path to music")
|
||||||
dbPath := set.String("db-path", "gonic.db", "path to database (optional)")
|
dbPath := set.String("db-path", "gonic.db", "path to database (optional)")
|
||||||
|
scanInterval := set.Int("scan-interval", 0, "interval (in minutes) to automatically scan music (optional)")
|
||||||
_ = set.String("config-path", "", "path to config (optional)")
|
_ = set.String("config-path", "", "path to config (optional)")
|
||||||
if err := ff.Parse(set, os.Args[1:],
|
if err := ff.Parse(set, os.Args[1:],
|
||||||
ff.WithConfigFileFlag("config-path"),
|
ff.WithConfigFileFlag("config-path"),
|
||||||
@@ -38,11 +40,12 @@ func main() {
|
|||||||
log.Fatalf("error opening database: %v\n", err)
|
log.Fatalf("error opening database: %v\n", err)
|
||||||
}
|
}
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
s := server.New(
|
s := server.New(server.ServerOptions{
|
||||||
db,
|
DB: db,
|
||||||
*musicPath,
|
MusicPath: *musicPath,
|
||||||
*listenAddr,
|
ListenAddr: *listenAddr,
|
||||||
)
|
ScanInterval: time.Duration(*scanInterval) * time.Minute,
|
||||||
|
})
|
||||||
if err = s.SetupAdmin(); err != nil {
|
if err = s.SetupAdmin(); err != nil {
|
||||||
log.Fatalf("error setting up admin routes: %v\n", err)
|
log.Fatalf("error setting up admin routes: %v\n", err)
|
||||||
}
|
}
|
||||||
@@ -50,7 +53,7 @@ func main() {
|
|||||||
log.Fatalf("error setting up subsonic routes: %v\n", err)
|
log.Fatalf("error setting up subsonic routes: %v\n", err)
|
||||||
}
|
}
|
||||||
log.Printf("starting server at %s", *listenAddr)
|
log.Printf("starting server at %s", *listenAddr)
|
||||||
if err := s.ListenAndServe(); err != nil {
|
if err := s.Start(); err != nil {
|
||||||
log.Fatalf("error starting server: %v\n", err)
|
log.Fatalf("error starting server: %v\n", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -250,10 +250,7 @@ func (c *Controller) ServeUpdateLastFMAPIKeyDo(r *http.Request) *Response {
|
|||||||
func (c *Controller) ServeStartScanDo(r *http.Request) *Response {
|
func (c *Controller) ServeStartScanDo(r *http.Request) *Response {
|
||||||
defer func() {
|
defer func() {
|
||||||
go func() {
|
go func() {
|
||||||
err := scanner.
|
if err := c.Scanner.Start(); err != nil {
|
||||||
New(c.DB, c.MusicPath).
|
|
||||||
Start()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("error while scanning: %v\n", err)
|
log.Printf("error while scanning: %v\n", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"senan.xyz/g/gonic/db"
|
"senan.xyz/g/gonic/db"
|
||||||
|
"senan.xyz/g/gonic/scanner"
|
||||||
)
|
)
|
||||||
|
|
||||||
type statusWriter struct {
|
type statusWriter struct {
|
||||||
@@ -45,6 +46,7 @@ func statusToBlock(code int) string {
|
|||||||
type Controller struct {
|
type Controller struct {
|
||||||
DB *db.DB
|
DB *db.DB
|
||||||
MusicPath string
|
MusicPath string
|
||||||
|
Scanner *scanner.Scanner
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) WithLogging(next http.Handler) http.Handler {
|
func (c *Controller) WithLogging(next http.Handler) http.Handler {
|
||||||
|
|||||||
@@ -79,10 +79,7 @@ func (c *Controller) ServeGetMusicFolders(r *http.Request) *spec.Response {
|
|||||||
|
|
||||||
func (c *Controller) ServeStartScan(r *http.Request) *spec.Response {
|
func (c *Controller) ServeStartScan(r *http.Request) *spec.Response {
|
||||||
go func() {
|
go func() {
|
||||||
err := scanner.
|
if err := c.Scanner.Start(); err != nil {
|
||||||
New(c.DB, c.MusicPath).
|
|
||||||
Start()
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("error while scanning: %v\n", err)
|
log.Printf("error while scanning: %v\n", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
BIN
server/ctrlsubsonic/testdata/db
vendored
BIN
server/ctrlsubsonic/testdata/db
vendored
Binary file not shown.
@@ -3,6 +3,7 @@ package server
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
@@ -11,21 +12,31 @@ import (
|
|||||||
|
|
||||||
"senan.xyz/g/gonic/assets"
|
"senan.xyz/g/gonic/assets"
|
||||||
"senan.xyz/g/gonic/db"
|
"senan.xyz/g/gonic/db"
|
||||||
|
"senan.xyz/g/gonic/scanner"
|
||||||
"senan.xyz/g/gonic/server/ctrladmin"
|
"senan.xyz/g/gonic/server/ctrladmin"
|
||||||
"senan.xyz/g/gonic/server/ctrlbase"
|
"senan.xyz/g/gonic/server/ctrlbase"
|
||||||
"senan.xyz/g/gonic/server/ctrlsubsonic"
|
"senan.xyz/g/gonic/server/ctrlsubsonic"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Server struct {
|
type ServerOptions struct {
|
||||||
*http.Server
|
DB *db.DB
|
||||||
router *mux.Router
|
MusicPath string
|
||||||
ctrlBase *ctrlbase.Controller
|
ListenAddr string
|
||||||
|
ScanInterval time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(db *db.DB, musicPath string, listenAddr string) *Server {
|
type Server struct {
|
||||||
|
*http.Server
|
||||||
|
router *mux.Router
|
||||||
|
ctrlBase *ctrlbase.Controller
|
||||||
|
ScanInterval time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(opts ServerOptions) *Server {
|
||||||
ctrlBase := &ctrlbase.Controller{
|
ctrlBase := &ctrlbase.Controller{
|
||||||
DB: db,
|
DB: opts.DB,
|
||||||
MusicPath: musicPath,
|
MusicPath: opts.MusicPath,
|
||||||
|
Scanner: scanner.New(opts.DB, opts.MusicPath),
|
||||||
}
|
}
|
||||||
router := mux.NewRouter()
|
router := mux.NewRouter()
|
||||||
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -44,16 +55,17 @@ func New(db *db.DB, musicPath string, listenAddr string) *Server {
|
|||||||
router.Use(ctrlBase.WithLogging)
|
router.Use(ctrlBase.WithLogging)
|
||||||
router.Use(ctrlBase.WithCORS)
|
router.Use(ctrlBase.WithCORS)
|
||||||
server := &http.Server{
|
server := &http.Server{
|
||||||
Addr: listenAddr,
|
Addr: opts.ListenAddr,
|
||||||
Handler: router,
|
Handler: router,
|
||||||
ReadTimeout: 5 * time.Second,
|
ReadTimeout: 5 * time.Second,
|
||||||
WriteTimeout: 10 * time.Second,
|
WriteTimeout: 10 * time.Second,
|
||||||
IdleTimeout: 15 * time.Second,
|
IdleTimeout: 15 * time.Second,
|
||||||
}
|
}
|
||||||
return &Server{
|
return &Server{
|
||||||
Server: server,
|
Server: server,
|
||||||
router: router,
|
router: router,
|
||||||
ctrlBase: ctrlBase,
|
ctrlBase: ctrlBase,
|
||||||
|
ScanInterval: opts.ScanInterval,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,3 +146,20 @@ func (s *Server) SetupSubsonic() error {
|
|||||||
rout.Handle("/search2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSearchTwo))
|
rout.Handle("/search2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSearchTwo))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) scanTick() {
|
||||||
|
ticker := time.NewTicker(s.ScanInterval)
|
||||||
|
for range ticker.C {
|
||||||
|
if err := s.ctrlBase.Scanner.Start(); err != nil {
|
||||||
|
log.Printf("error while scanner: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Server) Start() error {
|
||||||
|
if s.ScanInterval > 0 {
|
||||||
|
log.Printf("will be scanning at intervals of %s", s.ScanInterval)
|
||||||
|
go s.scanTick()
|
||||||
|
}
|
||||||
|
return s.ListenAndServe()
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user