From 97708e206975be4e4fd5239982a8f35e4d64238e Mon Sep 17 00:00:00 2001 From: Bnyro Date: Thu, 26 Sep 2024 15:56:26 +0200 Subject: [PATCH] refactor: error handling for stream extractor responses --- .../github/libretube/api/StreamsExtractor.kt | 16 ++++++++++++++++ .../libretube/ui/dialogs/DownloadDialog.kt | 16 ++++------------ .../libretube/ui/models/PlayerViewModel.kt | 17 +++-------------- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/github/libretube/api/StreamsExtractor.kt b/app/src/main/java/com/github/libretube/api/StreamsExtractor.kt index 236ee7d369..0cbeb04c7a 100644 --- a/app/src/main/java/com/github/libretube/api/StreamsExtractor.kt +++ b/app/src/main/java/com/github/libretube/api/StreamsExtractor.kt @@ -1,6 +1,9 @@ package com.github.libretube.api +import android.content.Context +import com.github.libretube.R import com.github.libretube.api.obj.ChapterSegment +import com.github.libretube.api.obj.Message import com.github.libretube.api.obj.MetaInfo import com.github.libretube.api.obj.PipedStream import com.github.libretube.api.obj.PreviewFrames @@ -14,6 +17,9 @@ import org.schabi.newpipe.extractor.NewPipe import org.schabi.newpipe.extractor.stream.StreamInfo import org.schabi.newpipe.extractor.stream.StreamInfoItem import org.schabi.newpipe.extractor.stream.VideoStream +import retrofit2.HttpException +import java.io.IOException +import java.lang.Exception fun VideoStream.toPipedStream(): PipedStream = PipedStream( url = content, @@ -150,4 +156,14 @@ object StreamsExtractor { } ) } + + fun getExtractorErrorMessageString(context: Context, exception: Exception): String { + return when (exception) { + is IOException -> context.getString(R.string.unknown_error) + is HttpException -> exception.response()?.errorBody()?.string()?.runCatching { + JsonHelper.json.decodeFromString(this).message + }?.getOrNull() ?: context.getString(R.string.server_error) + else -> exception.localizedMessage.orEmpty() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt index 570f260c60..ddd431c083 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/DownloadDialog.kt @@ -13,7 +13,6 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.setFragmentResult import androidx.lifecycle.lifecycleScope import com.github.libretube.R -import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.StreamsExtractor import com.github.libretube.api.obj.PipedStream import com.github.libretube.api.obj.Streams @@ -22,6 +21,7 @@ import com.github.libretube.constants.IntentData import com.github.libretube.databinding.DialogDownloadBinding import com.github.libretube.extensions.TAG import com.github.libretube.extensions.getWhileDigit +import com.github.libretube.extensions.toastFromMainDispatcher import com.github.libretube.helpers.DownloadHelper import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.parcelable.DownloadData @@ -30,8 +30,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import retrofit2.HttpException -import java.io.IOException class DownloadDialog : DialogFragment() { private lateinit var videoId: String @@ -84,17 +82,11 @@ class DownloadDialog : DialogFragment() { withContext(Dispatchers.IO) { StreamsExtractor.extractStreams(videoId) } - } catch (e: IOException) { - Log.e(TAG(), e.stackTraceToString()) - Toast.makeText(context, R.string.unknown_error, Toast.LENGTH_SHORT).show() - return@launch - } catch (e: HttpException) { - Log.e(TAG(), e.stackTraceToString()) - Toast.makeText(context, R.string.server_error, Toast.LENGTH_SHORT).show() - return@launch } catch (e: Exception) { Log.e(TAG(), e.stackTraceToString()) - Toast.makeText(context, e.localizedMessage, Toast.LENGTH_SHORT).show() + val context = context ?: return@launch + val errorMessage = StreamsExtractor.getExtractorErrorMessageString(context, e) + context.toastFromMainDispatcher(errorMessage) return@launch } initDownloadOptions(binding, response) diff --git a/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt b/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt index 899217bf3e..df8d38a22a 100644 --- a/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt +++ b/app/src/main/java/com/github/libretube/ui/models/PlayerViewModel.kt @@ -22,8 +22,6 @@ import com.github.libretube.util.deArrow import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.encodeToString -import retrofit2.HttpException -import java.io.IOException @UnstableApi class PlayerViewModel( @@ -53,20 +51,11 @@ class PlayerViewModel( withContext(Dispatchers.IO) { if (isOrientationChangeInProgress && streamsInfo != null) return@withContext streamsInfo to null - streamsInfo = try { - StreamsExtractor.extractStreams(videoId).deArrow(videoId) - } catch (e: IOException) { - return@withContext null to context.getString(R.string.unknown_error) - } catch (e: HttpException) { - val errorMessage = e.response()?.errorBody()?.string()?.runCatching { - JsonHelper.json.decodeFromString(this).message - }?.getOrNull() ?: context.getString(R.string.server_error) - return@withContext null to errorMessage + return@withContext try { + StreamsExtractor.extractStreams(videoId).deArrow(videoId) to null } catch (e: Exception) { - return@withContext null to e.message + return@withContext null to StreamsExtractor.getExtractorErrorMessageString(context, e) } - - return@withContext streamsInfo to null } suspend fun fetchSponsorBlockSegments(videoId: String) = withContext(Dispatchers.IO) {