diff --git a/capture/capture.go b/capture/capture.go index 61ba937..a478ac3 100644 --- a/capture/capture.go +++ b/capture/capture.go @@ -61,10 +61,24 @@ func (c *Capture) resolveFileInfo(fc *model.FileContext, file string) error { fc.FileName = filepath.Base(file) fc.FileExt = filepath.Ext(file) fileNoExt := fc.FileName[:len(fc.FileName)-len(fc.FileExt)] + //番号改写 + fileNoExt, err := c.c.NumberRewriter.Rewrite(fileNoExt) + if err != nil { + return fmt.Errorf("rewrite number before parse failed, err:%w", err) + } + //番号解析 info, err := number.Parse(fileNoExt) if err != nil { return fmt.Errorf("parse number failed, err:%w", err) } + //规则测试 + //是否无码 + ok, _ := c.c.UncensorTester.Test(info.GetNumberID()) + info.SetExternalFieldUncensor(ok) + //尝试分类 + cat, _, _ := c.c.NumberCategorier.Match(info.GetNumberID()) + info.SetExternalFieldCategory(cat) + fc.Number = info fc.SaveFileBase = fc.Number.GenerateFileName() return nil diff --git a/capture/config.go b/capture/config.go index 37849d4..b29bcfa 100644 --- a/capture/config.go +++ b/capture/config.go @@ -1,6 +1,8 @@ package capture import ( + "fmt" + "yamdc/capture/ruleapi" "yamdc/processor" "yamdc/searcher" ) @@ -13,8 +15,8 @@ const ( NamingNumber = "NUMBER" ) -const ( - defaultNamingRule = NamingReleaseYear + "/" + NamingActor + "/" + NamingNumber +var ( + defaultNamingRule = fmt.Sprintf("{%s}/{%s}", NamingReleaseYear, NamingNumber) ) type config struct { @@ -24,6 +26,9 @@ type config struct { SaveDir string Naming string ExtraMediaExtList []string + UncensorTester ruleapi.ITester + NumberRewriter ruleapi.IRewriter + NumberCategorier ruleapi.IMatcher } type Option func(c *config) @@ -63,3 +68,21 @@ func WithExtraMediaExtList(lst []string) Option { c.ExtraMediaExtList = lst } } + +func WithUncensorTester(t ruleapi.ITester) Option { + return func(c *config) { + c.UncensorTester = t + } +} + +func WithNumberRewriter(t ruleapi.IRewriter) Option { + return func(c *config) { + c.NumberRewriter = t + } +} + +func WithNumberCategorier(t ruleapi.IMatcher) Option { + return func(c *config) { + c.NumberCategorier = t + } +} diff --git a/capture/ruleapi/matcher.go b/capture/ruleapi/matcher.go new file mode 100644 index 0000000..5029f76 --- /dev/null +++ b/capture/ruleapi/matcher.go @@ -0,0 +1,5 @@ +package ruleapi + +type IMatcher interface { + Match(res string) (string, bool, error) +} diff --git a/capture/ruleapi/regexp_matcher.go b/capture/ruleapi/regexp_matcher.go new file mode 100644 index 0000000..d31d78c --- /dev/null +++ b/capture/ruleapi/regexp_matcher.go @@ -0,0 +1,46 @@ +package ruleapi + +type RegexpMatchRule struct { + Regexp []string + Match string +} + +type regexpMatchItem struct { + reg ITester + match string +} + +type RegexpMatcher struct { + matchList []*regexpMatchItem +} + +func NewRegexpMatcher() *RegexpMatcher { + return &RegexpMatcher{} +} + +func (m *RegexpMatcher) AddRules(rules ...RegexpMatchRule) error { + for _, rule := range rules { + t := NewRegexpTester() + if err := t.AddRules(rule.Regexp...); err != nil { + return err + } + m.matchList = append(m.matchList, ®expMatchItem{ + reg: t, + match: rule.Match, + }) + } + return nil +} + +func (m *RegexpMatcher) Match(res string) (string, bool, error) { + for _, matcher := range m.matchList { + ok, err := matcher.reg.Test(res) + if err != nil { + return "", false, err + } + if ok { + return matcher.match, true, nil + } + } + return "", false, nil +} diff --git a/capture/ruleapi/regexp_rewriter.go b/capture/ruleapi/regexp_rewriter.go new file mode 100644 index 0000000..8b41ac5 --- /dev/null +++ b/capture/ruleapi/regexp_rewriter.go @@ -0,0 +1,43 @@ +package ruleapi + +import ( + "regexp" +) + +type RegexpRewriteRule struct { + Rule string + Rewrite string +} + +type regexpRewriteItem struct { + reg *regexp.Regexp + rewrite string +} + +type RegexpRewriter struct { + rewriteList []*regexpRewriteItem +} + +func NewRegexpRewriter() *RegexpRewriter { + return &RegexpRewriter{} +} + +func (r *RegexpRewriter) AddRules(rs ...RegexpRewriteRule) error { + for _, rule := range rs { + reg, err := regexp.Compile(rule.Rule) + if err != nil { + return err + } + r.rewriteList = append(r.rewriteList, ®expRewriteItem{ + reg: reg, + rewrite: rule.Rewrite, + }) + } + return nil +} +func (r *RegexpRewriter) Rewrite(res string) (string, error) { + for _, rewriter := range r.rewriteList { + res = rewriter.reg.ReplaceAllString(res, rewriter.rewrite) + } + return res, nil +} diff --git a/capture/ruleapi/regexp_tester.go b/capture/ruleapi/regexp_tester.go new file mode 100644 index 0000000..701d87f --- /dev/null +++ b/capture/ruleapi/regexp_tester.go @@ -0,0 +1,33 @@ +package ruleapi + +import ( + "regexp" +) + +type RegexpTester struct { + testList []*regexp.Regexp +} + +func NewRegexpTester() *RegexpTester { + return &RegexpTester{} +} + +func (t *RegexpTester) AddRules(rules ...string) error { + for _, rule := range rules { + reg, err := regexp.Compile(rule) + if err != nil { + return err + } + t.testList = append(t.testList, reg) + } + return nil +} + +func (t *RegexpTester) Test(res string) (bool, error) { + for _, tester := range t.testList { + if tester.MatchString(res) { + return true, nil + } + } + return false, nil +} diff --git a/capture/ruleapi/rewriter.go b/capture/ruleapi/rewriter.go new file mode 100644 index 0000000..750854d --- /dev/null +++ b/capture/ruleapi/rewriter.go @@ -0,0 +1,5 @@ +package ruleapi + +type IRewriter interface { + Rewrite(res string) (string, error) +} diff --git a/capture/ruleapi/tester.go b/capture/ruleapi/tester.go new file mode 100644 index 0000000..a68a836 --- /dev/null +++ b/capture/ruleapi/tester.go @@ -0,0 +1,5 @@ +package ruleapi + +type ITester interface { + Test(res string) (bool, error) +} diff --git a/config/config.go b/config/config.go index bb921fa..ec7f0b3 100644 --- a/config/config.go +++ b/config/config.go @@ -29,62 +29,50 @@ type NetworkConfig struct { Proxy string `json:"proxy"` } +type NumberRewriteRule struct { + Remark string `json:"remark"` + Rule string `json:"rule"` + Rewrite string `json:"rewrite"` +} + +type NumberCategoryRule struct { + Remark string `json:"remark"` + Rules []string `json:"rules"` + Category string `json:"category"` +} + +type NumberRule struct { + NumberUncensorRules []string `json:"number_uncensor_rules"` + NumberRewriteRules []NumberRewriteRule `json:"number_rewrite_rules"` + NumberCategoryRule []NumberCategoryRule `json:"number_category_rules"` +} + type Config struct { - ScanDir string `json:"scan_dir"` - SaveDir string `json:"save_dir"` - DataDir string `json:"data_dir"` - Naming string `json:"naming"` - PluginConfig map[string]interface{} `json:"plugin_config"` - HandlerConfig map[string]interface{} `json:"handler_config"` - Plugins []string `json:"plugins"` - CategoryPlugins []CategoryPlugin `json:"category_plugins"` - Handlers []string `json:"handlers"` - ExtraMediaExts []string `json:"extra_media_exts"` - LogConfig logger.LogConfig `json:"log_config"` - Dependencies []Dependency `json:"dependencies"` - NetworkConfig NetworkConfig `json:"network_config"` + ScanDir string `json:"scan_dir"` + SaveDir string `json:"save_dir"` + DataDir string `json:"data_dir"` + Naming string `json:"naming"` + PluginConfig map[string]interface{} `json:"plugin_config"` + HandlerConfig map[string]interface{} `json:"handler_config"` + Plugins []string `json:"plugins"` + CategoryPlugins []CategoryPlugin `json:"category_plugins"` + Handlers []string `json:"handlers"` + ExtraMediaExts []string `json:"extra_media_exts"` + LogConfig logger.LogConfig `json:"log_config"` + Dependencies []Dependency `json:"dependencies"` + NetworkConfig NetworkConfig `json:"network_config"` + NumberDefaultRule NumberRule `json:"number_default_rule"` //默认规则 + NumberUserRule NumberRule `json:"number_user_rule"` //用户自定义规则, 最终跟默认规则进行合并 } func defaultConfig() *Config { return &Config{ - Plugins: []string{ - "javbus", - "javhoo", - "airav", - "javdb", - "jav321", - "caribpr", - "18av", - "njav", - "missav", - "freejavbt", - "tktube", - "avsox", - }, - CategoryPlugins: []CategoryPlugin{ - //如果存在分配配置, 那么当番号被识别为特定分类的场景下, 将会使用分类插件直接查询 - {Name: "FC2", Plugins: []string{"fc2", "18av", "njav", "freejavbt", "tktube", "avsox", "fc2ppvdb"}}, - }, - Handlers: []string{ - "image_transcoder", - "poster_cropper", - "watermark_maker", - "actor_spliter", - "tag_padder", - "duration_fixer", - "number_title", - "translater", - }, - LogConfig: logger.LogConfig{ - Level: "info", - Console: true, - }, - Dependencies: []Dependency{ - {Link: "https://github.com/Kagami/go-face-testdata/raw/master/models/shape_predictor_5_face_landmarks.dat", RelPath: "models/shape_predictor_5_face_landmarks.dat"}, - {Link: "https://github.com/Kagami/go-face-testdata/raw/master/models/dlib_face_recognition_resnet_model_v1.dat", RelPath: "models/dlib_face_recognition_resnet_model_v1.dat"}, - {Link: "https://github.com/Kagami/go-face-testdata/raw/master/models/mmod_human_face_detector.dat", RelPath: "models/mmod_human_face_detector.dat"}, - {Link: "https://github.com/esimov/pigo/raw/master/cascade/facefinder", RelPath: "models/facefinder"}, - }, + Plugins: sysPlugins, + CategoryPlugins: sysCategoryPlugins, + Handlers: sysHandler, + LogConfig: sysLogConfig, + Dependencies: sysDependencies, + NumberDefaultRule: sysNumberRule, } } diff --git a/config/dependency_config.go b/config/dependency_config.go new file mode 100644 index 0000000..8a9c4a1 --- /dev/null +++ b/config/dependency_config.go @@ -0,0 +1,8 @@ +package config + +var sysDependencies = []Dependency{ + {Link: "https://github.com/Kagami/go-face-testdata/raw/master/models/shape_predictor_5_face_landmarks.dat", RelPath: "models/shape_predictor_5_face_landmarks.dat"}, + {Link: "https://github.com/Kagami/go-face-testdata/raw/master/models/dlib_face_recognition_resnet_model_v1.dat", RelPath: "models/dlib_face_recognition_resnet_model_v1.dat"}, + {Link: "https://github.com/Kagami/go-face-testdata/raw/master/models/mmod_human_face_detector.dat", RelPath: "models/mmod_human_face_detector.dat"}, + {Link: "https://github.com/esimov/pigo/raw/master/cascade/facefinder", RelPath: "models/facefinder"}, +} diff --git a/config/handler_config.go b/config/handler_config.go new file mode 100644 index 0000000..62631be --- /dev/null +++ b/config/handler_config.go @@ -0,0 +1,12 @@ +package config + +var sysHandler = []string{ + "image_transcoder", + "poster_cropper", + "watermark_maker", + "actor_spliter", + "tag_padder", + "duration_fixer", + "number_title", + "translater", +} diff --git a/config/log_config.go b/config/log_config.go new file mode 100644 index 0000000..136416b --- /dev/null +++ b/config/log_config.go @@ -0,0 +1,8 @@ +package config + +import "github.com/xxxsen/common/logger" + +var sysLogConfig = logger.LogConfig{ + Level: "info", + Console: true, +} diff --git a/config/plugin_config.go b/config/plugin_config.go new file mode 100644 index 0000000..13715f5 --- /dev/null +++ b/config/plugin_config.go @@ -0,0 +1,21 @@ +package config + +var sysPlugins = []string{ + "javbus", + "javhoo", + "airav", + "javdb", + "jav321", + "caribpr", + "18av", + "njav", + "missav", + "freejavbt", + "tktube", + "avsox", +} + +var sysCategoryPlugins = []CategoryPlugin{ + //如果存在分配配置, 那么当番号被识别为特定分类的场景下, 将会使用分类插件直接查询 + {Name: "FC2", Plugins: []string{"fc2", "18av", "njav", "freejavbt", "tktube", "avsox", "fc2ppvdb"}}, +} diff --git a/config/sys_number_rule_config.go b/config/sys_number_rule_config.go new file mode 100644 index 0000000..c31a30e --- /dev/null +++ b/config/sys_number_rule_config.go @@ -0,0 +1,56 @@ +package config + +var sysUncensorRule = []string{ + `(?i)^\d+[-|_]\d+$`, + `(?i)^N\d+$`, + `(?i)^K\d+$`, + `(?i)^KB\d+$`, + `(?i)^C\d+-KI\d+$`, + `(?i)^1PON.*$`, + `(?i)^CARIB.*$`, + `(?i)^SM3D2DBD.*$`, + `(?i)^SMDV.*$`, + `(?i)^SKY.*$`, + `(?i)^HEY.*$`, + `(?i)^FC2.*$`, + `(?i)^MKD.*$`, + `(?i)^MKBD.*$`, + `(?i)^H4610.*$`, + `(?i)^H0930.*$`, + `(?i)^MD[-|_].*$`, + `(?i)^SMD[-|_].*$`, + `(?i)^SSDV[-|_].*$`, + `(?i)^CCDV[-|_].*$`, + `(?i)^LLDV[-|_].*$`, + `(?i)^DRC[-|_].*$`, + `(?i)^MXX[-|_].*$`, + `(?i)^DSAM[-|_].*$`, +} + +var sysRewriteRule = []NumberRewriteRule{ //rewrite 逻辑在number.Parse之前, 所以数据可能存在小写的情况, 需要特殊处理 + { + Remark: "format fc2", + Rule: `(?i)^fc2[-|_]?(ppv)?[-|_](\d+)$`, + Rewrite: `FC2-PPV-$2`, + }, + { + Remark: "format number like '234abc-123' to 'abc-123'", + Rule: `^\d+([a-zA-Z]+[-|_]\d+)$`, + Rewrite: `$1`, + }, +} + +var sysCategoryRule = []NumberCategoryRule{ + { + Rules: []string{ + "^FC2.*$", + }, + Category: "FC2", + }, +} + +var sysNumberRule = NumberRule{ + NumberUncensorRules: sysUncensorRule, + NumberRewriteRules: sysRewriteRule, + NumberCategoryRule: sysCategoryRule, +} diff --git a/config/sys_number_rule_config_test.go b/config/sys_number_rule_config_test.go new file mode 100644 index 0000000..78feb98 --- /dev/null +++ b/config/sys_number_rule_config_test.go @@ -0,0 +1,137 @@ +package config + +import ( + "testing" + "yamdc/capture/ruleapi" + + "github.com/stretchr/testify/assert" +) + +type testRewritePair struct { + in string + out string +} + +func TestNumberUncensorRule(t *testing.T) { + tester := ruleapi.NewRegexpTester() + err := tester.AddRules(sysNumberRule.NumberUncensorRules...) + assert.NoError(t, err) + trueList := []string{ + "112214_292", + "112114-291", + "n11451", + "heyzo_1545", + "hey-1111", + "carib-11111-222", + "22222-333", + "010111-222", + "H4610-Ki1111", + "MKD-12345", + "fc2-ppv-12345", + "1pon-123", + "smd-1234", + "kb2134", + "c0930-ki240528", + } + falseList := []string{ + "YMDS-164", + "MBRBI-002", + "LUKE-036", + "SMDY-123", + } + for _, item := range trueList { + ok, _ := tester.Test(item) + assert.True(t, ok) + } + for _, item := range falseList { + ok, _ := tester.Test(item) + assert.False(t, ok) + } +} + +func TestFc2Rewrit(t *testing.T) { + tests := []testRewritePair{ + { + in: "FC2-PPV-12345", + out: "FC2-PPV-12345", + }, + { + in: "fc2-ppv-12345", + out: "FC2-PPV-12345", + }, + { + in: "fc2", + out: "fc2", + }, + { + in: "aaa", + out: "aaa", + }, + { + in: "fc2-12345", + out: "FC2-PPV-12345", + }, + { + in: "fc2ppv-123", + out: "FC2-PPV-123", + }, + { + in: "fc2_ppv_1234", + out: "FC2-PPV-1234", + }, + { + in: "fc2ppv_1234", + out: "FC2-PPV-1234", + }, + } + + rewriter := ruleapi.NewRegexpRewriter() + for _, item := range sysNumberRule.NumberRewriteRules { + err := rewriter.AddRules(ruleapi.RegexpRewriteRule{ + Rule: item.Rule, + Rewrite: item.Rewrite, + }) + assert.NoError(t, err) + } + + for _, tst := range tests { + out, err := rewriter.Rewrite(tst.in) + assert.NoError(t, err) + assert.Equal(t, tst.out, out) + } + +} + +func TestNumberAlphaNumberRewrite(t *testing.T) { + tests := []testRewritePair{ + { + in: "123aaa-123434", + out: "aaa-123434", + }, + { + in: "aaa-1234", + out: "aaa-1234", + }, + { + in: "222aaa-22222_helloworld", + out: "222aaa-22222_helloworld", + }, + { + in: "123abc_1234", + out: "abc_1234", + }, + } + rewriter := ruleapi.NewRegexpRewriter() + for _, item := range sysNumberRule.NumberRewriteRules { + err := rewriter.AddRules(ruleapi.RegexpRewriteRule{ + Rule: item.Rule, + Rewrite: item.Rewrite, + }) + assert.NoError(t, err) + } + for _, tst := range tests { + out, err := rewriter.Rewrite(tst.in) + assert.NoError(t, err) + assert.Equal(t, tst.out, out) + } +} diff --git a/main.go b/main.go index 4cdcec4..19eac38 100644 --- a/main.go +++ b/main.go @@ -9,6 +9,7 @@ import ( "strings" "time" "yamdc/capture" + "yamdc/capture/ruleapi" "yamdc/client" "yamdc/config" "yamdc/dependency" @@ -17,7 +18,6 @@ import ( "yamdc/face/goface" "yamdc/face/pigo" "yamdc/ffmpeg" - "yamdc/number" "yamdc/processor" "yamdc/processor/handler" "yamdc/searcher" @@ -49,7 +49,7 @@ func main() { logkit.Fatal("setup http client failed", zap.Error(err)) } logkit.Info("check dependencies...") - if err := ensureDependencies(c.DataDir, c.Dependencies); err != nil { + if err := initDependencies(c.DataDir, c.Dependencies); err != nil { logkit.Fatal("ensure dependencies failed", zap.Error(err)) } logkit.Info("check dependencies finish...") @@ -63,7 +63,7 @@ func main() { if err := setupTranslator(c); err != nil { logkit.Error("setup translator failed", zap.Error(err)) //非关键路径 } - if err := initFace(filepath.Join(c.DataDir, "models")); err != nil { + if err := setupFace(filepath.Join(c.DataDir, "models")); err != nil { logkit.Error("init face recognizer failed", zap.Error(err)) } logkit.Info("support plugins", zap.Strings("plugins", factory.Plugins())) @@ -107,7 +107,20 @@ func main() { logkit.Info("run capture kit finish, all file scrape succ") } -func buildCapture(c *config.Config, ss []searcher.ISearcher, catSs map[number.Category][]searcher.ISearcher, ps []processor.IProcessor) (*capture.Capture, error) { +func buildCapture(c *config.Config, ss []searcher.ISearcher, catSs map[string][]searcher.ISearcher, ps []processor.IProcessor) (*capture.Capture, error) { + numberUncensorRule, err := buildNumberUncensorRule(c) + if err != nil { + return nil, err + } + numberCategoryRule, err := buildNumberCategoryRule(c) + if err != nil { + return nil, err + } + numberRewriteRule, err := buildNumberRewriteRule(c) + if err != nil { + return nil, err + } + opts := make([]capture.Option, 0, 10) opts = append(opts, capture.WithNamingRule(c.Naming), @@ -116,18 +129,21 @@ func buildCapture(c *config.Config, ss []searcher.ISearcher, catSs map[number.Ca capture.WithSeacher(searcher.NewCategorySearcher(ss, catSs)), capture.WithProcessor(processor.NewGroup(ps)), capture.WithExtraMediaExtList(c.ExtraMediaExts), + capture.WithUncensorTester(numberUncensorRule), + capture.WithNumberCategorier(numberCategoryRule), + capture.WithNumberRewriter(numberRewriteRule), ) return capture.New(opts...) } -func buildCatSearcher(cplgs []config.CategoryPlugin, m map[string]interface{}) (map[number.Category][]searcher.ISearcher, error) { - rs := make(map[number.Category][]searcher.ISearcher, len(cplgs)) +func buildCatSearcher(cplgs []config.CategoryPlugin, m map[string]interface{}) (map[string][]searcher.ISearcher, error) { + rs := make(map[string][]searcher.ISearcher, len(cplgs)) for _, plg := range cplgs { ss, err := buildSearcher(plg.Plugins, m) if err != nil { return nil, err } - rs[number.Category(strings.ToUpper(plg.Name))] = ss + rs[strings.ToUpper(plg.Name)] = ss } return rs, nil } @@ -184,7 +200,7 @@ func precheckDir(c *config.Config) error { return nil } -func ensureDependencies(datadir string, cdeps []config.Dependency) error { +func initDependencies(datadir string, cdeps []config.Dependency) error { deps := make([]*dependency.Dependency, 0, len(cdeps)) for _, item := range cdeps { deps = append(deps, &dependency.Dependency{ @@ -195,7 +211,7 @@ func ensureDependencies(datadir string, cdeps []config.Dependency) error { return dependency.Resolve(client.DefaultClient(), deps) } -func initFace(models string) error { +func setupFace(models string) error { impls := make([]face.IFaceRec, 0, 2) var faceRecCreator = make([]func() (face.IFaceRec, error), 0, 2) if envflag.IsEnableGoFaceRecognizer() { @@ -248,3 +264,40 @@ func setupTranslator(c *config.Config) error { translator.SetTranslator(t) return nil } + +func buildNumberUncensorRule(c *config.Config) (ruleapi.ITester, error) { + t := ruleapi.NewRegexpTester() + //合并用户/默认规则 + c.NumberUserRule.NumberUncensorRules = append(c.NumberUserRule.NumberUncensorRules, + c.NumberDefaultRule.NumberUncensorRules...) + if err := t.AddRules(c.NumberUserRule.NumberUncensorRules...); err != nil { + return nil, err + } + return t, nil +} + +func buildNumberCategoryRule(c *config.Config) (ruleapi.IMatcher, error) { + t := ruleapi.NewRegexpMatcher() + c.NumberUserRule.NumberCategoryRule = append(c.NumberUserRule.NumberCategoryRule, c.NumberDefaultRule.NumberCategoryRule...) + for _, item := range c.NumberUserRule.NumberCategoryRule { + if err := t.AddRules(ruleapi.RegexpMatchRule{ + Regexp: item.Rules, + Match: item.Category, + }); err != nil { + return nil, err + } + } + return t, nil +} + +func buildNumberRewriteRule(c *config.Config) (ruleapi.IRewriter, error) { + t := ruleapi.NewRegexpRewriter() + c.NumberUserRule.NumberRewriteRules = append(c.NumberUserRule.NumberRewriteRules, c.NumberDefaultRule.NumberRewriteRules...) + for _, item := range c.NumberUserRule.NumberRewriteRules { + t.AddRules(ruleapi.RegexpRewriteRule{ + Rule: item.Rule, + Rewrite: item.Rewrite, + }) + } + return t, nil +} diff --git a/model/model.go b/model/model.go index a3b3377..c471333 100644 --- a/model/model.go +++ b/model/model.go @@ -2,7 +2,7 @@ package model import "yamdc/number" -type AvMeta struct { +type MovieMeta struct { Number string `json:"number"` //番号 Title string `json:"title"` //标题 Plot string `json:"plot"` //简介 @@ -51,6 +51,6 @@ type FileContext struct { FileExt string SaveFileBase string SaveDir string - Meta *AvMeta + Meta *MovieMeta Number *number.Number } diff --git a/number/check.go b/number/check.go deleted file mode 100644 index 6948890..0000000 --- a/number/check.go +++ /dev/null @@ -1,52 +0,0 @@ -package number - -import ( - "regexp" - "strings" -) - -var defaultUncensorPrefix = []string{ - "1PON", - "CARIB", - "SM3D2DBD", - "SMDV", - "SKY", - "HEY", - "FC2", - "MKD", - "MKBD", - "H4610", - "H0930", - "MD-", - "SMD-", - "SSDV-", - "CCDV-", - "LLDV-", - "DRC-", - "MXX-", - "DSAM-", -} - -var defaultUncensorRegexp = []*regexp.Regexp{ - regexp.MustCompile(`^\d+[-|_]\d+$`), - regexp.MustCompile(`^N\d+$`), - regexp.MustCompile(`^K\d+$`), - regexp.MustCompile(`^KB\d+$`), - regexp.MustCompile(`^C\d+-KI\d+$`), -} - -func IsUncensorMovie(str string) bool { - str = strings.ToUpper(str) - str = strings.ReplaceAll(str, "_", "-") - for _, prefix := range defaultUncensorPrefix { - if strings.HasPrefix(str, prefix) { - return true - } - } - for _, regexpr := range defaultUncensorRegexp { - if regexpr.MatchString(str) { - return true - } - } - return false -} diff --git a/number/check_test.go b/number/check_test.go deleted file mode 100644 index 044ed1e..0000000 --- a/number/check_test.go +++ /dev/null @@ -1,39 +0,0 @@ -package number - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestCheck(t *testing.T) { - trueList := []string{ - "112214_292", - "112114-291", - "n11451", - "heyzo_1545", - "hey-1111", - "carib-11111-222", - "22222-333", - "010111-222", - "H4610-Ki1111", - "MKD-12345", - "fc2-ppv-12345", - "1pon-123", - "smd-1234", - "kb2134", - "c0930-ki240528", - } - falseList := []string{ - "YMDS-164", - "MBRBI-002", - "LUKE-036", - "SMDY-123", - } - for _, item := range trueList { - assert.True(t, IsUncensorMovie(item)) - } - for _, item := range falseList { - assert.False(t, IsUncensorMovie(item)) - } -} diff --git a/number/model.go b/number/model.go index 8dad6aa..8da78a8 100644 --- a/number/model.go +++ b/number/model.go @@ -4,19 +4,35 @@ import ( "strconv" ) +type externalField struct { + isUncensor bool + cat string +} + type Number struct { numberId string isChineseSubtitle bool isMultiCD bool multiCDIndex int - isUncensorMovie bool is4k bool isLeak bool - cat Category + extField externalField +} + +func (n *Number) SetExternalFieldUncensor(v bool) { + n.extField.isUncensor = v +} + +func (n *Number) GetExternalFieldUncensor() bool { + return n.extField.isUncensor +} + +func (n *Number) SetExternalFieldCategory(cat string) { + n.extField.cat = cat } -func (n *Number) GetCategory() Category { - return n.cat +func (n *Number) GetExternalFieldCategory() string { + return n.extField.cat } func (n *Number) GetNumberID() string { @@ -35,10 +51,6 @@ func (n *Number) GetMultiCDIndex() int { return n.multiCDIndex } -func (n *Number) GetIsUncensorMovie() bool { - return n.isUncensorMovie -} - func (n *Number) GetIs4K() bool { return n.is4k } @@ -65,7 +77,7 @@ func (n *Number) GenerateSuffix(base string) string { func (n *Number) GenerateTags() []string { rs := make([]string, 0, 5) - if n.GetIsUncensorMovie() { + if n.GetExternalFieldUncensor() { rs = append(rs, defaultTagUncensored) } if n.GetIsChineseSubtitle() { diff --git a/number/number.go b/number/number.go index b5b0556..ec649d1 100644 --- a/number/number.go +++ b/number/number.go @@ -8,7 +8,6 @@ import ( ) type suffixInfoResolveFunc func(info *Number, normalizedSuffix string) bool -type numberInfoResolveFunc func(info *Number, number string) var defaultSuffixResolverList = []suffixInfoResolveFunc{ resolveIsChineseSubTitle, @@ -17,10 +16,6 @@ var defaultSuffixResolverList = []suffixInfoResolveFunc{ resolveLeak, } -var defaultNumberInfoResolverList = []numberInfoResolveFunc{ - resolveIsUncensorMovie, -} - func extractSuffix(str string) (string, bool) { for i := len(str) - 1; i >= 0; i-- { if str[i] == '_' || str[i] == '-' { @@ -91,18 +86,6 @@ func resolveIsChineseSubTitle(info *Number, str string) bool { return true } -func resolveNumberInfo(info *Number, number string) { - for _, resolver := range defaultNumberInfoResolverList { - resolver(info, number) - } -} - -func resolveIsUncensorMovie(info *Number, str string) { - if IsUncensorMovie(str) { - info.isUncensorMovie = true - } -} - func ParseWithFileName(f string) (*Number, error) { filename := filepath.Base(f) fileext := filepath.Ext(f) @@ -117,22 +100,18 @@ 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) + number := strings.ToUpper(str) //默认所有的番号都是大写的 rs := &Number{ numberId: "", isChineseSubtitle: false, isMultiCD: false, multiCDIndex: 0, - isUncensorMovie: false, } - //部分番号需要进行改写 - number = rewriteNumber(number) + //部分番号需要进行改写, 改写逻辑提到外面去, number只做解析用 + //提取后缀信息并对番号进行裁剪 number = resolveSuffixInfo(rs, number) - //通过番号直接填充信息(不进行裁剪) - resolveNumberInfo(rs, number) rs.numberId = number - rs.cat = DetermineCategory(rs.numberId) return rs, nil } diff --git a/number/number_test.go b/number/number_test.go index 3f71c47..330f2b3 100644 --- a/number/number_test.go +++ b/number/number_test.go @@ -9,52 +9,44 @@ import ( func TestNumber(t *testing.T) { checkList := map[string]*Number{ "HEYZO-3332.mp4": { - numberId: "HEYZO-3332", - isUncensorMovie: true, + numberId: "HEYZO-3332", }, "052624_01.mp4": { - numberId: "052624_01", - isUncensorMovie: true, + numberId: "052624_01", }, "052624_01-C.mp4": { numberId: "052624_01", isChineseSubtitle: true, - isUncensorMovie: true, }, "052624_01-CD2.mp4": { - numberId: "052624_01", - isUncensorMovie: true, - isMultiCD: true, - multiCDIndex: 2, + numberId: "052624_01", + isMultiCD: true, + multiCDIndex: 2, }, "052624_01-CD3-C.mp4": { numberId: "052624_01", - isUncensorMovie: true, isMultiCD: true, multiCDIndex: 3, isChineseSubtitle: true, }, "052624_01_cd3_c.mp4": { numberId: "052624_01", - isUncensorMovie: true, isMultiCD: true, multiCDIndex: 3, isChineseSubtitle: true, }, "k0009-c_cd1-4k.mp4": { numberId: "K0009", - isUncensorMovie: true, isMultiCD: true, multiCDIndex: 1, isChineseSubtitle: true, is4k: true, }, "n001-Cd1-4k.mp4": { - numberId: "N001", - isUncensorMovie: true, - isMultiCD: true, - multiCDIndex: 1, - is4k: true, + numberId: "N001", + isMultiCD: true, + multiCDIndex: 1, + is4k: true, }, "c-4k.mp4": { numberId: "C", @@ -79,25 +71,20 @@ func TestNumber(t *testing.T) { assert.Equal(t, info.GetIsChineseSubtitle(), rs.GetIsChineseSubtitle()) assert.Equal(t, info.GetIsMultiCD(), rs.GetIsMultiCD()) assert.Equal(t, info.GetMultiCDIndex(), rs.GetMultiCDIndex()) - assert.Equal(t, info.GetIsUncensorMovie(), rs.GetIsUncensorMovie()) + //assert.Equal(t, info.GetExternalFieldUncensor(), rs.GetExternalFieldUncensor()) assert.Equal(t, info.GetIs4K(), rs.GetIs4K()) } } -func TestCategory(t *testing.T) { - { - n, err := Parse("fc2-ppv-12345") - assert.NoError(t, err) - assert.Equal(t, 1, len(n.GetCategory())) - assert.Equal(t, CatFC2, n.GetCategory()[0]) - } - { - n, err := Parse("abc-0001") - assert.NoError(t, err) - assert.Equal(t, 0, len(n.GetCategory())) - } -} - func TestAlnumber(t *testing.T) { assert.Equal(t, "fc2ppv12345", GetCleanID("fc2-ppv_12345")) } + +func TestSetFiledByExternal(t *testing.T) { + n, err := Parse("abc-123") + assert.NoError(t, err) + n.SetExternalFieldUncensor(true) + n.SetExternalFieldCategory("abc") + assert.Equal(t, "abc", n.GetExternalFieldCategory()) + assert.True(t, n.GetExternalFieldUncensor()) +} diff --git a/number/rewrite_number.go b/number/rewrite_number.go deleted file mode 100644 index cca85f9..0000000 --- a/number/rewrite_number.go +++ /dev/null @@ -1,83 +0,0 @@ -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 -} diff --git a/number/rewrite_number_test.go b/number/rewrite_number_test.go deleted file mode 100644 index 9bc16b5..0000000 --- a/number/rewrite_number_test.go +++ /dev/null @@ -1,81 +0,0 @@ -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) - } -} diff --git a/number/category.go b/numberkit/numberkit.go similarity index 50% rename from number/category.go rename to numberkit/numberkit.go index d073020..a638a37 100644 --- a/number/category.go +++ b/numberkit/numberkit.go @@ -1,30 +1,12 @@ -package number +package numberkit import "strings" -type Category string - -func (c Category) String() string { - return string(c) -} - -const ( - CatDefault Category = "DEFAULT" - CatFC2 Category = "FC2" -) - func IsFc2(number string) bool { number = strings.ToUpper(number) return strings.HasPrefix(number, "FC2") } -func DetermineCategory(numberId string) Category { - if IsFc2(numberId) { - return CatFC2 - } - return CatDefault //默认无分类 -} - func DecodeFc2ValID(n string) (string, bool) { if !IsFc2(n) { return "", false diff --git a/processor/handler/actor_split_handler_test.go b/processor/handler/actor_split_handler_test.go index 267b1f4..4f3b0f6 100644 --- a/processor/handler/actor_split_handler_test.go +++ b/processor/handler/actor_split_handler_test.go @@ -15,7 +15,7 @@ func TestSplitActor(t *testing.T) { } h := &actorSplitHandler{} in := &model.FileContext{ - Meta: &model.AvMeta{ + Meta: &model.MovieMeta{ Actors: tests, }, } diff --git a/processor/handler/duration_fixer_handler_test.go b/processor/handler/duration_fixer_handler_test.go index f69740d..ca27829 100644 --- a/processor/handler/duration_fixer_handler_test.go +++ b/processor/handler/duration_fixer_handler_test.go @@ -22,7 +22,7 @@ func TestDurationFixer(t *testing.T) { defer filepath.Join(os.TempDir(), "temp_video.mp4") fc := &model.FileContext{ FullFilePath: tmpVideo, - Meta: &model.AvMeta{}, + Meta: &model.MovieMeta{}, } h, err := CreateHandler(HDurationFixer, nil) assert.NoError(t, err) diff --git a/processor/handler/poster_crop_handler.go b/processor/handler/poster_crop_handler.go index 0f50ba1..fd8c77f 100644 --- a/processor/handler/poster_crop_handler.go +++ b/processor/handler/poster_crop_handler.go @@ -42,8 +42,8 @@ func (c *posterCropHandler) Handle(ctx context.Context, fc *model.FileContext) e logger.Error("no cover found, skip process poster") return nil } - var cutter imageCutter = image.CutCensoredImageFromBytes //默认情况下, 都按骑兵进行封面处理 - if fc.Number.GetIsUncensorMovie() && face.IsFaceRecognizeEnabled() { //如果为步兵, 则使用人脸识别(当然, 只有该特性能用的情况下才启用) + var cutter imageCutter = image.CutCensoredImageFromBytes //默认情况下, 都按骑兵进行封面处理 + if fc.Number.GetExternalFieldUncensor() && face.IsFaceRecognizeEnabled() { //如果为步兵, 则使用人脸识别(当然, 只有该特性能用的情况下才启用) cutter = c.wrapCutImageWithFaceRec(ctx, image.CutCensoredImageFromBytes) } key, err := store.AnonymousDataRewrite(ctx, fc.Meta.Cover.Key, func(ctx context.Context, data []byte) ([]byte, error) { diff --git a/processor/handler/tag_padder_handler.go b/processor/handler/tag_padder_handler.go index 4375a30..3e70f9e 100644 --- a/processor/handler/tag_padder_handler.go +++ b/processor/handler/tag_padder_handler.go @@ -29,7 +29,7 @@ func (h *tagPadderHandler) generateNumberPrefixTag(fc *model.FileContext) (strin return sb.String(), true } -func (h *tagPadderHandler) rewriteOrAppendTag(fc *model.AvMeta, tagname string) { +func (h *tagPadderHandler) rewriteOrAppendTag(fc *model.MovieMeta, tagname string) { isContained := false for idx, item := range fc.Genres { if strings.EqualFold(item, tagname) { diff --git a/processor/handler/tag_padder_handler_test.go b/processor/handler/tag_padder_handler_test.go index 243ea90..9d26817 100644 --- a/processor/handler/tag_padder_handler_test.go +++ b/processor/handler/tag_padder_handler_test.go @@ -44,7 +44,7 @@ func TestTagPadde(t *testing.T) { padder := &tagPadderHandler{} fc := &model.FileContext{ Number: num, - Meta: &model.AvMeta{}, + Meta: &model.MovieMeta{}, } padder.Handle(context.Background(), fc) assert.Equal(t, item.tagCount, len(fc.Meta.Genres)) diff --git a/processor/handler/watermark_handler.go b/processor/handler/watermark_handler.go index 6f41467..56bf8d8 100644 --- a/processor/handler/watermark_handler.go +++ b/processor/handler/watermark_handler.go @@ -21,7 +21,7 @@ func (h *watermark) Handle(ctx context.Context, fc *model.FileContext) error { if fc.Number.GetIs4K() { tags = append(tags, image.WM4K) } - if fc.Number.GetIsUncensorMovie() { + if fc.Number.GetExternalFieldUncensor() { tags = append(tags, image.WMUncensored) } if fc.Number.GetIsChineseSubtitle() { diff --git a/searcher/category_searcher.go b/searcher/category_searcher.go index a508ae8..4604037 100644 --- a/searcher/category_searcher.go +++ b/searcher/category_searcher.go @@ -11,10 +11,10 @@ import ( type categorySearcher struct { defSearcher []ISearcher - catSearchers map[number.Category][]ISearcher + catSearchers map[string][]ISearcher } -func NewCategorySearcher(def []ISearcher, cats map[number.Category][]ISearcher) ISearcher { +func NewCategorySearcher(def []ISearcher, cats map[string][]ISearcher) ISearcher { return &categorySearcher{defSearcher: def, catSearchers: cats} } @@ -22,14 +22,14 @@ func (s *categorySearcher) Name() string { return "category" } -func (s *categorySearcher) Search(ctx context.Context, n *number.Number) (*model.AvMeta, bool, error) { - cat := n.GetCategory() +func (s *categorySearcher) Search(ctx context.Context, n *number.Number) (*model.MovieMeta, bool, error) { + cat := n.GetExternalFieldCategory() //没分类, 那么使用主链进行查询 //存在分类, 但是分类对应的链没有配置, 则使用主链进行查询 //如果已经存在分类链, 则不再进行降级 logger := logutil.GetLogger(ctx).With(zap.String("cat", string(cat))) chain := s.defSearcher - if cat != number.CatDefault { + if len(cat) > 0 { if c, ok := s.catSearchers[cat]; ok { chain = c logger.Debug("use cat chain for search") diff --git a/searcher/decoder/xpath_decoder.go b/searcher/decoder/xpath_decoder.go index 0e1e1d7..bb4ca8c 100644 --- a/searcher/decoder/xpath_decoder.go +++ b/searcher/decoder/xpath_decoder.go @@ -45,7 +45,7 @@ func (d *XPathHtmlDecoder) decodeMulti(c *config, node *html.Node, expr string) return c.DefaultStringListProcessor(DecodeList(node, expr)) } -func (d *XPathHtmlDecoder) DecodeHTML(data []byte, opts ...Option) (*model.AvMeta, error) { +func (d *XPathHtmlDecoder) DecodeHTML(data []byte, opts ...Option) (*model.MovieMeta, error) { node, err := htmlquery.Parse(bytes.NewReader(data)) if err != nil { return nil, err @@ -79,9 +79,9 @@ func (d *XPathHtmlDecoder) applyOpts(opts ...Option) *config { return c } -func (d *XPathHtmlDecoder) Decode(node *html.Node, opts ...Option) (*model.AvMeta, error) { +func (d *XPathHtmlDecoder) Decode(node *html.Node, opts ...Option) (*model.MovieMeta, error) { c := d.applyOpts(opts...) - meta := &model.AvMeta{ + meta := &model.MovieMeta{ Number: c.OnNumberParse(d.decodeSingle(c, node, d.NumberExpr)), Title: c.OnTitleParse(d.decodeSingle(c, node, d.TitleExpr)), Plot: c.OnPlotParse(d.decodeSingle(c, node, d.PlotExpr)), diff --git a/searcher/default_searcher.go b/searcher/default_searcher.go index 4e6a59f..c8de46c 100644 --- a/searcher/default_searcher.go +++ b/searcher/default_searcher.go @@ -131,16 +131,16 @@ func (p *DefaultSearcher) onRetriveData(ctx context.Context, req *http.Request, return store.LoadData(ctx, key, defaultPageSearchCacheExpire, dataLoader) } -func (p *DefaultSearcher) Search(ctx context.Context, number *number.Number) (*model.AvMeta, bool, error) { +func (p *DefaultSearcher) Search(ctx context.Context, number *number.Number) (*model.MovieMeta, bool, error) { ctx = meta.SetNumberId(ctx, number.GetNumberID()) - ok, err := p.plg.OnPrecheckRequest(ctx, number) + ok, err := p.plg.OnPrecheckRequest(ctx, number.GetNumberID()) if err != nil { return nil, false, fmt.Errorf("precheck failed, err:%w", err) } if !ok { return nil, false, nil } - req, err := p.plg.OnMakeHTTPRequest(ctx, number) + req, err := p.plg.OnMakeHTTPRequest(ctx, number.GetNumberID()) if err != nil { return nil, false, fmt.Errorf("make http request failed, err:%w", err) } @@ -168,7 +168,7 @@ func (p *DefaultSearcher) Search(ctx context.Context, number *number.Number) (*m return meta, true, nil } -func (p *DefaultSearcher) verifyMeta(meta *model.AvMeta) error { +func (p *DefaultSearcher) verifyMeta(meta *model.MovieMeta) error { if meta.Cover == nil || len(meta.Cover.Name) == 0 { return fmt.Errorf("no cover") } @@ -184,7 +184,7 @@ func (p *DefaultSearcher) verifyMeta(meta *model.AvMeta) error { return nil } -func (p *DefaultSearcher) fixMeta(req *http.Request, meta *model.AvMeta) { +func (p *DefaultSearcher) fixMeta(req *http.Request, meta *model.MovieMeta) { meta.Number = strings.ToUpper(meta.Number) prefix := req.URL.Scheme + "://" + req.URL.Host if meta.Cover != nil { @@ -209,7 +209,7 @@ func (p *DefaultSearcher) fixSingleURL(req *http.Request, input *string, prefix } } -func (p *DefaultSearcher) storeImageData(ctx context.Context, in *model.AvMeta) { +func (p *DefaultSearcher) storeImageData(ctx context.Context, in *model.MovieMeta) { images := make([]string, 0, len(in.SampleImages)+2) if in.Cover != nil { images = append(images, in.Cover.Name) diff --git a/searcher/group_searcher.go b/searcher/group_searcher.go index 171adcd..9a36b28 100644 --- a/searcher/group_searcher.go +++ b/searcher/group_searcher.go @@ -20,11 +20,11 @@ func (g *group) Name() string { return "group" } -func (g *group) Search(ctx context.Context, number *number.Number) (*model.AvMeta, bool, error) { +func (g *group) Search(ctx context.Context, number *number.Number) (*model.MovieMeta, bool, error) { return performGroupSearch(ctx, number, g.ss) } -func performGroupSearch(ctx context.Context, number *number.Number, ss []ISearcher) (*model.AvMeta, bool, error) { +func performGroupSearch(ctx context.Context, number *number.Number, ss []ISearcher) (*model.MovieMeta, bool, error) { var lastErr error for _, s := range ss { logutil.GetLogger(ctx).Debug("search number", zap.String("plugin", s.Name())) diff --git a/searcher/plugin/api/api.go b/searcher/plugin/api/api.go index 52cff57..71ae13b 100644 --- a/searcher/plugin/api/api.go +++ b/searcher/plugin/api/api.go @@ -4,18 +4,17 @@ import ( "context" "net/http" "yamdc/model" - "yamdc/number" ) type HTTPInvoker func(ctx context.Context, req *http.Request) (*http.Response, error) type IPlugin interface { OnHTTPClientInit() HTTPInvoker - OnPrecheckRequest(ctx context.Context, number *number.Number) (bool, error) - OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) + OnPrecheckRequest(ctx context.Context, number string) (bool, error) + OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) OnDecorateRequest(ctx context.Context, req *http.Request) error OnHandleHTTPRequest(ctx context.Context, invoker HTTPInvoker, req *http.Request) (*http.Response, error) OnPrecheckResponse(ctx context.Context, req *http.Request, rsp *http.Response) (bool, error) - OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) + OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) OnDecorateMediaRequest(ctx context.Context, req *http.Request) error } diff --git a/searcher/plugin/api/defaults.go b/searcher/plugin/api/defaults.go index 139b14b..c815cc4 100644 --- a/searcher/plugin/api/defaults.go +++ b/searcher/plugin/api/defaults.go @@ -5,13 +5,12 @@ import ( "fmt" "net/http" "yamdc/model" - "yamdc/number" ) type DefaultPlugin struct { } -func (p *DefaultPlugin) OnPrecheckRequest(ctx context.Context, number *number.Number) (bool, error) { +func (p *DefaultPlugin) OnPrecheckRequest(ctx context.Context, number string) (bool, error) { return true, nil } @@ -19,7 +18,7 @@ func (p *DefaultPlugin) OnHTTPClientInit() HTTPInvoker { return nil } -func (p *DefaultPlugin) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { +func (p *DefaultPlugin) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { return nil, fmt.Errorf("no impl") } @@ -38,7 +37,7 @@ func (p *DefaultPlugin) OnHandleHTTPRequest(ctx context.Context, invoker HTTPInv return invoker(ctx, req) } -func (p *DefaultPlugin) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *DefaultPlugin) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { return nil, false, fmt.Errorf("no impl") } diff --git a/searcher/plugin/impl/18av.go b/searcher/plugin/impl/18av.go index af1af5d..f88b746 100644 --- a/searcher/plugin/impl/18av.go +++ b/searcher/plugin/impl/18av.go @@ -6,7 +6,6 @@ import ( "net/http" "strings" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -20,8 +19,8 @@ type av18 struct { api.DefaultPlugin } -func (p *av18) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - uri := fmt.Sprintf("https://18av.me/cn/search.php?kw_type=key&kw=%s", number.GetNumberID()) +func (p *av18) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + uri := fmt.Sprintf("https://18av.me/cn/search.php?kw_type=key&kw=%s", number) return http.NewRequest(http.MethodGet, uri, nil) } @@ -64,7 +63,7 @@ func (p *av18) plotParser(in string) string { return strings.TrimSpace(strings.TrimLeft(in, "简介:")) } -func (p *av18) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *av18) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//div[@class="px-0 flex-columns"]/div[@class="number"]/text()`, TitleExpr: `//div[@class="d-flex px-3 py-2 name col bg-w"]/h1[@class="h4 b"]/text()`, diff --git a/searcher/plugin/impl/airav/airav.go b/searcher/plugin/impl/airav/airav.go index 9d63382..cd5b031 100644 --- a/searcher/plugin/impl/airav/airav.go +++ b/searcher/plugin/impl/airav/airav.go @@ -7,7 +7,6 @@ import ( "net/http" "strings" "yamdc/model" - "yamdc/number" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" "yamdc/searcher/plugin/constant" @@ -21,15 +20,15 @@ type airav struct { api.DefaultPlugin } -func (p *airav) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://www.airav.wiki/api/video/barcode/%s?lng=zh-TW", number.GetNumberID()), nil) +func (p *airav) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("https://www.airav.wiki/api/video/barcode/%s?lng=zh-TW", number), nil) if err != nil { return nil, err } return req, nil } -func (p *airav) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *airav) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { vdata := &VideoData{} if err := json.Unmarshal(data, vdata); err != nil { return nil, false, fmt.Errorf("decode json data failed, err:%w", err) @@ -44,7 +43,7 @@ func (p *airav) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMet logutil.GetLogger(ctx).Warn("more than one result, may cause data mismatch", zap.Int("count", vdata.Count)) } result := vdata.Result - avdata := &model.AvMeta{ + avdata := &model.MovieMeta{ Number: result.Barcode, Title: result.Name, Plot: result.Description, diff --git a/searcher/plugin/impl/avsox.go b/searcher/plugin/impl/avsox.go index 5dc279a..90d0f14 100644 --- a/searcher/plugin/impl/avsox.go +++ b/searcher/plugin/impl/avsox.go @@ -6,7 +6,6 @@ import ( "net/http" "strings" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -27,7 +26,7 @@ type avsox struct { api.DefaultPlugin } -func (p *avsox) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { +func (p *avsox) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { return http.NewRequest(http.MethodGet, "https://avsox.click", nil) //返回一个假的request } @@ -104,7 +103,7 @@ func (p *avsox) trySearchByNumber(ctx context.Context, invoker api.HTTPInvoker, return res[0], true, nil } -func (p *avsox) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *avsox) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//span[contains(text(),"识别码:")]/../span[2]/text()`, TitleExpr: `/html/body/div[2]/h3/text()`, diff --git a/searcher/plugin/impl/caribpr.go b/searcher/plugin/impl/caribpr.go index 9ce421d..0be205f 100644 --- a/searcher/plugin/impl/caribpr.go +++ b/searcher/plugin/impl/caribpr.go @@ -8,7 +8,6 @@ import ( "strings" "time" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/plugin/api" "yamdc/searcher/plugin/constant" @@ -27,8 +26,8 @@ type caribpr struct { api.DefaultPlugin } -func (p *caribpr) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - uri := fmt.Sprintf("https://www.caribbeancompr.com/moviepages/%s/index.html", number.GetNumberID()) +func (p *caribpr) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + uri := fmt.Sprintf("https://www.caribbeancompr.com/moviepages/%s/index.html", number) req, err := http.NewRequest(http.MethodGet, uri, nil) return req, err } @@ -55,7 +54,7 @@ func (p *caribpr) decodeReleaseDate(ctx context.Context) decoder.NumberParseFunc } } -func (p *caribpr) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *caribpr) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { reader := transform.NewReader(strings.NewReader(string(data)), japanese.EUCJP.NewDecoder()) data, err := io.ReadAll(reader) if err != nil { diff --git a/searcher/plugin/impl/fc2.go b/searcher/plugin/impl/fc2.go index d29f0df..e902b6d 100644 --- a/searcher/plugin/impl/fc2.go +++ b/searcher/plugin/impl/fc2.go @@ -4,12 +4,11 @@ import ( "context" "fmt" "net/http" - "regexp" "strconv" "strings" "time" "yamdc/model" - "yamdc/number" + "yamdc/numberkit" "yamdc/searcher/decoder" "yamdc/searcher/plugin/api" "yamdc/searcher/plugin/constant" @@ -21,20 +20,20 @@ import ( "go.uber.org/zap" ) -var defaultFc2NumberParser = regexp.MustCompile(`^fc2.*?(\d+)$`) +var ( + defaultFc2DomainList = []string{"adult.contents.fc2.com"} +) type fc2 struct { api.DefaultPlugin } -func (p *fc2) OnMakeHTTPRequest(ctx context.Context, n *number.Number) (*http.Request, error) { - number := strings.ToLower(n.GetNumberID()) - res := defaultFc2NumberParser.FindStringSubmatch(number) - if len(res) != 2 { - return nil, fmt.Errorf("unabe to decode number") +func (p *fc2) OnMakeHTTPRequest(ctx context.Context, n string) (*http.Request, error) { + nid, ok := numberkit.DecodeFc2ValID(n) + if !ok { + return nil, fmt.Errorf("unable to decode fc2 number") } - number = res[1] - uri := "https://adult.contents.fc2.com/article/" + number + "/" + uri := fmt.Sprintf("https://%s/article/%s/", api.MustSelectDomain(defaultFc2DomainList), nid) return http.NewRequest(http.MethodGet, uri, nil) } @@ -78,7 +77,7 @@ func (p *fc2) decodeReleaseDate(ctx context.Context) decoder.NumberParseFunc { } } -func (p *fc2) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *fc2) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: ``, TitleExpr: `/html/head/title/text()`, diff --git a/searcher/plugin/impl/fc2ppvdb.go b/searcher/plugin/impl/fc2ppvdb.go index 0f83c21..c2aa239 100644 --- a/searcher/plugin/impl/fc2ppvdb.go +++ b/searcher/plugin/impl/fc2ppvdb.go @@ -5,7 +5,7 @@ import ( "fmt" "net/http" "yamdc/model" - "yamdc/number" + "yamdc/numberkit" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -23,8 +23,8 @@ type fc2ppvdb struct { api.DefaultPlugin } -func (p *fc2ppvdb) OnMakeHTTPRequest(ctx context.Context, nid *number.Number) (*http.Request, error) { - vid, ok := number.DecodeFc2ValID(nid.GetNumberID()) +func (p *fc2ppvdb) OnMakeHTTPRequest(ctx context.Context, nid string) (*http.Request, error) { + vid, ok := numberkit.DecodeFc2ValID(nid) if !ok { return nil, fmt.Errorf("unable to decode fc2 vid") } @@ -36,7 +36,7 @@ func (p *fc2ppvdb) OnMakeHTTPRequest(ctx context.Context, nid *number.Number) (* return req, nil } -func (p *fc2ppvdb) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *fc2ppvdb) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//div[contains(text(), "ID")]/span/text()`, TitleExpr: `//div[@class="w-full lg:pl-8 px-2 lg:w-3/5"]/h2/a/text()`, diff --git a/searcher/plugin/impl/freejavbt.go b/searcher/plugin/impl/freejavbt.go index b20b2d8..23086c4 100644 --- a/searcher/plugin/impl/freejavbt.go +++ b/searcher/plugin/impl/freejavbt.go @@ -4,7 +4,6 @@ import ( "context" "net/http" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -18,12 +17,12 @@ type freejavbt struct { api.DefaultPlugin } -func (p *freejavbt) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - uri := "https://freejavbt.com/zh/" + number.GetNumberID() +func (p *freejavbt) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + uri := "https://freejavbt.com/zh/" + number return http.NewRequest(http.MethodGet, uri, nil) } -func (p *freejavbt) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *freejavbt) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: "", TitleExpr: `//h1[@class="text-white"]/strong/text()`, diff --git a/searcher/plugin/impl/jav321.go b/searcher/plugin/impl/jav321.go index e2b5db2..6381f21 100644 --- a/searcher/plugin/impl/jav321.go +++ b/searcher/plugin/impl/jav321.go @@ -7,7 +7,6 @@ import ( "strconv" "strings" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -20,9 +19,9 @@ type jav321 struct { api.DefaultPlugin } -func (p *jav321) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { +func (p *jav321) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { data := url.Values{} - data.Set("sn", number.GetNumberID()) + data.Set("sn", number) body := data.Encode() req, err := http.NewRequest(http.MethodPost, "https://www.jav321.com/search", strings.NewReader(body)) if err != nil { @@ -38,7 +37,7 @@ func (s *jav321) defaultStringProcessor(v string) string { return strings.TrimSpace(v) } -func (p *jav321) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *jav321) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := &decoder.XPathHtmlDecoder{ NumberExpr: `//b[contains(text(),"品番")]/following-sibling::node()`, TitleExpr: `/html/body/div[2]/div[1]/div[1]/div[1]/h3/text()`, diff --git a/searcher/plugin/impl/javbus.go b/searcher/plugin/impl/javbus.go index 2b49513..946d72a 100644 --- a/searcher/plugin/impl/javbus.go +++ b/searcher/plugin/impl/javbus.go @@ -5,7 +5,6 @@ import ( "fmt" "net/http" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -22,8 +21,8 @@ type javbus struct { api.DefaultPlugin } -func (p *javbus) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - url := fmt.Sprintf("https://%s/%s", api.MustSelectDomain(defaultJavBusDomainList), number.GetNumberID()) +func (p *javbus) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + url := fmt.Sprintf("https://%s/%s", api.MustSelectDomain(defaultJavBusDomainList), number) return http.NewRequest(http.MethodGet, url, nil) } @@ -46,7 +45,7 @@ func (p *javbus) OnDecorateRequest(ctx context.Context, req *http.Request) error return nil } -func (p *javbus) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *javbus) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//div[@class="row movie"]/div[@class="col-md-3 info"]/p[span[contains(text(),'識別碼:')]]/span[2]/text()`, TitleExpr: `//div[@class="container"]/h3`, diff --git a/searcher/plugin/impl/javdb.go b/searcher/plugin/impl/javdb.go index e5a04cb..a733c8f 100644 --- a/searcher/plugin/impl/javdb.go +++ b/searcher/plugin/impl/javdb.go @@ -20,8 +20,8 @@ type javdb struct { api.DefaultPlugin } -func (p *javdb) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - link := fmt.Sprintf("https://javdb.com/search?q=%s&f=all", number.GetNumberID()) +func (p *javdb) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + link := fmt.Sprintf("https://javdb.com/search?q=%s&f=all", number) return http.NewRequest(http.MethodGet, link, nil) } @@ -55,7 +55,7 @@ func (p *javdb) OnHandleHTTPRequest(ctx context.Context, invoker api.HTTPInvoker }) } -func (p *javdb) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *javdb) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//a[@class="button is-white copy-to-clipboard"]/@data-clipboard-text`, TitleExpr: `//h2[@class="title is-4"]/strong[@class="current-title"]`, diff --git a/searcher/plugin/impl/javhoo.go b/searcher/plugin/impl/javhoo.go index fdae462..495e86b 100644 --- a/searcher/plugin/impl/javhoo.go +++ b/searcher/plugin/impl/javhoo.go @@ -5,7 +5,6 @@ import ( "fmt" "net/http" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -18,12 +17,12 @@ type javhoo struct { api.DefaultPlugin } -func (p *javhoo) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - uri := fmt.Sprintf("https://www.javhoo.com/av/%s", number.GetNumberID()) +func (p *javhoo) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + uri := fmt.Sprintf("https://www.javhoo.com/av/%s", number) return http.NewRequest(http.MethodGet, uri, nil) } -func (p *javhoo) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *javhoo) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//div[@class="project_info"]/p/span[@class="categories"]/text()`, TitleExpr: `//header[@class="article-header"]/h1[@class="article-title"]/text()`, diff --git a/searcher/plugin/impl/missav.go b/searcher/plugin/impl/missav.go index 1ce6585..5367097 100644 --- a/searcher/plugin/impl/missav.go +++ b/searcher/plugin/impl/missav.go @@ -6,7 +6,6 @@ import ( "net/http" "strings" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -26,8 +25,8 @@ type missav struct { api.DefaultPlugin } -func (p *missav) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - link := fmt.Sprintf("https://%s/cn/search/%s", api.MustSelectDomain(defaultMissavDomains), number.GetNumberID()) +func (p *missav) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + link := fmt.Sprintf("https://%s/cn/search/%s", api.MustSelectDomain(defaultMissavDomains), number) return http.NewRequest(http.MethodGet, link, nil) } @@ -61,7 +60,7 @@ func (p *missav) OnHandleHTTPRequest(ctx context.Context, invoker api.HTTPInvoke return twostep.HandleXPathTwoStepSearch(ctx, invoker, req, xctx) } -func (p *missav) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *missav) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//div[span[contains(text(), "番号")]]/span[@class="font-medium"]/text()`, TitleExpr: `//div[@class="mt-4"]/h1[@class="text-base lg:text-lg text-nord6"]/text()`, diff --git a/searcher/plugin/impl/njav.go b/searcher/plugin/impl/njav.go index 34cd155..45a9078 100644 --- a/searcher/plugin/impl/njav.go +++ b/searcher/plugin/impl/njav.go @@ -20,8 +20,8 @@ type njav struct { api.DefaultPlugin } -func (p *njav) OnMakeHTTPRequest(ctx context.Context, number *number.Number) (*http.Request, error) { - nid := number.GetNumberID() +func (p *njav) OnMakeHTTPRequest(ctx context.Context, number string) (*http.Request, error) { + nid := number nid = strings.ReplaceAll(nid, "_", "-") //将下划线替换为中划线 uri := fmt.Sprintf("https://njavtv.com/cn/search/%s", nid) return http.NewRequest(http.MethodGet, uri, nil) @@ -58,7 +58,7 @@ func (p *njav) OnHandleHTTPRequest(ctx context.Context, invoker api.HTTPInvoker, } -func (p *njav) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *njav) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ NumberExpr: `//div[@class="text-secondary" and contains(span[text()], "番号:")]/span[@class="font-medium"]/text()`, TitleExpr: `//div[@class="text-secondary" and contains(span[text()], "标题:")]/span[@class="font-medium"]/text()`, diff --git a/searcher/plugin/impl/tktube.go b/searcher/plugin/impl/tktube.go index 5f01891..3799a8e 100644 --- a/searcher/plugin/impl/tktube.go +++ b/searcher/plugin/impl/tktube.go @@ -6,7 +6,6 @@ import ( "net/http" "strings" "yamdc/model" - "yamdc/number" "yamdc/searcher/decoder" "yamdc/searcher/parser" "yamdc/searcher/plugin/api" @@ -20,8 +19,8 @@ type tktube struct { api.DefaultPlugin } -func (p *tktube) OnMakeHTTPRequest(ctx context.Context, n *number.Number) (*http.Request, error) { - nid := strings.ReplaceAll(n.GetNumberID(), "-", "--") +func (p *tktube) OnMakeHTTPRequest(ctx context.Context, n string) (*http.Request, error) { + nid := strings.ReplaceAll(n, "-", "--") uri := fmt.Sprintf("https://tktube.com/zh/search/%s/", nid) return http.NewRequest(http.MethodGet, uri, nil) } @@ -55,7 +54,7 @@ func (p *tktube) OnHandleHTTPRequest(ctx context.Context, invoker api.HTTPInvoke }) } -func (p *tktube) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.AvMeta, bool, error) { +func (p *tktube) OnDecodeHTTPData(ctx context.Context, data []byte) (*model.MovieMeta, bool, error) { dec := decoder.XPathHtmlDecoder{ TitleExpr: `//div[@class="headline"]/h1/text()`, PlotExpr: "", diff --git a/searcher/searcher.go b/searcher/searcher.go index bfb0441..7fa03d0 100644 --- a/searcher/searcher.go +++ b/searcher/searcher.go @@ -8,5 +8,5 @@ import ( type ISearcher interface { Name() string - Search(ctx context.Context, number *number.Number) (*model.AvMeta, bool, error) + Search(ctx context.Context, number *number.Number) (*model.MovieMeta, bool, error) } diff --git a/searcher/utils/meta_utils.go b/searcher/utils/meta_utils.go index a1b07d8..e52b0a2 100644 --- a/searcher/utils/meta_utils.go +++ b/searcher/utils/meta_utils.go @@ -2,7 +2,7 @@ package utils import "yamdc/model" -func EnableDataTranslate(meta *model.AvMeta) { +func EnableDataTranslate(meta *model.MovieMeta) { meta.ExtInfo.TranslateInfo.Plot.Enable = true meta.ExtInfo.TranslateInfo.Title.Enable = true } diff --git a/utils/nfo_utils.go b/utils/nfo_utils.go index 74f1304..7ddc527 100644 --- a/utils/nfo_utils.go +++ b/utils/nfo_utils.go @@ -14,7 +14,7 @@ func buildDataWithSingleTranslateItem(origin string, item *model.SingleTranslate return fmt.Sprintf("%s [翻译:%s]", origin, item.TranslatedText) } -func ConvertMetaToMovieNFO(m *model.AvMeta) (*nfo.Movie, error) { +func ConvertMetaToMovieNFO(m *model.MovieMeta) (*nfo.Movie, error) { mv := &nfo.Movie{ ID: m.Number, Plot: buildDataWithSingleTranslateItem(m.Plot, &m.ExtInfo.TranslateInfo.Plot),