From 2a0b0fa9cda9d02c82db06bf3491ea9b575d1206 Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Wed, 6 Dec 2023 12:37:38 +0100 Subject: [PATCH] Add file size gte --- internal/config/types.go | 2 +- internal/config/v1.go | 30 +++++++++++++++++++++++++----- internal/config/v1types.go | 30 +++++++++++++++++------------- internal/torrent/manager.go | 10 ++++++++-- internal/torrent/types.go | 8 ++++++++ 5 files changed, 59 insertions(+), 21 deletions(-) diff --git a/internal/config/types.go b/internal/config/types.go index 6430358..a9b71cb 100644 --- a/internal/config/types.go +++ b/internal/config/types.go @@ -12,7 +12,7 @@ type ConfigInterface interface { GetHost() string GetPort() string GetDirectories() []string - MeetsConditions(directory, torrentName string, torrentIDs, fileNames []string) bool + MeetsConditions(directory, torrentName string, torrentSize int64, torrentIDs, fileNames []string, fileSizes []int64) bool GetOnLibraryUpdate() string GetNetworkBufferSize() int EnableRetainFolderNameExtension() bool diff --git a/internal/config/v1.go b/internal/config/v1.go index 4f81db7..e15a6a5 100644 --- a/internal/config/v1.go +++ b/internal/config/v1.go @@ -73,7 +73,7 @@ func (z *ZurgConfigV1) GetGroupMap() map[string][]string { return result } -func (z *ZurgConfigV1) MeetsConditions(directory, torrentName string, torrentIDs, fileNames []string) bool { +func (z *ZurgConfigV1) MeetsConditions(directory, torrentName string, torrentSize int64, torrentIDs, fileNames []string, fileSizes []int64) bool { if directory == ALL_TORRENTS { return true } @@ -81,14 +81,14 @@ func (z *ZurgConfigV1) MeetsConditions(directory, torrentName string, torrentIDs return false } for _, filter := range z.Directories[directory].Filters { - if z.matchFilter(torrentName, torrentIDs, fileNames, filter) { + if z.matchFilter(torrentName, torrentSize, torrentIDs, fileNames, fileSizes, filter) { return true } } return false } -func (z *ZurgConfigV1) matchFilter(torrentName string, torrentIDs, fileNames []string, filter *FilterConditionsV1) bool { +func (z *ZurgConfigV1) matchFilter(torrentName string, torrentSize int64, torrentIDs, fileNames []string, fileSizes []int64, filter *FilterConditionsV1) bool { if filter.ID != "" { for _, torrentID := range torrentIDs { if torrentID == filter.ID { @@ -128,10 +128,16 @@ func (z *ZurgConfigV1) matchFilter(torrentName string, torrentIDs, fileNames []s if filter.NotContains != "" && !strings.Contains(strings.ToLower(torrentName), strings.ToLower(filter.NotContains)) { return true } + if filter.SizeGreaterThanOrEqual > 0 && torrentSize >= filter.SizeGreaterThanOrEqual { + return true + } + if filter.SizeLessThanOrEqual > 0 && torrentSize <= filter.SizeLessThanOrEqual { + return true + } if len(filter.And) > 0 { andResult := true for _, andFilter := range filter.And { - andResult = andResult && z.matchFilter(torrentName, torrentIDs, fileNames, andFilter) + andResult = andResult && z.matchFilter(torrentName, torrentSize, torrentIDs, fileNames, fileSizes, andFilter) if !andResult { return false } @@ -140,7 +146,7 @@ func (z *ZurgConfigV1) matchFilter(torrentName string, torrentIDs, fileNames []s } if len(filter.Or) > 0 { for _, orFilter := range filter.Or { - if z.matchFilter(torrentName, torrentIDs, fileNames, orFilter) { + if z.matchFilter(torrentName, torrentSize, torrentIDs, fileNames, fileSizes, orFilter) { return true } } @@ -211,6 +217,20 @@ func (z *ZurgConfigV1) matchFilter(torrentName string, torrentIDs, fileNames []s } return checkArithmeticSequenceInFilenames(fileNames) } + if filter.FileInsideSizeGreaterThanOrEqual > 0 { + for _, fileSize := range fileSizes { + if fileSize >= filter.FileInsideSizeGreaterThanOrEqual { + return true + } + } + } + if filter.FileInsideSizeLessThanOrEqual > 0 { + for _, fileSize := range fileSizes { + if fileSize <= filter.FileInsideSizeLessThanOrEqual { + return true + } + } + } return false } diff --git a/internal/config/v1types.go b/internal/config/v1types.go index 4a373f1..5e57a18 100644 --- a/internal/config/v1types.go +++ b/internal/config/v1types.go @@ -14,23 +14,27 @@ type DirectoryFilterConditionsV1 struct { } type FilterConditionsV1 struct { - ID string `yaml:"id"` - RegexStr string `yaml:"regex"` - Contains string `yaml:"contains"` - ContainsStrict string `yaml:"contains_strict"` - NotRegexStr string `yaml:"not_regex"` - NotContains string `yaml:"not_contains"` - NotContainsStrict string `yaml:"not_contains_strict"` + ID string `yaml:"id"` + RegexStr string `yaml:"regex"` + Contains string `yaml:"contains"` + ContainsStrict string `yaml:"contains_strict"` + NotRegexStr string `yaml:"not_regex"` + NotContains string `yaml:"not_contains"` + NotContainsStrict string `yaml:"not_contains_strict"` + SizeGreaterThanOrEqual int64 `yaml:"size_gte"` + SizeLessThanOrEqual int64 `yaml:"size_lte"` And []*FilterConditionsV1 `yaml:"and"` Or []*FilterConditionsV1 `yaml:"or"` - FileInsideRegexStr string `yaml:"any_file_inside_regex"` - FileInsideContains string `yaml:"any_file_inside_contains"` - FileInsideContainsStrict string `yaml:"any_file_inside_contains_strict"` - FileInsideNotRegexStr string `yaml:"any_file_inside_not_regex"` - FileInsideNotContains string `yaml:"any_file_inside_not_contains"` - FileInsideNotContainsStrict string `yaml:"any_file_inside_not_contains_strict"` + FileInsideRegexStr string `yaml:"any_file_inside_regex"` + FileInsideContains string `yaml:"any_file_inside_contains"` + FileInsideContainsStrict string `yaml:"any_file_inside_contains_strict"` + FileInsideNotRegexStr string `yaml:"any_file_inside_not_regex"` + FileInsideNotContains string `yaml:"any_file_inside_not_contains"` + FileInsideNotContainsStrict string `yaml:"any_file_inside_not_contains_strict"` + FileInsideSizeGreaterThanOrEqual int64 `yaml:"any_file_inside_size_gte"` + FileInsideSizeLessThanOrEqual int64 `yaml:"any_file_inside_size_lte"` HasEpisodes bool `yaml:"has_episodes"` } diff --git a/internal/torrent/manager.go b/internal/torrent/manager.go index 9ab505f..6ee1185 100644 --- a/internal/torrent/manager.go +++ b/internal/torrent/manager.go @@ -3,6 +3,7 @@ package torrent import ( "io" "os" + "path/filepath" "strings" "github.com/debridmediamanager/zurg/internal/config" @@ -120,14 +121,19 @@ func (t *TorrentManager) TriggerHookOnLibraryUpdate(updatedPaths []string) { func (t *TorrentManager) assignedDirectoryCb(tor *Torrent, cb func(string)) { torrentIDs := strset.Union(tor.DownloadedIDs, tor.InProgressIDs).List() // get filenames needed for directory conditions - filenames := tor.SelectedFiles.Keys() + var filenames []string + var fileSizes []int64 + tor.SelectedFiles.IterCb(func(key string, file *File) { + filenames = append(filenames, filepath.Base(file.Path)) + fileSizes = append(fileSizes, file.Bytes) + }) // Map torrents to directories switch t.Config.GetVersion() { case "v1": configV1 := t.Config.(*config.ZurgConfigV1) for _, directories := range configV1.GetGroupMap() { for _, directory := range directories { - if t.Config.MeetsConditions(directory, tor.AccessKey, torrentIDs, filenames) { + if t.Config.MeetsConditions(directory, tor.AccessKey, tor.ComputeTotalSize(), torrentIDs, filenames, fileSizes) { cb(directory) break } diff --git a/internal/torrent/types.go b/internal/torrent/types.go index 1545229..0682471 100644 --- a/internal/torrent/types.go +++ b/internal/torrent/types.go @@ -104,6 +104,14 @@ func (t *Torrent) AllInProgress() bool { return t.DownloadedIDs.IsEmpty() } +func (t *Torrent) ComputeTotalSize() int64 { + totalSize := int64(0) + t.SelectedFiles.IterCb(func(key string, value *File) { + totalSize += value.Bytes + }) + return totalSize +} + type File struct { realdebrid.File Added string `json:"Added"`