optimize ysp
This commit is contained in:
parent
aef165504f
commit
cc2dc25e35
|
|
@ -17,13 +17,13 @@ import androidx.media3.exoplayer.hls.HlsMediaSource
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
|
||||||
|
|
||||||
open class Custom2MediaPlayerAdapter(private var mContext: Context?) : PlayerAdapter() {
|
open class ExoPlayerAdapter(private var mContext: Context?) : PlayerAdapter() {
|
||||||
|
|
||||||
val mPlayer = mContext?.let { ExoPlayer.Builder(it).build() }
|
val mPlayer = mContext?.let { ExoPlayer.Builder(it).build() }
|
||||||
var mSurfaceHolderGlueHost: SurfaceHolderGlueHost? = null
|
var mSurfaceHolderGlueHost: SurfaceHolderGlueHost? = null
|
||||||
val mRunnable: Runnable = object : Runnable {
|
val mRunnable: Runnable = object : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
callback.onCurrentPositionChanged(this@Custom2MediaPlayerAdapter)
|
callback.onCurrentPositionChanged(this@ExoPlayerAdapter)
|
||||||
mHandler.postDelayed(this, getProgressUpdatingInterval().toLong())
|
mHandler.postDelayed(this, getProgressUpdatingInterval().toLong())
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -38,7 +38,7 @@ open class Custom2MediaPlayerAdapter(private var mContext: Context?) : PlayerAda
|
||||||
|
|
||||||
open fun notifyBufferingStartEnd() {
|
open fun notifyBufferingStartEnd() {
|
||||||
callback.onBufferingStateChanged(
|
callback.onBufferingStateChanged(
|
||||||
this@Custom2MediaPlayerAdapter,
|
this@ExoPlayerAdapter,
|
||||||
mBufferingStart || !mInitialized
|
mBufferingStart || !mInitialized
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -65,7 +65,7 @@ open class Custom2MediaPlayerAdapter(private var mContext: Context?) : PlayerAda
|
||||||
mInitialized = false
|
mInitialized = false
|
||||||
notifyBufferingStartEnd()
|
notifyBufferingStartEnd()
|
||||||
if (mHasDisplay) {
|
if (mHasDisplay) {
|
||||||
callback.onPreparedStateChanged(this@Custom2MediaPlayerAdapter)
|
callback.onPreparedStateChanged(this@ExoPlayerAdapter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -100,11 +100,11 @@ open class Custom2MediaPlayerAdapter(private var mContext: Context?) : PlayerAda
|
||||||
mPlayer?.setVideoSurfaceHolder(surfaceHolder)
|
mPlayer?.setVideoSurfaceHolder(surfaceHolder)
|
||||||
if (mHasDisplay) {
|
if (mHasDisplay) {
|
||||||
if (mInitialized) {
|
if (mInitialized) {
|
||||||
callback.onPreparedStateChanged(this@Custom2MediaPlayerAdapter)
|
callback.onPreparedStateChanged(this@ExoPlayerAdapter)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (mInitialized) {
|
if (mInitialized) {
|
||||||
callback.onPreparedStateChanged(this@Custom2MediaPlayerAdapter)
|
callback.onPreparedStateChanged(this@ExoPlayerAdapter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -154,14 +154,14 @@ open class Custom2MediaPlayerAdapter(private var mContext: Context?) : PlayerAda
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
mPlayer?.play()
|
mPlayer?.play()
|
||||||
callback.onPlayStateChanged(this@Custom2MediaPlayerAdapter)
|
callback.onPlayStateChanged(this@ExoPlayerAdapter)
|
||||||
callback.onCurrentPositionChanged(this@Custom2MediaPlayerAdapter)
|
callback.onCurrentPositionChanged(this@ExoPlayerAdapter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun pause() {
|
override fun pause() {
|
||||||
if (isPlaying) {
|
if (isPlaying) {
|
||||||
mPlayer?.pause()
|
mPlayer?.pause()
|
||||||
callback.onPlayStateChanged(this@Custom2MediaPlayerAdapter)
|
callback.onPlayStateChanged(this@ExoPlayerAdapter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -222,7 +222,7 @@ open class Custom2MediaPlayerAdapter(private var mContext: Context?) : PlayerAda
|
||||||
}
|
}
|
||||||
mPlayer?.prepare()
|
mPlayer?.prepare()
|
||||||
mPlayer?.playWhenReady = true
|
mPlayer?.playWhenReady = true
|
||||||
callback.onPlayStateChanged(this@Custom2MediaPlayerAdapter)
|
callback.onPlayStateChanged(this@ExoPlayerAdapter)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -234,7 +234,7 @@ open class Custom2MediaPlayerAdapter(private var mContext: Context?) : PlayerAda
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class VideoPlayerSurfaceHolderCallback(private val playerAdapter: Custom2MediaPlayerAdapter) :
|
internal class VideoPlayerSurfaceHolderCallback(private val playerAdapter: ExoPlayerAdapter) :
|
||||||
SurfaceHolder.Callback {
|
SurfaceHolder.Callback {
|
||||||
|
|
||||||
override fun surfaceCreated(surfaceHolder: SurfaceHolder) {
|
override fun surfaceCreated(surfaceHolder: SurfaceHolder) {
|
||||||
|
|
@ -47,12 +47,12 @@ class MainFragment : BrowseSupportFragment() {
|
||||||
setupEventListeners()
|
setupEventListeners()
|
||||||
|
|
||||||
view?.post {
|
view?.post {
|
||||||
request?.fetchPage()
|
// request?.fetchPage()
|
||||||
}
|
}
|
||||||
|
|
||||||
tvListViewModel.getListLiveData().value?.forEach { tvViewModel ->
|
tvListViewModel.getListLiveData().value?.forEach { tvViewModel ->
|
||||||
tvViewModel.videoUrl.observe(viewLifecycleOwner) { _ ->
|
tvViewModel.videoUrl.observe(viewLifecycleOwner) { _ ->
|
||||||
Log.i(TAG, "tv ${tvViewModel.getTV()}")
|
// Log.i(TAG, "tv ${tvViewModel.getTV()}")
|
||||||
if (tvViewModel.updateByYSP()) {
|
if (tvViewModel.updateByYSP()) {
|
||||||
val tv = tvViewModel.getTV()
|
val tv = tvViewModel.getTV()
|
||||||
if (tv.id == itemPosition) {
|
if (tv.id == itemPosition) {
|
||||||
|
|
@ -87,7 +87,6 @@ class MainFragment : BrowseSupportFragment() {
|
||||||
|
|
||||||
rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
|
rowsAdapter = ArrayObjectAdapter(ListRowPresenter())
|
||||||
|
|
||||||
// val cardPresenter = CardPresenter(lifecycleScope, viewLifecycleOwner)
|
|
||||||
val cardPresenter = CardPresenter(lifecycleScope)
|
val cardPresenter = CardPresenter(lifecycleScope)
|
||||||
|
|
||||||
var idx: Long = 0
|
var idx: Long = 0
|
||||||
|
|
|
||||||
|
|
@ -13,13 +13,13 @@ import java.io.IOException
|
||||||
class PlaybackFragment : VideoSupportFragment() {
|
class PlaybackFragment : VideoSupportFragment() {
|
||||||
|
|
||||||
private lateinit var mTransportControlGlue: PlaybackTransportControlGlue<PlayerAdapter>
|
private lateinit var mTransportControlGlue: PlaybackTransportControlGlue<PlayerAdapter>
|
||||||
private var playerAdapter: Custom2MediaPlayerAdapter? = null
|
private var playerAdapter: ExoPlayerAdapter? = null
|
||||||
private var lastVideoUrl: String = ""
|
private var lastVideoUrl: String = ""
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
playerAdapter = Custom2MediaPlayerAdapter(context)
|
playerAdapter = ExoPlayerAdapter(context)
|
||||||
playerAdapter?.setRepeatAction(PlaybackControlsRow.RepeatAction.INDEX_NONE)
|
playerAdapter?.setRepeatAction(PlaybackControlsRow.RepeatAction.INDEX_NONE)
|
||||||
|
|
||||||
view?.isFocusable = false
|
view?.isFocusable = false
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.lizongying.mytv
|
package com.lizongying.mytv
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.util.Base64
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.lizongying.mytv.api.ApiClient
|
import com.lizongying.mytv.api.ApiClient
|
||||||
import com.lizongying.mytv.api.LiveInfo
|
import com.lizongying.mytv.api.LiveInfo
|
||||||
|
|
@ -14,6 +15,9 @@ import com.lizongying.mytv.proto.Ysp.cn.yangshipin.oms.common.proto.pageModel
|
||||||
import retrofit2.Call
|
import retrofit2.Call
|
||||||
import retrofit2.Callback
|
import retrofit2.Callback
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
|
import javax.crypto.Cipher
|
||||||
|
import javax.crypto.spec.IvParameterSpec
|
||||||
|
import javax.crypto.spec.SecretKeySpec
|
||||||
|
|
||||||
|
|
||||||
class Request(var context: Context) {
|
class Request(var context: Context) {
|
||||||
|
|
@ -86,7 +90,27 @@ class Request(var context: Context) {
|
||||||
if (response.isSuccessful) {
|
if (response.isSuccessful) {
|
||||||
val liveInfo = response.body()
|
val liveInfo = response.body()
|
||||||
if (liveInfo?.data?.playurl != null) {
|
if (liveInfo?.data?.playurl != null) {
|
||||||
tvModel.updateVideoUrlByYSP(liveInfo.data.playurl)
|
val chanll = liveInfo.data.chanll
|
||||||
|
val decodedBytes = Base64.decode(
|
||||||
|
chanll.substring(9, chanll.length - 3),
|
||||||
|
Base64.DEFAULT
|
||||||
|
)
|
||||||
|
val decodedString = String(decodedBytes)
|
||||||
|
val regex = Regex("""des_key = "([^"]+).+var des_iv = "([^"]+)""")
|
||||||
|
val matchResult = regex.find(decodedString)
|
||||||
|
var keyBytes = byteArrayOf()
|
||||||
|
var ivBytes = byteArrayOf()
|
||||||
|
if (matchResult != null) {
|
||||||
|
val (key, iv) = matchResult.destructured
|
||||||
|
keyBytes = Base64.decode(key, Base64.DEFAULT)
|
||||||
|
ivBytes = Base64.decode(iv, Base64.DEFAULT)
|
||||||
|
}
|
||||||
|
tvModel.updateVideoUrlByYSP(
|
||||||
|
liveInfo.data.playurl + "&revoi=" + encryptTripleDES(
|
||||||
|
keyBytes,
|
||||||
|
ivBytes
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -152,6 +176,22 @@ class Request(var context: Context) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun encryptTripleDES(key: ByteArray, iv: ByteArray): String {
|
||||||
|
val plaintext =
|
||||||
|
"""{"mver":"1","subver":"1.2","host":"www.yangshipin.cn/#/tv/home?pid=","referer":"","canvas":"YSPANGLE(Apple,AppleM1Pro,OpenGL4.1)"}"""
|
||||||
|
return try {
|
||||||
|
val keySpec = SecretKeySpec(key, "DESede")
|
||||||
|
val ivSpec = IvParameterSpec(iv)
|
||||||
|
val cipher = Cipher.getInstance("DESede/CBC/PKCS7Padding")
|
||||||
|
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
|
||||||
|
val encryptedBytes = cipher.doFinal(plaintext.toByteArray())
|
||||||
|
encryptedBytes.let { it -> it.joinToString("") { "%02x".format(it) } }
|
||||||
|
} catch (e: Exception) {
|
||||||
|
e.printStackTrace()
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TAG = "Request"
|
private const val TAG = "Request"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,8 @@ data class LiveInfo(
|
||||||
)
|
)
|
||||||
|
|
||||||
data class LiveInfoData(
|
data class LiveInfoData(
|
||||||
val playurl: String
|
val chanll: String,
|
||||||
|
val playurl: String,
|
||||||
)
|
)
|
||||||
|
|
||||||
data class LiveInfoRequest(
|
data class LiveInfoRequest(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue