mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 16:59:12 +00:00
feat(lists): integrate Omegabrr (#1885)
* 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
This commit is contained in:
parent
b68ae334ca
commit
221bc35371
77 changed files with 5025 additions and 254 deletions
103
internal/list/title.go
Normal file
103
internal/list/title.go
Normal file
|
@ -0,0 +1,103 @@
|
|||
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
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue