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" ) // Obj 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) } } // Setting 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 }, } 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 } // Storage 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) }