package com.suno.android.common_data.media.usecase import android.content.Context import android.media.MediaMetadataRetriever import android.net.Uri import arrow.core.Either import arrow.core.raise.either import com.suno.android.common_core_utils.SunoLogger import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject import kotlin.time.Duration import kotlin.time.Duration.Companion.milliseconds class GetAudioDurationUseCase @Inject constructor( loggerFactory: SunoLogger.Factory, @ApplicationContext private val context: Context, ) { private val logger = loggerFactory.create(this@GetAudioDurationUseCase) operator fun invoke( uri: Uri, ): Either = either { runCatching { val retriever = MediaMetadataRetriever() try { retriever.setDataSource(context, uri) retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) ?.toLongOrNull() ?.milliseconds } finally { retriever.release() } }.getOrElse { logger.e(it) { "Error getting audio duration" } raise(Unit) } ?: raise(Unit) } }