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