From 28864ca264c947c4ef8dbec1c3196ca9630fedd3 Mon Sep 17 00:00:00 2001 From: Myzel394 <50424412+Myzel394@users.noreply.github.com> Date: Fri, 29 Dec 2023 21:46:41 +0100 Subject: [PATCH] refactor: Improve BatchesFolder --- .../alibi/helpers/AudioBatchesFolder.kt | 29 +++++++++++- .../myzel394/alibi/helpers/BatchesFolder.kt | 47 +++++++------------ .../alibi/helpers/VideoBatchesFolder.kt | 33 ++++++++++++- 3 files changed, 77 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/app/myzel394/alibi/helpers/AudioBatchesFolder.kt b/app/src/main/java/app/myzel394/alibi/helpers/AudioBatchesFolder.kt index 891a54a..da87eb7 100644 --- a/app/src/main/java/app/myzel394/alibi/helpers/AudioBatchesFolder.kt +++ b/app/src/main/java/app/myzel394/alibi/helpers/AudioBatchesFolder.kt @@ -2,9 +2,12 @@ package app.myzel394.alibi.helpers import android.content.Context import android.net.Uri +import android.os.ParcelFileDescriptor import androidx.documentfile.provider.DocumentFile import app.myzel394.alibi.helpers.MediaConverter.Companion.concatenateAudioFiles +import app.myzel394.alibi.helpers.MediaConverter.Companion.concatenateVideoFiles import com.arthenica.ffmpegkit.FFmpegKitConfig +import java.io.FileDescriptor import java.time.LocalDateTime class AudioBatchesFolder( @@ -18,9 +21,11 @@ class AudioBatchesFolder( customFolder, subfolderName, ) { - override val concatenateFunction = ::concatenateAudioFiles + override val concatenationFunction = ::concatenateVideoFiles override val ffmpegParameters = FFMPEG_PARAMETERS + private var customFileFileDescriptor: ParcelFileDescriptor? = null + override fun getOutputFileForFFmpeg( date: LocalDateTime, extension: String, @@ -37,6 +42,28 @@ class AudioBatchesFolder( } } + override fun cleanup() { + runCatching { + customFileFileDescriptor?.close() + } + } + + fun asCustomGetFileDescriptor( + counter: Long, + fileExtension: String, + ): FileDescriptor { + runCatching { + customFileFileDescriptor?.close() + } + + val file = + getCustomDefinedFolder().createFile("audio/$fileExtension", "$counter.$fileExtension")!! + + customFileFileDescriptor = context.contentResolver.openFileDescriptor(file.uri, "w")!! + + return customFileFileDescriptor!!.fileDescriptor + } + companion object { fun viaInternalFolder(context: Context) = AudioBatchesFolder(context, BatchType.INTERNAL) diff --git a/app/src/main/java/app/myzel394/alibi/helpers/BatchesFolder.kt b/app/src/main/java/app/myzel394/alibi/helpers/BatchesFolder.kt index 85ce600..892e40a 100644 --- a/app/src/main/java/app/myzel394/alibi/helpers/BatchesFolder.kt +++ b/app/src/main/java/app/myzel394/alibi/helpers/BatchesFolder.kt @@ -1,6 +1,7 @@ package app.myzel394.alibi.helpers import android.content.Context +import android.net.Uri import androidx.documentfile.provider.DocumentFile import java.io.File import java.time.LocalDateTime @@ -18,9 +19,7 @@ abstract class BatchesFolder( open val customFolder: DocumentFile? = null, open val subfolderName: String = ".recordings", ) { - private var customFileFileDescriptor: ParcelFileDescriptor? = null - - abstract val concatenateFunction: KFunction3, String, String, CompletableDeferred> + abstract val concatenationFunction: KFunction3, String, String, CompletableDeferred> abstract val ffmpegParameters: Array fun initFolders() { @@ -34,10 +33,6 @@ abstract class BatchesFolder( } } - fun cleanup() { - customFileFileDescriptor?.close() - } - fun getInternalFolder(): File { return File(context.filesDir, subfolderName) } @@ -115,29 +110,33 @@ abstract class BatchesFolder( extension: String, ): String + abstract fun cleanup() + open suspend fun concatenate( recordingStart: LocalDateTime, extension: String, disableCache: Boolean = false, onNextParameterTry: (String) -> Unit = {}, ): String { - val outputFile = getOutputFileForFFmpeg( - date = recordingStart, - extension = extension, - ) - if (!disableCache && checkIfOutputAlreadyExists(recordingStart, extension)) { - return outputFile + return getOutputFileForFFmpeg( + date = recordingStart, + extension = extension, + ) } - val filePaths = getBatchesForFFmpeg() - for (parameter in ffmpegParameters) { Log.i("Concatenation", "Trying parameter $parameter") onNextParameterTry(parameter) try { - concatenateFunction( + val filePaths = getBatchesForFFmpeg() + val outputFile = getOutputFileForFFmpeg( + date = recordingStart, + extension = extension, + ) + + concatenationFunction( filePaths, outputFile, parameter, @@ -203,20 +202,8 @@ abstract class BatchesFolder( } } - fun asInternalGetOutputPath(counter: Long, fileExtension: String): String { - return getInternalFolder().absolutePath + "/$counter.$fileExtension" - } - - fun asCustomGetFileDescriptor( - counter: Long, - fileExtension: String, - ): FileDescriptor { - val file = - getCustomDefinedFolder().createFile("audio/$fileExtension", "$counter.$fileExtension")!! - - customFileFileDescriptor = context.contentResolver.openFileDescriptor(file.uri, "w")!! - - return customFileFileDescriptor!!.fileDescriptor + fun asInternalGetFile(counter: Long, fileExtension: String): File { + return File(getInternalFolder(), "$counter.$fileExtension") } enum class BatchType { diff --git a/app/src/main/java/app/myzel394/alibi/helpers/VideoBatchesFolder.kt b/app/src/main/java/app/myzel394/alibi/helpers/VideoBatchesFolder.kt index 990b256..d60e47b 100644 --- a/app/src/main/java/app/myzel394/alibi/helpers/VideoBatchesFolder.kt +++ b/app/src/main/java/app/myzel394/alibi/helpers/VideoBatchesFolder.kt @@ -2,6 +2,7 @@ package app.myzel394.alibi.helpers import android.content.Context import android.net.Uri +import android.os.ParcelFileDescriptor import androidx.documentfile.provider.DocumentFile import app.myzel394.alibi.helpers.MediaConverter.Companion.concatenateVideoFiles import com.arthenica.ffmpegkit.FFmpegKitConfig @@ -19,9 +20,11 @@ class VideoBatchesFolder( customFolder, subfolderName, ) { - override val concatenateFunction = ::concatenateVideoFiles + override val concatenationFunction = ::concatenateVideoFiles override val ffmpegParameters = FFMPEG_PARAMETERS + private var customParcelFileDescriptor: ParcelFileDescriptor? = null + override fun getOutputFileForFFmpeg(date: LocalDateTime, extension: String): String { return when (type) { BatchType.INTERNAL -> asInternalGetOutputFile(date, extension).absolutePath @@ -35,6 +38,34 @@ class VideoBatchesFolder( } } + override fun cleanup() { + runCatching { + customParcelFileDescriptor?.close() + } + } + + fun asCustomGetParcelFileDescriptor( + counter: Long, + fileExtension: String, + ): ParcelFileDescriptor { + runCatching { + customParcelFileDescriptor?.close() + } + + val file = + getCustomDefinedFolder().createFile( + "video/$fileExtension", + "$counter.$fileExtension" + )!! + val resolver = context.contentResolver.acquireContentProviderClient(file.uri)!! + + resolver.use { + customParcelFileDescriptor = it.openFile(file.uri, "w")!! + + return customParcelFileDescriptor!! + } + } + companion object { fun viaInternalFolder(context: Context) = VideoBatchesFolder(context, BatchType.INTERNAL)