오디오 콘텐츠 업로드 - 미리듣기 시간 설정 추가
This commit is contained in:
parent
8896233d78
commit
5970a9a5b6
|
@ -28,9 +28,11 @@ import org.springframework.data.repository.findByIdOrNull
|
||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import org.springframework.transaction.annotation.Transactional
|
import org.springframework.transaction.annotation.Transactional
|
||||||
import org.springframework.web.multipart.MultipartFile
|
import org.springframework.web.multipart.MultipartFile
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
import java.time.ZoneId
|
import java.time.ZoneId
|
||||||
import java.time.format.DateTimeFormatter
|
import java.time.format.DateTimeFormatter
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional(readOnly = true)
|
@Transactional(readOnly = true)
|
||||||
|
@ -137,6 +139,9 @@ class AudioContentService(
|
||||||
// request 내용 파싱
|
// request 내용 파싱
|
||||||
val request = objectMapper.readValue(requestString, CreateAudioContentRequest::class.java)
|
val request = objectMapper.readValue(requestString, CreateAudioContentRequest::class.java)
|
||||||
|
|
||||||
|
// 미리듣기 시간 체크
|
||||||
|
validatePreviewTime(request.previewStartTime, request.previewEndTime)
|
||||||
|
|
||||||
// contentFile 체크
|
// contentFile 체크
|
||||||
if (contentFile == null && request.type == AudioContentType.INDIVIDUAL) {
|
if (contentFile == null && request.type == AudioContentType.INDIVIDUAL) {
|
||||||
throw SodaException("콘텐츠를 선택해 주세요.")
|
throw SodaException("콘텐츠를 선택해 주세요.")
|
||||||
|
@ -228,6 +233,11 @@ class AudioContentService(
|
||||||
metadata.contentLength = contentFile.size
|
metadata.contentLength = contentFile.size
|
||||||
metadata.addUserMetadata("generate_preview", "true")
|
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(
|
val contentPath = s3Uploader.upload(
|
||||||
inputStream = contentFile.inputStream,
|
inputStream = contentFile.inputStream,
|
||||||
bucket = audioContentBucket,
|
bucket = audioContentBucket,
|
||||||
|
@ -253,6 +263,64 @@ class AudioContentService(
|
||||||
return CreateAudioContentResponse(contentId = audioContent.id!!)
|
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
|
@Transactional
|
||||||
fun uploadComplete(contentId: Long, content: String, duration: String) {
|
fun uploadComplete(contentId: Long, content: String, duration: String) {
|
||||||
val keyFileName = content.split("/").last()
|
val keyFileName = content.split("/").last()
|
||||||
|
|
|
@ -10,5 +10,7 @@ data class CreateAudioContentRequest(
|
||||||
val isGeneratePreview: Boolean = true,
|
val isGeneratePreview: Boolean = true,
|
||||||
val isCommentAvailable: Boolean = false,
|
val isCommentAvailable: Boolean = false,
|
||||||
val type: AudioContentType = AudioContentType.INDIVIDUAL,
|
val type: AudioContentType = AudioContentType.INDIVIDUAL,
|
||||||
val childIds: List<Long>? = null
|
val childIds: List<Long>? = null,
|
||||||
|
val previewStartTime: String? = null,
|
||||||
|
val previewEndTime: String? = null
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue