From cce88ce3b03e99f52640e14b98315d022372b5c9 Mon Sep 17 00:00:00 2001 From: ShukeBta <272197458+ShukeBta@users.noreply.github.com> Date: Thu, 18 Jun 2026 19:57:59 +0000 Subject: [PATCH] =?UTF-8?q?fix(classify):=20anime=20=E6=97=A0=E5=85=83?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=97=B6=E7=BA=AF=E4=B8=AD=E6=96=87=E8=AF=91?= =?UTF-8?q?=E5=90=8D=E4=B8=8D=E5=86=8D=E8=AF=AF=E5=88=A4=E5=9B=BD=E6=BC=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 日本动画的中文译名几乎都是纯汉字(如「葬送的芙莉莲」),原先靠 containsHan 判中文会把日本动画误判成国漫。新增 isChineseAnime:仅在有 origin_country/ 语言元数据,或无元数据但有显式中文标记(国漫/国产/国创/华语)时才判国漫, 否则默认日番。有元数据时只认元数据,不受错误源目录名(如「国产剧」)误导。 未刮削的国漫刮出 origin_country=CN 后仍正确归类。补 4 个分类器测试用例。 --- internal/service/media_classifier.go | 8 +++-- internal/service/media_classifier_test.go | 37 +++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/internal/service/media_classifier.go b/internal/service/media_classifier.go index d09cab3..a710cd9 100644 --- a/internal/service/media_classifier.go +++ b/internal/service/media_classifier.go @@ -40,6 +40,10 @@ func classifyMediaCategory(input mediaClassifyInput, categories map[string]strin isChineseByMetadata := hasAny(languages, "ZH", "ZH-CN", "ZH-TW", "CN", "BO", "ZA") || hasAny(countries, "CN", "TW", "HK", "MO") isChineseByText := containsHan(rawText) || containsAnyText(text, "华语", "国产", "国剧", "国漫") isChinese := isChineseByMetadata || (!hasMetadata && isChineseByText) + // 动漫的中文译名几乎都是纯汉字(如日本动画「葬送的芙莉莲」),用 containsHan + // 判中文会把日本动画误判成国漫。动漫只在有元数据或显式中文标记时才算国漫, + // 否则默认日番(日本动画占绝大多数;未刮削的国漫刮出 origin_country=CN 后仍正确)。 + isChineseAnime := isChineseByMetadata || (!hasMetadata && containsAnyText(text, "华语", "国产", "国漫", "國漫", "国创", "国产动漫", "国产动画")) isJapanese := hasAny(languages, "JA", "JP") || hasAny(countries, "JP") || containsJapaneseKana(rawText) || strings.Contains(text, "日番") isKorean := hasAny(languages, "KO", "KR") || hasAny(countries, "KR", "KP") || containsKoreanHangul(rawText) isEastAsian := isJapanese || isKorean || hasAny(countries, "TH", "IN", "SG") @@ -81,7 +85,7 @@ func classifyMediaCategory(input mediaClassifyInput, categories map[string]strin } return categoryName(categories, "foreign_movie", "外语电影") case "anime": - if isChinese { + if isChineseAnime { return categoryName(categories, "cn_anime", "国漫") } return categoryName(categories, "jp_anime", "日番") @@ -101,7 +105,7 @@ func classifyMediaCategory(input mediaClassifyInput, categories map[string]strin return categoryName(categories, "children", "儿童") } if hasGenre("16", "ANIMATION", "动画", "动漫") || hasAnimeText { - if isChinese { + if isChineseAnime { return categoryName(categories, "cn_anime", "国漫") } return categoryName(categories, "jp_anime", "日番") diff --git a/internal/service/media_classifier_test.go b/internal/service/media_classifier_test.go index 3d39016..2a25702 100644 --- a/internal/service/media_classifier_test.go +++ b/internal/service/media_classifier_test.go @@ -144,6 +144,43 @@ func TestClassifyMediaCategoryMatchesMoviePilotStyleRules(t *testing.T) { }, want: "综艺", }, + { + name: "japanese anime localized chinese title defaults to jp without metadata", + input: mediaClassifyInput{ + MediaType: "anime", + Title: "葬送的芙莉莲", + }, + want: "日番", + }, + { + name: "chinese anime explicit marker without metadata", + input: mediaClassifyInput{ + MediaType: "anime", + Title: "斗破苍穹 国漫", + }, + want: "国漫", + }, + { + name: "anime with JP country metadata is jp even from wrong source folder", + input: mediaClassifyInput{ + MediaType: "anime", + Title: "间谍过家家 SPY×FAMILY", + Countries: []string{"JP"}, + Genres: []string{"16"}, + Category: "国产剧", + }, + want: "日番", + }, + { + name: "anime with CN country metadata is cn", + input: mediaClassifyInput{ + MediaType: "anime", + Title: "某番", + Countries: []string{"CN"}, + Genres: []string{"16"}, + }, + want: "国漫", + }, { name: "jav code is adult", input: mediaClassifyInput{