diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/LanguageDetectEvent.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/LanguageDetectEvent.kt index 24d2c0b..feb06c6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/LanguageDetectEvent.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/LanguageDetectEvent.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.content import kr.co.vividnext.sodalive.chat.character.comment.CharacterCommentRepository import kr.co.vividnext.sodalive.content.comment.AudioContentCommentRepository +import kr.co.vividnext.sodalive.explorer.profile.CreatorCheersRepository import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Value import org.springframework.http.HttpEntity @@ -22,7 +23,8 @@ import org.springframework.web.client.RestTemplate enum class LanguageDetectTargetType { CONTENT, COMMENT, - CHARACTER_COMMENT + CHARACTER_COMMENT, + CREATOR_CHEERS } class LanguageDetectEvent( @@ -40,6 +42,7 @@ class LanguageDetectListener( private val audioContentRepository: AudioContentRepository, private val audioContentCommentRepository: AudioContentCommentRepository, private val characterCommentRepository: CharacterCommentRepository, + private val creatorCheersRepository: CreatorCheersRepository, @Value("\${cloud.naver.papago-client-id}") private val papagoClientId: String, @@ -67,6 +70,7 @@ class LanguageDetectListener( LanguageDetectTargetType.CONTENT -> handleContentLanguageDetect(event) LanguageDetectTargetType.COMMENT -> handleCommentLanguageDetect(event) LanguageDetectTargetType.CHARACTER_COMMENT -> handleCharacterCommentLanguageDetect(event) + LanguageDetectTargetType.CREATOR_CHEERS -> handleCreatorCheersLanguageDetect(event) } } @@ -166,6 +170,37 @@ class LanguageDetectListener( ) } + private fun handleCreatorCheersLanguageDetect(event: LanguageDetectEvent) { + val cheersId = event.id + + val cheers = creatorCheersRepository.findById(cheersId).orElse(null) + if (cheers == null) { + log.warn("[PapagoLanguageDetect] CreatorCheers not found. cheersId={}", cheersId) + return + } + + // 이미 언어 코드가 설정된 경우 호출하지 않음 + if (!cheers.languageCode.isNullOrBlank()) { + log.debug( + "[PapagoLanguageDetect] languageCode already set. Skip language detection. cheersId={}, languageCode={}", + cheersId, + cheers.languageCode + ) + return + } + + val langCode = requestPapagoLanguageCode(event.query, cheersId) ?: return + + cheers.languageCode = langCode + creatorCheersRepository.save(cheers) + + log.info( + "[PapagoLanguageDetect] languageCode updated from Papago. cheersId={}, langCode={}", + cheersId, + langCode + ) + } + private fun requestPapagoLanguageCode(query: String, targetIdForLog: Long): String? { return try { val headers = HttpHeaders().apply { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt index 933a8a8..759c83f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt @@ -3,6 +3,8 @@ package kr.co.vividnext.sodalive.explorer import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.content.AudioContentService import kr.co.vividnext.sodalive.content.ContentType +import kr.co.vividnext.sodalive.content.LanguageDetectEvent +import kr.co.vividnext.sodalive.content.LanguageDetectTargetType import kr.co.vividnext.sodalive.content.SortType import kr.co.vividnext.sodalive.content.series.ContentSeriesService import kr.co.vividnext.sodalive.explorer.follower.GetFollowerListResponse @@ -456,6 +458,17 @@ class ExplorerService( } cheersRepository.save(cheers) + + // 언어 코드가 지정되지 않은 경우, 파파고 언어 감지 API를 통해 비동기로 언어를 식별한다. + if (request.languageCode.isNullOrBlank()) { + applicationEventPublisher.publishEvent( + LanguageDetectEvent( + id = cheers.id!!, + query = request.content, + targetType = LanguageDetectTargetType.CREATOR_CHEERS + ) + ) + } } fun getCreatorProfileCheers(