diff options
Diffstat (limited to 'core.go')
-rw-r--r-- | core.go | 138 |
1 files changed, 136 insertions, 2 deletions
@@ -26,14 +26,21 @@ package rhimport import ( // "io/ioutil" + "fmt" "github.com/golang-basic/go-curl" "log" "os" ) +const ( + CART_MAX = 999999 + CUT_MAX = 999 +) + var ( - rhl = log.New(os.Stderr, "[rhimport]\t", log.LstdFlags) - rhdl = log.New(os.Stderr, "[rhimport-dbg]\t", log.LstdFlags) + bool2str = map[bool]string{false: "0", true: "1"} + rhl = log.New(os.Stderr, "[rhimport]\t", log.LstdFlags) + rhdl = log.New(os.Stderr, "[rhimport-dbg]\t", log.LstdFlags) //rhdl = log.New(ioutil.Discard, "[rhimport-dbg]\t", log.LstdFlags) ) @@ -41,3 +48,130 @@ func init() { curl.GlobalInit(curl.GLOBAL_ALL) fetcher_init() } + +type ImportProgressCB func(step int, step_name string, progress float64, userdata interface{}) bool + +type ImportContext struct { + conf *Config + rddb *RdDbChan + UserName string + Password string + Trusted bool + ShowId uint + ClearShowCarts bool + GroupName string + Cart uint + ClearCart bool + Cut uint + Channels uint + NormalizationLevel int + AutotrimLevel int + UseMetaData bool + SourceUri string + SourceFile string + DeleteSourceFile bool + DeleteSourceDir bool + ProgressCallBack ImportProgressCB + ProgressCallBackData interface{} + Cancel <-chan bool +} + +func NewImportContext(conf *Config, rddb *RdDbChan, user string) *ImportContext { + ctx := new(ImportContext) + ctx.conf = conf + ctx.rddb = rddb + ctx.UserName = user + ctx.Password = "" + ctx.Trusted = false + ctx.ShowId = 0 + ctx.ClearShowCarts = false + ctx.GroupName = "" + ctx.Cart = 0 + ctx.ClearCart = false + ctx.Cut = 0 + ctx.Channels = conf.ImportParamDefaults.Channels + ctx.NormalizationLevel = conf.ImportParamDefaults.NormalizationLevel + ctx.AutotrimLevel = conf.ImportParamDefaults.AutotrimLevel + ctx.UseMetaData = conf.ImportParamDefaults.UseMetaData + ctx.SourceFile = "" + ctx.DeleteSourceFile = false + ctx.DeleteSourceDir = false + ctx.ProgressCallBack = nil + ctx.Cancel = nil + + return ctx +} + +func (ctx *ImportContext) SanityCheck() error { + if ctx.UserName == "" { + return fmt.Errorf("empty Username is not allowed") + } + if ctx.Password == "" && !ctx.Trusted { + return fmt.Errorf("empty Password on untrusted control interface is not allowed") + } + if ctx.ShowId != 0 { + if ctx.ShowId != 0 && ctx.ShowId > CART_MAX { + return fmt.Errorf("ShowId %d is outside of allowed range (0 < show-id < %d)", ctx.ShowId, CART_MAX) + } + if ctx.Cart != 0 && ctx.Cart > CART_MAX { + return fmt.Errorf("Cart %d is outside of allowed range (0 < cart < %d)", ctx.Cart, CART_MAX) + } + return nil + } + if ctx.GroupName != "" { + ismusic, err := ctx.checkMusicGroup() + if err != nil { + return err + } + if !ismusic { + return fmt.Errorf("supplied GroupName '%s' is not a music pool", ctx.GroupName) + } + if ctx.Cart != 0 || ctx.Cut != 0 { + return fmt.Errorf("Cart and Cut must not be supplied when importing into a music group") + } + return nil + } + if ctx.Cart == 0 { + return fmt.Errorf("either ShowId, PoolName or CartNumber must be supplied") + } + if ctx.Cart > CART_MAX { + return fmt.Errorf("Cart %d is outside of allowed range (0 < cart < %d)", ctx.Cart, CART_MAX) + } + if ctx.Cut != 0 && ctx.Cut > CUT_MAX { + return fmt.Errorf("Cut %d is outside of allowed range (0 < cart < %d)", ctx.Cut, CUT_MAX) + } + if ctx.Channels != 1 && ctx.Channels != 2 { + return fmt.Errorf("channles must be 1 or 2") + } + return nil +} + +func (ctx *ImportContext) getPassword(cached bool) (err error) { + ctx.Password, err = ctx.rddb.GetPassword(ctx.UserName, cached) + return +} + +func (ctx *ImportContext) getGroupOfCart() (err error) { + ctx.GroupName, err = ctx.rddb.GetGroupOfCart(ctx.Cart) + return +} + +func (ctx *ImportContext) getShowInfo() (carts []uint, err error) { + ctx.GroupName, ctx.NormalizationLevel, ctx.AutotrimLevel, carts, err = ctx.rddb.GetShowInfo(ctx.ShowId) + ctx.Channels = 2 + ctx.UseMetaData = true + return +} + +func (ctx *ImportContext) checkMusicGroup() (bool, error) { + return ctx.rddb.CheckMusicGroup(ctx.GroupName) +} + +func (ctx *ImportContext) getMusicInfo() (err error) { + ctx.NormalizationLevel, ctx.AutotrimLevel, err = ctx.rddb.GetMusicInfo(ctx.GroupName) + ctx.Channels = 2 + ctx.UseMetaData = true + ctx.Cart = 0 + ctx.Cut = 0 + return +} |