diff --git a/core/src/main/res/xml/fragment_settings_player.xml b/core/src/main/res/xml/fragment_settings_player.xml
index 55158c4f..6b0fbdb5 100644
--- a/core/src/main/res/xml/fragment_settings_player.xml
+++ b/core/src/main/res/xml/fragment_settings_player.xml
@@ -8,11 +8,6 @@
app:summary="@string/preferred_quality"
app:title="@string/quality" />
-
-
=
withContext(Dispatchers.IO) {
val sources = mutableListOf()
- sources.addAll(
- jellyfinApi.mediaInfoApi.getPostedPlaybackInfo(
- itemId,
- PlaybackInfoDto(
- userId = jellyfinApi.userId!!,
- deviceProfile = DeviceProfile(
- name = "Direct play all",
- maxStaticBitrate = 1_000_000_000,
- maxStreamingBitrate = 1_000_000_000,
- codecProfiles = emptyList(),
- containerProfiles = emptyList(),
- directPlayProfiles = listOf(
- DirectPlayProfile(type = DlnaProfileType.VIDEO),
- DirectPlayProfile(type = DlnaProfileType.AUDIO),
- ),
- transcodingProfiles = emptyList(),
- responseProfiles = emptyList(),
- subtitleProfiles = listOf(
- SubtitleProfile("srt", SubtitleDeliveryMethod.EXTERNAL),
- SubtitleProfile("vtt", SubtitleDeliveryMethod.EXTERNAL),
- SubtitleProfile("ass", SubtitleDeliveryMethod.EXTERNAL),
- ),
- xmlRootAttributes = emptyList(),
- supportedMediaTypes = "",
- enableAlbumArtInDidl = false,
- enableMsMediaReceiverRegistrar = false,
- enableSingleAlbumArtLimit = false,
- enableSingleSubtitleLimit = false,
- ignoreTranscodeByteRangeRequests = false,
- maxAlbumArtHeight = 1_000_000_000,
- maxAlbumArtWidth = 1_000_000_000,
- requiresPlainFolders = false,
- requiresPlainVideoItems = false,
- timelineOffsetSeconds = 0,
- ),
+ val playbackInfo = jellyfinApi.mediaInfoApi.getPostedPlaybackInfo(
+ itemId,
+ PlaybackInfoDto(
+ userId = jellyfinApi.userId!!,
+ deviceProfile = DeviceProfile(
+ name = "Direct play all",
+ maxStaticBitrate = 1_000_000_000,
maxStreamingBitrate = 1_000_000_000,
+ codecProfiles = emptyList(),
+ containerProfiles = emptyList(),
+ directPlayProfiles = listOf(
+ DirectPlayProfile(type = DlnaProfileType.VIDEO),
+ DirectPlayProfile(type = DlnaProfileType.AUDIO),
+ ),
+ transcodingProfiles = emptyList(),
+ responseProfiles = emptyList(),
+ subtitleProfiles = listOf(
+ SubtitleProfile("srt", SubtitleDeliveryMethod.EXTERNAL),
+ SubtitleProfile("vtt", SubtitleDeliveryMethod.EXTERNAL),
+ SubtitleProfile("ass", SubtitleDeliveryMethod.EXTERNAL),
+ ),
+ xmlRootAttributes = emptyList(),
+ supportedMediaTypes = "",
+ enableAlbumArtInDidl = false,
+ enableMsMediaReceiverRegistrar = false,
+ enableSingleAlbumArtLimit = false,
+ enableSingleSubtitleLimit = false,
+ ignoreTranscodeByteRangeRequests = false,
+ maxAlbumArtHeight = 1_000_000_000,
+ maxAlbumArtWidth = 1_000_000_000,
+ requiresPlainFolders = false,
+ requiresPlainVideoItems = false,
+ timelineOffsetSeconds = 0,
),
- ).content.mediaSources.map {
+ maxStreamingBitrate = 1_000_000_000,
+ ),
+ ).content
+ playSessionIds[itemId] = playbackInfo.playSessionId
+ sources.addAll(playbackInfo.mediaSources.map {
it.toFindroidSource(
this@JellyfinRepositoryImpl,
itemId,
diff --git a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt
index 2fb4a399..b3d484a4 100644
--- a/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt
+++ b/data/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryOfflineImpl.kt
@@ -179,6 +179,14 @@ class JellyfinRepositoryOfflineImpl(
TODO("Not yet implemented")
}
+ override suspend fun getHlsPlaylistUrl(
+ itemId: UUID,
+ mediaSourceId: String,
+ transcodeResolution: Int?
+ ): String {
+ TODO("Not yet implemented")
+ }
+
override suspend fun getIntroTimestamps(itemId: UUID): Intro? =
withContext(Dispatchers.IO) {
database.getIntro(itemId)?.toIntro()
diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt
index 7785c900..efa99f52 100644
--- a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt
+++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt
@@ -145,7 +145,6 @@ constructor(
val mediaItems = mutableListOf()
try {
for (item in items) {
- val streamUrl = item.mediaSourceUri
val transcodeResolution = getTranscodeResolution(appPreferences.playerPreferredQuality)
val streamUrl = when {
item.mediaSourceUri.isNotEmpty() -> item.mediaSourceUri
diff --git a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt
index 2c6dae4d..bc6ab178 100644
--- a/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt
+++ b/player/video/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerViewModel.kt
@@ -20,7 +20,6 @@ import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.launch
import org.jellyfin.sdk.model.api.ItemFields
-import org.jellyfin.sdk.model.api.MediaProtocol
import org.jellyfin.sdk.model.api.MediaStreamType
import timber.log.Timber
import javax.inject.Inject
@@ -139,7 +138,8 @@ class PlayerViewModel @Inject internal constructor(
mediaSourceIndex: Int?,
playbackPosition: Long,
): PlayerItem {
- val mediaSources = repository.getMediaSources(id, true)
+ val shouldTranscode = appPreferences.playerPreferredQuality != "Original"
+ val mediaSources = repository.getMediaSources(id, !shouldTranscode)
val mediaSource = if (mediaSourceIndex == null) {
mediaSources.firstOrNull { it.type == FindroidSourceType.LOCAL } ?: mediaSources[0]
} else {
@@ -172,30 +172,7 @@ class PlayerViewModel @Inject internal constructor(
},
)
}
- return when (mediaSource.protocol) {
- MediaProtocol.FILE -> PlayerItem(
- name = name,
- itemId = id,
- mediaSourceId = mediaSource.id,
- mediaSourceUri = mediaSource.path,
- playbackPosition = playbackPosition,
- parentIndexNumber = if (this is FindroidEpisode) parentIndexNumber else null,
- indexNumber = if (this is FindroidEpisode) indexNumber else null,
- indexNumberEnd = if (this is FindroidEpisode) indexNumberEnd else null,
- externalSubtitles = externalSubtitles
- )
- MediaProtocol.HTTP -> PlayerItem(
- name = name,
- itemId = id,
- mediaSourceId = mediaSource.id,
- mediaSourceUri = mediaSource.path,
- playbackPosition = playbackPosition,
- parentIndexNumber = if (this is FindroidEpisode) parentIndexNumber else null,
- indexNumber = if (this is FindroidEpisode) indexNumber else null,
- indexNumberEnd = if (this is FindroidEpisode) indexNumberEnd else null,
- externalSubtitles = externalSubtitles
- )
- else -> PlayerItem(
+ return PlayerItem(
name = name,
itemId = id,
mediaSourceId = mediaSource.id,
@@ -206,7 +183,6 @@ class PlayerViewModel @Inject internal constructor(
indexNumberEnd = if (this is FindroidEpisode) indexNumberEnd else null,
externalSubtitles = externalSubtitles,
)
- }
}
sealed class PlayerItemState