Improve query intent handling and preview playback
build-push / docker (push) Successful in 4m52s

This commit is contained in:
AI Assistant
2026-03-16 09:55:14 +09:00
parent 6d9391bc2b
commit 9637b761bd
7 changed files with 142 additions and 12 deletions
+46 -4
View File
@@ -58,6 +58,10 @@ func (g *GeminiService) TranslateQuery(query string) string {
if trimmed == "" {
return ""
}
normalizedIntent := normalizeKnownMediaPhrases(trimmed)
if looksMostlyASCII(normalizedIntent) {
return strings.TrimSpace(normalizedIntent)
}
if looksMostlyASCII(trimmed) {
return trimmed
}
@@ -90,19 +94,19 @@ func (g *GeminiService) TranslateQuery(query string) string {
rawText, err := g.generateText(body)
if err == nil {
translated := sanitizePlainEnglishLine(rawText)
if translated != "" && !strings.EqualFold(translated, trimmed) {
if translated != "" && !strings.EqualFold(translated, trimmed) && !isOvercompressedTranslation(trimmed, translated) {
return translated
}
}
}
if translated, err := g.translateViaGoogle(trimmed); err == nil && translated != "" && isLikelyEnglishQuery(translated) {
if translated, err := g.translateViaGoogle(trimmed); err == nil && translated != "" && isLikelyEnglishQuery(translated) && !isOvercompressedTranslation(trimmed, translated) {
return translated
}
if translated := translateKoreanMediaTerms(trimmed); translated != "" && !strings.EqualFold(translated, trimmed) {
if translated := translateKoreanMediaTerms(normalizedIntent); translated != "" && !strings.EqualFold(translated, trimmed) {
return translated
}
return trimmed
return strings.TrimSpace(normalizedIntent)
}
func (g *GeminiService) generateText(body map[string]any) (string, error) {
@@ -493,6 +497,12 @@ func translateKoreanMediaTerms(query string) string {
korean string
english string
}{
{korean: "사이버 펑크 도시", english: "cyberpunk city"},
{korean: "사이버펑크 도시", english: "cyberpunk city"},
{korean: "사이버 펑크", english: "cyberpunk"},
{korean: "사이버펑크", english: "cyberpunk"},
{korean: "네온 도시", english: "neon city"},
{korean: "미래 도시", english: "futuristic city"},
{korean: "숲속", english: "forest"},
{korean: "다정한", english: "affectionate"},
{korean: "항공샷", english: "aerial shot"},
@@ -528,6 +538,38 @@ func translateKoreanMediaTerms(query string) string {
return strings.TrimSpace(translated)
}
func normalizeKnownMediaPhrases(query string) string {
normalized := strings.TrimSpace(query)
replacements := []struct {
from string
to string
}{
{from: "사이버 펑크 도시", to: "cyberpunk city"},
{from: "사이버펑크 도시", to: "cyberpunk city"},
{from: "사이버 펑크", to: "cyberpunk"},
{from: "사이버펑크", to: "cyberpunk"},
}
for _, replacement := range replacements {
normalized = strings.ReplaceAll(normalized, replacement.from, replacement.to)
}
return strings.Join(strings.Fields(normalized), " ")
}
func isOvercompressedTranslation(original, translated string) bool {
originalWords := len(strings.Fields(strings.TrimSpace(original)))
translatedWords := len(strings.Fields(strings.TrimSpace(translated)))
if originalWords < 2 || translatedWords >= 2 {
return false
}
lower := strings.ToLower(strings.TrimSpace(translated))
for _, allow := range []string{"cyberpunk", "nightlife", "cityscape"} {
if lower == allow {
return false
}
}
return true
}
func (g *GeminiService) translateViaGoogle(query string) (string, error) {
baseURL := g.TranslateEndpoint
if strings.TrimSpace(baseURL) == "" {