Skip to content

Commit

Permalink
feat: number rewriter
Browse files Browse the repository at this point in the history
  • Loading branch information
xxxsen committed Sep 7, 2024
1 parent c4af150 commit dee9a5c
Show file tree
Hide file tree
Showing 3 changed files with 169 additions and 2 deletions.
7 changes: 5 additions & 2 deletions number/number.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,18 +117,21 @@ func Parse(str string) (*Number, error) {
if strings.Contains(str, ".") {
return nil, fmt.Errorf("should not contain extname, str:%s", str)
}
number := strings.ToUpper(str)
rs := &Number{
numberId: "",
isChineseSubtitle: false,
isMultiCD: false,
multiCDIndex: 0,
isUncensorMovie: false,
}
//部分番号需要进行改写
number = rewriteNumber(number)
//提取后缀信息并对番号进行裁剪
number := resolveSuffixInfo(rs, str)
rs.numberId = strings.ToUpper(number)
number = resolveSuffixInfo(rs, number)
//通过番号直接填充信息(不进行裁剪)
resolveNumberInfo(rs, number)
rs.numberId = number
rs.cat = DetermineCategory(rs.numberId)
return rs, nil
}
83 changes: 83 additions & 0 deletions number/rewrite_number.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package number

import (
"regexp"
"strings"
"unicode"
)

var defaultRewriteList = []iNumberRewriter{
fc2NumberRewriter(),
numberAlphaNumberRewriter(),
}

type onNumberRewriteCheckFunc func(str string) bool
type onNumberRewriteFunc func(str string) string

type iNumberRewriter interface {
Check(str string) bool
Rewrite(str string) string
}

type numberRewriter struct {
onCheck onNumberRewriteCheckFunc
onRewrite onNumberRewriteFunc
}

func (c *numberRewriter) Check(str string) bool {
if c.onCheck == nil {
return true
}
return c.onCheck(str)
}

func (c *numberRewriter) Rewrite(str string) string {
if c.onRewrite == nil {
return str
}
return c.onRewrite(str)
}

func numberAlphaNumberRewriter() iNumberRewriter {
checker := regexp.MustCompile(`^\d+[a-zA-Z]+-\d+`)
//将324abc-234343之类的番号改写成abc-234343的形式(去掉前导数字)
return &numberRewriter{
onCheck: func(str string) bool {
return checker.MatchString(str)
},
onRewrite: func(str string) string {
for i, r := range str {
if !unicode.IsDigit(r) {
// 返回从第一个非数字字符开始的子字符串
return str[i:]
}
}
return str
},
}
}

func fc2NumberRewriter() iNumberRewriter {
return &numberRewriter{
onCheck: func(str string) bool {
return strings.HasPrefix(str, "FC2")
},
onRewrite: func(str string) string {
if !strings.Contains(str, "-PPV-") {
str = strings.ReplaceAll(str, "FC2-", "FC2-PPV-")
}
str = strings.ReplaceAll(str, "FC2PPV-", "FC2-PPV-")
return str
},
}
}

func rewriteNumber(str string) string {
for _, rewriter := range defaultRewriteList {
if !rewriter.Check(str) {
continue
}
str = rewriter.Rewrite(str)
}
return str
}
81 changes: 81 additions & 0 deletions number/rewrite_number_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package number

import (
"strings"
"testing"

"github.com/stretchr/testify/assert"
)

type testRewritePair struct {
in string
match bool
out string
}

func TestRewriteFc2(t *testing.T) {
tests := []testRewritePair{
{
in: "FC2-PPV-12345",
match: true,
out: "FC2-PPV-12345",
},
{
in: "aaa",
match: false,
out: "aaa",
},
{
in: "fc2-12345",
match: true,
out: "fc2-ppv-12345",
},
{
in: "fc2ppv-123",
match: true,
out: "fc2-ppv-123",
},
}
fc2Rewriter := fc2NumberRewriter()
for _, tst := range tests {
tst.in = strings.ToUpper(tst.in)
tst.out = strings.ToUpper(tst.out)
assert.Equal(t, tst.match, fc2Rewriter.Check(tst.in))
if !tst.match {
continue
}
out := fc2Rewriter.Rewrite(tst.in)
assert.Equal(t, tst.out, out)
}
}

func TestWriteNumberAlphaNumberFormat(t *testing.T) {
tests := []testRewritePair{
{
in: "123aaa-123434",
match: true,
out: "aaa-123434",
},
{
in: "aaa-1234",
match: false,
out: "aaa-1234",
},
{
in: "222aaa-22222_helloworld",
match: true,
out: "aaa-22222_helloworld",
},
}
rewriter := numberAlphaNumberRewriter()
for _, tst := range tests {
tst.in = strings.ToUpper(tst.in)
tst.out = strings.ToUpper(tst.out)
assert.Equal(t, tst.match, rewriter.Check(tst.in))
if !tst.match {
continue
}
out := rewriter.Rewrite(tst.in)
assert.Equal(t, tst.out, out)
}
}

0 comments on commit dee9a5c

Please sign in to comment.