diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 04fdee42..ecc275d5 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -77,6 +77,9 @@ dependencies {
implementation(libs.androidx.leanback)
implementation(libs.androidx.lifecycle.runtime)
implementation(libs.androidx.lifecycle.viewmodel)
+ implementation(libs.androidx.media3.exoplayer)
+ implementation(libs.androidx.media3.ui)
+ implementation(libs.androidx.media3.session)
implementation(libs.androidx.navigation.fragment)
implementation(libs.androidx.navigation.ui)
implementation(libs.androidx.paging)
@@ -87,8 +90,6 @@ dependencies {
kapt(libs.androidx.room.compiler)
implementation(libs.androidx.room.ktx)
implementation(libs.androidx.swiperefreshlayout)
- implementation(libs.exoplayer.core)
- implementation(libs.exoplayer.ui)
implementation(libs.glide)
kapt(libs.glide.compiler)
implementation(libs.hilt.android)
@@ -97,9 +98,9 @@ dependencies {
implementation(libs.material)
implementation(libs.timber)
- // ExoPlayer FFmpeg extension
- implementation(files("libs/extension-ffmpeg-release.aar"))
-
// MPV
implementation(files("libs/libmpv.aar"))
+
+ // Media3 FFmpeg decoder
+ implementation(files("libs/lib-decoder-ffmpeg-release.aar"))
}
diff --git a/app/libs/extension-ffmpeg-release.aar b/app/libs/extension-ffmpeg-release.aar
deleted file mode 100644
index 5553ef8b..00000000
Binary files a/app/libs/extension-ffmpeg-release.aar and /dev/null differ
diff --git a/app/libs/lib-decoder-ffmpeg-release.aar b/app/libs/lib-decoder-ffmpeg-release.aar
new file mode 100644
index 00000000..519a00e9
Binary files /dev/null and b/app/libs/lib-decoder-ffmpeg-release.aar differ
diff --git a/app/lint.xml b/app/lint.xml
new file mode 100644
index 00000000..bf11943b
--- /dev/null
+++ b/app/lint.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/app/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt
index ed736323..ab4df781 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/BasePlayerActivity.kt
@@ -5,23 +5,39 @@ import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updatePadding
-import com.google.android.exoplayer2.trackselection.MappingTrackSelector
+import androidx.media3.exoplayer.trackselection.MappingTrackSelector
+import androidx.media3.session.MediaSession
import dev.jdtech.jellyfin.viewmodels.PlayerActivityViewModel
abstract class BasePlayerActivity : AppCompatActivity() {
abstract val viewModel: PlayerActivityViewModel
+ lateinit var mediaSession: MediaSession
+
+ override fun onStart() {
+ super.onStart()
+
+ mediaSession = MediaSession.Builder(this, viewModel.player).build()
+ }
+
+ override fun onResume() {
+ super.onResume()
+
+ viewModel.player.playWhenReady = viewModel.playWhenReady
+ hideSystemUI()
+ }
+
override fun onPause() {
super.onPause()
viewModel.playWhenReady = viewModel.player.playWhenReady == true
viewModel.player.playWhenReady = false
}
- override fun onResume() {
- super.onResume()
- viewModel.player.playWhenReady = viewModel.playWhenReady
- hideSystemUI()
+ override fun onStop() {
+ super.onStop()
+
+ mediaSession.release()
}
@Suppress("DEPRECATION")
diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt
index 17fa3854..66dc59e3 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt
@@ -8,10 +8,10 @@ import android.view.WindowManager
import android.widget.ImageButton
import android.widget.TextView
import androidx.activity.viewModels
+import androidx.media3.common.C
+import androidx.media3.exoplayer.ExoPlayer
+import androidx.media3.ui.TrackSelectionDialogBuilder
import androidx.navigation.navArgs
-import com.google.android.exoplayer2.C
-import com.google.android.exoplayer2.ExoPlayer
-import com.google.android.exoplayer2.ui.TrackSelectionDialogBuilder
import dagger.hilt.android.AndroidEntryPoint
import dev.jdtech.jellyfin.databinding.ActivityPlayerBinding
import dev.jdtech.jellyfin.dialogs.SpeedSelectionDialogFragment
diff --git a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt
index ed81ec6c..f02a24cc 100644
--- a/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt
+++ b/app/src/main/java/dev/jdtech/jellyfin/mpv/MPVPlayer.kt
@@ -12,32 +12,31 @@ import android.view.SurfaceHolder
import android.view.SurfaceView
import android.view.TextureView
import androidx.core.content.getSystemService
-import com.google.android.exoplayer2.BasePlayer
-import com.google.android.exoplayer2.C
-import com.google.android.exoplayer2.DeviceInfo
-import com.google.android.exoplayer2.ExoPlaybackException
-import com.google.android.exoplayer2.Format
-import com.google.android.exoplayer2.MediaItem
-import com.google.android.exoplayer2.MediaMetadata
-import com.google.android.exoplayer2.PlaybackParameters
-import com.google.android.exoplayer2.Player
-import com.google.android.exoplayer2.Player.Commands
-import com.google.android.exoplayer2.Timeline
-import com.google.android.exoplayer2.Tracks
-import com.google.android.exoplayer2.audio.AudioAttributes
-import com.google.android.exoplayer2.source.TrackGroup
-import com.google.android.exoplayer2.text.Cue
-import com.google.android.exoplayer2.text.CueGroup
-import com.google.android.exoplayer2.trackselection.TrackSelectionParameters
-import com.google.android.exoplayer2.util.Clock
-import com.google.android.exoplayer2.util.FlagSet
-import com.google.android.exoplayer2.util.ListenerSet
-import com.google.android.exoplayer2.util.MimeTypes
-import com.google.android.exoplayer2.util.Size
-import com.google.android.exoplayer2.util.Util
-import com.google.android.exoplayer2.video.VideoSize
import dev.jdtech.jellyfin.utils.AppPreferences
import `is`.xyz.mpv.MPVLib
+import androidx.media3.common.AudioAttributes
+import androidx.media3.common.BasePlayer
+import androidx.media3.common.C
+import androidx.media3.common.DeviceInfo
+import androidx.media3.common.FlagSet
+import androidx.media3.common.Format
+import androidx.media3.common.MediaItem
+import androidx.media3.common.MediaMetadata
+import androidx.media3.common.MimeTypes
+import androidx.media3.common.PlaybackParameters
+import androidx.media3.common.Player
+import androidx.media3.common.Player.Commands
+import androidx.media3.common.Timeline
+import androidx.media3.common.TrackGroup
+import androidx.media3.common.TrackSelectionParameters
+import androidx.media3.common.Tracks
+import androidx.media3.common.VideoSize
+import androidx.media3.common.text.CueGroup
+import androidx.media3.common.util.Clock
+import androidx.media3.common.util.ListenerSet
+import androidx.media3.common.util.Size
+import androidx.media3.common.util.Util
+import androidx.media3.exoplayer.ExoPlaybackException
import java.io.File
import java.io.FileOutputStream
import java.util.concurrent.CopyOnWriteArraySet
@@ -177,6 +176,7 @@ class MPVPlayer(
var currentMpvTracks: List