오디오 콘텐츠 업로드 - 미리듣기 시간 설정 추가

This commit is contained in:
Klaus 2023-09-22 17:00:50 +09:00
parent 8896233d78
commit 5970a9a5b6
2 changed files with 71 additions and 1 deletions

View File

@ -28,9 +28,11 @@ import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import org.springframework.web.multipart.MultipartFile
import java.text.SimpleDateFormat
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Locale
@Service
@Transactional(readOnly = true)
@ -137,6 +139,9 @@ class AudioContentService(
// request 내용 파싱
val request = objectMapper.readValue(requestString, CreateAudioContentRequest::class.java)
// 미리듣기 시간 체크
validatePreviewTime(request.previewStartTime, request.previewEndTime)
// contentFile 체크
if (contentFile == null && request.type == AudioContentType.INDIVIDUAL) {
throw SodaException("콘텐츠를 선택해 주세요.")
@ -228,6 +233,11 @@ class AudioContentService(
metadata.contentLength = contentFile.size
metadata.addUserMetadata("generate_preview", "true")
if (request.previewStartTime != null && request.previewEndTime != null) {
metadata.addUserMetadata("preview_start_time", request.previewStartTime)
metadata.addUserMetadata("preview_end_time", request.previewEndTime)
}
val contentPath = s3Uploader.upload(
inputStream = contentFile.inputStream,
bucket = audioContentBucket,
@ -253,6 +263,64 @@ class AudioContentService(
return CreateAudioContentResponse(contentId = audioContent.id!!)
}
private fun validatePreviewTime(previewStartTime: String?, previewEndTime: String?) {
if (previewStartTime != null && previewEndTime != null) {
val startTimeArray = previewStartTime.split(":")
if (startTimeArray.size != 3) {
throw SodaException("미리 듣기 시간 형식은 00:30:00 과 같아야 합니다")
}
for (time in startTimeArray) {
if (time.length != 2) {
throw SodaException("미리 듣기 시간 형식은 00:30:00 과 같아야 합니다")
}
}
val endTimeArray = previewEndTime.split(":")
if (endTimeArray.size != 3) {
throw SodaException("미리 듣기 시간 형식은 00:30:00 과 같아야 합니다")
}
for (time in endTimeArray) {
if (time.length != 2) {
throw SodaException("미리 듣기 시간 형식은 00:30:00 과 같아야 합니다")
}
}
val timeDifference = timeDifference(previewStartTime, previewEndTime)
if (timeDifference < 30000) {
throw SodaException("미리 듣기의 최소 시간은 30초 입니다.")
}
} else {
if (previewStartTime != null || previewEndTime != null) {
throw SodaException("미리 듣기 시작 시간과 종료 시간 둘 다 입력을 하거나 둘 다 입력 하지 않아야 합니다.")
}
}
}
private fun timeDifference(startTime: String, endTime: String): Long {
try {
// Define a date format for parsing the times
val dateFormat = SimpleDateFormat("HH:mm:ss", Locale.KOREAN)
// Parse the input times into Date objects
val date1 = dateFormat.parse(startTime)
val date2 = dateFormat.parse(endTime)
// Check if either date is null
if (date1 == null || date2 == null) {
return 0
}
// Check if the time difference is greater than 30 seconds (30000 milliseconds)
return date2.time - date1.time
} catch (e: Exception) {
// Handle invalid time formats or parsing errors
return 0
}
}
@Transactional
fun uploadComplete(contentId: Long, content: String, duration: String) {
val keyFileName = content.split("/").last()

View File

@ -10,5 +10,7 @@ data class CreateAudioContentRequest(
val isGeneratePreview: Boolean = true,
val isCommentAvailable: Boolean = false,
val type: AudioContentType = AudioContentType.INDIVIDUAL,
val childIds: List<Long>? = null
val childIds: List<Long>? = null,
val previewStartTime: String? = null,
val previewEndTime: String? = null
)