diff --git a/cmd/gonic/main.go b/cmd/gonic/main.go index ed6b044..0c7b121 100644 --- a/cmd/gonic/main.go +++ b/cmd/gonic/main.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "os" + "path" "regexp" "time" @@ -17,6 +18,11 @@ import ( "go.senan.xyz/gonic/version" ) +const ( + cleanTimeDuration = 10 * time.Minute + coverCachePrefix = "covers" +) + func main() { set := flag.NewFlagSet(version.NAME, flag.ExitOnError) listenAddr := set.String("listen-addr", "0.0.0.0:4747", "listen address (optional)") @@ -45,6 +51,7 @@ func main() { set.VisitAll(func(f *flag.Flag) { log.Printf(" %-15s %s\n", f.Name, f.Value) }) + // if _, err := os.Stat(*musicPath); os.IsNotExist(err) { log.Fatal("please provide a valid music directory") } @@ -53,6 +60,12 @@ func main() { log.Fatalf("couldn't create cache path: %v\n", err) } } + coverCachePath := path.Join(*cachePath, "covers") + if _, err := os.Stat(coverCachePath); os.IsNotExist(err) { + if err := os.MkdirAll(coverCachePath, os.ModePerm); err != nil { + log.Fatalf("couldn't create cover cache path: %v\n", err) + } + } db, err := db.New(*dbPath) if err != nil { log.Fatalf("error opening database: %v\n", err) @@ -63,14 +76,15 @@ func main() { *proxyPrefix = proxyPrefixExpr.ReplaceAllString(*proxyPrefix, `/$1`) // server := server.New(server.Options{ - DB: db, - MusicPath: *musicPath, - CachePath: *cachePath, - ProxyPrefix: *proxyPrefix, + DB: db, + MusicPath: *musicPath, + CachePath: *cachePath, + CoverCachePath: coverCachePath, + ProxyPrefix: *proxyPrefix, }) var g run.Group g.Add(server.StartHTTP(*listenAddr)) - g.Add(server.StartSessionClean(10 * time.Minute)) + g.Add(server.StartSessionClean(cleanTimeDuration)) if *scanInterval > 0 { tickerDur := time.Duration(*scanInterval) * time.Minute g.Add(server.StartScanTicker(tickerDur)) diff --git a/server/ctrlsubsonic/ctrl.go b/server/ctrlsubsonic/ctrl.go index 68e4e14..35f4b9f 100644 --- a/server/ctrlsubsonic/ctrl.go +++ b/server/ctrlsubsonic/ctrl.go @@ -25,8 +25,9 @@ const ( type Controller struct { *ctrlbase.Controller - CachePath string - Jukebox *jukebox.Jukebox + CachePath string + CoverCachePath string + Jukebox *jukebox.Jukebox } type metaResponse struct { diff --git a/server/ctrlsubsonic/handlers_raw.go b/server/ctrlsubsonic/handlers_raw.go index e995b3b..6700897 100644 --- a/server/ctrlsubsonic/handlers_raw.go +++ b/server/ctrlsubsonic/handlers_raw.go @@ -106,7 +106,7 @@ func (c *Controller) ServeGetCoverArt(w http.ResponseWriter, r *http.Request) *s } size := params.GetOrInt("size", coverDefaultSize) cachePath := path.Join( - c.CachePath, + c.CoverCachePath, fmt.Sprintf("%s-%d.%s", id.String(), size, coverCacheFormat), ) _, err = os.Stat(cachePath) diff --git a/server/server.go b/server/server.go index 59a5c3b..b2b4da7 100644 --- a/server/server.go +++ b/server/server.go @@ -21,10 +21,11 @@ import ( ) type Options struct { - DB *db.DB - MusicPath string - CachePath string - ProxyPrefix string + DB *db.DB + MusicPath string + CachePath string + CoverCachePath string + ProxyPrefix string } type Server struct { @@ -61,9 +62,10 @@ func New(opts Options) *Server { // ctrlAdmin := ctrladmin.New(base, sessDB) ctrlSubsonic := &ctrlsubsonic.Controller{ - Controller: base, - CachePath: opts.CachePath, - Jukebox: jukebox, + Controller: base, + CachePath: opts.CachePath, + CoverCachePath: opts.CoverCachePath, + Jukebox: jukebox, } setupMisc(r, base) setupAdmin(r.PathPrefix("/admin").Subrouter(), ctrlAdmin)