diff --git a/internal/service/adult_scraper.go b/internal/service/adult_scraper.go index f7f1b45..416f871 100644 --- a/internal/service/adult_scraper.go +++ b/internal/service/adult_scraper.go @@ -31,7 +31,10 @@ var ( var adultExcludedPrefixes = map[string]struct{}{ "AC": {}, "AAC": {}, "AVC": {}, "BD": {}, "CD": {}, "DDP": {}, "DTS": {}, "FHD": {}, "HD": {}, "HEVC": {}, "HDR": {}, "MP": {}, "SD": {}, "UHD": {}, - "WEB": {}, "X264": {}, "X265": {}, + "WEB": {}, "X264": {}, "X265": {}, "H264": {}, "H265": {}, "AV1": {}, + "SEASON": {}, "EPISODE": {}, "EP": {}, "SP": {}, "OVA": {}, "OAD": {}, + "TMDB": {}, "TMDBID": {}, "DOUBAN": {}, "BANGUMI": {}, "BGM": {}, "TVDB": {}, "THETVDB": {}, + "PART": {}, "VOL": {}, "DISC": {}, "DISK": {}, "TRACK": {}, "CHAPTER": {}, "SAMPLE": {}, "TRAILER": {}, } var defaultAdultBases = []string{ @@ -87,11 +90,12 @@ func (p *AdultProvider) Search(ctx context.Context, code string) (*Match, error) } continue } - if match != nil { - match.OriginalName = code - match.NSFW = true - return match, nil - } + if match != nil { + match.OriginalName = code + match.Title = FormatAdultTitle(code, match.Title) + match.NSFW = true + return match, nil + } } return nil, lastErr } diff --git a/internal/service/adult_scraper_code.go b/internal/service/adult_scraper_code.go index a05db53..9c3927f 100644 --- a/internal/service/adult_scraper_code.go +++ b/internal/service/adult_scraper_code.go @@ -39,3 +39,57 @@ func normalizeAdultCode(input string) string { } return "" } + +// CleanAdultTitle 去除标题中冗余的前缀番号、方括号、分隔符,提取纯标题内容 +func CleanAdultTitle(code, rawTitle string) string { + rawTitle = strings.TrimSpace(rawTitle) + code = normalizeAdultCode(code) + if rawTitle == "" { + return "" + } + clean := rawTitle + for { + trimmed := strings.TrimSpace(clean) + if trimmed == "" { + return "" + } + if code != "" { + upper := strings.ToUpper(trimmed) + upperCode := strings.ToUpper(code) + if strings.HasPrefix(upper, upperCode) { + clean = strings.TrimSpace(trimmed[len(upperCode):]) + clean = strings.TrimLeft(clean, "-_ ::]】") + continue + } + } + if strings.HasPrefix(trimmed, "[") || strings.HasPrefix(trimmed, "【") { + idx := strings.IndexAny(trimmed, "]】") + if idx > 0 { + bracketContent := normalizeAdultCode(trimmed[1:idx]) + if bracketContent != "" && (code == "" || bracketContent == code) { + clean = strings.TrimSpace(trimmed[idx+len("]"):]) + clean = strings.TrimLeft(clean, "-_ ::") + continue + } + } + } + break + } + return strings.TrimSpace(clean) +} + +// FormatAdultTitle 格式化番号标题:把番号放在最前面,如 "IPZZ-090-具体标题" 或 "IPZZ-090" +func FormatAdultTitle(code, rawTitle string) string { + code = normalizeAdultCode(code) + if code == "" { + code = normalizeAdultCode(rawTitle) + } + clean := CleanAdultTitle(code, rawTitle) + if code == "" { + return clean + } + if clean == "" || strings.EqualFold(clean, code) { + return code + } + return code + "-" + clean +} diff --git a/internal/service/adult_scraper_parse.go b/internal/service/adult_scraper_parse.go index f72edbe..25f1ff2 100644 --- a/internal/service/adult_scraper_parse.go +++ b/internal/service/adult_scraper_parse.go @@ -9,14 +9,17 @@ import ( ) func parseAdultDetailHTML(body, code, source, detailURL string) *Match { + code = normalizeAdultCode(code) match := &Match{ OriginalName: code, MediaType: "adult", NSFW: true, Genres: []string{"Adult", source}, } - if title := firstAdultTitle(body, code); title != "" { - match.Title = title + rawTitle := firstAdultTitle(body, code) + match.Title = FormatAdultTitle(code, rawTitle) + if match.Title == "" { + match.Title = code } if match.Title == "" { return nil @@ -48,7 +51,10 @@ func firstAdultTitle(body, code string) string { if title == "" { continue } - title = strings.TrimSpace(strings.TrimPrefix(strings.TrimPrefix(title, code), strings.ToUpper(code))) + clean := CleanAdultTitle(code, title) + if clean != "" { + return clean + } if title != "" { return title } diff --git a/internal/service/adult_scraper_test.go b/internal/service/adult_scraper_test.go index d8c700e..bde64d7 100644 --- a/internal/service/adult_scraper_test.go +++ b/internal/service/adult_scraper_test.go @@ -36,13 +36,13 @@ func TestParseAdultDetailHTML(t *testing.T) {