commit 4b71c945a93641e0e89bf0eddb1fe0eb654c3c42 Author: milarin Date: Fri Jan 13 10:21:45 2023 +0100 DeterminePriority implemented diff --git a/determine_priority.go b/determine_priority.go new file mode 100644 index 0000000..0c4008f --- /dev/null +++ b/determine_priority.go @@ -0,0 +1,28 @@ +package logic + +import "git.milar.in/nyaanime/model" + +func DeterminePriority(props model.PropertyHolder) (priority int, preferredProperties map[string]int) { + preferredProperties = map[string]int{} + + for _, lang := range props.GetLanguages() { + if langPriority, ok := PreferredLanguages[lang]; ok { + priority += langPriority + preferredProperties["lang/"+lang] = langPriority + } + } + + for _, sub := range props.GetSubtitles() { + if subPriority, ok := PreferredSubtitles[sub]; ok { + priority += subPriority + preferredProperties["sub/"+sub] = subPriority + } + } + + if prefRes, ok := PreferredResolutions[props.GetResolution()]; ok { + priority += prefRes + preferredProperties["res/"+props.GetResolution().String()] = prefRes + } + + return +} diff --git a/envvars.go b/envvars.go new file mode 100644 index 0000000..a7cf3cf --- /dev/null +++ b/envvars.go @@ -0,0 +1,13 @@ +package logic + +import ( + "git.milar.in/milarin/envvars/v2" + "git.milar.in/nyaanime/model" +) + +var ( + // preferred torrent properties + PreferredLanguages = ParsePreferredStringProps(envvars.StringSlice("PREFERRED_LANGUAGES", "|", []string{})) + PreferredSubtitles = ParsePreferredStringProps(envvars.StringSlice("PREFERRED_SUBTITLES", "|", []string{})) + PreferredResolutions = ParsePreferredProps(envvars.StringSlice("PREFERRED_RESOLUTIONS", "|", []string{}), model.ParseResolution) +) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..d70f5c0 --- /dev/null +++ b/go.mod @@ -0,0 +1,12 @@ +module git.milar.in/nyaanime/logic + +go 1.19 + +require ( + git.milar.in/milarin/envvars/v2 v2.0.0 + git.milar.in/milarin/gmath v0.0.3 + git.milar.in/milarin/slices v0.0.6 + git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea +) + +require git.milar.in/milarin/anilist v1.5.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..763cd13 --- /dev/null +++ b/go.sum @@ -0,0 +1,10 @@ +git.milar.in/milarin/anilist v1.5.0 h1:fSiAXY/topNk4ISEp2QtcG9HHKLJfMc8w05iqc+Paf0= +git.milar.in/milarin/anilist v1.5.0/go.mod h1:8PTHXFMA45JpfRFIpcdrKwDHue8fbT/wwV1BuHFn6c0= +git.milar.in/milarin/envvars/v2 v2.0.0 h1:DWRQCWaHqzDD8NGpSgv5tYLuF9A/dVFPAtTvz3oiIqE= +git.milar.in/milarin/envvars/v2 v2.0.0/go.mod h1:HkdEi+gG2lJSmVq547bTlQV4qQ0hO333bE8IrE0B9yY= +git.milar.in/milarin/gmath v0.0.3 h1:ii6rKNItS55O/wtIFhD1cTN2BMwDZjTBmiOocKURvxM= +git.milar.in/milarin/gmath v0.0.3/go.mod h1:HDLftG5RLpiNGKiIWh+O2G1PYkNzyLDADO8Cd/1abiE= +git.milar.in/milarin/slices v0.0.6 h1:AQoSarZ58WHYol9c6woWJSe8wFpPC2RC4cvIlZpfg9s= +git.milar.in/milarin/slices v0.0.6/go.mod h1:NOr53AOeur/qscu/FBj3lsFR262PNYBccLYSTCAXRk4= +git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea h1:iBwxI3vZ+Hix/5HHB3k9f9/R0nkwR0EvVJ3o5RJEKP4= +git.milar.in/nyaanime/model v0.0.0-20221008104642-466e1111ddea/go.mod h1:kPWLDvFrhc1Uf77gxsBOxNeJ5JTVF2HhVs1IdVcw0tg= diff --git a/preferred_props.go b/preferred_props.go new file mode 100644 index 0000000..53f17e9 --- /dev/null +++ b/preferred_props.go @@ -0,0 +1,53 @@ +package logic + +import ( + "strings" + + "git.milar.in/milarin/gmath" + "git.milar.in/milarin/slices" +) + +// ParsePreferredProps parses properties and its corresponding priority. +// priorities are distributed exponentially in reverse order. +// +// That means the last entry will have priority 1, the second last 2, then 4, 8 and so on. +// +// Properties with name "_" will be ignored and function as a placeholder to increase the priority +// of the properties which comes before them. +// +// Properties separated by comma will have the same priorities. +// +// str usually is the return value of a call to strings.Split(str, "|") +// +// Examples: +// str = "a|b|c" -> c:1 b:2 a:4 +// str = "a|b|_|c" -> c:1 b:4 a:8 +// str = "a,b|c" -> c:1 b:4 a:4 +// str = "d|_|a,b|c" -> c:1 b:4 a:4 d:16 +// +// Additionally, properties can be converted to a generic type with the converter function +func ParsePreferredProps[T comparable](str []string, converter func(string) (T, error)) map[T]int { + props := map[T]int{} + + for i, subProps := range slices.Reverse(str) { + if subProps == "_" { + continue + } + + propPriority := gmath.Pow(2, i) + for _, subProp := range strings.Split(subProps, ",") { + subPropT, err := converter(subProp) + if err != nil { + continue + } + + props[subPropT] = propPriority + } + } + + return props +} + +func ParsePreferredStringProps(str []string) map[string]int { + return ParsePreferredProps(str, func(s string) (string, error) { return s, nil }) +}