| package engine |
|
|
| import ( |
| "log" |
| "os" |
|
|
| "github.com/metatube-community/metatube-sdk-go/common/fetch" |
| mt "github.com/metatube-community/metatube-sdk-go/provider" |
| ) |
|
|
| func (e *Engine) init() *Engine { |
| e.initLogger() |
| e.initFetcher() |
| e.initActorProviders() |
| e.initMovieProviders() |
| return e |
| } |
|
|
| func (e *Engine) initLogger() { |
| e.logger = log.New(os.Stdout, "[ENGINE]\u0020", log.LstdFlags|log.Llongfile) |
| } |
|
|
| func (e *Engine) initFetcher() { |
| e.fetcher = fetch.Default(&fetch.Config{Timeout: e.timeout}) |
| } |
|
|
| |
| func (e *Engine) initActorProviders() { |
| for name, factory := range mt.RangeActorFactory { |
| provider := factory() |
|
|
| if s, ok := provider.(mt.RequestTimeoutSetter); ok { |
| s.SetRequestTimeout(e.timeout ) |
| } |
|
|
| if config, hasConfig := e.actorProviderConfigs.Get(name); hasConfig { |
| e.applyProviderConfig("actor", provider, config) |
| } |
|
|
| if provider.Priority() <= 0 { |
| e.logger.Printf("Disable actor provider: %s", provider.Name()) |
| continue |
| } |
|
|
| |
| e.actorProviders.Set(name, provider) |
| |
| host := provider.URL().Hostname() |
| e.actorHostProviders.Set(host, |
| append(e.actorHostProviders. |
| GetOrDefault(host, nil), provider)) |
| } |
| } |
|
|
| |
| func (e *Engine) initMovieProviders() { |
| for name, factory := range mt.RangeMovieFactory { |
| provider := factory() |
|
|
| if s, ok := provider.(mt.RequestTimeoutSetter); ok { |
| s.SetRequestTimeout(e.timeout ) |
| } |
|
|
| if config, hasConfig := e.movieProviderConfigs.Get(name); hasConfig { |
| e.applyProviderConfig("movie", provider, config) |
| } |
|
|
| if provider.Priority() <= 0 { |
| e.logger.Printf("Disable movie provider: %s", provider.Name()) |
| continue |
| } |
|
|
| |
| e.movieProviders.Set(name, provider) |
| |
| host := provider.URL().Hostname() |
| e.movieHostProviders.Set(host, |
| append(e.movieHostProviders. |
| GetOrDefault(host, nil), provider)) |
| } |
| } |
|
|
| func (e *Engine) applyProviderConfig(providerType string, provider mt.Provider, config mt.Config) { |
| const ( |
| proxyConfigKey = "proxy" |
| priorityConfigKey = "priority" |
| timeoutConfigKey = "timeout" |
| ) |
|
|
| |
| if config.Has(priorityConfigKey) { |
| if v, err := config.GetFloat64(priorityConfigKey); err == nil { |
| e.logger.Printf("Override %s provider priority: %s=%.2f", providerType, provider.Name(), v) |
| provider.SetPriority(v) |
| } |
| } |
|
|
| |
| if s, ok := provider.(mt.ProxySetter); ok && config.Has(proxyConfigKey) { |
| if v, err := config.GetString(proxyConfigKey); err == nil { |
| if err := s.SetProxy(v); err != nil { |
| e.logger.Fatalf("Set proxy for %s provider '%s' error: %v", providerType, provider.Name(), v) |
| } |
| e.logger.Printf("Override %s provider proxy: %s=%s", providerType, provider.Name(), v) |
| } |
| } |
|
|
| |
| if s, ok := provider.(mt.RequestTimeoutSetter); ok && config.Has(timeoutConfigKey) { |
| if v, err := config.GetDuration(timeoutConfigKey); err == nil { |
| e.logger.Printf("Override %s provider request timeout: %s=%s", providerType, provider.Name(), v) |
| s.SetRequestTimeout(v) |
| } |
| } |
|
|
| |
| if s, ok := provider.(mt.ConfigSetter); ok { |
| if err := s.SetConfig(config); err != nil { |
| e.logger.Fatalf("Set %s provider config for %s: %v", providerType, provider.Name(), err) |
| } |
| } |
| } |
|
|