diff --git a/app/build.gradle b/app/build.gradle index 645bec73..a1cfebab 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -90,7 +90,6 @@ dependencies { // ExoPlayer def exoplayer_version = "2.14.1" implementation "com.google.android.exoplayer:exoplayer-core:$exoplayer_version" - implementation "com.google.android.exoplayer:exoplayer-dash:$exoplayer_version" implementation "com.google.android.exoplayer:exoplayer-ui:$exoplayer_version" // Testing diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index 30a0140c..b474facf 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -3,15 +3,13 @@ package dev.jdtech.jellyfin import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log +import android.view.WindowManager import androidx.activity.viewModels +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat import androidx.navigation.navArgs -import com.google.android.exoplayer2.ExoPlayer -import com.google.android.exoplayer2.MediaItem -import com.google.android.exoplayer2.Player -import com.google.android.exoplayer2.SimpleExoPlayer -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.ui.PlayerView -import com.google.android.exoplayer2.util.MimeTypes import dagger.hilt.android.AndroidEntryPoint import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel @@ -23,11 +21,11 @@ class PlayerActivity : AppCompatActivity() { private lateinit var playerView: PlayerView - override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.d("PlayerActivity", "onCreate") setContentView(R.layout.activity_player) + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) playerView = findViewById(R.id.video_view) @@ -38,10 +36,26 @@ class PlayerActivity : AppCompatActivity() { if (viewModel.player.value == null) { viewModel.initializePlayer(args.itemId) } + hideSystemUI() } override fun onDestroy() { super.onDestroy() Log.d("PlayerActivity", "onDestroy") + showSystemUI() } -} \ No newline at end of file + + private fun hideSystemUI() { + WindowCompat.setDecorFitsSystemWindows(window, false) + WindowInsetsControllerCompat(window, playerView).let { controller -> + controller.hide(WindowInsetsCompat.Type.systemBars()) + controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + } + } + + private fun showSystemUI() { + WindowCompat.setDecorFitsSystemWindows(window, true) + WindowInsetsControllerCompat(window, playerView).show(WindowInsetsCompat.Type.systemBars()) + } +} + diff --git a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt index 94d3c8b6..0b7167d5 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/repository/JellyfinRepositoryImpl.kt @@ -1,5 +1,6 @@ package dev.jdtech.jellyfin.repository +import android.util.Log import dev.jdtech.jellyfin.api.JellyfinApi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -63,39 +64,44 @@ class JellyfinRepositoryImpl(private val jellyfinApi: JellyfinApi) : JellyfinRep override suspend fun getStreamUrl(itemId: UUID): String { val streamUrl: String withContext(Dispatchers.IO) { - /*val mediaInfo = 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 = listOf(), - containerProfiles = listOf(), - directPlayProfiles = listOf( - DirectPlayProfile( - type = DlnaProfileType.VIDEO - ), DirectPlayProfile(type = DlnaProfileType.AUDIO) + try { + val mediaInfo by 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 = listOf(), + containerProfiles = listOf(), + directPlayProfiles = listOf( + DirectPlayProfile( + type = DlnaProfileType.VIDEO + ), DirectPlayProfile(type = DlnaProfileType.AUDIO) + ), + transcodingProfiles = listOf(), + responseProfiles = listOf(), + 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 ), - transcodingProfiles = listOf(), - responseProfiles = listOf(), - 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 - ), - startTimeTicks = null, - audioStreamIndex = null, - subtitleStreamIndex = null, - maxStreamingBitrate = 1_000_000_000, + startTimeTicks = null, + audioStreamIndex = null, + subtitleStreamIndex = null, + maxStreamingBitrate = 1_000_000_000, + ) ) - ).content*/ + Log.d("JellyfinRepository", mediaInfo.mediaSources.toString()) + } catch (e: Exception) { + Log.e("JellyfinRepository", "${e.message}") + } streamUrl = jellyfinApi.videosApi.getVideoStreamUrl( itemId, static = true, diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index 41654374..e3812395 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -9,10 +9,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.google.android.exoplayer2.ExoPlayer -import com.google.android.exoplayer2.MediaItem -import com.google.android.exoplayer2.Player -import com.google.android.exoplayer2.SimpleExoPlayer +import com.google.android.exoplayer2.* import com.google.android.exoplayer2.trackselection.DefaultTrackSelector import com.google.android.exoplayer2.util.MimeTypes import dagger.hilt.android.lifecycle.HiltViewModel @@ -43,8 +40,9 @@ constructor( fun initializePlayer(itemId: UUID) { if (player.value == null) { val trackSelector = DefaultTrackSelector(application) + val renderersFactory = DefaultRenderersFactory(application).setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON) trackSelector.parameters.buildUpon().setMaxVideoSizeSd() - _player.value = SimpleExoPlayer.Builder(application) + _player.value = SimpleExoPlayer.Builder(application, renderersFactory) .setTrackSelector(trackSelector) .build() } @@ -66,7 +64,7 @@ constructor( player.value?.prepare() } - fun releasePlayer() { + private fun releasePlayer() { if (player.value != null) { playWhenReady = player.value!!.playWhenReady playbackPosition = player.value!!.currentPosition diff --git a/app/src/main/res/layout/activity_player.xml b/app/src/main/res/layout/activity_player.xml index 2df147d8..c19f7a5f 100644 --- a/app/src/main/res/layout/activity_player.xml +++ b/app/src/main/res/layout/activity_player.xml @@ -8,6 +8,7 @@ + android:layout_height="match_parent" + android:background="@color/black"/>