|
package op |
|
|
|
import ( |
|
"regexp" |
|
"strings" |
|
|
|
"github.com/alist-org/alist/v3/internal/conf" |
|
"github.com/alist-org/alist/v3/internal/driver" |
|
"github.com/alist-org/alist/v3/internal/model" |
|
"github.com/alist-org/alist/v3/pkg/utils" |
|
"github.com/pkg/errors" |
|
log "github.com/sirupsen/logrus" |
|
) |
|
|
|
|
|
type ObjsUpdateHook = func(parent string, objs []model.Obj) |
|
|
|
var ( |
|
objsUpdateHooks = make([]ObjsUpdateHook, 0) |
|
) |
|
|
|
func RegisterObjsUpdateHook(hook ObjsUpdateHook) { |
|
objsUpdateHooks = append(objsUpdateHooks, hook) |
|
} |
|
|
|
func HandleObjsUpdateHook(parent string, objs []model.Obj) { |
|
for _, hook := range objsUpdateHooks { |
|
hook(parent, objs) |
|
} |
|
} |
|
|
|
|
|
type SettingItemHook func(item *model.SettingItem) error |
|
|
|
var settingItemHooks = map[string]SettingItemHook{ |
|
conf.VideoTypes: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.VideoTypes] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
conf.AudioTypes: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.AudioTypes] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
conf.ImageTypes: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.ImageTypes] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
conf.TextTypes: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.TextTypes] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
conf.ProxyTypes: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.ProxyTypes] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
conf.ProxyIgnoreHeaders: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.ProxyIgnoreHeaders] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
conf.PrivacyRegs: func(item *model.SettingItem) error { |
|
regStrs := strings.Split(item.Value, "\n") |
|
regs := make([]*regexp.Regexp, 0, len(regStrs)) |
|
for _, regStr := range regStrs { |
|
reg, err := regexp.Compile(regStr) |
|
if err != nil { |
|
return errors.WithStack(err) |
|
} |
|
regs = append(regs, reg) |
|
} |
|
conf.PrivacyReg = regs |
|
return nil |
|
}, |
|
conf.FilenameCharMapping: func(item *model.SettingItem) error { |
|
err := utils.Json.UnmarshalFromString(item.Value, &conf.FilenameCharMap) |
|
if err != nil { |
|
return err |
|
} |
|
log.Debugf("filename char mapping: %+v", conf.FilenameCharMap) |
|
return nil |
|
}, |
|
conf.IgnoreDirectLinkParams: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.IgnoreDirectLinkParams] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
conf.StorageGroups: func(item *model.SettingItem) error { |
|
conf.SlicesMap[conf.StorageGroups] = strings.Split(item.Value, ",") |
|
return nil |
|
}, |
|
} |
|
|
|
func RegisterSettingItemHook(key string, hook SettingItemHook) { |
|
settingItemHooks[key] = hook |
|
} |
|
|
|
func HandleSettingItemHook(item *model.SettingItem) (hasHook bool, err error) { |
|
if hook, ok := settingItemHooks[item.Key]; ok { |
|
return true, hook(item) |
|
} |
|
return false, nil |
|
} |
|
|
|
|
|
type StorageHook func(typ string, storage driver.Driver) |
|
|
|
var storageHooks = make([]StorageHook, 0) |
|
|
|
func callStorageHooks(typ string, storage driver.Driver) { |
|
for _, hook := range storageHooks { |
|
hook(typ, storage) |
|
} |
|
} |
|
|
|
func RegisterStorageHook(hook StorageHook) { |
|
storageHooks = append(storageHooks, hook) |
|
} |
|
|