mirror of
https://github.com/idanoo/autobrr
synced 2025-07-22 16:29:12 +00:00

* feat(lists): integrate Omegabrr * feat(lists): add missing lists index * feat(lists): add db repo * feat(lists): add db migrations * feat(lists): labels * feat(lists): url lists and more arrs * fix(lists): db migrations client_id wrong type * fix(lists): db fields * feat(lists): create list form wip * feat(lists): show in list and create * feat(lists): update and delete * feat(lists): trigger via webhook * feat(lists): add webhook handler * fix(arr): encode json to pointer * feat(lists): rename endpoint to lists * feat(lists): fetch tags from arr * feat(lists): process plaintext lists * feat(lists): add background refresh job * run every 6th hour with a random start delay between 1-35 seconds * feat(lists): refresh on save and improve logging * feat(lists): cast arr client to pointer * feat(lists): improve error handling * feat(lists): reset shows field with match release * feat(lists): filter opts all lists * feat(lists): trigger on update if enabled * feat(lists): update option for lists * feat(lists): show connected filters in list * feat(lists): missing listSvc dep * feat(lists): cleanup * feat(lists): typo arr list * feat(lists): radarr include original * feat(lists): rename ExcludeAlternateTitle to IncludeAlternateTitle * fix(lists): arr client type conversion to pointer * fix(actions): only log panic recover if err not nil * feat(lists): show spinner on save * feat(lists): show icon in filters list * feat(lists): change icon color in filters list * feat(lists): delete relations on filter delete
103 lines
3.5 KiB
Go
103 lines
3.5 KiB
Go
package list
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// Regex patterns
|
|
// https://www.regular-expressions.info/unicode.html#category
|
|
// https://www.ncbi.nlm.nih.gov/staff/beck/charents/hex.html
|
|
var (
|
|
replaceRegexp = regexp.MustCompile(`[\p{P}\p{Z}\x{00C0}-\x{017E}\x{00AE}]`)
|
|
questionmarkRegexp = regexp.MustCompile(`[?]{2,}`)
|
|
regionCodeRegexp = regexp.MustCompile(`\(.+\)$`)
|
|
parenthesesEndRegexp = regexp.MustCompile(`\)$`)
|
|
)
|
|
|
|
func processTitle(title string, matchRelease bool) []string {
|
|
// Checking if the title is empty.
|
|
if strings.TrimSpace(title) == "" {
|
|
return nil
|
|
}
|
|
|
|
// cleans year like (2020) from arr title
|
|
//var re = regexp.MustCompile(`(?m)\s(\(\d+\))`)
|
|
//title = re.ReplaceAllString(title, "")
|
|
|
|
t := NewTitleSlice()
|
|
|
|
if replaceRegexp.ReplaceAllString(title, "") == "" {
|
|
t.Add(title, matchRelease)
|
|
} else {
|
|
// title with all non-alphanumeric characters replaced by "?"
|
|
apostropheTitle := parenthesesEndRegexp.ReplaceAllString(title, "?")
|
|
apostropheTitle = replaceRegexp.ReplaceAllString(apostropheTitle, "?")
|
|
apostropheTitle = questionmarkRegexp.ReplaceAllString(apostropheTitle, "*")
|
|
|
|
t.Add(apostropheTitle, matchRelease)
|
|
t.Add(strings.TrimRight(apostropheTitle, "?* "), matchRelease)
|
|
|
|
// title with apostrophes removed and all non-alphanumeric characters replaced by "?"
|
|
noApostropheTitle := parenthesesEndRegexp.ReplaceAllString(title, "?")
|
|
noApostropheTitle = strings.ReplaceAll(noApostropheTitle, "'", "")
|
|
noApostropheTitle = replaceRegexp.ReplaceAllString(noApostropheTitle, "?")
|
|
noApostropheTitle = questionmarkRegexp.ReplaceAllString(noApostropheTitle, "*")
|
|
|
|
t.Add(noApostropheTitle, matchRelease)
|
|
t.Add(strings.TrimRight(noApostropheTitle, "?* "), matchRelease)
|
|
|
|
// title with regions in parentheses removed and all non-alphanumeric characters replaced by "?"
|
|
removedRegionCodeApostrophe := regionCodeRegexp.ReplaceAllString(title, "")
|
|
removedRegionCodeApostrophe = strings.TrimRight(removedRegionCodeApostrophe, " ")
|
|
removedRegionCodeApostrophe = replaceRegexp.ReplaceAllString(removedRegionCodeApostrophe, "?")
|
|
removedRegionCodeApostrophe = questionmarkRegexp.ReplaceAllString(removedRegionCodeApostrophe, "*")
|
|
|
|
t.Add(removedRegionCodeApostrophe, matchRelease)
|
|
t.Add(strings.TrimRight(removedRegionCodeApostrophe, "?* "), matchRelease)
|
|
|
|
// title with regions in parentheses and apostrophes removed and all non-alphanumeric characters replaced by "?"
|
|
removedRegionCodeNoApostrophe := regionCodeRegexp.ReplaceAllString(title, "")
|
|
removedRegionCodeNoApostrophe = strings.TrimRight(removedRegionCodeNoApostrophe, " ")
|
|
removedRegionCodeNoApostrophe = strings.ReplaceAll(removedRegionCodeNoApostrophe, "'", "")
|
|
removedRegionCodeNoApostrophe = replaceRegexp.ReplaceAllString(removedRegionCodeNoApostrophe, "?")
|
|
removedRegionCodeNoApostrophe = questionmarkRegexp.ReplaceAllString(removedRegionCodeNoApostrophe, "*")
|
|
|
|
t.Add(removedRegionCodeNoApostrophe, matchRelease)
|
|
t.Add(strings.TrimRight(removedRegionCodeNoApostrophe, "?* "), matchRelease)
|
|
}
|
|
|
|
return t.Titles()
|
|
}
|
|
|
|
type Titles struct {
|
|
tm map[string]struct{}
|
|
}
|
|
|
|
func NewTitleSlice() *Titles {
|
|
ts := Titles{
|
|
tm: map[string]struct{}{},
|
|
}
|
|
return &ts
|
|
}
|
|
|
|
func (ts *Titles) Add(title string, matchRelease bool) {
|
|
if matchRelease {
|
|
title = strings.Trim(title, "?")
|
|
title = fmt.Sprintf("*%v*", title)
|
|
}
|
|
|
|
_, ok := ts.tm[title]
|
|
if !ok {
|
|
ts.tm[title] = struct{}{}
|
|
}
|
|
}
|
|
|
|
func (ts *Titles) Titles() []string {
|
|
titles := []string{}
|
|
for key := range ts.tm {
|
|
titles = append(titles, key)
|
|
}
|
|
return titles
|
|
}
|