mirror of
https://github.com/lizongying/my-tv.git
synced 2026-10-26 22:26:29 +08:00
fix channel number did not disappear
This commit is contained in:
@@ -14,6 +14,10 @@
|
|||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
|
|
||||||
|
### v1.5.2(通用版)
|
||||||
|
|
||||||
|
* 修复APP恢复后频道号、频道列表不自动消失的问题
|
||||||
|
|
||||||
### v1.5.1(高版本专用)
|
### v1.5.1(高版本专用)
|
||||||
|
|
||||||
* 性能优化
|
* 性能优化
|
||||||
|
|||||||
@@ -48,6 +48,13 @@ class ChannelFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
if (view?.visibility == View.VISIBLE) {
|
||||||
|
handler.postDelayed(hideRunnable, delay)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
handler.removeCallbacks(hideRunnable)
|
handler.removeCallbacks(hideRunnable)
|
||||||
|
|||||||
@@ -496,6 +496,9 @@ class MainActivity : FragmentActivity() {
|
|||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
Log.i(TAG, "onResume")
|
Log.i(TAG, "onResume")
|
||||||
super.onResume()
|
super.onResume()
|
||||||
|
if (!mainFragment.isHidden){
|
||||||
|
handler.postDelayed(hideMain, delayHideMain)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
|
|||||||
@@ -271,7 +271,7 @@ class MainFragment : Fragment(), CardAdapter.ItemListener {
|
|||||||
|
|
||||||
inner class UpdateProgramRunnable : Runnable {
|
inner class UpdateProgramRunnable : Runnable {
|
||||||
override fun run() {
|
override fun run() {
|
||||||
tvListViewModel.tvListViewModel.value?.filter { it.programId.value != null }
|
tvListViewModel.tvListViewModel.value?.filter { it.programId.value != null && it.programId.value != "" }
|
||||||
?.forEach { tvViewModel ->
|
?.forEach { tvViewModel ->
|
||||||
updateProgram(
|
updateProgram(
|
||||||
tvViewModel
|
tvViewModel
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ class Request {
|
|||||||
private lateinit var btraceRunnable: BtraceRunnable
|
private lateinit var btraceRunnable: BtraceRunnable
|
||||||
private var tokenRunnable: TokenRunnable = TokenRunnable()
|
private var tokenRunnable: TokenRunnable = TokenRunnable()
|
||||||
|
|
||||||
|
private val regex = Regex("""des_key = "([^"]+).+var des_iv = "([^"]+)""")
|
||||||
|
private val input =
|
||||||
|
"""{"mver":"1","subver":"1.2","host":"www.yangshipin.cn/#/tv/home?pid=","referer":"","canvas":"YSPANGLE(Apple,AppleM1Pro,OpenGL4.1)"}""".toByteArray()
|
||||||
|
|
||||||
private var mapping = mapOf(
|
private var mapping = mapOf(
|
||||||
"CCTV4K" to "CCTV4K 超高清",
|
"CCTV4K" to "CCTV4K 超高清",
|
||||||
"CCTV1" to "CCTV1 综合",
|
"CCTV1" to "CCTV1 综合",
|
||||||
@@ -121,7 +125,6 @@ class Request {
|
|||||||
Base64.DEFAULT
|
Base64.DEFAULT
|
||||||
)
|
)
|
||||||
val decodedString = String(decodedBytes)
|
val decodedString = String(decodedBytes)
|
||||||
val regex = Regex("""des_key = "([^"]+).+var des_iv = "([^"]+)""")
|
|
||||||
val matchResult = regex.find(decodedString)
|
val matchResult = regex.find(decodedString)
|
||||||
if (matchResult != null) {
|
if (matchResult != null) {
|
||||||
val (key, iv) = matchResult.destructured
|
val (key, iv) = matchResult.destructured
|
||||||
@@ -142,8 +145,14 @@ class Request {
|
|||||||
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
||||||
tvModel.retryTimes++
|
tvModel.retryTimes++
|
||||||
if (tvModel.needToken) {
|
if (tvModel.needToken) {
|
||||||
|
if (tvModel.tokenRetryTimes == tvModel.tokenRetryMaxTimes) {
|
||||||
|
if (!tvModel.mustToken) {
|
||||||
|
fetchVideo(tvModel, cookie)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
token = ""
|
token = ""
|
||||||
fetchVideo(tvModel)
|
fetchVideo(tvModel)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fetchVideo(tvModel, cookie)
|
fetchVideo(tvModel, cookie)
|
||||||
}
|
}
|
||||||
@@ -158,8 +167,14 @@ class Request {
|
|||||||
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
||||||
tvModel.retryTimes++
|
tvModel.retryTimes++
|
||||||
if (tvModel.needToken) {
|
if (tvModel.needToken) {
|
||||||
|
if (tvModel.tokenRetryTimes == tvModel.tokenRetryMaxTimes) {
|
||||||
|
if (!tvModel.mustToken) {
|
||||||
|
fetchVideo(tvModel, cookie)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
token = ""
|
token = ""
|
||||||
fetchVideo(tvModel)
|
fetchVideo(tvModel)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fetchVideo(tvModel, cookie)
|
fetchVideo(tvModel, cookie)
|
||||||
}
|
}
|
||||||
@@ -171,8 +186,14 @@ class Request {
|
|||||||
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
||||||
tvModel.retryTimes++
|
tvModel.retryTimes++
|
||||||
if (tvModel.needToken) {
|
if (tvModel.needToken) {
|
||||||
|
if (tvModel.tokenRetryTimes == tvModel.tokenRetryMaxTimes) {
|
||||||
|
if (!tvModel.mustToken) {
|
||||||
|
fetchVideo(tvModel, cookie)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
token = ""
|
token = ""
|
||||||
fetchVideo(tvModel)
|
fetchVideo(tvModel)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fetchVideo(tvModel, cookie)
|
fetchVideo(tvModel, cookie)
|
||||||
}
|
}
|
||||||
@@ -185,8 +206,14 @@ class Request {
|
|||||||
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
||||||
tvModel.retryTimes++
|
tvModel.retryTimes++
|
||||||
if (tvModel.needToken) {
|
if (tvModel.needToken) {
|
||||||
|
if (tvModel.tokenRetryTimes == tvModel.tokenRetryMaxTimes) {
|
||||||
|
if (!tvModel.mustToken) {
|
||||||
|
fetchVideo(tvModel, cookie)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
token = ""
|
token = ""
|
||||||
fetchVideo(tvModel)
|
fetchVideo(tvModel)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
fetchVideo(tvModel, cookie)
|
fetchVideo(tvModel, cookie)
|
||||||
}
|
}
|
||||||
@@ -208,18 +235,28 @@ class Request {
|
|||||||
fetchVideo(tvModel, cookie)
|
fetchVideo(tvModel, cookie)
|
||||||
} else {
|
} else {
|
||||||
Log.e(TAG, "info status error")
|
Log.e(TAG, "info status error")
|
||||||
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
if (tvModel.tokenRetryTimes < tvModel.tokenRetryMaxTimes) {
|
||||||
tvModel.retryTimes++
|
tvModel.tokenRetryTimes++
|
||||||
fetchVideo(tvModel)
|
fetchVideo(tvModel)
|
||||||
|
} else {
|
||||||
|
if (!tvModel.mustToken) {
|
||||||
|
val cookie = "vplatform=109"
|
||||||
|
fetchVideo(tvModel, cookie)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(call: Call<Info>, t: Throwable) {
|
override fun onFailure(call: Call<Info>, t: Throwable) {
|
||||||
Log.e(TAG, "info request error $t")
|
Log.e(TAG, "info request error $t")
|
||||||
if (tvModel.retryTimes < tvModel.retryMaxTimes) {
|
if (tvModel.tokenRetryTimes < tvModel.tokenRetryMaxTimes) {
|
||||||
tvModel.retryTimes++
|
tvModel.tokenRetryTimes++
|
||||||
fetchVideo(tvModel)
|
fetchVideo(tvModel)
|
||||||
|
} else {
|
||||||
|
if (!tvModel.mustToken) {
|
||||||
|
val cookie = "vplatform=109"
|
||||||
|
fetchVideo(tvModel, cookie)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -375,15 +412,12 @@ class Request {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun encryptTripleDES(key: ByteArray, iv: ByteArray): String {
|
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 {
|
return try {
|
||||||
val keySpec = SecretKeySpec(key, "DESede")
|
val keySpec = SecretKeySpec(key, "DESede")
|
||||||
val ivSpec = IvParameterSpec(iv)
|
val ivSpec = IvParameterSpec(iv)
|
||||||
val cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding")
|
val cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding")
|
||||||
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
|
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
|
||||||
val encryptedBytes = cipher.doFinal(plaintext.toByteArray())
|
return cipher.doFinal(input).let { it -> it.joinToString("") { "%02x".format(it) } }
|
||||||
return encryptedBytes.let { it -> it.joinToString("") { "%02x".format(it) } }
|
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
""
|
""
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ object TVList {
|
|||||||
)
|
)
|
||||||
private var mappingEPG = mapOf(
|
private var mappingEPG = mapOf(
|
||||||
"CCTV4K 超高清" to "600002264",
|
"CCTV4K 超高清" to "600002264",
|
||||||
"CCTV8K 超高清" to "600156816",
|
// "CCTV8K 超高清" to "600156816",
|
||||||
"CCTV1 综合" to "600001859",
|
"CCTV1 综合" to "600001859",
|
||||||
"CCTV2 财经" to "600001800",
|
"CCTV2 财经" to "600001800",
|
||||||
"CCTV3 综艺" to "600001801",
|
"CCTV3 综艺" to "600001801",
|
||||||
@@ -95,7 +95,7 @@ object TVList {
|
|||||||
"CGTN 俄语频道" to "600084758",
|
"CGTN 俄语频道" to "600084758",
|
||||||
"CGTN 阿拉伯语频道" to "600084782",
|
"CGTN 阿拉伯语频道" to "600084782",
|
||||||
"CGTN 西班牙语频道" to "600084744",
|
"CGTN 西班牙语频道" to "600084744",
|
||||||
"CGTN 记录频道" to "600084781",
|
// "CGTN 记录频道" to "600084781",
|
||||||
"风云剧场" to "600099658",
|
"风云剧场" to "600099658",
|
||||||
"第一剧场" to "600099655",
|
"第一剧场" to "600099655",
|
||||||
"怀旧剧场" to "600099620",
|
"怀旧剧场" to "600099620",
|
||||||
@@ -130,8 +130,8 @@ object TVList {
|
|||||||
"四川卫视" to "600002516",
|
"四川卫视" to "600002516",
|
||||||
"东南卫视" to "600002484",
|
"东南卫视" to "600002484",
|
||||||
"海南卫视" to "600002506",
|
"海南卫视" to "600002506",
|
||||||
"天津卫视" to "600152137",
|
// "天津卫视" to "600152137",
|
||||||
"新疆卫视" to "600152138",
|
// "新疆卫视" to "600152138",
|
||||||
)
|
)
|
||||||
private var mappingVideo = mapOf(
|
private var mappingVideo = mapOf(
|
||||||
"CCTV4K 超高清" to arrayOf("600002264", "2000266303"),
|
"CCTV4K 超高清" to arrayOf("600002264", "2000266303"),
|
||||||
|
|||||||
@@ -19,8 +19,10 @@ class TVViewModel(private var tv: TV) : ViewModel() {
|
|||||||
private var rowPosition: Int = 0
|
private var rowPosition: Int = 0
|
||||||
private var itemPosition: Int = 0
|
private var itemPosition: Int = 0
|
||||||
|
|
||||||
var retryTimes: Int = 0
|
var retryTimes = 0
|
||||||
var retryMaxTimes: Int = 8
|
var tokenRetryTimes = 0
|
||||||
|
var retryMaxTimes = 8
|
||||||
|
var tokenRetryMaxTimes = 2
|
||||||
var programUpdateTime: Long = 0
|
var programUpdateTime: Long = 0
|
||||||
|
|
||||||
private val _errInfo = MutableLiveData<String>()
|
private val _errInfo = MutableLiveData<String>()
|
||||||
@@ -77,6 +79,8 @@ class TVViewModel(private var tv: TV) : ViewModel() {
|
|||||||
|
|
||||||
var needToken = false
|
var needToken = false
|
||||||
|
|
||||||
|
var mustToken = false
|
||||||
|
|
||||||
private val channelsNeedToken = arrayOf(
|
private val channelsNeedToken = arrayOf(
|
||||||
"CCTV4K 超高清",
|
"CCTV4K 超高清",
|
||||||
"CCTV2 财经",
|
"CCTV2 财经",
|
||||||
@@ -134,6 +138,25 @@ class TVViewModel(private var tv: TV) : ViewModel() {
|
|||||||
"新疆卫视",
|
"新疆卫视",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val channelsMustToken = arrayOf(
|
||||||
|
"CCTV3 综艺",
|
||||||
|
"CCTV6 电影",
|
||||||
|
"CCTV8 电视剧",
|
||||||
|
"风云剧场",
|
||||||
|
"第一剧场",
|
||||||
|
"怀旧剧场",
|
||||||
|
"世界地理",
|
||||||
|
"风云音乐",
|
||||||
|
"兵器科技",
|
||||||
|
"风云足球",
|
||||||
|
"高尔夫网球",
|
||||||
|
"女性时尚",
|
||||||
|
"央视文化精品",
|
||||||
|
"央视台球",
|
||||||
|
"电视指南",
|
||||||
|
"卫生健康",
|
||||||
|
)
|
||||||
|
|
||||||
fun addVideoUrl(url: String) {
|
fun addVideoUrl(url: String) {
|
||||||
if (_videoUrl.value?.isNotEmpty() == true) {
|
if (_videoUrl.value?.isNotEmpty() == true) {
|
||||||
if (_videoUrl.value!!.last().contains("cctv.cn")) {
|
if (_videoUrl.value!!.last().contains("cctv.cn")) {
|
||||||
@@ -188,6 +211,9 @@ class TVViewModel(private var tv: TV) : ViewModel() {
|
|||||||
if (tv.title in channelsNeedToken) {
|
if (tv.title in channelsNeedToken) {
|
||||||
needToken = true
|
needToken = true
|
||||||
}
|
}
|
||||||
|
if (tv.title in channelsMustToken) {
|
||||||
|
mustToken = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getRowPosition(): Int {
|
fun getRowPosition(): Int {
|
||||||
|
|||||||
Reference in New Issue
Block a user