|
package main |
|
|
|
import ( |
|
_ "embed" |
|
"encoding/json" |
|
"fmt" |
|
"os" |
|
"slices" |
|
"strings" |
|
"unicode" |
|
|
|
"github.com/daniwalter001/jackett_fiber/types" |
|
"golang.org/x/text/runes" |
|
"golang.org/x/text/transform" |
|
"golang.org/x/text/unicode/norm" |
|
) |
|
|
|
func PrettyPrint(i interface{}) string { |
|
enc := json.NewEncoder(os.Stdout) |
|
enc.SetEscapeHTML(false) |
|
s, err := json.MarshalIndent(i, "", "\t") |
|
if err != nil { |
|
return "" |
|
} |
|
return string(s) |
|
} |
|
|
|
func containEandS(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool { |
|
lower := strings.ToLower(name) |
|
return strings.Contains(lower, fmt.Sprintf("s%02se%02s ", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%02s.", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%02s-", s, e)) || |
|
|
|
strings.Contains(lower, fmt.Sprintf("s%se%02s ", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%se%02s.", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%se%02s-", s, e)) || |
|
|
|
strings.Contains(lower, fmt.Sprintf("s%sx%s", s, e)) || |
|
|
|
strings.Contains(lower, fmt.Sprintf("s%02s - e%02s ", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02s.e%02s ", s, e)) || |
|
|
|
strings.Contains(lower, fmt.Sprintf("s%02se%s ", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%s.", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%s-", s, e)) || |
|
|
|
strings.Contains(lower, fmt.Sprintf("season %s e%s", s, e)) || |
|
|
|
(abs && |
|
(strings.Contains(lower, fmt.Sprintf("s%02se%02s", abs_season, abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%03s", abs_season, abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%04s", abs_season, abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%02s", s, abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%03s", s, abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("season %s e%s", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%s-", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%02se%s-", s, e)) || |
|
false)) |
|
} |
|
|
|
func containE_S(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool { |
|
lower := strings.ToLower(name) |
|
return strings.Contains(lower, fmt.Sprintf("s%02s - %02s", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("s%s - %02s", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("season %s - %02s", s, e)) || |
|
strings.Contains(lower, fmt.Sprintf("season %s - %03s", s, e)) |
|
} |
|
|
|
func containsAbsoluteE(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool { |
|
lower := strings.ToLower(name) |
|
return strings.Contains(lower, fmt.Sprintf("%02s ", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("%03s ", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("0%s ", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("%04s ", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("e%02s ", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("e%03s ", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("e0%s ", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf("e%04s ", abs_episode)) |
|
} |
|
|
|
func containsAbsoluteE_(name string, s string, e string, abs bool, abs_season string, abs_episode string) bool { |
|
lower := strings.ToLower(name) |
|
return strings.Contains(lower, fmt.Sprintf(" %02s.", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf(" %03s.", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf(" 0%s.", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf(" %04s.", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf(" %02s-", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf(" %03s-", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf(" 0%s-", abs_episode)) || |
|
strings.Contains(lower, fmt.Sprintf(" %04s-", abs_episode)) |
|
} |
|
|
|
func isVideo(name string) bool { |
|
lower := strings.ToLower(name) |
|
|
|
return strings.Contains(lower, ".mp4") || |
|
strings.Contains(lower, ".mkv") || |
|
strings.Contains(lower, ".avi") || |
|
strings.Contains(lower, ".ts") || |
|
strings.Contains(lower, ".m3u") || |
|
strings.Contains(lower, ".m3u8") || |
|
strings.Contains(lower, ".flv") |
|
} |
|
|
|
func getQuality(name string) string { |
|
lower := strings.ToLower(name) |
|
|
|
if slices.ContainsFunc([]string{"2160", "4k", "uhd"}, func(e string) bool { |
|
return strings.Contains(lower, e) |
|
}) { |
|
return " 🌟4k" |
|
} |
|
|
|
if slices.ContainsFunc([]string{"1080", "fhd"}, func(e string) bool { |
|
return strings.Contains(lower, e) |
|
}) { |
|
return " 🎥FHD" |
|
} |
|
|
|
if slices.ContainsFunc([]string{"720", "hd"}, func(e string) bool { |
|
return strings.Contains(lower, e) |
|
}) { |
|
return " 📺HD" |
|
} |
|
|
|
if slices.ContainsFunc([]string{"480p", "380p", "sd"}, func(e string) bool { |
|
return strings.Contains(lower, e) |
|
}) { |
|
return " 📱SD" |
|
} |
|
|
|
return "" |
|
} |
|
|
|
func getSize(size int) string { |
|
gb := 1024 * 1024 * 1024 |
|
mb := 1024 * 1024 |
|
kb := 1024 |
|
|
|
size_ := "💾 " |
|
|
|
if size/gb >= 1 { |
|
size_ = size_ + fmt.Sprintf("%.2f GB", float64(size)/float64(gb)) |
|
} else if size/mb >= 1 { |
|
size_ = size_ + fmt.Sprintf("%.2f MB", float64(size)/float64(mb)) |
|
} else { |
|
size_ = size_ + fmt.Sprintf("%.2f KB", float64(size)/float64(kb)) |
|
} |
|
return size_ |
|
} |
|
|
|
func removeDuplicates(strList []types.ItemsParsed) []types.ItemsParsed { |
|
list := []types.ItemsParsed{} |
|
for _, item := range strList { |
|
if !(contains(list, item)) { |
|
list = append(list, item) |
|
} |
|
} |
|
return list |
|
} |
|
|
|
func contains(s []types.ItemsParsed, e types.ItemsParsed) bool { |
|
for _, a := range s { |
|
if a.Title == e.Title { |
|
return true |
|
} |
|
} |
|
return false |
|
} |
|
|
|
func filter[T any](slice []T, cb func(T) bool) (ret []T) { |
|
for _, v := range slice { |
|
if cb(v) { |
|
ret = append(ret, v) |
|
} |
|
} |
|
return ret |
|
} |
|
|
|
|
|
var servers string |
|
|
|
func getServers() []types.Server { |
|
|
|
serversArr := strings.Split(servers, "\n") |
|
var servers []types.Server |
|
|
|
for _, line := range serversArr { |
|
|
|
if len(line)!=0 { |
|
servers = append(servers, types.Server{ |
|
Host: strings.Split(line, "|")[0], |
|
ApiKey: strings.Split(line, "|")[1], |
|
}) |
|
} |
|
} |
|
|
|
return servers |
|
} |
|
|
|
func createIfNotExist(path string) bool { |
|
if _, err := os.Stat(path); err != nil { |
|
if os.IsNotExist(err) { |
|
errMkdir := os.MkdirAll(path, 0755) |
|
return errMkdir == nil |
|
} |
|
return false |
|
} |
|
fmt.Printf("%s already exists\n", path) |
|
return true |
|
} |
|
|
|
func removeAccents(s string) string { |
|
t := transform.Chain(norm.NFD, runes.Remove(runes.In(unicode.Mn)), norm.NFC) |
|
output, _, e := transform.String(t, s) |
|
if e != nil { |
|
panic(e) |
|
} |
|
return output |
|
} |
|
|