From d7a60531ab5ab5b517bfcdced51848fd9e4df0f5 Mon Sep 17 00:00:00 2001 From: Li ZongYing Date: Thu, 8 Feb 2024 00:22:24 +0800 Subject: [PATCH] fix cctv6 --- README.md | 7 +- .../java/com/lizongying/mytv/CardAdapter.kt | 5 ++ .../java/com/lizongying/mytv/CardPresenter.kt | 5 ++ .../mytv/ConfirmationDialogFragment.kt | 36 +++++++++ .../java/com/lizongying/mytv/InfoFragment.kt | 4 + .../java/com/lizongying/mytv/MainActivity.kt | 10 ++- .../com/lizongying/mytv/PlayerFragment.kt | 1 + .../main/java/com/lizongying/mytv/Request.kt | 48 ----------- .../com/lizongying/mytv/SettingFragment.kt | 33 +++++++- .../main/java/com/lizongying/mytv/TVList.kt | 30 +++++-- .../java/com/lizongying/mytv/UpdateManager.kt | 76 ++++++++++++++---- .../java/com/lizongying/mytv/api/ApiClient.kt | 6 +- .../com/lizongying/mytv/requests/MyRequest.kt | 2 +- app/src/main/res/drawable/bingtuan.png | Bin 0 -> 17086 bytes app/src/main/res/layout/dialog.xml | 26 +++++- app/src/main/res/values/strings.xml | 1 + 16 files changed, 206 insertions(+), 84 deletions(-) create mode 100644 app/src/main/java/com/lizongying/mytv/ConfirmationDialogFragment.kt create mode 100644 app/src/main/res/drawable/bingtuan.png diff --git a/README.md b/README.md index 9b87925..a5be109 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,15 @@ ## 更新日志 +### v1.5.8(通用版) + +* 修复央视6画质差的问题 +* 增加兵团卫视 +* 播放失败重试 + ### v1.5.6(通用版) * 解决部分设备系统时间不对导致播放失败的问题 -* ### v1.5.2(通用版) diff --git a/app/src/main/java/com/lizongying/mytv/CardAdapter.kt b/app/src/main/java/com/lizongying/mytv/CardAdapter.kt index 204c3a0..059e9dc 100644 --- a/app/src/main/java/com/lizongying/mytv/CardAdapter.kt +++ b/app/src/main/java/com/lizongying/mytv/CardAdapter.kt @@ -80,6 +80,11 @@ class CardAdapter(private val owner: LifecycleOwner, private var tvListViewModel .centerInside() .into(cardView.mainImageView) + "兵团卫视" -> Glide.with(viewHolder.view.context) + .load(R.drawable.bingtuan) + .centerInside() + .into(cardView.mainImageView) + else -> Glide.with(viewHolder.view.context) .load(tvViewModel.logo.value) .centerInside() diff --git a/app/src/main/java/com/lizongying/mytv/CardPresenter.kt b/app/src/main/java/com/lizongying/mytv/CardPresenter.kt index 099a918..cd6dbf4 100644 --- a/app/src/main/java/com/lizongying/mytv/CardPresenter.kt +++ b/app/src/main/java/com/lizongying/mytv/CardPresenter.kt @@ -47,6 +47,11 @@ class CardPresenter( .centerInside() .into(cardView.mainImageView) + "兵团卫视" -> Glide.with(viewHolder.view.context) + .load(R.drawable.bingtuan) + .centerInside() + .into(cardView.mainImageView) + else -> Glide.with(viewHolder.view.context) .load(tvViewModel.logo.value) .centerInside() diff --git a/app/src/main/java/com/lizongying/mytv/ConfirmationDialogFragment.kt b/app/src/main/java/com/lizongying/mytv/ConfirmationDialogFragment.kt new file mode 100644 index 0000000..2100510 --- /dev/null +++ b/app/src/main/java/com/lizongying/mytv/ConfirmationDialogFragment.kt @@ -0,0 +1,36 @@ +package com.lizongying.mytv + +import android.app.AlertDialog +import android.app.Dialog +import android.os.Bundle +import androidx.fragment.app.DialogFragment + +class ConfirmationDialogFragment(private val listener: ConfirmationDialogListener) : + DialogFragment() { + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return activity?.let { + val builder = AlertDialog.Builder(it) + builder.setTitle("确认") + .setMessage("确认更新吗?") + .setPositiveButton( + "确定" + ) { _, _ -> + listener.onConfirm() + } + .setNegativeButton( + "取消" + ) { _, _ -> + listener.onCancel() + } + // 创建并返回 AlertDialog 对象 + builder.create() + } ?: throw IllegalStateException("Activity cannot be null") + } + + interface ConfirmationDialogListener { + fun onConfirm() + fun onCancel() + } +} + diff --git a/app/src/main/java/com/lizongying/mytv/InfoFragment.kt b/app/src/main/java/com/lizongying/mytv/InfoFragment.kt index 7da7dcc..258a9af 100644 --- a/app/src/main/java/com/lizongying/mytv/InfoFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/InfoFragment.kt @@ -43,6 +43,10 @@ class InfoFragment : Fragment() { .load(R.drawable.xinjiang) .into(binding.infoLogo) + "兵团卫视" -> Glide.with(this) + .load(R.drawable.bingtuan) + .into(binding.infoLogo) + else -> Glide.with(this) .load(tvViewModel.logo.value) .into(binding.infoLogo) diff --git a/app/src/main/java/com/lizongying/mytv/MainActivity.kt b/app/src/main/java/com/lizongying/mytv/MainActivity.kt index e4f0c81..270babf 100644 --- a/app/src/main/java/com/lizongying/mytv/MainActivity.kt +++ b/app/src/main/java/com/lizongying/mytv/MainActivity.kt @@ -84,8 +84,14 @@ class MainActivity : FragmentActivity() { channelReversal = sharedPref.getBoolean(CHANNEL_REVERSAL, channelReversal) channelNum = sharedPref.getBoolean(CHANNEL_NUM, channelNum) - versionName = getPackageInfo().versionName - settingFragment = SettingFragment(versionName, channelReversal, channelNum) + val packageInfo = getPackageInfo() + versionName = packageInfo.versionName + val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + packageInfo.longVersionCode + } else { + packageInfo.versionCode.toLong() + } + settingFragment = SettingFragment(versionName, versionCode, channelReversal, channelNum) } fun showInfoFragment(tvViewModel: TVViewModel) { diff --git a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt index 80c5a87..d3031f3 100644 --- a/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/PlayerFragment.kt @@ -62,6 +62,7 @@ class PlayerFragment : Fragment() { super.onPlayerError(error) Log.e(TAG, "PlaybackException $error") + tvViewModel?.changed() } }) } diff --git a/app/src/main/java/com/lizongying/mytv/Request.kt b/app/src/main/java/com/lizongying/mytv/Request.kt index 58905f4..7e2b522 100644 --- a/app/src/main/java/com/lizongying/mytv/Request.kt +++ b/app/src/main/java/com/lizongying/mytv/Request.kt @@ -43,54 +43,6 @@ class Request { private val input = """{"mver":"1","subver":"1.2","host":"www.yangshipin.cn/#/tv/home?pid=","referer":"","canvas":"YSPANGLE(Apple,ANGLEMetalRenderer:AppleM1Pro,UnspecifiedVersion)"}""".toByteArray() - private var mapping = mapOf( - "CCTV4K" to "CCTV4K 超高清", - "CCTV1" to "CCTV1 综合", - "CCTV2" to "CCTV2 财经", - "CCTV4" to "CCTV4 中文国际", - "CCTV5" to "CCTV5 体育", - "CCTV5+" to "CCTV5+ 体育赛事", - "CCTV7" to "CCTV7 国防军事", - "CCTV9" to "CCTV9 记录", - "CCTV10" to "CCTV10 科教", - "CCTV11" to "CCTV11 戏曲", - "CCTV12" to "CCTV12 社会与法", - "CCTV13" to "CCTV13 新闻", - "CCTV14" to "CCTV14 少儿", - "CCTV15" to "CCTV15 音乐", - "CCTV16-HD" to "CCTV16 奥林匹克", - "CCTV17" to "CCTV17 农业农村", - "CGTN" to "CGTN", - "CGTN法语频道" to "CGTN 法语频道", - "CGTN俄语频道" to "CGTN 俄语频道", - "CGTN阿拉伯语频道" to "CGTN 阿拉伯语频道", - "CGTN西班牙语频道" to "CGTN 西班牙语频道", - "CGTN外语纪录频道" to "CGTN 纪录频道", - "东方卫视" to "东方卫视", - "湖南卫视" to "湖南卫视", - "湖北卫视" to "湖北卫视", - "辽宁卫视" to "辽宁卫视", - "江苏卫视" to "江苏卫视", - "江西卫视" to "江西卫视", - "山东卫视" to "山东卫视", - "广东卫视" to "广东卫视", - "广西卫视" to "广西卫视", - "重庆卫视" to "重庆卫视", - "河南卫视" to "河南卫视", - "河北卫视" to "河北卫视", - "贵州卫视" to "贵州卫视", - "北京卫视" to "北京卫视", - "黑龙江卫视" to "黑龙江卫视", - "浙江卫视" to "浙江卫视", - "安徽卫视" to "安徽卫视", - "深圳卫视" to "深圳卫视", - "四川卫视" to "四川卫视", - "福建东南卫视" to "东南卫视", - "海南卫视" to "海南卫视", - "天津卫视" to "天津卫视", - "新疆卫视" to "新疆卫视", - ) - init { handler.post(tokenRunnable) } diff --git a/app/src/main/java/com/lizongying/mytv/SettingFragment.kt b/app/src/main/java/com/lizongying/mytv/SettingFragment.kt index 94c0e94..f773d18 100644 --- a/app/src/main/java/com/lizongying/mytv/SettingFragment.kt +++ b/app/src/main/java/com/lizongying/mytv/SettingFragment.kt @@ -1,22 +1,28 @@ package com.lizongying.mytv +import android.os.Build import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.RequiresApi import androidx.fragment.app.DialogFragment import com.lizongying.mytv.databinding.DialogBinding -class SettingFragment(private val versionName: String, - private val channelReversal: Boolean, - private val channelNum: Boolean, - ) : +class SettingFragment( + private val versionName: String, + private val versionCode: Long, + private val channelReversal: Boolean, + private val channelNum: Boolean, +) : DialogFragment() { private var _binding: DialogBinding? = null private val binding get() = _binding!! + private lateinit var updateManager: UpdateManager + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setStyle(STYLE_NO_TITLE, 0) @@ -43,14 +49,33 @@ class SettingFragment(private val versionName: String, (activity as MainActivity).saveChannelNum(isChecked) } + updateManager = UpdateManager(context, this, versionCode) + _binding?.checkVersion?.setOnClickListener(OnClickListenerCheckVersion(updateManager)) + return binding.root } + fun setVersionName(versionName: String) { + binding.versionName.text = versionName + } + + internal class OnClickListenerCheckVersion(private val updateManager: UpdateManager) : + View.OnClickListener { + override fun onClick(view: View?) { + updateManager.checkAndUpdate() + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null } + override fun onDestroy() { + super.onDestroy() +// updateManager.destroy() + } + companion object { const val TAG = "SettingFragment" } diff --git a/app/src/main/java/com/lizongying/mytv/TVList.kt b/app/src/main/java/com/lizongying/mytv/TVList.kt index 4ec27fd..bdf8435 100644 --- a/app/src/main/java/com/lizongying/mytv/TVList.kt +++ b/app/src/main/java/com/lizongying/mytv/TVList.kt @@ -84,8 +84,8 @@ object TVList { 0, "央视频道", "https://resources.yangshipin.cn/assets/oms/image/202306/741515efda91f03f455df8a7da4ee11fa9329139c276435cf0a9e2af398d5bf2.png?imageMogr2/format/webp", - "600001802", - "2022574301", + "600108442", + "2013693901", "600001802", true, mustToken = true @@ -852,10 +852,24 @@ object TVList { true, mustToken = false ), + TV( + 56, + "兵团卫视", + "兵团卫视", + listOf(), + 0, + "地方频道", + "", + "600170344", + "2022606701", + "", + true, + mustToken = false + ), ), "国际频道" to listOf( TV( - 56, + 57, "CGTN", "CGTN", listOf("http://live.cgtn.com/1000/prog_index.m3u8"), @@ -869,7 +883,7 @@ object TVList { mustToken = false ), TV( - 57, + 58, "CGTN 法语频道", "CGTN法语频道", listOf("https://livefr.cgtn.com/1000f/prog_index.m3u8"), @@ -883,7 +897,7 @@ object TVList { mustToken = false ), TV( - 58, + 59, "CGTN 俄语频道", "CGTN俄语频道", listOf("http://liveru.cgtn.com/1000r/prog_index.m3u8"), @@ -897,7 +911,7 @@ object TVList { mustToken = false ), TV( - 59, + 60, "CGTN 阿拉伯语频道", "CGTN阿拉伯语频道", listOf("http://livear.cgtn.com/1000a/prog_index.m3u8"), @@ -911,7 +925,7 @@ object TVList { mustToken = false ), TV( - 60, + 61, "CGTN 西班牙语频道", "CGTN西班牙语频道", listOf( @@ -928,7 +942,7 @@ object TVList { mustToken = false ), TV( - 61, + 62, "CGTN 纪录频道", "CGTN外语纪录频道", listOf("https://livedoc.cgtn.com/500d/prog_index.m3u8"), diff --git a/app/src/main/java/com/lizongying/mytv/UpdateManager.kt b/app/src/main/java/com/lizongying/mytv/UpdateManager.kt index 2bb5361..a18b538 100644 --- a/app/src/main/java/com/lizongying/mytv/UpdateManager.kt +++ b/app/src/main/java/com/lizongying/mytv/UpdateManager.kt @@ -10,7 +10,7 @@ import android.net.Uri import android.os.Build import android.os.Environment import android.util.Log -import androidx.annotation.RequiresApi +import android.widget.Toast import com.lizongying.mytv.api.Release import com.lizongying.mytv.requests.MyRequest import kotlinx.coroutines.CoroutineScope @@ -19,34 +19,50 @@ import kotlinx.coroutines.launch import java.io.File -class UpdateManager(private var context: Context?) { +class UpdateManager( + private var context: Context?, + private var settingFragment: SettingFragment, + private var versionCode: Long +) : + ConfirmationDialogFragment.ConfirmationDialogListener { private var myRequest = MyRequest() + private var release: Release? = null + + private var downloadReceiver: DownloadReceiver? = null - @RequiresApi(Build.VERSION_CODES.O) fun checkAndUpdate() { CoroutineScope(Dispatchers.Main).launch { try { - val release = myRequest.getRelease() - // 在主线程中更新 UI + release = myRequest.getRelease() updateUI(release) - if (release?.data?.versionCode!! > 0) { - startDownload(release) + Log.i(TAG, "versionCode $versionCode ${release?.data?.versionCode}") + if (release != null) { + if (release?.data?.versionCode!! >= versionCode) { + val dialog = ConfirmationDialogFragment(this@UpdateManager) + dialog.show(settingFragment.fragmentManager, "ConfirmationDialogFragment") + } else { + Toast.makeText(context, "不需要更新", Toast.LENGTH_LONG) + .show() + } } } catch (e: Exception) { - // 处理异常情况 Log.e(TAG, "Error occurred: ${e.message}", e) } } } private fun updateUI(release: Release?) { + if (release?.data?.versionName.isNullOrEmpty()) { + settingFragment.setVersionName("版本获取失败") + } else { + settingFragment.setVersionName("最新版本:${release?.data?.versionName!!}") + } } - @RequiresApi(Build.VERSION_CODES.O) private fun startDownload(release: Release) { val apkFileName = "my-tv-${release.data.versionName}.apk" - + Log.i(TAG, "apkFileName $apkFileName") val downloadManager = context!!.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager val request = Request(Uri.parse(release.data.downloadUrl)) @@ -57,13 +73,21 @@ class UpdateManager(private var context: Context?) { // 获取下载任务的引用 val downloadReference = downloadManager.enqueue(request) - // 注册广播接收器,监听下载完成事件 - context!!.registerReceiver( - DownloadReceiver(context!!, apkFileName, downloadReference), - IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE), Context.RECEIVER_NOT_EXPORTED - ) - } + downloadReceiver = DownloadReceiver(context!!, apkFileName, downloadReference) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context!!.registerReceiver( + downloadReceiver, + IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE), + Context.RECEIVER_NOT_EXPORTED, + ) + } else { + context!!.registerReceiver( + downloadReceiver, + IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE) + ) + } + } private class DownloadReceiver( private val context: Context, @@ -72,6 +96,9 @@ class UpdateManager(private var context: Context?) { ) : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1) + Log.i(TAG, "reference $reference") + val progress = intent.getIntExtra("progress", 0) + Log.i(TAG, "progress $progress") // 检查是否是我们发起的下载 if (reference == downloadReference) { @@ -94,8 +121,23 @@ class UpdateManager(private var context: Context?) { } } - companion object { private const val TAG = "UpdateManager" } + + override fun onConfirm() { + Log.i(TAG, "onConfirm $release") + release?.let { startDownload(it) } + } + + override fun onCancel() { + } + + + fun destroy() { + if (downloadReceiver != null) { + context!!.unregisterReceiver(downloadReceiver) + Log.i(TAG, "destroy downloadReceiver") + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt index 945dcdd..25ce453 100644 --- a/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt +++ b/app/src/main/java/com/lizongying/mytv/api/ApiClient.kt @@ -13,9 +13,11 @@ import javax.net.ssl.X509TrustManager class ApiClient { private val yspUrl = "https://player-api.yangshipin.cn/" private val myUrl = "https://lyrics.run/" + private val devUrl = "http://10.0.2.2:8081/" private val protoUrl = "https://capi.yangshipin.cn/" private val traceUrl = "https://btrace.yangshipin.cn/" + private var okHttpClient = getUnsafeOkHttpClient() val yspApiService: YSPApiService by lazy { @@ -34,9 +36,9 @@ class ApiClient { .build().create(YSPTokenService::class.java) } - val ReleaseService by lazy { + val releaseService: ReleaseService by lazy { Retrofit.Builder() - .baseUrl(myUrl) + .baseUrl(devUrl) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create()) .build().create(ReleaseService::class.java) diff --git a/app/src/main/java/com/lizongying/mytv/requests/MyRequest.kt b/app/src/main/java/com/lizongying/mytv/requests/MyRequest.kt index 4aed67f..412c504 100644 --- a/app/src/main/java/com/lizongying/mytv/requests/MyRequest.kt +++ b/app/src/main/java/com/lizongying/mytv/requests/MyRequest.kt @@ -11,7 +11,7 @@ import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine class MyRequest { - private var releaseService = ApiClient().ReleaseService + private var releaseService = ApiClient().releaseService suspend fun getRelease(): Release? { return withContext(Dispatchers.IO) { diff --git a/app/src/main/res/drawable/bingtuan.png b/app/src/main/res/drawable/bingtuan.png new file mode 100644 index 0000000000000000000000000000000000000000..4a40962549a2358135f3bdd702fd07fea2510f23 GIT binary patch literal 17086 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 + /> + +