diff --git a/go.mod b/go.mod index 39a32fb..7d44ab8 100644 --- a/go.mod +++ b/go.mod @@ -61,6 +61,7 @@ require ( github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/gdm85/go-rencode v0.1.8 // indirect + github.com/go-andiamo/splitter v1.2.5 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gorilla/securecookie v1.1.2 // indirect github.com/gosimple/unidecode v1.0.1 // indirect diff --git a/go.sum b/go.sum index e992e14..4df6841 100644 --- a/go.sum +++ b/go.sum @@ -157,6 +157,8 @@ github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a/go.mod github.com/glycerine/goconvey v0.0.0-20180728074245-46e3a41ad493/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/glycerine/goconvey v0.0.0-20190315024820-982ee783a72e/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-andiamo/splitter v1.2.5 h1:P3NovWMY2V14TJJSolXBvlOmGSZo3Uz+LtTl2bsV/eY= +github.com/go-andiamo/splitter v1.2.5/go.mod h1:8WHU24t9hcMKU5FXDQb1hysSEC/GPuivIp0uKY1J8gw= github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= diff --git a/internal/domain/filter.go b/internal/domain/filter.go index 387ae4f..b6eb7f0 100644 --- a/internal/domain/filter.go +++ b/internal/domain/filter.go @@ -15,6 +15,7 @@ import ( "github.com/autobrr/autobrr/pkg/wildcard" "github.com/dustin/go-humanize" + "github.com/go-andiamo/splitter" ) /* @@ -626,7 +627,22 @@ func matchRegex(tag string, filterList string) bool { if tag == "" { return false } - filters := strings.Split(filterList, ",") + + sp, err := splitter.NewSplitter(',', + splitter.DoubleQuotes, + splitter.Parenthesis, + splitter.CurlyBrackets, + splitter.SquareBrackets, + ) + + if err != nil { + return false + } + + filters, err := sp.Split(filterList) + if err != nil { + return false + } for _, filter := range filters { if filter == "" { diff --git a/internal/domain/filter_test.go b/internal/domain/filter_test.go index 64b4685..ee7e2e9 100644 --- a/internal/domain/filter_test.go +++ b/internal/domain/filter_test.go @@ -1295,6 +1295,27 @@ func TestFilter_CheckFilter(t *testing.T) { }, want: false, }, + { + name: "match_light_novel_1", + fields: &Release{ + TorrentName: "[Group] -Name of a Novel Something Good- [2012][Translated (Group)][EPUB]", + Title: "-Name of a Novel Something Good-", + Category: "Light Novel", + Year: 2012, + ReleaseTags: "Translated (Group) / EPUB", + Group: "Group", + }, + args: args{ + filter: Filter{ + MatchReleases: "(?:.*Something Good.*|.*Something Bad.*)", + UseRegex: true, + MatchReleaseGroups: "Group", + MatchCategories: "Light Novel", + MatchReleaseTags: "*EPUB*", + }, + }, + want: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -2107,6 +2128,10 @@ func Test_matchRegex(t *testing.T) { {name: "test_3", args: args{tag: "Some.show.S01.DV.2160p.ATVP.WEB-DL.DDPA5.1.x265-GROUP2", filter: ".*1080p.+(group1|group3),.*2160p.+"}, want: true}, {name: "test_4", args: args{tag: "Some.show.S01.DV.2160p.ATVP.WEB-DL.DDPA5.1.x265-GROUP2", filter: ".*1080p.+(group1|group3),.*720p.+"}, want: false}, {name: "test_5", args: args{tag: "Some.show.S01.DV.2160p.ATVP.WEB-DL.DDPA5.1.x265-GROUP2", filter: ".*1080p.+(group1|group3),.*720p.+,"}, want: false}, + {name: "test_6", args: args{tag: "[Group] -Name of a Novel Something Good- [2012][Translated (Group)][EPUB]", filter: "(?:.*Something Good.*|.*Something Bad.*)"}, want: true}, + {name: "test_7", args: args{tag: "[Group] -Name of a Novel Something Good- [2012][Translated (Group)][EPUB]", filter: "(?:.*Something Funny.*|.*Something Bad.*)"}, want: false}, + {name: "test_8", args: args{tag: ".s10E123.", filter:`\.[Ss]\d{1,2}[Ee]\d{1,3}\.`}, want: true}, + {name: "test_9", args: args{tag: "S1E1", filter:`\.[Ss]\d{1,2}[Ee]\d{1,3}\.`}, want: false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {