package services import ( "errors" "math/rand" "regexp" "strings" ) type RegexMapping struct { Pattern *regexp.Regexp Targets []string } var regexMap = []RegexMapping{ { // YouTube Pattern: regexp.MustCompile(`youtu(\.be|be\.com)|invidious|piped`), Targets: []string{"piped", "invidious"}, }, { // Twitter / X Pattern: regexp.MustCompile(`twitter\.com|x\.com|nitter`), Targets: []string{"nitter"}, }, { // Reddit Pattern: regexp.MustCompile(`reddit\.com|libreddit|redlib|teddit`), Targets: []string{"libreddit", "redlib", "teddit"}, }, { // Google Search Pattern: regexp.MustCompile(`google\.com|whoogle|searx|searxng`), Targets: []string{"whoogle", "searxng"}, }, { // Instagram Pattern: regexp.MustCompile(`instagram\.com|proxigram`), Targets: []string{"proxigram"}, }, { // Wikipedia Pattern: regexp.MustCompile(`wikipedia\.org|wikiless`), Targets: []string{"wikiless"}, }, { // Medium Pattern: regexp.MustCompile(`medium\.com|scribe`), Targets: []string{"scribe"}, }, { // Odysee Pattern: regexp.MustCompile(`odysee\.com|librarian`), Targets: []string{"librarian"}, }, { // Imgur Pattern: regexp.MustCompile(`imgur\.com|rimgo`), Targets: []string{"rimgo"}, }, { // Google Translate Pattern: regexp.MustCompile(`translate\.google\.com|lingva|simplytranslate`), Targets: []string{"lingva", "simplytranslate"}, }, { // TikTok Pattern: regexp.MustCompile(`tiktok\.com|proxitok`), Targets: []string{"proxitok"}, }, { // Fandom Pattern: regexp.MustCompile(`.*fandom\.com|breezewiki`), Targets: []string{"breezewiki"}, }, { // IMDB Pattern: regexp.MustCompile(`imdb\.com|libremdb`), Targets: []string{"libremdb"}, }, { // Quora Pattern: regexp.MustCompile(`quora\.com|quetre`), Targets: []string{"quetre"}, }, { // GitHub Pattern: regexp.MustCompile(`github\.com|gothub`), Targets: []string{"gothub"}, }, { // StackOverflow Pattern: regexp.MustCompile(`stackoverflow\.com|anonymousoverflow`), Targets: []string{"anonymousoverflow"}, }, { // Genius Pattern: regexp.MustCompile(`genius\.com|dumb`), Targets: []string{"dumb"}, }, { // 4get // Note: Could be used for redirecting other search engine // requests, but would need special handling Pattern: regexp.MustCompile("4get"), Targets: []string{"4get"}, }, { // LibreY // Note: Could be used for redirecting other search engine // requests, but would need special handling Pattern: regexp.MustCompile("librex|librey"), Targets: []string{"librey"}, }, { // Tent // Note: This is a Bandcamp alternative, but the endpoints are // completely different than Bandcamp, so 1-to-1 mapping of URLs // is not possible without some additional work Pattern: regexp.MustCompile("tent"), Targets: []string{"tent"}, }, } func MatchRequest(service string) (string, error) { for _, mapping := range regexMap { hasMatch := mapping.Pattern.MatchString(service) if !hasMatch { continue } if !strings.Contains(service, ".") { return service, nil } index := rand.Intn(len(mapping.Targets)) value := mapping.Targets[index] return value, nil } return "", errors.New("no match found") }