diff --git a/engine/torrent.go b/engine/torrent.go index c589240..6c48803 100644 --- a/engine/torrent.go +++ b/engine/torrent.go @@ -365,7 +365,7 @@ func searchWithTorznab(db db.Database, t SearchType, queries ...string) []torzna sort.SliceStable(res, func(i, j int) bool { //再按优先级排序,优先级高的种子排前面 var s1 = res[i] var s2 = res[j] - return s1.Priority > s2.Priority + return s1.Priority < s2.Priority }) //pt资源中,同一indexer内部,优先下载free的资源 diff --git a/ent/indexers/indexers.go b/ent/indexers/indexers.go index 8872ada..fdb4d3c 100644 --- a/ent/indexers/indexers.go +++ b/ent/indexers/indexers.go @@ -78,6 +78,8 @@ var ( DefaultEnableRss bool // DefaultPriority holds the default value on creation for the "priority" field. DefaultPriority int + // PriorityValidator is a validator for the "priority" field. It is called by the builders before save. + PriorityValidator func(int) error // DefaultSeedRatio holds the default value on creation for the "seed_ratio" field. DefaultSeedRatio float32 // DefaultDisabled holds the default value on creation for the "disabled" field. diff --git a/ent/indexers_create.go b/ent/indexers_create.go index 57a8d5a..4e800f7 100644 --- a/ent/indexers_create.go +++ b/ent/indexers_create.go @@ -273,6 +273,11 @@ func (ic *IndexersCreate) check() error { if _, ok := ic.mutation.Priority(); !ok { return &ValidationError{Name: "priority", err: errors.New(`ent: missing required field "Indexers.priority"`)} } + if v, ok := ic.mutation.Priority(); ok { + if err := indexers.PriorityValidator(v); err != nil { + return &ValidationError{Name: "priority", err: fmt.Errorf(`ent: validator failed for field "Indexers.priority": %w`, err)} + } + } return nil } diff --git a/ent/indexers_update.go b/ent/indexers_update.go index 4931b23..7ad8821 100644 --- a/ent/indexers_update.go +++ b/ent/indexers_update.go @@ -289,7 +289,20 @@ func (iu *IndexersUpdate) ExecX(ctx context.Context) { } } +// check runs all checks and user-defined validators on the builder. +func (iu *IndexersUpdate) check() error { + if v, ok := iu.mutation.Priority(); ok { + if err := indexers.PriorityValidator(v); err != nil { + return &ValidationError{Name: "priority", err: fmt.Errorf(`ent: validator failed for field "Indexers.priority": %w`, err)} + } + } + return nil +} + func (iu *IndexersUpdate) sqlSave(ctx context.Context) (n int, err error) { + if err := iu.check(); err != nil { + return n, err + } _spec := sqlgraph.NewUpdateSpec(indexers.Table, indexers.Columns, sqlgraph.NewFieldSpec(indexers.FieldID, field.TypeInt)) if ps := iu.mutation.predicates; len(ps) > 0 { _spec.Predicate = func(selector *sql.Selector) { @@ -662,7 +675,20 @@ func (iuo *IndexersUpdateOne) ExecX(ctx context.Context) { } } +// check runs all checks and user-defined validators on the builder. +func (iuo *IndexersUpdateOne) check() error { + if v, ok := iuo.mutation.Priority(); ok { + if err := indexers.PriorityValidator(v); err != nil { + return &ValidationError{Name: "priority", err: fmt.Errorf(`ent: validator failed for field "Indexers.priority": %w`, err)} + } + } + return nil +} + func (iuo *IndexersUpdateOne) sqlSave(ctx context.Context) (_node *Indexers, err error) { + if err := iuo.check(); err != nil { + return _node, err + } _spec := sqlgraph.NewUpdateSpec(indexers.Table, indexers.Columns, sqlgraph.NewFieldSpec(indexers.FieldID, field.TypeInt)) id, ok := iuo.mutation.ID() if !ok { diff --git a/ent/migrate/schema.go b/ent/migrate/schema.go index 6465426..ea5b560 100644 --- a/ent/migrate/schema.go +++ b/ent/migrate/schema.go @@ -120,7 +120,7 @@ var ( {Name: "implementation", Type: field.TypeString}, {Name: "settings", Type: field.TypeString, Nullable: true, Default: ""}, {Name: "enable_rss", Type: field.TypeBool, Default: true}, - {Name: "priority", Type: field.TypeInt, Default: 50}, + {Name: "priority", Type: field.TypeInt, Default: 25}, {Name: "seed_ratio", Type: field.TypeFloat32, Nullable: true, Default: 0}, {Name: "disabled", Type: field.TypeBool, Nullable: true, Default: false}, {Name: "tv_search", Type: field.TypeBool, Nullable: true, Default: true}, diff --git a/ent/runtime.go b/ent/runtime.go index 1140d05..d304f2f 100644 --- a/ent/runtime.go +++ b/ent/runtime.go @@ -95,6 +95,8 @@ func init() { indexersDescPriority := indexersFields[4].Descriptor() // indexers.DefaultPriority holds the default value on creation for the priority field. indexers.DefaultPriority = indexersDescPriority.Default.(int) + // indexers.PriorityValidator is a validator for the "priority" field. It is called by the builders before save. + indexers.PriorityValidator = indexersDescPriority.Validators[0].(func(int) error) // indexersDescSeedRatio is the schema descriptor for seed_ratio field. indexersDescSeedRatio := indexersFields[5].Descriptor() // indexers.DefaultSeedRatio holds the default value on creation for the seed_ratio field. diff --git a/ent/schema/indexers.go b/ent/schema/indexers.go index 9ff399e..a83c6b7 100644 --- a/ent/schema/indexers.go +++ b/ent/schema/indexers.go @@ -1,6 +1,7 @@ package schema import ( + "errors" "time" "entgo.io/ent" @@ -19,7 +20,15 @@ func (Indexers) Fields() []ent.Field { field.String("implementation"), field.String("settings").Optional().Default("").Comment("deprecated, use api_key and url"), field.Bool("enable_rss").Default(true), - field.Int("priority").Default(50), + field.Int("priority").Default(25).Validate(func(i int) error { + if i > 50 { + return errors.ErrUnsupported + } + if i <= 0 { + return errors.ErrUnsupported + } + return nil + }), field.Float32("seed_ratio").Optional().Default(0).Comment("minimal seed ratio requied, before removing torrent"), field.Bool("disabled").Optional().Default(false), field.Bool("tv_search").Optional().Default(true), diff --git a/go.mod b/go.mod index 59ad8e8..3b1349b 100644 --- a/go.mod +++ b/go.mod @@ -112,6 +112,7 @@ require ( go.opentelemetry.io/otel/trace v1.28.0 // indirect golang.org/x/sync v0.13.0 // indirect golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.32.0 // indirect google.golang.org/appengine v1.6.8 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 67fd1cd..5a0e2b2 100644 --- a/go.sum +++ b/go.sum @@ -278,6 +278,8 @@ github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible h1:jdpOPRN1zP63Td1hDQbZW73xKmzDvZHzVdNYxhnTMDA= github.com/jordan-wright/email v4.0.1-0.20210109023952-943e75fe5223+incompatible/go.mod h1:1c7szIrayyPPB/987hsnvNzLushdWf4o/79s3P08L8A= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -315,6 +317,8 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -349,6 +353,8 @@ github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/nikoksr/notify v1.0.0 h1:qe9/6FRsWdxBgQgWcpvQ0sv8LRGJZDpRB4TkL2uNdO8= github.com/nikoksr/notify v1.0.0/go.mod h1:hPaaDt30d6LAA7/5nb0e48Bp/MctDfycCSs8VEgN29I= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -453,6 +459,8 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= @@ -659,6 +667,10 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= +golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/prowlarr/prowlarr.go b/pkg/prowlarr/prowlarr.go index ba0edc3..91df179 100644 --- a/pkg/prowlarr/prowlarr.go +++ b/pkg/prowlarr/prowlarr.go @@ -66,7 +66,7 @@ func (c *Client) GetIndexers() ([]*ent.Indexers, error) { Disabled: !in.Enable, Name: in.Name, Implementation: "torznab", - Priority: 128 - int(in.Priority), + Priority: int(in.Priority), SeedRatio: float32(seedRatio), Settings: string(data), TvSearch: tvSearch, diff --git a/ui/lib/settings/indexer.dart b/ui/lib/settings/indexer.dart index ffa0948..730e334 100644 --- a/ui/lib/settings/indexer.dart +++ b/ui/lib/settings/indexer.dart @@ -178,7 +178,7 @@ class _IndexerState extends ConsumerState { name: "priority", decoration: const InputDecoration( labelText: "索引优先级", - helperText: "取值范围1-128, 数值越大,优先级越高", + helperText: "取值范围1-50, 数值越大,优先级越低", ), autovalidateMode: AutovalidateMode.onUserInteraction, validator: FormBuilderValidators.positiveNumber(),