fix(indexers-irc): load new values on update (#274)

* fix(indexers-irc): reload config on restart

* fix(indexers-irc): reload config

* fix: indexer add form
This commit is contained in:
Ludvig Lundgren 2022-05-17 09:35:08 +02:00 committed by GitHub
parent 45053d9823
commit 2903e7b493
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 46 additions and 55 deletions

View file

@ -20,14 +20,14 @@ type Processor interface {
} }
type announceProcessor struct { type announceProcessor struct {
indexer domain.IndexerDefinition indexer *domain.IndexerDefinition
releaseSvc release.Service releaseSvc release.Service
queues map[string]chan string queues map[string]chan string
} }
func NewAnnounceProcessor(releaseSvc release.Service, indexer domain.IndexerDefinition) Processor { func NewAnnounceProcessor(releaseSvc release.Service, indexer *domain.IndexerDefinition) Processor {
ap := &announceProcessor{ ap := &announceProcessor{
releaseSvc: releaseSvc, releaseSvc: releaseSvc,
indexer: indexer, indexer: indexer,
@ -166,7 +166,7 @@ func (a *announceProcessor) parseExtract(pattern string, vars []string, tmpVars
} }
// onLinesMatched process vars into release // onLinesMatched process vars into release
func (a *announceProcessor) onLinesMatched(def domain.IndexerDefinition, vars map[string]string, rls *domain.Release) error { func (a *announceProcessor) onLinesMatched(def *domain.IndexerDefinition, vars map[string]string, rls *domain.Release) error {
var err error var err error
err = rls.MapVars(def, vars) err = rls.MapVars(def, vars)

View file

@ -358,7 +358,7 @@ func (r *Release) RejectionsString() string {
} }
// MapVars better name // MapVars better name
func (r *Release) MapVars(def IndexerDefinition, varMap map[string]string) error { func (r *Release) MapVars(def *IndexerDefinition, varMap map[string]string) error {
if torrentName, err := getStringMapValue(varMap, "torrentName"); err != nil { if torrentName, err := getStringMapValue(varMap, "torrentName"); err != nil {
return errors.Wrap(err, "failed parsing required field") return errors.Wrap(err, "failed parsing required field")

View file

@ -16,7 +16,7 @@ type indexerService interface {
Update(ctx context.Context, indexer domain.Indexer) (*domain.Indexer, error) Update(ctx context.Context, indexer domain.Indexer) (*domain.Indexer, error)
List(ctx context.Context) ([]domain.Indexer, error) List(ctx context.Context) ([]domain.Indexer, error)
GetAll() ([]*domain.IndexerDefinition, error) GetAll() ([]*domain.IndexerDefinition, error)
GetTemplates() ([]domain.IndexerDefinition, error) GetTemplates() ([]*domain.IndexerDefinition, error)
Delete(ctx context.Context, id int) error Delete(ctx context.Context, id int) error
} }

View file

@ -24,9 +24,9 @@ type Service interface {
FindByFilterID(ctx context.Context, id int) ([]domain.Indexer, error) FindByFilterID(ctx context.Context, id int) ([]domain.Indexer, error)
List(ctx context.Context) ([]domain.Indexer, error) List(ctx context.Context) ([]domain.Indexer, error)
GetAll() ([]*domain.IndexerDefinition, error) GetAll() ([]*domain.IndexerDefinition, error)
GetTemplates() ([]domain.IndexerDefinition, error) GetTemplates() ([]*domain.IndexerDefinition, error)
LoadIndexerDefinitions() error LoadIndexerDefinitions() error
GetIndexersByIRCNetwork(server string) []domain.IndexerDefinition GetIndexersByIRCNetwork(server string) []*domain.IndexerDefinition
GetTorznabIndexers() []domain.IndexerDefinition GetTorznabIndexers() []domain.IndexerDefinition
Start() error Start() error
} }
@ -38,12 +38,12 @@ type service struct {
scheduler scheduler.Service scheduler scheduler.Service
// contains all raw indexer definitions // contains all raw indexer definitions
indexerDefinitions map[string]domain.IndexerDefinition indexerDefinitions map[string]*domain.IndexerDefinition
// map server:channel:announce to indexer.Identifier // map server:channel:announce to indexer.Identifier
mapIndexerIRCToName map[string]string mapIndexerIRCToName map[string]string
lookupIRCServerDefinition map[string]map[string]domain.IndexerDefinition lookupIRCServerDefinition map[string]map[string]*domain.IndexerDefinition
torznabIndexers map[string]*domain.IndexerDefinition torznabIndexers map[string]*domain.IndexerDefinition
} }
@ -54,9 +54,9 @@ func NewService(config domain.Config, repo domain.IndexerRepo, apiService APISer
repo: repo, repo: repo,
apiService: apiService, apiService: apiService,
scheduler: scheduler, scheduler: scheduler,
indexerDefinitions: make(map[string]domain.IndexerDefinition), indexerDefinitions: make(map[string]*domain.IndexerDefinition),
mapIndexerIRCToName: make(map[string]string), mapIndexerIRCToName: make(map[string]string),
lookupIRCServerDefinition: make(map[string]map[string]domain.IndexerDefinition), lookupIRCServerDefinition: make(map[string]map[string]*domain.IndexerDefinition),
torznabIndexers: make(map[string]*domain.IndexerDefinition), torznabIndexers: make(map[string]*domain.IndexerDefinition),
} }
} }
@ -169,49 +169,37 @@ func (s *service) mapIndexer(indexer domain.Indexer) (*domain.IndexerDefinition,
} }
} }
indexerDefinition := domain.IndexerDefinition{ in.ID = int(indexer.ID)
ID: int(indexer.ID), in.Name = indexer.Name
Name: indexer.Name, in.Identifier = indexer.Identifier
Identifier: indexer.Identifier, in.Implementation = indexer.Implementation
Implementation: indexer.Implementation, in.Enabled = indexer.Enabled
Enabled: indexer.Enabled, in.SettingsMap = make(map[string]string)
Description: in.Description,
Language: in.Language,
Privacy: in.Privacy,
Protocol: in.Protocol,
URLS: in.URLS,
Supports: in.Supports,
Settings: nil,
SettingsMap: make(map[string]string),
IRC: in.IRC,
Torznab: in.Torznab,
Parse: in.Parse,
}
if indexerDefinition.Implementation == "" { if in.Implementation == "" {
indexerDefinition.Implementation = "irc" in.Implementation = "irc"
} }
// map settings // map settings
// add value to settings objects // add value to settings objects
for _, setting := range in.Settings { for i, setting := range in.Settings {
if v, ok := indexer.Settings[setting.Name]; ok { if v, ok := indexer.Settings[setting.Name]; ok {
setting.Value = v setting.Value = v
indexerDefinition.SettingsMap[setting.Name] = v in.SettingsMap[setting.Name] = v
} }
indexerDefinition.Settings = append(indexerDefinition.Settings, setting) in.Settings[i] = setting
} }
return &indexerDefinition, nil return in, nil
} }
func (s *service) GetTemplates() ([]domain.IndexerDefinition, error) { func (s *service) GetTemplates() ([]*domain.IndexerDefinition, error) {
definitions := s.indexerDefinitions definitions := s.indexerDefinitions
var ret []domain.IndexerDefinition ret := make([]*domain.IndexerDefinition, 0)
for _, definition := range definitions { for _, definition := range definitions {
ret = append(ret, definition) ret = append(ret, definition)
} }
@ -242,10 +230,10 @@ func (s *service) Start() error {
for _, indexer := range indexerDefinitions { for _, indexer := range indexerDefinitions {
if indexer.IRC != nil { if indexer.IRC != nil {
s.mapIRCIndexerLookup(indexer.Identifier, *indexer) s.mapIRCIndexerLookup(indexer.Identifier, indexer)
// add to irc server lookup table // add to irc server lookup table
s.mapIRCServerDefinitionLookup(indexer.IRC.Server, *indexer) s.mapIRCServerDefinitionLookup(indexer.IRC.Server, indexer)
// check if it has api and add to api service // check if it has api and add to api service
if indexer.Enabled && indexer.HasApi() { if indexer.Enabled && indexer.HasApi() {
@ -294,10 +282,10 @@ func (s *service) addIndexer(indexer domain.Indexer) error {
//} //}
if indexerDefinition.IRC != nil { if indexerDefinition.IRC != nil {
s.mapIRCIndexerLookup(indexer.Identifier, *indexerDefinition) s.mapIRCIndexerLookup(indexer.Identifier, indexerDefinition)
// add to irc server lookup table // add to irc server lookup table
s.mapIRCServerDefinitionLookup(indexerDefinition.IRC.Server, *indexerDefinition) s.mapIRCServerDefinitionLookup(indexerDefinition.IRC.Server, indexerDefinition)
// check if it has api and add to api service // check if it has api and add to api service
if indexerDefinition.Enabled && indexerDefinition.HasApi() { if indexerDefinition.Enabled && indexerDefinition.HasApi() {
@ -315,7 +303,7 @@ func (s *service) addIndexer(indexer domain.Indexer) error {
return nil return nil
} }
func (s *service) mapIRCIndexerLookup(indexerIdentifier string, indexerDefinition domain.IndexerDefinition) { func (s *service) mapIRCIndexerLookup(indexerIdentifier string, indexerDefinition *domain.IndexerDefinition) {
// map irc stuff to indexer.name // map irc stuff to indexer.name
// map[irc.network.test:channel:announcer1] = indexer1 // map[irc.network.test:channel:announcer1] = indexer1
// map[irc.network.test:channel:announcer2] = indexer2 // map[irc.network.test:channel:announcer2] = indexer2
@ -339,12 +327,12 @@ func (s *service) mapIRCIndexerLookup(indexerIdentifier string, indexerDefinitio
// mapIRCServerDefinitionLookup map irc stuff to indexer.name // mapIRCServerDefinitionLookup map irc stuff to indexer.name
// map[irc.network.test][indexer1] = indexer1 // map[irc.network.test][indexer1] = indexer1
// map[irc.network.test][indexer2] = indexer2 // map[irc.network.test][indexer2] = indexer2
func (s *service) mapIRCServerDefinitionLookup(ircServer string, indexerDefinition domain.IndexerDefinition) { func (s *service) mapIRCServerDefinitionLookup(ircServer string, indexerDefinition *domain.IndexerDefinition) {
if indexerDefinition.IRC != nil { if indexerDefinition.IRC != nil {
// check if already exists, if ok add it to existing, otherwise create new // check if already exists, if ok add it to existing, otherwise create new
_, exists := s.lookupIRCServerDefinition[ircServer] _, exists := s.lookupIRCServerDefinition[ircServer]
if !exists { if !exists {
s.lookupIRCServerDefinition[ircServer] = map[string]domain.IndexerDefinition{} s.lookupIRCServerDefinition[ircServer] = map[string]*domain.IndexerDefinition{}
} }
s.lookupIRCServerDefinition[ircServer][indexerDefinition.Identifier] = indexerDefinition s.lookupIRCServerDefinition[ircServer][indexerDefinition.Identifier] = indexerDefinition
@ -374,7 +362,7 @@ func (s *service) LoadIndexerDefinitions() error {
log.Trace().Msgf("parsing: %v", file) log.Trace().Msgf("parsing: %v", file)
var d domain.IndexerDefinition var d *domain.IndexerDefinition
data, err := fs.ReadFile(Definitions, file) data, err := fs.ReadFile(Definitions, file)
if err != nil { if err != nil {
@ -427,7 +415,7 @@ func (s *service) LoadCustomIndexerDefinitions() error {
log.Trace().Msgf("parsing custom: %v", file) log.Trace().Msgf("parsing custom: %v", file)
var d domain.IndexerDefinition var d *domain.IndexerDefinition
//data, err := fs.ReadFile(Definitions, filePath) //data, err := fs.ReadFile(Definitions, filePath)
data, err := os.ReadFile(file) data, err := os.ReadFile(file)
@ -452,10 +440,10 @@ func (s *service) LoadCustomIndexerDefinitions() error {
return nil return nil
} }
func (s *service) GetIndexersByIRCNetwork(server string) []domain.IndexerDefinition { func (s *service) GetIndexersByIRCNetwork(server string) []*domain.IndexerDefinition {
server = strings.ToLower(server) server = strings.ToLower(server)
indexerDefinitions := make([]domain.IndexerDefinition, 0) var indexerDefinitions []*domain.IndexerDefinition
// get indexer definitions matching irc network from lookup table // get indexer definitions matching irc network from lookup table
if srv, idOk := s.lookupIRCServerDefinition[server]; idOk { if srv, idOk := s.lookupIRCServerDefinition[server]; idOk {
@ -483,7 +471,7 @@ func (s *service) GetTorznabIndexers() []domain.IndexerDefinition {
func (s *service) getDefinitionByName(name string) *domain.IndexerDefinition { func (s *service) getDefinitionByName(name string) *domain.IndexerDefinition {
if v, ok := s.indexerDefinitions[name]; ok { if v, ok := s.indexerDefinitions[name]; ok {
return &v return v
} }
return nil return nil
@ -494,7 +482,7 @@ func (s *service) getDefinitionForAnnounce(name string) *domain.IndexerDefinitio
// map[network:channel:announcer] = indexer01 // map[network:channel:announcer] = indexer01
if v, ok := s.indexerDefinitions[name]; ok { if v, ok := s.indexerDefinitions[name]; ok {
return &v return v
} }
return nil return nil

View file

@ -73,7 +73,7 @@ type Handler struct {
channelHealth map[string]*channelHealth channelHealth map[string]*channelHealth
} }
func NewHandler(network domain.IrcNetwork, definitions []domain.IndexerDefinition, releaseSvc release.Service) *Handler { func NewHandler(network domain.IrcNetwork, definitions []*domain.IndexerDefinition, releaseSvc release.Service) *Handler {
h := &Handler{ h := &Handler{
client: nil, client: nil,
network: &network, network: &network,
@ -91,7 +91,7 @@ func NewHandler(network domain.IrcNetwork, definitions []domain.IndexerDefinitio
return h return h
} }
func (h *Handler) InitIndexers(definitions []domain.IndexerDefinition) { func (h *Handler) InitIndexers(definitions []*domain.IndexerDefinition) {
// Networks can be shared by multiple indexers but channels are unique // Networks can be shared by multiple indexers but channels are unique
// so let's add a new AnnounceProcessor per channel // so let's add a new AnnounceProcessor per channel
for _, definition := range definitions { for _, definition := range definitions {
@ -99,7 +99,7 @@ func (h *Handler) InitIndexers(definitions []domain.IndexerDefinition) {
continue continue
} }
h.definitions[definition.Identifier] = &definition h.definitions[definition.Identifier] = definition
// indexers can use multiple channels, but it's not common, but let's handle that anyway. // indexers can use multiple channels, but it's not common, but let's handle that anyway.
for _, channel := range definition.IRC.Channels { for _, channel := range definition.IRC.Channels {

View file

@ -370,15 +370,18 @@ export function IndexerAddForm({ isOpen, toggle }: AddProps) {
})} })}
value={field?.value && field.value.value} value={field?.value && field.value.value}
onChange={(option: unknown) => { onChange={(option: unknown) => {
const opt = option as SelectValue;
resetForm(); resetForm();
const opt = option as SelectValue;
setFieldValue("name", opt.label ?? ""); setFieldValue("name", opt.label ?? "");
setFieldValue(field.name, opt.value ?? ""); setFieldValue(field.name, opt.value ?? "");
const ind = data && data.find(i => i.identifier === opt.value); const ind = data && data.find(i => i.identifier === opt.value);
if (ind) { if (ind) {
setIndexer(ind); setIndexer(ind);
if (ind.irc.settings) { setFieldValue("implementation", ind.implementation);
if (ind.irc && ind.irc.settings) {
ind.irc.settings.forEach((s) => { ind.irc.settings.forEach((s) => {
setFieldValue(`irc.${s.name}`, s.default ?? ""); setFieldValue(`irc.${s.name}`, s.default ?? "");
}); });