Fix mpv external subtitles (#155)
* Fix external subtitles + new libmpv build * Fix unable to go back to 1x speed
This commit is contained in:
parent
6ed2f2ff7b
commit
b9874db1e1
5 changed files with 12 additions and 34 deletions
Binary file not shown.
5
app/proguard-rules.pro
vendored
5
app/proguard-rules.pro
vendored
|
@ -23,11 +23,6 @@
|
||||||
-keepnames class dev.jdtech.jellyfin.models.PlayerItem
|
-keepnames class dev.jdtech.jellyfin.models.PlayerItem
|
||||||
-keepnames class dev.jdtech.jellyfin.models.DownloadSeriesMetadata
|
-keepnames class dev.jdtech.jellyfin.models.DownloadSeriesMetadata
|
||||||
|
|
||||||
# Keep all mpvlib methods because proguard removes some which makes the app crash
|
|
||||||
-keep class is.xyz.libmpv.MPVLib {
|
|
||||||
*;
|
|
||||||
}
|
|
||||||
|
|
||||||
# ProGuard thinks all SettingsFragments are unused
|
# ProGuard thinks all SettingsFragments are unused
|
||||||
-keep class dev.jdtech.jellyfin.fragments.SettingsLanguageFragment
|
-keep class dev.jdtech.jellyfin.fragments.SettingsLanguageFragment
|
||||||
-keep class dev.jdtech.jellyfin.fragments.SettingsAppearanceFragment
|
-keep class dev.jdtech.jellyfin.fragments.SettingsAppearanceFragment
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package dev.jdtech.jellyfin.mpv
|
package dev.jdtech.jellyfin.mpv
|
||||||
|
|
||||||
import `is`.xyz.libmpv.MPVLib
|
import `is`.xyz.mpv.MPVLib
|
||||||
import android.annotation.SuppressLint
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.res.AssetManager
|
import android.content.res.AssetManager
|
||||||
|
@ -273,7 +272,6 @@ class MPVPlayer(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SwitchIntDef")
|
|
||||||
override fun event(@MPVLib.Event eventId: Int) {
|
override fun event(@MPVLib.Event eventId: Int) {
|
||||||
handler.post {
|
handler.post {
|
||||||
when (eventId) {
|
when (eventId) {
|
||||||
|
@ -311,14 +309,11 @@ class MPVPlayer(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else -> Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun eventEndFile(@MPVLib.Reason reason: Int, @MPVLib.Error error: Int) {
|
|
||||||
// Nothing to do...
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setPlayerStateAndNotifyIfChanged(
|
private fun setPlayerStateAndNotifyIfChanged(
|
||||||
playWhenReady: Boolean = getPlayWhenReady(),
|
playWhenReady: Boolean = getPlayWhenReady(),
|
||||||
@Player.PlayWhenReadyChangeReason playWhenReadyChangeReason: Int = Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
@Player.PlayWhenReadyChangeReason playWhenReadyChangeReason: Int = Player.PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST,
|
||||||
|
@ -358,33 +353,17 @@ class MPVPlayer(
|
||||||
* Select a [Track] or disable a [TrackType] in the current player.
|
* Select a [Track] or disable a [TrackType] in the current player.
|
||||||
*
|
*
|
||||||
* @param trackType The [TrackType]
|
* @param trackType The [TrackType]
|
||||||
* @param isExternal If track is external or embed in media
|
* @param id Id to select or [C.INDEX_UNSET] to disable [TrackType]
|
||||||
* @param index Index to select or [C.INDEX_UNSET] to disable [TrackType]
|
|
||||||
* @return true if the track is or was already selected
|
* @return true if the track is or was already selected
|
||||||
*/
|
*/
|
||||||
fun selectTrack(
|
fun selectTrack(
|
||||||
@TrackType trackType: String,
|
@TrackType trackType: String,
|
||||||
isExternal: Boolean = false,
|
id: Int
|
||||||
index: Int
|
|
||||||
): Boolean {
|
): Boolean {
|
||||||
if (index != C.INDEX_UNSET) {
|
if (id != C.INDEX_UNSET) {
|
||||||
Timber.i("${currentMpvTracks.size}")
|
MPVLib.setPropertyInt(trackType, id)
|
||||||
currentMpvTracks.firstOrNull {
|
|
||||||
it.type == trackType && (if (isExternal) it.title else "${it.ffIndex}") == "$index"
|
|
||||||
}.let { track ->
|
|
||||||
if (track != null) {
|
|
||||||
Timber.i("selected track ${track.ffIndex} ${track.type}")
|
|
||||||
if (!track.selected) {
|
|
||||||
MPVLib.setPropertyInt(trackType, track.id)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
if (currentMpvTracks.indexOfFirst { it.type == trackType && it.selected } != C.INDEX_UNSET) {
|
MPVLib.setPropertyString(trackType, "no")
|
||||||
MPVLib.setPropertyString(trackType, "no")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
package dev.jdtech.jellyfin.viewmodels
|
package dev.jdtech.jellyfin.viewmodels
|
||||||
|
|
||||||
|
import android.app.Application
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import androidx.lifecycle.LifecycleCoroutineScope
|
import androidx.lifecycle.LifecycleCoroutineScope
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.google.android.exoplayer2.util.MimeTypes
|
import com.google.android.exoplayer2.util.MimeTypes
|
||||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||||
|
import dev.jdtech.jellyfin.R
|
||||||
import dev.jdtech.jellyfin.database.DownloadDatabaseDao
|
import dev.jdtech.jellyfin.database.DownloadDatabaseDao
|
||||||
import dev.jdtech.jellyfin.models.ExternalSubtitle
|
import dev.jdtech.jellyfin.models.ExternalSubtitle
|
||||||
import dev.jdtech.jellyfin.models.PlayerItem
|
import dev.jdtech.jellyfin.models.PlayerItem
|
||||||
|
@ -26,6 +28,7 @@ import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
class PlayerViewModel @Inject internal constructor(
|
class PlayerViewModel @Inject internal constructor(
|
||||||
|
private val application: Application,
|
||||||
private val repository: JellyfinRepository,
|
private val repository: JellyfinRepository,
|
||||||
private val downloadDatabase: DownloadDatabaseDao
|
private val downloadDatabase: DownloadDatabaseDao
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
@ -182,7 +185,7 @@ class PlayerViewModel @Inject internal constructor(
|
||||||
|
|
||||||
externalSubtitles.add(
|
externalSubtitles.add(
|
||||||
ExternalSubtitle(
|
ExternalSubtitle(
|
||||||
mediaStream.title.orEmpty(),
|
mediaStream.title ?: application.getString(R.string.external),
|
||||||
mediaStream.language.orEmpty(),
|
mediaStream.language.orEmpty(),
|
||||||
Uri.parse(repository.getBaseUrl() + deliveryUrl),
|
Uri.parse(repository.getBaseUrl() + deliveryUrl),
|
||||||
when (mediaStream.codec) {
|
when (mediaStream.codec) {
|
||||||
|
|
|
@ -133,4 +133,5 @@
|
||||||
<string name="dynamic_colors_summary">Use Material You Dynamic colors (only available on Android 12+)</string>
|
<string name="dynamic_colors_summary">Use Material You Dynamic colors (only available on Android 12+)</string>
|
||||||
<string name="subtitles">Subtitles</string>
|
<string name="subtitles">Subtitles</string>
|
||||||
<string name="subtitles_summary">Customize subtitles appearance</string>
|
<string name="subtitles_summary">Customize subtitles appearance</string>
|
||||||
|
<string name="external">External</string>
|
||||||
</resources>
|
</resources>
|
Loading…
Reference in a new issue