Add hooks functionality

This commit is contained in:
Ben Sarmiento
2023-10-28 13:19:32 +02:00
parent a9d017f481
commit 1cb7873a3b
5 changed files with 79 additions and 28 deletions

View File

@@ -17,6 +17,7 @@ type ConfigInterface interface {
GetPort() string
GetDirectories() []string
MeetsConditions(directory, torrentID, torrentName string, fileNames []string) bool
GetOnLibraryUpdate() string
}
func LoadZurgConfig(filename string) (ConfigInterface, error) {

View File

@@ -8,4 +8,37 @@ type ZurgConfig struct {
RefreshEverySeconds int `yaml:"check_for_changes_every_secs"`
CacheTimeHours int `yaml:"info_cache_time_hours"`
CanRepair bool `yaml:"enable_repair"`
OnLibraryUpdate string `yaml:"on_library_update"`
}
func (z *ZurgConfig) GetVersion() string {
return "v1"
}
func (z *ZurgConfig) GetToken() string {
return z.Token
}
func (z *ZurgConfig) GetPort() string {
return z.Port
}
func (z *ZurgConfig) GetNumOfWorkers() int {
return z.NumOfWorkers
}
func (z *ZurgConfig) GetRefreshEverySeconds() int {
return z.RefreshEverySeconds
}
func (z *ZurgConfig) GetCacheTimeHours() int {
return z.CacheTimeHours
}
func (z *ZurgConfig) EnableRepair() bool {
return z.CanRepair
}
func (z *ZurgConfig) GetOnLibraryUpdate() string {
return z.OnLibraryUpdate
}

View File

@@ -17,34 +17,6 @@ func loadV1Config(content []byte) (*ZurgConfigV1, error) {
return &configV1, nil
}
func (z *ZurgConfigV1) GetVersion() string {
return "v1"
}
func (z *ZurgConfigV1) GetToken() string {
return z.Token
}
func (z *ZurgConfigV1) GetPort() string {
return z.Port
}
func (z *ZurgConfigV1) GetNumOfWorkers() int {
return z.NumOfWorkers
}
func (z *ZurgConfigV1) GetRefreshEverySeconds() int {
return z.RefreshEverySeconds
}
func (z *ZurgConfigV1) GetCacheTimeHours() int {
return z.CacheTimeHours
}
func (z *ZurgConfigV1) EnableRepair() bool {
return z.CanRepair
}
func (z *ZurgConfigV1) GetDirectories() []string {
rootDirectories := make([]string, len(z.Directories))
i := 0

44
internal/torrent/hooks.go Normal file
View File

@@ -0,0 +1,44 @@
package torrent
import (
"bytes"
"fmt"
"log"
"os/exec"
"github.com/debridmediamanager.com/zurg/internal/config"
)
type ScriptExecutor struct {
Script string
}
func (se *ScriptExecutor) Execute() (string, error) {
if se.Script == "" {
return "", nil
}
cmd := exec.Command("/bin/sh", "-c", se.Script)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
return "", fmt.Errorf("error executing script: %v; stderr: %s", err, stderr.String())
}
return out.String(), nil
}
func OnLibraryUpdateHook(config config.ConfigInterface) {
executor := &ScriptExecutor{
Script: config.GetOnLibraryUpdate(),
}
output, err := executor.Execute()
if err != nil {
log.Printf("Failed to execute hook on_library_update:\n%v\n", err)
return
}
if output != "" {
log.Printf("Output of hook on_library_update:\n%s\n", output)
}
}

View File

@@ -202,6 +202,7 @@ func (t *TorrentManager) startRefreshJob() {
go t.repairAll(&wg)
}
go t.mapToDirectories()
go OnLibraryUpdateHook(t.config)
}
}