rework: Enum
This commit is contained in:
parent
0ace01f5f8
commit
7adcc50d75
5 changed files with 41 additions and 50 deletions
|
@ -1,5 +1,6 @@
|
||||||
package dev.jdtech.jellyfin
|
package dev.jdtech.jellyfin
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
import android.app.AppOpsManager
|
import android.app.AppOpsManager
|
||||||
import android.app.PictureInPictureParams
|
import android.app.PictureInPictureParams
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
@ -38,6 +39,7 @@ import dagger.hilt.android.AndroidEntryPoint
|
||||||
import dev.jdtech.jellyfin.databinding.ActivityPlayerBinding
|
import dev.jdtech.jellyfin.databinding.ActivityPlayerBinding
|
||||||
import dev.jdtech.jellyfin.dialogs.SpeedSelectionDialogFragment
|
import dev.jdtech.jellyfin.dialogs.SpeedSelectionDialogFragment
|
||||||
import dev.jdtech.jellyfin.dialogs.TrackSelectionDialogFragment
|
import dev.jdtech.jellyfin.dialogs.TrackSelectionDialogFragment
|
||||||
|
import dev.jdtech.jellyfin.models.VideoQuality
|
||||||
import dev.jdtech.jellyfin.utils.PlayerGestureHelper
|
import dev.jdtech.jellyfin.utils.PlayerGestureHelper
|
||||||
import dev.jdtech.jellyfin.utils.PreviewScrubListener
|
import dev.jdtech.jellyfin.utils.PreviewScrubListener
|
||||||
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
|
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
|
||||||
|
@ -288,6 +290,7 @@ class PlayerActivity : BasePlayerActivity() {
|
||||||
viewModel.initializePlayer(args.items)
|
viewModel.initializePlayer(args.items)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressLint("MissingSuperCall")
|
||||||
override fun onUserLeaveHint() {
|
override fun onUserLeaveHint() {
|
||||||
super.onUserLeaveHint()
|
super.onUserLeaveHint()
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S &&
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S &&
|
||||||
|
@ -348,45 +351,29 @@ class PlayerActivity : BasePlayerActivity() {
|
||||||
} catch (_: IllegalArgumentException) { }
|
} catch (_: IllegalArgumentException) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var selectedIndex = 1 // Default to "Original" (index 1)
|
||||||
private fun showQualitySelectionDialog() {
|
private fun showQualitySelectionDialog() {
|
||||||
val height = viewModel.getOriginalHeight()
|
val originalHeight = viewModel.getOriginalHeight() // TODO: Rework getting originalHeight
|
||||||
val qualityEntries = resources.getStringArray(CoreR.array.quality_entries).toList()
|
val qualityEntries = resources.getStringArray(CoreR.array.quality_entries).toList()
|
||||||
val qualityValues = resources.getStringArray(CoreR.array.quality_values).toList()
|
val qualityValues = resources.getStringArray(CoreR.array.quality_values).toList()
|
||||||
|
|
||||||
// Map entries to values
|
val qualities = qualityEntries.toMutableList()
|
||||||
val qualityMap = qualityEntries.zip(qualityValues).toMap()
|
val closestQuality = VideoQuality.entries
|
||||||
|
.filter { it != VideoQuality.Auto && it != VideoQuality.Original }
|
||||||
|
.minByOrNull { kotlin.math.abs(it.height - originalHeight) }
|
||||||
|
|
||||||
val qualities: List<String> =
|
if (closestQuality != null) {
|
||||||
when (height) {
|
qualities[1] = "${qualities[1]} (${closestQuality})"
|
||||||
0 -> qualityEntries
|
}
|
||||||
in 1001..1999 ->
|
|
||||||
listOf(
|
|
||||||
qualityEntries[0],
|
|
||||||
"${qualityEntries[1]} (1080p)",
|
|
||||||
qualityEntries[2],
|
|
||||||
qualityEntries[3],
|
|
||||||
qualityEntries[4],
|
|
||||||
qualityEntries[5],
|
|
||||||
)
|
|
||||||
in 2000..3000 ->
|
|
||||||
listOf(
|
|
||||||
qualityEntries[0],
|
|
||||||
"${qualityEntries[1]} (4K)",
|
|
||||||
qualityEntries[2],
|
|
||||||
qualityEntries[3],
|
|
||||||
qualityEntries[4],
|
|
||||||
qualityEntries[5],
|
|
||||||
)
|
|
||||||
else -> qualityEntries
|
|
||||||
}
|
|
||||||
MaterialAlertDialogBuilder(this)
|
MaterialAlertDialogBuilder(this)
|
||||||
.setTitle("Select Video Quality")
|
.setTitle("Select Video Quality")
|
||||||
.setItems(qualities.toTypedArray()) { _, which ->
|
.setSingleChoiceItems(qualities.toTypedArray(), selectedIndex) { dialog, which ->
|
||||||
val selectedQualityEntry = qualities[which]
|
selectedIndex = which
|
||||||
val selectedQualityValue =
|
val selectedQualityValue = qualityValues[which]
|
||||||
qualityMap.entries.find { it.key.contains(selectedQualityEntry.split(" ")[0]) }?.value ?: selectedQualityEntry
|
|
||||||
viewModel.changeVideoQuality(selectedQualityValue)
|
viewModel.changeVideoQuality(selectedQualityValue)
|
||||||
}.show()
|
dialog.dismiss()
|
||||||
|
}
|
||||||
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPictureInPictureModeChanged(
|
override fun onPictureInPictureModeChanged(
|
||||||
|
|
|
@ -416,7 +416,7 @@ class DownloaderImpl(
|
||||||
playSessionId,
|
playSessionId,
|
||||||
VideoQuality.getBitrate(videoQuality),
|
VideoQuality.getBitrate(videoQuality),
|
||||||
"ts",
|
"ts",
|
||||||
VideoQuality.getQualityInt(videoQuality),
|
VideoQuality.getHeight(videoQuality),
|
||||||
)
|
)
|
||||||
|
|
||||||
downloadUrl.toUri()
|
downloadUrl.toUri()
|
||||||
|
|
|
@ -2,24 +2,28 @@ package dev.jdtech.jellyfin.models
|
||||||
|
|
||||||
enum class VideoQuality(
|
enum class VideoQuality(
|
||||||
val bitrate: Int,
|
val bitrate: Int,
|
||||||
val qualityString: String,
|
val height: Int,
|
||||||
val qualityInt: Int,
|
val width: Int,
|
||||||
|
val original: Boolean,
|
||||||
) {
|
) {
|
||||||
PAuto(10000000, "Auto", 1080),
|
Auto(10000000, 1080, 1920, false),
|
||||||
POriginal(1000000000, "Original", 1080),
|
Original(1000000000, 1080, 1920, true),
|
||||||
P1080(8000000, "1080p", 1080),
|
P1080(8000000, 1080, 1920, false),
|
||||||
P720(3000000, "720p", 720),
|
P720(3000000, 720, 1280, false),
|
||||||
P480(1500000, "480p", 480),
|
P480(1500000, 480, 854, false),
|
||||||
P360(800000, "360p", 360),
|
P360(800000, 360, 640, false);
|
||||||
;
|
|
||||||
|
override fun toString(): String = when (this) {
|
||||||
|
Auto -> "Auto"
|
||||||
|
Original -> "Original"
|
||||||
|
else -> "${height}p"
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun fromString(quality: String): VideoQuality? = entries.find { it.qualityString == quality }
|
fun fromString(quality: String): VideoQuality? = entries.find { it.toString() == quality }
|
||||||
|
|
||||||
fun getBitrate(quality: VideoQuality): Int = quality.bitrate
|
fun getBitrate(quality: VideoQuality): Int = quality.bitrate
|
||||||
|
fun getHeight(quality: VideoQuality): Int = quality.height
|
||||||
fun getQualityString(quality: VideoQuality): String = quality.qualityString
|
fun getWidth(quality: VideoQuality): Int = quality.width
|
||||||
|
fun getOriginal(quality: VideoQuality): Boolean = quality.original
|
||||||
fun getQualityInt(quality: VideoQuality): Int = quality.qualityInt
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -733,7 +733,7 @@ class JellyfinRepositoryImpl(
|
||||||
playSessionId: String,
|
playSessionId: String,
|
||||||
videoBitrate: Int,
|
videoBitrate: Int,
|
||||||
): String {
|
): String {
|
||||||
val isAuto = videoBitrate == VideoQuality.getBitrate(VideoQuality.PAuto)
|
val isAuto = videoBitrate == VideoQuality.getBitrate(VideoQuality.Auto)
|
||||||
val url =
|
val url =
|
||||||
if (!isAuto) {
|
if (!isAuto) {
|
||||||
jellyfinApi.api.dynamicHlsApi.getMasterHlsVideoPlaylistUrl(
|
jellyfinApi.api.dynamicHlsApi.getMasterHlsVideoPlaylistUrl(
|
||||||
|
|
|
@ -524,13 +524,13 @@ constructor(
|
||||||
|
|
||||||
|
|
||||||
val allSubtitles =
|
val allSubtitles =
|
||||||
if (VideoQuality.getQualityString(videoQuality) == "Original") {
|
if (VideoQuality.getOriginal(videoQuality)) {
|
||||||
externalSubtitles
|
externalSubtitles
|
||||||
}else {
|
}else {
|
||||||
embeddedSubtitles.apply { addAll(externalSubtitles) }
|
embeddedSubtitles.apply { addAll(externalSubtitles) }
|
||||||
}
|
}
|
||||||
|
|
||||||
val url = if (VideoQuality.getQualityString(videoQuality) == "Original"){
|
val url = if (VideoQuality.getOriginal(videoQuality)){
|
||||||
jellyfinRepository.getStreamUrl(currentItem.itemId, currentItem.mediaSourceId, playSessionId)
|
jellyfinRepository.getStreamUrl(currentItem.itemId, currentItem.mediaSourceId, playSessionId)
|
||||||
} else {
|
} else {
|
||||||
val mediaSourceId = mediaSources[currentMediaItemIndex].id
|
val mediaSourceId = mediaSources[currentMediaItemIndex].id
|
||||||
|
|
Loading…
Reference in a new issue