diff --git a/internal/app.go b/internal/app.go
index f15aa77..b2e0596 100644
--- a/internal/app.go
+++ b/internal/app.go
@@ -100,7 +100,7 @@ func MainApp(configPath string) {
downloader := universal.NewDownloader(downloadClient)
router := chi.NewRouter()
- handlers.AttachHandlers(router, downloader, torrentMgr, config, rd, log.Named("router"))
+ handlers.AttachHandlers(router, downloader, torrentMgr, config, rd, workerPool, refreshPool, repairPool, log.Named("router"))
// go func() {
// if err := netHttp.ListenAndServe(":6060", nil); err != nil && err != netHttp.ErrServerClosed {
diff --git a/internal/handlers/home.go b/internal/handlers/home.go
index fbe04c2..38bcb26 100644
--- a/internal/handlers/home.go
+++ b/internal/handlers/home.go
@@ -175,8 +175,8 @@ func (zr *Handlers) handleHome(resp http.ResponseWriter, req *http.Request) {
%s |
- | Number of Workers |
- %d |
+ Workers |
+ %d running / %d free / %d total |
| Refresh Every... |
@@ -220,7 +220,7 @@ func (zr *Handlers) handleHome(resp http.ResponseWriter, req *http.Request) {
| Network Buffer Size |
- %d |
+ %d bytes |
| Serve From Rclone |
@@ -238,6 +238,15 @@ func (zr *Handlers) handleHome(resp http.ResponseWriter, req *http.Request) {
On Library Update |
%s |
+
+ | Utilities |
+
+
+
+
+
+ |
+
`
out = fmt.Sprintf(out,
@@ -273,7 +282,9 @@ func (zr *Handlers) handleHome(resp http.ResponseWriter, req *http.Request) {
strings.Replace(response.Config.Token, response.Config.Token[len(response.Config.Token)-48:], "*****", 1),
response.Config.GetHost(),
response.Config.GetPort(),
- response.Config.GetNumOfWorkers(),
+ zr.workerPool.Running(),
+ zr.workerPool.Free(),
+ zr.workerPool.Cap(),
response.Config.GetRefreshEverySecs(),
response.Config.EnableRetainRDTorrentName(),
response.Config.EnableRetainFolderNameExtension(),
@@ -294,6 +305,29 @@ func (zr *Handlers) handleHome(resp http.ResponseWriter, req *http.Request) {
fmt.Fprint(resp, out)
}
+func (zr *Handlers) handleRebootWorkerPool(resp http.ResponseWriter, req *http.Request) {
+ // zr.workerPool.Release()
+ zr.workerPool.Reboot()
+ zr.log.Infof("Rebooted worker pool")
+ fmt.Fprint(resp, "Rebooted worker pool, please close this window")
+}
+
+func (zr *Handlers) handleRebootRefreshPool(resp http.ResponseWriter, req *http.Request) {
+ zr.refreshPool.Release()
+ // zr.refreshPool.Reboot()
+ // zr.torMgr.StartRefreshJob()
+ zr.log.Infof("Rebooted refresh pool")
+ fmt.Fprint(resp, "Rebooted refresh pool, please close this window")
+}
+
+func (zr *Handlers) handleRebootRepairPool(resp http.ResponseWriter, req *http.Request) {
+ zr.repairPool.Release()
+ // zr.repairPool.Reboot()
+ // zr.torMgr.StartRepairJob()
+ zr.log.Infof("Rebooted repair pool")
+ fmt.Fprint(resp, "Rebooted repair pool, please close this window")
+}
+
func bToMb(b uint64) uint64 {
return b / 1024 / 1024
}
diff --git a/internal/handlers/router.go b/internal/handlers/router.go
index 66f82d4..7b2148b 100644
--- a/internal/handlers/router.go
+++ b/internal/handlers/router.go
@@ -16,14 +16,18 @@ import (
"github.com/debridmediamanager/zurg/pkg/logutil"
"github.com/debridmediamanager/zurg/pkg/realdebrid"
"github.com/go-chi/chi/v5"
+ "github.com/panjf2000/ants/v2"
)
type Handlers struct {
- downloader *universal.Downloader
- torMgr *torrent.TorrentManager
- cfg config.ConfigInterface
- api *realdebrid.RealDebrid
- log *logutil.Logger
+ downloader *universal.Downloader
+ torMgr *torrent.TorrentManager
+ cfg config.ConfigInterface
+ api *realdebrid.RealDebrid
+ workerPool *ants.Pool
+ refreshPool *ants.Pool
+ repairPool *ants.Pool
+ log *logutil.Logger
}
func init() {
@@ -32,13 +36,16 @@ func init() {
chi.RegisterMethod("MOVE")
}
-func AttachHandlers(router *chi.Mux, downloader *universal.Downloader, torMgr *torrent.TorrentManager, cfg config.ConfigInterface, api *realdebrid.RealDebrid, log *logutil.Logger) {
+func AttachHandlers(router *chi.Mux, downloader *universal.Downloader, torMgr *torrent.TorrentManager, cfg config.ConfigInterface, api *realdebrid.RealDebrid, workerPool, refreshPool, repairPool *ants.Pool, log *logutil.Logger) {
hs := &Handlers{
- downloader: downloader,
- torMgr: torMgr,
- cfg: cfg,
- api: api,
- log: log,
+ downloader: downloader,
+ torMgr: torMgr,
+ cfg: cfg,
+ api: api,
+ workerPool: workerPool,
+ refreshPool: refreshPool,
+ repairPool: repairPool,
+ log: log,
}
if cfg.GetUsername() != "" {
@@ -47,6 +54,9 @@ func AttachHandlers(router *chi.Mux, downloader *universal.Downloader, torMgr *t
router.Use(hs.options)
router.Get("/", hs.handleHome)
+ router.Get("/reboot/worker", hs.handleRebootWorkerPool)
+ router.Get("/reboot/refresh", hs.handleRebootRefreshPool)
+ router.Get("/reboot/repair", hs.handleRebootRepairPool)
// version
router.Get(fmt.Sprintf("/{mountType}/%s", version.FILE), hs.handleVersionFile)
router.Head(fmt.Sprintf("/{mountType}/%s", version.FILE), hs.handleCheckVersionFile)
diff --git a/internal/torrent/manager.go b/internal/torrent/manager.go
index be04d14..51e7c38 100644
--- a/internal/torrent/manager.go
+++ b/internal/torrent/manager.go
@@ -66,8 +66,8 @@ func NewTorrentManager(cfg config.ConfigInterface, api *realdebrid.RealDebrid, w
t.mountDownloads()
t.refreshTorrents()
t.SetNewLatestState(t.getCurrentState())
- t.startRefreshJob()
- t.startRepairJob()
+ t.StartRefreshJob()
+ t.StartRepairJob()
return t
}
diff --git a/internal/torrent/refresh.go b/internal/torrent/refresh.go
index 547226c..719d36b 100644
--- a/internal/torrent/refresh.go
+++ b/internal/torrent/refresh.go
@@ -119,8 +119,8 @@ func (t *TorrentManager) refreshTorrents() []string {
return updatedPaths
}
-// startRefreshJob periodically refreshes the torrents
-func (t *TorrentManager) startRefreshJob() {
+// StartRefreshJob periodically refreshes the torrents
+func (t *TorrentManager) StartRefreshJob() {
_ = t.refreshPool.Submit(func() {
t.log.Info("Starting periodic refresh job")
for {
diff --git a/internal/torrent/repair.go b/internal/torrent/repair.go
index fc16570..3955516 100644
--- a/internal/torrent/repair.go
+++ b/internal/torrent/repair.go
@@ -17,7 +17,7 @@ const (
EXPIRED_LINK_TOLERANCE_HOURS = 24
)
-func (t *TorrentManager) startRepairJob() {
+func (t *TorrentManager) StartRepairJob() {
if !t.Config.EnableRepair() {
t.log.Debug("Repair is disabled, skipping repair job")
return