add scan interval

This commit is contained in:
sentriz
2019-11-24 01:32:17 +00:00
parent 1bfeb117dc
commit a92074ecb4
6 changed files with 53 additions and 25 deletions

View File

@@ -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)
} }
} }

View File

@@ -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)
} }
}() }()

View File

@@ -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 {

View File

@@ -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)
} }
}() }()

Binary file not shown.

View File

@@ -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()
}