mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 08:49:13 +00:00
feat(filters): add support for multiple external filters (#1030)
* feat(filters): add support for multiple ext filters * refactor(filters): crud and check * feat(filters): add postgres migrations * fix(filters): field array types * fix(filters): formatting * fix(filters): formatting * feat(filters): external webhook improve logs
This commit is contained in:
parent
db209319da
commit
dde0d0ed61
15 changed files with 1514 additions and 478 deletions
|
@ -78,12 +78,7 @@ func (s *service) Stats(ctx context.Context) (*domain.ReleaseStats, error) {
|
|||
}
|
||||
|
||||
func (s *service) Store(ctx context.Context, release *domain.Release) error {
|
||||
_, err := s.repo.Store(ctx, release)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
return s.repo.Store(ctx, release)
|
||||
}
|
||||
|
||||
func (s *service) StoreReleaseActionStatus(ctx context.Context, status *domain.ReleaseActionStatus) error {
|
||||
|
@ -127,6 +122,15 @@ func (s *service) Process(release *domain.Release) {
|
|||
return
|
||||
}
|
||||
|
||||
if err := s.processFilters(ctx, filters, release); err != nil {
|
||||
s.log.Error().Err(err).Msgf("release.Process: error processing filters for indexer: %s", release.Indexer)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (s *service) processFilters(ctx context.Context, filters []domain.Filter, release *domain.Release) error {
|
||||
// keep track of action clients to avoid sending the same thing all over again
|
||||
// save both client type and client id to potentially try another client of same type
|
||||
triedActionClients := map[actionClientTypeKey]struct{}{}
|
||||
|
@ -144,7 +148,7 @@ func (s *service) Process(release *domain.Release) {
|
|||
match, err := s.filterSvc.CheckFilter(ctx, f, release)
|
||||
if err != nil {
|
||||
l.Error().Err(err).Msg("release.Process: error checking filter")
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
if !match {
|
||||
|
@ -159,23 +163,37 @@ func (s *service) Process(release *domain.Release) {
|
|||
// save release here to only save those with rejections from actions instead of all releases
|
||||
if release.ID == 0 {
|
||||
release.FilterStatus = domain.ReleaseStatusFilterApproved
|
||||
|
||||
if err = s.Store(ctx, release); err != nil {
|
||||
l.Error().Err(err).Msgf("release.Process: error writing release to database: %+v", release)
|
||||
return
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// found matching filter, lets find the filter actions and attach
|
||||
actions, err := s.actionSvc.FindByFilterID(ctx, f.ID)
|
||||
if err != nil {
|
||||
s.log.Error().Err(err).Msgf("release.Process: error finding actions for filter: %s", f.Name)
|
||||
return err
|
||||
}
|
||||
|
||||
// if no actions, continue to next filter
|
||||
if len(actions) == 0 {
|
||||
s.log.Warn().Msgf("release.Process: no actions found for filter '%s', trying next one..", f.Name)
|
||||
return nil
|
||||
}
|
||||
|
||||
// sleep for the delay period specified in the filter before running actions
|
||||
delay := release.Filter.Delay
|
||||
if delay > 0 {
|
||||
l.Debug().Msgf("Delaying processing of '%s' (%s) for %s by %d seconds as specified in the filter", release.TorrentName, release.FilterName, release.Indexer, delay)
|
||||
l.Debug().Msgf("release.Process: delaying processing of '%s' (%s) for %s by %d seconds as specified in the filter", release.TorrentName, release.FilterName, release.Indexer, delay)
|
||||
time.Sleep(time.Duration(delay) * time.Second)
|
||||
}
|
||||
|
||||
var rejections []string
|
||||
|
||||
// run actions (watchFolder, test, exec, qBittorrent, Deluge, arr etc.)
|
||||
for _, a := range release.Filter.Actions {
|
||||
for _, a := range actions {
|
||||
act := a
|
||||
|
||||
// only run enabled actions
|
||||
|
@ -186,7 +204,7 @@ func (s *service) Process(release *domain.Release) {
|
|||
|
||||
l.Trace().Msgf("release.Process: indexer: %s, filter: %s release: %s , run action: %s", release.Indexer, release.FilterName, release.TorrentName, act.Name)
|
||||
|
||||
// keep track of actiom clients to avoid sending the same thing all over again
|
||||
// keep track of action clients to avoid sending the same thing all over again
|
||||
_, tried := triedActionClients[actionClientTypeKey{Type: act.Type, ClientID: act.ClientID}]
|
||||
if tried {
|
||||
l.Trace().Msgf("release.Process: indexer: %s, filter: %s release: %s action client already tried, skip", release.Indexer, release.FilterName, release.TorrentName)
|
||||
|
@ -227,11 +245,11 @@ func (s *service) Process(release *domain.Release) {
|
|||
break
|
||||
}
|
||||
|
||||
return
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *service) ProcessMultiple(releases []*domain.Release) {
|
||||
s.log.Debug().Msgf("process (%v) new releases from feed", len(releases))
|
||||
s.log.Debug().Msgf("process (%d) new releases from feed", len(releases))
|
||||
|
||||
for _, rls := range releases {
|
||||
rls := rls
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue