package com.suno.android.common_data.repos import android.content.Context import android.net.Uri import android.os.Build import androidx.annotation.RequiresApi import androidx.datastore.core.IOException import com.suno.android.common_core_utils.DispatcherIO import com.suno.android.common_core_utils.SunoLogger import com.suno.android.common_core_utils.model.Url import com.suno.android.common_networking.remote.download.SongDownloadService import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext import javax.inject.Inject interface DownloadsRepo { @Throws(IOException::class) suspend fun downloadSong( songUrl: Url, songTitle: String, uri: Uri, ): Boolean } class DownloadsRepoImpl @Inject constructor( loggerFactory: SunoLogger.Factory, @ApplicationContext private val context: Context, @DispatcherIO private val dispatcherIO: CoroutineDispatcher, private val songDownloadService: SongDownloadService, ) : DownloadsRepo { private val logger = loggerFactory.create(this@DownloadsRepoImpl) @RequiresApi(Build.VERSION_CODES.Q) override suspend fun downloadSong( songUrl: Url, songTitle: String, uri: Uri, ): Boolean { return withContext(dispatcherIO) { try { val response = songDownloadService.downloadAudioFile(fileUrl = songUrl.url) val input = response.byteStream() input.use { inputStream -> uri.let { context.contentResolver.openOutputStream(uri)?.use { outputStream -> inputStream.copyTo(outputStream) } } } return@withContext true } catch (e: Exception) { logger.e(e) return@withContext false } } } }